Changeset 3943
- Timestamp:
- 05/27/05 03:15:20 (4 years ago)
- svk:copy_cache_prev:
- 5515
- Location:
- src
- Files:
-
- 6 modified
-
Pugs/Embed/Perl5.hs (modified) (4 diffs)
-
Pugs/Run/Perl5.hs (modified) (2 diffs)
-
perl5/perl5.c (modified) (5 diffs)
-
perl5/perl5.h (modified) (1 diff)
-
perl5/pugsembed.c (modified) (2 diffs)
-
perl5/pugsembed.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/Embed/Perl5.hs
r3942 r3943 101 101 perl5_set_svref :: CString -> PugsVal -> IO () 102 102 foreign import ccall "perl5.h perl5_apply" 103 perl5_apply :: PerlSV -> PerlSV -> Ptr PerlSV -> P erlSV-> CInt -> IO PerlSV103 perl5_apply :: PerlSV -> PerlSV -> Ptr PerlSV -> PugsVal -> CInt -> IO PerlSV 104 104 foreign import ccall "perl5.h perl5_can" 105 105 perl5_can :: PerlSV -> CString -> IO Bool 106 106 foreign import ccall "perl.h perl5_eval" 107 perl5_eval :: CString -> P erlSV-> CInt -> IO PerlSV107 perl5_eval :: CString -> PugsVal -> CInt -> IO PerlSV 108 108 foreign import ccall "perl5.h perl5_init" 109 109 perl5_init :: CInt -> Ptr CString -> IO PerlInterpreter 110 111 foreign import ccall "pugsembed.h pugs_getenv" 112 pugs_getenv :: IO PugsVal 113 foreign import ccall "pugsembed.h pugs_setenv" 114 pugs_setenv :: PugsVal -> IO () 110 115 111 116 foreign import ccall "pugsembed.h pugs_SvToVal" … … 120 125 interp <- perl5_init 3 argv 121 126 case env of 122 Just val -> withCString "pugs::env" $ \name ->do127 Just val -> do 123 128 ptr <- fmap castStablePtrToPtr $ newStablePtr val 124 p erl5_set_svref nameptr129 pugs_setenv ptr 125 130 Nothing -> return () 126 131 return interp … … 157 162 vnumToSV int = perl5_newSVnv (realToFrac int) 158 163 159 callPerl5 :: PerlSV -> PerlSV -> [PerlSV] -> P erlSV-> CInt -> IO PerlSV164 callPerl5 :: PerlSV -> PerlSV -> [PerlSV] -> PugsVal -> CInt -> IO PerlSV 160 165 callPerl5 sub inv args env cxt = do 161 166 withArray0 nullPtr args $ \argv -> do … … 165 170 canPerl5 sv meth = withCString meth $ \cstr -> perl5_can sv cstr 166 171 167 evalPerl5 :: String -> P erlSV-> CInt -> IO PerlSV172 evalPerl5 :: String -> PugsVal -> CInt -> IO PerlSV 168 173 evalPerl5 str env cxt = withCString str $ \cstr -> perl5_eval cstr env cxt 169 174 -
src/Pugs/Run/Perl5.hs
r3934 r3943 46 46 askPerl5Env :: IO Env 47 47 askPerl5Env = do 48 sv <- withCString "pugs::env" perl5_get_sv 49 val <- svToVal sv 48 val <- deVal =<< pugs_getenv 50 49 case val of 51 50 VControl (ControlEnv env) -> return env 52 _ -> fail "cannot fetch $pugs::env" 51 _ -> do 52 print val 53 fail "cannot fetch $pugs::env" 53 54 54 55 pugs_eval :: CString -> IO PugsVal … … 61 62 pugs_apply :: PugsVal -> PugsVal -> Ptr PugsVal -> IO PugsVal 62 63 pugs_apply subPtr invPtr argsPtr = do 64 print "DEREF #0" 63 65 env <- askPerl5Env 64 --print "DEREF #1"66 print "DEREF #1" 65 67 sub <- deVal subPtr 66 --print "DEREF #2"68 print "DEREF #2" 67 69 inv <- deValMaybe invPtr 68 --print "DEREF #3"70 print "DEREF #3" 69 71 args <- mapM deVal =<< peekArray0 nullPtr argsPtr 70 72 let subExp = case sub of -
src/perl5/perl5.c
r3941 r3943 199 199 200 200 SV * 201 perl5_apply(SV *sub, SV *inv, SV** args, SV*env, int cxt)201 perl5_apply(SV *sub, SV *inv, SV** args, void *env, int cxt) 202 202 { 203 203 SV **arg; … … 210 210 SAVETMPS; 211 211 212 if (env != NULL) { 213 sv = get_sv("pugs::env", 1); 214 save_item(sv); 215 sv_setsv(sv, env); 216 } 212 pugs_setenv(env); 217 213 218 214 PUSHMARK(SP); … … 251 247 } 252 248 253 void *perl5_set_svref (const char *name, void *val)249 void perl5_set_svref (const char *name, void *val) 254 250 { 255 251 /* fprintf(stderr, "setsvref: name: %s, mkvalref: %p\n", name, val); */ … … 264 260 265 261 SV * 266 perl5_eval(char *code, SV*env, int cxt)262 perl5_eval(char *code, void *env, int cxt) 267 263 { 268 264 dSP; … … 272 268 SAVETMPS; 273 269 274 if (env != NULL) { 275 sv = get_sv("pugs::env", 1); 276 save_item(sv); 277 sv_setsv(sv, env); 278 } 270 pugs_setenv(env); 279 271 280 272 sv = newSVpv(code, 0); -
src/perl5/perl5.h
r3938 r3943 11 11 SV * perl5_newSViv ( int iv ); 12 12 SV * perl5_newSVnv ( double iv ); 13 SV * perl5_apply(SV *sub, SV *inv, SV** args, SV*env, int cxt);13 SV * perl5_apply(SV *sub, SV *inv, SV** args, void *env, int cxt); 14 14 bool perl5_can(SV *inv, char *subname); 15 SV * perl5_eval(char *code, SV*env, int cxt);15 SV * perl5_eval(char *code, void *env, int cxt); 16 16 SV * perl5_get_sv ( const char *name ); 17 void *perl5_set_svref ( const char *name, void *sv );17 void perl5_set_svref ( const char *name, void *sv ); -
src/perl5/pugsembed.c
r3941 r3943 6 6 { 7 7 if (!sv_isa(sv, "pugs")) { 8 fprintf(stderr, "bad cast\n"); 9 sv_dump(sv); 8 10 return (pugs_MkSvRef(sv)); 9 11 } 12 fprintf(stderr, "good cast\n"); 10 13 IV tmp = SvIV((SV*)SvRV(sv)); 11 14 return ((Val *)tmp); … … 30 33 return (sv); 31 34 } 35 36 Val *pugs_getenv () 37 { 38 SV** rv = hv_fetch(PL_modglobal, "PugsEnv", 7, 0); 39 if (*rv == NULL) 40 Perl_croak(aTHX_ "hate software so much"); 41 IV tmp = SvIV((SV*)SvRV(*rv)); 42 return ((Val *)tmp); 43 } 44 45 void pugs_setenv ( Val *env ) 46 { 47 if (env == NULL) { return; } 48 49 SV *sv = newSV(0); 50 sv_setref_pv(sv, "pugs", env); 51 hv_store(PL_modglobal, "PugsEnv", 7, sv, 0); 52 } -
src/perl5/pugsembed.h
r3929 r3943 23 23 SV *pugs_MkValRef ( Val *val ); 24 24 25 Val *pugs_getenv (); 26 void pugs_setenv ( Val *env ); 27
