mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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
This commit is contained in:
parent
8c8f92cd7a
commit
244916d43b
4 changed files with 18 additions and 7 deletions
|
@ -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]
|
||||
|
|
4
class.c
4
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);
|
||||
|
||||
|
|
7
object.c
7
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue