Changeset 15364 for src/Pugs/Parser

Show
Ignore:
Timestamp:
02/26/07 17:52:49 (21 months ago)
Author:
audreyt
Message:

* Pugs.Parser.Operators - Eliminate another space leak in

filterFun; heap usage during parsing should be back to
constant now.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Parser/Operator.hs

    r15328 r15364  
    182182 
    183183{-# NOINLINE _RefToFunction #-} 
    184 _RefToFunction :: H.HashTable (TVar VRef) CurrentFunction 
     184_RefToFunction :: H.HashTable (TVar VRef) (Maybe CurrentFunction) 
    185185_RefToFunction = unsafePerformIO (H.new (==) hashTVar) 
    186186 
     
    189189 
    190190filterFun :: Var -> TVar VRef -> STM (Maybe CurrentFunction) 
    191 filterFun var tvar = do 
     191filterFun var tvar = var `seq` do 
    192192    res <- unsafeIOToSTM (H.lookup _RefToFunction tvar) 
    193193    case res of 
    194         Just rv -> return (rv `seq` res) 
     194        Just rv -> return rv 
    195195        Nothing -> do 
    196196            ref <- readTVar tvar 
     
    199199                    | relevantToParsing (code_type cv) (code_assoc cv) -> do 
    200200                        let rv = MkCurrentFunction var (code_assoc cv) (code_params cv) 
    201                         unsafeIOToSTM (H.insert _RefToFunction tvar rv) 
    202                         return (rv `seq` Just rv) 
     201                            res = seq rv (Just rv) 
     202                        unsafeIOToSTM (H.insert _RefToFunction tvar res) 
     203                        return res 
    203204                MkRef (IScalar sv) 
    204205                    | Just (VCode cv) <- scalar_const sv 
    205206                    , relevantToParsing (code_type cv) (code_assoc cv) -> do 
    206207                        let rv = MkCurrentFunction var (code_assoc cv) (code_params cv) 
    207                         unsafeIOToSTM (H.insert _RefToFunction tvar rv) 
    208                         return (rv `seq` Just rv) 
    209                 _ -> return Nothing 
     208                            res = seq rv (Just rv) 
     209                        unsafeIOToSTM (H.insert _RefToFunction tvar res) 
     210                        return res 
     211                _ -> do 
     212                    unsafeIOToSTM (H.insert _RefToFunction tvar Nothing) 
     213                    return Nothing 
    210214 
    211215inScope :: Pkg -> Var -> Bool