aboutsummaryrefslogtreecommitdiffstats
path: root/range.c
diff options
context:
space:
mode:
Diffstat (limited to 'range.c')
-rw-r--r--range.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/range.c b/range.c
index ce2df63100..e013a8a13f 100644
--- a/range.c
+++ b/range.c
@@ -201,21 +201,15 @@ range_eql(VALUE range, VALUE obj)
return Qtrue;
}
-/*
- * call-seq:
- * rng.hash => fixnum
- *
- * Generate a hash value such that two ranges with the same start and
- * end points, and the same value for the "exclude end" flag, generate
- * the same hash value.
- */
-
static VALUE
-range_hash(VALUE range)
+recursive_hash(VALUE range, VALUE dummy, int recur)
{
unsigned long hash = EXCL(range);
VALUE v;
+ if (recur) {
+ rb_raise(rb_eArgError, "recursive key for hash");
+ }
hash = rb_hash_start(hash);
v = rb_hash(RANGE_BEG(range));
hash = rb_hash_uint(hash, NUM2LONG(v));
@@ -227,6 +221,21 @@ range_hash(VALUE range)
return LONG2FIX(hash);
}
+/*
+ * call-seq:
+ * rng.hash => fixnum
+ *
+ * Generate a hash value such that two ranges with the same start and
+ * end points, and the same value for the "exclude end" flag, generate
+ * the same hash value.
+ */
+
+static VALUE
+range_hash(VALUE range)
+{
+ return rb_exec_recursive(recursive_hash, range, 0);
+}
+
static void
range_each_func(VALUE range, VALUE (*func) (VALUE, void *), void *arg)
{