summaryrefslogtreecommitdiffhomepage
path: root/src/vm.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2015-07-13 07:08:01 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2015-07-13 11:07:59 +0900
commit9c311ddc938ad2cc88e4119374e47cd496e15a94 (patch)
tree12589cca2f3b80cb16ad072b17e020ecd5003daa /src/vm.c
parent4dac03cb2d53227bde2e5f50e70ca79596807e11 (diff)
downloadmruby-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.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/vm.c b/src/vm.c
index 15a3926e3..22ea177e0 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -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) {