view test/fib.c @ 11:3021dac0d8f5

Stack unwind is so close I can almost taste it
author Mike Pavone <pavone@retrodev.com>
date Tue, 19 May 2009 23:29:55 -0400
parents
children 31f8182f3433
line wrap: on
line source

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

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

object * const_1;
object * const_2;

Func(Fib,
	NumParams 1,
	CallSpace 2,
	fib_t);
	
	MCall(METHOD_SUB, 
EndFunc

FuncNoLocals(Main,
	NumParams 0,
	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])
EndFunc


int main(int argc, char ** argv)
{
	returntype ret;
	calldata *cdata;
	context * ct;
	register_builtin_types();
	ct = new_context();
	cdata = alloc_cdata(ct, 1);
	cdata->num_params = 0;
	cdata->resume = 0;
	
	const_1 = make_Int32(1);
	const_2 = make_Int32(2);
	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);
	return 0;
}