Changeset 14572 for src/Pugs/Prim.hs

Show
Ignore:
Timestamp:
11/01/06 18:18:15 (2 years ago)
Author:
audreyt
Message:

* Pugs.Prim: Implement passing lexical scalar variables into Perl 5,

such that t/perl5/eval_lex.t now passes:

sub add_in_perl5 ($x, $y) {

use v5;
$x + $y;

}
add_in_perl5(42, 42); # 84

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/Prim.hs

    r14547 r14572  
    3636import Pugs.Eval.Var 
    3737import qualified Data.Map as Map 
     38import qualified Data.Set as Set 
    3839import Data.IORef 
    3940import System.IO.Error (isEOFError) 
     
    283284    opEvalFile filename 
    284285op1 "Pugs::Internals::eval_perl5" = \v -> do 
    285     str <- fromVal v 
    286     env <- ask 
    287     tryIO undef $ do 
    288         envSV <- mkEnv env 
    289         sv <- evalPerl5 str envSV $ enumCxt (envContext env) 
    290         svToVal sv 
     286    str     <- fromVal v 
     287    env     <- ask 
     288    lex     <- asks envLexical 
     289    let vars = [ v | v@MkVar{ v_sigil = SScalar, v_twigil = TNil } <- Set.toList (padKeys lex), v /= varTopic ] 
     290        code = "sub { my (" ++ (concat $ intersperse ", " (map (`showsVar` "") vars)) ++ ") = @_;\n" ++ str ++ "\n}" 
     291    vals    <- mapM readVar vars 
     292    rv  <- tryIO (Perl5ErrorString "") $ do 
     293        envSV   <- mkEnv env 
     294        sub     <- evalPerl5 code envSV 0 
     295        args    <- mapM newSVval vals 
     296        invokePerl5 sub nullSV args envSV (enumCxt $ envContext env) 
     297    case rv of 
     298        Perl5ReturnValues [x]   -> liftIO $ svToVal x 
     299        Perl5ReturnValues xs    -> liftIO $ fmap VList (mapM svToVal xs) 
     300        Perl5ErrorString str    -> fail str 
     301        Perl5ErrorObject err    -> throwError (PerlSV err) 
    291302op1 "Pugs::Internals::eval_p6y" = op1EvalP6Y 
    292303op1 "Pugs::Internals::eval_haskell" = op1EvalHaskell