From 95d13c624e0b7bce068c9893aaa29398d2a4cbde Mon Sep 17 00:00:00 2001
From: Eric Wong <e@80x24.org>
Date: Sat, 4 Jul 2015 05:29:12 +0000
Subject: [PATCH] load.c: use fstring for loaded features and expanded load
 path

Loaded features is an obvious candidate for fstring since
feature paths of Ruby sources are included in iseq locations,
and iseq locations are in the fstring table anyways.

Deduplicating expanded load path can reuse old objects, since
repeated expansions may get reused before old expanded paths are GC-ed
away.
---
 load.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/load.c b/load.c
index 69be692..91122c7 100644
--- a/load.c
+++ b/load.c
@@ -87,7 +87,7 @@ rb_construct_expanded_load_path(int type, int *has_relative, int *has_non_cache)
 	as_str = rb_get_path_check_convert(path, as_str, level);
 	expanded_path = rb_file_expand_path_fast(as_str, Qnil);
 	rb_str_freeze(expanded_path);
-	rb_ary_push(ary, expanded_path);
+	rb_ary_push(ary, rb_fstring(expanded_path));
     }
     rb_obj_freeze(ary);
     vm->expanded_load_path = ary;
@@ -287,9 +287,9 @@ get_loaded_features_index(void)
 	    VALUE entry, as_str;
 	    as_str = entry = rb_ary_entry(features, i);
 	    StringValue(as_str);
+	    as_str = rb_fstring(rb_str_freeze(as_str));
 	    if (as_str != entry)
 		rb_ary_store(features, i, as_str);
-	    rb_str_freeze(as_str);
 	    features_index_add(as_str, INT2FIX(i));
 	}
 	reset_loaded_features_snapshot();
@@ -560,7 +560,7 @@ rb_provide_feature(VALUE feature)
     }
     rb_str_freeze(feature);
 
-    rb_ary_push(features, feature);
+    rb_ary_push(features, rb_fstring(feature));
     features_index_add(feature, INT2FIX(RARRAY_LEN(features)-1));
     reset_loaded_features_snapshot();
 }
-- 
EW

