summaryrefslogtreecommitdiff
path: root/compile.c
diff options
context:
space:
mode:
authorAlan Wu <XrXr@users.noreply.github.com>2020-09-22 18:24:55 -0400
committerAlan Wu <XrXr@users.noreply.github.com>2021-10-20 18:19:23 -0400
commit265c5ca8b1ec599f609ea690bfd41f93f4d38cb1 (patch)
tree1bb17cc3cbc6eecc8cb07b5657060bbdd63bc96d /compile.c
parent5bcba2a5ee5d331f6979fcaff11ac00ee15d7508 (diff)
Avoid triggering GC while translating threaded code
Diffstat (limited to 'compile.c')
-rw-r--r--compile.c27
1 files changed, 20 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;
}