Changeset 15616
- Timestamp:
- 03/12/07 01:43:31 (19 months ago)
- Location:
- src/Pugs
- Files:
-
- 25 modified
-
AST.hs (modified) (2 diffs)
-
AST/CapInternals.hs (modified) (1 diff)
-
AST/Eval.hs (modified) (6 diffs)
-
AST/Internals.hs (modified) (34 diffs)
-
AST/Utils.hs (modified) (1 diff)
-
CodeGen/Binary.hs (modified) (1 diff)
-
CodeGen/PIL2.hs (modified) (1 diff)
-
CodeGen/PIR.hs (modified) (6 diffs)
-
CodeGen/YAML.hs (modified) (2 diffs)
-
Compile.hs (modified) (1 diff)
-
Compile/Haskell.hs (modified) (1 diff)
-
Compile/PIL2.hs (modified) (5 diffs)
-
Compile/Pugs.hs (modified) (3 diffs)
-
Embed/Haskell.hs (modified) (1 diff)
-
Eval.hs (modified) (14 diffs)
-
Eval/Var.hs (modified) (3 diffs)
-
External.hs (modified) (1 diff)
-
Junc.hs (modified) (1 diff)
-
Prim.hs (modified) (18 diffs)
-
Prim/Eval.hs (modified) (8 diffs)
-
Prim/FileTest.hs (modified) (1 diff)
-
Prim/List.hs (modified) (4 diffs)
-
Prim/Match.hs (modified) (3 diffs)
-
Prim/Yaml.hs (modified) (4 diffs)
-
Run.hs (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/AST.hs
r15611 r15616 155 155 return (EntryConstant typ ref) 156 156 | isStaticScope scope = do 157 tvar <- liftSTM$ newTVar ref157 tvar <- stm $ newTVar ref 158 158 return (EntryStatic typ ref tvar) 159 159 | otherwise = do 160 tvar <- liftSTM$ newTVar ref161 fresh <- liftSTM$ newTVar True160 tvar <- stm $ newTVar ref 161 fresh <- stm $ newTVar True 162 162 return (EntryLexical typ ref tvar fresh) 163 163 where … … 369 369 filterPrim :: (TVar Pad) -> Eval Pad 370 370 filterPrim glob = do 371 MkPad pad <- liftSTM$ readTVar glob371 MkPad pad <- stm $ readTVar glob 372 372 fmap (MkPad . Map.fromAscList . catMaybes) . mapM checkPrim $ Map.toAscList pad 373 373 -
src/Pugs/AST/CapInternals.hs
r15464 r15616 409 409 lv <- asks envLValue 410 410 case lv of 411 RValue -> liftSTM(readTVar t)411 RValue -> stm (readTVar t) 412 412 LValue typ -> do 413 413 rv <- readTVar t -
src/Pugs/AST/Eval.hs
r15572 r15616 32 32 33 33 tryIO :: a -> IO a -> Eval a 34 tryIO err = liftEval . liftIO. (`catchIO` (const $ return err))34 tryIO err = liftEval . io . (`catchIO` (const $ return err)) 35 35 36 36 {-| … … 137 137 138 138 instance MonadIO Eval where 139 liftIO = liftEval . liftIO139 liftIO = liftEval . io 140 140 141 141 instance MonadError Val Eval where … … 153 153 -} 154 154 guardIO :: IO a -> Eval a 155 guardIO io= do156 rv <- liftIO $ try io155 guardIO x = do 156 rv <- io $ try x 157 157 case rv of 158 158 Left e -> fail (show e) … … 166 166 -} 167 167 guardIOexcept :: MonadIO m => [((Exception -> Bool), a)] -> IO a -> m a 168 guardIOexcept safetyNet io= do169 rv <- liftIO $ try io168 guardIOexcept safetyNet x = do 169 rv <- io $ try x 170 170 case rv of 171 171 Right v -> return v … … 178 178 179 179 guardSTM :: STM a -> Eval a 180 guardSTM stm= do181 rv <- liftSTM $ fmap Right stm`catchSTM` (return . Left)180 guardSTM x = do 181 rv <- stm $ fmap Right x `catchSTM` (return . Left) 182 182 case rv of 183 183 Left e -> fail (show e) … … 186 186 instance MonadSTM Eval where 187 187 liftSIO = EvalT . fmap RNormal . lift . lift 188 liftSTM stm= do188 liftSTM x = do 189 189 atom <- asks envAtomic 190 190 if atom 191 then EvalT (fmap RNormal . lift . lift . liftSTM $ stm)192 else EvalT (fmap RNormal . lift . lift . liftIO . liftSTM $ stm)191 then EvalT (fmap RNormal . lift . lift . stm $ x) 192 else EvalT (fmap RNormal . lift . lift . io . stm $ x) 193 193 194 194 instance MonadReader Env Eval where -
src/Pugs/AST/Internals.hs
r15611 r15616 226 226 fromSV :: PerlSV -> Eval n 227 227 fromSV sv = do 228 str <- liftIO$ svToVStr sv228 str <- io $ svToVStr sv 229 229 fail $ "Cannot cast from SV (" ++ str ++ ") to " ++ errType (undefined :: n) 230 230 castV :: n -> Val … … 247 247 isRef _ = False 248 248 fromVal' (PerlSV sv) = do 249 v <- liftIO$ svToVal sv249 v <- io $ svToVal sv 250 250 case v of 251 251 PerlSV sv' -> fromSV sv' -- it was a SV … … 266 266 vvToVal x 267 267 | Just sv <- Val.castVal x = do 268 rv <- liftIO(svToVal sv)268 rv <- io (svToVal sv) 269 269 case rv of 270 270 VV vv … … 287 287 -- first, check if the list is at least abs(idx) long 288 288 MkIArray iv <- getArr 289 a <- liftSTM$ readTVar iv289 a <- stm $ readTVar iv 290 290 let size = a_size a 291 291 if size > abs (idx+1) 292 then return ( IScalar (a !: (idx `mod` size)))292 then return (a !: (idx `mod` size)) 293 293 else errIndex def idx 294 294 -- now we are all positive; either extend or return 295 295 getArrayIndex idx def getArr ext = do 296 296 MkIArray iv <- getArr 297 a <- liftSTM$ readTVar iv297 a <- stm $ readTVar iv 298 298 let size = a_size a 299 299 if size > idx 300 then return ( IScalar (a !: idx))300 then return (a !: idx) 301 301 else case ext of 302 302 Just doExt -> do { doExt; getArrayIndex idx def getArr Nothing } … … 306 306 => ObjectId -> Maybe Dynamic -> VType -> [(VStr, Val)] -> m VObject 307 307 createObjectRaw uniq opaq typ attrList = do 308 attrs <- liftSTM. unsafeIOToSTM . H.fromList H.hashString $ map (\(a,b) -> (a, lazyScalar b)) attrList308 attrs <- stm . unsafeIOToSTM . H.fromList H.hashString $ map (\(a,b) -> (a, lazyScalar b)) attrList 309 309 return $ MkObject 310 310 { objType = typ … … 381 381 instance Value VHash where 382 382 fromVal (VObject o) = do 383 l <- liftIO$ H.toList (objAttrs o)383 l <- io $ H.toList (objAttrs o) 384 384 fmap Map.fromList . forM l $ \(k, ivar) -> do 385 385 v <- readIVar ivar … … 433 433 runInvokePerl5 sub inv args = do 434 434 env <- ask 435 rv <- liftIO$ do435 rv <- io $ do 436 436 envSV <- mkEnv env 437 437 invokePerl5 sub inv args envSV (enumCxt $ envContext env) 438 438 case rv of 439 Perl5ReturnValues [x] -> liftIO$ svToVal x440 Perl5ReturnValues xs -> liftIO$ fmap VList (mapM svToVal xs)439 Perl5ReturnValues [x] -> io $ svToVal x 440 Perl5ReturnValues xs -> io $ fmap VList (mapM svToVal xs) 441 441 Perl5ErrorString str -> fail str 442 442 Perl5ErrorObject err -> throwError (PerlSV err) … … 459 459 instance Value VBool where 460 460 castV = VBool 461 fromSV sv = liftIO$ svToVBool sv461 fromSV sv = io $ svToVBool sv 462 462 fromVV vv = fmap cast (Val.asBit vv) 463 463 doCast (VJunc j) = juncToBool j … … 478 478 castV = VInt 479 479 fromVV vv = fmap cast (Val.asInt vv) 480 fromSV sv = liftIO$ svToVInt sv480 fromSV sv = io $ svToVInt sv 481 481 doCast (VInt i) = return $ i 482 482 doCast x = fmap truncate (fromVal x :: Eval VRat) … … 484 484 instance Value VRat where 485 485 castV = VRat 486 fromSV sv = liftIO$ svToVNum sv486 fromSV sv = io $ svToVNum sv 487 487 doCast (VInt i) = return $ i % 1 488 488 doCast (VRat r) = return $ r … … 506 506 castV = VNum 507 507 fromVV vv = fmap cast (Val.asNum vv) 508 fromSV sv = liftIO$ svToVNum sv508 fromSV sv = io $ svToVNum sv 509 509 doCast VUndef = return $ 0 510 510 doCast VType{} = return $ 0 … … 554 554 instance Value ID where 555 555 castV = VStr . cast 556 fromSV sv = fmap cast ( liftIO$ svToVStr sv)556 fromSV sv = fmap cast (io $ svToVStr sv) 557 557 fromVV vv = fmap cast (Val.asStr vv) 558 558 fromVal = fmap (cast :: VStr -> ID) . fromVal … … 561 561 instance Value VStr where 562 562 castV = VStr 563 fromSV sv = liftIO$ svToVStr sv563 fromSV sv = io $ svToVStr sv 564 564 fromVV vv = fmap cast (Val.asStr vv) 565 565 fromVal (VList l) = return . unwords =<< mapM fromVal l … … 609 609 610 610 instance Value PerlSV where 611 fromVal val = liftIO$ newSVval val611 fromVal val = io $ newSVval val 612 612 doCast v = castFailM v "PerlSV" 613 613 … … 696 696 697 697 instance Value Int where 698 fromSV sv = liftIO$ svToVInt sv698 fromSV sv = io $ svToVInt sv 699 699 doCast x = intCast x 700 700 castV = VInt . fromIntegral … … 1423 1423 readPadEntry :: MonadSTM m => PadEntry -> m VRef 1424 1424 readPadEntry EntryConstant{ pe_proto = v } = return v 1425 readPadEntry x = liftSTM(readTVar (pe_store x))1425 readPadEntry x = stm (readTVar (pe_store x)) 1426 1426 1427 1427 {-# SPECIALISE writePadEntry :: PadEntry -> VRef -> Eval () #-} … … 1429 1429 writePadEntry :: MonadSTM m => PadEntry -> VRef -> m () 1430 1430 writePadEntry x@EntryConstant{} _ = die "Cannot rebind constant" x 1431 writePadEntry x v = liftSTM(writeTVar (pe_store x) v)1431 writePadEntry x v = stm (writeTVar (pe_store x) v) 1432 1432 1433 1433 refreshPad :: Pad -> Eval Pad … … 1435 1435 fmap listToPad $ forM (padToList pad) $ \(name, entry) -> do 1436 1436 entry' <- case entry of 1437 EntryLexical{ pe_proto = proto, pe_fresh = fresh } -> do1438 isFresh <- liftSTM $readTVar fresh1439 if isFresh then liftSTM (writeTVar fresh False)>> return entry else do1437 EntryLexical{ pe_proto = proto, pe_fresh = fresh } -> stm $ do 1438 isFresh <- readTVar fresh 1439 if isFresh then writeTVar fresh False >> return entry else do 1440 1440 ref <- cloneRef proto 1441 tvar' <- liftSTM (newTVar ref)1441 tvar' <- newTVar ref 1442 1442 return entry{ pe_store = tvar' } 1443 1443 _ -> return entry … … 1471 1471 1472 1472 findSymRef :: Var -> Pad -> Eval VRef 1473 findSymRef name pad = liftSTM$ join (findSym name pad)1473 findSymRef name pad = stm $ join (findSym name pad) 1474 1474 1475 1475 {-# SPECIALISE findSym :: Var -> Pad -> Eval (STM VRef) #-} … … 1538 1538 askGlobal = do 1539 1539 glob <- asks envGlobal 1540 liftSTM$ readTVar glob1540 stm $ readTVar glob 1541 1541 1542 1542 writeVar :: Var -> Val -> Eval () … … 1546 1546 Just EntryConstant{} -> fail $ "Cannot rebind constant: " ++ show name 1547 1547 Just c -> do 1548 ref <- liftSTM$ readTVar (pe_store c)1548 ref <- stm $ readTVar (pe_store c) 1549 1549 writeRef ref val 1550 1550 _ -> fail $ "Cannot bind to non-existing variable: " ++ show name … … 1555 1555 glob <- askGlobal 1556 1556 case findSym var glob of 1557 Just action -> liftSTMaction >>= readRef1557 Just action -> stm action >>= readRef 1558 1558 _ -> case v_sigil var of 1559 1559 SCode -> readVar var{ v_sigil = SCodeMulti } … … 1562 1562 lex <- asks envLexical 1563 1563 case findSym var lex of 1564 Just action -> liftSTMaction >>= readRef1564 Just action -> stm action >>= readRef 1565 1565 -- XXX - fallback to global should be eliminated here 1566 1566 _ -> case findSym var{ v_sigil = SCodeMulti } lex of 1567 Just action -> liftSTMaction >>= readRef1567 Just action -> stm action >>= readRef 1568 1568 _ -> readVar (toGlobalVar var) 1569 1569 … … 1654 1654 writeRef r _ = die "Cannot writeRef" r 1655 1655 1656 cloneRef :: VRef -> EvalVRef1656 cloneRef :: VRef -> STM VRef 1657 1657 cloneRef (MkRef x) = fmap MkRef (cloneIVar x) 1658 1658 … … 1669 1669 newObject :: (MonadSTM m, MonadIO m) => Type -> m VRef 1670 1670 newObject typ = case showType typ of 1671 "Any" -> liftSTM$ fmap scalarRef $ newTVar undef1672 "Item" -> liftSTM$ fmap scalarRef $ newTVar undef1673 "Scalar" -> liftSTM$ fmap scalarRef $ newTVar undef1674 "Array" -> liftSTM$ do1671 "Any" -> stm $ fmap scalarRef $ newTVar undef 1672 "Item" -> stm $ fmap scalarRef $ newTVar undef 1673 "Scalar" -> stm $ fmap scalarRef $ newTVar undef 1674 "Array" -> stm $ do 1675 1675 iv <- newTVar [::] 1676 1676 return $ arrayRef (MkIArray iv) 1677 1677 "Hash" -> do 1678 h <- liftIO(H.new (==) H.hashString)1678 h <- io (H.new (==) H.hashString) 1679 1679 return $ hashRef (h :: IHash) 1680 1680 "Sub" -> newObject $ mkType "Code" … … 1686 1686 , subBody = Prim . const $ fail "Cannot use Undef as a Code object" 1687 1687 } 1688 "Type" -> liftSTM$ fmap scalarRef $ newTVar undef1688 "Type" -> stm $ fmap scalarRef $ newTVar undef 1689 1689 "Pair" -> do 1690 1690 key <- newObject (mkType "Scalar") 1691 1691 val <- newObject (mkType "Scalar") 1692 1692 return $ MkRef (IPair (VRef key, VRef val)) 1693 "Regex" -> liftSTM$ fmap scalarRef $ newTVar undef -- XXX Wrong1694 "Capture" -> liftSTM$ fmap scalarRef $ newTVar undef -- XXX Wrong1693 "Regex" -> stm $ fmap scalarRef $ newTVar undef -- XXX Wrong 1694 "Capture" -> stm $ fmap scalarRef $ newTVar undef -- XXX Wrong 1695 1695 _ -> fail ("Class prototype occured where its instance object expected: " ++ showType typ) 1696 1696 … … 1838 1838 readIVar _ = fail "readIVar" 1839 1839 1840 cloneIVar :: IVar v -> Eval(IVar v)1840 cloneIVar :: IVar v -> STM (IVar v) 1841 1841 cloneIVar (IScalar x) = fmap IScalar $ scalar_clone x 1842 1842 cloneIVar (IArray x) = fmap IArray $ array_clone x … … 1907 1907 1908 1908 newScalar :: (MonadSTM m) => VScalar -> m (IVar VScalar) 1909 newScalar = liftSTM. (fmap IScalar) . newTVar1909 newScalar = stm . (fmap IScalar) . newTVar 1910 1910 1911 1911 newArray :: (MonadSTM m) => VArray -> m (IVar VArray) 1912 newArray vals = liftSTM$ do1913 tvs <- mapM new TVar vals1912 newArray vals = stm $ do 1913 tvs <- mapM newScalar vals 1914 1914 iv <- newTVar (toP tvs) 1915 1915 return $ IArray (MkIArray iv) … … 1917 1917 newHash :: (MonadSTM m) => VHash -> m (IVar VHash) 1918 1918 newHash hash = do 1919 -- liftSTM$ unsafeIOToSTM $ putStrLn "new hash"1920 ihash <- liftSTM. unsafeIOToSTM $ H.fromList H.hashString (map (\(a,b) -> (a, lazyScalar b)) (Map.toList hash))1919 --stm $ unsafeIOToSTM $ putStrLn "new hash" 1920 ihash <- stm . unsafeIOToSTM $ H.fromList H.hashString (map (\(a,b) -> (a, lazyScalar b)) (Map.toList hash)) 1921 1921 return $ IHash ihash 1922 1922 … … 1967 1967 -} 1968 1968 1969 newtype IArray = MkIArray (TVar [: TVar VScalar:])1969 newtype IArray = MkIArray (TVar [:IVar VScalar:]) 1970 1970 deriving (Typeable) 1971 1971 … … 2013 2013 {-# NOINLINE _FakeEnv #-} 2014 2014 _FakeEnv :: Env 2015 _FakeEnv = unsafePerformIO $ liftSTM$ do2015 _FakeEnv = unsafePerformIO $ stm $ do 2016 2016 ref <- newTVar Map.empty 2017 2017 glob <- newTVar $ MkPad Map.empty … … 2040 2040 2041 2041 fakeEval :: MonadIO m => Eval Val -> m Val 2042 fakeEval = liftIO. runEvalIO _FakeEnv2042 fakeEval = io . runEvalIO _FakeEnv 2043 2043 2044 2044 instance YAML Val.Val … … 2103 2103 val <- fakeEval $ readRef ref 2104 2104 svC <- asYAML val 2105 liftIO$ print "====>"2106 liftIO$ print svC2105 io $ print "====>" 2106 io $ print svC 2107 2107 fail ("Not implemented: asYAML \"" ++ showType (refType ref) ++ "\"") 2108 2108 fromYAML MkNode{n_tag=Just s, n_elem=ESeq [node]} … … 2124 2124 instance YAML IHash where 2125 2125 asYAML x = do 2126 l <- liftIO$ H.toList x2126 l <- io $ H.toList x 2127 2127 asYAMLmap "IHash" (map (\(k, v) -> (k, asYAML v)) l) 2128 2128 fromYAML node = do -
src/Pugs/AST/Utils.hs
r15572 r15616 76 76 newObjectId = do 77 77 tv <- asks envMaxId 78 liftSTM$ do78 stm $ do 79 79 rv <- readTVar tv 80 80 writeTVar tv (MkObjectId (succ (unObjectId rv))) -
src/Pugs/CodeGen/Binary.hs
r10059 r15616 13 13 genBinary = do 14 14 penv <- compile () :: Eval PIL_Environment 15 liftIO$ do15 io $ do 16 16 tmp <- getTemporaryDirectory 17 17 (file, fh) <- openBinaryTempFile tmp "pugs.bin" -
src/Pugs/CodeGen/PIL2.hs
r15297 r15616 37 37 genPIL2YAML = do 38 38 penv <- compile () :: Eval PIL_Environment 39 yaml <- liftIO(showYaml penv)39 yaml <- io (showYaml penv) 40 40 return . VStr . unlines $ [yaml] -
src/Pugs/CodeGen/PIR.hs
r15503 r15616 316 316 lastPMC = do 317 317 tvar <- asks tReg 318 liftIO $ liftSTM$ do318 io $ stm $ do 319 319 (cur, name) <- readTVar tvar 320 320 return $ case cur of … … 325 325 genPMC name = do 326 326 tvar <- asks tReg 327 name' <- liftIO $ liftSTM$ do327 name' <- io $ stm $ do 328 328 (cur, _) <- readTVar tvar 329 329 writeTVar tvar (cur + 1, name) … … 350 350 genLabel names = do 351 351 tvar <- asks tLabel 352 cnt <- liftIO $ liftSTM$ do352 cnt <- io $ stm $ do 353 353 cur <- readTVar tvar 354 354 writeTVar tvar (cur + 1) … … 372 372 genPIR_YAML :: Eval Val 373 373 genPIR_YAML = genPIRWith $ \globPIR mainPIR _ -> do 374 yaml <- liftIO(showYaml (mainPIR, globPIR))374 yaml <- io (showYaml (mainPIR, globPIR)) 375 375 return (VStr yaml) 376 376 … … 378 378 genPIR :: Eval Val 379 379 genPIR = genPIRWith $ \globPIR mainPIR penv -> do 380 libs <- liftIO$ getLibs380 libs <- io $ getLibs 381 381 return . VStr . unlines $ 382 382 [ "#!/usr/bin/env parrot" … … 452 452 453 453 runCodeGen :: (Translate a b) => TEnv -> a -> Eval (b, [Stmt]) 454 runCodeGen tenv = liftIO. (`runReaderT` tenv) . runWriterT . trans454 runCodeGen tenv = io . (`runReaderT` tenv) . runWriterT . trans -
src/Pugs/CodeGen/YAML.hs
r15297 r15616 17 17 pad <- filterPrim =<< asks envGlobal 18 18 main <- asks envBody 19 yaml <- liftIO$ f $ mkCompUnit "<unused>" pad main19 yaml <- io $ f $ mkCompUnit "<unused>" pad main 20 20 return $ VStr yaml 21 21 … … 23 23 genYAML = do 24 24 penv <- compile () :: Eval PIL_Environment 25 yaml <- liftIO(showYaml penv)25 yaml <- io (showYaml penv) 26 26 return $ VStr yaml -
src/Pugs/Compile.hs
r15582 r15616 444 444 initTEnv :: Eval TEnv 445 445 initTEnv = do 446 initReg <- liftSTM$ newTVar (0, "")447 initLbl <- liftSTM$ newTVar 0446 initReg <- stm $ newTVar (0, "") 447 initLbl <- stm $ newTVar 0 448 448 return $ MkTEnv 449 449 { tLexDepth = 0 -
src/Pugs/Compile/Haskell.hs
r12328 r15616 24 24 genGHC = do 25 25 exp <- asks envBody 26 liftIO(TH.runQ [d|26 io (TH.runQ [d| 27 27 mainCC :: IO Val 28 28 mainCC = runComp $(compile exp) |]) >>= \str -> return . VStr . unlines $ -
src/Pugs/Compile/PIL2.hs
r13863 r15616 68 68 fmap concat $ mapM (\x -> canCompile (name, [x])) xs 69 69 canCompile (name@('&':_), [(_, sym)]) = do 70 ref <- liftSTM$ readTVar sym70 ref <- stm $ readTVar sym 71 71 case ref of 72 72 MkRef (ICode cv) … … 76 76 _ -> return [] 77 77 canCompile ("@*END", [(_, sym)]) = do 78 ref <- liftSTM$ readTVar sym78 ref <- stm $ readTVar sym 79 79 cvList <- fromVals =<< readRef ref :: Comp [VCode] 80 80 decls <- eachM cvList $ \(i, cv) -> do … … 85 85 -- translate them into store_global calls? 86 86 -- placing them each into one separate init function? 87 val <- readRef =<< liftSTM(readTVar sym)87 val <- readRef =&l
