summaryrefslogtreecommitdiff
path: root/vm_insnhelper.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-05-25 05:29:35 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-05-25 05:29:35 +0000
commit7db534a20c78cf4b9d8eb5f3c6a0198c2dd65aad (patch)
tree6b52b2e04eb5961d29f362359e9b774fe1245afb /vm_insnhelper.c
parentb827fdffe60d612762dd8628e3dea9b6548a4f1c (diff)
vm_insnhelper.c: rb_eql_opt should call eql?
* vm_insnhelper.c (rb_eql_opt): should call #eql? on Float and String, not #==. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58882 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_insnhelper.c')
-rw-r--r--vm_insnhelper.c50
1 files changed, 45 insertions, 5 deletions
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index a23983a5e0..b9bfccac95 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -1295,6 +1295,9 @@ check_cfunc(const rb_callable_method_entry_t *me, VALUE (*func)())
}
}
+#define BUILTIN_CLASS_P(x, k) (!SPECIAL_CONST_P(x) && RBASIC_CLASS(x) == k)
+#define EQ_UNREDEFINED_P(t) BASIC_OP_UNREDEFINED_P(BOP_EQ, t##_REDEFINED_OP_FLAG)
+
static
#ifndef NO_BIG_INLINE
inline
@@ -1302,8 +1305,6 @@ inline
VALUE
opt_eq_func(VALUE recv, VALUE obj, CALL_INFO ci, CALL_CACHE cc)
{
-#define BUILTIN_CLASS_P(x, k) (!SPECIAL_CONST_P(x) && RBASIC_CLASS(x) == k)
-#define EQ_UNREDEFINED_P(t) BASIC_OP_UNREDEFINED_P(BOP_EQ, t##_REDEFINED_OP_FLAG)
if (FIXNUM_2_P(recv, obj)) {
if (EQ_UNREDEFINED_P(INTEGER)) {
return (recv == obj) ? Qtrue : Qfalse;
@@ -1324,8 +1325,47 @@ opt_eq_func(VALUE recv, VALUE obj, CALL_INFO ci, CALL_CACHE cc)
return rb_str_equal(recv, obj);
}
}
-#undef EQ_UNREDEFINED_P
-#undef BUILTIN_CLASS_P
+
+ {
+ vm_search_method(ci, cc, recv);
+
+ if (check_cfunc(cc->me, rb_obj_equal)) {
+ return recv == obj ? Qtrue : Qfalse;
+ }
+ }
+
+ return Qundef;
+}
+
+static
+#ifndef NO_BIG_INLINE
+inline
+#endif
+VALUE
+opt_eql_func(VALUE recv, VALUE obj, CALL_INFO ci, CALL_CACHE cc)
+{
+#define BUILTIN_CLASS_P(x, k) (!SPECIAL_CONST_P(x) && RBASIC_CLASS(x) == k)
+#define EQ_UNREDEFINED_P(t) BASIC_OP_UNREDEFINED_P(BOP_EQ, t##_REDEFINED_OP_FLAG)
+ if (FIXNUM_2_P(recv, obj)) {
+ if (EQ_UNREDEFINED_P(INTEGER)) {
+ return (recv == obj) ? Qtrue : Qfalse;
+ }
+ }
+ else if (FLONUM_2_P(recv, obj)) {
+ if (EQ_UNREDEFINED_P(FLOAT)) {
+ return (recv == obj) ? Qtrue : Qfalse;
+ }
+ }
+ else if (BUILTIN_CLASS_P(recv, rb_cFloat)) {
+ if (EQ_UNREDEFINED_P(FLOAT)) {
+ return rb_float_eql(recv, obj);
+ }
+ }
+ else if (BUILTIN_CLASS_P(recv, rb_cString)) {
+ if (EQ_UNREDEFINED_P(STRING)) {
+ return rb_str_eql(recv, obj);
+ }
+ }
{
vm_search_method(ci, cc, recv);
@@ -1361,7 +1401,7 @@ rb_eql_opt(VALUE obj1, VALUE obj2)
cc.method_state = 0;
cc.class_serial = 0;
cc.me = NULL;
- return opt_eq_func(obj1, obj2, &ci, &cc);
+ return opt_eql_func(obj1, obj2, &ci, &cc);
}
static VALUE vm_call0(rb_thread_t*, VALUE, ID, int, const VALUE*, const rb_callable_method_entry_t *);