Issue #10185 has been updated by Koichi Sasada.


Thank you for waiting my comment.

I'm thinking about compatibility and expandability.

Now, in Ruby source, iseq->iseq is used only for disasm. So that your patch works completely.
However we have several compilers (iseq -> C) to use iseq->iseq directly.

Of course, most of people don't use this compiler.
So your proopsal is reasonable.

On the other hand, the name `iseq_encoded' is not only for direct threaded code. We can make another encoding scheme.

----

Summary: my proposal is:

- remain iseq->iseq (NULL as default)
- rename rb_iseq_untranslate_threaded_code to rb_iseq_decode_encoded_iseq() and fill iseq->iseq if iseq->iseq is not NULL.
- rb_iseq_decode_encoded_iseq() can call rb_iseq_untranslate_threaded_code() (one of decode scheme).
- expose (not in ruby/ but internal.h and expose symbol) rb_iseq_decode_encoded_iseq() for maniac users.



----------------------------------------
Feature #10185: [PATCH] iseq: free untranslated iseq->iseq at compile
https://bugs.ruby-lang.org/issues/10185#change-48744

* 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)


-- 
https://bugs.ruby-lang.org/