From: normalperson@... Date: 2014-09-09T08:21:43+00:00 Subject: [ruby-core:64887] [ruby-trunk - Feature #10185] [PATCH] iseq: free untranslated iseq->iseq at compile Issue #10185 has been updated by Eric Wong. File 0001-iseq-translate-iseq-inplace.patch added This combines both patches to do translation in-place. I couldn't make rb_iseq_original_iseq return const because of rb_iseq_line_trace_each, but it now caches iseq->iseq field (at the bottom of rb_iseq_t, away from hotter fields). Also, I hope to make compile_data and iseq->iseq fields a union, so it might be iseq->u1.compile_dat/iseq->u1.iseq in the future. ---------------------------------------- Feature #10185: [PATCH] iseq: free untranslated iseq->iseq at compile https://bugs.ruby-lang.org/issues/10185#change-48748 * Author: Eric Wong * Status: Open * Priority: Normal * Assignee: Eric Wong * Category: core * Target version: current: 2.2.0 ---------------------------------------- running "ruby -rpp -e 'pp GC.stat'", a reduction in malloc usage is shown: before: :malloc_increase=>118784, :oldmalloc_increase=>1178736, after: :malloc_increase=>99832, :oldmalloc_increase=>1031976, (numbers from x86-64) * compile.c (rb_iseq_translate_threaded_code): free iseq->iseq (rb_vm_addr2insn): new function for debug (rb_iseq_untranslate_threaded_code): ditto * iseq.c (iseq_memsize): support iseq->iseq == 0 (rb_iseq_disasm): untranslate for dump (iseq_data_to_ary): ditto (rb_iseq_line_trace_each): ditto * vm_dump.c (rb_vmdebug_debug_print_pre): ditto I think we can remove iseq->iseq field from the rb_iseq_t structure in the future and use transient allocation for the debug functions. rb_iseq_untranslate_threaded_code is an uncommon code path for debug and not a performance issue in normal code. ---Files-------------------------------- iseq-tc-diet.patch (4.43 KB) iseq-iseq-diet.patch (9.54 KB) 0001-iseq-translate-iseq-inplace.patch (10.1 KB) -- https://bugs.ruby-lang.org/