summaryrefslogtreecommitdiffstats
path: root/vm_insnhelper.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-08-15 18:18:07 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-08-15 18:18:07 +0000
commit77d09c15e6e494974e799b7a3acb97ca9a90f1db (patch)
tree724cd6e3e6083a79654b6df65eb3997e59e13c6f /vm_insnhelper.c
parent1d9700151554240127e606ebfda5c8915491aacc (diff)
downloadruby-77d09c15e6e494974e799b7a3acb97ca9a90f1db.tar.gz
ruby-77d09c15e6e494974e799b7a3acb97ca9a90f1db.tar.xz
ruby-77d09c15e6e494974e799b7a3acb97ca9a90f1db.zip
* vm_insnhelper.c (opt_eq_func): fix optimization bug. This issue
was found out and debugged with Takuto Hayashi at Security and Programming camp 2009. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@24547 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_insnhelper.c')
-rw-r--r--vm_insnhelper.c35
1 files changed, 12 insertions, 23 deletions
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 24f4e0133..be8b07ed1 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -1547,16 +1547,9 @@ inline
VALUE
opt_eq_func(VALUE recv, VALUE obj, IC ic)
{
- VALUE val = Qundef;
-
if (FIXNUM_2_P(recv, obj) &&
BASIC_OP_UNREDEFINED_P(BOP_EQ)) {
- if (recv == obj) {
- val = Qtrue;
- }
- else {
- val = Qfalse;
- }
+ return (recv == obj) ? Qtrue : Qfalse;
}
else if (!SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj)) {
if (HEAP_CLASS_OF(recv) == rb_cFloat &&
@@ -1566,31 +1559,27 @@ opt_eq_func(VALUE recv, VALUE obj, IC ic)
double b = RFLOAT_VALUE(obj);
if (isnan(a) || isnan(b)) {
- val = Qfalse;
- }
- else if (a == b) {
- val = Qtrue;
- }
- else {
- val = Qfalse;
+ return Qfalse;
}
+ return (a == b) ? Qtrue : 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);
+ return rb_str_equal(recv, obj);
}
- else {
- const rb_method_entry_t *me = vm_method_search(idEq, CLASS_OF(recv), ic);
- extern VALUE rb_obj_equal(VALUE obj1, VALUE obj2);
+ }
- if (check_cfunc(me, rb_obj_equal)) {
- return recv == obj ? Qtrue : Qfalse;
- }
+ {
+ const rb_method_entry_t *me = vm_method_search(idEq, CLASS_OF(recv), ic);
+ extern VALUE rb_obj_equal(VALUE obj1, VALUE obj2);
+
+ if (check_cfunc(me, rb_obj_equal)) {
+ return recv == obj ? Qtrue : Qfalse;
}
}
- return val;
+ return Qundef;
}
struct opt_case_dispatch_i_arg {