summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mrbgems/mruby-compiler/core/codegen.c5
-rw-r--r--src/kernel.c2
-rw-r--r--src/vm.c9
-rw-r--r--test/t/kernel.rb2
-rw-r--r--test/t/syntax.rb7
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;
diff --git a/src/vm.c b/src/vm.c
index aeef56831..edfb55586 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -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