Changeset 3925 for src/Pugs/Run/Perl5.hs

Show
Ignore:
Timestamp:
05/27/05 00:14:36 (4 years ago)
Author:
autrijus
svk:copy_cache_prev:
5515
Message:

* Pugs's eval/apply exported to C space.

Files:
1 modified

Legend:

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

    r3924 r3925  
    77import Pugs.Internals 
    88import Pugs.AST 
     9import Pugs.Prim.Eval 
    910import Pugs.Embed.Perl5 
    1011import Foreign 
    1112import Foreign.C.Types 
    1213import Foreign.C.String 
     14import Foreign.Marshal.Array 
     15 
     16foreign export ccall "pugs_Eval" 
     17    pugs_eval :: CString -> IO PugsVal 
     18 
     19foreign export ccall "pugs_Apply" 
     20    pugs_apply :: PugsVal -> PugsVal -> Ptr PugsVal -> IO PugsVal 
    1321 
    1422foreign export ccall "pugs_ValToSv" 
     
    2735    pvToVal :: CString -> IO PugsVal 
    2836 
     37askPerl5Env :: IO Env 
     38askPerl5Env = do 
     39    sv  <- withCString "pugs::env" perl5_get_sv  
     40    val <- svToVal sv 
     41    case val of 
     42        VControl (ControlEnv env)   -> return env 
     43        _                           -> fail "cannot fetch $pugs::env" 
     44 
     45pugs_eval :: CString -> IO PugsVal 
     46pugs_eval cstr = do 
     47    str <- peekCString cstr 
     48    env <- askPerl5Env 
     49    val <- runEvalIO env $ opEval Nothing "<eval>" str 
     50    mkVal val 
     51 
     52pugs_apply :: PugsVal -> PugsVal -> Ptr PugsVal -> IO PugsVal 
     53pugs_apply subPtr invPtr argsPtr = do 
     54    env     <- askPerl5Env 
     55    sub     <- deVal subPtr 
     56    inv     <- deValMaybe invPtr 
     57    args    <- mapM deVal =<< peekArray0 nullPtr argsPtr 
     58    let subExp = case sub of 
     59            VStr name   -> Var name 
     60            _           -> Val sub 
     61    val <- runEvalIO env $ evalExp (App subExp (fmap Val inv) (map Val args)) 
     62    mkVal val 
     63 
    2964mkVal :: Val -> IO PugsVal 
    3065mkVal val = fmap castStablePtrToPtr $ newStablePtr val 
     
    3267deVal :: PugsVal -> IO Val 
    3368deVal ptr = deRefStablePtr (castPtrToStablePtr ptr) 
     69 
     70deValMaybe :: PugsVal -> IO (Maybe Val) 
     71deValMaybe ptr | ptr == nullPtr = return Nothing 
     72deValMaybe ptr = fmap Just (deVal ptr) 
    3473 
    3574valToSv :: PugsVal -> IO PerlSV