# HG changeset patch # User Mike Pavone # Date 1317971402 25200 # Node ID ba35ab624ec2ec8944de13d58c6c0dae7cb3ca37 # Parent 4580c08fd4e8996ae54c38616b590aa796a193b7 Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting diff -r 4580c08fd4e8 -r ba35ab624ec2 cbackend.rhope --- a/cbackend.rhope Wed Jul 27 21:32:40 2011 -0700 +++ b/cbackend.rhope Fri Oct 07 00:10:02 2011 -0700 @@ -600,6 +600,7 @@ + Do AddRef@C Function[func,psource,pdest:out] { source <- [psource]Make Op[func] @@ -698,13 +699,13 @@ { estore <- Escape Rhope Name[store,[func]Escape Pattern >>] - out <- [[[[[ [["((mutt_"]Append[estore]]Append["*)lv_"]]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append["->gs_"]]Append[estore]]Append["->local_data)->gs_"]]Append[Escape Rhope Name[var,[func]Escape Pattern >>]] + out <- [[[[[ [["((mutt_"]Append[estore]]Append["*)lv("]]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[", gs_"]]Append[estore]]Append[")->local_data)->gs_"]]Append[Escape Rhope Name[var,[func]Escape Pattern >>]] } Set Global@C Function[func,store,var,src:out] { estore <- Escape Rhope Name[store,[func]Escape Pattern >>] - cell pointer <- [[["lv_"]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append["->gs_"]]Append[estore] + cell pointer <- [[[["lv("]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[", gs_"]]Append[estore]]Append[")"] out <- [[[[func]Add Statement[[["tmp = copy_object("]Append[[cell pointer]Append["->local_data"]]]Append[")"]] ]Add Statement[ [[[["((mutt_"]Append[estore]]Append[" *)tmp)->gs_"]]Append[Escape Rhope Name[var, [func]Escape Pattern >>]]]Append[[" = "]Append[[src]Make Op[func]]] ] ]Add Statement[[cell pointer]Append["->local_data = tmp"]] @@ -951,9 +952,9 @@ { [[func]Inputs >>]Find[=[op,?]] { - out <- [["my_cdata->params["]Append[String[~]]]Append[" ]"] + out <- [["my_params("]Append[String[~]]]Append[")"] }{ - out <- [[["lv_"]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append["->"]]Append[Escape Rhope Name[op,[func]Escape Pattern >>]] + out <- [[[["lv("]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[", "]]Append[Escape Rhope Name[op,[func]Escape Pattern >>]]]Append[")"] } }{ out <- Escape Rhope Name[op,[func]Escape Pattern >>] @@ -964,7 +965,7 @@ { If[[[func]Convention >>] = ["rhope"]] { - out <- [[["lv_"]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append["->"]]Append[Escape Rhope Name[name,[func]Escape Pattern >>]] + out <- [[[["lv("]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[", "]]Append[Escape Rhope Name[name,[func]Escape Pattern >>]]]Append[")"] }{ out <- Escape Rhope Name[name,[func]Escape Pattern >>] } @@ -1002,21 +1003,21 @@ Discard Outputs@C Function[func,first to discard:out] { out <- [[[[[func - ]Add Raw Line[[["for(idx = "]Append[String[first to discard]]]Append["; idx < cdata->num_params; ++idx)"]] + ]Add Raw Line[[["for(idx = "]Append[String[first to discard]]]Append["; idx < numresults; ++idx)"]] ]Add Raw Line["{"] - ]Add Raw Line[" if (cdata->params[idx])"] - ]Add Raw Line[" release_ref(cdata->params[idx]);"] + ]Add Raw Line[" if (result(idx))"] + ]Add Raw Line[" release_ref(result(idx));"] ]Add Raw Line["}"] } Result Reference@C Function[func,output:out] { - out <- [["cdata->params["]Append[String[output]]]Append["]"] + out <- [["result("]Append[String[output]]]Append[")"] } Checked Result Reference@C Function[func,output:out] { - out <- [[[["("]Append[String[output]]]Append[" < cdata->num_params ? cdata->params["]]Append[String[output]]]Append["] : NULL)"] + out <- [[[["("]Append[String[output]]]Append[" < numresults ? result("]]Append[String[output]]]Append[") : NULL)"] } @@ -1036,7 +1037,7 @@ _Set Outputs C[string,inputname,inputnum,func:out] { - out <- [string]Append[[[ [ ["\tRet("]Append[String[inputnum]] ]Append[ [[", lv_"]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append["->"]]]Append[Escape Rhope Name[inputname,[func]Escape Pattern >>]]]Append[")\n"]] + out <- [string]Append[[[ [ ["\tRet("]Append[String[inputnum]] ]Append[ [[", lv("]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[", "]]]Append[Escape Rhope Name[inputname,[func]Escape Pattern >>]]]Append["))\n"]] } Set Outputs@C Function[func:out] @@ -1055,15 +1056,15 @@ } _Output Defs C[string,varname,index,func:out] { - out <- [[[string]Append[ ["\t"]Append[Rhope Type to C[[[func]Output Types >>]Index[index],[func]Escape Pattern >>]] ]]Append[[" "]Append[Escape Rhope Name[varname,[func]Escape Pattern >>]]]]Append[";\n"] + out <- [[[string]Append[ [" lvar("]Append[Rhope Type to C[[[func]Output Types >>]Index[index],[func]Escape Pattern >>]] ]]Append[[", "]Append[Escape Rhope Name[varname,[func]Escape Pattern >>]]]]Append[")"] } _Var Defs C[string,type,varname,p:out] { - out <- [[[string]Append[ ["\t"]Append[Rhope Type to C[type,p]] ]]Append[[" "]Append[Escape Rhope Name[varname,p]]]]Append[";\n"] + out <- [[[string]Append[ [" lvar("]Append[Rhope Type to C[type,p]] ]]Append[[", "]Append[Escape Rhope Name[varname,p]]]]Append[")"] } _Global Cell Defs C[func,p,string,store:out] { - out <- [string]Append[ [["\ttrans_cell *gs_"]Append[Escape Rhope Name[store,p]]]Append[";\n"] ] + out <- [string]Append[ [[" lvar(trans_cell *, gs_"]Append[Escape Rhope Name[store,p]]]Append[")"] ] } @@ -1073,7 +1074,22 @@ { If[ [[[func]Convention >>] = ["rhope"]] And [[ [[[func]Variables >>]Length]+[[[func]Outputs >>]Length] ] > [0]] ] { - localtype <- [[[Fold[_Global Cell Defs C[func,[func]Escape Pattern >>,?], Fold[_Output Defs C[?, ?, ?, func], Fold[_Var Defs C[?,?,?,[func]Escape Pattern >>],"typedef struct {\n", [func]Variables >>], [func]Outputs >>], [func]Uses >>]]Append["} lt_"]]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[";\n"] + ename <- Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>] + localtype <- [ + [ + [ + Fold[ + _Global Cell Defs C[func,[func]Escape Pattern >>,?], + Fold[ + _Output Defs C[?, ?, ?, func], + Fold[ + _Var Defs C[?,?,?,[func]Escape Pattern >>], + ["#define ldec_"]Append[ename], + [func]Variables >>], + [func]Outputs >>], + [func]Uses >>] + ]Append["\nLocalsType(ldec_"]]Append[ename] + ]Append[ [[", "]Append[ename]]Append[")\n"] ] }{ localtype <- "" } @@ -1147,7 +1163,7 @@ Find Trans Cell@C Function[func,text,store:out] { estore <- Escape Rhope Name[store,[func]Escape Pattern >>] - out <- [text]Append[ [[[["lv_"]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append["->gs_"]]Append[estore]]Append[[[" = find_obj_cell(ct->transaction, gs_"]Append[estore]]Append[");\n"]] ] + out <- [text]Append[ [[[["lv("]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[", gs_"]]Append[estore]]Append[[[") = find_obj_cell(cur_transaction, gs_"]Append[estore]]Append[");\n"]] ] } Text@C Function[func:out] @@ -1177,10 +1193,12 @@ } If[ [ [[[[func]Variables >>]Length]+[[[func]Outputs >>]Length]]+[[[func]Uses >>]Length] ] = [0] ] { - out <- [[[[[[[[[ [type]Append["NoLocals("] + out <- [[[[[[[[[[[ [type]Append["NoLocals("] ]Append[cname] ]Append[",\n\tNumParams "] ]Append[ String[[[func]Inputs >>]Length] ] + ]Append[",\n\tNumOutputs "] + ]Append[ String[[[func]Outputs >>]Length] ] ]Append[")\n\n"] ]Append[param check] ]Append[ [[func]Statements >>]Join[""] ] @@ -1193,18 +1211,20 @@ begin trans <- [[[["\tbegin_transaction(ct, "]Append[ String[[[func]Uses >>]Length] ]]Append[", "]]Append[ [Map[Map[[func]Uses >>, Escape Rhope Name[?, [func]Escape Pattern >>]], ["gs_"]Append[?]]]Join[", "] ]]Append[");\n"] init trans <- [[Fold[Find Trans Cell[func,?], begin trans, [func]Uses >>] ]Append[[["transretry_"]Append[fname]]Append[":\n"]] - ]Append["\tfor(idx = 0; idx < cdata->num_params; ++idx) { add_ref(cdata->params[idx]); }\n"] + ]Append[ [["\tfor(idx = 0; idx < "]Append[String[[[func]Inputs >>]Length]]]Append["; ++idx) { add_ref(my_params(idx)); }\n"] ] //TODO: Figure out whether this is a readonly or write transaction commit trans <- [[["\tif(!commit_transaction(ct, 0)) { prep_retry(ct); goto transretry_"]Append[fname]]Append["; }\n"] - ]Append["\tfor(idx = 0; idx < cdata->num_params; ++idx) { release_ref(cdata->params[idx]); }\n"] + ]Append[ [["\tfor(idx = 0; idx < "]Append[String[[[func]Inputs >>]Length]]]Append["; ++idx) { release_ref(my_params(idx)); }\n"] ] }{ init trans <- "" commit trans <- "" } - out <- [[[[[[[[[[[[ [type]Append["("] + out <- [[[[[[[[[[[[[[ [type]Append["("] ]Append[cname] ]Append[",\n\tNumParams "] ]Append[ String[[[func]Inputs >>]Length] ] + ]Append[",\n\tNumOutputs "] + ]Append[ String[[[func]Outputs >>]Length] ] ]Append[")\n\n"] ]Append[param check] ]Append[init trans] @@ -1519,11 +1539,11 @@ _Dispatch Enum Sub[text, num, name:out] { out <- [[[[[text - ]Append["\tRES_"] + ]Append["\tResEnum("] ]Append[String[num]] - ]Append["_"] + ]Append[", "] ]Append[name] - ]Append[",\n"] + ]Append[")\n"] } _Dispatch Enum[text,func,raw name:out] @@ -1547,7 +1567,7 @@ { out <- [[[[["typedef enum {\n" ]Append[Fold[_Dispatch Enum[?], - [Fold[_Dispatch Enum Methods[[program]Escape Pattern >>,?], "", all methods]]Append["\tFUNC_Build,\n\tFUNC_BlueprintSP_Of,\n\tFUNC_ID,\n\tFUNC_BlueprintSP_FromSP_ID,\n\tFUNC_Pause,\n\tRES_1_Pause,\n\tFUNC_Resume,\n\tFUNC_RunSP_Bytecode,\n\tRES_1_RunSP_Bytecode,\n"], + [Fold[_Dispatch Enum Methods[[program]Escape Pattern >>,?], "", all methods]]Append["\tFUNC_Build,\n\tFUNC_BlueprintSP_Of,\n\tFUNC_ID,\n\tFUNC_BlueprintSP_FromSP_ID,\n\tFUNC_Pause,\n\tResEnum(1, Pause)\n\tFUNC_Resume,\n\tFUNC_RunSP_Bytecode,\n\tResEnum(1, RunSP_Bytecode)\n"], [program]Functions >>]] ]Append["\tEND,\n\tEND_THREAD\n} funcids;\n\n"] ]Append["#define DispatchEntries \\\n"] @@ -1575,7 +1595,13 @@ { out <- text }{ - out <- [text]Append[[["\tFuncDef("]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[")\n"]] + If[[[func]Name >>]Contains["@"]] + { + deftype <- "\tMethodDef(" + }{ + deftype <- "\tFuncDef(" + } + out <- [text]Append[[[deftype]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[")\n"]] } } @@ -1673,14 +1699,7 @@ #include \"array.c\" #include \"worker.c\" -int main(int argc, char **argv) -{ - blueprint * bp; - int numret; - int idx; - object * inout[3]; - register_builtin_types(); - register_type_byid(TYPE_MUTABLEGLOBAL, sizeof(mutable_object)-sizeof(object), NULL, NULL, NULL);\n\n"] +#include \"main_start.c\" \n\n"] ]Append[ [[program]Type Registry >>]Type Inits[[program]Method Registry >>, [program]Field Registry >>] ] ]Append[Fold[_Global Type Inits C[?, ?, p], "", [program]Global Stores >>]] ]Append[Fold[_Set Consts C Program[?, ?, ?, [program]Type Registry >>], "", constants]] @@ -1688,40 +1707,16 @@ ]Append[Fold[_Global Store Inits C[?, ?, [program]Type Registry >>], "", [program]Global Stores >>]] ]Append[Fold[Init Type Names[?, ?, ?, [program]Type Registry >>], "", [[program]Type Registry >>]Lookup >>]] ]Append[" - rhope(FUNC_List, inout, 0, 1); - for (idx = 0; idx < argc; ++idx) - { - inout[1] = make_String(argv[idx]); - rhope(FUNC_Append, inout, 2, 2); - } - numret = rhope(FUNC_Main, inout, 1, 1); -#ifdef ENABLE_LEAK_DETECTION\n"] +#include \"main_mid.c\" + +#ifdef ENABLE_LEAK_DETECTION\n\n"] ]Append[Fold[_Consts C Release[?, ?, ?, p], "", constants]] ]Append[ " print_mem_info(manager); print_live_object_types(manager); #endif //ENABLE_LEAK_DETECTION - -#ifdef ENABLE_PROFILING - for (idx = 0; idx < END; ++idx) - { - if(profile_counts[idx]) - printf(\"Func: %d\tCount: %llu\tTime: %llu\tAvg: %f\tSelf: %llu\tAvg: %f\tNested Count: %llu\\n\", idx, profile_counts[idx], profile_totals[idx], ((double)profile_totals[idx])/((double)profile_counts[idx]), profile_selftotals[idx], ((double)profile_selftotals[idx])/((double)profile_counts[idx]), profile_nestedcounts[idx]); - } -#endif - if (!numret) - return 0; - if (numret < 0) - return numret; - if (get_blueprint(inout[0])->type_id == TYPE_INT32) - return ((t_Int32 *)inout[0])->Num; - - rhope(FUNC_If, inout, 1, 2); - if (inout[0]) - return 0; - return 1; -}\n\n"] +#include \"main_end.c\"\n\n"] } diff -r 4580c08fd4e8 -r ba35ab624ec2 runtime/blueprint.h --- a/runtime/blueprint.h Wed Jul 27 21:32:40 2011 -0700 +++ b/runtime/blueprint.h Fri Oct 07 00:10:02 2011 -0700 @@ -11,20 +11,17 @@ int32_t _internal_blueprint_eq(object * left, object * right); int32_t _internal_blueprint_rawsize(object * bp); -typedef struct { - blueprint * bp; -} lt_Build; +#define ldec_Build lvar(blueprint *, bp) +LocalsType(ldec_Build, Build) -typedef struct { - blueprint * bp; -} lt_BlueprintSP_Of; -typedef struct { - object * id; -} lt_ID; +#define ldec_BlueprintSP_Of lvar(blueprint *, bp) +LocalsType(ldec_BlueprintSP_Of ,BlueprintSP_Of) -typedef struct { - uint32_t type; -} lt_BlueprintSP_FromSP_ID; +#define ldec_ID lvar(object *, id) +LocalsType(ldec_ID, ID) + +#define ldec_BlueprintSP_FromSP_ID lvar(uint32_t, type) +LocalsType(ldec_BlueprintSP_FromSP_ID, BlueprintSP_FromSP_ID) #endif //BLUEPRINT_H_ diff -r 4580c08fd4e8 -r ba35ab624ec2 runtime/builtin.c --- a/runtime/builtin.c Wed Jul 27 21:32:40 2011 -0700 +++ b/runtime/builtin.c Fri Oct 07 00:10:02 2011 -0700 @@ -104,15 +104,22 @@ object * make_String(char * text) { +#ifdef RAW_FUNC + returntype ret; +#endif object * params[1]; t_Array * arr = (t_Array *)_internal_array_allocnaked(strlen(text), make_Blueprint(TYPE_UINT8)); arr->payload.Length = arr->payload.Storage; memcpy(((char *)arr) + sizeof(t_Array), text, arr->payload.Length); params[0] = (object *)arr; +#ifdef RAW_FUNC + ret = f_String(1, params); + return ret.retvals[0]; +#else rhope(FUNC_String, params, 1, 1); - return params[0]; +#endif } object * make_Bool(int32_t val) @@ -139,18 +146,32 @@ object * make_List(int32_t numels,...) { +#ifdef RAW_FUNC + returntype ret; +#endif int32_t idx, elidx; object * inout[3]; va_list args; va_start(args, numels); +#ifdef RAW_FUNC + ret = f_List(1, inout); + inout[0] = ret.retvals[0]; +#else rhope(FUNC_List, inout, 0, 1); +#endif for (idx = 0; idx < numels; ++idx) { elidx = va_arg(args, int32_t); inout[1] = make_Int32(elidx); inout[2] = va_arg(args, object *); +#ifdef RAW_FUNC + ret = f_Append(3, inout); + inout[0] = ret.retvals[0]; +#else + rhope(FUNC_Append, inout, 3, 3); +#endif } return inout[0]; } diff -r 4580c08fd4e8 -r ba35ab624ec2 runtime/builtinworkers.c --- a/runtime/builtinworkers.c Wed Jul 27 21:32:40 2011 -0700 +++ b/runtime/builtinworkers.c Fri Oct 07 00:10:02 2011 -0700 @@ -1,56 +1,59 @@ Func(Build, - NumParams 1) + NumParams 1, + NumOutputs 1) Param(0, TYPE_BLUEPRINT) - lv_Build->bp = ((t_Blueprint *)(cdata->params[0]))->bp; - release_ref(cdata->params[0]); + lv(Build, bp) = ((t_Blueprint *)(my_params(0)))->bp; + release_ref(my_params(0)); - Ret(0, new_object_bp(lv_Build->bp)) + Ret(0, new_object_bp(lv(Build, bp))) EndFunc(Build) DISPATCH Func(BlueprintSP_Of, - NumParams 1) + NumParams 1, + NumOutputs 1) - lv_BlueprintSP_Of->bp = get_blueprint(cdata->params[0]); - release_ref(cdata->params[0]); + lv(BlueprintSP_Of, bp) = get_blueprint(my_params(0)); + release_ref(my_params(0)); Ret(0, new_object(TYPE_BLUEPRINT)) - ((t_Blueprint *)cdata->params[0])->bp = lv_BlueprintSP_Of->bp; + ((t_Blueprint *)my_outputs(0))->bp = lv(BlueprintSP_Of, bp); EndFunc(BlueprintSP_Of) DISPATCH -Func(ID, NumParams 1) +Func(ID, NumParams 1, NumOutputs 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) + lv(ID, id) = new_object(TYPE_UINT32); + ((t_UInt32 *)lv(ID, id))->Num = ((t_Blueprint *)my_params(0))->bp->type_id; + release_ref(my_params(0)); + Ret(0, lv(ID, id)) EndFunc(ID) DISPATCH -Func(BlueprintSP_FromSP_ID, NumParams 1) +Func(BlueprintSP_FromSP_ID, NumParams 1, NumOutputs 2) 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]) + lv(BlueprintSP_FromSP_ID, type) = ((t_UInt32 *)my_params(0))->Num; + if (lv(BlueprintSP_FromSP_ID, type) >= max_registered_type || !registered_types[lv(BlueprintSP_FromSP_ID, type)]) { + Ret(1, my_params(0)) Ret(0, NULL) } else { - release_ref(cdata->params[0]); + release_ref(my_params(0)); Ret(0, new_object(TYPE_BLUEPRINT)) - ((t_Blueprint *)cdata->params[0])->bp = registered_types[lv_BlueprintSP_FromSP_ID->type]; + ((t_Blueprint *)my_outputs(0))->bp = registered_types[lv(BlueprintSP_FromSP_ID, type)]; Ret(1, NULL) } EndFunc(BlueprintSP_FromSP_ID) DISPATCH -FuncNoLocals(Pause, NumParams 1) +#ifndef RAW_FUNC +FuncNoLocals(Pause, NumParams 1, NumOutputs 1) Param(0, TYPE_WORKER) ct->resume_cdata = my_cdata; @@ -74,7 +77,7 @@ EndFuncNoLocals DISPATCH -FuncNoLocals(Resume, NumParams 2) +FuncNoLocals(Resume, NumParams 2, NumOutputs 2) Param(0, TYPE_CONTEXT) temp_ct = ((t_Context *)my_cdata->params[0])->ct; @@ -216,4 +219,18 @@ } EndFunc(RunSP_Bytecode) DISPATCH +#else +FuncNoLocals(Pause, NumParams 1, NumOutputs 0) + exit(2); +EndFuncNoLocals +FuncNoLocals(Resume, NumParams 2, NumOutputs 0) + exit(2); +EndFuncNoLocals + +FuncNoLocals(RunSP_Bytecode, NumParams 2, NumOutputs 0) + exit(2); +EndFuncNoLocals +#endif //RAW_FUNC + + diff -r 4580c08fd4e8 -r ba35ab624ec2 runtime/context.c --- a/runtime/context.c Wed Jul 27 21:32:40 2011 -0700 +++ b/runtime/context.c Fri Oct 07 00:10:02 2011 -0700 @@ -5,6 +5,8 @@ #include #include +#ifndef RAW_FUNC + context * contextqueue[32]; int32_t cq_readloc=0; int32_t cq_writeloc=0; @@ -126,4 +128,5 @@ if(ct->current_stack->free_space == ct->current_stack->data && ct->current_stack->prev) ct->current_stack = ct->current_stack->prev; } +#endif diff -r 4580c08fd4e8 -r ba35ab624ec2 runtime/context.h --- a/runtime/context.h Wed Jul 27 21:32:40 2011 -0700 +++ b/runtime/context.h Fri Oct 07 00:10:02 2011 -0700 @@ -8,6 +8,11 @@ #define STACK_CHUNK_SIZE 4096-(sizeof(struct stackchunk *)*2+sizeof(char *)) +#ifdef RAW_FUNC +//hack +typedef int context; +#else + typedef struct stackchunk { struct stackchunk * next; struct stackchunk * prev; @@ -23,8 +28,10 @@ calldata *resume_cdata; int32_t resumeable; } context; +#endif Box(context *,ct,Context); +#ifndef RAW_FUNC stackchunk * new_stack(); context * new_context(); void * alloc_stack(context * ct, uint32_t size); @@ -34,5 +41,6 @@ void cqueue_init(); context * get_cqueue(); int32_t put_cqueue(context * ct); +#endif object * make_Context(context * ct); #endif //_CONTEXT_H_ diff -r 4580c08fd4e8 -r ba35ab624ec2 runtime/func.h --- a/runtime/func.h Wed Jul 27 21:32:40 2011 -0700 +++ b/runtime/func.h Fri Oct 07 00:10:02 2011 -0700 @@ -1,8 +1,18 @@ #ifndef _FUNC_H_ #define _FUNC_H_ +#define MethodName(name,type) f_ ## name ## AT_ ## type +#define NumParams +#define NumOutputs +#define CallSpace + typedef struct object object; -typedef struct calldata calldata; +typedef void (*special_func) (object *); + + +#ifdef RAW_FUNC +#include "func_raw.h" +#else typedef enum { NORMAL_RETURN=0, @@ -12,9 +22,22 @@ STACK_UNWIND } returntype; +typedef struct calldata calldata; typedef returntype (*rhope_func)(calldata *); -typedef void (*special_func) (object *); + +#define lv(func,var) lv_ ## func->var +#define lvar(type, name) type name; +#define my_params(num) my_cdata->params[num] +#define child_params(num) cdata->params[num] +#define my_outputs(num) my_cdata->params[num] + +#define result(num) cdata->params[num] +#define numresults cdata->num_params + +#define LocalsType(def,func) typedef struct { def } lt_ ## func; + +#define ResEnum(num,name) RES_ ## num ## _ ## name, #ifdef MULTI_SWITCH #define DispatchEntry(name) case FUNC_##name: goto f_##name; @@ -32,9 +55,6 @@ #define EndThreadEntry &&DO_END_THREAD #endif - -#define MethodName(name,type) f_ ## name ## AT_ ## type - #ifdef ENABLE_PROFILING #define START_PROFILE \ @@ -72,7 +92,7 @@ }\ profile_selftotals[FUNC_ ## name] += ((uint64_t)proftime.tv_sec) * 1000000ULL + ((uint64_t)proftime.tv_usec) - cdata->self_start + cdata->self_accum; -#define Func(name,numparams) \ +#define Func(name,numparams,numret) \ f_ ## name:\ for(idx = numparams; idx < cdata->num_params; ++idx)\ release_ref(cdata->params[idx]); cdata->num_params = numparams;\ @@ -83,7 +103,7 @@ lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));\ my_cdata = cdata; -#define MethodImpl(name,type_name,mytype_id,numparams) \ +#define MethodImpl(name,type_name,mytype_id,numparams,numret) \ f_ ## name ## AT_ ## type_name:\ sf_ ## name ## AT_ ## type_name:\ if (cdata->num_params < 1)\ @@ -118,7 +138,7 @@ free_stack(ct, lv_ ## name);\ func = cdata->func; -#define Func(name,numparams) \ +#define Func(name,numparams,numret) \ f_ ## name:\ for(idx = numparams; idx < cdata->num_params; ++idx)\ release_ref(cdata->params[idx]); cdata->num_params = numparams;\ @@ -126,7 +146,7 @@ lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));\ my_cdata = cdata; -#define MethodImpl(name,type_name,mytype_id,numparams) \ +#define MethodImpl(name,type_name,mytype_id,numparams,numret) \ f_ ## name ## AT_ ## type_name:\ sf_ ## name ## AT_ ## type_name:\ if (cdata->num_params < 1)\ @@ -152,7 +172,7 @@ func = cdata->func; -#define FuncNoLocals(name,numparams) \ +#define FuncNoLocals(name,numparams,numret) \ f_ ## name:\ for(idx = numparams; idx < cdata->num_params; ++idx)\ release_ref(cdata->params[idx]); cdata->num_params = numparams;\ @@ -199,9 +219,6 @@ case type_id:\ goto m_ ## name ## AT_ ## type_name; -#define NumParams -#define CallSpace - #define Param(num,convtypeid) \ if(get_blueprint(cdata->params[num])->type_id != convtypeid)\ {\ @@ -219,7 +236,7 @@ } #define Exception #define FuncDef(name) lt_ ## name * lv_ ## name; -#define MethodDef(name) lt_ ## name ## AT_ ## type_name * lv_ ## name ## AT_ ## type_name; +#define MethodDef(name) lt_ ## name * lv_ ## name; #define PrepCall(callspace) cdata = alloc_cdata(ct, cdata, callspace); @@ -352,5 +369,6 @@ cdata->num_params = numparams;\ goto sf_ ## tocall; - +#endif //RAW_FUNC #endif //_FUNC_H_ + diff -r 4580c08fd4e8 -r ba35ab624ec2 runtime/func_raw.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/runtime/func_raw.h Fri Oct 07 00:10:02 2011 -0700 @@ -0,0 +1,181 @@ + +typedef struct { + int num_ret; + object ** retvals; +} returntype; + +typedef returntype (*rhope_func)(int, object **); + +#define DispatchEntry(name) f_ ## name, +#define ResumeEntry(num,name) +#define ResEnum(num,name) +#define DispatchVar rhope_func func_lookup[] = { DispatchEntries }; +#define EndEntry +#define EndThreadEntry +#define DISPATCH + +#define lv(func,var) lv_ ## var +#define lvar(type, name) type lv_ ## name; +#define my_params(num) params[num] +#define child_params(num) call_params[num] +#define my_outputs(num) retvals[num] + +#define result(num) callret.retvals[num] +#define numresults callret.num_ret + +#define LocalsType(def,func) + +#define Func(name, numparams, numret) \ +returntype f_ ## name(int num_params, object ** params) {\ + ldec_ ## name;\ + static object * retvals[numret];\ + object * call_params[32];\ + int idx, vcparam_offset, last_vcparam;\ + returntype callret,retinfo = {numret, &retvals};\ + for(idx = numparams; idx < num_params; ++idx)\ + release_ref(params[idx]); num_params = numparams; + +#define FuncNoLocals(name, numparams, numret) \ +returntype f_ ## name(int num_params, object ** params) {\ + object * call_params[32];\ + static object * retvals[numret];\ + int idx, vcparam_offset, last_vcparam;\ + returntype callret,retinfo = {numret, &retvals};\ + for(idx = numparams; idx < num_params; ++idx)\ + release_ref(params[idx]); num_params = numparams; + +#define Param(num,convtypeid) \ + if(get_blueprint(params[num])->type_id != convtypeid)\ + {\ + printf("uh oh, need conversion from type %d to type %d for param %d and that's not implemented yet!", get_blueprint(params[num])->type_id, convtypeid, num);\ + exit(1);\ + } + +#define CopiedParam(num,convtypeid) Param(num,convtypeid) params[num] = copy_object(params[num]); + +#define Ret(num,val) retvals[num] = (object *)(val); +#define NumRet(num) + +#define EndFunc(name) return retinfo;} +#define EndFuncNoLocals return retinfo;} + +#define MethodImpl(name,type_name,mytype_id,numparams,numret) \ +returntype f_ ## name ## AT_ ## type_name(int num_params, object ** params) {\ + if (num_params < 1)\ + {\ + printf("Direct call to %s@%s had no arguments!", #name, #type_name);\ + printf("%d\n", *((char *)0));\ + exit(1);\ + }\ + if(get_blueprint(params[0])->type_id != mytype_id)\ + {\ + printf("uh oh, need conversion from type %d to %s(%d) for %s and that's not implemented yet!\n", get_blueprint(params[0])->type_id, #type_name, mytype_id, #name);\ + exit(1);\ + }\ + return m_ ## name ## AT_ ## type_name(num_params, params);\ +}\ +returntype m_ ## name ## AT_ ## type_name(int num_params, object ** params) {\ + ldec_ ## name ## AT_ ## type_name;\ + static object * retvals[numret];\ + object * call_params[32];\ + int idx, vcparam_offset, last_vcparam;\ + returntype callret,retinfo = {numret, &retvals};\ + for(idx = numparams; idx < num_params; ++idx)\ + release_ref(params[idx]); num_params = numparams; + + +#define MethodImplNoLocals(name,type_name,mytype_id,numparams,numret) \ +returntype f_ ## name ## AT_ ## type_name(int num_params, object ** params) {\ + if (num_params < 1)\ + {\ + printf("Direct call to %s@%s had no arguments!", #name, #type_name);\ + exit(1);\ + }\ + if(get_blueprint(params[0])->type_id != mytype_id)\ + {\ + printf("uh oh, need conversion from type %d to %s(%d) for %s and that's not implemented yet!\n", get_blueprint(params[0])->type_id, #type_name, mytype_id, #name);\ + exit(1);\ + }\ + return m_ ## name ## AT_ ## type_name(num_params, params);\ +}\ +returntype m_ ## name ## AT_ ## type_name(int num_params, object ** params) {\ + static object * retvals[numret];\ + object * call_params[32];\ + int idx, vcparam_offset, last_vcparam;\ + returntype callret,retinfo = {numret, &retvals};\ + for(idx = numparams; idx < num_params; ++idx)\ + release_ref(params[idx]); num_params = numparams; + +#define Method(name) \ +returntype f_ ## name(int num_params, object ** params) {\ + switch(get_blueprint(params[0])->type_id)\ + { + +#define EndMethod(mname) \ + default:\ + printf("Type ");\ + fwrite( ((t_Array *)((t_String *)get_blueprint(params[0])->name)->payload.Buffer)+1, 1, ((t_Array *)((t_String *)get_blueprint(params[0])->name)->payload.Buffer)->payload.Length, stdout);\ + printf("(%d) does not implement method %s\n", get_blueprint(params[0])->type_id, #mname);\ + printf("%d\n", *((char *)0));\ + exit(1);\ + }\ +} + +#define MethodDispatch(type_id,name,type_name) \ + case type_id:\ + return m_ ## name ## AT_ ## type_name(num_params, params); + +#define FuncDef(name) returntype f_ ## name(int num_params, object ** params); +#define MethodDef(name) returntype f_ ## name(int num_params, object ** params); returntype m_ ## name(int num_params, object ** params); + +#define PrepCall(callspace) +#define SetParam(num,value) call_params[num] = value; +#define VCRePrepCall(func,numparams,lastnumparams) \ + vcparam_offset = 0;\ + last_vcparam = -1; +#define VCPrepCall(func,numparams) \ + vcparam_offset = 0;\ + last_vcparam = -1; +#define VCSetParam(func,num,value) \ + while((num+vcparam_offset) < ((t_Worker *)func)->payload.Size && ((object **)(((t_Worker *)func)+1))[num+vcparam_offset])\ + {\ + call_params[num+vcparam_offset] = add_ref(((object **)(((t_Worker *)func)+1))[num+vcparam_offset]);\ + ++vcparam_offset;\ + }\ + call_params[num+vcparam_offset] = value;\ + last_vcparam = num+vcparam_offset; + +#define ValCall(tocall,numparams,resumeto,myname)\ + last_vcparam++;\ + while(last_vcparam < ((t_Worker *)tocall)->payload.Size)\ + {\ + if (((object **)(((t_Worker *)tocall)+1))[last_vcparam]) \ + call_params[last_vcparam] = add_ref(((object **)(((t_Worker *)tocall)+1))[last_vcparam]);\ + ++last_vcparam;\ + }\ + callret = func_lookup[((t_Worker *)tocall)->payload.Index](numparams + ((t_Worker *)tocall)->payload.Count, &call_params); + +#define ValCallNoLocals(tocall,numparams,resumeto,myname)\ + last_vcparam++;\ + while(last_vcparam < ((t_Worker *)tocall)->payload.Size)\ + {\ + if (((object **)(((t_Worker *)tocall)+1))[last_vcparam]) \ + call_params[last_vcparam] = add_ref(((object **)(((t_Worker *)tocall)+1))[last_vcparam]);\ + ++last_vcparam;\ + }\ + callret = func_lookup[((t_Worker *)tocall)->payload.Index](numparams + ((t_Worker *)tocall)->payload.Count, &call_params); + +#define ValCallPostlude(resumeto,myname) +#define ValCallNoLocalsPostlude(resumeto,myname) + +#define Call(tocall, numparams, resumeto, myname)\ + callret = f_ ## tocall(numparams, &call_params); + +#define CallNoLocals(tocall, numparams, resumeto, myname)\ + callret = f_ ## tocall(numparams, &call_params); + +#define FreeCall +#define FreeCallMethod(myname,mytype) +#define TPrepCall(callspace) +#define TCall(tocall, numparams) + diff -r 4580c08fd4e8 -r ba35ab624ec2 runtime/localpointers_fragment.c --- a/runtime/localpointers_fragment.c Wed Jul 27 21:32:40 2011 -0700 +++ b/runtime/localpointers_fragment.c Fri Oct 07 00:10:02 2011 -0700 @@ -1,3 +1,6 @@ +#ifdef RAW_FUNC +rhope_func func_lookup[]; +#else ct = new_context(); cdata = alloc_cdata(ct, NULL, callspace); cdata->num_params = numparams; @@ -5,4 +8,6 @@ cdata->params[idx] = params[idx]; cdata->func = END; DISPATCH +#endif + diff -r 4580c08fd4e8 -r ba35ab624ec2 runtime/main_end.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/runtime/main_end.c Fri Oct 07 00:10:02 2011 -0700 @@ -0,0 +1,26 @@ + +#ifdef ENABLE_PROFILING + for (idx = 0; idx < END; ++idx) + { + if(profile_counts[idx]) + printf("Func: %d\tCount: %llu\tTime: %llu\tAvg: %f\tSelf: %llu\tAvg: %f\tNested Count: %llu\n", idx, profile_counts[idx], profile_totals[idx], ((double)profile_totals[idx])/((double)profile_counts[idx]), profile_selftotals[idx], ((double)profile_selftotals[idx])/((double)profile_counts[idx]), profile_nestedcounts[idx]); + } +#endif + if (!numret) + return 0; + if (numret < 0) + return numret; + if (get_blueprint(inout[0])->type_id == TYPE_INT32) + return ((t_Int32 *)inout[0])->Num; + +#ifdef RAW_FUNC + ret = f_If(1, inout); + if (ret.retvals[0]) +#else + rhope(FUNC_If, inout, 1, 2); + if (inout[0]) +#endif + return 0; + return 1; +} + diff -r 4580c08fd4e8 -r ba35ab624ec2 runtime/main_mid.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/runtime/main_mid.c Fri Oct 07 00:10:02 2011 -0700 @@ -0,0 +1,24 @@ +#ifdef RAW_FUNC + ret = f_List(0, inout); + inout[0] = ret.retvals[0]; + for (idx = 0; idx < argc; ++idx) + { + inout[1] = make_String(argv[idx]); + ret = f_Append(2, inout); + inout[0] = ret.retvals[0]; + } + ret = f_Main(1, inout); + numret = ret.num_ret; + if (numret) + inout[0] = ret.retvals[0]; +#else + + rhope(FUNC_List, inout, 0, 1); + for (idx = 0; idx < argc; ++idx) + { + inout[1] = make_String(argv[idx]); + rhope(FUNC_Append, inout, 2, 2); + } + numret = rhope(FUNC_Main, inout, 1, 1); +#endif + diff -r 4580c08fd4e8 -r ba35ab624ec2 runtime/main_start.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/runtime/main_start.c Fri Oct 07 00:10:02 2011 -0700 @@ -0,0 +1,16 @@ +#ifdef RAW_FUNC +#define rhope(func, io, inputs, callspace) ret = func_lookup[func](inputs, io); inout[0] = ret.retvals[0] +#endif + +int main(int argc, char **argv) +{ + blueprint * bp; + int numret; + int idx; +#ifdef RAW_FUNC + returntype ret; +#endif + object * inout[3]; + register_builtin_types(); + register_type_byid(TYPE_MUTABLEGLOBAL, sizeof(mutable_object)-sizeof(object), NULL, NULL, NULL); + diff -r 4580c08fd4e8 -r ba35ab624ec2 runtime/object.c --- a/runtime/object.c Wed Jul 27 21:32:40 2011 -0700 +++ b/runtime/object.c Fri Oct 07 00:10:02 2011 -0700 @@ -1,9 +1,15 @@ #include "object.h" #include "builtin.h" +#ifdef USE_GC +#include +#else #include +#ifndef USE_MALLOC +#include "fixed_alloc.h" +#endif +#endif #include #include -#include "fixed_alloc.h" blueprint ** registered_types = NULL; uint32_t max_registered_type = 0; @@ -129,14 +135,27 @@ object * alloc_object(blueprint * bp) { +#ifdef USE_GC + return GC_malloc(bp->boxed_size); +#else +#ifdef USE_MALLOC + return malloc(bp->boxed_size); +#else return falloc(bp->boxed_size, manager); - //return malloc(bp->boxed_size); +#endif +#endif } +#ifndef USE_GC void dealloc_object(blueprint * bp, object * obj) { +#ifdef USE_MALLOC + free(obj); +#else ffree(obj, bp->boxed_size, manager); +#endif } +#endif object * new_object(uint32_t type) { @@ -155,7 +174,9 @@ if(ret) { ret->bprint = bp; +#ifndef USE_GC rh_atomic_set(ret, refcount, 1); +#endif memset(((char *)ret) + sizeof(object), '\0', bp->size); bp->init(ret); } else { @@ -170,13 +191,23 @@ multisize * ret; if(type >= max_registered_type || !registered_types[type]) return NULL; +#ifdef USE_GC + ret = GC_malloc(sizeof(multisize) + size); +#else +#ifdef USE_MALLOC + ret = malloc(sizeof(multisize) + size); +#else ret = falloc(sizeof(multisize) + size, manager); +#endif +#endif if(ret) { bp = registered_types[type]; ret->base.bprint = bp; ret->size = size; +#ifndef USE_GC rh_atomic_set(&(ret->base), refcount, 1); +#endif memset(((char *)ret) + sizeof(multisize), '\0', size); bp->init((object *)ret); } @@ -188,12 +219,22 @@ object * copy; multisize * mcopy, *mtocopy; blueprint * bp; +#ifndef USE_GC if(rh_atomic_get(tocopy, refcount) == 1) return tocopy; +#endif bp = get_blueprint(tocopy); if(bp->size < 0) { mtocopy = (multisize *)tocopy; +#ifdef USE_GC + mcopy = GC_malloc(sizeof(multisize) + mtocopy->size); +#else +#ifdef USE_MALLOC + mcopy = malloc(sizeof(multisize) + mtocopy->size); +#else mcopy = falloc(sizeof(multisize) + mtocopy->size, manager); +#endif +#endif mcopy->size = mtocopy->size; memcpy(((char *)mcopy)+sizeof(multisize), ((char *)mtocopy)+sizeof(multisize), mtocopy->size); copy = (object *)mcopy; @@ -202,7 +243,9 @@ memcpy(((char *)copy) + sizeof(object), ((char *)tocopy)+sizeof(object), bp->size); } copy->bprint = bp; +#ifndef USE_GC rh_atomic_set(copy, refcount, 1); +#endif bp->copy(copy); release_ref(tocopy); return copy; @@ -217,7 +260,9 @@ dest = alloc_object(bp); memcpy(((char *)dest) + sizeof(object), rawdata, bp->size); dest->bprint = bp; +#ifndef USE_GC rh_atomic_set(dest, refcount, 1); +#endif bp->copy(dest); return dest; } @@ -231,11 +276,13 @@ bp->copy(src); } +#ifndef USE_GC void release_ref(object * obj) { if(rh_atomic_sub_testzero(obj, refcount, 1)) get_blueprint(obj)->free(obj); } +#endif void check_type_storage(type) { @@ -245,7 +292,11 @@ if(type_storage) { type_storage_temp = (type + (type_storage >> 1)); +#ifdef USE_GC + temp = GC_realloc(registered_types, type_storage_temp * sizeof(blueprint *)); +#else temp = realloc(registered_types, type_storage_temp * sizeof(blueprint *)); +#endif if(temp) { registered_types = temp; @@ -254,7 +305,9 @@ } else { +#ifndef USE_GC free(registered_types); +#endif fprintf(stderr, "Couldn't allocate %d bytes for type storage array\n", type_storage_temp * sizeof(blueprint *)); exit(-1); } @@ -264,7 +317,12 @@ type_storage =INITIAL_TYPE_STORAGE; else type_storage = type + 8; +#ifdef USE_GC + registered_types = GC_malloc(type_storage * sizeof(blueprint *)); +#else registered_types = malloc(type_storage * sizeof(blueprint *)); +#endif + if(registered_types) memset(registered_types, '\0', type_storage * sizeof(blueprint *)); else @@ -285,7 +343,9 @@ blueprint * bp = get_blueprint(obj); if(bp->cleanup) bp->cleanup(obj); +#ifndef USE_GC ffree(obj, bp->boxed_size, manager); +#endif } void multi_free(object * obj) @@ -294,17 +354,24 @@ blueprint * bp = get_blueprint(obj); if(bp->cleanup) bp->cleanup(obj); +#ifndef USE_GC ffree(multi, sizeof(multisize) + multi->size, manager); +#endif } blueprint * new_blueprint(uint32_t type, int32_t size, special_func init, special_func copy, special_func cleanup) { +#ifdef USE_GC + blueprint * bp = GC_malloc(sizeof(blueprint)); +#else blueprint * bp = malloc(sizeof(blueprint)); + //dirty hack!, move elsewhere if (!manager) { fixed_alloc_init(); manager = new_mem_manager(); } +#endif if(bp) { bp->size = size; @@ -343,6 +410,7 @@ return register_type_byid(max_registered_type, size, init, copy, cleanup); } +/* void add_method(blueprint * bp, uint32_t methodid, rhope_func impl) { rhope_func * temp; @@ -489,6 +557,7 @@ } bp->setter_lookup[setfieldid-bp->first_setfieldid] = impl; } +*/ blueprint * get_blueprint_byid(uint32_t type) { diff -r 4580c08fd4e8 -r ba35ab624ec2 runtime/object.h --- a/runtime/object.h Wed Jul 27 21:32:40 2011 -0700 +++ b/runtime/object.h Fri Oct 07 00:10:02 2011 -0700 @@ -32,7 +32,9 @@ } blueprint; struct object { +#ifndef USE_GC rh_atomic32(refcount); +#endif blueprint *bprint; }; @@ -66,29 +68,34 @@ #define get_blueprint(object) (object)->bprint +#ifdef USE_GC +#define add_ref(object) object +#define release_ref(object) +#else #define add_ref(object) (rh_atomic_add((object), refcount, 1),object) +void release_ref(object * obj); +#endif -returntype call_method(uint32_t methodid, calldata * params); +/*returntype call_method(uint32_t methodid, calldata * params); returntype set_field(uint32_t setfieldid, calldata * params); -returntype get_field(uint32_t getfieldid, calldata * params); +returntype get_field(uint32_t getfieldid, calldata * params);*/ object * alloc_object(blueprint * bp); void * alloc_variable(uint32_t size); object * new_object(uint32_t type); object * new_object_bp(blueprint * bp); multisize * new_multisize(uint32_t type, uint32_t size); -void release_ref(object * obj); blueprint * register_type_byid(uint32_t type, int32_t size, special_func init, special_func copy, special_func cleanup); blueprint * register_type(int32_t size, special_func init, special_func copy, special_func cleanup); blueprint * new_blueprint(uint32_t type, int32_t size, special_func init, special_func copy, special_func cleanup); void add_method(blueprint * bp, uint32_t methodid, rhope_func impl); void add_getter(blueprint * bp, uint32_t fieldid, rhope_func impl); void add_setter(blueprint * bp, uint32_t fieldid, rhope_func impl); -returntype convert_to(uint32_t convertto, calldata * params); -returntype convert_from(uint32_t convertfrom, calldata * params); +/*returntype convert_to(uint32_t convertto, calldata * params); +returntype convert_from(uint32_t convertfrom, calldata * params);*/ object * copy_object(object * tocopy); object * naked_to_boxed(uint32_t type, void * rawdata); void boxed_to_naked(object * src, void * dest); -returntype coerce_value(uint32_t type, calldata * params); +/*returntype coerce_value(uint32_t type, calldata * params);*/ blueprint * get_blueprint_byid(uint32_t type); extern blueprint ** registered_types; diff -r 4580c08fd4e8 -r ba35ab624ec2 runtime/rhopefuncs_epilog.c --- a/runtime/rhopefuncs_epilog.c Wed Jul 27 21:32:40 2011 -0700 +++ b/runtime/rhopefuncs_epilog.c Fri Oct 07 00:10:02 2011 -0700 @@ -1,4 +1,6 @@ - +#ifdef RAW_FUNC +DispatchVar +#else DO_END: for(idx = 0; idx < cdata->num_params; ++idx) params[idx] = cdata->params[idx]; @@ -36,4 +38,5 @@ } return -1; } +#endif //RAW_FUNC diff -r 4580c08fd4e8 -r ba35ab624ec2 runtime/rhopefuncs_prolog.c --- a/runtime/rhopefuncs_prolog.c Wed Jul 27 21:32:40 2011 -0700 +++ b/runtime/rhopefuncs_prolog.c Fri Oct 07 00:10:02 2011 -0700 @@ -1,3 +1,12 @@ +#ifdef RAW_FUNC +FuncDef(Build) +FuncDef(BlueprintSP_Of) +FuncDef(ID) +FuncDef(BlueprintSP_FromSP_ID) + +object * tmp; +#else + #ifdef ENABLE_PROFILING uint64_t profile_counts[END]; uint64_t profile_nestedcounts[END]; @@ -43,4 +52,5 @@ FuncDef(ID) FuncDef(BlueprintSP_FromSP_ID) void ** lv_RunSP_Bytecode; +#endif //RAW_FUNC diff -r 4580c08fd4e8 -r ba35ab624ec2 runtime/transaction.c --- a/runtime/transaction.c Wed Jul 27 21:32:40 2011 -0700 +++ b/runtime/transaction.c Fri Oct 07 00:10:02 2011 -0700 @@ -1,7 +1,11 @@ #include "transaction.h" #include #include +#ifdef USE_GC +#include +#else #include +#endif rh_mutex(trans_lock) @@ -15,23 +19,32 @@ return &(trans->cells[idx]); trans = trans->chain; } - return NULL; + return NULL; } +#ifdef RAW_FUNC +transaction * cur_transaction; +void real_begin_transaction(int numobjs,...) +#else void begin_transaction(context * ct, int numobjs,...) +#endif { mutable_object *obj; transaction *parent; va_list args; int32_t idx,got_global_lock=0; - parent = ct->transaction ? ct->transaction : NULL; + parent = cur_transaction ? cur_transaction : NULL; - ct->transaction = malloc(sizeof(transaction)+((numobjs-1)*sizeof(trans_cell))); - ct->transaction->parent = parent; - ct->transaction->chain = NULL; +#ifdef USE_GC + cur_transaction = GC_malloc(sizeof(transaction)+((numobjs-1)*sizeof(trans_cell))); +#else + cur_transaction = malloc(sizeof(transaction)+((numobjs-1)*sizeof(trans_cell))); +#endif + cur_transaction->parent = parent; + cur_transaction->chain = NULL; rh_mutex_init(ct->lock); - ct->transaction->num_cells = numobjs; + cur_transaction->num_cells = numobjs; va_start(args, numobjs); if (parent) { @@ -39,22 +52,22 @@ for (idx = 0; idx < numobjs; ++idx) { obj = va_arg(args, mutable_object *); - ct->transaction->cells[idx].obj = obj; - ct->transaction->cells[idx].parent = find_obj_cell(parent, obj); - if (ct->transaction->cells[idx].parent) + cur_transaction->cells[idx].obj = obj; + cur_transaction->cells[idx].parent = find_obj_cell(parent, obj); + if (cur_transaction->cells[idx].parent) { - ct->transaction->cells[idx].local_data = ct->transaction->cells[idx].parent->local_data; - ct->transaction->cells[idx].orig_version = ct->transaction->cells[idx].parent->local_version; + cur_transaction->cells[idx].local_data = cur_transaction->cells[idx].parent->local_data; + cur_transaction->cells[idx].orig_version = cur_transaction->cells[idx].parent->local_version; } else { if (!got_global_lock) { rh_lock(trans_lock); got_global_lock = 1; } - ct->transaction->cells[idx].local_data = obj->data; - ct->transaction->cells[idx].orig_version = obj->version; + cur_transaction->cells[idx].local_data = obj->data; + cur_transaction->cells[idx].orig_version = obj->version; } - ct->transaction->cells[idx].local_version = 0; + cur_transaction->cells[idx].local_version = 0; } if (got_global_lock) { @@ -66,16 +79,19 @@ for (idx = 0; idx < numobjs; ++idx) { obj = va_arg(args, mutable_object *); - ct->transaction->cells[idx].obj = obj; - ct->transaction->cells[idx].parent = NULL; - ct->transaction->cells[idx].local_data = add_ref(obj->data); - ct->transaction->cells[idx].orig_version = obj->version; - ct->transaction->cells[idx].local_version = 0; + cur_transaction->cells[idx].obj = obj; + cur_transaction->cells[idx].parent = NULL; + cur_transaction->cells[idx].local_data = add_ref(obj->data); + cur_transaction->cells[idx].orig_version = obj->version; + cur_transaction->cells[idx].local_version = 0; } rh_unlock(trans_lock); } } +#ifdef USE_GC +#define free_trans(trans) +#else void free_trans(transaction * trans) { if (trans) @@ -84,17 +100,22 @@ free(trans); } } +#endif +#ifdef RAW_FUNC +int32_t real_commit_transaction(int32_t readonly) +#else int32_t commit_transaction(context * ct, int32_t readonly) +#endif { transaction *tmp_trans, *current; object * tmp_obj; int32_t idx,numaddparent; - if (ct->transaction->parent) + if (cur_transaction->parent) { - rh_lock(ct->transaction->parent->lock); - current = ct->transaction; + rh_lock(cur_transaction->parent->lock); + current = cur_transaction; while(current) { for (idx = 0; idx < current->num_cells; ++idx) @@ -103,13 +124,13 @@ { if (current->cells[idx].parent->local_version != current->cells[idx].orig_version) { - rh_unlock(ct->transaction->parent->lock); + rh_unlock(cur_transaction->parent->lock); return 0; } } else { - if(find_obj_cell(ct->transaction->parent->chain, current->cells[idx].obj)) + if(find_obj_cell(cur_transaction->parent->chain, current->cells[idx].obj)) { - rh_unlock(ct->transaction->parent->lock); + rh_unlock(cur_transaction->parent->lock); return 0; } else numaddparent++; @@ -119,45 +140,49 @@ } if (numaddparent) { +#ifdef USE_GC + tmp_trans = GC_malloc(sizeof(transaction)+(numaddparent - 1)*sizeof(trans_cell)); +#else tmp_trans = malloc(sizeof(transaction)+(numaddparent - 1)*sizeof(trans_cell)); - tmp_trans->chain = ct->transaction->parent->chain; +#endif + tmp_trans->chain = cur_transaction->parent->chain; tmp_trans->num_cells = 0; - ct->transaction->parent->chain = tmp_trans; + cur_transaction->parent->chain = tmp_trans; } - current = ct->transaction; + current = cur_transaction; while(current) { - for (idx = 0; idx < ct->transaction->num_cells; ++idx) + for (idx = 0; idx < cur_transaction->num_cells; ++idx) { - if (ct->transaction->cells[idx].parent) + if (cur_transaction->cells[idx].parent) { //Only commit a particular object if a change has been made - if (ct->transaction->cells[idx].local_version) + if (cur_transaction->cells[idx].local_version) { - tmp_obj = ct->transaction->cells[idx].parent->local_data; - ct->transaction->cells[idx].parent->local_data = ct->transaction->cells[idx].local_data; + tmp_obj = cur_transaction->cells[idx].parent->local_data; + cur_transaction->cells[idx].parent->local_data = cur_transaction->cells[idx].local_data; release_ref(tmp_obj); - ct->transaction->cells[idx].parent->local_version++; + cur_transaction->cells[idx].parent->local_version++; } else { - release_ref(ct->transaction->cells[idx].local_data); + release_ref(cur_transaction->cells[idx].local_data); } } else { - memcpy(&(tmp_trans->cells[tmp_trans->num_cells++]), &(ct->transaction->cells[idx]), sizeof(trans_cell)); + memcpy(&(tmp_trans->cells[tmp_trans->num_cells++]), &(cur_transaction->cells[idx]), sizeof(trans_cell)); } } current = current->chain; } - rh_unlock(ct->transaction->parent->lock); + rh_unlock(cur_transaction->parent->lock); } else { if(readonly) { - for (idx = 0; idx < ct->transaction->num_cells; ++idx) + for (idx = 0; idx < cur_transaction->num_cells; ++idx) { - release_ref(ct->transaction->cells[idx].local_data); + release_ref(cur_transaction->cells[idx].local_data); } } else { rh_lock(trans_lock); - current = ct->transaction; + current = cur_transaction; while(current) { for (idx = 0; idx < current->num_cells; ++idx) @@ -170,7 +195,7 @@ } current = current->chain; } - current = ct->transaction; + current = cur_transaction; while(current) { for (idx = 0; idx < current->num_cells; ++idx) @@ -191,21 +216,26 @@ rh_unlock(trans_lock); } } - rh_mutex_del(ct->transaction->lock); - tmp_trans = ct->transaction->parent; - free_trans(ct->transaction); - ct->transaction = tmp_trans; + rh_mutex_del(cur_transaction->lock); + tmp_trans = cur_transaction->parent; + free_trans(cur_transaction); + cur_transaction = tmp_trans; return 1; } + +#ifdef RAW_FUNC +void prep_retry() +#else void prep_retry(context * ct) +#endif { transaction * current; int32_t idx,got_global_lock=0; - if (ct->transaction->parent) + if (cur_transaction->parent) { - rh_lock(ct->transaction->parent->lock); - current = ct->transaction; + rh_lock(cur_transaction->parent->lock); + current = cur_transaction; while(current) { for (idx = 0; idx < current->num_cells; ++idx) @@ -213,7 +243,7 @@ release_ref(current->cells[idx].local_data); current->cells[idx].local_version = 0; if (!current->cells[idx].parent) - current->cells[idx].parent = find_obj_cell(ct->transaction->parent, current->cells[idx].obj); + current->cells[idx].parent = find_obj_cell(cur_transaction->parent, current->cells[idx].obj); if (current->cells[idx].parent) { current->cells[idx].local_data = current->cells[idx].parent->local_data; @@ -234,10 +264,10 @@ { rh_unlock(trans_lock); } - rh_unlock(ct->transaction->parent->lock); + rh_unlock(cur_transaction->parent->lock); } else { rh_lock(trans_lock); - current = ct->transaction; + current = cur_transaction; while(current) { for (idx = 0; idx < current->num_cells; ++idx) diff -r 4580c08fd4e8 -r ba35ab624ec2 runtime/transaction.h --- a/runtime/transaction.h Wed Jul 27 21:32:40 2011 -0700 +++ b/runtime/transaction.h Fri Oct 07 00:10:02 2011 -0700 @@ -33,8 +33,19 @@ #include "context.h" trans_cell * find_obj_cell(transaction * trans, mutable_object * to_find); +#ifdef RAW_FUNC +#define begin_transaction(ct, numobjs, ...) real_begin_transaction(numobjs, __VA_ARGS__) +void real_begin_transaction(int numobjs,...); +#define commit_transaction(ct, readonly) real_commit_transaction(readonly) +int32_t real_commit_transaction(int32_t readonly); +#define prep_retry(ct) real_prep_retry() +void prep_retry(); +extern transaction * cur_transaction; +#else void begin_transaction(struct context * ct, int numobjs,...); int32_t commit_transaction(struct context * ct, int32_t readonly); void prep_retry(struct context * ct); +#define cur_transaction ct->transaction +#endif #endif //TRANSACTION_H_