Changeset 3443
- Timestamp:
- 05/19/05 17:57:17 (4 years ago)
- svk:copy_cache_prev:
- 5016
- Location:
- src/Pugs
- Files:
-
- 4 modified
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/AST/Internals.hs
r3372 r3443 54 54 retError, retControl, retEmpty, retIVar, readIVar, writeIVar, 55 55 fromVals, refType, 56 mkPad, lookupPad, padToList, diffPads, unionPads, 56 mkPad, lookupPad, padToList, diffPads, unionPads, subPad, updateSubPad, 57 57 mkPrim, mkSub, 58 58 cxtOfSigil, typeOfSigil, … … 679 679 , subName :: !String -- ^ Name of the closure 680 680 , subType :: !SubType -- ^ Type of the closure 681 , sub Pad :: !Pad-- ^ Lexical pad for sub\/method681 , subEnv :: !(Maybe Env) -- ^ Lexical pad for sub\/method 682 682 , subAssoc :: !String -- ^ Associativity 683 683 , subParams :: !Params -- ^ Parameters list … … 700 700 , subName = "&?" 701 701 , subType = SubPrim 702 , sub Pad = mkPad []702 , subEnv = Nothing 703 703 , subAssoc = "pre" 704 704 , subParams = [] … … 715 715 , subName = "&?" 716 716 , subType = SubBlock 717 , sub Pad = mkPad []717 , subEnv = Nothing 718 718 , subAssoc = "pre" 719 719 , subParams = [] … … 913 913 , envEval :: !(Exp -> Eval Val) -- ^ Active evaluator 914 914 , envCaller :: !(Maybe Env) -- ^ Caller's env 915 , envOuter :: !(Maybe Env) -- ^ Outer block's env 915 916 , envBody :: !Exp -- ^ Current AST expression 916 917 , envDepth :: !Int -- ^ Recursion depth … … 1003 1004 unionPads :: Pad -> Pad -> Pad 1004 1005 unionPads (MkPad map1) (MkPad map2) = MkPad $ Map.union map1 map2 1006 1007 updateSubPad :: VCode -> (Pad -> Pad) -> VCode 1008 updateSubPad sub f = sub 1009 { subEnv = fmap (\e -> e{ envLexical = f (subPad sub) }) (subEnv sub) 1010 } 1011 1012 subPad :: VCode -> Pad 1013 subPad sub = maybe (mkPad []) envLexical (subEnv sub) 1005 1014 1006 1015 type Eval x = EvalT (ContT Val (ReaderT Env SIO)) x -
src/Pugs/Eval.hs
r3417 r3443 78 78 , envEval = evaluate 79 79 , envCaller = Nothing 80 , envOuter = Nothing 80 81 , envDepth = 0 81 82 , envID = uniq … … 191 192 maybeCaller <- asks envCaller 192 193 case maybeCaller of 193 Just caller -> local (const caller) $ do194 Just env -> local (const env) $ do 194 195 findVarRef (sig ++ name') 195 196 Nothing -> retError "cannot access CALLER:: in top level" name 197 | Just (package, name') <- breakOnGlue "::" name 198 , Just (sig, "") <- breakOnGlue "OUTER" package = do 199 maybeOuter <- asks envOuter 200 case maybeOuter of 201 Just env -> local (const env) $ do 202 findVarRef (sig ++ name') 203 Nothing -> retError "cannot access OUTER:: in top level" name 196 204 | ('$':'?':_) <- name = do 197 205 rv <- getMagical name … … 349 357 let [exp] = exps 350 358 (VCode sub) <- enterEvalContext (cxtItem "Code") exp 351 lex <- asks envLexical352 retVal $ VCode sub{ sub Pad = lex}359 env <- ask 360 retVal $ VCode sub{ subEnv = Just env } 353 361 "if" -> doCond id 354 362 "unless" -> doCond not … … 370 378 genSymCC "&next" $ \symNext -> do 371 379 genSymPrim "&redo" (const $ runBody vs sub') $ \symRedo -> do 372 apply sub'{ subPad = symRedo . symNext $ subPad sub' }[] $380 apply (updateSubPad sub' (symRedo . symNext)) [] $ 373 381 map (Val . VRef . MkRef) these 374 382 runBody rest sub' … … 376 384 let munge sub | subParams sub == [defaultArrayParam] = 377 385 munge sub{ subParams = [defaultScalarParam] } 378 munge sub = sub{ subPad = symLast $ subPad sub }386 munge sub = updateSubPad sub symLast 379 387 runBody elms $ munge sub 380 388 "loop" -> do -
src/Pugs/Monads.hs
r3291 r3443 147 147 env <- ask 148 148 exitRec <- genSubs env "&?BLOCK_EXIT" $ escSub esc 149 enterLex exitRec action149 local (\e -> e{ envOuter = Just env }) $ enterLex exitRec action 150 150 where 151 151 escSub esc env = mkPrim … … 176 176 blockRec <- genSym "&?BLOCK" (codeRef (orig sub)) 177 177 return $ \e -> e 178 { envLexical = combine [blockRec] 178 { envOuter = Just env 179 , envLexical = combine [blockRec] 179 180 (subPad sub `unionPads` envLexical env) } 180 181 | otherwise = do … … 185 186 callerRec <- genSubs env "&?CALLER_CONTINUATION" (ccSub cc) 186 187 return $ \e -> e 187 { envLexical = combine (concat [subRec, callerRec]) (subPad sub) } 188 { envLexical = combine (concat [subRec, callerRec]) (subPad sub) 189 , envOuter = maybe Nothing envOuter (subEnv sub) 190 } 188 191 ccSub cc env = mkPrim 189 192 { subName = "CALLER_CONTINUATION" -
src/Pugs/Parser.hs
r3437 r3443 331 331 { isMulti = isMulti 332 332 , subName = name' 333 , sub Pad = envLexicalenv333 , subEnv = Just env 334 334 , subType = if isMethod then SubMethod else SubRoutine 335 335 , subAssoc = "pre" … … 439 439 { isMulti = False 440 440 , subName = name 441 , sub Pad = mkPad [] -- XXX really?441 , subEnv = Nothing 442 442 , subReturns = if null typ then typeOfSigil sigil else mkType typ 443 443 , subBody = fun … … 761 761 unless (isNothing formal || null names) $ 762 762 fail "Cannot mix placeholder variables with formal parameters" 763 env <- getState 763 764 let sub = MkCode 764 765 { isMulti = False 765 766 , subName = "<anon>" 766 , sub Pad = mkPad []767 , subEnv = Just env 767 768 , subType = typ 768 769 , subAssoc = "pre"
