Changeset 8705
- Timestamp:
- 01/16/06 18:57:28 (3 years ago)
- Files:
-
- 9 modified
-
src/Pugs/AST/Internals.hs (modified) (3 diffs)
-
src/Pugs/AST/Internals.hs-drift (modified) (2 diffs)
-
src/Pugs/Eval.hs (modified) (3 diffs)
-
src/Pugs/Eval/Var.hs (modified) (4 diffs)
-
src/Pugs/Monads.hs (modified) (5 diffs)
-
src/Pugs/Run.hs (modified) (1 diff)
-
t/var/caller.t (modified) (5 diffs)
-
t/var/chained.t (modified) (1 diff)
-
t/var/state.t (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/AST/Internals.hs
r8701 r8705 1100 1100 , envLValue :: !Bool -- ^ Are we in an LValue context? 1101 1101 , envLexical :: !Pad -- ^ Lexical pad for variable lookup 1102 , envImplicit:: !(Map Var ()) -- ^ Set of implicit variables 1102 1103 , envGlobal :: !(TVar Pad) -- ^ Global pad for variable lookup 1103 1104 , envPackage :: !String -- ^ Current package 1104 1105 , envClasses :: !ClassTree -- ^ Current class tree 1105 1106 , envEval :: !(Exp -> Eval Val) -- ^ Active evaluator 1106 , envCaller :: !(Maybe Env) -- ^ Caller's env1107 , envCaller :: !(Maybe Env) -- ^ Caller's "env" pad 1107 1108 , envOuter :: !(Maybe Env) -- ^ Outer block's env 1108 1109 , envBody :: !Exp -- ^ Current AST expression … … 1843 1844 instance YAML Scope where 1844 1845 asYAML (SState) = asYAMLcls "SState" 1846 asYAML (SLet) = asYAMLcls "SLet" 1847 asYAML (STemp) = asYAMLcls "STemp" 1848 asYAML (SEnv) = asYAMLcls "SEnv" 1845 1849 asYAML (SMy) = asYAMLcls "SMy" 1846 1850 asYAML (SOur) = asYAMLcls "SOur" 1847 asYAML (SLet) = asYAMLcls "SLet"1848 asYAML (STemp) = asYAMLcls "STemp"1849 1851 asYAML (SGlobal) = asYAMLcls "SGlobal" 1850 1852 1851 1853 instance JSON Scope where 1852 1854 showJSON (SState) = showJSScalar "SState" 1855 showJSON (SLet) = showJSScalar "SLet" 1856 showJSON (STemp) = showJSScalar "STemp" 1857 showJSON (SEnv) = showJSScalar "SEnv" 1853 1858 showJSON (SMy) = showJSScalar "SMy" 1854 1859 showJSON (SOur) = showJSScalar "SOur" 1855 showJSON (SLet) = showJSScalar "SLet"1856 showJSON (STemp) = showJSScalar "STemp"1857 1860 showJSON (SGlobal) = showJSScalar "SGlobal" 1858 1861 1859 1862 instance Perl5 Scope where 1860 1863 showPerl5 (SState) = showP5Class "SState" 1864 showPerl5 (SLet) = showP5Class "SLet" 1865 showPerl5 (STemp) = showP5Class "STemp" 1866 showPerl5 (SEnv) = showP5Class "SEnv" 1861 1867 showPerl5 (SMy) = showP5Class "SMy" 1862 1868 showPerl5 (SOur) = showP5Class "SOur" 1863 showPerl5 (SLet) = showP5Class "SLet"1864 showPerl5 (STemp) = showP5Class "STemp"1865 1869 showPerl5 (SGlobal) = showP5Class "SGlobal" 1866 1870 … … 2057 2061 2058 2062 instance YAML Env where 2059 asYAML (MkEnv aa ab ac ad ae af ag ah ai aj ak al am an ao ) =2063 asYAML (MkEnv aa ab ac ad ae af ag ah ai aj ak al am an ao ap) = 2060 2064 asYAMLmap "MkEnv" 2061 2065 [("envContext", asYAML aa) , ("envLValue", asYAML ab) , 2062 ("envLexical", asYAML ac) , ("env Global", asYAML ad) ,2063 ("env Package", asYAML ae) , ("envClasses", asYAML af) ,2064 ("env Eval", asYAML ag) , ("envCaller", asYAML ah) ,2065 ("env Outer", asYAML ai) , ("envBody", asYAML aj) ,2066 ("env Depth", asYAML ak) , ("envDebug", asYAML al) ,2067 ("env Pos", asYAML am) , ("envPragmas", asYAML an) ,2068 ("env InitDat", asYAML ao)]2066 ("envLexical", asYAML ac) , ("envImplicit", asYAML ad) , 2067 ("envGlobal", asYAML ae) , ("envPackage", asYAML af) , 2068 ("envClasses", asYAML ag) , ("envEval", asYAML ah) , 2069 ("envCaller", asYAML ai) , ("envOuter", asYAML aj) , 2070 ("envBody", asYAML ak) , ("envDepth", asYAML al) , 2071 ("envDebug", asYAML am) , ("envPos", asYAML an) , 2072 ("envPragmas", asYAML ao) , ("envInitDat", asYAML ap)] 2069 2073 2070 2074 instance YAML InitDat where -
src/Pugs/AST/Internals.hs-drift
r8701 r8705 630 630 {-!derive: Perl5, JSON!-} 631 631 632 data Scope = SState | S My | SOur | SLet | STemp | SGlobal -- ^Global632 data Scope = SState | SLet | STemp | SEnv | SMy | SOur | SGlobal 633 633 {-!derive: YAML, JSON, Perl5!-} 634 634 … … 1132 1132 , envLValue :: !Bool -- ^ Are we in an LValue context? 1133 1133 , envLexical :: !Pad -- ^ Lexical pad for variable lookup 1134 , envImplicit:: !(Map Var ()) -- ^ Set of implicit variables 1134 1135 , envGlobal :: !(TVar Pad) -- ^ Global pad for variable lookup 1135 1136 , envPackage :: !String -- ^ Current package 1136 1137 , envClasses :: !ClassTree -- ^ Current class tree 1137 1138 , envEval :: !(Exp -> Eval Val) -- ^ Active evaluator 1138 , envCaller :: !(Maybe Env) -- ^ Caller's env1139 , envCaller :: !(Maybe Env) -- ^ Caller's "env" pad 1139 1140 , envOuter :: !(Maybe Env) -- ^ Outer block's env 1140 1141 , envBody :: !Exp -- ^ Current AST expression -
src/Pugs/Eval.hs
r8699 r8705 64 64 { envContext = CxtVoid 65 65 , envLexical = mkPad [] 66 , envImplicit= Map.empty 66 67 , envLValue = False 67 68 , envGlobal = glob … … 309 310 310 311 reducePad :: Scope -> Pad -> Exp -> Eval Val 312 reducePad SEnv lex@(MkPad lex') exp = do 313 local (\e -> e{ envImplicit = Map.map (const ()) lex' `Map.union` envImplicit e }) $ 314 reducePad SMy lex exp 311 315 reducePad SMy lex exp = do 312 316 -- heuristics: if we are repeating ourselves, generate a new TVar. … … 987 991 } 988 992 fixEnv :: Env -> Env 989 fixEnv env 990 | typ >= SubBlock = env 991 | otherwise = env 992 { envCaller = Just env 993 , envDepth = envDepth env + 1 } 993 fixEnv | typ >= SubBlock = id 994 | otherwise = envEnterCaller 994 995 doBind :: [PadMutator] -> [(Param, Exp)] -> Eval ([PadMutator], [ApplyArg]) 995 996 doBind syms [] = return (syms, []) -
src/Pugs/Eval/Var.hs
r8267 r8705 38 38 case maybeCaller of 39 39 Just env -> local (const env) $ do 40 findVarRef (sig ++ name') 40 rv <- findVarRef (sig ++ name') 41 return rv 41 42 Nothing -> retError "cannot access CALLER:: in top level" name 42 43 | Just (package, name') <- breakOnGlue "::" name … … 47 48 findVarRef (sig ++ name') 48 49 Nothing -> retError "cannot access OUTER:: in top level" name 50 | (sig:'+':name') <- name = findVarRef (sig:("CALLER::"++name')) 49 51 | (_:'?':_) <- name = do 50 52 rv <- getMagical name … … 489 491 490 492 isQualified :: String -> Maybe (String, String) 491 isQualified name | Just (post, pre) <- breakOnGlue "::" (reverse name) = 493 isQualified name 494 | Just (post, pre) <- breakOnGlue "::" (reverse name) = 492 495 let (sigil, pkg) = span (not . isAlphaNum) preName 493 496 name' = possiblyFixOperatorName (sigil ++ postName) 494 497 preName = reverse pre 495 498 postName = reverse post 496 in Just (pkg, name') 499 in case takeWhile isAlphaNum pkg of 500 "OUTER" -> Nothing 501 "CALLER" -> Nothing 502 _ -> Just (pkg, name') 497 503 isQualified _ = Nothing 498 504 … … 500 506 toQualified name@(_:'*':_) = return name 501 507 toQualified name@(_:'?':_) = return name 508 toQualified name@(_:'+':_) = return name 502 509 toQualified name@(_:"!") = return name 503 510 toQualified name@(_:"/") = return name -
src/Pugs/Monads.hs
r8699 r8705 16 16 enterLex, enterContext, enterEvalContext, enterPackage, enterCaller, 17 17 enterGiven, enterWhen, enterWhile, genSymPrim, genSymCC, 18 enterBlock, enterSub, 18 enterBlock, enterSub, envEnterCaller, 19 19 evalVal, tempVar, 20 20 … … 27 27 import Pugs.Types 28 28 import Control.Monad.RWS 29 import qualified Data.Map as Map 29 30 30 31 … … 89 90 -} 90 91 enterCaller :: Eval a -> Eval a 91 enterCaller = local (\env -> env 92 enterCaller = local envEnterCaller 93 94 envEnterCaller :: Env -> Env 95 envEnterCaller env = env 92 96 { envCaller = Just env 93 , envDepth = envDepth env + 1 }) 97 { envLexical = MkPad (lex `Map.intersection` envImplicit env) 98 } 99 , envDepth = envDepth env + 1 100 , envImplicit = Map.fromList [("$_", ())] 101 } 102 where 103 MkPad lex = envLexical env 94 104 95 105 {-| … … 244 254 , envPackage = maybe (envPackage e) envPackage (subEnv sub) 245 255 , envLexical = combine [blockRec] 246 (subPad sub `unionPads` envLexical env) } 256 (subPad sub `unionPads` envLexical env) 257 , envImplicit= envImplicit e `Map.union` Map.fromList 258 [ ("&?BLOCK", ()) ] 259 } 247 260 | otherwise = do 248 261 subRec <- sequence … … 255 268 , envPackage = maybe (envPackage e) envPackage (subEnv sub) 256 269 , envOuter = maybe Nothing envOuter (subEnv sub) 270 , envImplicit= envImplicit e `Map.union` Map.fromList 271 [ ("&?SUB", ()), ("$?SUBNAME", ()), ("&?CALLER_CONTINUATION", ()) ] 257 272 } 258 273 ccSub :: (Val -> Eval Val) -> Env -> VCode -
src/Pugs/Run.hs
r8207 r8705 158 158 , genSym "$*AUTOLOAD" $ MkRef autoSV 159 159 ] ++ classes 160 -- defSVcell <- (genSym "$_" . MkRef) =<< newScalar undef 161 let env' = env 162 {- 163 { envLexical = defSVcell (envLexical env) 164 , envImplicit = Map.singleton "$_" () 165 } 166 -} 160 167 unless safeMode $ do 161 initPerl5 "" (Just . VControl $ ControlEnv env { envDebug = Nothing })168 initPerl5 "" (Just . VControl $ ControlEnv env'{ envDebug = Nothing }) 162 169 return () 163 initPreludePC env -- null in first pass170 initPreludePC env' -- null in first pass 164 171 where 165 172 hideInSafemode x = if safeMode then MkRef $ constScalar undef else x -
t/var/caller.t
r8080 r8705 4 4 use Test; 5 5 6 plan 1 7;6 plan 18; 7 7 8 8 { … … 73 73 74 74 $_ = 23; 75 is bar(), 42, '$_ is implicitly declared "env" (2)' ;75 is bar(), 42, '$_ is implicitly declared "env" (2)', :todo<bug>; 76 76 } 77 77 … … 120 120 env $foo is rw = 42; 121 121 lives_ok { modify() }, 122 'env() vars declared "is rw" are rw when accessed with $CALLER:: (1)' ;122 'env() vars declared "is rw" are rw when accessed with $CALLER:: (1)', :todo<bug>; 123 123 is $foo, 43, 124 'env() vars declared "is rw" are rw when accessed with $CALLER:: (2)' ;124 'env() vars declared "is rw" are rw when accessed with $CALLER:: (2)', :todo<bug>; 125 125 } 126 127 =begin underspecced128 129 # Is $+foo really short for $CALLER::foo? S02 doesn't make this 100% clear.130 126 131 127 { … … 136 132 } 137 133 138 =end underspecced139 140 =cut141 142 134 # Rebinding caller's variables -- legal? 143 135 { … … 146 138 env $foo = 42; 147 139 148 lives_ok { rebind_foo() }, 'rebinding $CALLER:: variables works (1)' ;149 is $foo, 23, 'rebinding $CALLER:: variables works (2)' ;140 lives_ok { rebind_foo() }, 'rebinding $CALLER:: variables works (1)', :todo<bug>; 141 is $foo, 23, 'rebinding $CALLER:: variables works (2)', :todo<bug>; 150 142 $other_var++; 151 is $foo, 24, 'rebinding $CALLER:: variables works (3)' ;143 is $foo, 24, 'rebinding $CALLER:: variables works (3)', :todo<bug>; 152 144 } 153 145 -
t/var/chained.t
r8323 r8705 13 13 is((try { my $a3 = let $b3 = 42; $b3++; ($a3, $b3) }).perl, '(\\42, \\43)', "chained my, let"); 14 14 is((try { my $a4 = env $b4 = 42; $b4++; ($a4, $b4) }).perl, '(\\42, \\43)', "chained my, env"); 15 is((try { my $a5 = state $b5 = 42; $b5++; ($a5, $b5) }).perl, '(\\42, \\43)', "chained my, state" );16 is((try { my $b6 = 10; my $a6 = temp $b6 = 42; $b6++; ($a6, $b6) }).perl, '(\\42, \\43)', "chained my, temp" );15 is((try { my $a5 = state $b5 = 42; $b5++; ($a5, $b5) }).perl, '(\\42, \\43)', "chained my, state", :todo<bug>); 16 is((try { my $b6 = 10; my $a6 = temp $b6 = 42; $b6++; ($a6, $b6) }).perl, '(\\42, \\43)', "chained my, temp", :todo<bug>); 17 17 18 18 # scoping -
t/var/state.t
r8323 r8705 134 134 sub step () { 135 135 state $svar = state $svar2 = 42; 136 $svar++; 137 $svar2--; 138 return ($svar, $svar2); 136 try { 137 $svar++; 138 $svar2--; 139 return ($svar, $svar2); 140 } 139 141 }; 140 142 141 is(step().perl, "(43, 41)", "chained state (#1)" );142 is(step().perl, "(44, 40)", "chained state (#2)" );143 is(step().perl, "(43, 41)", "chained state (#1)", :todo<bug>); 144 is(step().perl, "(44, 40)", "chained state (#2)", :todo<bug>); 143 145 }
