view test/fib.c @ 15:b71bab34ec65

Added forgotten release_ref to fib test
author Mike Pavone <pavone@retrodev.com>
date Tue, 26 May 2009 23:36:41 -0400
parents 31f8182f3433
children d4b44ae2e34a
line wrap: on
line source

#include <stdio.h>
#include "builtin.h"
#include "object.h"
#include "context.h"
#include "func.h"
#include "integer.h"

typedef struct
{
	object * work1;
	object * work2;
	object * out;
} fib_t;

object * const_1;
object * const_2;

Func(Fib,
	NumParams 1,
	CallSpace 2,
	fib_t);
	
	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])
	{
		release_ref(call->params[0]);
		locals->out = add_ref(const_1);
	}
	
	if(call->params[1])
	{
		release_ref(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 1,
	CallSpace 2)
	
	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 = 1;
	cdata->resume = 0;
	
	const_1 = make_Int32(1);
	const_2 = make_Int32(2);
	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);
	#ifdef _WIN32
		dur = timeGetTime()-dur;
		printf("Took %d milliseconds\n", dur);
	#endif
	return 0;
}