mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
d0772632bf
Previously, YJIT crashes with rb_bug() when asked to compile new methods while out of executable memory. To handle this situation gracefully, this change keeps track of all the blocks compiled each invocation in case YJIT runs out of memory in the middle of a compliation sequence. The list is used to free all blocks in case compilation fails. yjit_gen_block() is renamed to gen_single_block() to make it distinct from gen_block_version(). Call to limit_block_version() and block_t allocation is moved into the function to help tidy error checking in the outer loop. limit_block_version() now returns by value. I feel that an out parameter with conditional mutation is unnecessarily hard to read in code that does not need to go for last drop performance. There is a good chance that the optimizer is able to output identical code anyways.
23 lines
654 B
C
23 lines
654 B
C
#ifndef YJIT_CODEGEN_H
|
|
#define YJIT_CODEGEN_H 1
|
|
|
|
typedef enum codegen_status {
|
|
YJIT_END_BLOCK,
|
|
YJIT_KEEP_COMPILING,
|
|
YJIT_CANT_COMPILE
|
|
} codegen_status_t;
|
|
|
|
// Code generation function signature
|
|
typedef codegen_status_t (*codegen_fn)(jitstate_t *jit, ctx_t *ctx, codeblock_t *cb);
|
|
|
|
static void jit_ensure_block_entry_exit(jitstate_t *jit);
|
|
|
|
static uint8_t *yjit_entry_prologue(codeblock_t *cb, const rb_iseq_t *iseq);
|
|
|
|
static block_t *gen_single_block(blockid_t blockid, const ctx_t *start_ctx, rb_execution_context_t *ec);
|
|
|
|
static void gen_code_for_exit_from_stub(void);
|
|
|
|
static void yjit_init_codegen(void);
|
|
|
|
#endif // #ifndef YJIT_CODEGEN_H
|