diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | struct.c | 12 |
2 files changed, 16 insertions, 2 deletions
@@ -1,3 +1,9 @@ +Tue Jun 23 06:37:10 2015 Eric Wong <e@80x24.org> + + * struct.c (struct_ivar_get): cache member definition in a subclass + Thanks to Sokolov Yura aka funny_falcon <funny.falcon@gmail.com> + in https://bugs.ruby-lang.org/issues/10585 + Tue Jun 23 04:58:06 2015 Eric Wong <e@80x24.org> * benchmark/bm_vm2_struct_big_href_hi.rb: new benchmark @@ -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); + } } } |