Skip to content

Commit 4f029e3

Browse files
committed
* array.c (rb_ary_equal, rb_ary_eql, rb_ary_hash, rb_ary_cmp):
Make Array#eql?, #hash, #== and #<=> use rb_exec_recursive() and handle recursive data properly. [ruby-dev:35181] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_5@17438 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent de63d71 commit 4f029e3

File tree

3 files changed

+80
-33
lines changed

3 files changed

+80
-33
lines changed

ChangeLog

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
Thu Jun 19 23:57:54 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
2+
3+
* array.c (rb_ary_equal, rb_ary_eql, rb_ary_hash, rb_ary_cmp):
4+
Make Array#eql?, #hash, #== and #<=> use rb_exec_recursive() and
5+
handle recursive data properly. [ruby-dev:35181]
6+
17
Wed Jun 18 15:17:30 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
28

39
* marshal.c (w_object, marshal_dump, r_object0, marshal_load): search

array.c

Lines changed: 70 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2454,6 +2454,20 @@ rb_ary_rassoc(ary, value)
24542454
return Qnil;
24552455
}
24562456

2457+
static VALUE
2458+
recursive_equal(ary1, ary2)
2459+
VALUE ary1, ary2;
2460+
{
2461+
long i;
2462+
2463+
if (rb_inspecting_p(ary1)) return Qfalse;
2464+
for (i=0; i<RARRAY(ary1)->len; i++) {
2465+
if (!rb_equal(rb_ary_elt(ary1, i), rb_ary_elt(ary2, i)))
2466+
return Qfalse;
2467+
}
2468+
return Qtrue;
2469+
}
2470+
24572471
/*
24582472
* call-seq:
24592473
* array == other_array -> bool
@@ -2472,8 +2486,6 @@ static VALUE
24722486
rb_ary_equal(ary1, ary2)
24732487
VALUE ary1, ary2;
24742488
{
2475-
long i;
2476-
24772489
if (ary1 == ary2) return Qtrue;
24782490
if (TYPE(ary2) != T_ARRAY) {
24792491
if (!rb_respond_to(ary2, rb_intern("to_ary"))) {
@@ -2482,8 +2494,18 @@ rb_ary_equal(ary1, ary2)
24822494
return rb_equal(ary2, ary1);
24832495
}
24842496
if (RARRAY(ary1)->len != RARRAY(ary2)->len) return Qfalse;
2497+
return rb_protect_inspect(recursive_equal, ary1, ary2);
2498+
}
2499+
2500+
static VALUE
2501+
recursive_eql(ary1, ary2)
2502+
VALUE ary1, ary2;
2503+
{
2504+
long i;
2505+
2506+
if (rb_inspecting_p(ary1)) return Qfalse;
24852507
for (i=0; i<RARRAY(ary1)->len; i++) {
2486-
if (!rb_equal(rb_ary_elt(ary1, i), rb_ary_elt(ary2, i)))
2508+
if (!rb_eql(rb_ary_elt(ary1, i), rb_ary_elt(ary2, i)))
24872509
return Qfalse;
24882510
}
24892511
return Qtrue;
@@ -2501,33 +2523,24 @@ static VALUE
25012523
rb_ary_eql(ary1, ary2)
25022524
VALUE ary1, ary2;
25032525
{
2504-
long i;
2505-
25062526
if (ary1 == ary2) return Qtrue;
25072527
if (TYPE(ary2) != T_ARRAY) return Qfalse;
25082528
if (RARRAY(ary1)->len != RARRAY(ary2)->len) return Qfalse;
2509-
for (i=0; i<RARRAY(ary1)->len; i++) {
2510-
if (!rb_eql(rb_ary_elt(ary1, i), rb_ary_elt(ary2, i)))
2511-
return Qfalse;
2512-
}
2513-
return Qtrue;
2529+
return rb_protect_inspect(recursive_eql, ary1, ary2);
25142530
}
25152531

2516-
/*
2517-
* call-seq:
2518-
* array.hash -> fixnum
2519-
*
2520-
* Compute a hash-code for this array. Two arrays with the same content
2521-
* will have the same hash code (and will compare using <code>eql?</code>).
2522-
*/
2532+
static VALUE recursive_hash _((VALUE ary));
25232533

25242534
static VALUE
2525-
rb_ary_hash(ary)
2535+
recursive_hash(ary)
25262536
VALUE ary;
25272537
{
25282538
long i, h;
25292539
VALUE n;
25302540

2541+
if (rb_inspecting_p(ary)) {
2542+
return LONG2FIX(0);
2543+
}
25312544
h = RARRAY(ary)->len;
25322545
for (i=0; i<RARRAY(ary)->len; i++) {
25332546
h = (h << 1) | (h<0 ? 1 : 0);
@@ -2537,6 +2550,21 @@ rb_ary_hash(ary)
25372550
return LONG2FIX(h);
25382551
}
25392552

2553+
/*
2554+
* call-seq:
2555+
* array.hash -> fixnum
2556+
*
2557+
* Compute a hash-code for this array. Two arrays with the same content
2558+
* will have the same hash code (and will compare using <code>eql?</code>).
2559+
*/
2560+
2561+
static VALUE
2562+
rb_ary_hash(ary)
2563+
VALUE ary;
2564+
{
2565+
return rb_protect_inspect(recursive_hash, ary, 0);
2566+
}
2567+
25402568
/*
25412569
* call-seq:
25422570
* array.include?(obj) -> true or false
@@ -2565,6 +2593,25 @@ rb_ary_includes(ary, item)
25652593
return Qfalse;
25662594
}
25672595

2596+
VALUE
2597+
recursive_cmp(ary1, ary2)
2598+
VALUE ary1, ary2;
2599+
{
2600+
long i, len;
2601+
2602+
if (rb_inspecting_p(ary1)) return Qfalse;
2603+
len = RARRAY(ary1)->len;
2604+
if (len > RARRAY(ary2)->len) {
2605+
len = RARRAY(ary2)->len;
2606+
}
2607+
for (i=0; i<len; i++) {
2608+
VALUE v = rb_funcall(rb_ary_elt(ary1, i), id_cmp, 1, rb_ary_elt(ary2, i));
2609+
if (v != INT2FIX(0)) {
2610+
return v;
2611+
}
2612+
}
2613+
return Qundef;
2614+
}
25682615

25692616
/*
25702617
* call-seq:
@@ -2590,19 +2637,13 @@ VALUE
25902637
rb_ary_cmp(ary1, ary2)
25912638
VALUE ary1, ary2;
25922639
{
2593-
long i, len;
2640+
long len;
2641+
VALUE v;
25942642

25952643
ary2 = to_ary(ary2);
2596-
len = RARRAY(ary1)->len;
2597-
if (len > RARRAY(ary2)->len) {
2598-
len = RARRAY(ary2)->len;
2599-
}
2600-
for (i=0; i<len; i++) {
2601-
VALUE v = rb_funcall(rb_ary_elt(ary1, i), id_cmp, 1, rb_ary_elt(ary2, i));
2602-
if (v != INT2FIX(0)) {
2603-
return v;
2604-
}
2605-
}
2644+
if (ary1 == ary2) return INT2FIX(0);
2645+
v = rb_protect_inspect(recursive_cmp, ary1, ary2);
2646+
if (v != Qundef) return v;
26062647
len = RARRAY(ary1)->len - RARRAY(ary2)->len;
26072648
if (len == 0) return INT2FIX(0);
26082649
if (len > 0) return INT2FIX(1);

version.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
#define RUBY_VERSION "1.8.5"
2-
#define RUBY_RELEASE_DATE "2008-06-18"
2+
#define RUBY_RELEASE_DATE "2008-06-19"
33
#define RUBY_VERSION_CODE 185
4-
#define RUBY_RELEASE_CODE 20080618
5-
#define RUBY_PATCHLEVEL 226
4+
#define RUBY_RELEASE_CODE 20080619
5+
#define RUBY_PATCHLEVEL 227
66

77
#define RUBY_VERSION_MAJOR 1
88
#define RUBY_VERSION_MINOR 8
99
#define RUBY_VERSION_TEENY 5
1010
#define RUBY_RELEASE_YEAR 2008
1111
#define RUBY_RELEASE_MONTH 6
12-
#define RUBY_RELEASE_DAY 18
12+
#define RUBY_RELEASE_DAY 19
1313

1414
#ifdef RUBY_EXTERN
1515
RUBY_EXTERN const char ruby_version[];

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy