1. 16 6月, 2020 1 次提交
  2. 10 6月, 2020 1 次提交
    • vm_call_method: avoid marking on-stack object · 5648976c
      卜部昌平 提交于
      This callcache is on stack, must not be GCed.  However its contents are
      copied from other materials, which can be an ordinal object.  Should
      set a flag to make sure it is properly skipped by the GC.
      5648976c
  3. 09 6月, 2020 18 次提交
    • rb_eql_opt,rb_equal_opt: purge stale cc · 1016cff4
      卜部昌平 提交于
      When on USE_EMBED_CI, cd is stored statically.  Previous use could cache
      stale cd->cc, which could have already been GCed.  Need flush them.
      1016cff4
    • vm_ccs_push: do not cache non-heap entries · ffe58b9c
      卜部昌平 提交于
      Entires not GC-able must be considered to be volatile.  Not eligible for
      later use.
      ffe58b9c
    • VM_CI_NEW_ID: USE_EMBED_CI could be false · e1e84fbb
      卜部昌平 提交于
      It was a wrong idea to assume CIs are always embedded.
      e1e84fbb
    • eliminate C99 compound literals · 324038c6
      卜部昌平 提交于
      Ko1 prefers variables be assgined, instead of bare literals in function
      arguments.
      324038c6
    • vm_call_method: use struct assignment · 4fbe86d0
      卜部昌平 提交于
      This further reduces the generated binary of vm_call_method from 566
      bytes to 545 bytes on my machine, according to nm(1).
      4fbe86d0
    • rb_vm_call0: on-stack call info · 46728557
      卜部昌平 提交于
      This changeset reduces the generated binary of rb_vm_call0 from 281
      bytes to 211 bytes on my machine.  Should reduce GC pressure as well.
      46728557
    • vm_yield_setup_args: refactor use macro · db406daa
      卜部昌平 提交于
      db406daa
    • vm_call_method: no call vm_cc_fill · 367263c3
      卜部昌平 提交于
      This changeset reduces the generated binary of vm_call_method from 600
      bytes to 566 bytes on my machine, accroding to nm(1).
      367263c3
    • vm_call_refined: no call vm_cc_fill · fb3f1f95
      卜部昌平 提交于
      This changeset reduces the generated binary of vm_call_method_each_type
      from 2,442 bytes to 2,378 bytes on my machine, accroding to nm(1).
      fb3f1f95
    • vm_call_zsuper: no call vm_cc_fill · be5dfdd8
      卜部昌平 提交于
      This changeset reduces the generated binary of vm_call_method_each_type
      from 2,522 bytes to 2,442 bytes on my machine, accroding to nm(1).
      be5dfdd8
    • vm_call_method_missing_body: on-stack call info · dbbde61c
      卜部昌平 提交于
      This changeset reduces the generated binary of
      vm_call_method_missing_body from 604 bytes to 532 bytes on my machine.
      Should reduce GC pressure as well.
      dbbde61c
    • vm_call_symbol: on-stack call info · 9c287f8c
      卜部昌平 提交于
      This changeset reduces the generated binary of vm_call_symbol from 808
      bytes to 798 bytes on my machine.  Should reduce GC pressure as well.
      9c287f8c
    • vm_call_alias: no call vm_cc_fill · 62b471bd
      卜部昌平 提交于
      This changeset reduces the generated binary of vm_call_alias from 188
      bytes to 149 bytes on my machine, accroding to nm(1).
      62b471bd
    • rb_eql_opt: fully static call data · 97f45637
      卜部昌平 提交于
      This changeset reduces the generated binary of rb_eql_opt from 86 bytes to
      20 bytes on my machine, according to nm(1).
      97f45637
    • rb_vm_search_method_slowpath: skip vm_empty_cc · 3da9c519
      卜部昌平 提交于
      Now that vm_empty_cc is statically allocated outside of the object
      space.  It shall not be GCed.  Here, because vm_search_cc can return
      that.  Must not be blindly passed to RB_OBJ_WRITE, unless assertions
      fail on RGENGC_CHECK_MODE, like this:
      
      -- C level backtrace information
      -------------------------------------------
      ruby(rb_print_backtrace+0x19) [0x5555557fd579] vm_dump.c:757
      ruby(rb_vm_bugreport+0x151) [0x5555557fd6f1] vm_dump.c:955
      ruby(rb_bug+0x1d6) [0x5555558d6396] error.c:660
      ruby(check_rvalue_consistency_force+0x707) [0x5555555adb97] gc.c:1289
      ruby(check_rvalue_consistency+0x1a) [0x555555598a0a] gc.c:1305
      ruby(RVALUE_OLD_P+0x15) [0x5555555975d5] gc.c:1382
      ruby(rb_gc_writebarrier+0x9f) [0x55555559753f] gc.c:6882
      ruby(rb_obj_written+0x3a) [0x5555557a025a] include/ruby/internal/rgengc.h:180
      ruby(rb_obj_write+0x41) [0x5555557a1a81] include/ruby/internal/rgengc.h:195
      ruby(rb_vm_search_method_slowpath+0x5a) [0x5555557a125a] vm_insnhelper.c:1603
      ruby(vm_search_method_fastpath+0x197) [0x5555557d8027] vm_insnhelper.c:1638
      ruby(vm_search_method+0xea) [0x5555557d7d2a] vm_insnhelper.c:1650
      ruby(vm_search_method_wrap+0x29) [0x5555557dbaf9] vm_insnhelper.c:4091
      ruby(vm_sendish+0xa9) [0x5555557dba39] vm_insnhelper.c:4143
      ruby(vm_exec_core+0xe357) [0x5555557b0757] insns.def:801
      ruby(rb_vm_exec+0x12c) [0x5555557d17cc] vm.c:1942
      ruby(invoke_block+0xea) [0x5555557f42fa] vm.c:1058
      ruby(invoke_iseq_block_from_c+0x16e) [0x5555557f3eae] vm.c:1130
      ruby(invoke_block_from_c_bh) vm.c:1148
      ruby(vm_yield+0x71) [0x5555557f3c41] vm.c:1193
      ruby(rb_yield_0+0x25) [0x5555557ca615] vm_eval.c:1141
      ruby(rb_yield_1+0x27) [0x5555557ca5c7] vm_eval.c:1147
      ruby(rb_yield+0x34) [0x5555557ca654] vm_eval.c:1157
      ruby(rb_ary_collect+0xb0) [0x555555828320] array.c:3186
      ruby(call_cfunc_0+0x29) [0x5555557f0f39] vm_insnhelper.c:2385
      ruby(vm_call_cfunc_with_frame+0x278) [0x5555557eca98] vm_insnhelper.c:2553
      ruby(vm_sendish+0xd0) [0x5555557dba60] vm_insnhelper.c:4146
      ruby(vm_exec_core+0xe0f8) [0x5555557b04f8] insns.def:782
      ruby(rb_vm_exec+0x12c) [0x5555557d17cc] vm.c:1942
      ruby(invoke_block+0xea) [0x5555557f42fa] vm.c:1058
      ruby(invoke_iseq_block_from_c+0x16e) [0x5555557f3eae] vm.c:1130
      ruby(invoke_block_from_c_bh) vm.c:1148
      ruby(vm_yield+0x71) [0x5555557f3c41] vm.c:1193
      ruby(rb_yield_0+0x25) [0x5555557ca615] vm_eval.c:1141
      ruby(rb_yield_1+0x27) [0x5555557ca5c7] vm_eval.c:1147
      ruby(rb_yield+0x34) [0x5555557ca654] vm_eval.c:1157
      ruby(rb_ary_each+0xa5) [0x55555581c795] array.c:2242
      ruby(call_cfunc_0+0x29) [0x5555557f0f39] vm_insnhelper.c:2385
      ruby(vm_call_cfunc_with_frame+0x278) [0x5555557eca98] vm_insnhelper.c:2553
      ruby(vm_sendish+0xd0) [0x5555557dba60] vm_insnhelper.c:4146
      ruby(vm_exec_core+0xe0f8) [0x5555557b04f8] insns.def:782
      ruby(rb_vm_exec+0x12c) [0x5555557d17cc] vm.c:1942
      ruby(invoke_block+0xea) [0x5555557f42fa] vm.c:1058
      ruby(invoke_iseq_block_from_c+0x16e) [0x5555557f3eae] vm.c:1130
      ruby(invoke_block_from_c_bh) vm.c:1148
      ruby(vm_yield+0x71) [0x5555557f3c41] vm.c:1193
      ruby(rb_yield_0+0x25) [0x5555557ca615] vm_eval.c:1141
      ruby(rb_yield_1+0x27) [0x5555557ca5c7] vm_eval.c:1147
      ruby(rb_yield+0x34) [0x5555557ca654] vm_eval.c:1157
      ruby(rb_ary_each+0xa5) [0x55555581c795] array.c:2242
      ruby(call_cfunc_0+0x29) [0x5555557f0f39] vm_insnhelper.c:2385
      ruby(vm_call_cfunc_with_frame+0x278) [0x5555557eca98] vm_insnhelper.c:2553
      ruby(vm_sendish+0xd0) [0x5555557dba60] vm_insnhelper.c:4146
      ruby(vm_exec_core+0xe0f8) [0x5555557b04f8] insns.def:782
      ruby(rb_vm_exec+0x19f) [0x5555557d183f] vm.c:1951
      ruby(rb_iseq_eval+0x30) [0x5555557d2530] vm.c:2190
      ruby(load_iseq_eval+0xd6) [0x5555555fa7e6] load.c:592
      ruby(require_internal+0x25e) [0x5555555f7f5e] load.c:1022
      ruby(rb_require_string+0x27) [0x5555555f74e7] load.c:1094
      ruby(rb_f_require_relative+0x5f) [0x5555555f758f] load.c:837
      ruby(call_cfunc_1+0x30) [0x5555557f0f70] vm_insnhelper.c:2391
      ruby(vm_call_cfunc_with_frame+0x278) [0x5555557eca98] vm_insnhelper.c:2553
      ruby(vm_call_cfunc+0xad) [0x5555557e521d] vm_insnhelper.c:2574
      ruby(vm_call_method_each_type+0xc7) [0x5555557e4af7] vm_insnhelper.c:3040
      ruby(vm_call_method+0x19c) [0x5555557e45dc] vm_insnhelper.c:3144
      ruby(vm_call_general+0x2d) [0x5555557c8c3d] vm_insnhelper.c:3176
      ruby(vm_sendish+0xd0) [0x5555557dba60] vm_insnhelper.c:4146
      ruby(vm_exec_core+0xe357) [0x5555557b0757] insns.def:801
      ruby(rb_vm_exec+0x12c) [0x5555557d17cc] vm.c:1942
      ruby(rb_iseq_eval_main+0x30) [0x5555557d2670] vm.c:2201
      ruby(rb_ec_exec_node+0x16b) [0x55555557e39b] eval.c:296
      ruby(ruby_run_node+0x72) [0x55555557e1f2] eval.c:354
      ruby(main+0x78) [0x55555557a5d8] main.c:50
      3da9c519
    • rb_equal_opt: fully static call data · 8f3d4090
      卜部昌平 提交于
      This changeset reduces the generated binary of rb_equal_opt from 129 bytes
      to 17 bytes on my machine, according to nm(1).
      8f3d4090
    • vm_search_method_fastpath: avoid rb_vm_empty_cc() · 3928c151
      卜部昌平 提交于
      This is such a hot path that it's worth eliminating a function call.  Use
      the static variable directly instead.
      3928c151
    • check_cfunc: add assertions · 877238f2
      卜部昌平 提交于
      For debug.  Must not change generated binary unless VM_ASSERT is on.
      877238f2
  4. 04 6月, 2020 2 次提交
  5. 03 6月, 2020 10 次提交
    • vm_invoke_proc_block: reduce recursion · de5e0f7c
      卜部昌平 提交于
      According to nobu recursion can be longer than my expectation.  Limit
      them here.
      de5e0f7c
    • vm_call_symbol: check stack overflow · b61e82ea
      卜部昌平 提交于
      VM stack could overflow here.  The condition is when a symbol is passed
      to a block-taking method via &variable, and that symbol has never been
      used for actual method names (thus yielding that results in calling
      method_missing), and the VM stack is full (no single word left).  This
      is a once-in-a-blue-moon event.  Yet there is a very tiny room of stack
      overflow.  We need to check that.
      b61e82ea
    • vm_invoke_block: remove auto qualifier · ba20e608
      卜部昌平 提交于
      Was (harmless but) redundant.
      ba20e608
    • vm_insnhelper.c: add space [ci skip] · 6302b963
      卜部昌平 提交于
      Just cosmetic change to improve readability.
      6302b963
    • vm_invoke_symbol_block: reduce MEMCPY · 054c2fdf
      卜部昌平 提交于
      This commit changes the number of calls of MEMCPY from...
      
                                 | send  | &:sym
        -------------------------|-------|-------
         Symbol already interned | once  | twice
         Symbol not pinned yet   | none  | once
      
      to:
      
                                 | send  | &:sym
        -------------------------|-------|-------
         Symbol already interned | once  | none
         Symbol not pinned yet   | twice | once
      
      So it sacrifices exceptional situation for normal path.
      054c2fdf
    • vm_invoke_symbol_block: call vm_call_opt_send · 36322942
      卜部昌平 提交于
      Symbol#to_proc and Object#send are closely related each other.  Why not
      share their implementations.  By doing so we can skip recursive call of
      vm_exec(), which could benefit for speed.
      36322942
    • vm_invoke_block: force indirect jump · 973883aa
      卜部昌平 提交于
      This changeset slightly speeds up on my machine.
      
      Calculating -------------------------------------
                                             before                 after
      Optcarrot Lan_Master.nes    38.33488426546287     40.89825082589147 fps
                                  40.91288557922081     41.48687465359386
                                  40.96591995270991     41.98499064664184
                                  41.20461943032173     43.67314690779162
                                  42.38344888176518     44.02777536251875
                                  43.43563728880915     44.88695892714136
                                  43.88082889062643     45.11226186242523
      973883aa
    • vm_invoke_block: insertion of unused args · 796f9eda
      卜部昌平 提交于
      This makes it possible for vm_invoke_block to pass its passed arguments
      verbatimly to calling functions.  Because they are tail-called the
      function calls can be strength-recuced into indirect jumps, which is a
      huge win.
      796f9eda
    • vm_invoke_block: eliminate goto · ec87a58d
      卜部昌平 提交于
      Use recursion for better readability.
      ec87a58d
    • vm_invoke_block: move logics around · 11c70b31
      卜部昌平 提交于
      Moved block handler -> captured block conversion from vm_invokeblock to
      each vm_invoke_*_block functions.
      11c70b31
  6. 02 6月, 2020 2 次提交
    • N
      Fixed `defined?` against protected method call · d05f04d2
      Nobuyoshi Nakada 提交于
      Protected methods are restricted to be called according to the
      class/module in where it is defined, not the actual receiver's
      class.  [Bug #16931]
      d05f04d2
    • vm_insnhelper.c: merge opt_eq_func / opt_eql_func · 40ced763
      卜部昌平 提交于
      These two function were almost identical, except in case of
      T_STRING/T_FLOAT. Why not merge them into one, and let the difference be
      handled in normal method calls (slowpath).  This does not improve
      runtime performance for me, but at least reduces for instance rb_eql_opt
      from 653 bytes to 86 bytes on my machine, according to nm(1).
      40ced763
  7. 27 5月, 2020 1 次提交
  8. 23 5月, 2020 1 次提交
    • J
      Fix origin iclass pointer for modules · ad729a1d
      Jeremy Evans 提交于
      If a module has an origin, and that module is included in another
      module or class, previously the iclass created for the module had
      an origin pointer to the module's origin instead of the iclass's
      origin.
      
      Setting the origin pointer correctly requires using a stack, since
      the origin iclass is not created until after the iclass itself.
      Use a hidden ruby array to implement that stack.
      
      Correctly assigning the origin pointers in the iclass caused a
      use-after-free in GC.  If a module with an origin is included
      in a class, the iclass shares a method table with the module
      and the iclass origin shares a method table with module origin.
      
      Mark iclass origin with a flag that notes that even though the
      iclass is an origin, it shares a method table, so the method table
      should not be garbage collected.  The shared method table will be
      garbage collected when the module origin is garbage collected.
      I've tested that this does not introduce a memory leak.
      
      This change caused a VM assertion failure, which was traced to callable
      method entries using the incorrect defined_class.  Update
      rb_vm_check_redefinition_opt_method and find_defined_class_by_owner
      to treat iclass origins different than class origins to avoid this
      issue.
      
      This also includes a fix for Module#included_modules to skip
      iclasses with origins.
      
      Fixes [Bug #16736]
      ad729a1d
  9. 22 5月, 2020 1 次提交
    • K
      fix memory leak of ccs · cbd45af2
      Koichi Sasada 提交于
      rb_callable_method_entry() creates ccs entry in cc_tbl, but this
      code overwrite by insert newly created ccs and overwrote ccs never
      freed.
      [Bug #16900]
      cbd45af2
  10. 11 5月, 2020 3 次提交