Changeset 8999
- Timestamp:
- 02/14/06 21:23:12 (3 years ago)
- Location:
- src
- Files:
-
- 3 modified
-
Data/Yaml/Syck.hsc (modified) (4 diffs)
-
Pugs/Prim.hs (modified) (3 diffs)
-
Pugs/Prim/Yaml.hs (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Data/Yaml/Syck.hsc
r8992 r8999 5 5 module Data.Yaml.Syck ( 6 6 parseYaml, emitYaml, 7 YamlNode(..), YamlElem(..), tagNode, nilNode, mkNode, mkTagNode, 7 YamlNode(..), YamlElem(..), tagNode, nilNode, mkNode, mkTagNode, SYMID, 8 8 ) where 9 9 … … 20 20 import Foreign.Marshal.Utils 21 21 import Foreign.Storable 22 import Data.Generics 22 23 23 24 type YamlTag = Maybe String 24 25 type YamlAnchor = Maybe String 25 26 type SYMID = CULong 27 28 cuLongType = mkIntType "Foreign.C.Types.CULong" 29 30 instance Data SYMID where 31 toConstr x = mkIntConstr cuLongType (fromIntegral x) 32 gunfold k z c = case constrRep c of 33 (IntConstr x) -> z (fromIntegral x) 34 _ -> error "gunfold" 35 dataTypeOf _ = cuLongType 26 36 27 37 data YamlNode = MkYamlNode … … 32 42 , shortcut :: (Maybe YamlNode) 33 43 } 34 deriving (Show, Ord, Eq )44 deriving (Show, Ord, Eq, Typeable, Data) 35 45 36 46 data YamlElem … … 39 49 | YamlStr String 40 50 | YamlNil 41 deriving (Show, Ord, Eq )51 deriving (Show, Ord, Eq, Typeable, Data) 42 52 43 53 type SyckNode = Ptr () -
src/Pugs/Prim.hs
r8993 r8999 48 48 import Pugs.Prim.Code 49 49 import Pugs.Prim.Param 50 import qualified Data.Set as Set 51 import Foreign.StablePtr 52 import Foreign.Ptr 50 import qualified Data.IntSet as IntSet 53 51 54 52 -- |Implementation of 0-ary and variadic primitive operators and functions … … 226 224 op1 "perl" = \v -> do 227 225 recur <- liftSTM (newTVar False) 228 let ?seen = Set.empty226 let ?seen = IntSet.empty 229 227 ?recur = recur 230 228 rv <- prettyVal v … … 1413 1411 1414 1412 -- op1 "perl" 1415 prettyVal :: (?seen :: Set (Ptr ()), ?recur :: TVar Bool) => Val -> Eval VStr1413 prettyVal :: (?seen :: IntSet.IntSet, ?recur :: TVar Bool) => Val -> Eval VStr 1416 1414 prettyVal v@(VRef r) = do 1417 ptr <- liftIO ( fmap castStablePtrToPtr (newStablePtr r))1418 if Set.member ptr ?seen1415 ptr <- liftIO (addressOf r) 1416 if IntSet.member ptr ?seen 1419 1417 then do 1420 1418 liftSTM $ writeTVar ?recur True 1421 1419 return "\\$_" 1422 else let ?seen = Set.insert ptr ?seen in doPrettyVal v1420 else let ?seen = IntSet.insert ptr ?seen in doPrettyVal v 1423 1421 prettyVal v = doPrettyVal v 1424 1422 1425 doPrettyVal :: (?seen :: Set (Ptr ()), ?recur :: TVar Bool) => Val -> Eval VStr1423 doPrettyVal :: (?seen :: IntSet.IntSet, ?recur :: TVar Bool) => Val -> Eval VStr 1426 1424 doPrettyVal v@(VRef r) = do 1427 1425 v' <- readRef r -
src/Pugs/Prim/Yaml.hs
r8994 r8999 3 3 4 4 module Pugs.Prim.Yaml ( 5 evalYaml, dumpYaml 5 evalYaml, dumpYaml, addressOf, 6 6 ) where 7 7 import Pugs.Internals … … 11 11 import Data.Yaml.Syck 12 12 import qualified Data.Map as Map 13 import qualified Data.IntSet as IntSet 13 14 import qualified Data.IntMap as IntMap 14 15 import Foreign.StablePtr 15 16 import Foreign.Ptr 17 import Data.Generics 16 18 17 19 evalYaml :: Val -> Eval Val … … 65 67 dumpYaml :: Int -> Val -> Eval Val 66 68 dumpYaml limit v = do 67 obj <- toYaml IntMap.empty v 68 rv <- liftIO (emitYaml obj) 69 done <- liftSTM $ newTVar IntMap.empty 70 let ?seen = IntSet.empty 71 ?done = done 72 obj <- toYaml v 73 nodeMap <- liftSTM . readTVar $ done 74 let replaceNode node@MkYamlNode{ nid = n } 75 | n == 0 = node 76 | otherwise = (IntMap.!) nodeMap (fromEnum n) 77 rv <- liftIO . emitYaml $ everywhere (mkT replaceNode) obj 69 78 either (fail . ("YAML Emit Error: "++)) 70 79 (return . VStr . decodeUTF8) rv … … 78 87 return (castStablePtrToPtr ptr `minusPtr` (nullPtr :: Ptr ())) 79 88 80 toYaml :: IntMap YamlNode -> Val -> Eval YamlNode81 toYaml _VUndef = return $ mkNode YamlNil82 toYaml _(VBool x) = return $ boolToYaml x83 toYaml _(VStr str) = return $ strNode (encodeUTF8 str)84 toYaml seenv@(VRef r) = do89 toYaml :: (?seen :: IntSet.IntSet, ?done :: TVar (IntMap.IntMap YamlNode)) => Val -> Eval YamlNode 90 toYaml VUndef = return $ mkNode YamlNil 91 toYaml (VBool x) = return $ boolToYaml x 92 toYaml (VStr str) = return $ strNode (encodeUTF8 str) 93 toYaml v@(VRef r) = do 85 94 ptr <- liftIO $ addressOf r 86 case IntMap.lookup ptr seen of87 Just node -> return node88 Nothing ->do89 rv <- ifValTypeIsa v "Hash" (hashToYaml seen r) $ do90 v' <- readRef r91 nodes <- toYaml seen v' -- XXX -- (IntMap.insert ptr rv seen) v'92 ifValTypeIsa v "Array" (return nodes) . return $ case v' of93 VObject _ -> nodes94 _ -> mkNode $ YamlMap [(strNode "<ref>", nodes)]95 return rv96 toYaml seen(VList nodes) = do97 n <- mapM (toYaml seen)nodes95 if IntSet.member ptr ?seen then return nilNode{ nid = toEnum ptr } else do 96 let ?seen = IntSet.insert ptr ?seen 97 node <- ifValTypeIsa v "Hash" (hashToYaml r) $ do 98 v' <- readRef r 99 nodes <- toYaml v' 100 ifValTypeIsa v "Array" (return nodes) . return $ case v' of 101 VObject _ -> nodes 102 _ -> mkNode $ YamlMap [(strNode "<ref>", nodes)] 103 liftSTM $ modifyTVar ?done (IntMap.insert ptr node) 104 return node 105 toYaml (VList nodes) = do 106 n <- mapM toYaml nodes 98 107 return $ mkNode (YamlSeq n) 99 108 -- fmap YamlSeq$ mapM toYaml nodes 100 toYaml seenv@(VObject obj) = do109 toYaml v@(VObject obj) = do 101 110 -- ... dump the objAttrs 102 111 -- XXX this needs fixing WRT demagicalized pairs: … … 104 113 -- parens, which is, of course, wrong. 105 114 hash <- fromVal v :: Eval VHash 106 attrs <- toYaml seen$ VRef (hashRef hash)115 attrs <- toYaml $ VRef (hashRef hash) 107 116 return $ tagNode (Just $ "tag:pugs:object:" ++ showType (objType obj)) attrs 108 toYaml seen(VRule MkRulePGE{rxRule=rule, rxGlobal=global, rxStringify=stringify, rxAdverbs=adverbs}) =do109 adverbs' <- toYaml seenadverbs117 toYaml (VRule MkRulePGE{rxRule=rule, rxGlobal=global, rxStringify=stringify, rxAdverbs=adverbs}) =do 118 adverbs' <- toYaml adverbs 110 119 return . mkTagNode "tag:pugs:Rule" $ YamlMap 111 120 [ (strNode "rule", strNode rule) … … 114 123 , (strNode "adverbs", adverbs') 115 124 ] 116 toYaml _v = return $ strNode $ (encodeUTF8 . pretty) v125 toYaml v = return $ strNode $ (encodeUTF8 . pretty) v 117 126 118 hashToYaml :: IntMap YamlNode -> VRef -> Eval YamlNode119 hashToYaml seen(MkRef (IHash hv)) = do127 hashToYaml :: (?seen :: IntSet.IntSet, ?done :: TVar (IntMap.IntMap YamlNode)) => VRef -> Eval YamlNode 128 hashToYaml (MkRef (IHash hv)) = do 120 129 h <- hash_fetch hv 121 130 let assocs = Map.toList h 122 131 yamlmap <- forM assocs $ \(ka, va) -> do 123 ka' <- toYaml seen$ VStr ka124 va' <- toYaml seenva132 ka' <- toYaml $ VStr ka 133 va' <- toYaml va 125 134 return (ka', va') 126 135 return $ mkNode (YamlMap yamlmap) 127 hashToYaml _r = error ("unexpected node: " ++ show r)136 hashToYaml r = error ("unexpected node: " ++ show r) 128 137 129 138 boolToYaml :: VBool -> YamlNode
