diff runtime/builtinworkers.c @ 162:bac2c74801f0

Move some C code out of cbackend_c.rhope into separate include files
author Mike Pavone <pavone@retrodev.com>
date Sun, 09 Jan 2011 22:51:10 -0500
parents
children 327bcf35e094
line wrap: on
line diff
--- /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
+