Mercurial > repos > rhope
view test/fib.c @ 120:cd25171e1bb2
Use List for Subsets instead of a Dictionary for performance reasons. Fix issue with List literals. Compiled compiler is now self-hosting.
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 21 Oct 2010 23:55:15 -0400 |
parents | d4b44ae2e34a |
children |
line wrap: on
line source
#include <stdio.h> #include "builtin.h" #include "object.h" #include "context.h" #include "func.h" #include "integer.h" #include "bool.h" typedef enum { FUNC__LT_, FUNC__LT__AT_Int32, FUNC__MN_, FUNC__MN__AT_Int32, FUNC__PL_, FUNC__PL__AT_Int32, FUNC_Fib, FUNC_Fib_1, FUNC_Fib_2, FUNC_Fib_3, FUNC_Fib_4, FUNC_Fib_5, FUNC_Fib_6, FUNC_If, FUNC_If_AT_Yes_SP_No, FUNC_Main, FUNC_Main_1, FUNC_Main_2, FUNC_Print, END } funcids; #define DISPATCH switch(func) { \ case FUNC__LT_: goto f__LT_;\ case FUNC__LT__AT_Int32: goto f__LT__AT_Int32;\ case FUNC__MN_: goto f__MN_;\ case FUNC__MN__AT_Int32: goto f__MN__AT_Int32;\ case FUNC__PL_: goto f__PL_;\ case FUNC__PL__AT_Int32: goto f__PL__AT_Int32;\ case FUNC_Fib: goto f_Fib;\ case FUNC_Fib_1: goto r1_Fib;\ case FUNC_Fib_2: goto r2_Fib;\ case FUNC_Fib_3: goto r3_Fib;\ case FUNC_Fib_4: goto r4_Fib;\ case FUNC_Fib_5: goto r5_Fib;\ case FUNC_Fib_6: goto r6_Fib;\ case FUNC_If: goto f_If;\ case FUNC_If_AT_Yes_SP_No: goto f_If_AT_Yes_SP_No;\ case FUNC_Main: goto f_Main;\ case FUNC_Main_1: goto r1_Main;\ case FUNC_Main_2: goto r2_Main;\ case FUNC_Print: goto f_Print;\ case END: goto DO_END;\ } typedef struct { struct object *____result__0__0; struct object *____result__0__1; struct object *____result__10__0; struct object *____result__11__0; struct object *____result__1__0; struct object *____result__5__0; struct object *____result__6__0; struct object *____result__7__0; struct object *out; } lt_Fib; typedef struct { struct object *____result__0__0; struct object *____result__1__0; } lt_Main; object * _const_Whole_SP_Number__1; object * _const_Whole_SP_Number__2; object * _const_Whole_SP_Number__30; void rhope(uint32_t func) { uint16_t resume,idx; context * ct; calldata * cdata, *temp_cdata; FuncDef(Fib) FuncDef(Main) ct = new_context(); cdata = alloc_cdata(ct, NULL, 0); cdata->num_params = 0; cdata->func = END; DISPATCH Method(_LT_) MethodDispatch(TYPE_INT32,_LT_,Int32) EndMethod MethodImplNoLocals(_LT_,Int32,TYPE_INT32, NumParams 2) Param(1, TYPE_INT32) if(((t_Int32 *)cdata->params[0])->num < ((t_Int32 *)cdata->params[-1])->num) { release_ref(cdata->params[0]); Ret(0, Yes) } else { release_ref(cdata->params[0]); Ret(0, No) } release_ref(cdata->params[-1]); EndFuncNoLocals DISPATCH Method(_MN_) MethodDispatch(TYPE_INT32,_MN_,Int32) EndMethod DISPATCH MethodImplNoLocals(_MN_,Int32,TYPE_INT32, NumParams 2) Param(1, TYPE_INT32) cdata->params[0] = copy_object(cdata->params[0]); ((t_Int32 *)cdata->params[0])->num -= ((t_Int32 *)cdata->params[-1])->num; release_ref(cdata->params[-1]); EndFuncNoLocals DISPATCH Method(_PL_) MethodDispatch(TYPE_INT32,_PL_,Int32) EndMethod DISPATCH MethodImplNoLocals(_PL_,Int32,TYPE_INT32, NumParams 2) Param(1, TYPE_INT32) cdata->params[0] = copy_object(cdata->params[0]); ((t_Int32 *)cdata->params[0])->num += ((t_Int32 *)cdata->params[-1])->num; release_ref(cdata->params[-1]); EndFuncNoLocals DISPATCH Func(Fib, NumParams 1) lv_Fib->____result__0__0 = NULL; lv_Fib->____result__0__1 = NULL; lv_Fib->____result__1__0 = NULL; lv_Fib->____result__5__0 = NULL; lv_Fib->____result__6__0 = NULL; lv_Fib->____result__7__0 = NULL; lv_Fib->____result__10__0 = NULL; lv_Fib->____result__11__0 = NULL; lv_Fib->out = NULL; PrepCall(2) SetParam(0, add_ref(cdata->lastframe->params[0])) SetParam(1, add_ref(_const_Whole_SP_Number__2)) Call(_LT_, NumParams 2, 1, Fib) lv_Fib->____result__1__0 = cdata->params[0]; SetParam(0, add_ref(lv_Fib->____result__1__0)) Call(If, NumParams 1, 2, Fib) lv_Fib->____result__0__0 = cdata->params[0]; lv_Fib->____result__0__1 = cdata->params[-1]; if(lv_Fib->____result__0__1) { SetParam(0, add_ref(cdata->lastframe->params[0])) SetParam(1, add_ref(_const_Whole_SP_Number__1)) Call(_MN_, NumParams 2, 3, Fib) lv_Fib->____result__7__0 = cdata->params[0]; } if(lv_Fib->____result__0__1) { SetParam(0, add_ref(cdata->lastframe->params[0])) SetParam(1, add_ref(_const_Whole_SP_Number__2)) Call(_MN_, NumParams 2, 4, Fib) lv_Fib->____result__11__0 = cdata->params[0]; } if(lv_Fib->____result__0__0) { lv_Fib->out = add_ref(_const_Whole_SP_Number__1); } if(lv_Fib->____result__0__1) { SetParam(0, add_ref(lv_Fib->____result__7__0)) Call(Fib, NumParams 1, 5, Fib) lv_Fib->____result__6__0 = cdata->params[0]; } if(lv_Fib->____result__0__1) { SetParam(0, add_ref(lv_Fib->____result__11__0)) Call(Fib, NumParams 1, 6, Fib) lv_Fib->____result__10__0 = cdata->params[0]; } if(lv_Fib->____result__0__1) { if(lv_Fib->____result__0__0) { release_ref(lv_Fib->____result__0__0); } if(lv_Fib->____result__0__1) { release_ref(lv_Fib->____result__0__1); } if(lv_Fib->____result__1__0) { release_ref(lv_Fib->____result__1__0); } if(lv_Fib->____result__7__0) { release_ref(lv_Fib->____result__7__0); } if(lv_Fib->____result__11__0) { release_ref(lv_Fib->____result__11__0); } TPrepCall(2) SetParam(0, lv_Fib->____result__6__0) SetParam(1, lv_Fib->____result__10__0) TCall(_PL_, NumParams 2) //lv_Fib->____result__5__0 = cdata->params[0]; } FreeCall if(lv_Fib->____result__0__1) { lv_Fib->out = add_ref(lv_Fib->____result__5__0); } if(lv_Fib->____result__0__0) { release_ref(lv_Fib->____result__0__0); } if(lv_Fib->____result__0__1) { release_ref(lv_Fib->____result__0__1); } if(lv_Fib->____result__1__0) { release_ref(lv_Fib->____result__1__0); } if(lv_Fib->____result__5__0) { release_ref(lv_Fib->____result__5__0); } if(lv_Fib->____result__6__0) { release_ref(lv_Fib->____result__6__0); } if(lv_Fib->____result__7__0) { release_ref(lv_Fib->____result__7__0); } if(lv_Fib->____result__10__0) { release_ref(lv_Fib->____result__10__0); } if(lv_Fib->____result__11__0) { release_ref(lv_Fib->____result__11__0); } release_ref(cdata->params[0]); Ret(0, lv_Fib->out) EndFunc(Fib) DISPATCH Method(If) MethodDispatch(TYPE_BOOLEAN,If,Yes_SP_No) EndMethod MethodImplNoLocals(If,Yes_SP_No,TYPE_BOOLEAN, NumParams 1) if(((t_Boolean *)(cdata->params[0]))->val) { Ret(1, NULL) } else { Ret(1, cdata->params[0]); Ret(0, NULL) } EndFuncNoLocals DISPATCH Func(Main, NumParams 0) lv_Main->____result__0__0 = NULL; lv_Main->____result__1__0 = NULL; PrepCall(1) SetParam(0, add_ref(_const_Whole_SP_Number__30)) Call(Fib, NumParams 1, 1, Main) lv_Main->____result__1__0 = cdata->params[0]; FreeCall PrepCall(1) SetParam(0, add_ref(lv_Main->____result__1__0)) Call(Print, NumParams 1, 2, Main) lv_Main->____result__0__0 = cdata->params[0]; FreeCall if(lv_Main->____result__0__0) { release_ref(lv_Main->____result__0__0); } if(lv_Main->____result__1__0) { release_ref(lv_Main->____result__1__0); } EndFunc(Main) DISPATCH FuncNoLocals(Print, NumParams 1) if(get_blueprint(cdata->params[0])->type_id == TYPE_INT32) { printf("%d\n", ((t_Int32 *)(cdata->params[0]))->num); } else { puts("Don't know how to print this type"); } release_ref(cdata->params[0]); Ret(0, make_Int32(0)) EndFuncNoLocals DISPATCH DO_END: return; _exception: puts("whoops, exception!"); } int main(int argc, char ** argv) { register_builtin_types(); _const_Whole_SP_Number__1 = make_Int32(1); _const_Whole_SP_Number__2 = make_Int32(2); _const_Whole_SP_Number__30 = make_Int32(30); rhope(FUNC_Main); return 0; }