Mercurial > repos > rhope
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; +}