[ruby-cvs:55389] ko1:r48239 (trunk): * rewrite method/block parameter fitting logic to optimize

ko1 at ruby-lang.org ko1 at ruby-lang.org
Mon Nov 3 03:02:58 JST 2014


ko1	2014-11-03 03:02:55 +0900 (Mon, 03 Nov 2014)

  New Revision: 48239

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

  Log:
    * rewrite method/block parameter fitting logic to optimize
      keyword arguments/parameters and a splat argument.
      [Feature #10440] (Details are described in this ticket)
      Most of complex part is moved to vm_args.c.
      Now, ISeq#to_a does not catch up new instruction format.
    * vm_core.h: change iseq data structures.
      * introduce rb_call_info_kw_arg_t to represent keyword arguments.
      * add rb_call_info_t::kw_arg.
      * rename rb_iseq_t::arg_post_len to rb_iseq_t::arg_post_num.
      * rename rb_iseq_t::arg_keywords to arg_keyword_num.
      * rename rb_iseq_t::arg_keyword to rb_iseq_t::arg_keyword_bits.
        to represent keyword bitmap parameter index.
        This bitmap parameter shows that which keyword parameters are given
        or not given (0 for given).
        It is refered by `checkkeyword' instruction described bellow.
      * rename rb_iseq_t::arg_keyword_check to rb_iseq_t::arg_keyword_rest
        to represent keyword rest parameter index.
      * add rb_iseq_t::arg_keyword_default_values to represent default
        keyword values.
      * rename VM_CALL_ARGS_SKIP_SETUP to VM_CALL_ARGS_SIMPLE
        to represent
          (ci->flag & (SPLAT|BLOCKARG)) &&
          ci->blockiseq == NULL &&
          ci->kw_arg == NULL.
    * vm_insnhelper.c, vm_args.c: rewrite with refactoring.
      * rewrite splat argument code.
      * rewrite keyword arguments/parameters code.
      * merge method and block parameter fitting code into one code base.
    * vm.c, vm_eval.c: catch up these changes.
    * compile.c (new_callinfo): callinfo requires kw_arg parameter.
    * compile.c (compile_array_): check the last argument Hash object or
      not. If Hash object and all keys are Symbol literals, they are
      compiled to keyword arguments.
    * insns.def (checkkeyword): add new instruction.
      This instruction check the availability of corresponding keyword.
      For example, a method "def foo k1: 'v1'; end" is cimpiled to the
      following instructions.
        0000 checkkeyword     2, 0  # check k1 is given.
        0003 branchif         9     # if given, jump to address #9
        0005 putstring        "v1"
        0007 setlocal_OP__WC__0 3   # k1 = 'v1'
        0009 trace            8
        0011 putnil
        0012 trace            16
        0014 leave
    * insns.def (opt_send_simple): removed and add new instruction
      "opt_send_without_block".
    * parse.y (new_args_tail_gen): reorder variables.
      Before this patch, a method "def foo(k1: 1, kr1:, k2: 2, **krest, &b)"
      has parameter variables "k1, kr1, k2, &b, internal_id, krest",
      but this patch reorders to "kr1, k1, k2, internal_id, krest, &b".
      (locate a block variable at last)
    * parse.y (vtable_pop): added.
      This function remove latest `n' variables from vtable.
    * iseq.c: catch up iseq data changes.
    * proc.c: ditto.
    * class.c (keyword_error): export as rb_keyword_error().
    * common.mk: depend vm_args.c for vm.o.
    * hash.c (rb_hash_has_key): export.
    * internal.h: ditto.

  Added files:
    trunk/vm_args.c
  Modified files:
    trunk/ChangeLog
    trunk/class.c
    trunk/common.mk
    trunk/compile.c
    trunk/hash.c
    trunk/insns.def
    trunk/internal.h
    trunk/iseq.c
    trunk/parse.y
    trunk/proc.c
    trunk/vm.c
    trunk/vm_core.h
    trunk/vm_eval.c
    trunk/vm_insnhelper.c


More information about the ruby-cvs mailing list