diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-12-18 12:07:51 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-12-18 12:07:51 +0000 |
commit | cd843108646b999e13cfbf04e51eca30b68850b3 (patch) | |
tree | eb87ffe59f0f71747be4fc76d84244c414e3e3da /insns.def | |
parent | 1f75a4e700883da8d15048fc3da6528ba53ec1e4 (diff) | |
download | ruby-cd843108646b999e13cfbf04e51eca30b68850b3.tar.gz |
* compile.c, insnhelper.ci, insns.def, object.c, vm.c, vm.h:
optimize !@, != method invocation.
* id.c, id.h: ditto.
* bootstraptest/test_syntax.rb: add tests for above.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14299 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'insns.def')
-rw-r--r-- | insns.def | 117 |
1 files changed, 57 insertions, 60 deletions
@@ -581,26 +581,6 @@ newrange val = rb_range_new(low, high, flag); } -/** - @c put - @e put !val. - @j !val の結果をスタックにプッシュする。 - */ -DEFINE_INSN -putnot -() -(VALUE obj) -(VALUE val) -{ - if (RTEST(obj)) { - val = Qfalse; - } - else { - val = Qtrue; - } -} - - /**********************************************************/ /* deal with stack operation */ /**********************************************************/ @@ -1655,59 +1635,51 @@ opt_mod */ DEFINE_INSN opt_eq -() +(IC ic) (VALUE recv, VALUE obj) (VALUE val) { - if (FIXNUM_2_P(recv, obj) && - BASIC_OP_UNREDEFINED_P(BOP_EQ)) { - long a = FIX2LONG(recv), b = FIX2LONG(obj); + val = opt_eq_func(recv, obj, ic); - if (a == b) { - val = Qtrue; - } - else { - val = Qfalse; - } + if (val == Qundef) { + /* other */ + PUSH(recv); + PUSH(obj); + CALL_SIMPLE_METHOD(1, idEq, recv); } - else if (!SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj)) { - if (0) { - } - else if (HEAP_CLASS_OF(recv) == rb_cFloat && - HEAP_CLASS_OF(obj) == rb_cFloat && - BASIC_OP_UNREDEFINED_P(BOP_EQ)) { - double a = RFLOAT_VALUE(recv); - double b = RFLOAT_VALUE(obj); +} - if (isnan(a) || isnan(b)) { - val = Qfalse; - } - else if (a == b) { - val = Qtrue; - } - else { - val = Qfalse; - } - } - else if (HEAP_CLASS_OF(recv) == rb_cString && - HEAP_CLASS_OF(obj) == rb_cString && - BASIC_OP_UNREDEFINED_P(BOP_EQ)) { - val = rb_str_equal(recv, obj); - } - else { - goto INSN_LABEL(normal_dispatch); +/** + @c optimize + @e optimized X!=Y. + @j 最適化された X!=Y。 + */ +DEFINE_INSN +opt_neq +(IC ic1, IC ic2) +(VALUE recv, VALUE obj) +(VALUE val) +{ + extern VALUE rb_obj_not_equal(VALUE obj1, VALUE obj2); + NODE *mn = vm_method_search(idNeq, CLASS_OF(recv), ic1); + val = Qundef; + + if (check_cfunc(mn, rb_obj_not_equal)) { + val = opt_eq_func(recv, obj, ic2); + + if (val != Qundef) { + val = RTEST(val) ? Qfalse : Qtrue; } } - else { - INSN_LABEL(normal_dispatch): + + if (val == Qundef) { /* other */ PUSH(recv); PUSH(obj); - CALL_SIMPLE_METHOD(1, idEq, recv); + CALL_SIMPLE_METHOD(1, idNeq, recv); } } - /** @c optimize @e optimized X<Y. @@ -1991,7 +1963,8 @@ opt_succ BASIC_OP_UNREDEFINED_P(BOP_SUCC)) { val = rb_time_succ(recv); } - else { + else + { goto INSN_LABEL(normal_dispatch); } } @@ -2004,6 +1977,30 @@ opt_succ /** @c optimize + @e optimized not + @j 最適化された recv.!()。 + */ +DEFINE_INSN +opt_not +(IC ic) +(VALUE recv) +(VALUE val) +{ + extern VALUE rb_obj_not(VALUE obj); + NODE *mn = vm_method_search(idNot, CLASS_OF(recv), ic); + + if (check_cfunc(mn, rb_obj_not)) { + val = RTEST(recv) ? Qfalse : Qtrue; + } + else { + PUSH(recv); + CALL_SIMPLE_METHOD(0, idNot, recv); + } +} + + +/** + @c optimize @e optimized regexp match @j 最適化された正規表現マッチ。 */ |