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