diff options
| -rw-r--r-- | mrbgems/mruby-compiler/core/codegen.c | 5 | ||||
| -rw-r--r-- | src/kernel.c | 2 | ||||
| -rw-r--r-- | src/vm.c | 9 | ||||
| -rw-r--r-- | test/t/kernel.rb | 2 | ||||
| -rw-r--r-- | test/t/syntax.rb | 7 |
5 files changed, 16 insertions, 9 deletions
diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index a17dbf972..12f7c3b3f 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -879,6 +879,7 @@ lambda_body(codegen_scope *s, node *tree, int blk) tree = tree->cdr; if (tree->car == NULL) { genop_W(s, OP_ENTER, 0); + s->ainfo = 0; } else { mrb_aspec a; @@ -2355,7 +2356,7 @@ codegen(codegen_scope *s, node *tree, int val) case NODE_YIELD: { codegen_scope *s2 = s; - int lv = 0, ainfo = 0; + int lv = 0, ainfo = -1; int n = 0, sendv = 0; while (!s2->mscope) { @@ -2365,8 +2366,8 @@ codegen(codegen_scope *s, node *tree, int val) } if (s2) { ainfo = s2->ainfo; - if (ainfo < 0) codegen_error(s, "invalid yield (SyntaxError)"); } + if (ainfo < 0) codegen_error(s, "invalid yield (SyntaxError)"); push(); if (tree) { n = gen_values(s, tree, VAL, 0); diff --git a/src/kernel.c b/src/kernel.c index 05d7c7c84..25aa41baf 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -520,7 +520,7 @@ mrb_method_missing(mrb_state *mrb, mrb_sym name, mrb_value self, mrb_value args) * r.xxiii #=> 23 * r.mm #=> 2000 */ -static mrb_value +mrb_value mrb_obj_missing(mrb_state *mrb, mrb_value mod) { mrb_sym name; @@ -1068,6 +1068,7 @@ check_target_class(mrb_state *mrb) return TRUE; } +mrb_value mrb_obj_missing(mrb_state *mrb, mrb_value mod); void mrb_hash_check_kdict(mrb_state *mrb, mrb_value self); mrb_int mrb_div_int(mrb_state *mrb, mrb_int x, mrb_int y); mrb_float mrb_div_flo(mrb_float x, mrb_float y); @@ -1670,13 +1671,17 @@ RETRY_TRY_BLOCK: if (MRB_METHOD_UNDEF_P(m)) { mrb_sym missing = MRB_SYM(method_missing); + if (mrb_func_basic_p(mrb, recv, missing, mrb_obj_missing)) { + mrb_value args = (argc < 0) ? regs[a+1] : mrb_ary_new_from_values(mrb, b, regs+a+1); + mrb_no_method_error(mrb, mid, args, "no superclass method '%n'", mid); + } if (mid != missing) { cls = mrb_class(mrb, recv); } m = mrb_method_search_vm(mrb, &cls, missing); - if (MRB_METHOD_UNDEF_P(m)) { + if (MRB_METHOD_UNDEF_P(m)) { /* just in case */ mrb_value args = (argc < 0) ? regs[a+1] : mrb_ary_new_from_values(mrb, b, regs+a+1); - mrb_method_missing(mrb, mid, recv, args); + mrb_method_missing(mrb, missing, recv, args); } mid = missing; if (argc >= 0) { diff --git a/test/t/kernel.rb b/test/t/kernel.rb index cab1ddd3d..0a70ec0d2 100644 --- a/test/t/kernel.rb +++ b/test/t/kernel.rb @@ -346,7 +346,7 @@ assert('Kernel#method_missing', '15.3.1.3.30') do end end no_super_test = NoSuperMethodTestClass.new - msg = "undefined method 'no_super_method_named_this'" + msg = "no superclass method 'no_super_method_named_this'" assert_raise_with_message(NoMethodError, msg) do no_super_test.no_super_method_named_this end diff --git a/test/t/syntax.rb b/test/t/syntax.rb index 3b6de6c18..b3ee2d438 100644 --- a/test/t/syntax.rb +++ b/test/t/syntax.rb @@ -35,9 +35,10 @@ assert('super', '11.3.4') do end assert('yield', '11.3.5') do - assert_raise LocalJumpError do - yield - end +# it's syntax error now +# assert_raise LocalJumpError do +# yield +# end assert_raise LocalJumpError do o = Object.new def o.foo |
