diff test/fib.c @ 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 b71bab34ec65
line wrap: on
line diff
--- a/test/fib.c	Tue May 19 23:29:55 2009 -0400
+++ b/test/fib.c	Mon May 25 23:34:36 2009 -0400
@@ -1,14 +1,15 @@
 #include <stdio.h>
 #include "builtin.h"
 #include "object.h"
-#include "integer.h"
 #include "context.h"
 #include "func.h"
+#include "integer.h"
 
 typedef struct
 {
 	object * work1;
 	object * work2;
+	object * out;
 } fib_t;
 
 object * const_1;
@@ -19,58 +20,97 @@
 	CallSpace 2,
 	fib_t);
 	
-	MCall(METHOD_SUB, 
+	locals->out = NULL;
+	
+	
+	call->params[0] = add_ref(cdata->params[0]);
+	call->params[1] = add_ref(const_2);
+	MCall(METHOD_LESS, 2)
+	
+	MCall(METHOD_IF, 1)
+	
+	if(call->params[0])
+		locals->out = add_ref(const_1);
+	
+	if(call->params[1])
+	{
+		call->params[0] = add_ref(cdata->params[0]);
+		call->params[1] = add_ref(const_1);
+		MCall(METHOD_SUB, 2)
+		locals->work1 = call->params[0];
+		
+		call->params[0] = add_ref(cdata->params[0]);
+		call->params[1] = add_ref(const_2);
+		MCall(METHOD_SUB, 2)
+		locals->work2 = call->params[0];
+		
+		call->params[0] = locals->work1;
+		Call(Fib, 1)
+		locals->work1 = call->params[0];
+		
+		call->params[0] = locals->work2;
+		Call(Fib, 1)
+		locals->work2 = call->params[0];
+		
+		if(!locals->out)
+		{
+			release_ref(cdata->params[0]);
+			cdata->params[0] = locals->work1;
+			cdata->params[1] = locals->work2;
+			TMCall(METHOD_ADD, 2)
+		}
+	}
+	release_ref(cdata->params[0]);
+	Ret(0, locals->out)
+	
 EndFunc
 
 FuncNoLocals(Main,
-	NumParams 0,
+	NumParams 1,
 	CallSpace 2)
 	
-	call->params[0] = make_Int32(2);
-	call->params[1] = make_Int32(3);
-	call->num_params = 2;
-	call->resume = 0;
-	ret = call_method(METHOD_ADD, call);
-	while(ret == TAIL_RETURN)
-		ret = call->tail_func(call);
-	if(ret == EXCEPTION_RETURN) {
-		Ret(0,call->params[0]);
-		return ret;
-	}
-	call->params[1] = make_Int32(1);
-	call->resume = 0;
-	ret = call_method(METHOD_SUB, call);
-	while(ret == TAIL_RETURN)
-		ret = call->tail_func(call);
-	if(ret == EXCEPTION_RETURN) {
-		Ret(0,call->params[0]);
-		return ret;
-	}
-	Ret(0,call->params[0])
+	TCall(Fib, 1)
 EndFunc
 
+#ifdef _WIN32
+	#include "windows.h"
+#endif
 
 int main(int argc, char ** argv)
 {
 	returntype ret;
 	calldata *cdata;
 	context * ct;
+	#ifdef _WIN32
+		DWORD dur;
+		dur = timeGetTime();
+	#endif
+	if(argc < 2)
+	{
+		puts("not enought arguments");
+		return -1;
+	}
 	register_builtin_types();
 	ct = new_context();
 	cdata = alloc_cdata(ct, 1);
-	cdata->num_params = 0;
+	cdata->num_params = 1;
 	cdata->resume = 0;
 	
 	const_1 = make_Int32(1);
 	const_2 = make_Int32(2);
-	ret = _f_Main(cdata);
+	cdata->params[0] = make_Int32(atoi(argv[1]));
+	ret = f_Main(cdata);
 	while(ret == TAIL_RETURN)
 		ret = cdata->tail_func(cdata);
 	if(ret == EXCEPTION_RETURN) {
 		puts("Exception!");
 		return -1;
 	}
-	printf("Result: %d\n", ((_t_Int32 *)cdata->params[0])->num);
+	printf("Result: %d\n", ((t_Int32 *)cdata->params[0])->num);
+	#ifdef _WIN32
+		dur = timeGetTime()-dur;
+		printf("Took %d milliseconds\n", dur);
+	#endif
 	return 0;
 }