mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Clean up value.h and mrb_value boxing
This commit is contained in:
committed by
Yukihiro "Matz" Matsumoto
parent
5c50bcd20a
commit
249f05e7d7
+1
-1
@@ -1500,7 +1500,7 @@ undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a)
|
||||
mrb_name_error(mrb, a, "undefined method '%S' for class '%S'", mrb_sym2str(mrb, a), mrb_obj_value(c));
|
||||
}
|
||||
else {
|
||||
MRB_SET_VALUE(m, MRB_TT_PROC, value.p, 0);
|
||||
SET_PROC_VALUE(m, 0);
|
||||
mrb_define_method_vm(mrb, c, a, m);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -148,7 +148,7 @@ mrb_obj_id(mrb_value obj)
|
||||
|
||||
#ifdef MRB_WORD_BOXING
|
||||
mrb_value
|
||||
mrb_float_value(mrb_state *mrb, mrb_float f)
|
||||
word_boxing_mrb_float_value(mrb_state *mrb, mrb_float f)
|
||||
{
|
||||
mrb_value v;
|
||||
|
||||
@@ -158,7 +158,7 @@ mrb_float_value(mrb_state *mrb, mrb_float f)
|
||||
}
|
||||
|
||||
mrb_value
|
||||
mrb_float_pool(mrb_state *mrb, mrb_float f)
|
||||
word_boxing_mrb_float_pool(mrb_state *mrb, mrb_float f)
|
||||
{
|
||||
struct RFloat *nf = (struct RFloat *)mrb_malloc(mrb, sizeof(struct RFloat));
|
||||
nf->tt = MRB_TT_FLOAT;
|
||||
@@ -168,7 +168,7 @@ mrb_float_pool(mrb_state *mrb, mrb_float f)
|
||||
}
|
||||
|
||||
mrb_value
|
||||
mrb_cptr_value(mrb_state *mrb, void *p)
|
||||
word_boxing_mrb_cptr_value(mrb_state *mrb, void *p)
|
||||
{
|
||||
mrb_value v;
|
||||
|
||||
|
||||
+1
-5
@@ -687,12 +687,8 @@ int_to_i(mrb_state *mrb, mrb_value num)
|
||||
return num;
|
||||
}
|
||||
|
||||
#ifdef MRB_FIXNUM_SHIFT
|
||||
#define SQRT_INT_MAX ((mrb_int)1<<((MRB_INT_BIT-1-MRB_FIXNUM_SHIFT)/2))
|
||||
#else
|
||||
#define SQRT_INT_MAX ((mrb_int)1<<((MRB_INT_BIT-1)/2))
|
||||
#endif
|
||||
/*tests if N*N would overflow*/
|
||||
#define SQRT_INT_MAX ((mrb_int)1<<((MRB_INT_BIT-1-MRB_FIXNUM_SHIFT)/2))
|
||||
#define FIT_SQRT_INT(n) (((n)<SQRT_INT_MAX)&&((n)>=-SQRT_INT_MAX))
|
||||
|
||||
mrb_value
|
||||
|
||||
+2
-2
@@ -19,9 +19,9 @@ mrb_obj_eq(mrb_state *mrb, mrb_value v1, mrb_value v2)
|
||||
|
||||
case MRB_TT_FALSE:
|
||||
case MRB_TT_FIXNUM:
|
||||
return (v1.value.i == v2.value.i);
|
||||
return (mrb_fixnum(v1) == mrb_fixnum(v2));
|
||||
case MRB_TT_SYMBOL:
|
||||
return (v1.value.sym == v2.value.sym);
|
||||
return (mrb_symbol(v1) == mrb_symbol(v2));
|
||||
|
||||
case MRB_TT_FLOAT:
|
||||
return (mrb_float(v1) == mrb_float(v2));
|
||||
|
||||
@@ -32,20 +32,6 @@ void abort(void);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define SET_TRUE_VALUE(r) MRB_SET_VALUE(r, MRB_TT_TRUE, value.i, 1)
|
||||
#define SET_FALSE_VALUE(r) MRB_SET_VALUE(r, MRB_TT_FALSE, value.i, 1)
|
||||
#define SET_NIL_VALUE(r) MRB_SET_VALUE(r, MRB_TT_FALSE, value.i, 0)
|
||||
#define SET_INT_VALUE(r,n) MRB_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n))
|
||||
#define SET_SYM_VALUE(r,v) MRB_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v))
|
||||
#define SET_OBJ_VALUE(r,v) MRB_SET_VALUE(r, (((struct RObject*)(v))->tt), value.p, (v))
|
||||
#ifdef MRB_NAN_BOXING
|
||||
#define SET_FLT_VALUE(mrb,r,v) r.f = (v)
|
||||
#elif defined(MRB_WORD_BOXING)
|
||||
#define SET_FLT_VALUE(mrb,r,v) r = mrb_float_value(mrb, (v))
|
||||
#else
|
||||
#define SET_FLT_VALUE(mrb,r,v) MRB_SET_VALUE(r, MRB_TT_FLOAT, value.f, (v))
|
||||
#endif
|
||||
|
||||
#define STACK_INIT_SIZE 128
|
||||
#define CALLINFO_INIT_SIZE 32
|
||||
|
||||
@@ -802,7 +788,7 @@ RETRY_TRY_BLOCK:
|
||||
|
||||
CASE(OP_LOADI) {
|
||||
/* A sBx R(A) := sBx */
|
||||
SET_INT_VALUE(regs[GETARG_A(i)], GETARG_sBx(i));
|
||||
SET_FIXNUM_VALUE(regs[GETARG_A(i)], GETARG_sBx(i));
|
||||
NEXT;
|
||||
}
|
||||
|
||||
@@ -1680,18 +1666,9 @@ RETRY_TRY_BLOCK:
|
||||
NEXT;
|
||||
}
|
||||
|
||||
#define attr_i value.i
|
||||
#ifdef MRB_NAN_BOXING
|
||||
#define attr_f f
|
||||
#elif defined(MRB_WORD_BOXING)
|
||||
#define attr_f value.fp->f
|
||||
#else
|
||||
#define attr_f value.f
|
||||
#endif
|
||||
|
||||
#define TYPES2(a,b) ((((uint16_t)(a))<<8)|(((uint16_t)(b))&0xff))
|
||||
#define OP_MATH_BODY(op,v1,v2) do {\
|
||||
regs[a].v1 = regs[a].v1 op regs[a+1].v2;\
|
||||
v1(regs[a]) = v1(regs[a]) op v2(regs[a+1]);\
|
||||
} while(0)
|
||||
|
||||
CASE(OP_ADD) {
|
||||
@@ -1708,17 +1685,17 @@ RETRY_TRY_BLOCK:
|
||||
x = mrb_fixnum(regs_a[0]);
|
||||
y = mrb_fixnum(regs_a[1]);
|
||||
if (mrb_int_add_overflow(x, y, &z)) {
|
||||
SET_FLT_VALUE(mrb, regs_a[0], (mrb_float)x + (mrb_float)y);
|
||||
SET_FLOAT_VALUE(mrb, regs_a[0], (mrb_float)x + (mrb_float)y);
|
||||
break;
|
||||
}
|
||||
SET_INT_VALUE(regs[a], z);
|
||||
SET_FIXNUM_VALUE(regs[a], z);
|
||||
}
|
||||
break;
|
||||
case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):
|
||||
{
|
||||
mrb_int x = mrb_fixnum(regs[a]);
|
||||
mrb_float y = mrb_float(regs[a+1]);
|
||||
SET_FLT_VALUE(mrb, regs[a], (mrb_float)x + y);
|
||||
SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x + y);
|
||||
}
|
||||
break;
|
||||
case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):
|
||||
@@ -1726,10 +1703,10 @@ RETRY_TRY_BLOCK:
|
||||
{
|
||||
mrb_float x = mrb_float(regs[a]);
|
||||
mrb_int y = mrb_fixnum(regs[a+1]);
|
||||
SET_FLT_VALUE(mrb, regs[a], x + y);
|
||||
SET_FLOAT_VALUE(mrb, regs[a], x + y);
|
||||
}
|
||||
#else
|
||||
OP_MATH_BODY(+,attr_f,attr_i);
|
||||
OP_MATH_BODY(+,mrb_float,mrb_fixnum);
|
||||
#endif
|
||||
break;
|
||||
case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):
|
||||
@@ -1737,10 +1714,10 @@ RETRY_TRY_BLOCK:
|
||||
{
|
||||
mrb_float x = mrb_float(regs[a]);
|
||||
mrb_float y = mrb_float(regs[a+1]);
|
||||
SET_FLT_VALUE(mrb, regs[a], x + y);
|
||||
SET_FLOAT_VALUE(mrb, regs[a], x + y);
|
||||
}
|
||||
#else
|
||||
OP_MATH_BODY(+,attr_f,attr_f);
|
||||
OP_MATH_BODY(+,mrb_float,mrb_float);
|
||||
#endif
|
||||
break;
|
||||
case TYPES2(MRB_TT_STRING,MRB_TT_STRING):
|
||||
@@ -1766,17 +1743,17 @@ RETRY_TRY_BLOCK:
|
||||
x = mrb_fixnum(regs[a]);
|
||||
y = mrb_fixnum(regs[a+1]);
|
||||
if (mrb_int_sub_overflow(x, y, &z)) {
|
||||
SET_FLT_VALUE(mrb, regs[a], (mrb_float)x - (mrb_float)y);
|
||||
SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x - (mrb_float)y);
|
||||
break;
|
||||
}
|
||||
SET_INT_VALUE(regs[a], z);
|
||||
SET_FIXNUM_VALUE(regs[a], z);
|
||||
}
|
||||
break;
|
||||
case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):
|
||||
{
|
||||
mrb_int x = mrb_fixnum(regs[a]);
|
||||
mrb_float y = mrb_float(regs[a+1]);
|
||||
SET_FLT_VALUE(mrb, regs[a], (mrb_float)x - y);
|
||||
SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x - y);
|
||||
}
|
||||
break;
|
||||
case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):
|
||||
@@ -1784,10 +1761,10 @@ RETRY_TRY_BLOCK:
|
||||
{
|
||||
mrb_float x = mrb_float(regs[a]);
|
||||
mrb_int y = mrb_fixnum(regs[a+1]);
|
||||
SET_FLT_VALUE(mrb, regs[a], x - y);
|
||||
SET_FLOAT_VALUE(mrb, regs[a], x - y);
|
||||
}
|
||||
#else
|
||||
OP_MATH_BODY(-,attr_f,attr_i);
|
||||
OP_MATH_BODY(-,mrb_float,mrb_fixnum);
|
||||
#endif
|
||||
break;
|
||||
case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):
|
||||
@@ -1795,10 +1772,10 @@ RETRY_TRY_BLOCK:
|
||||
{
|
||||
mrb_float x = mrb_float(regs[a]);
|
||||
mrb_float y = mrb_float(regs[a+1]);
|
||||
SET_FLT_VALUE(mrb, regs[a], x - y);
|
||||
SET_FLOAT_VALUE(mrb, regs[a], x - y);
|
||||
}
|
||||
#else
|
||||
OP_MATH_BODY(-,attr_f,attr_f);
|
||||
OP_MATH_BODY(-,mrb_float,mrb_float);
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
@@ -1822,12 +1799,12 @@ RETRY_TRY_BLOCK:
|
||||
switch (mrb_type(z)) {
|
||||
case MRB_TT_FIXNUM:
|
||||
{
|
||||
SET_INT_VALUE(regs[a], mrb_fixnum(z));
|
||||
SET_FIXNUM_VALUE(regs[a], mrb_fixnum(z));
|
||||
}
|
||||
break;
|
||||
case MRB_TT_FLOAT:
|
||||
{
|
||||
SET_FLT_VALUE(mrb, regs[a], mrb_float(z));
|
||||
SET_FLOAT_VALUE(mrb, regs[a], mrb_float(z));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@@ -1840,7 +1817,7 @@ RETRY_TRY_BLOCK:
|
||||
{
|
||||
mrb_int x = mrb_fixnum(regs[a]);
|
||||
mrb_float y = mrb_float(regs[a+1]);
|
||||
SET_FLT_VALUE(mrb, regs[a], (mrb_float)x * y);
|
||||
SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x * y);
|
||||
}
|
||||
break;
|
||||
case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):
|
||||
@@ -1848,10 +1825,10 @@ RETRY_TRY_BLOCK:
|
||||
{
|
||||
mrb_float x = mrb_float(regs[a]);
|
||||
mrb_int y = mrb_fixnum(regs[a+1]);
|
||||
SET_FLT_VALUE(mrb, regs[a], x * y);
|
||||
SET_FLOAT_VALUE(mrb, regs[a], x * y);
|
||||
}
|
||||
#else
|
||||
OP_MATH_BODY(*,attr_f,attr_i);
|
||||
OP_MATH_BODY(*,mrb_float,mrb_fixnum);
|
||||
#endif
|
||||
break;
|
||||
case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):
|
||||
@@ -1859,10 +1836,10 @@ RETRY_TRY_BLOCK:
|
||||
{
|
||||
mrb_float x = mrb_float(regs[a]);
|
||||
mrb_float y = mrb_float(regs[a+1]);
|
||||
SET_FLT_VALUE(mrb, regs[a], x * y);
|
||||
SET_FLOAT_VALUE(mrb, regs[a], x * y);
|
||||
}
|
||||
#else
|
||||
OP_MATH_BODY(*,attr_f,attr_f);
|
||||
OP_MATH_BODY(*,mrb_float,mrb_float);
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
@@ -1881,14 +1858,14 @@ RETRY_TRY_BLOCK:
|
||||
{
|
||||
mrb_int x = mrb_fixnum(regs[a]);
|
||||
mrb_int y = mrb_fixnum(regs[a+1]);
|
||||
SET_FLT_VALUE(mrb, regs[a], (mrb_float)x / (mrb_float)y);
|
||||
SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x / (mrb_float)y);
|
||||
}
|
||||
break;
|
||||
case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):
|
||||
{
|
||||
mrb_int x = mrb_fixnum(regs[a]);
|
||||
mrb_float y = mrb_float(regs[a+1]);
|
||||
SET_FLT_VALUE(mrb, regs[a], (mrb_float)x / y);
|
||||
SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x / y);
|
||||
}
|
||||
break;
|
||||
case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):
|
||||
@@ -1896,10 +1873,10 @@ RETRY_TRY_BLOCK:
|
||||
{
|
||||
mrb_float x = mrb_float(regs[a]);
|
||||
mrb_int y = mrb_fixnum(regs[a+1]);
|
||||
SET_FLT_VALUE(mrb, regs[a], x / y);
|
||||
SET_FLOAT_VALUE(mrb, regs[a], x / y);
|
||||
}
|
||||
#else
|
||||
OP_MATH_BODY(/,attr_f,attr_i);
|
||||
OP_MATH_BODY(/,mrb_float,mrb_fixnum);
|
||||
#endif
|
||||
break;
|
||||
case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):
|
||||
@@ -1907,18 +1884,18 @@ RETRY_TRY_BLOCK:
|
||||
{
|
||||
mrb_float x = mrb_float(regs[a]);
|
||||
mrb_float y = mrb_float(regs[a+1]);
|
||||
SET_FLT_VALUE(mrb, regs[a], x / y);
|
||||
SET_FLOAT_VALUE(mrb, regs[a], x / y);
|
||||
}
|
||||
#else
|
||||
OP_MATH_BODY(/,attr_f,attr_f);
|
||||
OP_MATH_BODY(/,mrb_float,mrb_float);
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
goto L_SEND;
|
||||
}
|
||||
#ifdef MRB_NAN_BOXING
|
||||
if (isnan(regs[a].attr_f)) {
|
||||
regs[a] = mrb_float_value(mrb, regs[a].attr_f);
|
||||
if (isnan(mrb_float(regs[a]))) {
|
||||
regs[a] = mrb_float_value(mrb, mrb_float(regs[a]));
|
||||
}
|
||||
#endif
|
||||
NEXT;
|
||||
@@ -1932,29 +1909,29 @@ RETRY_TRY_BLOCK:
|
||||
switch (mrb_type(regs[a])) {
|
||||
case MRB_TT_FIXNUM:
|
||||
{
|
||||
mrb_int x = regs[a].attr_i;
|
||||
mrb_int x = mrb_fixnum(regs[a]);
|
||||
mrb_int y = GETARG_C(i);
|
||||
mrb_int z;
|
||||
|
||||
if (mrb_int_add_overflow(x, y, &z)) {
|
||||
SET_FLT_VALUE(mrb, regs[a], (mrb_float)x + (mrb_float)y);
|
||||
SET_FLOAT_VALUE(mrb, regs[a], (mrb_float)x + (mrb_float)y);
|
||||
break;
|
||||
}
|
||||
regs[a].attr_i = z;
|
||||
mrb_fixnum(regs[a]) = z;
|
||||
}
|
||||
break;
|
||||
case MRB_TT_FLOAT:
|
||||
#ifdef MRB_WORD_BOXING
|
||||
{
|
||||
mrb_float x = mrb_float(regs[a]);
|
||||
SET_FLT_VALUE(mrb, regs[a], x + GETARG_C(i));
|
||||
SET_FLOAT_VALUE(mrb, regs[a], x + GETARG_C(i));
|
||||
}
|
||||
#else
|
||||
regs[a].attr_f += GETARG_C(i);
|
||||
mrb_float(regs[a]) += GETARG_C(i);
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
SET_INT_VALUE(regs[a+1], GETARG_C(i));
|
||||
SET_FIXNUM_VALUE(regs[a+1], GETARG_C(i));
|
||||
i = MKOP_ABC(OP_SEND, a, GETARG_B(i), 1);
|
||||
goto L_SEND;
|
||||
}
|
||||
@@ -1970,15 +1947,15 @@ RETRY_TRY_BLOCK:
|
||||
switch (mrb_type(regs_a[0])) {
|
||||
case MRB_TT_FIXNUM:
|
||||
{
|
||||
mrb_int x = regs_a[0].attr_i;
|
||||
mrb_int x = mrb_fixnum(regs_a[0]);
|
||||
mrb_int y = GETARG_C(i);
|
||||
mrb_int z;
|
||||
|
||||
if (mrb_int_sub_overflow(x, y, &z)) {
|
||||
SET_FLT_VALUE(mrb, regs_a[0], (mrb_float)x - (mrb_float)y);
|
||||
SET_FLOAT_VALUE(mrb, regs_a[0], (mrb_float)x - (mrb_float)y);
|
||||
}
|
||||
else {
|
||||
regs_a[0].attr_i = z;
|
||||
mrb_fixnum(regs_a[0]) = z;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -1986,37 +1963,37 @@ RETRY_TRY_BLOCK:
|
||||
#ifdef MRB_WORD_BOXING
|
||||
{
|
||||
mrb_float x = mrb_float(regs[a]);
|
||||
SET_FLT_VALUE(mrb, regs[a], x - GETARG_C(i));
|
||||
SET_FLOAT_VALUE(mrb, regs[a], x - GETARG_C(i));
|
||||
}
|
||||
#else
|
||||
regs_a[0].attr_f -= GETARG_C(i);
|
||||
mrb_float(regs_a[0]) -= GETARG_C(i);
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
SET_INT_VALUE(regs_a[1], GETARG_C(i));
|
||||
SET_FIXNUM_VALUE(regs_a[1], GETARG_C(i));
|
||||
i = MKOP_ABC(OP_SEND, a, GETARG_B(i), 1);
|
||||
goto L_SEND;
|
||||
}
|
||||
NEXT;
|
||||
}
|
||||
|
||||
#define OP_CMP_BODY(op,v1,v2) (regs[a].v1 op regs[a+1].v2)
|
||||
#define OP_CMP_BODY(op,v1,v2) (v1(regs[a]) op v2(regs[a+1]))
|
||||
|
||||
#define OP_CMP(op) do {\
|
||||
int result;\
|
||||
/* need to check if - is overridden */\
|
||||
switch (TYPES2(mrb_type(regs[a]),mrb_type(regs[a+1]))) {\
|
||||
case TYPES2(MRB_TT_FIXNUM,MRB_TT_FIXNUM):\
|
||||
result = OP_CMP_BODY(op,attr_i,attr_i);\
|
||||
result = OP_CMP_BODY(op,mrb_fixnum,mrb_fixnum);\
|
||||
break;\
|
||||
case TYPES2(MRB_TT_FIXNUM,MRB_TT_FLOAT):\
|
||||
result = OP_CMP_BODY(op,attr_i,attr_f);\
|
||||
result = OP_CMP_BODY(op,mrb_fixnum,mrb_float);\
|
||||
break;\
|
||||
case TYPES2(MRB_TT_FLOAT,MRB_TT_FIXNUM):\
|
||||
result = OP_CMP_BODY(op,attr_f,attr_i);\
|
||||
result = OP_CMP_BODY(op,mrb_float,mrb_fixnum);\
|
||||
break;\
|
||||
case TYPES2(MRB_TT_FLOAT,MRB_TT_FLOAT):\
|
||||
result = OP_CMP_BODY(op,attr_f,attr_f);\
|
||||
result = OP_CMP_BODY(op,mrb_float,mrb_float);\
|
||||
break;\
|
||||
default:\
|
||||
goto L_SEND;\
|
||||
|
||||
Reference in New Issue
Block a user