diff runtime/builtinworkers.c @ 186:ba35ab624ec2

Add support for raw C function output from C backend as well as an option to use Boehm-GC instead of reference counting
author Mike Pavone <pavone@retrodev.com>
date Fri, 07 Oct 2011 00:10:02 -0700
parents e57c151f351e
children
line wrap: on
line diff
--- 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
+
+