From 7185c00fcc330db8951b684f548ba3d10983bb92 Mon Sep 17 00:00:00 2001 From: Koichi Sasada Date: Thu, 30 Sep 2021 17:30:04 +0900 Subject: [PATCH] freeze (make shareable) script_lines --- common.mk | 1 + iseq.c | 9 +++++++-- test/ruby/test_rubyvm.rb | 1 + 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/common.mk b/common.mk index c703a6da48..05c807e3d2 100644 --- a/common.mk +++ b/common.mk @@ -6989,6 +6989,7 @@ iseq.$(OBJEXT): $(CCAN_DIR)/container_of/container_of.h iseq.$(OBJEXT): $(CCAN_DIR)/list/list.h iseq.$(OBJEXT): $(CCAN_DIR)/str/str.h iseq.$(OBJEXT): $(hdrdir)/ruby.h +iseq.$(OBJEXT): $(hdrdir)/ruby/ractor.h iseq.$(OBJEXT): $(hdrdir)/ruby/ruby.h iseq.$(OBJEXT): $(top_srcdir)/internal/array.h iseq.$(OBJEXT): $(top_srcdir)/internal/bits.h diff --git a/iseq.c b/iseq.c index 0551e0c99a..eb65ec5f79 100644 --- a/iseq.c +++ b/iseq.c @@ -39,7 +39,7 @@ #include "vm_core.h" #include "vm_callinfo.h" #include "yjit.h" - +#include "ruby/ractor.h" #include "builtin.h" #include "insns.inc" #include "insns_info.inc" @@ -617,7 +617,12 @@ prepare_iseq_build(rb_iseq_t *iseq, ISEQ_ORIGINAL_ISEQ_CLEAR(iseq); body->variable.flip_count = 0; - RB_OBJ_WRITE(iseq, &body->variable.script_lines, script_lines); + if (NIL_P(script_lines)) { + RB_OBJ_WRITE(iseq, &body->variable.script_lines, Qnil); + } + else { + RB_OBJ_WRITE(iseq, &body->variable.script_lines, rb_ractor_make_shareable(script_lines)); + } ISEQ_COMPILE_DATA_ALLOC(iseq); RB_OBJ_WRITE(iseq, &ISEQ_COMPILE_DATA(iseq)->err_info, err_info); diff --git a/test/ruby/test_rubyvm.rb b/test/ruby/test_rubyvm.rb index fecaacfa78..a6d0b1a727 100644 --- a/test/ruby/test_rubyvm.rb +++ b/test/ruby/test_rubyvm.rb @@ -49,6 +49,7 @@ class TestRubyVM < Test::Unit::TestCase iseq.each_child{|child| assert_equal lines, child.script_lines } + assert lines.frozen? # don't keep RubyVM.keep_script_lines = false