Changeset 16339

Show
Ignore:
Timestamp:
05/17/07 23:16:21 (18 months ago)
Author:
audreyt
Message:

* Things actually run now, yay. Next step is to convert

Params over to the new convention...

Location:
src/Pugs
Files:
10 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/AST/Internals/Instances.hs

    r16338 r16339  
    610610    asYAML (NonTerm aa) = asYAMLseq "NonTerm" [asYAML aa] 
    611611 
    612 instance YAML LexPads where 
     612instance YAML LexPad where 
    613613    fromYAML MkNode{n_tag=Just t, n_elem=e} | 't':'a':'g':':':'h':'s':':':tag <- unpackBuf t = case tag of 
    614614        "PRuntime" -> do 
  • src/Pugs/AST/Pad.hs

    r16336 r16339  
    22module Pugs.AST.Pad ( 
    33  mkPad, diffPads, unionPads, padKeys, filterPad, adjustPad, mergePadEntry, emptyPad, 
    4   mergeMPads, readMPad, writeMPad, appendMPad 
     4  mergeLexPads, readMPad, writeMPad, appendMPad 
    55) where 
    66import Pugs.Internals 
     
    3232 
    3333{-| 
    34 Merge multiple mutable pads into one. 
     34Merge multiple (possibly mutable) pads into one. 
    3535-} 
    36 mergeMPads :: MonadSTM m => [MPad] -> m Pad 
    37 mergeMPads chain = stm $ do 
    38     pads <- mapM readTVar chain 
     36mergeLexPads :: MonadSTM m => LexPads -> m Pad 
     37mergeLexPads chain = stm $ do 
     38    pads <- forM chain $ \lpad -> case lpad of 
     39        PRuntime p      -> return p 
     40        PCompiling p    -> readTVar p 
    3941    return . MkPad $ Map.unionsWith mergePadEntry (map padEntries pads) 
    4042 
  • src/Pugs/Eval.hs

    r16338 r16339  
    6767        { envContext = CxtVoid 
    6868        , envLexical = emptyPad 
    69         , envLexPads = PCompiling [] 
     69        , envLexPads = [] 
    7070        , envCaller  = Nothing 
    7171        , envCompPad = Nothing 
     
    291291                | otherwise -> do 
    292292                    s <- isStrict 
    293                     if s then do die "Undeclared variable" var 
    294                          else do lv <- asks envLValue 
    295                                  if lv then evalExp (Sym SOur var mempty Noop (Var var)) else retEmpty 
     293                    if s then do  
     294                            lex     <- asks envLexical 
     295                            pads    <- asks envLexPads 
     296                            die "Undeclared variable" (var, lex, pads) 
     297                         else do 
     298                            lv <- asks envLValue 
     299                            if lv then evalExp (Sym SOur var mempty Noop (Var var)) else retEmpty 
    296300 
    297301_scalarContext :: Cxt 
     
    472476    -- add &?BLOCK &?ROUTINE etc here 
    473477    started <- if isCompileTime env then return Nothing else fmap Just (stm $ newTVar False) 
     478    pad     <- fmap (`mappend` subInnerPad sub) $ mergeLexPads (envLexPads env) 
    474479    return $ VCode sub 
    475         { subCont      = cont 
    476         , subOuterPads = envLexPads env 
    477         , subStarted   = started 
     480        { subCont       = cont 
     481        , subOuterPads  = envLexPads env 
     482        , subLexical    = pad 
     483        , subStarted    = started 
    478484        } 
    479485    where 
     
    13321338            value = argValue arg 
    13331339        evalExp $ Syn "=" [Syn "{}" [Val invocant, Val (VStr name)], Val value] 
     1340    -- Otherwise we write back to the bindings. 
    13341341    applyThunk styp normal $ MkThunk (evalExp body) anyType 
    13351342    where 
  • src/Pugs/Eval/Var.hs

    r16334 r16339  
    6868        mpads <- asks envLexPads 
    6969        case mpads of 
    70             PCompiling (_:outers@(outer:_))  -> local (\env -> env{ envLexPads = PCompiling outers }) $ do 
     70            (_:outers@(outer:_))  -> local (\env -> env{ envLexPads = outers }) $ do 
    7171                case dropVarPkg (__"OUTER") v of 
    7272                    Just v' -> outerLevel v' 
    7373                    _       -> do 
    74                         pad <- stm $ readTVar outer 
     74                        pad <- case outer of 
     75                            PRuntime p  -> return p 
     76                            PCompiling p-> stm $ readTVar p 
    7577                        return (lookupPad v pad) 
    76             PRuntime (_:outers@(outer:_))    -> local (\env -> env{ envLexPads = PRuntime outers }) $ do 
    77                 case dropVarPkg (__"OUTER") v of 
    78                     Just v' -> outerLevel v' 
    79                     _       -> return (lookupPad v outer) 
    8078            _       -> die "cannot access OUTER:: in top level" name 
    8179 
  • src/Pugs/Monads.hs

    r16338 r16339  
    268268            -- Entering a block. 
    269269            blockRec  <- genSym (cast "&?BLOCK") (codeRef (orig sub)) 
    270             pad       <- readLexical sub 
    271             lexpads   <- case subOuterPads sub of 
    272                 PRuntime ps     -> return $ PRuntime (subInnerPad sub : ps) 
    273                 PCompiling ps   -> do 
    274                     pad'    <- stm $ newTVar (subInnerPad sub) -- XXX 
    275                     return (PCompiling (pad':ps)) 
     270            pad       <- fmap (`mappend` subInnerPad sub) $ mergeLexPads (subOuterPads sub) 
    276271            return $ \e -> e 
    277272                { envLexical = combine [blockRec] pad 
    278273                , envPackage = subPackage sub 
    279                 , envLexPads = lexpads 
     274                , envLexPads = (PRuntime (subInnerPad sub):subOuterPads sub) 
    280275                } 
    281276        | otherwise = do 
    282277            subRec    <- genSym (cast "&?ROUTINE") (codeRef (orig sub)) 
    283278            callerRec <- genSym (cast "&?CALLER_CONTINUATION") (codeRef $ ccSub cc env) 
    284             pad       <- readLexical sub 
    285             lexpads   <- case subOuterPads sub of 
    286                 PRuntime ps     -> return $ PRuntime (subInnerPad sub : ps) 
    287                 PCompiling ps   -> do 
    288                     pad'    <- stm $ newTVar (subInnerPad sub) -- XXX 
    289                     return (PCompiling (pad':ps)) 
     279            pad       <- fmap (`mappend` subInnerPad sub) $ mergeLexPads (subOuterPads sub) 
    290280            return $ \e -> e 
    291281                { envLexical = combine ([subRec, callerRec]) pad 
    292282                , envPackage = subPackage sub 
    293                 , envLexPads = lexpads 
     283                , envLexPads = (PRuntime (subInnerPad sub):subOuterPads sub) 
    294284                } 
    295285    ccSub :: (Val -> Eval Val) -> Env -> VCode 
     
    299289        , subBody = Prim $ doCC cc 
    300290        } 
    301  
    302 readLexical :: MonadSTM m => VCode -> m Pad 
    303 readLexical sub = case subOuterPads sub of 
    304     PCompiling pads -> fmap (`mappend` subInnerPad sub) $ mergeMPads pads  
    305     _               -> return (subLexical sub) 
    306291 
    307292makeParams :: Env -> [Param] 
  • src/Pugs/Parser.hs

    r16338 r16339  
    385385        unsafeEvalLexDiff (mkSym sub nameQualified Noop) 
    386386            `finallyM` clearDynParsers 
     387 
     388    -- XXX - Generate init pad for each of our params... 
    387389 
    388390    block    <- ruleBlock 
  • src/Pugs/Parser/Program.hs

    r16338 r16339  
    174174    env' <- getRuleEnv 
    175175    return $ env' 
    176         { envBody       = App main Nothing [] 
     176        { envBody       = App main Nothing [_Var "@*ARGS"] 
    177177        , envPackage    = envPackage env 
    178178        } 
  • src/Pugs/Parser/Util.hs

    r16336 r16339  
    5050            , envLexical = envLexical env 
    5151            , envLexPads = envLexPads env 
     52            , envCompPad = envCompPad env 
    5253            } 
    5354        , s_closureTraits = outerTraits 
  • src/Pugs/Pretty.hs

    r16338 r16339  
    179179    format (VRef x) = format x 
    180180    format (VList x) = format x 
    181     format (VCode x) = (<> braces (format $ subBody x)) . (<+> format (subLexical x)) . (<> format (subParams x)) . text $ case subType x of 
     181    format (VCode x) = (<> braces (format $ subBody x)) . (<+> format (subInnerPad x)) . (<> format (subParams x)) . text $ case subType x of 
    182182        SubMacro        -> "macro " 
    183183        SubRoutine      -> "sub " 
  • src/Pugs/Types.hs

    r16323 r16339  
    218218 
    219219instance Show Var where 
    220     show var = Buf.unpack (cast var) 
     220    show var = show (cast var :: ByteString) 
    221221 
    222222varToBuf :: Var -> ByteString