summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-08-29 06:30:03 +0000
committernormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-08-29 06:30:03 +0000
commita1e95636acd2b507b3d5d7b770f271992622a571 (patch)
treecfe7aad8f88234842387beee4636720f5cada27a
parentdacc19e409fba7a79b2a1c7e30f21c00191a9a7b (diff)
string.c: move frozen_strings table to rb_vm_t
Cleanup in case MVM development proceeds. * string.c: remove static frozen_strings * string.c (Init_frozen_strings): new function * string.c (rb_fstring): remove check for frozen strings, use per-VM table * string.c (rb_str_free): use per-VM table * string.c (Init_String): use per-VM table * vm_core.h (rb_vm_t): add frozen_strings table * internal.h (Init_frozen_strings): new function prototype * eval.c (ruby_setup): call Init_frozen_strings [Feature #10182] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47310 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog13
-rw-r--r--common.mk3
-rw-r--r--eval.c1
-rw-r--r--internal.h1
-rw-r--r--string.c22
-rw-r--r--vm_core.h1
6 files changed, 31 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 88dedb6d95..dbc7c62667 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+Fri Aug 29 15:17:13 2014 Eric Wong <e@80x24.org>
+
+ * string.c: remove static frozen_strings
+ * string.c (Init_frozen_strings): new function
+ * string.c (rb_fstring): remove check for frozen strings,
+ use per-VM table
+ * string.c (rb_str_free): use per-VM table
+ * string.c (Init_String): use per-VM table
+ * vm_core.h (rb_vm_t): add frozen_strings table
+ * internal.h (Init_frozen_strings): new function prototype
+ * eval.c (ruby_setup): call Init_frozen_strings
+ [Feature #10182]
+
Wed Aug 27 23:10:24 2014 Masaki Matsushita <glass.saga@gmail.com>
* lib/tempfile.rb: remove "require 'thread'". its features are no
diff --git a/common.mk b/common.mk
index 3b7918092b..077af9887a 100644
--- a/common.mk
+++ b/common.mk
@@ -777,7 +777,8 @@ st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES)
strftime.$(OBJEXT): {$(VPATH)}strftime.c $(RUBY_H_INCLUDES) \
{$(VPATH)}timev.h $(ENCODING_H_INCLUDES)
string.$(OBJEXT): {$(VPATH)}string.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h {$(VPATH)}gc.h \
- {$(VPATH)}regex.h $(ENCODING_H_INCLUDES) {$(VPATH)}internal.h $(PROBES_H_INCLUDES)
+ {$(VPATH)}regex.h $(ENCODING_H_INCLUDES) {$(VPATH)}internal.h \
+ $(PROBES_H_INCLUDES) $(VM_CORE_H_INCLUDES)
struct.$(OBJEXT): {$(VPATH)}struct.c $(RUBY_H_INCLUDES) {$(VPATH)}internal.h
symbol.$(OBJEXT): {$(VPATH)}symbol.c $(RUBY_H_INCLUDES) $(ENCODING_H_INCLUDES) \
{$(VPATH)}internal.h {$(VPATH)}node.h {$(VPATH)}id.h {$(VPATH)}symbol.h \
diff --git a/eval.c b/eval.c
index fbe17d034b..f0a06fbfcf 100644
--- a/eval.c
+++ b/eval.c
@@ -52,6 +52,7 @@ ruby_setup(void)
Init_BareVM();
Init_heap();
Init_vm_objects();
+ Init_frozen_strings();
PUSH_TAG();
if ((state = EXEC_TAG()) == 0) {
diff --git a/internal.h b/internal.h
index da821035e0..8b9701c597 100644
--- a/internal.h
+++ b/internal.h
@@ -891,6 +891,7 @@ size_t rb_strftime(char *s, size_t maxsize, const char *format, rb_encoding *enc
#endif
/* string.c */
+void Init_frozen_strings(void);
VALUE rb_fstring(VALUE);
VALUE rb_fstring_new(const char *ptr, long len);
#ifdef RUBY_ENCODING_H
diff --git a/string.c b/string.c
index b9863b8e25..9084c457d2 100644
--- a/string.c
+++ b/string.c
@@ -17,6 +17,7 @@
#include "internal.h"
#include "probes.h"
#include "gc.h"
+#include "vm_core.h"
#include <assert.h>
#define BEG(no) (regs->beg[(no)])
@@ -176,8 +177,6 @@ mustnot_broken(VALUE str)
static int fstring_cmp(VALUE a, VALUE b);
-static st_table* frozen_strings;
-
static const struct st_hash_type fstring_hash_type = {
fstring_cmp,
rb_str_hash,
@@ -223,15 +222,13 @@ rb_fstring(VALUE str)
Check_Type(str, T_STRING);
- if (!frozen_strings)
- frozen_strings = st_init_table(&fstring_hash_type);
-
if (FL_TEST(str, RSTRING_FSTR))
return str;
do {
ret = str;
- st_update(frozen_strings, (st_data_t)str, fstr_update_callback, (st_data_t)&ret);
+ st_update(GET_VM()->frozen_strings, (st_data_t)str,
+ fstr_update_callback, (st_data_t)&ret);
} while (ret == Qundef);
return ret;
@@ -952,7 +949,7 @@ rb_str_free(VALUE str)
{
if (FL_TEST(str, RSTRING_FSTR)) {
st_data_t fstr = (st_data_t)str;
- st_delete(frozen_strings, &fstr, NULL);
+ st_delete(GET_VM()->frozen_strings, &fstr, NULL);
}
if (!STR_EMBED_P(str) && !FL_TEST(str, STR_SHARED)) {
@@ -8950,6 +8947,13 @@ Init_String(void)
rb_define_method(rb_cSymbol, "encoding", sym_encoding, 0);
- if (frozen_strings)
- st_foreach(frozen_strings, fstring_set_class_i, rb_cString);
+ assert(GET_VM()->frozen_strings);
+ st_foreach(GET_VM()->frozen_strings, fstring_set_class_i, rb_cString);
+}
+
+void
+Init_frozen_strings(void)
+{
+ assert(!GET_VM()->frozen_strings);
+ GET_VM()->frozen_strings = st_init_table(&fstring_hash_type);
}
diff --git a/vm_core.h b/vm_core.h
index 7bf971b9a5..e828e917ba 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -430,6 +430,7 @@ typedef struct rb_vm_struct {
struct RArray at_exit;
VALUE *defined_strings;
+ st_table *frozen_strings;
/* params */
struct { /* size in byte */