[前][次][番号順一覧][スレッド一覧]

ruby-changes:31184

From: ko1 <ko1@a...>
Date: Sat, 12 Oct 2013 03:27:23 +0900 (JST)
Subject: [ruby-changes:31184] ko1:r43263 (trunk): * class.c, variable.c, gc.c (rb_class_tbl): removed.

ko1	2013-10-12 03:27:18 +0900 (Sat, 12 Oct 2013)

  New Revision: 43263

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=43263

  Log:
    * class.c, variable.c, gc.c (rb_class_tbl): removed.
    * vm.c, vm_core.h (rb_vm_add_root_module): added to register as a
      defined root module or class.
      This guard helps mark miss from defined classes/modules they are
      only refered from C's global variables in C-exts.
      Basically, it is extension's bug.
      Register to hash object VM has.
      Marking a hash objects allows generational GC supports.
    * gc.c (RGENGC_PRINT_TICK): disable (revert).

  Modified files:
    trunk/ChangeLog
    trunk/class.c
    trunk/gc.c
    trunk/variable.c
    trunk/vm.c
    trunk/vm_core.h
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 43262)
+++ ChangeLog	(revision 43263)
@@ -1,3 +1,17 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Sat Oct 12 03:26:04 2013  Koichi Sasada  <ko1@a...>
+
+	* class.c, variable.c, gc.c (rb_class_tbl): removed.
+
+	* vm.c, vm_core.h (rb_vm_add_root_module): added to register as a
+	  defined root module or class.
+	  This guard helps mark miss from defined classes/modules they are
+	  only refered from C's global variables in C-exts.
+	  Basically, it is extension's bug.
+	  Register to hash object VM has.
+	  Marking a hash objects allows generational GC supports.
+
+	* gc.c (RGENGC_PRINT_TICK): disable (revert).
+
 Sat Oct 12 03:24:49 2013  Koichi Sasada  <ko1@a...>
 
 	* vm_method.c (rb_gc_mark_unlinked_live_method_entries): 
Index: variable.c
===================================================================
--- variable.c	(revision 43262)
+++ variable.c	(revision 43263)
@@ -21,14 +21,12 @@ https://github.com/ruby/ruby/blob/trunk/variable.c#L21
 #include "id.h"
 
 st_table *rb_global_tbl;
-st_table *rb_class_tbl;
 static ID autoload, classpath, tmp_classpath, classid;
 
 void
 Init_var_tables(void)
 {
     rb_global_tbl = st_init_numtable();
-    rb_class_tbl = st_init_numtable();
     CONST_ID(autoload, "__autoload__");
     /* __classpath__: fully qualified class path */
     CONST_ID(classpath, "__classpath__");
@@ -135,9 +133,6 @@ find_class_path(VALUE klass, ID preferre https://github.com/ruby/ruby/blob/trunk/variable.c#L133
     if (RCLASS_CONST_TBL(rb_cObject)) {
 	st_foreach_safe(RCLASS_CONST_TBL(rb_cObject), fc_i, (st_data_t)&arg);
     }
-    if (arg.path == 0) {
-	st_foreach_safe(rb_class_tbl, fc_i, (st_data_t)&arg);
-    }
     if (arg.path) {
 	st_data_t tmp = tmp_classpath;
 	if (!RCLASS_IV_TBL(klass)) {
Index: vm_core.h
===================================================================
--- vm_core.h	(revision 43262)
+++ vm_core.h	(revision 43263)
@@ -400,6 +400,8 @@ typedef struct rb_vm_struct { https://github.com/ruby/ruby/blob/trunk/vm_core.h#L400
 
     struct unlinked_method_entry_list_entry *unlinked_method_entry_list;
 
+    VALUE defined_module_hash;
+
 #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
     struct rb_objspace *objspace;
 #endif
Index: gc.c
===================================================================
--- gc.c	(revision 43262)
+++ gc.c	(revision 43263)
@@ -535,7 +535,6 @@ VALUE *ruby_initial_gc_stress_ptr = &rb_ https://github.com/ruby/ruby/blob/trunk/gc.c#L535
 
 int ruby_gc_debug_indent = 0;
 VALUE rb_mGC;
-extern st_table *rb_class_tbl;
 int ruby_disable_gc_stress = 0;
 
 void rb_gcdebug_print_obj_condition(VALUE obj);
@@ -3453,7 +3452,7 @@ gc_mark_stacked_objects(rb_objspace_t *o https://github.com/ruby/ruby/blob/trunk/gc.c#L3452
     shrink_stack_chunk_cache(mstack);
 }
 
-#define RGENGC_PRINT_TICK 1
+#define RGENGC_PRINT_TICK 0
 /* the following code is only for internal tuning. */
 
 /* Source code to use RDTSC is quoted and modified from
@@ -3597,9 +3596,6 @@ gc_marks_body(rb_objspace_t *objspace, i https://github.com/ruby/ruby/blob/trunk/gc.c#L3596
     MARK_CHECKPOINT;
     rb_gc_mark_global_tbl();
 
-    MARK_CHECKPOINT;
-    mark_tbl(objspace, rb_class_tbl);
-
     /* mark generic instance variables for special constants */
     MARK_CHECKPOINT;
     rb_mark_generic_ivar_tbl();
Index: class.c
===================================================================
--- class.c	(revision 43262)
+++ class.c	(revision 43263)
@@ -31,7 +31,9 @@ https://github.com/ruby/ruby/blob/trunk/class.c#L31
 #include "internal.h"
 #include <ctype.h>
 
-extern st_table *rb_class_tbl;
+int rb_vm_add_root_module(ID id, VALUE module);
+
+
 #define id_attached id__attached__
 
 void
@@ -517,12 +519,10 @@ make_singleton_class(VALUE obj) https://github.com/ruby/ruby/blob/trunk/class.c#L519
 static VALUE
 boot_defclass(const char *name, VALUE super)
 {
-    extern st_table *rb_class_tbl;
     VALUE obj = rb_class_boot(super);
     ID id = rb_intern(name);
 
     rb_name_class(obj, id);
-    st_add_direct(rb_class_tbl, id, obj);
     rb_const_set((rb_cObject ? rb_cObject : obj), id, obj);
     return obj;
 }
@@ -643,7 +643,7 @@ rb_define_class(const char *name, VALUE https://github.com/ruby/ruby/blob/trunk/class.c#L643
 	rb_warn("no super class for `%s', Object assumed", name);
     }
     klass = rb_define_class_id(id, super);
-    st_add_direct(rb_class_tbl, id, klass);
+    rb_vm_add_root_module(id, klass);
     rb_name_class(klass, id);
     rb_const_set(rb_cObject, id, klass);
     rb_class_inherited(super, klass);
@@ -754,7 +754,7 @@ rb_define_module(const char *name) https://github.com/ruby/ruby/blob/trunk/class.c#L754
 	rb_raise(rb_eTypeError, "%s is not a module", rb_obj_classname(module));
     }
     module = rb_define_module_id(id);
-    st_add_direct(rb_class_tbl, id, module);
+    rb_vm_add_root_module(id, module);
     rb_const_set(rb_cObject, id, module);
 
     return module;
Index: vm.c
===================================================================
--- vm.c	(revision 43262)
+++ vm.c	(revision 43263)
@@ -1611,6 +1611,7 @@ rb_vm_mark(void *ptr) https://github.com/ruby/ruby/blob/trunk/vm.c#L1611
 	RUBY_MARK_UNLESS_NULL(vm->loaded_features_snapshot);
 	RUBY_MARK_UNLESS_NULL(vm->top_self);
 	RUBY_MARK_UNLESS_NULL(vm->coverages);
+	RUBY_MARK_UNLESS_NULL(vm->defined_module_hash);
 	rb_gc_mark_locations(vm->special_exceptions, vm->special_exceptions + ruby_special_error_count);
 
 	if (vm->loading_table) {
@@ -1634,6 +1635,17 @@ rb_vm_mark(void *ptr) https://github.com/ruby/ruby/blob/trunk/vm.c#L1635
     RUBY_MARK_LEAVE("vm");
 }
 
+
+int
+rb_vm_add_root_module(ID id, VALUE module)
+{
+    rb_vm_t *vm = GET_VM();
+    if (vm->defined_module_hash) {
+	rb_hash_aset(vm->defined_module_hash, ID2SYM(id), module);
+    }
+    return TRUE;
+}
+
 #define vm_free 0
 
 int
@@ -2619,8 +2631,9 @@ Init_top_self(void) https://github.com/ruby/ruby/blob/trunk/vm.c#L2631
     rb_define_singleton_method(rb_vm_top_self(), "to_s", main_to_s, 0);
     rb_define_alias(rb_singleton_class(rb_vm_top_self()), "inspect", "to_s");
 
-    /* initialize mark object array */
+    /* initialize mark object array, hash */
     vm->mark_object_ary = rb_ary_tmp_new(1);
+    vm->defined_module_hash = rb_hash_new();
 }
 
 VALUE *

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]