diff --git a/include/mruby/boxing_nan.h b/include/mruby/boxing_nan.h index f412568dd..d76759ab0 100644 --- a/include/mruby/boxing_nan.h +++ b/include/mruby/boxing_nan.h @@ -98,6 +98,16 @@ mrb_type(mrb_value o) } } +MRB_INLINE enum mrb_vtype +mrb_unboxed_type(mrb_value o) +{ + if (!mrb_float_p(o) && mrb_nb_tt(o) == MRB_NANBOX_TT_OBJECT && o.u != 0) { + return ((struct RBasic*)(uintptr_t)o.u)->tt; + } else { + return MRB_TT_FALSE; + } +} + #define NANBOX_SET_MISC_VALUE(r,t,i) NANBOX_SET_VALUE(r, MRB_NANBOX_TT_MISC, ((uint64_t)(t)<<32) | (i)) #define mrb_float(o) mrb_nan_boxing_value_float(o) diff --git a/include/mruby/boxing_no.h b/include/mruby/boxing_no.h index 84908a0d8..e261e4d17 100644 --- a/include/mruby/boxing_no.h +++ b/include/mruby/boxing_no.h @@ -26,15 +26,16 @@ typedef struct mrb_value { enum mrb_vtype tt; } mrb_value; -#define mrb_ptr(o) (o).value.p -#define mrb_cptr(o) mrb_ptr(o) +#define mrb_ptr(o) (o).value.p +#define mrb_cptr(o) mrb_ptr(o) #ifndef MRB_NO_FLOAT -#define mrb_float(o) (o).value.f +#define mrb_float(o) (o).value.f #endif -#define mrb_fixnum(o) (o).value.i -#define mrb_integer(o) mrb_fixnum(o) -#define mrb_symbol(o) (o).value.sym -#define mrb_type(o) (o).tt +#define mrb_fixnum(o) (o).value.i +#define mrb_integer(o) mrb_fixnum(o) +#define mrb_symbol(o) (o).value.sym +#define mrb_type(o) (o).tt +#define mrb_unboxed_type(o) (o).tt #define BOXNIX_SET_VALUE(o, ttt, attr, v) do {\ (o).tt = ttt;\ diff --git a/include/mruby/boxing_word.h b/include/mruby/boxing_word.h index d3ca18eb4..b39307e33 100644 --- a/include/mruby/boxing_word.h +++ b/include/mruby/boxing_word.h @@ -228,4 +228,17 @@ mrb_type(mrb_value o) mrb_val_union(o).bp->tt; } +MRB_INLINE enum mrb_vtype +mrb_unboxed_type(mrb_value o) +{ + if (mrb_nil_p(o)) { + return MRB_TT_FALSE; + } else if ((o.w & WORDBOX_IMMEDIATE_MASK) == 0) { + return mrb_val_union(o).bp->tt; + } else { + return MRB_TT_FALSE; + } +} + + #endif /* MRUBY_BOXING_WORD_H */ diff --git a/include/mruby/value.h b/include/mruby/value.h index 16da2cbd4..96af28d35 100644 --- a/include/mruby/value.h +++ b/include/mruby/value.h @@ -143,16 +143,16 @@ static const unsigned int IEEE754_INFINITY_BITS_SINGLE = 0x7F800000; f(MRB_TT_OBJECT, struct RObject, "Object") \ f(MRB_TT_CLASS, struct RClass, "Class") \ f(MRB_TT_MODULE, struct RClass, "Module") \ - f(MRB_TT_ICLASS, struct RClass, "iClass") \ f(MRB_TT_SCLASS, struct RClass, "SClass") \ + f(MRB_TT_HASH, struct RHash, "Hash") \ + f(MRB_TT_CDATA, struct RData, "C data") \ + f(MRB_TT_EXCEPTION, struct RException, "Exception") \ + f(MRB_TT_ICLASS, struct RClass, "iClass") \ f(MRB_TT_PROC, struct RProc, "Proc") \ f(MRB_TT_ARRAY, struct RArray, "Array") \ - f(MRB_TT_HASH, struct RHash, "Hash") \ f(MRB_TT_STRING, struct RString, "String") \ f(MRB_TT_RANGE, struct RRange, "Range") \ - f(MRB_TT_EXCEPTION, struct RException, "Exception") \ f(MRB_TT_ENV, struct REnv, "env") \ - f(MRB_TT_CDATA, struct RData, "C data") \ f(MRB_TT_FIBER, struct RFiber, "Fiber") \ f(MRB_TT_STRUCT, struct RArray, "Struct") \ f(MRB_TT_ISTRUCT, struct RIStruct, "istruct") \ diff --git a/src/variable.c b/src/variable.c index 2afbfd93e..d224a5a34 100644 --- a/src/variable.c +++ b/src/variable.c @@ -282,7 +282,7 @@ mrb_vm_special_set(mrb_state *mrb, mrb_sym i, mrb_value v) static mrb_bool obj_iv_p(mrb_value obj) { - switch (mrb_type(obj)) { + switch (mrb_unboxed_type(obj)) { case MRB_TT_OBJECT: case MRB_TT_CLASS: case MRB_TT_MODULE: