[ruby-cvs:67666] mame:r60485 (trunk): Manage AST NODEs out of GC

mame at ruby-lang.org mame at ruby-lang.org
Sat Oct 28 00:59:03 JST 2017


mame	2017-10-28 00:59:02 +0900 (Sat, 28 Oct 2017)

  New Revision: 60485

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

  Log:
    Manage AST NODEs out of GC
    
    NODEs in AST are no longer objects managed by GC.  This change will
    remove the restriction imposed by the GC.  For example, a NODE can use
    more than five words (this is my primary purpose; we want to store the
    position data for each NODE, for coverage library), or even a NODE can
    have variable length (some kinds of NODEs have unused fields).
    To do this, however, we need more work, since Ripper still uses T_NODE
    objects managed by the GC.
    
    The life time of NODEs is more obvious than other kinds of objects; they
    are created at parsing, and they become disused immediately after
    compilation.  This change releases all NODEs by a few `xfree`s after
    compilation, so performance will be improved a bit.  In extreme example,
    `eval("x=1;" * 10000000)` runs much faster (40 sec. -> 7.8 sec. on my
    machine).
    
    The most important part of this change is `ast_t` struct, which has
    three contents: (1) NODE buffer (malloc'ed memory), (2) a reference to
    the root NODE, and (3) an array that contains objects that must be
    marked during parsing (such as literal objects).  Some functions that
    had received `NODE*` arguments, must now receive `ast_t*`.
    
    * node.c, node.h: defines `ast_t` struct and related operations.
    * gc.c, internal.h: defines `imemo_ast`.
    * parse.y: makes `parser_params` struct have a reference to `ast_t`.
      Instead of `rb_node_newnode`, use `rb_ast_newnode` to create a NODE.
    * iseq.c, load.c, ruby.c, template/prelude.c.tmpl: modifies some
      functions to handle `ast_t*` instead of `NODE*`.
    * test/ruby/test_gc.rb: ad-hoc fix for a failed test.  The test assumes
      GC eden is increased at startup by NODE object creation.  However,
      this change now create no NODE object, so GC eden is not necessarily
      increased.

  Modified files:
    trunk/gc.c
    trunk/internal.h
    trunk/iseq.c
    trunk/load.c
    trunk/node.c
    trunk/node.h
    trunk/parse.y
    trunk/ruby.c
    trunk/template/prelude.c.tmpl
    trunk/test/ruby/test_gc.rb


More information about the ruby-cvs mailing list