Changeset 14214

Show
Ignore:
Timestamp:
10/11/06 05:36:36 (2 years ago)
Author:
audreyt
Message:

* Rationalize Perl5 embedding's GC interface by passing

StablePtr? instead of Ptr around, as well as _not_ placing
GC burden on VError{} and VUndef, as they should be all
referring to a static &PL_sv_undef now.

Location:
src
Files:
11 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/AST/Internals.hs

    r14209 r14214  
    7676    newObjectId, runInvokePerl5, 
    7777     
    78     errStr, errStrPos, errValPos, enterAtomicEnv, valToBool, envPos', -- for circularity 
     78    showVal, errStr, errStrPos, errValPos, enterAtomicEnv, valToBool, envPos', -- for circularity 
    7979    expToEvalVal, -- Hack, should be removed once it's figured out how 
    8080 
     
    406406    env     <- ask 
    407407    rv      <- liftIO $ do 
    408         envSV   <- mkVal (VControl $ ControlEnv env) 
     408        envSV   <- mkEnv env 
    409409        invokePerl5 sub inv args envSV (enumCxt $ envContext env) 
    410410    case rv of 
     
    417417    svToVal ptr = liftIO $ do 
    418418        pv  <- pugs_SvToVal ptr 
    419         deRefStablePtr (castPtrToStablePtr pv) 
     419        deRefStablePtr pv 
    420420#else 
    421421    svToVal _ = fail "Perl 5 not embedded" 
     
    576576    VSocket{}   -> mkValRef val "Socket" 
    577577    VList{}     -> mkValRef val "Array" 
     578    VUndef      -> svUndef 
     579    VError{}    -> svUndef 
    578580    _           -> mkValRef val "" 
    579581 
     
    714716        } 
    715717    deriving (Show, Eq, Ord, Typeable) {-!derive: YAML_Pos!-} 
     718 
     719showVal :: Val -> String 
     720showVal = show 
    716721 
    717722errStr :: VStr -> Val 
  • src/Pugs/AST/Internals.hs-boot

    r14113 r14214  
    2323type VHash = Map VStr Val 
    2424 
     25showVal :: Val -> String 
    2526envPos' :: Env -> Pos 
    2627errStr :: VStr -> Val 
  • src/Pugs/Embed.hs

    r7843 r14214  
    3232    return () -} 
    3333evalEmbedded "Perl5" = \code -> do 
    34     interp <- initPerl5 "" (Nothing :: Maybe ()) 
    35     evalPerl5 code nullSV 0 
     34    interp <- initPerl5 "" Nothing 
     35    evalPerl5 code nullEnv 0 
    3636    freePerl5 interp 
    3737evalEmbedded s = const . fail $ "Cannot evaluate in " ++ s 
  • src/Pugs/Embed/Perl5.hs

    r13864 r14214  
    44module Pugs.Embed.Perl5  
    55    ( InvokePerl5Result(..) 
    6     , svToVBool, svToVInt, svToVNum, svToVStr, vstrToSV, vintToSV, svToVal, bufToSV 
    7     , vnumToSV, mkValRef , mkVal, PerlSV, nullSV, evalPerl5, invokePerl5 
     6    , svToVBool, svToVInt, svToVNum, svToVStr, vstrToSV, vintToSV, svToVal, bufToSV, svUndef 
     7    , vnumToSV, mkValRef , mkVal, mkEnv, PerlSV, nullSV, nullEnv, evalPerl5, invokePerl5 
    88    , initPerl5, freePerl5, canPerl5 
    99    , evalPCR, pugs_SvToVal 
     
    9393    deriving (Show, Eq, Ord, Typeable) 
    9494type PugsVal = PerlSV 
     95type PugsEnv = PerlSV 
    9596 
    9697data InvokePerl5Result 
     
    108109freePerl5 _ = return () 
    109110 
    110 evalPerl5 :: String -> PerlSV -> CInt -> IO PerlSV 
     111evalPerl5 :: String -> PugsEnv -> CInt -> IO PerlSV 
    111112evalPerl5 _ _ = constFail 
    112113 
     
    129130mkVal = constFail 
    130131 
     132mkEnv :: (Show a) => a -> IO PugsVal 
     133mkEnv = constFail 
     134 
    131135mkValRef :: a -> String -> IO PerlSV 
    132136mkValRef _ = constFail 
     
    135139vstrToSV = constFail 
    136140 
     141svUndef :: IO PerlSV 
     142svUndef = error "perl5 not embedded" 
     143 
    137144bufToSV :: ByteString -> IO PerlSV 
    138145bufToSV = constFail 
     
    144151vnumToSV = constFail 
    145152 
    146 invokePerl5 :: PerlSV -> PerlSV -> [PerlSV] -> PugsVal -> CInt -> IO InvokePerl5Result 
     153invokePerl5 :: PerlSV -> PerlSV -> [PerlSV] -> PugsEnv -> CInt -> IO InvokePerl5Result 
    147154invokePerl5 _ _ _ _ = constFail 
    148155 
     
    155162nullSV :: PerlSV 
    156163nullSV = error "perl5 not embedded" 
     164 
     165nullEnv :: PugsVal 
     166nullEnv = error "perl5 not embedded" 
    157167 
    158168-- Below are unused 
     
    176186import Foreign.C.Types 
    177187import Foreign.C.String 
     188import {-# SOURCE #-} Pugs.AST.Internals 
    178189import qualified UTF8 as Str 
    179190 
    180191type PerlInterpreter = Ptr () 
    181192type PerlSV = Ptr () 
    182 type PugsVal = Ptr () 
     193type PugsVal = StablePtr Val 
     194type PugsEnv = StablePtr Env 
    183195 
    184196foreign import ccall "EXTERN.h perl_alloc" 
     
    214226foreign import ccall "../../perl5/p5embed.h perl5_newSVnv" 
    215227    perl5_newSVnv :: CDouble -> IO PerlSV 
     228foreign import ccall "../../perl5/p5embed.h perl5_sv_undef" 
     229    perl5_sv_undef :: IO PerlSV 
    216230foreign import ccall "../../perl5/p5embed.h perl5_get_sv" 
    217231    perl5_get_sv :: CString -> IO PerlSV 
    218232foreign import ccall "../../perl5/p5embed.h perl5_apply" 
    219     perl5_apply :: PerlSV -> PerlSV -> Ptr PerlSV -> PugsVal -> CInt -> IO (Ptr PugsVal) 
     233    perl5_apply :: PerlSV -> PerlSV -> Ptr PerlSV -> PugsEnv -> CInt -> IO (Ptr PerlSV) 
    220234foreign import ccall "../../perl5/p5embed.h perl5_can" 
    221235    perl5_can :: PerlSV -> CString -> IO Bool 
    222236foreign import ccall "../../perl5/p5embed.h perl5_eval" 
    223     perl5_eval :: CString -> PugsVal -> CInt -> IO PerlSV 
     237    perl5_eval :: CString -> PugsEnv -> CInt -> IO PerlSV 
    224238foreign import ccall "../../perl5/p5embed.h perl5_init" 
    225239    perl5_init :: CInt -> Ptr CString -> IO PerlInterpreter 
    226240 
    227241foreign import ccall "../../perl5/pugsembed.h pugs_getenv" 
    228     pugs_getenv :: IO PugsVal 
     242    pugs_getenv :: IO PugsEnv 
    229243foreign import ccall "../../perl5/pugsembed.h pugs_setenv" 
    230     pugs_setenv :: PugsVal -> IO () 
     244    pugs_setenv :: PugsEnv -> IO () 
    231245 
    232246foreign import ccall "../../perl5/pugsembed.h pugs_SvToVal" 
     
    235249    pugs_MkValRef :: PugsVal -> CString -> IO PerlSV 
    236250 
    237 initPerl5 :: (Show a) => String -> Maybe a -> IO PerlInterpreter 
     251initPerl5 :: String -> Maybe Env -> IO PerlInterpreter 
    238252initPerl5 str env = do 
    239253    withCString "-e" $ \prog -> withCString str $ \cstr -> do 
     
    241255            interp <- perl5_init 3 argv 
    242256            case env of 
    243                 Just val -> pugs_setenv =<< mkVal val 
    244                 Nothing -> return () 
     257                Just val    -> pugs_setenv =<< mkEnv val 
     258                Nothing     -> return () 
    245259            modifyIORef _GlobalFinalizer (>> perl_free interp) 
    246260            return interp 
    247261 
    248 mkVal :: (Show a) => a -> IO PugsVal 
    249 mkVal val = fmap castStablePtrToPtr $ newStablePtr val 
     262mkVal :: Val -> IO PugsVal 
     263mkVal x = do 
     264    -- warn "Creating nonblessed stable pointer for " (showVal x) 
     265    newStablePtr x 
     266 
     267mkEnv :: Env -> IO PugsEnv 
     268mkEnv = newStablePtr 
    250269 
    251270svToVStr :: PerlSV -> IO String 
     
    261280svToVBool = perl5_SvTRUE 
    262281 
    263 svToVal :: (Show a) => PerlSV -> IO a 
     282svToVal :: PerlSV -> IO Val 
    264283svToVal sv = do 
    265284    ptr <- pugs_SvToVal sv 
    266     deRefStablePtr (castPtrToStablePtr ptr) 
    267  
    268 mkValRef :: a -> String -> IO PerlSV 
     285    deRefStablePtr ptr 
     286 
     287mkValRef :: Val -> String -> IO PerlSV 
    269288mkValRef x typ = do 
    270     ptr <- fmap castStablePtrToPtr $ newStablePtr x 
    271     withCString typ (pugs_MkValRef ptr) 
     289    -- warn "Creating stable pointer for " (showVal x) 
     290    val <- mkVal x 
     291    withCString typ (pugs_MkValRef val) 
     292 
     293svUndef :: IO PerlSV 
     294svUndef = perl5_sv_undef 
    272295 
    273296vstrToSV :: String -> IO PerlSV 
     
    289312    | Perl5ErrorObject PerlSV 
    290313 
    291 invokePerl5 :: PerlSV -> PerlSV -> [PerlSV] -> PugsVal -> CInt -> IO InvokePerl5Result 
     314invokePerl5 :: PerlSV -> PerlSV -> [PerlSV] -> PugsEnv -> CInt -> IO InvokePerl5Result 
    292315invokePerl5 sub inv args env cxt = do 
    293316    withArray0 nullPtr args $ \argv -> do 
     
    308331 
    309332mkSV :: IO PerlSV -> IO PerlSV 
    310 mkSV = id 
    311 {-  
    312 action = do 
     333mkSV action = action 
     334{- 
     335 - do 
    313336    sv <- action  
    314337    addFinalizer sv (perl5_finalize sv) 
     
    316339-} 
    317340 
    318 evalPerl5 :: String -> PugsVal -> CInt -> IO PerlSV 
     341evalPerl5 :: String -> PugsEnv -> CInt -> IO PerlSV 
    319342evalPerl5 str env cxt = mkSV $ Str.useAsCString (cast str) $ \cstr -> perl5_eval cstr env cxt 
    320343 
     
    327350nullSV = nullPtr 
    328351 
     352{-# NOINLINE nullEnv #-} 
     353nullEnv :: PugsEnv 
     354nullEnv = unsafePerformIO (newStablePtr (error "undefined environment")) 
     355 
    329356evalPCR :: FilePath -> String -> String -> [(String, String)] -> IO String 
    330357evalPCR path match rule subrules = do 
    331     envSV   <- mkVal () 
    332358    let bridgeMod   = "Pugs::Runtime::Match::HsBridge" 
    333359        bridgeFile  = "Pugs/Runtime/Match/HsBridge.pm"; 
     
    338364        , "}" 
    339365        , "'"++bridgeMod++"'" 
    340         ]) envSV 1 
     366        ]) nullEnv 1 
    341367    meth    <- vstrToSV "__RUN__" 
    342368    args    <- mapM vstrToSV $ concatMap (\(x, y) -> [x, y]) ((match, rule):subrules) 
    343     rv      <- invokePerl5 meth inv args envSV 1 
     369    rv      <- invokePerl5 meth inv args nullEnv 1 
    344370    case rv of 
    345371        Perl5ReturnValues []    -> return "" 
  • src/Pugs/Parser/Charnames.hs

    r13811 r14214  
    1616nameToCode :: String -> Maybe Int 
    1717nameToCode name = inlinePerformIO $ do 
    18     envSV   <- mkVal () 
    19     sv      <- evalPerl5 ("use utf8; use charnames ':full'; ord(qq[\\N{"++name++"}])") envSV 1 
     18    sv      <- evalPerl5 ("use utf8; use charnames ':full'; ord(qq[\\N{"++name++"}])") nullEnv 1 
    2019    svToVInt sv >>= \iv -> case iv of 
    2120        0 -> svToVStr sv >>= \pv -> case pv of 
  • src/Pugs/Prim.hs

    r14211 r14214  
    248248    let requireLine = "require " ++ pkg ++ "; '" ++ pkg ++ "'" 
    249249    val     <- guardIO $ do 
    250         envSV   <- mkVal (VControl $ ControlEnv env) 
     250        envSV   <- mkEnv env 
    251251        sv      <- evalPerl5 requireLine envSV $ enumCxt cxtItemAny 
    252252        return (PerlSV sv) 
     
    285285    env <- ask 
    286286    tryIO undef $ do 
    287         envSV <- mkVal (VControl $ ControlEnv env) 
     287        envSV <- mkEnv env 
    288288        sv <- evalPerl5 str envSV $ enumCxt (envContext env) 
    289289        svToVal sv 
  • src/Pugs/Run.hs

    r14152 r14214  
    170170            } 
    171171    -} 
    172     initPerl5 "" (Just . VControl $ ControlEnv env'{ envDebug = Nothing }) 
     172    initPerl5 "" (Just env') 
    173173    initPreludePC env'             -- null in first pass 
    174174    where 
  • src/Pugs/Run/Perl5.hs

    r13710 r14214  
    4949 
    5050askPerl5Env :: IO Env 
    51 askPerl5Env = do 
    52     val <- deVal =<< pugs_getenv 
    53     case val of 
    54         VControl (ControlEnv env)   -> return env 
    55         _                           -> do 
    56             print val 
    57             fail "cannot fetch $pugs::env" 
     51askPerl5Env = deEnv =<< pugs_getenv 
    5852 
    5953pugs_eval :: CString -> IO PugsVal 
     
    7468    sub     <- deVal subPtr 
    7569    inv     <- deValMaybe invPtr 
    76     args    <- mapM deVal =<< peekArray0 nullPtr argsPtr 
     70    args    <- mapM deVal =<< peekArray0 nullVal argsPtr 
    7771    let subExp = case sub of 
    7872            VStr name@('&':_)   -> _Var name 
     
    8579 
    8680deVal :: PugsVal -> IO Val 
    87 deVal ptr = deRefStablePtr (castPtrToStablePtr ptr) 
     81deVal ptr = deRefStablePtr ptr 
     82 
     83deEnv :: PugsEnv -> IO Env 
     84deEnv ptr = deRefStablePtr ptr 
     85 
     86nullVal :: PugsVal 
     87nullVal = unsafeCoerce# nullPtr 
    8888 
    8989deValMaybe :: PugsVal -> IO (Maybe Val) 
    90 deValMaybe ptr | ptr == nullPtr = return Nothing 
     90deValMaybe ptr | nullVal == nullVal = return Nothing 
    9191deValMaybe ptr = fmap Just (deVal ptr) 
    9292 
  • src/Pugs/Types/Array.hs

    r12800 r14214  
    280280perl5EvalApply code args = do 
    281281    env     <- ask 
    282     envSV   <- liftIO $ mkVal env 
     282    envSV   <- liftIO $ mkEnv env 
    283283    subSV   <- liftIO $ evalPerl5 code envSV (enumCxt cxtItemAny) 
    284284    runInvokePerl5 subSV nullSV args 
  • src/perl5/p5embed.c

    r13900 r14214  
    403403 
    404404SV * 
     405perl5_sv_undef () 
     406{ 
     407    return(&PL_sv_undef); 
     408} 
     409 
     410SV * 
    405411perl5_newSVpvn ( char * pv, int len ) 
    406412{ 
  • src/perl5/p5embed.h

    r13367 r14214  
    2121SV * perl5_get_sv ( const char *name ); 
    2222void perl5_finalize ( SV* sv ); 
    23  
     23SV * perl5_sv_undef ();