view 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 source

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