diff options
author | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-06-22 21:50:31 +0000 |
---|---|---|
committer | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-06-22 21:50:31 +0000 |
commit | 099e6e7817f2b07cbbf1548b38178086022b5cb3 (patch) | |
tree | c1c63c15a0a9e59d21d0217fb91e177ea28d28dd /struct.c | |
parent | 8b71b4e5c5b79b2519203626b0cf933971f78117 (diff) |
struct.c: cache member definition in a subclass
Since getting Qnil is already error, it is safe to use rb_attr_get.
* struct.c (struct_ivar_get): cache member definition in a subclass
Thanks to Sokolov Yura aka funny_falcon <[email protected]>
in https://bugs.ruby-lang.org/issues/10585
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50999 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'struct.c')
-rw-r--r-- | struct.c | 12 |
1 files changed, 10 insertions, 2 deletions
@@ -23,12 +23,20 @@ static VALUE struct_alloc(VALUE); static inline VALUE struct_ivar_get(VALUE c, ID id) { + VALUE orig = c; + VALUE ivar = rb_attr_get(c, id); + + if (!NIL_P(ivar)) + return ivar; + for (;;) { - if (rb_ivar_defined(c, id)) - return rb_ivar_get(c, id); c = RCLASS_SUPER(c); if (c == 0 || c == rb_cStruct) return Qnil; + ivar = rb_attr_get(c, id); + if (!NIL_P(ivar)) { + return rb_ivar_set(orig, id, ivar); + } } } |