Changeset 14214
- Timestamp:
- 10/11/06 05:36:36 (2 years ago)
- Location:
- src
- Files:
-
- 11 modified
-
Pugs/AST/Internals.hs (modified) (5 diffs)
-
Pugs/AST/Internals.hs-boot (modified) (1 diff)
-
Pugs/Embed.hs (modified) (1 diff)
-
Pugs/Embed/Perl5.hs (modified) (17 diffs)
-
Pugs/Parser/Charnames.hs (modified) (1 diff)
-
Pugs/Prim.hs (modified) (2 diffs)
-
Pugs/Run.hs (modified) (1 diff)
-
Pugs/Run/Perl5.hs (modified) (3 diffs)
-
Pugs/Types/Array.hs (modified) (1 diff)
-
perl5/p5embed.c (modified) (1 diff)
-
perl5/p5embed.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/AST/Internals.hs
r14209 r14214 76 76 newObjectId, runInvokePerl5, 77 77 78 errStr, errStrPos, errValPos, enterAtomicEnv, valToBool, envPos', -- for circularity78 showVal, errStr, errStrPos, errValPos, enterAtomicEnv, valToBool, envPos', -- for circularity 79 79 expToEvalVal, -- Hack, should be removed once it's figured out how 80 80 … … 406 406 env <- ask 407 407 rv <- liftIO $ do 408 envSV <- mk Val (VControl $ ControlEnv env)408 envSV <- mkEnv env 409 409 invokePerl5 sub inv args envSV (enumCxt $ envContext env) 410 410 case rv of … … 417 417 svToVal ptr = liftIO $ do 418 418 pv <- pugs_SvToVal ptr 419 deRefStablePtr (castPtrToStablePtr pv)419 deRefStablePtr pv 420 420 #else 421 421 svToVal _ = fail "Perl 5 not embedded" … … 576 576 VSocket{} -> mkValRef val "Socket" 577 577 VList{} -> mkValRef val "Array" 578 VUndef -> svUndef 579 VError{} -> svUndef 578 580 _ -> mkValRef val "" 579 581 … … 714 716 } 715 717 deriving (Show, Eq, Ord, Typeable) {-!derive: YAML_Pos!-} 718 719 showVal :: Val -> String 720 showVal = show 716 721 717 722 errStr :: VStr -> Val -
src/Pugs/AST/Internals.hs-boot
r14113 r14214 23 23 type VHash = Map VStr Val 24 24 25 showVal :: Val -> String 25 26 envPos' :: Env -> Pos 26 27 errStr :: VStr -> Val -
src/Pugs/Embed.hs
r7843 r14214 32 32 return () -} 33 33 evalEmbedded "Perl5" = \code -> do 34 interp <- initPerl5 "" (Nothing :: Maybe ())35 evalPerl5 code null SV034 interp <- initPerl5 "" Nothing 35 evalPerl5 code nullEnv 0 36 36 freePerl5 interp 37 37 evalEmbedded s = const . fail $ "Cannot evaluate in " ++ s -
src/Pugs/Embed/Perl5.hs
r13864 r14214 4 4 module Pugs.Embed.Perl5 5 5 ( InvokePerl5Result(..) 6 , svToVBool, svToVInt, svToVNum, svToVStr, vstrToSV, vintToSV, svToVal, bufToSV 7 , vnumToSV, mkValRef , mkVal, PerlSV, nullSV, evalPerl5, invokePerl56 , svToVBool, svToVInt, svToVNum, svToVStr, vstrToSV, vintToSV, svToVal, bufToSV, svUndef 7 , vnumToSV, mkValRef , mkVal, mkEnv, PerlSV, nullSV, nullEnv, evalPerl5, invokePerl5 8 8 , initPerl5, freePerl5, canPerl5 9 9 , evalPCR, pugs_SvToVal … … 93 93 deriving (Show, Eq, Ord, Typeable) 94 94 type PugsVal = PerlSV 95 type PugsEnv = PerlSV 95 96 96 97 data InvokePerl5Result … … 108 109 freePerl5 _ = return () 109 110 110 evalPerl5 :: String -> P erlSV-> CInt -> IO PerlSV111 evalPerl5 :: String -> PugsEnv -> CInt -> IO PerlSV 111 112 evalPerl5 _ _ = constFail 112 113 … … 129 130 mkVal = constFail 130 131 132 mkEnv :: (Show a) => a -> IO PugsVal 133 mkEnv = constFail 134 131 135 mkValRef :: a -> String -> IO PerlSV 132 136 mkValRef _ = constFail … … 135 139 vstrToSV = constFail 136 140 141 svUndef :: IO PerlSV 142 svUndef = error "perl5 not embedded" 143 137 144 bufToSV :: ByteString -> IO PerlSV 138 145 bufToSV = constFail … … 144 151 vnumToSV = constFail 145 152 146 invokePerl5 :: PerlSV -> PerlSV -> [PerlSV] -> Pugs Val-> CInt -> IO InvokePerl5Result153 invokePerl5 :: PerlSV -> PerlSV -> [PerlSV] -> PugsEnv -> CInt -> IO InvokePerl5Result 147 154 invokePerl5 _ _ _ _ = constFail 148 155 … … 155 162 nullSV :: PerlSV 156 163 nullSV = error "perl5 not embedded" 164 165 nullEnv :: PugsVal 166 nullEnv = error "perl5 not embedded" 157 167 158 168 -- Below are unused … … 176 186 import Foreign.C.Types 177 187 import Foreign.C.String 188 import {-# SOURCE #-} Pugs.AST.Internals 178 189 import qualified UTF8 as Str 179 190 180 191 type PerlInterpreter = Ptr () 181 192 type PerlSV = Ptr () 182 type PugsVal = Ptr () 193 type PugsVal = StablePtr Val 194 type PugsEnv = StablePtr Env 183 195 184 196 foreign import ccall "EXTERN.h perl_alloc" … … 214 226 foreign import ccall "../../perl5/p5embed.h perl5_newSVnv" 215 227 perl5_newSVnv :: CDouble -> IO PerlSV 228 foreign import ccall "../../perl5/p5embed.h perl5_sv_undef" 229 perl5_sv_undef :: IO PerlSV 216 230 foreign import ccall "../../perl5/p5embed.h perl5_get_sv" 217 231 perl5_get_sv :: CString -> IO PerlSV 218 232 foreign import ccall "../../perl5/p5embed.h perl5_apply" 219 perl5_apply :: PerlSV -> PerlSV -> Ptr PerlSV -> Pugs Val -> CInt -> IO (Ptr PugsVal)233 perl5_apply :: PerlSV -> PerlSV -> Ptr PerlSV -> PugsEnv -> CInt -> IO (Ptr PerlSV) 220 234 foreign import ccall "../../perl5/p5embed.h perl5_can" 221 235 perl5_can :: PerlSV -> CString -> IO Bool 222 236 foreign import ccall "../../perl5/p5embed.h perl5_eval" 223 perl5_eval :: CString -> Pugs Val-> CInt -> IO PerlSV237 perl5_eval :: CString -> PugsEnv -> CInt -> IO PerlSV 224 238 foreign import ccall "../../perl5/p5embed.h perl5_init" 225 239 perl5_init :: CInt -> Ptr CString -> IO PerlInterpreter 226 240 227 241 foreign import ccall "../../perl5/pugsembed.h pugs_getenv" 228 pugs_getenv :: IO Pugs Val242 pugs_getenv :: IO PugsEnv 229 243 foreign import ccall "../../perl5/pugsembed.h pugs_setenv" 230 pugs_setenv :: Pugs Val-> IO ()244 pugs_setenv :: PugsEnv -> IO () 231 245 232 246 foreign import ccall "../../perl5/pugsembed.h pugs_SvToVal" … … 235 249 pugs_MkValRef :: PugsVal -> CString -> IO PerlSV 236 250 237 initPerl5 :: (Show a) => String -> Maybe a-> IO PerlInterpreter251 initPerl5 :: String -> Maybe Env -> IO PerlInterpreter 238 252 initPerl5 str env = do 239 253 withCString "-e" $ \prog -> withCString str $ \cstr -> do … … 241 255 interp <- perl5_init 3 argv 242 256 case env of 243 Just val -> pugs_setenv =<< mkValval244 Nothing -> return ()257 Just val -> pugs_setenv =<< mkEnv val 258 Nothing -> return () 245 259 modifyIORef _GlobalFinalizer (>> perl_free interp) 246 260 return interp 247 261 248 mkVal :: (Show a) => a -> IO PugsVal 249 mkVal val = fmap castStablePtrToPtr $ newStablePtr val 262 mkVal :: Val -> IO PugsVal 263 mkVal x = do 264 -- warn "Creating nonblessed stable pointer for " (showVal x) 265 newStablePtr x 266 267 mkEnv :: Env -> IO PugsEnv 268 mkEnv = newStablePtr 250 269 251 270 svToVStr :: PerlSV -> IO String … … 261 280 svToVBool = perl5_SvTRUE 262 281 263 svToVal :: (Show a) => PerlSV -> IO a282 svToVal :: PerlSV -> IO Val 264 283 svToVal sv = do 265 284 ptr <- pugs_SvToVal sv 266 deRefStablePtr (castPtrToStablePtr ptr)267 268 mkValRef :: a-> String -> IO PerlSV285 deRefStablePtr ptr 286 287 mkValRef :: Val -> String -> IO PerlSV 269 288 mkValRef 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 293 svUndef :: IO PerlSV 294 svUndef = perl5_sv_undef 272 295 273 296 vstrToSV :: String -> IO PerlSV … … 289 312 | Perl5ErrorObject PerlSV 290 313 291 invokePerl5 :: PerlSV -> PerlSV -> [PerlSV] -> Pugs Val-> CInt -> IO InvokePerl5Result314 invokePerl5 :: PerlSV -> PerlSV -> [PerlSV] -> PugsEnv -> CInt -> IO InvokePerl5Result 292 315 invokePerl5 sub inv args env cxt = do 293 316 withArray0 nullPtr args $ \argv -> do … … 308 331 309 332 mkSV :: IO PerlSV -> IO PerlSV 310 mkSV = id311 {- 312 action =do333 mkSV action = action 334 {- 335 - do 313 336 sv <- action 314 337 addFinalizer sv (perl5_finalize sv) … … 316 339 -} 317 340 318 evalPerl5 :: String -> Pugs Val-> CInt -> IO PerlSV341 evalPerl5 :: String -> PugsEnv -> CInt -> IO PerlSV 319 342 evalPerl5 str env cxt = mkSV $ Str.useAsCString (cast str) $ \cstr -> perl5_eval cstr env cxt 320 343 … … 327 350 nullSV = nullPtr 328 351 352 {-# NOINLINE nullEnv #-} 353 nullEnv :: PugsEnv 354 nullEnv = unsafePerformIO (newStablePtr (error "undefined environment")) 355 329 356 evalPCR :: FilePath -> String -> String -> [(String, String)] -> IO String 330 357 evalPCR path match rule subrules = do 331 envSV <- mkVal ()332 358 let bridgeMod = "Pugs::Runtime::Match::HsBridge" 333 359 bridgeFile = "Pugs/Runtime/Match/HsBridge.pm"; … … 338 364 , "}" 339 365 , "'"++bridgeMod++"'" 340 ]) envSV1366 ]) nullEnv 1 341 367 meth <- vstrToSV "__RUN__" 342 368 args <- mapM vstrToSV $ concatMap (\(x, y) -> [x, y]) ((match, rule):subrules) 343 rv <- invokePerl5 meth inv args envSV1369 rv <- invokePerl5 meth inv args nullEnv 1 344 370 case rv of 345 371 Perl5ReturnValues [] -> return "" -
src/Pugs/Parser/Charnames.hs
r13811 r14214 16 16 nameToCode :: String -> Maybe Int 17 17 nameToCode 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 20 19 svToVInt sv >>= \iv -> case iv of 21 20 0 -> svToVStr sv >>= \pv -> case pv of -
src/Pugs/Prim.hs
r14211 r14214 248 248 let requireLine = "require " ++ pkg ++ "; '" ++ pkg ++ "'" 249 249 val <- guardIO $ do 250 envSV <- mk Val (VControl $ ControlEnv env)250 envSV <- mkEnv env 251 251 sv <- evalPerl5 requireLine envSV $ enumCxt cxtItemAny 252 252 return (PerlSV sv) … … 285 285 env <- ask 286 286 tryIO undef $ do 287 envSV <- mk Val (VControl $ ControlEnv env)287 envSV <- mkEnv env 288 288 sv <- evalPerl5 str envSV $ enumCxt (envContext env) 289 289 svToVal sv -
src/Pugs/Run.hs
r14152 r14214 170 170 } 171 171 -} 172 initPerl5 "" (Just . VControl $ ControlEnv env'{ envDebug = Nothing })172 initPerl5 "" (Just env') 173 173 initPreludePC env' -- null in first pass 174 174 where -
src/Pugs/Run/Perl5.hs
r13710 r14214 49 49 50 50 askPerl5Env :: 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" 51 askPerl5Env = deEnv =<< pugs_getenv 58 52 59 53 pugs_eval :: CString -> IO PugsVal … … 74 68 sub <- deVal subPtr 75 69 inv <- deValMaybe invPtr 76 args <- mapM deVal =<< peekArray0 null PtrargsPtr70 args <- mapM deVal =<< peekArray0 nullVal argsPtr 77 71 let subExp = case sub of 78 72 VStr name@('&':_) -> _Var name … … 85 79 86 80 deVal :: PugsVal -> IO Val 87 deVal ptr = deRefStablePtr (castPtrToStablePtr ptr) 81 deVal ptr = deRefStablePtr ptr 82 83 deEnv :: PugsEnv -> IO Env 84 deEnv ptr = deRefStablePtr ptr 85 86 nullVal :: PugsVal 87 nullVal = unsafeCoerce# nullPtr 88 88 89 89 deValMaybe :: PugsVal -> IO (Maybe Val) 90 deValMaybe ptr | ptr == nullPtr= return Nothing90 deValMaybe ptr | nullVal == nullVal = return Nothing 91 91 deValMaybe ptr = fmap Just (deVal ptr) 92 92 -
src/Pugs/Types/Array.hs
r12800 r14214 280 280 perl5EvalApply code args = do 281 281 env <- ask 282 envSV <- liftIO $ mk Valenv282 envSV <- liftIO $ mkEnv env 283 283 subSV <- liftIO $ evalPerl5 code envSV (enumCxt cxtItemAny) 284 284 runInvokePerl5 subSV nullSV args -
src/perl5/p5embed.c
r13900 r14214 403 403 404 404 SV * 405 perl5_sv_undef () 406 { 407 return(&PL_sv_undef); 408 } 409 410 SV * 405 411 perl5_newSVpvn ( char * pv, int len ) 406 412 { -
src/perl5/p5embed.h
r13367 r14214 21 21 SV * perl5_get_sv ( const char *name ); 22 22 void perl5_finalize ( SV* sv ); 23 23 SV * perl5_sv_undef ();
