diff 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 diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/runtime/integer.c	Wed May 13 00:47:40 2009 -0400
@@ -0,0 +1,117 @@
+#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;
+}