diff options
| author | Christopher Aue <[email protected]> | 2017-07-28 22:46:26 +0200 |
|---|---|---|
| committer | Christopher Aue <[email protected]> | 2017-07-28 23:19:49 +0200 |
| commit | f937af5745cbc6edead0ad3911bf16e08f66a96f (patch) | |
| tree | da80d7e0bb43d7245850bf0a708812f0aa48d0e9 /src | |
| parent | c7018ea9627efd9c6fe4ef6b6f459fefef01fc52 (diff) | |
| download | mruby-f937af5745cbc6edead0ad3911bf16e08f66a96f.tar.gz mruby-f937af5745cbc6edead0ad3911bf16e08f66a96f.zip | |
Extended Module#const_get to support class paths
Diffstat (limited to 'src')
| -rw-r--r-- | src/class.c | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/src/class.c b/src/class.c index 56f64fd4e..57f64dcc5 100644 --- a/src/class.c +++ b/src/class.c @@ -2161,13 +2161,43 @@ mrb_mod_const_defined(mrb_state *mrb, mrb_value mod) } static mrb_value +mrb_const_get_sym(mrb_state *mrb, mrb_value mod, mrb_sym id) +{ + check_const_name_sym(mrb, id); + return mrb_const_get(mrb, mod, id); +} + +static mrb_value mrb_mod_const_get(mrb_state *mrb, mrb_value mod) { + mrb_value path; mrb_sym id; + char *ptr; + mrb_int off, end, len; - mrb_get_args(mrb, "n", &id); - check_const_name_sym(mrb, id); - return mrb_const_get(mrb, mod, id); + mrb_get_args(mrb, "o", &path); + + if (mrb_symbol_p(path)) { + /* const get with symbol */ + id = mrb_symbol(path); + return mrb_const_get_sym(mrb, mod, id); + } + + /* const get with class path string */ + path = mrb_string_type(mrb, path); + ptr = RSTRING_PTR(path); + len = RSTRING_LEN(path); + off = 0; + + while (off < len) { + end = mrb_str_index_lit(mrb, path, "::", off); + end = (end == -1) ? len : end; + id = mrb_intern(mrb, ptr+off, end-off); + mod = mrb_const_get_sym(mrb, mod, id); + off = (end == len) ? end : end+2; + } + + return mod; } static mrb_value |
