summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornagachika <nagachika@ruby-lang.org>2022-11-13 17:07:58 +0900
committernagachika <nagachika@ruby-lang.org>2022-11-13 17:07:58 +0900
commit012015d762d000966a33fcea5f3069decd9d4007 (patch)
tree835302917f104c63521cc8bab10f8111b90f299b
parentf8044a770009b78d46b583600c9bd6660328303f (diff)
merge revision(s) b8f0dc59d52266d9fbfc039e2f4b0f727c62baa0: [Backport #18599]
rb_provide_feature: Prevent $LOADED_FEATURES from being copied [Bug #18599] `vm->loaded_features` and `vm->loaded_features_snapshot` both share the same root. When a feature is pushed into `loaded_features`, the sharing is broken and `loaded_features` is copied. So an application requiring 1000 files, will allocate 1000 arrays of increasing size, which is very wasteful. To avoid this, we first clear the snapshot, so that `loaded_features` can directly be pushed into. Co-Authored-By: Peter Zhu <peter.zhu@shopify.com> --- load.c | 4 ++++ 1 file changed, 4 insertions(+)
-rw-r--r--load.c4
-rw-r--r--version.h2
2 files changed, 5 insertions, 1 deletions
diff --git a/load.c b/load.c
index 812fe2fe93..bc0571124d 100644
--- a/load.c
+++ b/load.c
@@ -625,6 +625,10 @@ rb_provide_feature(rb_vm_t *vm, VALUE feature)
rb_str_freeze(feature);
get_loaded_features_index(vm);
+ // If loaded_features and loaded_features_snapshot share the same backing
+ // array, pushing into it would cause the whole array to be copied.
+ // To avoid this we first clear loaded_features_snapshot.
+ rb_ary_clear(vm->loaded_features_snapshot);
rb_ary_push(features, rb_fstring(feature));
features_index_add(vm, feature, INT2FIX(RARRAY_LEN(features)-1));
reset_loaded_features_snapshot(vm);
diff --git a/version.h b/version.h
index f226b2832f..231b6d4a09 100644
--- a/version.h
+++ b/version.h
@@ -11,7 +11,7 @@
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
#define RUBY_VERSION_TEENY 3
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 181
+#define RUBY_PATCHLEVEL 182
#define RUBY_RELEASE_YEAR 2022
#define RUBY_RELEASE_MONTH 11