summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-01-12 19:26:07 +0000
committernormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-01-12 19:26:07 +0000
commit244916d43b9924f094d268c99df90fd81df68e68 (patch)
tree77f0f61e616de201741292cb653de80aee1c7f67
parent8c8f92cd7ae38b7fc54ff136dd1d929509eb8d0d (diff)
resolve class name earlier and more consistently
This further avoids class name resolution issues which came about due to relying on hash table ordering before r53376. Pre-caching the class name when it is never used raises memory use, but the overall gain from moving away from st still gives us a small gain. Reverting r53376 and this patch and testing with "valgrind -v ./ruby -rrdoc -eexit" on x86 (32-bit) shows: before: in use at exit: 1,662,239 bytes in 25,286 blocks total heap usage: 49,514 allocs, 24,228 frees, 6,005,561 bytes allocated after, with this change: in use at exit: 1,646,529 bytes in 24,572 blocks total heap usage: 48,891 allocs, 24,319 frees, 6,003,921 bytes allocated * class.c (Init_class_hierarchy): resolve name for rb_cObject ASAP * object.c (rb_mod_const_set): move name resolution to rb_const_set * variable.c (rb_const_set): do class resolution here [ruby-core:72807] [Bug #11977] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53518 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog7
-rw-r--r--class.c4
-rw-r--r--object.c7
-rw-r--r--variable.c7
4 files changed, 18 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index fca190f6ae..9fa0f70f08 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Wed Jan 13 03:42:58 2016 Eric Wong <e@80x24.org>
+
+ * class.c (Init_class_hierarchy): resolve name for rb_cObject ASAP
+ * object.c (rb_mod_const_set): move name resolution to rb_const_set
+ * variable.c (rb_const_set): do class resolution here
+ [ruby-core:72807] [Bug #11977]
+
Wed Jan 13 00:37:12 2016 Satoshi Ohmori <sachin21dev@gmail.com>
* man/ruby.1: fix double word typo. [Fix GH-1194]
diff --git a/class.c b/class.c
index 5c72a4b3c9..b4eaabc250 100644
--- a/class.c
+++ b/class.c
@@ -547,6 +547,10 @@ Init_class_hierarchy(void)
{
rb_cBasicObject = boot_defclass("BasicObject", 0);
rb_cObject = boot_defclass("Object", rb_cBasicObject);
+
+ /* resolve class name ASAP for order-independence */
+ rb_class_name(rb_cObject);
+
rb_cModule = boot_defclass("Module", rb_cObject);
rb_cClass = boot_defclass("Class", rb_cModule);
diff --git a/object.c b/object.c
index 53354e928b..2497043b46 100644
--- a/object.c
+++ b/object.c
@@ -2178,13 +2178,6 @@ rb_mod_const_set(VALUE mod, VALUE name, VALUE value)
if (!id) id = rb_intern_str(name);
rb_const_set(mod, id, value);
- /*
- * Resolve and cache class name immediately to resolve ambiguity
- * and avoid order-dependency on const_tbl
- */
- if (RB_TYPE_P(value, T_MODULE) || RB_TYPE_P(value, T_CLASS)) {
- rb_class_name(value);
- }
return value;
}
diff --git a/variable.c b/variable.c
index 047dbc7e67..842006ed71 100644
--- a/variable.c
+++ b/variable.c
@@ -2569,6 +2569,13 @@ rb_const_set(VALUE klass, ID id, VALUE val)
args.value = val;
const_tbl_update(&args);
}
+ /*
+ * Resolve and cache class name immediately to resolve ambiguity
+ * and avoid order-dependency on const_tbl
+ */
+ if (rb_cObject && (RB_TYPE_P(val, T_MODULE) || RB_TYPE_P(val, T_CLASS))) {
+ rb_class_name(val);
+ }
}
static void