Changeset 16339
- Timestamp:
- 05/17/07 23:16:21 (18 months ago)
- Location:
- src/Pugs
- Files:
-
- 10 modified
-
AST/Internals/Instances.hs (modified) (1 diff)
-
AST/Pad.hs (modified) (2 diffs)
-
Eval.hs (modified) (4 diffs)
-
Eval/Var.hs (modified) (1 diff)
-
Monads.hs (modified) (2 diffs)
-
Parser.hs (modified) (1 diff)
-
Parser/Program.hs (modified) (1 diff)
-
Parser/Util.hs (modified) (1 diff)
-
Pretty.hs (modified) (1 diff)
-
Types.hs (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/AST/Internals/Instances.hs
r16338 r16339 610 610 asYAML (NonTerm aa) = asYAMLseq "NonTerm" [asYAML aa] 611 611 612 instance YAML LexPad swhere612 instance YAML LexPad where 613 613 fromYAML MkNode{n_tag=Just t, n_elem=e} | 't':'a':'g':':':'h':'s':':':tag <- unpackBuf t = case tag of 614 614 "PRuntime" -> do -
src/Pugs/AST/Pad.hs
r16336 r16339 2 2 module Pugs.AST.Pad ( 3 3 mkPad, diffPads, unionPads, padKeys, filterPad, adjustPad, mergePadEntry, emptyPad, 4 merge MPads, readMPad, writeMPad, appendMPad4 mergeLexPads, readMPad, writeMPad, appendMPad 5 5 ) where 6 6 import Pugs.Internals … … 32 32 33 33 {-| 34 Merge multiple mutablepads into one.34 Merge multiple (possibly mutable) pads into one. 35 35 -} 36 mergeMPads :: MonadSTM m => [MPad] -> m Pad 37 mergeMPads chain = stm $ do 38 pads <- mapM readTVar chain 36 mergeLexPads :: MonadSTM m => LexPads -> m Pad 37 mergeLexPads chain = stm $ do 38 pads <- forM chain $ \lpad -> case lpad of 39 PRuntime p -> return p 40 PCompiling p -> readTVar p 39 41 return . MkPad $ Map.unionsWith mergePadEntry (map padEntries pads) 40 42 -
src/Pugs/Eval.hs
r16338 r16339 67 67 { envContext = CxtVoid 68 68 , envLexical = emptyPad 69 , envLexPads = PCompiling[]69 , envLexPads = [] 70 70 , envCaller = Nothing 71 71 , envCompPad = Nothing … … 291 291 | otherwise -> do 292 292 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 296 300 297 301 _scalarContext :: Cxt … … 472 476 -- add &?BLOCK &?ROUTINE etc here 473 477 started <- if isCompileTime env then return Nothing else fmap Just (stm $ newTVar False) 478 pad <- fmap (`mappend` subInnerPad sub) $ mergeLexPads (envLexPads env) 474 479 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 478 484 } 479 485 where … … 1332 1338 value = argValue arg 1333 1339 evalExp $ Syn "=" [Syn "{}" [Val invocant, Val (VStr name)], Val value] 1340 -- Otherwise we write back to the bindings. 1334 1341 applyThunk styp normal $ MkThunk (evalExp body) anyType 1335 1342 where -
src/Pugs/Eval/Var.hs
r16334 r16339 68 68 mpads <- asks envLexPads 69 69 case mpads of 70 PCompiling (_:outers@(outer:_)) -> local (\env -> env{ envLexPads = PCompilingouters }) $ do70 (_:outers@(outer:_)) -> local (\env -> env{ envLexPads = outers }) $ do 71 71 case dropVarPkg (__"OUTER") v of 72 72 Just v' -> outerLevel v' 73 73 _ -> do 74 pad <- stm $ readTVar outer 74 pad <- case outer of 75 PRuntime p -> return p 76 PCompiling p-> stm $ readTVar p 75 77 return (lookupPad v pad) 76 PRuntime (_:outers@(outer:_)) -> local (\env -> env{ envLexPads = PRuntime outers }) $ do77 case dropVarPkg (__"OUTER") v of78 Just v' -> outerLevel v'79 _ -> return (lookupPad v outer)80 78 _ -> die "cannot access OUTER:: in top level" name 81 79 -
src/Pugs/Monads.hs
r16338 r16339 268 268 -- Entering a block. 269 269 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) 276 271 return $ \e -> e 277 272 { envLexical = combine [blockRec] pad 278 273 , envPackage = subPackage sub 279 , envLexPads = lexpads274 , envLexPads = (PRuntime (subInnerPad sub):subOuterPads sub) 280 275 } 281 276 | otherwise = do 282 277 subRec <- genSym (cast "&?ROUTINE") (codeRef (orig sub)) 283 278 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) 290 280 return $ \e -> e 291 281 { envLexical = combine ([subRec, callerRec]) pad 292 282 , envPackage = subPackage sub 293 , envLexPads = lexpads283 , envLexPads = (PRuntime (subInnerPad sub):subOuterPads sub) 294 284 } 295 285 ccSub :: (Val -> Eval Val) -> Env -> VCode … … 299 289 , subBody = Prim $ doCC cc 300 290 } 301 302 readLexical :: MonadSTM m => VCode -> m Pad303 readLexical sub = case subOuterPads sub of304 PCompiling pads -> fmap (`mappend` subInnerPad sub) $ mergeMPads pads305 _ -> return (subLexical sub)306 291 307 292 makeParams :: Env -> [Param] -
src/Pugs/Parser.hs
r16338 r16339 385 385 unsafeEvalLexDiff (mkSym sub nameQualified Noop) 386 386 `finallyM` clearDynParsers 387 388 -- XXX - Generate init pad for each of our params... 387 389 388 390 block <- ruleBlock -
src/Pugs/Parser/Program.hs
r16338 r16339 174 174 env' <- getRuleEnv 175 175 return $ env' 176 { envBody = App main Nothing [ ]176 { envBody = App main Nothing [_Var "@*ARGS"] 177 177 , envPackage = envPackage env 178 178 } -
src/Pugs/Parser/Util.hs
r16336 r16339 50 50 , envLexical = envLexical env 51 51 , envLexPads = envLexPads env 52 , envCompPad = envCompPad env 52 53 } 53 54 , s_closureTraits = outerTraits -
src/Pugs/Pretty.hs
r16338 r16339 179 179 format (VRef x) = format x 180 180 format (VList x) = format x 181 format (VCode x) = (<> braces (format $ subBody x)) . (<+> format (sub Lexicalx)) . (<> format (subParams x)) . text $ case subType x of181 format (VCode x) = (<> braces (format $ subBody x)) . (<+> format (subInnerPad x)) . (<> format (subParams x)) . text $ case subType x of 182 182 SubMacro -> "macro " 183 183 SubRoutine -> "sub " -
src/Pugs/Types.hs
r16323 r16339 218 218 219 219 instance Show Var where 220 show var = Buf.unpack (cast var)220 show var = show (cast var :: ByteString) 221 221 222 222 varToBuf :: Var -> ByteString
