Avoid triggering GC while translating threaded code
This commit is contained in:
parent
5bcba2a5ee
commit
265c5ca8b1
25
compile.c
25
compile.c
@ -863,16 +863,19 @@ rb_iseq_translate_threaded_code(rb_iseq_t *iseq)
|
|||||||
#if OPT_DIRECT_THREADED_CODE || OPT_CALL_THREADED_CODE
|
#if OPT_DIRECT_THREADED_CODE || OPT_CALL_THREADED_CODE
|
||||||
const void * const *table = rb_vm_get_insns_address_table();
|
const void * const *table = rb_vm_get_insns_address_table();
|
||||||
VALUE *encoded = (VALUE *)iseq->body->iseq_encoded;
|
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 next_ujit_idx = 0;
|
||||||
|
unsigned int translated_len = 0;
|
||||||
|
|
||||||
bool ujit_disabled = false /*get_cmdline_flag()*/;
|
bool ujit_disabled = false /*get_cmdline_flag()*/;
|
||||||
|
|
||||||
for (insn_idx = 0; insn_idx < iseq->body->iseq_size; /* */)
|
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)iseq->body->iseq_encoded[insn_idx];
|
int insn = (int)encoded[insn_idx];
|
||||||
int len = insn_len(insn);
|
int len = insn_len(insn);
|
||||||
|
VALUE translated;
|
||||||
|
|
||||||
uint8_t* native_code_ptr = NULL;
|
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);
|
native_code_ptr = ujit_compile_insn(iseq, insn_idx, &next_ujit_idx);
|
||||||
|
|
||||||
if (native_code_ptr)
|
if (native_code_ptr)
|
||||||
encoded[insn_idx] = (VALUE)native_code_ptr;
|
translated = (VALUE)native_code_ptr;
|
||||||
else
|
else
|
||||||
encoded[insn_idx] = (VALUE)table[insn];
|
translated = (VALUE)table[insn];
|
||||||
|
translated_insns[translated_len++] = translated;
|
||||||
|
|
||||||
insn_idx += len;
|
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);
|
FL_SET((VALUE)iseq, ISEQ_TRANSLATED);
|
||||||
|
ALLOCV_END(translated_insns_buf);
|
||||||
#endif
|
#endif
|
||||||
return COMPILE_OK;
|
return COMPILE_OK;
|
||||||
}
|
}
|
||||||
|
1
iseq.c
1
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)
|
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]);
|
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 len = insn_len(insn);
|
||||||
int op_no;
|
int op_no;
|
||||||
const char *types = insn_op_types(insn);
|
const char *types = insn_op_types(insn);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user