[ruby-cvs:57012] ko1:r49862 (trunk): * internal.h: remove struct method_table_wrapper.

ko1 at ruby-lang.org ko1 at ruby-lang.org
Fri Mar 6 07:20:16 JST 2015


ko1	2015-03-06 07:20:14 +0900 (Fri, 06 Mar 2015)

  New Revision: 49862

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

  Log:
    * internal.h: remove struct method_table_wrapper.
      struct method_table_wrapper was introduced to avoid duplicate marking
      for method tables.
      For example, `module M1; def foo; end; end` make one method table
      (mtbl) contains a method `foo`. M1 (T_MODULE) points mtbl.
      Classes C1 and C2 includes M1, then two T_ICLASS objects are created
      and they points mtbl too. In this case, three objects (one T_MODULE
      and two T_ICLASS objects) points same mtbl. On marking phase, these
      three objects mark same mtbl. To avoid such duplication, struct
      method_table_wrapper was introduced.
      However, created two T_ICLASS objects have same or shorter lifetime
      than M1 (T_MODULE) object. So that we only need to mark mtbl from M1,
      not from T_ICLASS objects. This patch tries marking only from M1.
      Note that one `Module#prepend` call creates two T_ICLASS objects.
      One for refering to a prepending Module object, same as
      `Module#include`. We don't nedd to care this T_ICLASS.
      One for moving original mtbl from a prepending class. We need to
      mark such mtbl from this T_ICLASS object. To mark the mtbl,
      we need to use `RCLASS_ORIGIN(klass)` on marking from a prepended
      class `klass`.
    * class.c: ditto.
    * eval.c (rb_using_refinement): ditto.
    * gc.c: ditto.
    * include/ruby/ruby.h: define m_tbl directly. The definition of
      struct RClass should be moved to (srcdir)/internal.h.
    * method.h: remove decl of rb_free_m_tbl_wrapper().
    * object.c: use RCLASS_M_TBL() directly.

  Modified files:
    trunk/ChangeLog
    trunk/class.c
    trunk/eval.c
    trunk/gc.c
    trunk/include/ruby/ruby.h
    trunk/internal.h
    trunk/method.h
    trunk/object.c


More information about the ruby-cvs mailing list