Changeset 15441 for src/Pugs/Meta

Show
Ignore:
Timestamp:
03/04/07 14:42:37 (21 months ago)
Author:
audreyt
Message:

* Pugs.Meta.Perl5: The Grand Perl 5 Bridge Box

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Meta/Perl5.hs

    r15416 r15441  
    55import Pugs.Class 
    66import Pugs.Embed.Perl5 
    7 import Data.Typeable 
     7import Pugs.Internals 
     8import Data.Typeable (Typeable) 
     9import qualified Data.Map as Map 
     10import {-# SOURCE #-} Pugs.AST.Internals (envContext, anyToVal) 
     11import Pugs.Types 
    812 
    913data Perl5Responder = Perl5Responder deriving Typeable 
     
    1620instance Boxable Eval PerlSV where 
    1721    mkObj sv = MkInvocant sv (MkResponder (return Perl5Responder)) 
     22    fromObj (MkInvocant x _) 
     23        | Just x' <- fromTypeable x = return x' 
     24        | Just x' <- fromTypeable x = liftIO $ vstrToSV x' 
     25        | Just x' <- fromTypeable x = liftIO . bufToSV  $ (cast :: PureStr -> ByteString) x' 
     26        | Just x' <- fromTypeable x = liftIO . vintToSV $ (cast :: PureInt -> Integer)    x' 
     27        | Just x' <- fromTypeable x = liftIO . vnumToSV $ (cast :: PureNum -> Double)     x' 
     28        | otherwise                 = fail $ "Cannot coerce to SV: " ++ show (typeOf x) 
     29 
    1830 
    1931dispatchPerl5 :: Val -> Call -> Eval Val 
    2032dispatchPerl5 inv call = do 
    21     fail $ "Dispatch failed - " ++ show (miName call) 
     33    let feed = concatFeeds (c_feeds (miArguments call)) 
     34    invSV   <- fromObj inv 
     35    subSV   <- liftIO . bufToSV . cast $ miName call 
     36    posSVs  <- mapM fromObj (fromP $ f_positionals feed) 
     37    namSVs  <- fmap concat . forM (Map.toList (f_nameds feed)) $ \(key, vals) -> do 
     38        keySV   <- liftIO (bufToSV $ cast key) 
     39        fmap concat . forM (fromP vals) $ \v -> do 
     40            valSV   <- fromObj v 
     41            return [keySV, valSV] 
     42    env     <- ask 
     43    rv      <- liftIO $ do 
     44        envSV   <- mkEnv env 
     45        invokePerl5 subSV invSV (posSVs ++ namSVs) envSV (enumCxt $ envContext env) 
     46    case rv of 
     47        Perl5ReturnValues [x]   -> return $ mkVal x  
     48        Perl5ReturnValues xs    -> return $ mkVal xs 
     49        Perl5ErrorString str    -> fail str 
     50        Perl5ErrorObject err    -> throwError (anyToVal err)