summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authordearblue <[email protected]>2020-01-29 22:02:43 +0900
committerdearblue <[email protected]>2020-01-29 23:30:13 +0900
commit9840e5352b2abf96235068f0e9d08f14b1d333cf (patch)
treeadabd97033d166ba39b18697f5279f856f6ee428
parent0aa5aa1de29d61e40a0c1e9be40ee9e14fe284bd (diff)
downloadmruby-9840e5352b2abf96235068f0e9d08f14b1d333cf.tar.gz
mruby-9840e5352b2abf96235068f0e9d08f14b1d333cf.zip
Isolate top-level local variables by file scope; fix #4931
-rw-r--r--lib/mruby/gem.rb5
-rw-r--r--mrbgems/mruby-bin-mirb/tools/mirb/mirb.c4
-rw-r--r--mrbgems/mruby-bin-mruby/tools/mruby/mruby.c5
3 files changed, 14 insertions, 0 deletions
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 <stdlib.h>] unless rbfiles.empty?
f.puts %Q[#include <mruby.h>]
f.puts %Q[#include <mruby/irep.h>] unless rbfiles.empty?
+ f.puts %Q[#include <mruby/proc.h>] 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 <mruby/compile.h>
#include <mruby/dump.h>
#include <mruby/variable.h>
+#include <mruby/proc.h>
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);
}