From ff40793fc726c3d05cbf38ec703d8d39a0dd09df Mon Sep 17 00:00:00 2001 From: Carson McDonald Date: Sun, 28 Jul 2013 13:15:22 -0400 Subject: Remove pop that was done when not a return val --- src/codegen.c | 1 - 1 file changed, 1 deletion(-) (limited to 'src') diff --git a/src/codegen.c b/src/codegen.c index 37176653b..3f18aad0b 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -1551,7 +1551,6 @@ codegen(codegen_scope *s, node *tree, int val) // variable rhs codegen(s, t, VAL); gen_vmassignment(s, tree->car, rhs, val); - if (!val) pop(); } } break; -- cgit v1.2.3 From dbd36128ad652c743ecb9331f7c4b9ba4a9fb933 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 30 Jul 2013 01:33:02 +0900 Subject: forget to re-initialize target_class for top-level eval; close #1418 --- include/mruby/compile.h | 1 + src/parse.y | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/include/mruby/compile.h b/include/mruby/compile.h index c1c646508..7c5884e58 100644 --- a/include/mruby/compile.h +++ b/include/mruby/compile.h @@ -23,6 +23,7 @@ typedef struct mrbc_context { short lineno; int (*partial_hook)(struct mrb_parser_state*); void *partial_data; + struct RClass *target_class; mrb_bool capture_errors:1; mrb_bool dump_result:1; mrb_bool no_exec:1; diff --git a/src/parse.y b/src/parse.y index 9a83d5cbd..168dca9f0 100644 --- a/src/parse.y +++ b/src/parse.y @@ -5207,9 +5207,13 @@ mrb_parse_string(mrb_state *mrb, const char *s, mrbc_context *c) return mrb_parse_nstring(mrb, s, strlen(s), c); } +struct RProc* mrb_proc_new_with_target(mrb_state *mrb, mrb_irep *irep, struct RClass *target); + static mrb_value load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c) { + struct RClass *target = mrb->object_class; + struct RProc *proc; int n; mrb_value v; @@ -5243,8 +5247,11 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c) if (c) { if (c->dump_result) codedump_all(mrb, n); if (c->no_exec) return mrb_fixnum_value(n); + if (c->target_class) target = c->target_class; } - v = mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); + proc = mrb_proc_new(mrb, mrb->irep[n]); + proc->target_class = target; + v = mrb_run(mrb, proc, mrb_top_self(mrb)); if (mrb->exc) return mrb_nil_value(); return v; } -- cgit v1.2.3 From 326396a6e365ccaf7692aca216c85693f790ed22 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 31 Jul 2013 00:16:55 +0900 Subject: remove unused mrb_proc_new_with_target() --- src/parse.y | 2 -- 1 file changed, 2 deletions(-) (limited to 'src') diff --git a/src/parse.y b/src/parse.y index 168dca9f0..50ba0b1c8 100644 --- a/src/parse.y +++ b/src/parse.y @@ -5207,8 +5207,6 @@ mrb_parse_string(mrb_state *mrb, const char *s, mrbc_context *c) return mrb_parse_nstring(mrb, s, strlen(s), c); } -struct RProc* mrb_proc_new_with_target(mrb_state *mrb, mrb_irep *irep, struct RClass *target); - static mrb_value load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c) { -- cgit v1.2.3 From 029613bc5510e240a0e4c080ab9c03f56a6f7c02 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 31 Jul 2013 00:31:37 +0900 Subject: stop storing target_class info for C defined methods --- src/class.c | 1 - 1 file changed, 1 deletion(-) (limited to 'src') diff --git a/src/class.c b/src/class.c index ad4c9eaa2..6d77f24e6 100644 --- a/src/class.c +++ b/src/class.c @@ -311,7 +311,6 @@ mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t f int ai = mrb_gc_arena_save(mrb); p = mrb_proc_new_cfunc(mrb, func); - p->target_class = c; mrb_define_method_raw(mrb, c, mid, p); mrb_gc_arena_restore(mrb, ai); } -- cgit v1.2.3 From c550a0f834a09bbcacf1dfe62545ff256863f7e3 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 31 Jul 2013 22:24:10 +0900 Subject: move mrb_gc_arena_restore() after cipop(); a bug found by Kilo Kawai --- src/vm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/vm.c b/src/vm.c index 3cdf57551..4d99ad413 100644 --- a/src/vm.c +++ b/src/vm.c @@ -386,9 +386,9 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, int argc, mr if (MRB_PROC_CFUNC_P(p)) { int ai = mrb_gc_arena_save(mrb); val = p->body.func(mrb, self); - mrb_gc_arena_restore(mrb, ai); mrb->c->stack = mrb->c->stbase + mrb->c->ci->stackidx; cipop(mrb); + mrb_gc_arena_restore(mrb, ai); } else { val = mrb_run(mrb, p, self); -- cgit v1.2.3 From 7f282429b0a6d8033be44db012d75a571eab7273 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 1 Aug 2013 11:56:20 +0900 Subject: ci->target_class should be updated as well; #1418 --- src/parse.y | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/parse.y b/src/parse.y index 50ba0b1c8..4fa9e70de 100644 --- a/src/parse.y +++ b/src/parse.y @@ -5245,10 +5245,15 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c) if (c) { if (c->dump_result) codedump_all(mrb, n); if (c->no_exec) return mrb_fixnum_value(n); - if (c->target_class) target = c->target_class; + if (c->target_class) { + target = c->target_class; + } } proc = mrb_proc_new(mrb, mrb->irep[n]); proc->target_class = target; + if (mrb->c->ci) { + mrb->c->ci->target_class = target; + } v = mrb_run(mrb, proc, mrb_top_self(mrb)); if (mrb->exc) return mrb_nil_value(); return v; -- cgit v1.2.3