From: ko1@... Date: 2017-07-13T02:48:30+00:00 Subject: [ruby-core:82017] [Ruby trunk Feature#13715] [PATCH] avoid garbage from Symbol#to_s in interpolation Issue #13715 has been updated by ko1 (Koichi Sasada). > VALUE rb_vm_call0_body(rb_thread_t *th, struct rb_calling_info *calling, You don't need to expose `vm_call0_body()` because ` vm_eval.c` and ` vm_insnhelper.c` are included in `vm.c`. ``` if (RB_TYPE_P(recv, T_SYMBOL)) { vm_search_method(ci, cc, recv); ``` It seems we can use `vm_method_cfunc_is()`. ``` calling.block_handler = VM_BLOCK_HANDLER_NONE; calling.argc = 0; calling.recv = recv; val = rb_vm_call0_body(th, &calling, ci, cc, 0); return RB_TYPE_P(val, T_STRING) ? val : rb_any_to_s(recv); ``` How about to call `rb_obj_as_string()` directly? I understand that you want to reuse method search results, but code will be simplified. Or make new function to call method with given ci, cc? ---------------------------------------- Feature #13715: [PATCH] avoid garbage from Symbol#to_s in interpolation https://bugs.ruby-lang.org/issues/13715#change-65748 * Author: normalperson (Eric Wong) * Status: Open * Priority: Normal * Assignee: * Target version: ---------------------------------------- ~~~ "ruby -e 'p GC.stat(:total_allocated_objects)'" goes from 70199 to 69540 allocated objects when loading RubyGems from a clean install. The increased VM size slows down the whileloop2 and vm2_dstr case slightly, but string interpolation often consists of non-strings. The addition of inline cache helps integer cases slightly, and the intended Symbol optimization gives a major improvement. speedup relative to trunk name |built ---------------|------: loop_whileloop2| 0.984 vm2_dstr* | 0.991 vm2_dstr_digit*| 1.167 vm2_dstr_int* | 1.120 vm2_dstr_nil* | 1.181 vm2_dstr_sym* | 1.663 Digits (0-9), Integers, and perhaps true/false/nil may be optimized in the future. * vm_eval.c (rb_vm_call0_body): new function exports vm_call0_body * vm_insnshelper.c (vm_tostring): new function * insns.def (tostring): call vm_tostring with ci + cc * compile.c (iseq_compile_each0): adjust tostring insn compile * benchmark/bm_vm2_dstr_digit.rb: new benchmark * benchmark/bm_vm2_dstr_int.rb: ditto * benchmark/bm_vm2_dstr_nil.rb: ditto * benchmark/bm_vm2_dstr_sym.rb: ditto ~~~ ---Files-------------------------------- 0001-avoid-garbage-from-Symbol-to_s-in-interpolation.patch (6.32 KB) -- https://bugs.ruby-lang.org/ Unsubscribe: