Changeset 8607

Show
Ignore:
Timestamp:
01/08/06 15:26:21 (3 years ago)
Author:
gaal
Message:

* eval :lang<yaml> deserializes pugs objects.

Location:
src
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • src/Data/Yaml/Syck.hsc

    r8606 r8607  
    193193    deRefStablePtr (castPtrToStablePtr ptr) 
    194194 
     195syckNodeTag :: SyckNode -> IO (Maybe String) 
     196syckNodeTag syckNode = do 
     197    tag <- #{peek SyckNode, type_id} syckNode 
     198    if (tag == nullPtr) then (return Nothing) else do 
     199        tag' <- peekCString tag 
     200        return $ Just tag' 
     201 
    195202syckNodeKind :: SyckNode -> IO SyckKind 
    196203syckNodeKind syckNode = fmap toEnum $ #{peek SyckNode, kind} syckNode 
     
    203210parseNode :: SyckKind -> SyckParser -> SyckNode -> CLong -> IO YamlNode 
    204211parseNode SyckMap parser syckNode len = do 
     212    tag   <- syckNodeTag syckNode 
    205213    pairs <- (`mapM` [0..len-1]) $ \idx -> do 
    206214        keyId   <- syck_map_read syckNode 0 idx 
     
    209217        val     <- readNode parser valId 
    210218        return (key, val) 
    211     return $ emptyYamlNode{ el = YamlMap pairs } 
     219    return $ emptyYamlNode{ el = YamlMap pairs, tag = tag} 
    212220 
    213221parseNode SyckSeq parser syckNode len = do 
     222    tag   <- syckNodeTag syckNode 
    214223    nodes <- (`mapM` [0..len-1]) $ \idx -> do 
    215224        symId   <- syck_seq_read syckNode idx 
    216225        readNode parser symId 
    217     return $ emptyYamlNode{ el = YamlSeq nodes } 
     226    return $ emptyYamlNode{ el = YamlSeq nodes, tag = tag } 
    218227 
    219228parseNode SyckStr _ syckNode len = do 
    220     cstr    <- syck_str_read syckNode 
    221     str     <- peekCStringLen (cstr, fromEnum len) 
    222     return $ emptyYamlNode{ el = YamlStr str } 
     229    tag   <- syckNodeTag syckNode 
     230    cstr  <- syck_str_read syckNode 
     231    str   <- peekCStringLen (cstr, fromEnum len) 
     232    return $ emptyYamlNode{ el = YamlStr str, tag = tag } 
    223233 
    224234foreign import ccall "wrapper"   
  • src/Pugs/Prim/Yaml.hs

    r8606 r8607  
    3030        IntMap.fromAscList ([0..] `zip` map lazyScalar vals) 
    3131    return $ VRef (arrayRef av) 
    32 fromYaml MkYamlNode{el=YamlMap nodes} = do 
    33     vals    <- forM nodes $ \(keyNode, valNode) -> do 
    34         key <- fromVal =<< fromYaml keyNode 
    35         val <- newScalar =<< fromYaml valNode 
    36         return (key, val) 
    37     hv      <- liftSTM $ (newTVar (Map.fromList vals) :: STM IHash) 
    38     -- XXX: if YamlMap (Just "!perl/":type) nodes then mkObject etc. 
    39     return $ VRef (hashRef hv) 
     32fromYaml MkYamlNode{el=YamlMap nodes,tag=tag} = do 
     33    case tag of 
     34        Nothing  -> do 
     35            vals    <- forM nodes $ \(keyNode, valNode) -> do 
     36                key <- fromVal =<< fromYaml keyNode 
     37                val <- newScalar =<< fromYaml valNode 
     38                return (key, val) 
     39            hv      <- liftSTM $ (newTVar (Map.fromList vals) :: STM IHash) 
     40            return $ VRef (hashRef hv) 
     41        Just ('p':'u':'g':'s':'/':'o':'b':'j':'e':'c':'t':':':typ) -> do 
     42            vals    <- forM nodes $ \(keyNode, valNode) -> do 
     43                key <- fromVal =<< fromYaml keyNode 
     44                val <- fromYaml valNode 
     45                return (key, val) 
     46            return . VObject =<< createObject (mkType typ) vals 
     47        Just x   -> error ("can't deserialize: " ++ x) 
    4048 
    4149dumpYaml :: Int -> Val -> Eval Val