Feature #11769 ยป 0001-optimize-case-when-for-nil.patch
| compile.c | ||
|---|---|---|
|
}
|
||
|
break;
|
||
|
}
|
||
|
case NODE_NIL:
|
||
|
return Qnil;
|
||
|
case NODE_STR:
|
||
|
return node->nd_lit = rb_fstring(node->nd_lit);
|
||
|
}
|
||
| insns.def | ||
|---|---|---|
|
SYMBOL_REDEFINED_OP_FLAG |
|
||
|
FIXNUM_REDEFINED_OP_FLAG |
|
||
|
BIGNUM_REDEFINED_OP_FLAG |
|
||
|
NIL_REDEFINED_OP_FLAG |
|
||
|
STRING_REDEFINED_OP_FLAG)) {
|
||
|
st_data_t val;
|
||
|
if (st_lookup(RHASH_TBL_RAW(hash), key, &val)) {
|
||
| object.c | ||
|---|---|---|
|
rb_define_method(rb_cNilClass, "&", false_and, 1);
|
||
|
rb_define_method(rb_cNilClass, "|", false_or, 1);
|
||
|
rb_define_method(rb_cNilClass, "^", false_xor, 1);
|
||
|
rb_define_method(rb_cNilClass, "===", rb_equal, 1);
|
||
|
rb_define_method(rb_cNilClass, "nil?", rb_true, 0);
|
||
|
rb_undef_alloc_func(rb_cNilClass);
|
||
| test/ruby/test_case.rb | ||
|---|---|---|
|
end
|
||
|
}
|
||
|
end
|
||
|
module NilEqq
|
||
|
refine NilClass do
|
||
|
def === other
|
||
|
false
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
class NilEqqClass
|
||
|
using NilEqq
|
||
|
def eqq(a)
|
||
|
case a; when nil then nil; else :not_nil; end
|
||
|
end
|
||
|
end
|
||
|
def test_deoptimize_nil
|
||
|
assert_equal :not_nil, NilEqqClass.new.eqq(nil)
|
||
|
end
|
||
|
end
|
||
| vm.c | ||
|---|---|---|
|
if (klass == rb_cSymbol) return SYMBOL_REDEFINED_OP_FLAG;
|
||
|
if (klass == rb_cTime) return TIME_REDEFINED_OP_FLAG;
|
||
|
if (klass == rb_cRegexp) return REGEXP_REDEFINED_OP_FLAG;
|
||
|
if (klass == rb_cNilClass) return NIL_REDEFINED_OP_FLAG;
|
||
|
return 0;
|
||
|
}
|
||
| ... | ... | |
|
OP(DIV, DIV), (C(Fixnum), C(Float));
|
||
|
OP(MOD, MOD), (C(Fixnum), C(Float));
|
||
|
OP(Eq, EQ), (C(Fixnum), C(Float), C(String));
|
||
|
OP(Eqq, EQQ), (C(Fixnum), C(Bignum), C(Float), C(Symbol), C(String));
|
||
|
OP(Eqq, EQQ), (C(Fixnum), C(Bignum), C(Float), C(Symbol), C(String), C(NilClass));
|
||
|
OP(LT, LT), (C(Fixnum), C(Float));
|
||
|
OP(LE, LE), (C(Fixnum), C(Float));
|
||
|
OP(GT, GT), (C(Fixnum), C(Float));
|
||
| vm_core.h | ||
|---|---|---|
|
#define SYMBOL_REDEFINED_OP_FLAG (1 << 6)
|
||
|
#define TIME_REDEFINED_OP_FLAG (1 << 7)
|
||
|
#define REGEXP_REDEFINED_OP_FLAG (1 << 8)
|
||
|
#define NIL_REDEFINED_OP_FLAG (1 << 9)
|
||
|
#define BASIC_OP_UNREDEFINED_P(op, klass) (LIKELY((GET_VM()->redefined_flag[(op)]&(klass)) == 0))
|
||