@@ -17,6 +17,7 @@ import System.Process
17import System.IO
17import System.IO
18import System.Directory
18import System.Directory
19import System.Environment
19import System.Environment
21import Paths_idris
22import Paths_idris
@@ -72,18 +73,19 @@ codegenC :: Name -> Int -> PreC -> String
72codegenC n args prec
73codegenC n args prec
73 = "/* " ++ show prec ++ " */\n\n" ++
74 = "/* " ++ show prec ++ " */\n\n" ++
74 "void " ++ cname n ++ "(VM* vm) {\n" ++
75 "void " ++ cname n ++ "(VM* vm) {\n" ++
76+ indent 1 ++ "int i;\n" ++
75 concatMap (cg 1) prec ++ "}\n\n"
77 concatMap (cg 1) prec ++ "}\n\n"
77indent i = take (i * 4) (repeat ' ')
79indent i = take (i * 4) (repeat ' ')
79reg RVal = "vm->ret"
81reg RVal = "vm->ret"
80−reg (LVar v) = "*(vm->stack-" ++ show v ++ ")"
82+reg (LVar v) = "*(vm->valstack_ptr-" ++ show v ++ ")"
82catom :: CAtom -> String
84catom :: CAtom -> String
83catom (CL l) = reg (LVar l)
85catom (CL l) = reg (LVar l)
84catom (CC (I i)) = "MKINT(" ++ show i ++ ")"
86catom (CC (I i)) = "MKINT(" ++ show i ++ ")"
85catom (CC v) = "const(" ++ show v ++ ")"
87catom (CC v) = "const(" ++ show v ++ ")"
86−catom (CP n) = cname n
88+catom (CP n i) = "MKCLOSURE(" ++ cname n ++ ", " ++ show i ++ ")"
88off o (CL i) = CL (i + o)
90off o (CL i) = CL (i + o)
89off o x = x
91off o x = x
@@ -111,6 +113,22 @@ assignFn i r f args
111 setArgs i (a : as) = reg (LVar i) ++ " = " ++ catom a ++ "; "
113 setArgs i (a : as) = reg (LVar i) ++ " = " ++ catom a ++ "; "
112 ++ setArgs (i + 1) as
114 ++ setArgs (i + 1) as
116+assignClosure i lazy r atom args
117+ = indent i ++ reg r ++ " = APPLY(" ++ catom atom ++ ", " ++ show (length args) ++
119+ indent i ++ setArgs 0 args ++ "\n" ++
121+ indent i ++ "if (READY(" ++ reg r ++ ")) {\n" ++
122+ indent (i + 1) ++ reg r ++ " = EVAL(" ++ reg r ++ ");\n" ++
123+ indent i ++ "} else {\n" ++
124+ indent (i + 1) ++ "// do nothing \n" ++
129+ setArgs i (a : as) = "ADDARG(" ++ show i ++ ", " ++ reg r ++ ", " ++ catom a ++ "); "
130+ ++ setArgs (i + 1) as
114doTailCall i d f args
132doTailCall i d f args
115 = indent i ++ "EXTEND(" ++ show (length args) ++ ");\n" ++
133 = indent i ++ "EXTEND(" ++ show (length args) ++ ");\n" ++
116 indent i ++ setArgs 1 (map (off (length args)) (reverse args)) ++ "\n" ++
134 indent i ++ setArgs 1 (map (off (length args)) (reverse args)) ++ "\n" ++
@@ -121,11 +139,36 @@ doTailCall i d f args
121 setArgs i (a : as) = reg (LVar i) ++ " = " ++ catom a ++ "; "
139 setArgs i (a : as) = reg (LVar i) ++ " = " ++ catom a ++ "; "
122 ++ setArgs (i + 1) as
140 ++ setArgs (i + 1) as
142+assignFCall i r cfn rt args
143+ = indent i ++ reg r ++ " = " ++ fromC rt ++
145+ cfn ++ "(" ++ showSep ", " (map toCa args) ++ "))" ++ ";\n"
146+ where fromC (Just IType) = "MKINT"
147+ fromC (Just StrType) = "MKSTR"
150+ toC (Just IType) = "GETINT"
151+ toC (Just StrType) = "GETSTR"
154+ toCa (a, ty) = toC ty ++ "(" ++ catom a ++ ")"
156+assignPrimOp i r p args
157+ = indent i ++ reg r ++ " = " ++ op p args ++ ";\n"
124cg :: Int -> CInst -> String
159cg :: Int -> CInst -> String
125cg i (ASSIGN r (CCon t args))
160cg i (ASSIGN r (CCon t args))
126 = assignCon i r t args
161 = assignCon i r t args
127cg i (ASSIGN r (CExactApp f args))
162cg i (ASSIGN r (CExactApp f args))
128 = assignFn i r f args
163 = assignFn i r f args
164+cg i (ASSIGN r (CApp f args))
165+ = assignClosure i False r f args
166+cg i (ASSIGN r (CLazy f args))
167+ = assignClosure i True r f args
168+cg i (ASSIGN r (CFCall cfn rt args))
169+ = assignFCall i r cfn rt args
170+cg i (ASSIGN r (CPrimOp p args))
171+ = assignPrimOp i r p args
129cg i (ASSIGN r (CAtom e)) = indent i ++ reg r ++ " = " ++ catom e ++ ";\n"
172cg i (ASSIGN r (CAtom e)) = indent i ++ reg r ++ " = " ++ catom e ++ ";\n"
130cg i (RESERVE s) = indent i ++ "EXTEND(" ++ show s ++ ");\n"
173cg i (RESERVE s) = indent i ++ "EXTEND(" ++ show s ++ ");\n"
131cg i (CLEAR s) = indent i ++ "CLEAR(" ++ show s ++ ");\n"
174cg i (CLEAR s) = indent i ++ "CLEAR(" ++ show s ++ ");\n"
@@ -145,9 +188,10 @@ cg i (SWITCH v bs def)
145 branch (t, c) = indent i ++ "case " ++ show t ++ ":\n" ++
188 branch (t, c) = indent i ++ "case " ++ show t ++ ":\n" ++
146 concatMap (cg (i+1)) c ++
189 concatMap (cg (i+1)) c ++
147 indent (i+1) ++ "break;\n"
190 indent (i+1) ++ "break;\n"
191+cg i (TAILCALL d f args) = assignClosure i False RVal f args -- doTailClosure i d f args
148cg i (TAILCALLEXACT d f args) = doTailCall i d f args
192cg i (TAILCALLEXACT d f args) = doTailCall i d f args
149cg i (ERROR s) = indent i ++ "ERROR(" ++ show s ++ ")\n";
193cg i (ERROR s) = indent i ++ "ERROR(" ++ show s ++ ")\n";
150−cg i _ = indent i ++ "NOT DONE;\n"
194+cg i x = trace (show x ++ " not done") $ indent i ++ "NOT DONE;\n"
152cname :: Name -> String
196cname :: Name -> String
153cname (UN s) = "_I_" ++ toC s
197cname (UN s) = "_I_" ++ toC s
@@ -162,3 +206,13 @@ toC s = concatMap special s
162proto :: Name -> String
206proto :: Name -> String
163proto n = "void " ++ cname n ++ "(VM* vm);\n"
207proto n = "void " ++ cname n ++ "(VM* vm);\n"
209+op AddI [l, r] = "INTOP(+, " ++ catom l ++ ", " ++ catom r ++ ")"
210+op SubI [l, r] = "INTOP(-, " ++ catom l ++ ", " ++ catom r ++ ")"
211+op MulI [l, r] = "INTOP(*, " ++ catom l ++ ", " ++ catom r ++ ")"
212+op DivI [l, r] = "INTOP(/, " ++ catom l ++ ", " ++ catom r ++ ")"
214+op ConcatS [l,r] = "CONCAT(" ++ catom l ++ ", " ++ catom r ++ ")"
216+op o args = trace (show (op, args) ++ " operator undefined")
217+ $ "0 /* Op not defined " ++ show o ++ " */"