# HG changeset patch # User Mike Pavone # Date 1294631470 18000 # Node ID bac2c74801f0298b99e4d5754ba59148cb10f2d7 # Parent f5095855c8783a2f5c45e2fb0e19f3880d0d0702 Move some C code out of cbackend_c.rhope into separate include files diff -r f5095855c878 -r bac2c74801f0 cbackend_c.rhope --- a/cbackend_c.rhope Fri Jan 07 03:19:26 2011 -0500 +++ b/cbackend_c.rhope Sun Jan 09 22:51:10 2011 -0500 @@ -1641,178 +1641,16 @@ constants]] ]Append[Fold[_Text C Program[?, ?, [program]Type Registry >>], "", Filter[[program]Functions >>, Not Native[?]]]] ]Append["\n -#ifdef ENABLE_PROFILING -uint64_t profile_counts[END]; -uint64_t profile_nestedcounts[END]; -uint64_t profile_totals[END]; -uint64_t profile_selftotals[END]; -uint64_t profile_activationlevel[END]; -#endif - -int32_t rhope(uint32_t func, object ** params, uint16_t numparams, uint16_t callspace) -{ -#ifdef ENABLE_PROFILING - struct timeval proftime; -#endif - uint16_t resume,idx, vcparam_offset, last_vcparam; - context *ct,*temp_ct; - void *tmp; - calldata * cdata, *temp_cdata, *my_cdata; - DispatchVar - FuncDef(Build) - FuncDef(BlueprintSP_Of) - FuncDef(ID) - FuncDef(BlueprintSP_FromSP_ID)\n"] +#include \"rhopefuncs_prolog.c\"\n"] ]Append[Fold[Local Pointers[?], "", [program]Functions >>]] ]Append[" - ct = new_context(); - cdata = alloc_cdata(ct, NULL, callspace); - cdata->num_params = numparams; - for(idx = 0; idx < numparams; ++idx) - cdata->params[idx] = params[idx]; - cdata->func = END; -DISPATCH\n"] +#include \"localpointers_fragment.c\"\n"] ]Append[Fold[Method Dispatch[?, ?, ?, [program]Type Registry >>], "", all methods]] ]Append[" -Func(Build, - NumParams 1) - - Param(0, TYPE_BLUEPRINT) - - lv_Build->bp = ((t_Blueprint *)(cdata->params[0]))->bp; - release_ref(cdata->params[0]); - - Ret(0, new_object_bp(lv_Build->bp)) -EndFunc(Build) -DISPATCH - -Func(BlueprintSP_Of, - NumParams 1) - - lv_BlueprintSP_Of->bp = get_blueprint(cdata->params[0]); - release_ref(cdata->params[0]); - - Ret(0, new_object(TYPE_BLUEPRINT)) - ((t_Blueprint *)cdata->params[0])->bp = lv_BlueprintSP_Of->bp; -EndFunc(BlueprintSP_Of) -DISPATCH - -Func(ID, NumParams 1) - - Param(0, TYPE_BLUEPRINT) - - lv_ID->id = new_object(TYPE_UINT32); - ((t_UInt32 *)lv_ID->id)->Num = ((t_Blueprint *)cdata->params[0])->bp->type_id; - release_ref(cdata->params[0]); - Ret(0, lv_ID->id) -EndFunc(ID) -DISPATCH - -Func(BlueprintSP_FromSP_ID, NumParams 1) - - Param(0, TYPE_UINT32) - - lv_BlueprintSP_FromSP_ID->type = ((t_UInt32 *)cdata->params[0])->Num; - if (lv_BlueprintSP_FromSP_ID->type >= max_registered_type || !registered_types[lv_BlueprintSP_FromSP_ID->type]) { - Ret(1, cdata->params[0]) - Ret(0, NULL) - } else { - release_ref(cdata->params[0]); - Ret(0, new_object(TYPE_BLUEPRINT)) - ((t_Blueprint *)cdata->params[0])->bp = registered_types[lv_BlueprintSP_FromSP_ID->type]; - Ret(1, NULL) - } - -EndFunc(BlueprintSP_FromSP_ID) -DISPATCH - -FuncNoLocals(Pause, NumParams 1) - Param(0, TYPE_WORKER) - - ct->resume_cdata = my_cdata; - ct->resumeable = 1; - temp_ct = ct; - ct = new_context(); - VCPrepCall(my_cdata->params[0], 1) - VCSetParam(my_cdata->params[0], 0, make_Context(temp_ct)) - ValCallNoLocals(my_cdata->params[0], 1, 1, Pause) - release_ref(my_cdata->params[0]); - DISPATCH - ValCallNoLocalsPostlude(1, Pause) - for(idx = 0; idx < cdata->num_params; ++idx) - if(cdata->params[idx]) - { release_ref(cdata->params[idx]); } - free_context(ct); - ct = get_cqueue(); - if (!ct) goto NOTHING_TO_DO; - cdata = ct->resume_cdata; - ct->resume_cdata = NULL; -EndFuncNoLocals -DISPATCH - -FuncNoLocals(Resume, NumParams 2) - Param(0, TYPE_CONTEXT) - - temp_ct = ((t_Context *)my_cdata->params[0])->ct; - release_ref(my_cdata->params[0]); - if(temp_ct->resumeable && temp_ct->resume_cdata) - { - temp_ct->resumeable = 0; - temp_ct->resume_cdata->params[0] = add_ref(my_cdata->params[1]); - my_cdata->params[0] = my_cdata->params[1]; - my_cdata->params[1] = NULL; - if(!put_cqueue(temp_ct)) - { - ct->resume_cdata = my_cdata; - temp_ct->runafter = ct; - ct = temp_ct; - cdata = ct->resume_cdata; - ct->resume_cdata = NULL; - } - } else { - my_cdata->params[0] = NULL; - } -EndFuncNoLocals -DISPATCH\n"] +#include \"builtinworkers.c\"\n"] ]Append[Fold[_Text C Program[?, ?, [program]Type Registry >>], "", Filter[[program]Functions >>, Native[?]]]] ]Append[" -DO_END: - for(idx = 0; idx < cdata->num_params; ++idx) - params[idx] = cdata->params[idx]; - free_context(ct); - return cdata->num_params; - -DO_END_THREAD: - for(idx = 0; idx < cdata->num_params; ++idx) - { release_ref(cdata->params[idx]); } - if(ct->runafter) - { - temp_ct = ct; - ct = ct->runafter; - free_context(temp_ct); - cdata = ct->resume_cdata; - func = cdata->func; - DISPATCH - } - free_context(ct); - if(ct = get_cqueue()) - { - cdata = ct->resume_cdata; - func = cdata->func; - DISPATCH - } -NOTHING_TO_DO: - return 0; - -_exception: - puts(\"Exception! Trace follows:\"); - while(cdata && cdata->func < END) - { - printf(\"%d\\n\", cdata->func); - cdata = cdata->lastframe; - } - return -1; -} +#include \"rhopefuncs_epilog.c\" #include \"builtin.c\" #include \"array.c\" diff -r f5095855c878 -r bac2c74801f0 runtime/builtinworkers.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/runtime/builtinworkers.c Sun Jan 09 22:51:10 2011 -0500 @@ -0,0 +1,101 @@ +Func(Build, + NumParams 1) + + Param(0, TYPE_BLUEPRINT) + + lv_Build->bp = ((t_Blueprint *)(cdata->params[0]))->bp; + release_ref(cdata->params[0]); + + Ret(0, new_object_bp(lv_Build->bp)) +EndFunc(Build) +DISPATCH + +Func(BlueprintSP_Of, + NumParams 1) + + lv_BlueprintSP_Of->bp = get_blueprint(cdata->params[0]); + release_ref(cdata->params[0]); + + Ret(0, new_object(TYPE_BLUEPRINT)) + ((t_Blueprint *)cdata->params[0])->bp = lv_BlueprintSP_Of->bp; +EndFunc(BlueprintSP_Of) +DISPATCH + +Func(ID, NumParams 1) + + Param(0, TYPE_BLUEPRINT) + + lv_ID->id = new_object(TYPE_UINT32); + ((t_UInt32 *)lv_ID->id)->Num = ((t_Blueprint *)cdata->params[0])->bp->type_id; + release_ref(cdata->params[0]); + Ret(0, lv_ID->id) +EndFunc(ID) +DISPATCH + +Func(BlueprintSP_FromSP_ID, NumParams 1) + + Param(0, TYPE_UINT32) + + lv_BlueprintSP_FromSP_ID->type = ((t_UInt32 *)cdata->params[0])->Num; + if (lv_BlueprintSP_FromSP_ID->type >= max_registered_type || !registered_types[lv_BlueprintSP_FromSP_ID->type]) { + Ret(1, cdata->params[0]) + Ret(0, NULL) + } else { + release_ref(cdata->params[0]); + Ret(0, new_object(TYPE_BLUEPRINT)) + ((t_Blueprint *)cdata->params[0])->bp = registered_types[lv_BlueprintSP_FromSP_ID->type]; + Ret(1, NULL) + } + +EndFunc(BlueprintSP_FromSP_ID) +DISPATCH + +FuncNoLocals(Pause, NumParams 1) + Param(0, TYPE_WORKER) + + ct->resume_cdata = my_cdata; + ct->resumeable = 1; + temp_ct = ct; + ct = new_context(); + VCPrepCall(my_cdata->params[0], 1) + VCSetParam(my_cdata->params[0], 0, make_Context(temp_ct)) + ValCallNoLocals(my_cdata->params[0], 1, 1, Pause) + release_ref(my_cdata->params[0]); + DISPATCH + ValCallNoLocalsPostlude(1, Pause) + for(idx = 0; idx < cdata->num_params; ++idx) + if(cdata->params[idx]) + { release_ref(cdata->params[idx]); } + free_context(ct); + ct = get_cqueue(); + if (!ct) goto NOTHING_TO_DO; + cdata = ct->resume_cdata; + ct->resume_cdata = NULL; +EndFuncNoLocals +DISPATCH + +FuncNoLocals(Resume, NumParams 2) + Param(0, TYPE_CONTEXT) + + temp_ct = ((t_Context *)my_cdata->params[0])->ct; + release_ref(my_cdata->params[0]); + if(temp_ct->resumeable && temp_ct->resume_cdata) + { + temp_ct->resumeable = 0; + temp_ct->resume_cdata->params[0] = add_ref(my_cdata->params[1]); + my_cdata->params[0] = my_cdata->params[1]; + my_cdata->params[1] = NULL; + if(!put_cqueue(temp_ct)) + { + ct->resume_cdata = my_cdata; + temp_ct->runafter = ct; + ct = temp_ct; + cdata = ct->resume_cdata; + ct->resume_cdata = NULL; + } + } else { + my_cdata->params[0] = NULL; + } +EndFuncNoLocals +DISPATCH + diff -r f5095855c878 -r bac2c74801f0 runtime/localpointers_fragment.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/runtime/localpointers_fragment.c Sun Jan 09 22:51:10 2011 -0500 @@ -0,0 +1,8 @@ + ct = new_context(); + cdata = alloc_cdata(ct, NULL, callspace); + cdata->num_params = numparams; + for(idx = 0; idx < numparams; ++idx) + cdata->params[idx] = params[idx]; + cdata->func = END; +DISPATCH + diff -r f5095855c878 -r bac2c74801f0 runtime/rhopefuncs_epilog.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/runtime/rhopefuncs_epilog.c Sun Jan 09 22:51:10 2011 -0500 @@ -0,0 +1,39 @@ + +DO_END: + for(idx = 0; idx < cdata->num_params; ++idx) + params[idx] = cdata->params[idx]; + free_context(ct); + return cdata->num_params; + +DO_END_THREAD: + for(idx = 0; idx < cdata->num_params; ++idx) + { release_ref(cdata->params[idx]); } + if(ct->runafter) + { + temp_ct = ct; + ct = ct->runafter; + free_context(temp_ct); + cdata = ct->resume_cdata; + func = cdata->func; + DISPATCH + } + free_context(ct); + if(ct = get_cqueue()) + { + cdata = ct->resume_cdata; + func = cdata->func; + DISPATCH + } +NOTHING_TO_DO: + return 0; + +_exception: + puts("Exception! Trace follows:"); + while(cdata && cdata->func < END) + { + printf("%d\n", cdata->func); + cdata = cdata->lastframe; + } + return -1; +} + diff -r f5095855c878 -r bac2c74801f0 runtime/rhopefuncs_prolog.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/runtime/rhopefuncs_prolog.c Sun Jan 09 22:51:10 2011 -0500 @@ -0,0 +1,23 @@ +#ifdef ENABLE_PROFILING +uint64_t profile_counts[END]; +uint64_t profile_nestedcounts[END]; +uint64_t profile_totals[END]; +uint64_t profile_selftotals[END]; +uint64_t profile_activationlevel[END]; +#endif + +int32_t rhope(uint32_t func, object ** params, uint16_t numparams, uint16_t callspace) +{ +#ifdef ENABLE_PROFILING + struct timeval proftime; +#endif + uint16_t resume,idx, vcparam_offset, last_vcparam; + context *ct,*temp_ct; + void *tmp; + calldata * cdata, *temp_cdata, *my_cdata; + DispatchVar + FuncDef(Build) + FuncDef(BlueprintSP_Of) + FuncDef(ID) + FuncDef(BlueprintSP_FromSP_ID) +