diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-11-16 09:21:56 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2015-11-16 09:21:56 +0000 |
commit | 20690026a7dd7622c7d824de71e337a68a293b63 (patch) | |
tree | c2e21553dc5527199a6caac0588ffb158d9be7dd /object.c | |
parent | 1ff30ea2b1675fa6bfa50bb5bac1f8cdea8524e1 (diff) |
struct.c: dig
* object.c (rb_obj_dig): dig in nested structs too.
* struct.c (rb_struct_dig): new method Struct#dig.
[Feature #11688]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52596 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'object.c')
-rw-r--r-- | object.c | 9 |
1 files changed, 8 insertions, 1 deletions
@@ -3165,7 +3165,7 @@ dig_basic_p(VALUE obj, struct dig_method *cache) VALUE rb_obj_dig(int argc, VALUE *argv, VALUE obj, VALUE notfound) { - struct dig_method hash = {Qnil}, ary = {Qnil}; + struct dig_method hash = {Qnil}, ary = {Qnil}, strt = {Qnil}; for (; argc > 0; ++argv, --argc) { if (!SPECIAL_CONST_P(obj)) { @@ -3181,6 +3181,13 @@ rb_obj_dig(int argc, VALUE *argv, VALUE obj, VALUE notfound) obj = rb_ary_at(obj, *argv); continue; } + break; + case T_STRUCT: + if (dig_basic_p(obj, &strt)) { + obj = rb_struct_lookup(obj, *argv); + continue; + } + break; } } return rb_check_funcall_default(obj, id_dig, argc, argv, notfound); |