Changeset 22338
- Timestamp:
- 09/24/08 18:49:40 (2 months ago)
- Files:
-
- 4 modified
-
Pugs.cabal.in (modified) (1 diff)
-
src/M0ld/AST.hs (modified) (1 diff)
-
src/Pugs/Embed/M0ld.hs (modified) (5 diffs)
-
v6/smop/src/smop_haskell_ffi.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
Pugs.cabal.in
r22321 r22338 180 180 181 181 if flag(SMOP) 182 extra-Libraries: smop 182 extra-libraries: smop 183 extra-lib-dirs: v6/smop/build 183 184 cpp-options: -DPUGS_HAVE_SMOP=1 184 185 -
src/M0ld/AST.hs
r22334 r22338 9 9 deriving (Show,Eq,Ord) 10 10 data Argument = Pos Register | Named Register Register 11 12 data Mold = Mold [Stmt]13 deriving Show -
src/Pugs/Embed/M0ld.hs
r22336 r22338 7 7 import Debug.Trace 8 8 import M0ld 9 import M0ld.AST 10 import M0ld.Parser 9 11 10 12 foreign import ccall "smop.h smop_init" … … 40 42 foreign import ccall "smop_mold.h SMOP__Mold_create" 41 43 c_SMOP__Mold_create :: Int -> Ptr SMOP__Object -> Int -> Ptr Int -> IO SMOP__Object 42 mold regs constants opcodes = do43 constants_ <- mapM smopify constants44 withArray0 nullPtr constants_ (\c_constants -> withArray opcodes (\c_opcodes -> c_SMOP__Mold_create regs c_constants (length opcodes) c_opcodes))45 44 46 45 47 46 foreign import ccall "smop_haskell_ffi.h &smop_release_with_global" 48 47 p_release :: FunPtr (Ptr a -> IO ()) 48 49 foreign import ccall "smop_haskell_ffi.h smop_get_cvar" 50 smop_get_cvar :: CString -> IO SMOP__Object 51 52 get_cvar str = do 53 obj <- withCString str smop_get_cvar 54 auto_release obj 49 55 50 56 auto_release :: SMOP__Object -> IO Object … … 56 62 get_SMOP__S1P__RootNamespace :: IO SMOP__Object 57 63 58 rootnamespace = get_SMOP__S1P__RootNamespace 64 rootnamespace = do 65 root <- get_SMOP__S1P__RootNamespace 66 auto_release root 59 67 60 68 class Smopify a where … … 71 79 smopify a = return (idconst_ptr a) 72 80 81 mold :: (Smopify a) => Int -> [a] -> [Int] -> IO Object 82 mold regs constants opcodes = do 83 constants_ <- mapM smopify constants 84 new_mold <- withArray0 nullPtr constants_ (\c_constants -> withArray opcodes (\c_opcodes -> c_SMOP__Mold_create regs c_constants (length opcodes) c_opcodes)) 85 auto_release new_mold 86 73 87 call inv ident pos named = do 74 88 inv_ <- smopify inv … … 83 97 none = [] 84 98 99 metachars :: [Char] -> [Char] 100 metachars str = case str of 101 [] -> "" 102 '\\':'n':rest -> '\n' : (metachars rest) 103 '\\':other:rest -> other : (metachars rest) 104 letter:rest -> letter : (metachars rest) 105 106 createConstant :: Value -> IO Object 107 createConstant constant = case constant of 108 Var var -> get_cvar var 109 IntegerConstant int -> error "integer constant" 110 StringConstant str -> return $ idconst $ metachars $ str 111 SubMold stmts -> createM0ld stmts 112 113 compileM0ld = createM0ld . parseM0ld 114 115 createM0ld ast = do 116 let labelsMap = mapLabels ast 117 regMap = mapRegisters ast 118 freeRegs = countRegister ast 119 bytecode = emit ast regMap labelsMap 120 constants <- mapM createConstant [c | Decl reg c <- filter (not . isReg) ast] 121 mold freeRegs constants bytecode 85 122 evalM0ld code = do 86 123 smop_init 87 124 root <- rootnamespace 88 125 89 c_smop_reference interpreter interpreter90 91 c_smop_reference interpreter root92 126 out_scalar <- call root "postcircumfix:{ }" ["$*OUT"] none 93 127 out <- call out_scalar "FETCH" none none 94 128 95 c_smop_reference interpreter root96 129 mold_frame_scalar <- call root "postcircumfix:{ }" ["::MoldFrame"] none 97 130 mold_frame <- call mold_frame_scalar "FETCH" none none 98 131 99 test_mold <- mold 8 [out,idconst "print",idconst "embedding from pugs\n"] [1,3,0,1,1,2,0,0]132 test_mold <- compileM0ld code 100 133 test_frame <- call mold_frame "new" [test_mold] none 101 134 -
v6/smop/src/smop_haskell_ffi.c
r22336 r22338 25 25 return SMOP__S1P__RootNamespace; 26 26 } 27 SMOP__Object* smop_get_cvar(char* var) { 28 if (strcmp(var,"SMOP__S1P__LexicalScope") == 0) return SMOP__S1P__LexicalScope; 29 else if (strcmp(var,"SMOP__S1P__RootNamespace") == 0) return SMOP__S1P__RootNamespace; 30 printf("unable to fetch %s\n"); 31 return SMOP__NATIVE__bool_false; 32 }
