Changeset 15579 for src/Pugs/Parser

Show
Ignore:
Timestamp:
03/11/07 03:13:07 (21 months ago)
Author:
audreyt
Message:

* Pugs.Parser.*: Properly support signature-affected

categories even in the middle of subroutine parsing:

my sub f ($x) { # named unary

f 1 + 2; # parsed as (f 1) + 2

} # at end of scope, resolve the inner &f

# into the PadEntry? itself

Location:
src/Pugs/Parser
Files:
2 modified

Legend:

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

    r15297 r15579  
    2525                        VCode sub | isMulti sub -> ('&':) 
    2626                        _                       -> id 
    27                     mkExp   = Syn ":=" [_Var name, Val val] 
    28                     mkSym   = _Sym scope (mkMulti name) mkExp 
     27                    mkSym   = _Sym scope (mkMulti name) (Val val) Noop 
    2928                doExport scope mkSym 
    3029            case scope of 
  • src/Pugs/Parser/Operator.hs

    r15503 r15579  
    136136        | otherwise                 = Ann Parens (Syn "," [inner]) 
    137137    forceParens (Ann x inner)       = Ann x (forceParens inner) 
    138     forceParens (Sym x y inner)     = Sym x y (forceParens inner) 
     138    forceParens (Sym x y init inner)= Sym x y init (forceParens inner) 
    139139    forceParens (Pad x y inner)     = Pad x y (forceParens inner) 
    140140    forceParens exp                 = exp 
     
    170170    let funs = catMaybes $! inlinePerformSTM $! do 
    171171        glob <- readTVar $ envGlobal env 
    172         let syms  = padToList (filterPad cur glob) 
     172        let vars  = padToList (filterPad cur glob) 
    173173                    ++ padToList (filterPad cur (envLexical env)) 
    174174            pkg   = envPackage env 
    175175            cur var@MkVar{ v_sigil = SCode } = inScope pkg var 
     176            cur var@MkVar{ v_sigil = SCodeMulti } = inScope pkg var 
    176177            cur _ = False 
    177             vars  = concat [ map (\(_, tvar) -> (var, tvar)) tvars 
    178                            | (var, tvars) <- syms 
    179                            ] 
    180178        mapM (uncurry filterFun) vars 
    181179    return (length funs `seq` funs) 
    182180 
    183181{-# NOINLINE _RefToFunction #-} 
    184 _RefToFunction :: H.HashTable (TVar VRef) (Maybe CurrentFunction) 
    185 _RefToFunction = unsafePerformIO (H.new (==) hashTVar) 
    186  
    187 hashTVar :: TVar VRef -> Int32 
    188 hashTVar x = I32# (unsafeCoerce# x) 
    189  
    190 filterFun :: Var -> TVar VRef -> STM (Maybe CurrentFunction) 
    191 filterFun var tvar = var `seq` do 
    192     res <- unsafeIOToSTM (H.lookup _RefToFunction tvar) 
     182_RefToFunction :: H.HashTable PadEntry (Maybe CurrentFunction) 
     183_RefToFunction = unsafePerformIO (H.new (==) hashPadEntry) 
     184 
     185hashPadEntry :: PadEntry -> Int32 
     186hashPadEntry EntryConstant{ pe_value = v }  = I32# (unsafeCoerce# v) 
     187hashPadEntry x                              = I32# (unsafeCoerce# (pe_store x)) 
     188 
     189-- hashTVar :: TVar VRef -> Int32 
     190-- hashTVar x = I32# (unsafeCoerce# x) 
     191 
     192filterFun :: Var -> PadEntry -> STM (Maybe CurrentFunction) 
     193filterFun var entry = var `seq` do 
     194    res <- unsafeIOToSTM (H.lookup _RefToFunction entry) 
    193195    case res of 
    194196        Just rv -> return rv 
    195197        Nothing -> do 
    196             ref <- readTVar tvar 
     198            ref <- readPadEntry entry 
    197199            case ref of 
    198200                MkRef (ICode cv) 
     
    200202                        let rv = MkCurrentFunction var (code_assoc cv) (code_params cv) 
    201203                            res = seq rv (Just rv) 
    202                         unsafeIOToSTM (H.insert _RefToFunction tvar res) 
     204                        unsafeIOToSTM (H.insert _RefToFunction entry res) 
    203205                        return res 
    204206                MkRef (IScalar sv) 
     
    207209                        let rv = MkCurrentFunction var (code_assoc cv) (code_params cv) 
    208210                            res = seq rv (Just rv) 
    209                         unsafeIOToSTM (H.insert _RefToFunction tvar res) 
     211                        unsafeIOToSTM (H.insert _RefToFunction entry res) 
    210212                        return res 
    211213                _ -> do 
    212                     unsafeIOToSTM (H.insert _RefToFunction tvar Nothing) 
     214                    unsafeIOToSTM (H.insert _RefToFunction entry Nothing) 
    213215                    return Nothing 
    214216 
     
    394396        _ -> con (sigil ++ name) [x,y] 
    395397 
     398_STATE_START_RUN :: Var 
     399_STATE_START_RUN = cast "$?STATE_START_RUN" 
     400 
    396401declAssignHack :: Exp -> Exp 
    397402declAssignHack exp@(Syn "=" [lhs, _]) 
    398403    | isDecl SState lhs =  
    399404        let pad = unsafePerformSTM $! do 
    400                 state_first_run <- newTVar =<< (fmap scalarRef $! newTVar (VInt 0)) 
    401                 state_fresh     <- newTVar False 
    402                 return $! mkPad [(cast "$?STATE_START_RUN", [(state_fresh, state_first_run)])] in 
     405                proto           <- fmap scalarRef $! newTVar (VInt 0) 
     406                state_first_run <- newTVar proto 
     407                return $! mkPad [(_STATE_START_RUN, EntryStatic{ pe_type = mkType "Scalar", pe_value = proto, pe_store = state_first_run})] in 
    403408        Syn "block" 
    404409            [ Pad SState pad $! 
    405410                Syn "if" 
    406                     [ App (_Var "&postfix:++") Nothing [_Var "$?STATE_START_RUN"] 
     411                    [ App (_Var "&postfix:++") Nothing [Var _STATE_START_RUN] 
    407412                    , lhs 
    408413                    , exp