Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion concurrent_set.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ concurrent_set_try_resize_without_locking(VALUE old_set_obj, VALUE *set_obj_ptr)
if (entry->key == CONCURRENT_SET_EMPTY) {
new_set->size++;

RUBY_ASSERT(new_set->size < new_set->capacity / 2);
RUBY_ASSERT(new_set->size <= new_set->capacity / 2);
RUBY_ASSERT(entry->hash == 0);

entry->key = key;
Expand Down
25 changes: 25 additions & 0 deletions test/ruby/test_zjit.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1066,6 +1066,31 @@ def test
}, call_threshold: 2
end

# ZJIT currently only generates a MethodRedefined patch point when the method
# is called on the top-level self.
def test_method_redefinition_with_top_self
assert_runs '["original", "redefined"]', %q{
def foo
"original"
end

def test = foo

test; test

result1 = test

# Redefine the method
def foo
"redefined"
end

result2 = test

[result1, result2]
}, call_threshold: 2
end

def test_module_name_with_guard_passes
assert_compiles '"Integer"', %q{
def test(mod)
Expand Down
1 change: 1 addition & 0 deletions vm_method.c
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@ vm_cme_invalidate(rb_callable_method_entry_t *cme)
RB_DEBUG_COUNTER_INC(cc_cme_invalidate);

rb_yjit_cme_invalidate(cme);
rb_zjit_cme_invalidate(cme);
}

static int
Expand Down
2 changes: 2 additions & 0 deletions zjit.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ void rb_zjit_compile_iseq(const rb_iseq_t *iseq, rb_execution_context_t *ec, boo
void rb_zjit_profile_insn(enum ruby_vminsn_type insn, rb_execution_context_t *ec);
void rb_zjit_profile_enable(const rb_iseq_t *iseq);
void rb_zjit_bop_redefined(int redefined_flag, enum ruby_basic_operators bop);
void rb_zjit_cme_invalidate(const rb_callable_method_entry_t *cme);
void rb_zjit_invalidate_ep_is_bp(const rb_iseq_t *iseq);
void rb_zjit_iseq_mark(void *payload);
void rb_zjit_iseq_update_references(void *payload);
Expand All @@ -21,6 +22,7 @@ static inline void rb_zjit_compile_iseq(const rb_iseq_t *iseq, rb_execution_cont
static inline void rb_zjit_profile_insn(enum ruby_vminsn_type insn, rb_execution_context_t *ec) {}
static inline void rb_zjit_profile_enable(const rb_iseq_t *iseq) {}
static inline void rb_zjit_bop_redefined(int redefined_flag, enum ruby_basic_operators bop) {}
static inline void rb_zjit_cme_invalidate(const rb_callable_method_entry_t *cme) {}
static inline void rb_zjit_invalidate_ep_is_bp(const rb_iseq_t *iseq) {}
#endif // #if USE_YJIT

Expand Down
6 changes: 5 additions & 1 deletion zjit/src/codegen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use std::rc::Rc;

use crate::asm::Label;
use crate::backend::current::{Reg, ALLOC_REGS};
use crate::invariants::track_bop_assumption;
use crate::invariants::{track_bop_assumption, track_cme_assumption};
use crate::gc::{get_or_create_iseq_payload, append_gc_offsets};
use crate::state::ZJITState;
use crate::{asm::CodeBlock, cruby::*, options::debug, virtualmem::CodePtr};
Expand Down Expand Up @@ -494,6 +494,10 @@ fn gen_patch_point(jit: &mut JITState, asm: &mut Assembler, invariant: &Invarian
let side_exit_ptr = cb.resolve_label(label);
track_bop_assumption(klass, bop, code_ptr, side_exit_ptr);
}
Invariant::MethodRedefined { klass: _, method: _, cme } => {
let side_exit_ptr = cb.resolve_label(label);
track_cme_assumption(cme, code_ptr, side_exit_ptr);
}
_ => {
debug!("ZJIT: gen_patch_point: unimplemented invariant {invariant:?}");
return;
Expand Down
Loading