Skip to content

Commit

Permalink
Fixed is-object check in opt_send_without_block
Browse files Browse the repository at this point in the history
  • Loading branch information
maximecb authored and XrXr committed Oct 20, 2021
1 parent 7c9fdb5 commit e677ca4
Showing 1 changed file with 8 additions and 3 deletions.
11 changes: 8 additions & 3 deletions ujit_compile.c
Original file line number Diff line number Diff line change
Expand Up @@ -541,12 +541,17 @@ gen_opt_send_without_block(codeblock_t* cb, codeblock_t* ocb, ctx_t* ctx)
//print_str(cb, rb_id2name(mid));
//print_ptr(cb, RCX);

// IDEA: may be able to eliminate this in some cases if we know the previous instruction?
// TODO: guard_is_object() helper function?
// FIXME: an object can have QNil bit 1000 set
// need to check for immediate mask, Qnil and Qfalse
// Check that the receiver is an object
cmp(cb, RCX, imm_opnd(0));
je_ptr(cb, side_exit);
test(cb, RCX, imm_opnd(RUBY_IMMEDIATE_MASK | RUBY_Qnil));
test(cb, RCX, imm_opnd(RUBY_IMMEDIATE_MASK));
jnz_ptr(cb, side_exit);
cmp(cb, RCX, imm_opnd(Qfalse));
je_ptr(cb, side_exit);
cmp(cb, RCX, imm_opnd(Qnil));
je_ptr(cb, side_exit);

// Pointer to the klass field of the receiver &(recv->klass)
x86opnd_t klass_opnd = mem_opnd(64, RCX, offsetof(struct RBasic, klass));
Expand Down

0 comments on commit e677ca4

Please sign in to comment.