Bug #7607 ยป bignum_objid.patch
bignum.c | ||
---|---|---|
* 68719476736.eql?(68719476736.0) #=> false
|
||
*/
|
||
static VALUE
|
||
VALUE
|
||
rb_big_eql(VALUE x, VALUE y)
|
||
{
|
||
if (!RB_TYPE_P(y, T_BIGNUM)) return Qfalse;
|
include/ruby/intern.h | ||
---|---|---|
double rb_big2dbl(VALUE);
|
||
VALUE rb_big_cmp(VALUE, VALUE);
|
||
VALUE rb_big_eq(VALUE, VALUE);
|
||
VALUE rb_big_eql(VALUE, VALUE);
|
||
VALUE rb_big_plus(VALUE, VALUE);
|
||
VALUE rb_big_minus(VALUE, VALUE);
|
||
VALUE rb_big_mul(VALUE, VALUE);
|
thread.c | ||
---|---|---|
}
|
||
/*
|
||
* Returns Qtrue iff obj_id (or the pair <obj, paired_obj>) is already
|
||
* Returns Qtrue if obj_id (or the pair <obj, paired_obj>) is already
|
||
* in the recursion list.
|
||
* Assumes the recursion list is valid.
|
||
*/
|
||
... | ... | |
static VALUE
|
||
recursive_check(VALUE list, VALUE obj_id, VALUE paired_obj_id)
|
||
{
|
||
#if SIZEOF_LONG == SIZEOF_VOIDP
|
||
#define OBJ_ID_EQL(obj_id, other) ((obj_id) == (other))
|
||
#elif SIZEOF_LONG_LONG == SIZEOF_VOIDP
|
||
#define OBJ_ID_EQL(obj_id, other) (RB_TYPE_P((obj_id), T_BIGNUM) ? \
|
||
rb_big_eql((obj_id), (other)) : ((obj_id) == (other)))
|
||
#endif
|
||
VALUE pair_list = rb_hash_lookup2(list, obj_id, Qundef);
|
||
if (pair_list == Qundef)
|
||
return Qfalse;
|
||
if (paired_obj_id) {
|
||
if (!RB_TYPE_P(pair_list, T_HASH)) {
|
||
if (pair_list != paired_obj_id)
|
||
return Qfalse;
|
||
if (!OBJ_ID_EQL(paired_obj_id, pair_list))
|
||
return Qfalse;
|
||
}
|
||
else {
|
||
if (NIL_P(rb_hash_lookup(pair_list, paired_obj_id)))
|
||
return Qfalse;
|
||
if (NIL_P(rb_hash_lookup(pair_list, paired_obj_id)))
|
||
return Qfalse;
|
||
}
|
||
}
|
||
return Qtrue;
|