diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2015-07-13 07:08:01 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2015-07-13 11:07:59 +0900 |
| commit | 9c311ddc938ad2cc88e4119374e47cd496e15a94 (patch) | |
| tree | 12589cca2f3b80cb16ad072b17e020ecd5003daa /src/vm.c | |
| parent | 4dac03cb2d53227bde2e5f50e70ca79596807e11 (diff) | |
| download | mruby-9c311ddc938ad2cc88e4119374e47cd496e15a94.tar.gz mruby-9c311ddc938ad2cc88e4119374e47cd496e15a94.zip | |
refactor mrb_bob_missing to share raising NoMethodError code; fix #2878
Note: arguments of mrb_no_method_error() has changed. You need to replace
3rd and 4th argument (say n, argv) to mrb_ary_new_from_values(mrb, n, argv).
Diffstat (limited to 'src/vm.c')
| -rw-r--r-- | src/vm.c | 13 |
1 files changed, 11 insertions, 2 deletions
@@ -723,6 +723,8 @@ argnum_error(mrb_state *mrb, mrb_int num) #define CALL_MAXARGS 127 +void mrb_method_missing(mrb_state *mrb, mrb_sym name, mrb_value self, mrb_value args); + MRB_API mrb_value mrb_context_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep) { @@ -1078,8 +1080,15 @@ RETRY_TRY_BLOCK: m = mrb_method_search_vm(mrb, &c, missing); if (!m) { - mrb_no_method_error(mrb, mid, n, regs+a+1, - "undefined method '%S' for %S", mrb_sym2str(mrb, mid), recv); + mrb_value args; + + if (n == CALL_MAXARGS) { + args = regs[a+1]; + } + else { + args = mrb_ary_new_from_values(mrb, n, regs+a+1); + } + mrb_method_missing(mrb, mid, recv, args); } mid = missing; if (n == CALL_MAXARGS) { |
