From d4e954a4ca67c35f43c0ead6be72af215879187b Mon Sep 17 00:00:00 2001 From: Sokolov Yura aka funny_falcon Date: Wed, 10 Dec 2014 16:54:36 +0300 Subject: [PATCH 2/4] struct.c: cache member definition in a subclass Since getting Qnil is already error, it is safe to use rb_attr_get. --- struct.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/struct.c b/struct.c index e710505..90fcb68 100644 --- a/struct.c +++ b/struct.c @@ -24,12 +24,19 @@ static VALUE struct_alloc(VALUE); static inline VALUE struct_ivar_get(VALUE c, ID id) { - 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; + VALUE orig = c; + VALUE ivar = rb_attr_get(c, id); + if (!NIL_P(ivar)) + return ivar; + for(;;) { + c = RCLASS_SUPER(c); + if (c == 0 || c == rb_cStruct) + return Qnil; + ivar = rb_attr_get(c, id); + if (!NIL_P(ivar)) { + rb_ivar_set(orig, id, ivar); + return ivar; + } } } -- 2.1.0