From 2bab6e197de0d6903e3cb2642af83ff277e133fb Mon Sep 17 00:00:00 2001 From: dearblue Date: Sun, 19 Jan 2020 21:44:23 +0900 Subject: Fix take over file scope variables with `mruby` command Resolve #4931 --- mrbgems/mruby-bin-mruby/tools/mruby/mruby.c | 1 + 1 file changed, 1 insertion(+) (limited to 'mrbgems/mruby-bin-mruby/tools') diff --git a/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c b/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c index f3593aa48..7614ce6cd 100644 --- a/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +++ b/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c @@ -317,6 +317,7 @@ main(int argc, char **argv) v = mrb_load_file_cxt(mrb, lfp, c); } fclose(lfp); + mrbc_cleanup_local_variables(mrb, c); } /* Load program */ -- cgit v1.2.3 From 9840e5352b2abf96235068f0e9d08f14b1d333cf Mon Sep 17 00:00:00 2001 From: dearblue Date: Wed, 29 Jan 2020 22:02:43 +0900 Subject: Isolate top-level local variables by file scope; fix #4931 --- lib/mruby/gem.rb | 5 +++++ mrbgems/mruby-bin-mirb/tools/mirb/mirb.c | 4 ++++ mrbgems/mruby-bin-mruby/tools/mruby/mruby.c | 5 +++++ 3 files changed, 14 insertions(+) (limited to 'mrbgems/mruby-bin-mruby/tools') diff --git a/lib/mruby/gem.rb b/lib/mruby/gem.rb index 4214ceb08..0793da350 100644 --- a/lib/mruby/gem.rb +++ b/lib/mruby/gem.rb @@ -171,6 +171,7 @@ module MRuby f.puts %Q[] f.puts %Q[void GENERATED_TMP_mrb_#{funcname}_gem_init(mrb_state *mrb) {] f.puts %Q[ int ai = mrb_gc_arena_save(mrb);] + f.puts %Q[ struct REnv *e;] unless rbfiles.empty? f.puts %Q[ mrb_#{funcname}_gem_init(mrb);] if objs != [objfile("#{build_dir}/gem_init")] unless rbfiles.empty? f.puts %Q[ mrb_load_irep(mrb, gem_mrblib_irep_#{funcname});] @@ -179,6 +180,9 @@ module MRuby f.puts %Q[ mrb_close(mrb);] f.puts %Q[ exit(EXIT_FAILURE);] f.puts %Q[ }] + f.puts %Q[ e = mrb->c->cibase->env;] + f.puts %Q[ mrb->c->cibase->env = NULL;] + f.puts %Q[ mrb_env_unshare(mrb, e);] end f.puts %Q[ mrb_gc_arena_restore(mrb, ai);] f.puts %Q[}] @@ -205,6 +209,7 @@ module MRuby f.puts %Q[#include ] unless rbfiles.empty? f.puts %Q[#include ] f.puts %Q[#include ] unless rbfiles.empty? + f.puts %Q[#include ] unless rbfiles.empty? end def print_gem_test_header(f) diff --git a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c index e54a520f3..8a3568ca0 100644 --- a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c +++ b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c @@ -493,6 +493,7 @@ main(int argc, char **argv) /* Load libraries */ for (i = 0; i < args.libc; i++) { + struct REnv *e; FILE *lfp = fopen(args.libv[i], "r"); if (lfp == NULL) { printf("Cannot open library file. (%s)\n", args.libv[i]); @@ -501,6 +502,9 @@ main(int argc, char **argv) } mrb_load_file_cxt(mrb, lfp, cxt); fclose(lfp); + e = mrb->c->cibase->env; + mrb->c->cibase->env = NULL; + mrb_env_unshare(mrb, e); mrbc_cleanup_local_variables(mrb, cxt); } diff --git a/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c b/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c index 7614ce6cd..b44345fe4 100644 --- a/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c +++ b/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c @@ -6,6 +6,7 @@ #include #include #include +#include struct _args { FILE *rfp; @@ -303,6 +304,7 @@ main(int argc, char **argv) /* Load libraries */ for (i = 0; i < args.libc; i++) { + struct REnv *e; FILE *lfp = fopen(args.libv[i], args.mrbfile ? "rb" : "r"); if (lfp == NULL) { fprintf(stderr, "%s: Cannot open library file: %s\n", *argv, args.libv[i]); @@ -317,6 +319,9 @@ main(int argc, char **argv) v = mrb_load_file_cxt(mrb, lfp, c); } fclose(lfp); + e = mrb->c->cibase->env; + mrb->c->cibase->env = NULL; + mrb_env_unshare(mrb, e); mrbc_cleanup_local_variables(mrb, c); } -- cgit v1.2.3