diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-12-23 06:53:51 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-12-23 06:53:51 +0000 |
commit | c25c84777cf0bc96a0b985ca1ffda09aa8052d24 (patch) | |
tree | e799a7fe13f58635f10576e25c5d039abecd6d80 /hash.c | |
parent | 21e74f54816b147c0515d0f6c019d3e87fb237d2 (diff) | |
download | ruby-c25c84777cf0bc96a0b985ca1ffda09aa8052d24.tar.gz |
hash.c: reduce warning
* hash.c (HAS_EXTRA_STATES): warn extra states only when something
differ. [ruby-core:59254] [Bug #9275]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@44359 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'hash.c')
-rw-r--r-- | hash.c | 15 |
1 files changed, 13 insertions, 2 deletions
@@ -28,12 +28,23 @@ #endif #define HAS_EXTRA_STATES(hash, klass) ( \ - (klass = rb_obj_class(hash)) != rb_cHash || \ - (klass = 0, \ + (klass = has_extra_methods(rb_obj_class(hash))) != 0 || \ FL_TEST((hash), FL_EXIVAR|FL_TAINT|HASH_PROC_DEFAULT) || \ !NIL_P(RHASH_IFNONE(hash)))) #define HASH_REJECT_COPY_EXTRA_STATES 1 +static VALUE +has_extra_methods(VALUE klass) +{ + const VALUE base = rb_cHash; + VALUE c = klass; + while (c != base) { + st_table *mtbl = RCLASS_M_TBL(c); + if (mtbl && mtbl->num_entries) return klass; + } + return 0; +} + static VALUE rb_hash_s_try_convert(VALUE, VALUE); /* |