Changeset 3918
- Timestamp:
- 05/26/05 17:22:54 (4 years ago)
- svk:copy_cache_prev:
- 5482
- Location:
- src
- Files:
-
- 6 modified
-
Pugs/AST/Internals.hs (modified) (9 diffs)
-
Pugs/Embed/Perl5.hs (modified) (6 diffs)
-
perl5/perl5.c (modified) (4 diffs)
-
perl5/perl5.h (modified) (1 diff)
-
perl5/pugsembed.c (modified) (1 diff)
-
perl5/pugsembed.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/AST/Internals.hs
r3911 r3918 188 188 fromVal $ VList vs 189 189 fromVal' (PerlSV sv) = do 190 rv <- liftIO $ svToAny sv 191 case rv of 192 Just v -> fromVal v -- it was a Val 193 _ -> fromSV sv -- it was a SV 190 v <- liftIO $ svToVal sv 191 case v of 192 -- (PerlSV sv') -> fromSV sv' -- it was a SV 193 Nothing -> fromSV sv 194 Just val -> fromVal val -- it was a Val 194 195 fromVal' v = return $ vCast v 195 196 {-do … … 320 321 instance Value VBool where 321 322 castV = VBool 322 fromVal (PerlSV sv) = liftIO $ svToVBool sv 323 fromVal v = fromVal' v 323 fromSV sv = liftIO $ svToVBool sv 324 324 doCast (VJunc j) = juncToBool j 325 325 doCast (VMatch m) = matchOk m … … 352 352 instance Value VInt where 353 353 castV = VInt 354 fromSV sv = liftIO $ svToVInt sv 354 355 doCast (VInt i) = i 355 356 doCast x = truncate (vCast x :: VRat) … … 357 358 instance Value VRat where 358 359 castV = VRat 360 fromSV sv = liftIO $ svToVNum sv 359 361 doCast (VInt i) = i % 1 360 362 doCast (VRat r) = r … … 373 375 instance Value VNum where 374 376 castV = VNum 377 fromSV sv = liftIO $ svToVNum sv 375 378 doCast VUndef = 0 376 379 doCast (VBool b) = if b then 1 else 0 … … 399 402 instance Value VStr where 400 403 castV = VStr 404 fromSV sv = liftIO $ svToVStr sv 401 405 fromVal (VList l) = return . unwords =<< mapM fromVal l 402 fromVal (PerlSV sv) = liftIO $ svToVStr sv406 fromVal v@(PerlSV _) = fromVal' v 403 407 fromVal v = do 404 408 vt <- evalValType v … … 441 445 fromVal (VStr str) = liftIO $ vstrToSV str 442 446 fromVal (VInt int) = liftIO $ vintToSV int 443 fromVal v = liftIO $ anyToSV v447 fromVal v = liftIO $ valToSV v 444 448 445 449 showNum :: Show a => a -> String … … 489 493 doCast x = castFail x 490 494 491 instance Value Int where 495 instance Value Int where 496 fromSV sv = liftIO $ svToVInt sv 492 497 doCast = intCast 493 498 castV = VInt . fromIntegral … … 499 504 500 505 instance Value VScalar where 506 fromSV sv = return $ PerlSV sv 501 507 fromVal (VRef r) = fromVal =<< readRef r 502 508 fromVal v = return v -
src/Pugs/Embed/Perl5.hs
r3911 r3918 23 23 svToVStr = constFail 24 24 25 svToVInt :: (Num a) => PerlSV -> IO a 26 svToVInt = constFail 27 28 svToVNum :: (Fractional a) => PerlSV -> IO a 29 svToVNum = constFail 30 25 31 svToVBool :: PerlSV -> IO Bool 26 32 svToVBool = constFail 27 33 28 svTo Any:: PerlSV -> IO (Maybe a)29 svTo Any= constFail34 svToVal :: PerlSV -> IO (Maybe a) 35 svToVal = constFail 30 36 31 anyToSV :: a -> IO PerlSV32 anyToSV = constFail37 valToSV :: a -> IO PerlSV 38 valToSV = constFail 33 39 34 40 vstrToSV :: String -> IO PerlSV … … 47 53 48 54 {-# INCLUDE <perl5.h> #-} 55 {-# INCLUDE <pugsembed.h> #-} 49 56 50 57 module Pugs.Embed.Perl5 where … … 55 62 type PerlInterpreter = Ptr () 56 63 type PerlSV = Ptr () 64 type PugsVal = Ptr () 57 65 58 66 foreign import ccall "perl.h perl_alloc" … … 70 78 foreign import ccall "perl5.h perl5_SvPV" 71 79 perl5_SvPV :: PerlSV -> IO CString 80 foreign import ccall "perl5.h perl5_SvIV" 81 perl5_SvIV :: PerlSV -> IO CInt 82 foreign import ccall "perl5.h perl5_SvNV" 83 perl5_SvNV :: PerlSV -> IO CDouble 72 84 foreign import ccall "perl5.h perl5_SvTRUE" 73 85 perl5_SvTRUE :: PerlSV -> IO Bool 74 foreign import ccall "perl5.h perl5_SvPtr"75 perl5_SvPtr :: PerlSV -> IO (Ptr ())76 86 foreign import ccall "perl5.h perl5_newSVpv" 77 87 perl5_newSVpv :: CString -> IO PerlSV 78 88 foreign import ccall "perl5.h perl5_newSViv" 79 89 perl5_newSViv :: CInt -> IO PerlSV 80 foreign import ccall "perl5.h perl5_newSVptr"81 perl5_newSVptr :: Ptr () -> IO PerlSV82 90 foreign import ccall "perl5.h perl5_call" 83 91 perl5_call :: CString -> CInt -> Ptr PerlSV -> CInt -> IO PerlSV … … 88 96 foreign import ccall "perl5.h perl5_init" 89 97 perl5_init :: CInt -> Ptr CString -> IO PerlInterpreter 98 99 foreign import ccall "pugsembed.h pugs_SvToVal" 100 pugs_SvToVal :: PerlSV -> IO PugsVal 101 foreign import ccall "pugsembed.h pugs_MkValRef" 102 pugs_MkValRef :: PugsVal -> IO PerlSV 90 103 91 104 initPerl5 :: String -> IO PerlInterpreter … … 98 111 svToVStr sv = peekCString =<< perl5_SvPV sv 99 112 113 svToVInt :: (Num a) => PerlSV -> IO a 114 svToVInt sv = fmap fromIntegral $ perl5_SvIV sv 115 116 svToVNum :: (Fractional a) => PerlSV -> IO a 117 svToVNum sv = fmap realToFrac $ perl5_SvNV sv 118 100 119 svToVBool :: PerlSV -> IO Bool 101 120 svToVBool = perl5_SvTRUE 102 121 103 anyToSV :: a -> IO PerlSV 104 anyToSV x = do 105 ptr <- fmap castStablePtrToPtr $ newStablePtr x 106 perl5_newSVptr ptr 107 108 svToAny :: PerlSV -> IO (Maybe a) 109 svToAny sv = do 110 ptr <- perl5_SvPtr sv 122 svToVal :: PerlSV -> IO (Maybe a) 123 svToVal sv = do 124 ptr <- pugs_SvToVal sv 111 125 if ptr == nullPtr 112 126 then return Nothing 113 else fmap Just . deRefStablePtr $ castPtrToStablePtr ptr 127 else fmap Just $ deRefStablePtr (castPtrToStablePtr ptr) 128 129 valToSV :: a -> IO PerlSV 130 valToSV x = do 131 ptr <- fmap castStablePtrToPtr $ newStablePtr x 132 pugs_MkValRef ptr 114 133 115 134 vstrToSV :: String -> IO PerlSV -
src/perl5/perl5.c
r3911 r3918 2 2 #include <XSUB.h> 3 3 #include "perlxsi.c" 4 #include "pugsembed.c" 4 5 5 6 /* Workaround for mapstart: the only op which needs a different ppaddr */ … … 126 127 } 127 128 129 int 130 perl5_SvIV ( SV *sv ) 131 { 132 return((int)SvIV(sv)); 133 } 134 135 double 136 perl5_SvNV ( SV *sv ) 137 { 138 return((double)SvNV(sv)); 139 } 140 128 141 bool 129 142 perl5_SvTRUE ( SV * sv ) … … 134 147 } 135 148 136 void *137 perl5_SvPtr ( SV *sv )138 {139 if (!sv_isa(sv, "pugs")) {140 return NULL;141 }142 IV tmp = SvIV((SV*)SvRV(sv));143 return((void *)tmp);144 }145 146 149 SV * 147 150 perl5_newSVpv ( char * pv ) … … 154 157 { 155 158 return(newSViv(iv)); 156 }157 158 SV *159 perl5_newSVptr ( void * ptr )160 {161 SV *sv = newSV(0);162 sv_setref_pv(sv, "pugs", ptr);163 return(sv);164 159 } 165 160 -
src/perl5/perl5.h
r3901 r3918 5 5 PerlInterpreter * perl5_init ( int argc, char **argv ); 6 6 char * perl5_SvPV ( SV * sv ); 7 int perl5_SvIV ( SV * sv ); 8 double perl5_SvNV ( SV * sv ); 7 9 bool perl5_SvTRUE ( SV * sv ); 8 void * perl5_SvPtr ( SV * sv );9 10 SV * perl5_newSVpv ( char * pv ); 10 11 SV * perl5_newSViv ( int iv ); 11 SV * perl5_newSVptr ( void * ptr );12 12 SV * perl5_call(char *subname, int argc, SV** args, int cxt); 13 13 bool perl5_can(SV *inv, char *subname); -
src/perl5/pugsembed.c
r3917 r3918 18 18 return (sv); 19 19 } 20 21 Val *pugs_Eval ( char *code ) { return NULL; } 22 23 Val *pugs_Apply ( Val *sub, Val *inv, Val **args ) { return NULL; } 24 25 Val *pugs_IvToVal ( IV iv ) { return NULL; } 26 27 Val *pugs_NvToVal ( NV iv ) { return NULL; } 28 29 Val *pugs_PvToVal ( char *pv ) { return NULL; } 30 31 Val *pugs_MkSvRef ( SV *sv ) { return NULL; } 32 33 SV *pugs_ValToSv ( Val *val ) { return NULL; } -
src/perl5/pugsembed.h
r3917 r3918 1 1 #include "perl5.h" 2 #include <HsFFI.h> 2 3 3 typedef void Val; 4 #ifndef PugsValDefined 5 #define PugsValDefined 1 6 /* #define PUGS_EXTERN extern */ 7 #define PUGS_EXTERN 8 typedef HsStablePtr Val; 9 #endif 4 10 5 externVal *pugs_Eval ( char *code );6 externVal *pugs_Apply ( Val *sub, Val *inv, Val **args );11 PUGS_EXTERN Val *pugs_Eval ( char *code ); 12 PUGS_EXTERN Val *pugs_Apply ( Val *sub, Val *inv, Val **args ); 7 13 8 externVal *pugs_IvToVal ( IV iv );9 externVal *pugs_NvToVal ( NV iv );10 externVal *pugs_PvToVal ( char *pv );14 PUGS_EXTERN Val *pugs_IvToVal ( IV iv ); 15 PUGS_EXTERN Val *pugs_NvToVal ( NV iv ); 16 PUGS_EXTERN Val *pugs_PvToVal ( char *pv ); 11 17 12 externVal *pugs_MkSvRef ( SV *sv );13 externSV *pugs_ValToSv ( Val *val );18 PUGS_EXTERN Val *pugs_MkSvRef ( SV *sv ); 19 PUGS_EXTERN SV *pugs_ValToSv ( Val *val ); 14 20 15 21 Val *pugs_SvToVal ( SV *sv );
