Mercurial > repos > rhope
view test/fib.c @ 13:23dd9c766699
C backend close to being useable
author | mpavone@ |
---|---|
date | Tue, 26 May 2009 23:49:46 +0000 |
parents | 31f8182f3433 |
children | b71bab34ec65 |
line wrap: on
line source
#include <stdio.h> #include "builtin.h" #include "object.h" #include "context.h" #include "func.h" #include "integer.h" typedef struct { object * work1; object * work2; object * out; } fib_t; object * const_1; object * const_2; Func(Fib, NumParams 1, CallSpace 2, fib_t); 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 1, CallSpace 2) 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 = 1; cdata->resume = 0; const_1 = make_Int32(1); const_2 = make_Int32(2); 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); #ifdef _WIN32 dur = timeGetTime()-dur; printf("Took %d milliseconds\n", dur); #endif return 0; }