root/src/Pugs/Meta/Perl5.hs

Revision 21673, 2.5 kB (checked in by audreyt, 5 months ago)

* Import Pugs 6.2.13.11 from Hackage into our source tree.
* Highlights:

  • Much faster startup time
  • Slightly faster compilation time (mostly due to refactored Pugs.AST.Internals)
  • Portable-to-Win32 readline thanks to Haskeline
  • Property svn:mime-type set to text/plain; charset=UTF-8
  • Property svn:eol-style set to native
Line 
1{-# OPTIONS_GHC -fglasgow-exts #-}
2
3module Pugs.Meta.Perl5 (Perl5Responder) where
4import Pugs.Val
5import Pugs.Class
6import Pugs.Embed.Perl5
7import Pugs.Internals
8import Data.Typeable (Typeable)
9import qualified Data.Map as Map
10import qualified StringTable.AtomMap as AtomMap
11import Pugs.AST.Internals (envContext, anyToVal, anyFromVal)
12import Pugs.Types
13
14data Perl5Responder = Perl5Responder deriving Typeable
15
16instance ResponderInterface Eval Perl5Responder where
17    dispatch _          = dispatchPerl5
18    fromMethodList _    = return Perl5Responder
19
20instance Boxable PerlSV where
21    mkVal sv = MkInvocant sv (MkResponder (return Perl5Responder))
22    coerceVal (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        | Just x' <- fromTypeable x = anyFromVal x'
29        | otherwise                 = fail $ "Cannot coerce to SV: " ++ show (typeOf x)
30
31__ITEM__, __LIST__ :: MethodName
32__ITEM__    = _cast "ITEM"
33__LIST__    = _cast "LIST"
34
35dispatchPerl5 :: Val -> Call -> Eval Val
36dispatchPerl5 inv call
37    | meth == nullID    = return inv -- XXX - real HOW support --
38    | meth == __ITEM__  = return inv -- XXX - real rvalue suport --
39    | meth == __LIST__  = return inv -- XXX - real lvalue suport --
40    | otherwise = do
41        invSV   <- coerceVal inv
42        subSV   <- liftIO . bufToSV . cast $ meth
43        posSVs  <- mapM coerceVal (fromP $ f_positionals feed)
44        namSVs  <- fmap concat . forM (AtomMap.toList (f_nameds feed)) $ \(key, vals) -> do
45            keySV   <- liftIO (bufToSV $ cast key)
46            fmap concat . forM (fromP vals) $ \v -> do
47                valSV   <- coerceVal v
48                return [keySV, valSV]
49        env     <- ask
50        rv      <- liftIO $ do
51            envSV   <- mkEnv env
52            invokePerl5 subSV invSV (posSVs ++ namSVs) envSV (enumCxt $ envContext env)
53        case rv of
54            Perl5ReturnValues [x]   -> return $ mkVal x
55            Perl5ReturnValues xs    -> return $ mkVal xs
56            Perl5ErrorString str    -> fail str
57            Perl5ErrorObject err    -> throwError (anyToVal err)
58    where
59    meth = mi_name call
60    feed = concatFeeds (c_feeds (mi_arguments call))
Note: See TracBrowser for help on using the browser.