@@ -2454,6 +2454,20 @@ rb_ary_rassoc(ary, value)
2454
2454
return Qnil ;
2455
2455
}
2456
2456
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
+
2457
2471
/*
2458
2472
* call-seq:
2459
2473
* array == other_array -> bool
@@ -2472,8 +2486,6 @@ static VALUE
2472
2486
rb_ary_equal (ary1 , ary2 )
2473
2487
VALUE ary1 , ary2 ;
2474
2488
{
2475
- long i ;
2476
-
2477
2489
if (ary1 == ary2 ) return Qtrue ;
2478
2490
if (TYPE (ary2 ) != T_ARRAY ) {
2479
2491
if (!rb_respond_to (ary2 , rb_intern ("to_ary" ))) {
@@ -2482,8 +2494,18 @@ rb_ary_equal(ary1, ary2)
2482
2494
return rb_equal (ary2 , ary1 );
2483
2495
}
2484
2496
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 ;
2485
2507
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 )))
2487
2509
return Qfalse ;
2488
2510
}
2489
2511
return Qtrue ;
@@ -2501,33 +2523,24 @@ static VALUE
2501
2523
rb_ary_eql (ary1 , ary2 )
2502
2524
VALUE ary1 , ary2 ;
2503
2525
{
2504
- long i ;
2505
-
2506
2526
if (ary1 == ary2 ) return Qtrue ;
2507
2527
if (TYPE (ary2 ) != T_ARRAY ) return Qfalse ;
2508
2528
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 );
2514
2530
}
2515
2531
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 ));
2523
2533
2524
2534
static VALUE
2525
- rb_ary_hash (ary )
2535
+ recursive_hash (ary )
2526
2536
VALUE ary ;
2527
2537
{
2528
2538
long i , h ;
2529
2539
VALUE n ;
2530
2540
2541
+ if (rb_inspecting_p (ary )) {
2542
+ return LONG2FIX (0 );
2543
+ }
2531
2544
h = RARRAY (ary )-> len ;
2532
2545
for (i = 0 ; i < RARRAY (ary )-> len ; i ++ ) {
2533
2546
h = (h << 1 ) | (h < 0 ? 1 : 0 );
@@ -2537,6 +2550,21 @@ rb_ary_hash(ary)
2537
2550
return LONG2FIX (h );
2538
2551
}
2539
2552
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
+
2540
2568
/*
2541
2569
* call-seq:
2542
2570
* array.include?(obj) -> true or false
@@ -2565,6 +2593,25 @@ rb_ary_includes(ary, item)
2565
2593
return Qfalse ;
2566
2594
}
2567
2595
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
+ }
2568
2615
2569
2616
/*
2570
2617
* call-seq:
@@ -2590,19 +2637,13 @@ VALUE
2590
2637
rb_ary_cmp (ary1 , ary2 )
2591
2638
VALUE ary1 , ary2 ;
2592
2639
{
2593
- long i , len ;
2640
+ long len ;
2641
+ VALUE v ;
2594
2642
2595
2643
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 ;
2606
2647
len = RARRAY (ary1 )-> len - RARRAY (ary2 )-> len ;
2607
2648
if (len == 0 ) return INT2FIX (0 );
2608
2649
if (len > 0 ) return INT2FIX (1 );
0 commit comments