diff runtime/func.h @ 100:f51c4c17457c

Broken port of parser to compiler
author Mike Pavone <pavone@retrodev.com>
date Mon, 09 Aug 2010 02:03:57 -0400
parents 6d10b5b9ebc3
children f4fc0a98088a
line wrap: on
line diff
--- a/runtime/func.h	Fri Aug 06 01:42:37 2010 -0400
+++ b/runtime/func.h	Mon Aug 09 02:03:57 2010 -0400
@@ -14,21 +14,21 @@
 
 
 typedef returntype (*rhope_func)(calldata *);
-typedef void (*special_func) (object *);
-
-#ifdef MULTI_SWITCH
-#define DispatchEntry(name) case FUNC_##name: goto f_##name;
-#define ResumeEntry(num,name) case RES_##num##_##name: goto r##num##_##name;
-#define DispatchVar
-#define DISPATCH switch(func) { DispatchEntries }
-#define EndEntry case END: goto DO_END;
-#else
-#define DispatchEntry(name) &&f_##name,
-#define ResumeEntry(num,name) &&r##num##_##name,
-#define DispatchVar void * funcs[] = { DispatchEntries };
-#define DISPATCH goto *funcs[func];
-#define EndEntry &&DO_END
-#endif
+typedef void (*special_func) (object *);
+
+#ifdef MULTI_SWITCH
+#define DispatchEntry(name) case FUNC_##name: goto f_##name;
+#define ResumeEntry(num,name) case RES_##num##_##name: goto r##num##_##name;
+#define DispatchVar
+#define DISPATCH switch(func) { DispatchEntries }
+#define EndEntry case END: goto DO_END;
+#else
+#define DispatchEntry(name) &&f_##name,
+#define ResumeEntry(num,name) &&r##num##_##name,
+#define DispatchVar void * funcs[] = { DispatchEntries };
+#define DISPATCH goto *funcs[func];
+#define EndEntry &&DO_END
+#endif
 
 
 #define MethodName(name,type) f_ ## name ## AT_ ## type
@@ -134,38 +134,48 @@
 
 #define PrepCall(callspace) cdata = alloc_cdata(ct, cdata, callspace);
 
-#define SetParam(num,value) cdata->params[num] = value;
-
-#define VCPrepCall(func,numparams) \
-	cdata = alloc_cdata(ct, cdata, numparams + ((t_Worker *)func)->payload.Count);\
-	vcparam_offset = 0;
-
-#define VCSetParam(func,num,value) \
-	while((num+vcparam_offset) < ((t_Worker *)func)->payload.Size && ((object **)(((t_Worker *)func)+1))[num+vcparam_offset])\
-	{\
-		cdata->params[num+vcparam_offset] = add_ref(((object **)(((t_Worker *)func)+1))[num+vcparam_offset]);\
-		++vcparam_offset;\
-	}\
-	cdata->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]) \
-			cdata->params[last_vcparam] = add_ref(((object **)(((t_Worker *)tocall)+1))[last_vcparam]);\
-		++last_vcparam;\
-	}\
+#define SetParam(num,value) cdata->params[num] = value;
+
+
+#define VCRePrepCall(func,numparams,lastnumparams) \
+	if(numparams + ((t_Worker *)func)->payload.Count > lastnumparams)\
+	{\
+		temp_cdata = cdata->lastframe;\
+		free_stack(ct, cdata);\
+		cdata = alloc_cdata(ct, temp_cdata, numparams + ((t_Worker *)func)->payload.Count);\
+	}\
+	vcparam_offset = 0;
+
+#define VCPrepCall(func,numparams) \
+	cdata = alloc_cdata(ct, cdata, numparams + ((t_Worker *)func)->payload.Count);\
+	vcparam_offset = 0;
+
+#define VCSetParam(func,num,value) \
+	while((num+vcparam_offset) < ((t_Worker *)func)->payload.Size && ((object **)(((t_Worker *)func)+1))[num+vcparam_offset])\
+	{\
+		cdata->params[num+vcparam_offset] = add_ref(((object **)(((t_Worker *)func)+1))[num+vcparam_offset]);\
+		++vcparam_offset;\
+	}\
+	cdata->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]) \
+			cdata->params[last_vcparam] = add_ref(((object **)(((t_Worker *)tocall)+1))[last_vcparam]);\
+		++last_vcparam;\
+	}\
 	cdata->func = RES_  ## resumeto ## _ ## myname;\
-	cdata->num_params = numparams + ((t_Worker *)tocall)->payload.Count;\
-	cdata->vars = lv_ ## myname;\
-	func = ((t_Worker *)tocall)->payload.Index;
-
-#define ValCallPostlude(resumeto,myname)\
-r ## resumeto ## _ ## myname:\
+	cdata->num_params = numparams + ((t_Worker *)tocall)->payload.Count;\
+	cdata->vars = lv_ ## myname;\
+	func = ((t_Worker *)tocall)->payload.Index;
+
+#define ValCallPostlude(resumeto,myname)\
+r ## resumeto ## _ ## myname:\
 	my_cdata = cdata->lastframe;\
-	lv_ ## myname = cdata->vars;
+	lv_ ## myname = cdata->vars;
 
 
 #define Call(tocall, numparams, resumeto, myname)\