mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Merge pull request #6294 from auroranockert/optimise-obj-iv-p
Optimise `mrb_iv_get`
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;\
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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") \
|
||||
|
||||
+1
-1
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user