Mercurial > repos > rhope
diff test/fib.c @ 12:31f8182f3433
Finished fib test and did some small work on the c backend
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 25 May 2009 23:34:36 -0400 |
parents | 3021dac0d8f5 |
children | b71bab34ec65 |
line wrap: on
line diff
--- a/test/fib.c Tue May 19 23:29:55 2009 -0400 +++ b/test/fib.c Mon May 25 23:34:36 2009 -0400 @@ -1,14 +1,15 @@ #include <stdio.h> #include "builtin.h" #include "object.h" -#include "integer.h" #include "context.h" #include "func.h" +#include "integer.h" typedef struct { object * work1; object * work2; + object * out; } fib_t; object * const_1; @@ -19,58 +20,97 @@ CallSpace 2, fib_t); - MCall(METHOD_SUB, + locals->out = NULL; + + + call->params[0] = add_ref(cdata->params[0]); + call->params[1] = add_ref(const_2); + MCall(METHOD_LESS, 2) + + MCall(METHOD_IF, 1) + + if(call->params[0]) + locals->out = add_ref(const_1); + + if(call->params[1]) + { + call->params[0] = add_ref(cdata->params[0]); + call->params[1] = add_ref(const_1); + MCall(METHOD_SUB, 2) + locals->work1 = call->params[0]; + + call->params[0] = add_ref(cdata->params[0]); + call->params[1] = add_ref(const_2); + MCall(METHOD_SUB, 2) + locals->work2 = call->params[0]; + + call->params[0] = locals->work1; + Call(Fib, 1) + locals->work1 = call->params[0]; + + call->params[0] = locals->work2; + Call(Fib, 1) + locals->work2 = call->params[0]; + + if(!locals->out) + { + release_ref(cdata->params[0]); + cdata->params[0] = locals->work1; + cdata->params[1] = locals->work2; + TMCall(METHOD_ADD, 2) + } + } + release_ref(cdata->params[0]); + Ret(0, locals->out) + EndFunc FuncNoLocals(Main, - NumParams 0, + NumParams 1, CallSpace 2) - call->params[0] = make_Int32(2); - call->params[1] = make_Int32(3); - call->num_params = 2; - call->resume = 0; - ret = call_method(METHOD_ADD, call); - while(ret == TAIL_RETURN) - ret = call->tail_func(call); - if(ret == EXCEPTION_RETURN) { - Ret(0,call->params[0]); - return ret; - } - call->params[1] = make_Int32(1); - call->resume = 0; - ret = call_method(METHOD_SUB, call); - while(ret == TAIL_RETURN) - ret = call->tail_func(call); - if(ret == EXCEPTION_RETURN) { - Ret(0,call->params[0]); - return ret; - } - Ret(0,call->params[0]) + TCall(Fib, 1) EndFunc +#ifdef _WIN32 + #include "windows.h" +#endif int main(int argc, char ** argv) { returntype ret; calldata *cdata; context * ct; + #ifdef _WIN32 + DWORD dur; + dur = timeGetTime(); + #endif + if(argc < 2) + { + puts("not enought arguments"); + return -1; + } register_builtin_types(); ct = new_context(); cdata = alloc_cdata(ct, 1); - cdata->num_params = 0; + cdata->num_params = 1; cdata->resume = 0; const_1 = make_Int32(1); const_2 = make_Int32(2); - ret = _f_Main(cdata); + cdata->params[0] = make_Int32(atoi(argv[1])); + ret = f_Main(cdata); while(ret == TAIL_RETURN) ret = cdata->tail_func(cdata); if(ret == EXCEPTION_RETURN) { puts("Exception!"); return -1; } - printf("Result: %d\n", ((_t_Int32 *)cdata->params[0])->num); + printf("Result: %d\n", ((t_Int32 *)cdata->params[0])->num); + #ifdef _WIN32 + dur = timeGetTime()-dur; + printf("Took %d milliseconds\n", dur); + #endif return 0; }