Changeset 15828
- Timestamp:
- 04/04/07 19:51:21 (20 months ago)
- Files:
-
- 1 added
- 31 modified
-
Makefile.PL (modified) (2 diffs)
-
docs/notes/pad-refactoring.pod (added)
-
src/DrIFT/RuleYAML.hs (modified) (1 diff)
-
src/DrIFT/YAML.hs (modified) (14 diffs)
-
src/Pugs.hs (modified) (1 diff)
-
src/Pugs/AST.hs (modified) (6 diffs)
-
src/Pugs/AST/Internals.hs (modified) (18 diffs)
-
src/Pugs/AST/Internals/Instances.hs (modified) (34 diffs)
-
src/Pugs/AST/Pad.hs (modified) (2 diffs)
-
src/Pugs/Compile.hs (modified) (2 diffs)
-
src/Pugs/Compile/Pugs.hs (modified) (4 diffs)
-
src/Pugs/Eval.hs (modified) (17 diffs)
-
src/Pugs/Eval/Var.hs (modified) (3 diffs)
-
src/Pugs/Meta/Str.hs (modified) (1 diff)
-
src/Pugs/Monads.hs (modified) (5 diffs)
-
src/Pugs/Parser.hs (modified) (32 diffs)
-
src/Pugs/Parser.hs-boot (modified) (1 diff)
-
src/Pugs/Parser/Export.hs (modified) (1 diff)
-
src/Pugs/Parser/Literal.hs (modified) (1 diff)
-
src/Pugs/Parser/Operator.hs (modified) (1 diff)
-
src/Pugs/Parser/Program.hs (modified) (3 diffs)
-
src/Pugs/Parser/Types.hs (modified) (7 diffs)
-
src/Pugs/Parser/Unsafe.hs (modified) (2 diffs)
-
src/Pugs/Parser/Util.hs (modified) (5 diffs)
-
src/Pugs/Pretty.hs (modified) (3 diffs)
-
src/Pugs/Prim.hs (modified) (1 diff)
-
src/Pugs/Prim/Code.hs (modified) (3 diffs)
-
src/Pugs/Run.hs (modified) (2 diffs)
-
src/Pugs/Types.hs (modified) (2 diffs)
-
src/Pugs/Types/Code.hs (modified) (3 diffs)
-
t/builtins/arrays/slice.t (modified) (1 diff)
-
third-party/HsSyck/Data/Yaml/Syck.hsc (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
Makefile.PL
r15812 r15828 621 621 # } 622 622 623 my @ghci_flags = qw( -hide-all-packages -package base -package parsec -package template-haskell -package readline -package unix -package haskell98 -package mtl -package stm -package network -package pugs-HsSyck -package pugs-filepath ); 624 623 625 postamble(fixpaths(<< ".")); 624 626 $config_h : lib/Perl6/Pugs.pm util/config_h.pl … … 787 789 $ghc @{[ dethread_flags($ghc_flags) ]} $ghc_output -DPUGS_UNDER_GHCI -no-link --make -O0 -fglasgow-exts -L. -idist/build -Ldist/build -idist/build/src -Ldist/build/src -isrc src/Prereqs.hs @prereqs 788 790 \@\$(RM_RF) src/Pugs/*/*_stub.* 789 $ghc @{[ dethread_flags($ghc_flags) ]} $ghc_output -DPUGS_UNDER_GHCI --interactive -fglasgow-exts $ghci_debugging -L. -idist/build -Ldist/build -idist/build/src -Ldist/build/src -isrc src/Main.hs @prereqs791 $ghc @{[ dethread_flags($ghc_flags) ]} @ghci_flags $ghc_output -DPUGS_UNDER_GHCI --interactive -fglasgow-exts $ghci_debugging -L. -idist/build -Ldist/build -idist/build/src -Ldist/build/src -isrc src/Main.hs @prereqs 790 792 791 793 ctags : @prereqs @derived_srcfiles 792 echo ":ctags" | $ghc $ghc_flags $ghc_output --interactive -osuf moose -hisuf miise -fglasgow-exts -L. -idist/build -Ldist/build -idist/build/src -Ldist/build/src -isrc src/Main.hs @prereqs794 echo ":ctags" | $ghc $ghc_flags @ghci_flags $ghc_output --interactive -osuf moose -hisuf miise -fglasgow-exts -L. -idist/build -Ldist/build -idist/build/src -Ldist/build/src -isrc src/Main.hs @prereqs 793 795 794 796 etags : @prereqs @derived_srcfiles 795 echo ":etags" | $ghc $ghc_flags $ghc_output --interactive -osuf moose -hisuf miise -fglasgow-exts -L. -idist/build -Ldist/build -idist/build/src -Ldist/build/src -isrc src/Main.hs @prereqs797 echo ":etags" | $ghc $ghc_flags @ghci_flags $ghc_output --interactive -osuf moose -hisuf miise -fglasgow-exts -L. -idist/build -Ldist/build -idist/build/src -Ldist/build/src -isrc src/Main.hs @prereqs 796 798 797 799 pil$Config{_exe} : $config_h $pcre @srcfiles src/PIL/Native/Bootstrap.hs src/PIL/Native/Syntax.hs -
src/DrIFT/RuleYAML.hs
r15753 r15828 30 30 caseHead _ = text "fromYAML MkNode{n_tag=Just t, n_elem=e} | 't':'a':'g':':':'h':'s':':':tag <- unpackBuf t = case tag of" 31 31 caseTail bodies = nest 4 (text $ "_ -> fail $ \"unhandled tag: \" ++ show t ++ \", expecting \" ++ show " ++ show (map constructor bodies) ++ " ++ \" in node \" ++ show e") 32 $+$ text "fromYAML _ = fail \"no tag found\""32 $+$ (text $ "fromYAML e = fail $ \"no tag found: expecting \" ++ show " ++ show (map constructor bodies) ++ " ++ \" in node \" ++ show e") 33 33 34 34 makeFromYAML, makeAsYAML :: AlwaysPositional -> IFunction -
src/DrIFT/YAML.hs
r15777 r15828 9 9 import Control.Exception 10 10 import Control.Concurrent.STM 11 import Foreign.StablePtr12 11 import Foreign.Ptr 13 12 import Control.Monad.Reader 14 13 import GHC.PArr 14 import System.IO.Unsafe 15 15 import Data.IORef 16 import Foreign.C.Types17 16 import Data.Bits 18 17 import Data.List ( foldl' ) 19 18 import Data.Int ( Int32, Int64 ) 20 import Pugs.Internals (encodeUTF8, decodeUTF8 )19 import Pugs.Internals (encodeUTF8, decodeUTF8, addressOf, safeMode) 21 20 import Data.HashTable (HashTable) 22 21 import qualified UTF8 as Buf 23 22 import qualified Data.ByteString as Bytes 24 import qualified Data.Int Map as IntMap23 import qualified Data.IntSet as IntSet 25 24 import qualified Data.HashTable as Hash 26 25 … … 30 29 type YAMLKey = String 31 30 type YAMLVal = YamlNode 32 type SeenCache = IORef (IntMap.IntMap (Ptr ()))31 type SeenCache = IORef IntSet.IntSet 33 32 34 33 toYamlNode :: YAML a => a -> IO YamlNode 35 34 toYamlNode x = do 36 cache <- newIORef Int Map.empty35 cache <- newIORef IntSet.empty 37 36 runReaderT (asYAML x) cache 38 37 … … 43 42 44 43 showYamlCompressed :: YAML a => a -> IO String 45 showYamlCompressed x = do44 showYamlCompressed x = if safeMode then showYaml x else do 46 45 node <- toYamlNode x 47 46 node' <- compressYamlNode node … … 89 88 return (k', v') 90 89 91 fromYAMLseq :: YAML a => YamlNode -> IO [a]90 fromYAMLseq :: forall a. YAML a => YamlNode -> IO [a] 92 91 fromYAMLseq MkNode{n_elem=ESeq m} = mapM fromYAML m 93 fromYAMLseq e = fail $ "no parse: " ++ show e 94 95 fromYAMLmap :: YAML a => YamlNode -> IO [(String, a)]92 fromYAMLseq e = fail $ "no parse: " ++ show e ++ ", expecting seq of " ++ show (typeOf (undefined :: a)) 93 94 fromYAMLmap :: forall a. YAML a => YamlNode -> IO [(String, a)] 96 95 fromYAMLmap MkNode{n_elem=EMap m} = mapM fromYAMLpair m 97 96 where … … 100 99 return (unpackBuf k, v') 101 100 fromYAMLpair e = fail $ "no parse: " ++ show e 102 fromYAMLmap e = fail $ "no parse: " ++ show e 103 104 fromYAMLmapBuf :: YAML a => YamlNode -> IO [(Buf.ByteString, a)]101 fromYAMLmap e = fail $ "no parse: " ++ show e ++ ", expecting map of " ++ show (typeOf (undefined :: a)) 102 103 fromYAMLmapBuf :: forall a. YAML a => YamlNode -> IO [(Buf.ByteString, a)] 105 104 fromYAMLmapBuf MkNode{n_elem=EMap m} = mapM fromYAMLpair m 106 105 where … … 108 107 v' <- fromYAML v 109 108 return (k, v') 110 fromYAMLpair e = fail $ "no parse: " ++ show e 111 fromYAMLmapBuf e = fail $ "no parse: " ++ show e 109 fromYAMLpair e = fail $ "no parse: " ++ show e ++ ", expecting pair of " ++ show (typeOf (undefined :: a)) 110 fromYAMLmapBuf e = fail $ "no parse: " ++ show e ++ ", expecting mapping of " ++ show (typeOf (undefined :: a)) 112 111 113 112 asYAMLcls :: YAMLClass -> EmitAs YamlNode … … 194 193 195 194 instance (YAML a) => YAML [a] where 196 asYAML xs = asYAMLanchor xs $ do195 asYAML xs = do -- asYAMLanchor xs $ do 197 196 xs' <- mapM asYAML xs 198 197 (return . mkNode . ESeq) xs' 198 fromYAML MkNode{n_elem=(ESeq s)} = mapM fromYAML s 199 fromYAML n = fail $ "no parse: " ++ show n ++ ", expecting list of " ++ show (typeOf (undefined :: a)) 199 200 fromYAMLElem (ESeq s) = mapM fromYAML s 200 fromYAMLElem e = fail $ "no parse: " ++ show e 201 fromYAMLElem e = fail $ "no parse: " ++ show e ++ ", expecting list of " ++ show (typeOf (undefined :: a)) 201 202 202 203 instance (YAML a) => YAML [:a:] where 203 asYAML xs = asYAMLanchor xs $ do204 asYAML xs = do -- asYAMLanchor xs $ do 204 205 xs' <- mapM asYAML (fromP xs) 205 206 (return . mkNode . ESeq) xs' 206 207 fromYAMLElem (ESeq s) = fmap toP (mapM fromYAML s) 207 fromYAMLElem e = fail $ "no parse: " ++ show e 208 fromYAMLElem e = fail $ "no parse: " ++ show e ++ ", expecting array of " ++ show (typeOf (undefined :: a)) 208 209 209 210 instance (YAML a, YAML b) => YAML (a, b) where … … 216 217 y' <- fromYAML y 217 218 return (x', y') 218 fromYAMLElem e = fail $ "no parse: " ++ show e 219 fromYAMLElem e = fail $ "no parse: " ++ show e ++ ", expecting " ++ show (typeOf (undefined :: (a, b))) 219 220 220 221 instance (YAML a, YAML b, YAML c) => YAML (a, b, c) where … … 229 230 z' <- fromYAML z 230 231 return (x', y', z') 231 fromYAMLElem e = fail $ "no parse: " ++ show e 232 fromYAMLElem e = fail $ "no parse: " ++ show e ++ ", expecting " ++ show (typeOf (undefined :: (a, b, c))) 233 234 {-# NOINLINE seen #-} 235 seen :: Hash.HashTable SYMID Any 236 seen = unsafePerformIO (Hash.new (==) fromIntegral) 237 238 cleanSeen :: IO () 239 cleanSeen = do 240 kvs <- Hash.toList seen 241 mapM_ (Hash.delete seen . fst) kvs 232 242 233 243 instance (Typeable a, YAML a) => YAML (TVar a) where 234 asYAML = asYAMLwith (lift . atomically . readTVar) 235 fromYAML = (newTVarIO =<<) . fromYAML 236 fromYAMLElem = (newTVarIO =<<) . fromYAMLElem 244 asYAML x = asYAMLanchor x $ do 245 asYAMLseq "TVar" . (:[]) $ do 246 content <- (lift . atomically . readTVar) x 247 asYAML content 248 fromYAML MkNode{n_id=nid, n_elem=(ESeq [aa])} = do 249 -- If this node is seen, then don't bother -- just read from it. 250 rv <- Hash.lookup seen nid 251 case rv of 252 Just x -> do 253 -- print ("hit", nid) 254 return (unsafeCoerce# x) 255 _ -> do 256 -- print ("stored", nid) 257 tv <- newTVarIO (error $ "value of TV demanded before cycle completes: " ++ show (typeOf (undefined :: a))) 258 Hash.insert seen nid (unsafeCoerce# tv) 259 j <- fromYAML aa 260 atomically (writeTVar tv j) 261 return tv 262 fromYAML node = do 263 fail $ "Want (TVar " ++ show node ++ "|" ++ show (typeOf (undefined :: a)) ++ "), got moose: " ++ show node 264 237 265 238 266 asYAMLanchor :: a -> EmitAs YamlNode -> EmitAs YamlNode 239 asYAMLanchor _ m = m 240 {-do 267 asYAMLanchor x m = do 241 268 cache <- ask 242 269 seen <- liftIO $ readIORef cache 243 ref <- liftIO $ fmap castStablePtrToPtr (newStablePtr x) 244 let ptr = ref `minusPtr` nullPtr 245 if IntMap.member ptr seen 270 let ptr = 1000 + fromEnum (addressOf x) 271 if IntSet.member ptr seen 246 272 then return nilNode{ n_anchor = AReference ptr } 247 273 else do 248 liftIO $ modifyIORef cache (Int Map.insert ptr ref)274 liftIO $ modifyIORef cache (IntSet.insert ptr) 249 275 rv <- m 250 276 return rv{ n_anchor = AAnchor ptr } 251 -}252 277 253 278 asYAMLwith :: (YAML a, YAML b) => (a -> EmitAs b) -> a -> EmitAs YamlNode … … 286 311 287 312 eqNode :: YamlNode -> YamlNode -> Bool 288 eqNode x y = (n_tag x == n_tag y) && eqElem (n_elem x) (n_elem y) 313 eqNode MkNode{ n_id = x } MkNode{ n_id = y } | x > 0, x == y = True 314 eqNode x@MkNode{ n_anchor = ASingleton } y@MkNode{ n_anchor = ASingleton } = (n_tag x == n_tag y) && eqElem (n_elem x) (n_elem y) 315 eqNode _ _ = False 289 316 290 317 eqElem :: YamlElem -> YamlElem -> Bool … … 324 351 325 352 markNode :: (?seenHash :: SeenHash, ?duplHash :: DuplHash) => YamlNode -> IO YamlNode 326 markNode node = do 353 markNode node@MkNode{ n_anchor = AReference r } = {-# SCC "ref" #-} do 354 -- All we need to do is to write this into duplHash. 355 let symid = fromIntegral r 356 node' = node{ n_anchor = ASingleton, n_id = symid } 357 rv <- Hash.lookup ?seenHash symid 358 case rv of 359 Just (Just prevNode) -> return prevNode 360 _ -> do 361 Hash.insert ?seenHash symid Nothing 362 return node' 363 markNode node@MkNode{ n_anchor = AAnchor r } = {-# SCC "anc" #-} do 364 -- All we need to do is to write this into duplHash. 365 -- XXX - But maybe also descend deeper? 366 (_, elem') <- markElem (n_elem node) 367 let symid = fromIntegral r 368 node' = node{ n_anchor = ASingleton, n_id = symid, n_elem = elem' } 369 Hash.insert ?seenHash symid (Just node') 370 Hash.insert ?duplHash node' 0 371 return node' 372 markNode node = {-# SCC "reg" #-} do 327 373 (symid32, elem') <- markElem (n_elem node) 328 374 let node' = node{ n_id = symid } … … 331 377 rv <- Hash.lookup ?seenHash symid 332 378 case rv of 333 Just (Just prevNode) ->do334 Hash. update?duplHash node' 0335 Hash.update ?duplHash prevNode 0379 Just (Just _) -> {-# SCC "reg1" #-} do 380 Hash.insert ?duplHash node' 0 381 -- Hash.update ?duplHash prevNode 0 336 382 Hash.update ?seenHash symid Nothing 337 Just _ -> Hash.update ?duplHash node' 0 338 _ -> Hash.update ?seenHash symid (Just node') 383 return () 384 Just _ -> return () -- {-# SCC "reg2" #-} Hash.update ?duplHash node' 0 385 _ -> {-# SCC "reg3" #-} do 386 Hash.insert ?seenHash symid (Just undefined) 387 return () 339 388 return node'{ n_elem = elem' } 340 389 341 390 markElem :: (?seenHash :: SeenHash, ?duplHash :: DuplHash) => YamlElem -> IO (Int32, YamlElem) 342 markElem ENil = return ( 0, ENil)391 markElem ENil = return (10000, ENil) 343 392 markElem n@(EStr buf) = return (Buf.hash buf, n) 344 393 markElem (ESeq ns) = do … … 346 395 return (hashIDs (map n_id ns'), ESeq ns') 347 396 markElem (EMap ps) = do 348 (symid, ps') <- foldM markPair ( 0, []) ps397 (symid, ps') <- foldM markPair (20000, []) ps 349 398 return (symid, EMap ps') 350 399 where … … 355 404 356 405 hashIDs :: [SYMID] -> Int32 357 hashIDs = foldl' iterIDs 0406 hashIDs = foldl' iterIDs 30000 358 407 359 408 iterIDs :: Int32 -> SYMID -> Int32 -
src/Pugs.hs
r15777 r15828 369 369 makeDumpEnv (Stmts x exp) = Stmts x $ makeDumpEnv exp 370 370 makeDumpEnv (Ann ann exp) = Ann ann $ makeDumpEnv exp 371 makeDumpEnv (Pad x y exp) = Pad x y $ makeDumpEnv exp371 -- makeDumpEnv (Pad x y exp) = Pad x y $ makeDumpEnv exp 372 372 makeDumpEnv (Sym x y z w exp) = Sym x y z w $ makeDumpEnv exp 373 373 makeDumpEnv exp = Stmts (Ann (Cxt cxtItemAny) exp) (Syn "continuation" []) -
src/Pugs/AST.hs
r15777 r15828 16 16 genSym, genMultiSym, genSymScoped, genPadEntryScoped, mkPadMutator, 17 17 strRangeInf, strRange, strInc, 18 mergeStmts, isEmptyParams, 18 mergeStmts, isEmptyParams, isCompileTime, 19 19 newPackage, newType, newMetaType, typeMacro, isScalarLValue, 20 20 filterPrim, filterUserDefinedPad, typeOfParam, listVal, isImmediateMatchContext, … … 168 168 | otherwise = stm $ do 169 169 tvar <- newTVar ref 170 fresh <- newTVar True 171 return (PELexical typ ref flags tvar fresh) 170 return (PELexical typ ref flags tvar) 172 171 where 173 172 typ = refType ref … … 231 230 Ann Parens _ -> False 232 231 Ann _ exp -> isScalarLValue exp 233 Pad _ _ exp -> isScalarLValue exp234 232 Sym _ _ _ _ exp -> isScalarLValue exp 235 233 Var var | SScalar <- v_sigil var -> True … … 301 299 mergeStmts Noop y@(Stmts _ _) = y 302 300 mergeStmts (Sym scope name flag init x) y = Sym scope name flag init (mergeStmts x y) 303 mergeStmts (Pad scope lex x) y = Pad scope lex (mergeStmts x y)304 301 mergeStmts (Syn "package" [kind, pkg@(Val (VStr _))]) y = 305 302 Syn "namespace" [kind, pkg, y] … … 378 375 { isMulti = True 379 376 , subName = cast name 380 , subEnv = Nothing 377 , subOuterPads = [] 378 , subInnerPad = emptyPad 379 , subLexical = emptyPad 380 , subStarted = Nothing 381 , subPackage = emptyPkg 381 382 , subType = SubMacro 382 383 , subAssoc = ANil … … 491 492 readCodesFromRef (MkRef (ICode (code :: VCode))) 492 493 494 isCompileTime :: Env -> Bool 495 isCompileTime = isJust . envCompPad 496 -
src/Pugs/AST/Internals.hs
r15777 r15828 11 11 SubAssoc(..), TraitBlocks(..), emptyTraitBlocks, 12 12 13 Pad(..), PadEntry(..), EntryFlags(..), PadMutator, -- uses Var, TVar, VRef13 MPad, LexPad(..), LexPads, Pad(..), PadEntry(..), EntryFlags(..), PadMutator, -- uses Var, TVar, VRef 14 14 Param(..), -- uses Cxt, Exp 15 15 Params, -- uses Param … … 17 17 SlurpLimit, -- VInt, Exp 18 18 19 emptyPad, 20 19 21 VRef(..), -- uses IVar 20 22 VOpaque(..), -- uses Value … … 1023 1025 mappend x _ = x 1024 1026 1027 type MPad = TVar Pad 1028 1025 1029 -- | Represents a sub, method, closure etc. -- basically anything callable. 1026 1030 data VCode = MkCode 1027 { isMulti :: !Bool -- ^ Is this a multi sub\/method? 1028 , subName :: !ByteString -- ^ Name of the closure 1029 , subType :: !SubType -- ^ Type of the closure 1030 , subEnv :: !(Maybe Env) -- ^ Lexical pad for sub\/method 1031 , subAssoc :: !SubAssoc -- ^ Associativity 1032 , subParams :: !Params -- ^ Parameters list 1033 , subBindings :: !Bindings -- ^ Currently assumed bindings 1034 , subSlurpLimit :: !SlurpLimit -- ^ Max. number of slurpy arguments 1035 , subReturns :: !Type -- ^ Return type 1036 , subLValue :: !Bool -- ^ Is this a lvalue sub? 1037 , subBody :: !Exp -- ^ Body of the closure 1031 { isMulti :: !Bool -- ^ Is this a multi sub\/method? 1032 , subName :: !ByteString -- ^ Name of the closure 1033 , subType :: !SubType -- ^ Type of the closure 1034 , subOuterPads :: !LexPads -- ^ Lexical pads for this scope 1035 , subInnerPad :: !Pad -- ^ Inner lexical pad (immutable) 1036 , subLexical :: !Pad -- ^ Cached merged pads 1037 , subPackage :: !Pkg -- ^ Package of the subroutine 1038 , subAssoc :: !SubAssoc -- ^ Associativity 1039 , subParams :: !Params -- ^ Parameters list 1040 , subBindings :: !Bindings -- ^ Currently assumed bindings 1041 , subSlurpLimit :: !SlurpLimit -- ^ Max. number of slurpy arguments 1042 , subReturns :: !Type -- ^ Return type 1043 , subLValue :: !Bool -- ^ Is this a lvalue sub? 1044 , subBody :: !Exp -- ^ Body of the closure 1038 1045 , subCont :: !(Maybe (TVar VThunk)) -- ^ Coroutine re-entry point 1046 , subStarted :: !(Maybe (TVar Bool)) -- ^ Whether START was run 1039 1047 , subTraitBlocks :: !TraitBlocks 1040 1048 } … … 1066 1074 mkPrim :: VCode 1067 1075 mkPrim = MkCode 1068 { isMulti = True 1069 , subName = cast "&" 1070 , subType = SubPrim 1071 , subEnv = Nothing 1072 , subAssoc = ANil 1073 , subParams = [] 1074 , subBindings = [] 1075 , subSlurpLimit = [] 1076 , subReturns = anyType 1077 , subBody = emptyExp 1078 , subLValue = False 1079 , subCont = Nothing 1076 { isMulti = True 1077 , subName = cast "&" 1078 , subType = SubPrim 1079 , subOuterPads = [] 1080 , subInnerPad = emptyPad 1081 , subLexical = emptyPad 1082 , subPackage = emptyPkg 1083 , subAssoc = ANil 1084 , subParams = [] 1085 , subBindings = [] 1086 , subSlurpLimit = [] 1087 , subReturns = anyType 1088 , subBody = emptyExp 1089 , subLValue = False 1090 , subCont = Nothing 1091 , subStarted = Nothing 1080 1092 , subTraitBlocks = emptyTraitBlocks 1081 1093 } … … 1083 1095 mkSub :: VCode 1084 1096 mkSub = MkCode 1085 { isMulti = False 1086 , subName = cast "&" 1087 , subType = SubBlock 1088 , subEnv = Nothing 1089 , subAssoc = ANil 1090 , subParams = [] 1091 , subBindings = [] 1092 , subSlurpLimit = [] 1093 , subReturns = anyType 1094 , subBody = emptyExp 1095 , subLValue = False 1096 , subCont = Nothing 1097 { isMulti = False 1098 , subName = cast "&" 1099 , subType = SubBlock 1100 , subOuterPads = [] 1101 , subInnerPad = emptyPad 1102 , subLexical = emptyPad 1103 , subPackage = emptyPkg 1104 , subAssoc = ANil 1105 , subParams = [] 1106 , subBindings = [] 1107 , subSlurpLimit = [] 1108 , subReturns = anyType 1109 , subBody = emptyExp 1110 , subLValue = False 1111 , subCont = Nothing 1112 , subStarted = Nothing 1097 1113 , subTraitBlocks = emptyTraitBlocks 1098 1114 } … … 1100 1116 mkCode :: VCode 1101 1117 mkCode = MkCode 1102 { isMulti = False 1103 , subName = cast "&" 1104 , subType = SubBlock 1105 , subEnv = Nothing 1106 , subAssoc = ANil 1107 , subParams = [] 1108 , subBindings = [] 1109 , subSlurpLimit = [] 1110 , subReturns = anyType 1111 , subBody = emptyExp 1112 , subLValue = False 1113 , subCont = Nothing 1118 { isMulti = False 1119 , subName = cast "&" 1120 , subType = SubBlock 1121 , subOuterPads = [] 1122 , subInnerPad = emptyPad 1123 , subLexical = emptyPad 1124 , subPackage = emptyPkg 1125 , subAssoc = ANil 1126 , subParams = [] 1127 , subBindings = [] 1128 , subSlurpLimit = [] 1129 , subReturns = anyType 1130 , subBody = emptyExp 1131 , subLValue = False 1132 , subCont = Nothing 1133 , subStarted = Nothing 1114 1134 , subTraitBlocks = emptyTraitBlocks 1115 1135 } … … 1152 1172 -- be represented by 'App'. 1153 1173 | Ann !Ann !Exp -- ^ Annotation (see @Ann@) 1154 | Pad !Scope !Pad !Exp -- ^ Lexical pad1174 -- | Pad !Scope !Pad !Exp -- ^ Lexical pad 1155 1175 | Sym !Scope !Var !EntryFlags !Exp !Exp -- ^ Symbol declaration 1156 1176 | Stmts !Exp !Exp -- ^ Multiple statements … … 1187 1207 transformExp f (Syn t es) = f =<< liftM (Syn t) (mapM (transformExp f) es) 1188 1208 transformExp f (Ann a e) = f =<< liftM (Ann a) (transformExp f e) 1189 transformExp f (Pad s p e) = f =<< liftM (Pad s p) (transformExp f e)1209 -- transformExp f (Pad s p e) = f =<< liftM (Pad s p) (transformExp f e) 1190 1210 transformExp f (Sym s v c i e) = f =<< liftM (Sym s v c i) (transformExp f e) 1191 1211 transformExp f (Stmts e1 e2) = do … … 1213 1233 instance Unwrap Exp where 1214 1234 unwrap (Ann _ exp) = unwrap exp 1215 unwrap (Pad _ _ exp) = unwrap exp1235 -- unwrap (Pad _ _ exp) = unwrap exp 1216 1236 unwrap (Sym _ _ _ _ exp)= unwrap exp 1217 1237 unwrap x = x … … 1266 1286 where 1267 1287 (ex', vs') = extractPlaceholderVars ex vs 1268 extractPlaceholderVars (Pad scope pad ex) vs = ((Pad scope pad ex'), vs')1269 where1270 (ex', vs') = extractPlaceholderVars ex vs1288 -- extractPlaceholderVars (Pad scope pad ex) vs = ((Pad scope pad ex'), vs') 1289 -- where 1290 -- (ex', vs') = extractPlaceholderVars ex vs 1271 1291 extractPlaceholderVars (Sym scope var flags ini ex) vs = ((Sym scope var flags ini ex'), vs') 1272 1292 where … … 1301 1321 defaultArrayParam = buildParam "" "*" "@_" (Val VUndef) 1302 1322 defaultHashParam = buildParam "" "*" "%_" (Val VUndef) 1303 defaultScalarParam = buildParam "" "?" "$_" (Var $ cast "$ _")1323 defaultScalarParam = buildParam "" "?" "$_" (Var $ cast "$OUTER::_") 1304 1324 1305 1325 type DebugInfo = Maybe (TVar (Map ID String)) 1326 1327 type LexPads = [LexPad] 1328 data LexPad 1329 = PRuntime { pr_pad :: !Pad } 1330 | PCompiling { pc_pad :: !MPad } 1331 deriving (Show, Eq, Ord, Typeable) {-!derive: YAML_Pos!-} 1306 1332 1307 1333 {-| … … 1313 1339 -} 1314 1340 data Env = MkEnv 1315 { envContext :: !Cxt -- ^ Current context1316 -- ('CxtVoid', 'CxtItem' or 'CxtSlurpy')1317 , envLValue :: !Bool -- ^ Are we in an LValue context?1318 , envLexical :: !Pad -- ^ Lexical pad for variable lookup1319 , env Implicit:: !(Map Var ()) -- ^ Set of implicit variables1320 , env Global :: !(TVar Pad) -- ^ Global pad for variable lookup1321 , env Package :: !Pkg -- ^ Current package1322 , env Eval :: !(Exp -> Eval Val) -- ^ Active evaluator1323 , env Caller :: !(Maybe Env) -- ^ Caller's "env" pad1324 , env Outer :: !(Maybe Env) -- ^ Outer block's env1325 , envBody :: !Exp -- ^ Current AST expression1326 , envFrames :: !(Set Frame) -- ^ Recursion depth
