Changeset 15441 for src/Pugs/Meta
- Timestamp:
- 03/04/07 14:42:37 (21 months ago)
- Files:
-
- 1 modified
-
src/Pugs/Meta/Perl5.hs (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/Meta/Perl5.hs
r15416 r15441 5 5 import Pugs.Class 6 6 import Pugs.Embed.Perl5 7 import Data.Typeable 7 import Pugs.Internals 8 import Data.Typeable (Typeable) 9 import qualified Data.Map as Map 10 import {-# SOURCE #-} Pugs.AST.Internals (envContext, anyToVal) 11 import Pugs.Types 8 12 9 13 data Perl5Responder = Perl5Responder deriving Typeable … … 16 20 instance Boxable Eval PerlSV where 17 21 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 18 30 19 31 dispatchPerl5 :: Val -> Call -> Eval Val 20 32 dispatchPerl5 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)
