diff runtime/func.h @ 12:31f8182f3433

Finished fib test and did some small work on the c backend
author Mike Pavone <pavone@retrodev.com>
date Mon, 25 May 2009 23:34:36 -0400
parents 3021dac0d8f5
children 3498713c3dc9
line wrap: on
line diff
--- a/runtime/func.h	Tue May 19 23:29:55 2009 -0400
+++ b/runtime/func.h	Mon May 25 23:34:36 2009 -0400
@@ -13,10 +13,10 @@
 typedef returntype (*rhope_func)(struct calldata *);
 typedef void (*special_func) (struct object *);
 
-#define MethodName(name,type) _f_ ## name ## _AT_ ## type
+#define MethodName(name,type) f_ ## name ## _AT_ ## type
 
 #define Func(name,numparams,callspace,localtype) \
-	returntype _f_ ## name (calldata * cdata)\
+	returntype f_ ## name (calldata * cdata)\
 	{\
 		localtype *locals;\
 		calldata *call;\
@@ -24,8 +24,8 @@
 		int idx;\
 		if(cdata->resume)\
 		{\
+			call = cdata->call;\
 			locals = cdata->locals;\
-			call = (calldata *)(((char *)cdata->locals) + sizeof(localtype));\
 		}\
 		switch(cdata->resume)\
 		{\
@@ -33,10 +33,11 @@
 			for(idx = numparams; idx < cdata->num_params; ++idx)\
 				release_ref(cdata->params[idx]); cdata->num_params = numparams;\
 			cdata->num_params = numparams;\
-			cdata->locals = call = alloc_cdata(cdata->ct, callspace);
+			cdata->call = call = alloc_cdata(cdata->ct, callspace);\
+			cdata->locals = locals = alloc_stack(cdata->ct, sizeof(localtype));
 
 #define FuncNoLocals(name,numparams,callspace) \
-	returntype _f_ ## name (calldata * cdata)\
+	returntype f_ ## name (calldata * cdata)\
 	{\
 		calldata *call;\
 		returntype ret;\
@@ -52,6 +53,7 @@
 			cdata->locals = call = alloc_cdata(cdata->ct, callspace);
 
 #define EndFunc	\
+			free_stack(cdata->ct, call);\
 			return NORMAL_RETURN;\
 		}\
 	}
@@ -65,8 +67,8 @@
 		int idx;\
 		if(cdata->resume)\
 		{\
+			call = cdata->call;\
 			locals = cdata->locals;\
-			call = (calldata *)(((char *)cdata->locals) + sizeof(localtype));\
 		}\
 		switch(cdata->resume)\
 		{\
@@ -74,7 +76,8 @@
 			for(idx = numparams; idx < cdata->num_params; ++idx)\
 				release_ref(cdata->params[idx]); cdata->num_params = numparams;\
 			cdata->num_params = numparams;\
-			cdata->locals = call = alloc_cdata(cdata->ct, callspace);
+			cdata->call = call = alloc_cdata(cdata->ct, callspace);\
+			cdata->locals = locals = alloc_stack(cdata->ct, sizeof(localtype));
 
 #define MethodNoLocals(name,type,numparams,callspace) \
 	returntype MethodName(name,type) (calldata * cdata)\
@@ -95,7 +98,7 @@
 #define NumParams
 #define CallSpace
 
-#define ParamBase(num,var,type,convtypeid) \
+#define Param(num,convtypeid) \
 	call->params[0] = cdata->params[num];\
 	call->resume = 0;\
 	ret = coerce_value(convtypeid, call);\
@@ -104,32 +107,34 @@
 	if(ret == EXCEPTION_RETURN)\
 	{\
 		for(idx = 0; idx < cdata->num_params; ++idx)\
-			if(idx != num)\
+			if(idx != num && cdata->params[idx])\
 				release_ref(cdata->params[idx]);\
 		cdata->params[0] = call->params[0];\
+		free_stack(cdata->ct, call);\
 		return ret;\
 	}\
 	cdata->params[num] = call->params[0];
 
-#define Param(num,var,type,convtypeid) ParamBase(num,var,type,convtypeid) var = (_t_##type *)(cdata->params[num]);
-#define CopiedParam(num,var,type,convtypeid) ParamBase(num,var,type,convtypeid) cdata->params[num] = copy_object(cdata->params[num]); var = (_t_##type *)(cdata->params[num]);
+#define CopiedParam(num,convtypeid) Param(num,convtypeid) cdata->params[num] = copy_object(cdata->params[num]);
 #define Ret(num,val) cdata->params[num] = (object *)(val);
 #define Return return NORMAL_RETURN;
 #define Exception
-#define FuncDef(name) returntype _f_ ## name (calldata * cdata);
+#define FuncDef(name) returntype f_ ## name (calldata * cdata);
 #define MethodDef(name,type) returntype MethodName(name,type) (calldata * cdata);
 
 #define Call(func, numparams)\
 	call->num_params = numparams;\
 	call->resume = 0;\
-	ret = _f_ ## func (call);\
+	ret = f_ ## func (call);\
 	while(ret == TAIL_RETURN)\
 		ret = call->tail_func(call);\
 	if(ret == EXCEPTION_RETURN)\
 	{\
 		for(idx = 0; idx < cdata->num_params; ++idx)\
-			release_ref(cdata->params[idx]);\
+			if(cdata->params[idx])\
+				release_ref(cdata->params[idx]);\
 		cdata->params[0] = call->params[0];\
+		free_stack(cdata->ct, call);\
 		return ret;\
 	}
 	
@@ -142,9 +147,26 @@
 	if(ret == EXCEPTION_RETURN)\
 	{\
 		for(idx = 0; idx < cdata->num_params; ++idx)\
-			release_ref(cdata->params[idx]);\
+			if(cdata->params[idx])\
+				release_ref(cdata->params[idx]);\
 		cdata->params[0] = call->params[0];\
+		free_stack(cdata->ct, call);\
 		return ret;\
 	}
 
+#define TMCall(methodid, numparams)\
+	free_stack(cdata->ct, call);\
+	cdata->num_params = numparams;\
+	cdata->resume = 0;\
+	ret = call_method(methodid, cdata);\
+	return ret;
+	
+#define TCall(func, numparams)\
+	free_stack(cdata->ct, call);\
+	cdata->num_params = numparams;\
+	cdata->resume = 0;\
+	cdata->tail_func = f_ ## func;\
+	return TAIL_RETURN;
+	
+	
 #endif //_FUNC_H_
\ No newline at end of file