diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2018-12-21 13:00:27 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2018-12-21 13:00:27 +0900 |
| commit | aeafce23e446aeea66605738faf2fabc9ddb058b (patch) | |
| tree | ebc5599eea2bd887137e79f0f49672047968434c | |
| parent | 94b73b14402af26a844a98d22a87cce7d8f58ea0 (diff) | |
| parent | d2fb4752e25c2772f5410e4887d9bddc9168ccdf (diff) | |
| download | mruby-aeafce23e446aeea66605738faf2fabc9ddb058b.tar.gz mruby-aeafce23e446aeea66605738faf2fabc9ddb058b.zip | |
Merge branch 'cubicdaiya-feature/optimize_proc_parameters'
| -rw-r--r-- | mrbgems/mruby-proc-ext/src/proc.c | 23 | ||||
| -rw-r--r-- | mrbgems/mruby-proc-ext/test/proc.rb | 5 |
2 files changed, 18 insertions, 10 deletions
diff --git a/mrbgems/mruby-proc-ext/src/proc.c b/mrbgems/mruby-proc-ext/src/proc.c index 9ce6c1831..4b85c245d 100644 --- a/mrbgems/mruby-proc-ext/src/proc.c +++ b/mrbgems/mruby-proc-ext/src/proc.c @@ -94,20 +94,21 @@ static mrb_value mrb_proc_parameters(mrb_state *mrb, mrb_value self) { struct parameters_type { - int size; + size_t len; const char *name; + int size; } *p, parameters_list [] = { - {0, "req"}, - {0, "opt"}, - {0, "rest"}, - {0, "req"}, - {0, "block"}, - {0, NULL} + {sizeof("req") - 1, "req", 0}, + {sizeof("opt") - 1, "opt", 0}, + {sizeof("rest") - 1, "rest", 0}, + {sizeof("req") - 1, "req", 0}, + {sizeof("block") - 1, "block", 0}, + {0, NULL, 0} }; const struct RProc *proc = mrb_proc_ptr(self); const struct mrb_irep *irep = proc->body.irep; mrb_aspec aspec; - mrb_value sname, parameters; + mrb_value parameters; int i, j; int max = -1; @@ -126,7 +127,9 @@ mrb_proc_parameters(mrb_state *mrb, mrb_value self) } if (!MRB_PROC_STRICT_P(proc)) { + parameters_list[0].len = sizeof("opt") - 1; parameters_list[0].name = "opt"; + parameters_list[3].len = sizeof("opt") - 1; parameters_list[3].name = "opt"; } @@ -141,8 +144,8 @@ mrb_proc_parameters(mrb_state *mrb, mrb_value self) max = irep->nlocals-1; for (i = 0, p = parameters_list; p->name; p++) { - if (p->size <= 0) continue; - sname = mrb_symbol_value(mrb_intern_cstr(mrb, p->name)); + mrb_value sname = mrb_symbol_value(mrb_intern_static(mrb, p->name, p->len)); + for (j = 0; j < p->size; i++, j++) { mrb_value a; diff --git a/mrbgems/mruby-proc-ext/test/proc.rb b/mrbgems/mruby-proc-ext/test/proc.rb index 037d8d124..3e64bc103 100644 --- a/mrbgems/mruby-proc-ext/test/proc.rb +++ b/mrbgems/mruby-proc-ext/test/proc.rb @@ -13,6 +13,11 @@ assert('Proc#inspect') do assert_kind_of String, ins end +assert('Proc#parameters') do + parameters = Proc.new{|x,y=42,*other|}.parameters + assert_equal [[:opt, :x], [:opt, :y], [:rest, :other]], parameters +end + assert('Proc#lambda?') do assert_true lambda{}.lambda? assert_true !Proc.new{}.lambda? |
