From 265c5ca8b1ec599f609ea690bfd41f93f4d38cb1 Mon Sep 17 00:00:00 2001 From: Alan Wu Date: Tue, 22 Sep 2020 18:24:55 -0400 Subject: Avoid triggering GC while translating threaded code --- compile.c | 27 ++++++++++++++++++++------- iseq.c | 1 + 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/compile.c b/compile.c index bb87fa6715..cbcda72949 100644 --- a/compile.c +++ b/compile.c @@ -863,16 +863,19 @@ rb_iseq_translate_threaded_code(rb_iseq_t *iseq) #if OPT_DIRECT_THREADED_CODE || OPT_CALL_THREADED_CODE const void * const *table = rb_vm_get_insns_address_table(); VALUE *encoded = (VALUE *)iseq->body->iseq_encoded; + VALUE translated_insns_buf; - unsigned int insn_idx; + unsigned int insn_idx, translated_idx; unsigned int next_ujit_idx = 0; + unsigned int translated_len = 0; bool ujit_disabled = false /*get_cmdline_flag()*/; - for (insn_idx = 0; insn_idx < iseq->body->iseq_size; /* */) - { - int insn = (int)iseq->body->iseq_encoded[insn_idx]; - int len = insn_len(insn); + VALUE *translated_insns = ALLOCV_N(VALUE, translated_insns_buf, iseq->body->iseq_size); + for (insn_idx = 0; insn_idx < iseq->body->iseq_size; /* */) { + int insn = (int)encoded[insn_idx]; + int len = insn_len(insn); + VALUE translated; uint8_t* native_code_ptr = NULL; @@ -881,14 +884,24 @@ rb_iseq_translate_threaded_code(rb_iseq_t *iseq) native_code_ptr = ujit_compile_insn(iseq, insn_idx, &next_ujit_idx); if (native_code_ptr) - encoded[insn_idx] = (VALUE)native_code_ptr; + translated = (VALUE)native_code_ptr; else - encoded[insn_idx] = (VALUE)table[insn]; + translated = (VALUE)table[insn]; + translated_insns[translated_len++] = translated; insn_idx += len; } + insn_idx = 0; + for (translated_idx = 0; translated_idx < translated_len; translated_idx++) { + int insn = (int)encoded[insn_idx]; + int len = insn_len(insn); + encoded[insn_idx] = translated_insns[translated_idx]; + insn_idx += len; + } + FL_SET((VALUE)iseq, ISEQ_TRANSLATED); + ALLOCV_END(translated_insns_buf); #endif return COMPILE_OK; } diff --git a/iseq.c b/iseq.c index ca3c551beb..19fd8fcb18 100644 --- a/iseq.c +++ b/iseq.c @@ -163,6 +163,7 @@ static int iseq_extract_values(VALUE *code, size_t pos, iseq_value_itr_t * func, void *data, rb_vm_insns_translator_t * translator) { VALUE insn = translator((void *)code[pos]); + if (insn >= VM_INSTRUCTION_SIZE) rb_bug("invalid insn. translator=%p addr2insn=%p", (void *)translator, (void*)rb_vm_insn_addr2insn2); int len = insn_len(insn); int op_no; const char *types = insn_op_types(insn); -- cgit v1.2.3