view runtime/integer.c @ 7:d61550e2c001

Added current work on new runtime
author Mike Pavone <pavone@retrodev.com>
date Wed, 13 May 2009 00:47:40 -0400
parents
children 8d74ef7fa357
line wrap: on
line source

#include "integer.h"
#include "builtin.h"

Method(_PL_,Int32,2,
	_t_Int32 * left; _t_Int32 * right; calldata convd; returntype ret; int i)
	convd.params[0] = cdata->params[0];
	convd.num_params = 1;
	switch(coerce_value(TYPE_INT32, &convd))
	{
	case TAIL_RETURN:
		do {
			ret = convd.tail_func(&convd);
		} while(ret == TAIL_RETURN);
		//TODO: Support STACK_UNWIND
		if(ret == EXCEPTION_RETURN)
			goto exception_convert_left;
	case EXCEPTION_RETURN:
		goto exception_convert_left;
	}
	left = (_t_Int32 *)copy_object(convd.params[0]);
	cdata->params[0] = (object *)left;
	convd.params[0] = cdata->params[1];
	switch(coerce_value(TYPE_INT32, &convd))
	{
	case TAIL_RETURN:
		do {
			ret = convd.tail_func(&convd);
		} while(ret == TAIL_RETURN);
		//TODO: Support STACK_UNWIND
		if(ret == EXCEPTION_RETURN)
			goto exception_convert_right;
	case EXCEPTION_RETURN:
		goto exception_convert_right;
	}
	right = (_t_Int32 *)convd.params[0];
	left->num += right->num;
	release_ref((object *)right);
	return NORMAL_RETURN;
	
exception_convert_left:
	//The first params hould have been released when the exception occurred
	for(i = 1; i < cdata->num_params; ++i)
		release_ref(cdata->params[i]);
	//Move exception to our calldata struct
	cdata->params[0] = convd.params[0];
	return EXCEPTION_RETURN;
exception_convert_right:
	//The second param hould have been released when the exception occurred
	for(i = 0; i < cdata->num_params; ++i)
		if(i != 1)
			release_ref(cdata->params[i]);
	//Move exception to our calldata struct
	cdata->params[0] = convd.params[0];
	return EXCEPTION_RETURN;
}

Method(_MN_,Int32,2,
	_t_Int32 * left; _t_Int32 * right; calldata convd; returntype ret; int i)
	convd.params[0] = cdata->params[0];
	convd.num_params = 1;
	switch(coerce_value(TYPE_INT32, &convd))
	{
	case TAIL_RETURN:
		do {
			ret = convd.tail_func(&convd);
		} while(ret == TAIL_RETURN);
		//TODO: Support STACK_UNWIND
		if(ret == EXCEPTION_RETURN)
			goto exception_convert_left;
	case EXCEPTION_RETURN:
		goto exception_convert_left;
	}
	left = (_t_Int32 *)copy_object(convd.params[0]);
	cdata->params[0] = (object *)left;
	convd.params[0] = cdata->params[1];
	switch(coerce_value(TYPE_INT32, &convd))
	{
	case TAIL_RETURN:
		do {
			ret = convd.tail_func(&convd);
		} while(ret == TAIL_RETURN);
		//TODO: Support STACK_UNWIND
		if(ret == EXCEPTION_RETURN)
			goto exception_convert_right;
	case EXCEPTION_RETURN:
		goto exception_convert_right;
	}
	right = (_t_Int32 *)convd.params[0];
	left->num -= right->num;
	release_ref((object *)right);
	return NORMAL_RETURN;
	
exception_convert_left:
	//The first params hould have been released when the exception occurred
	for(i = 1; i < cdata->num_params; ++i)
		release_ref(cdata->params[i]);
	//Move exception to our calldata struct
	cdata->params[0] = convd.params[0];
	return EXCEPTION_RETURN;
exception_convert_right:
	//The second param hould have been released when the exception occurred
	for(i = 0; i < cdata->num_params; ++i)
		if(i != 1)
			release_ref(cdata->params[i]);
	//Move exception to our calldata struct
	cdata->params[0] = convd.params[0];
	return EXCEPTION_RETURN;
}

object * make_Int32(int32_t val)
{
	_t_Int32 * obj;
	object * ret = new_object(TYPE_INT32);
	obj = (_t_Int32 *)ret;
	obj->num = val;
	return ret;
}