summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/zjit-macos.yml2
-rw-r--r--zjit/src/asm/arm64/mod.rs2
-rw-r--r--zjit/src/codegen.rs8
3 files changed, 10 insertions, 2 deletions
diff --git a/.github/workflows/zjit-macos.yml b/.github/workflows/zjit-macos.yml
index 8e58605fe1..7060d6a252 100644
--- a/.github/workflows/zjit-macos.yml
+++ b/.github/workflows/zjit-macos.yml
@@ -125,6 +125,7 @@ jobs:
../src/bootstraptest/test_literal_suffix.rb \
../src/bootstraptest/test_load.rb \
../src/bootstraptest/test_marshal.rb \
+ ../src/bootstraptest/test_massign.rb \
../src/bootstraptest/test_method.rb \
../src/bootstraptest/test_objectspace.rb \
../src/bootstraptest/test_string.rb \
@@ -136,7 +137,6 @@ jobs:
../src/bootstraptest/test_yjit_rust_port.rb
# ../src/bootstraptest/test_eval.rb \
# ../src/bootstraptest/test_insns.rb \
- # ../src/bootstraptest/test_massign.rb \
# ../src/bootstraptest/test_proc.rb \
# ../src/bootstraptest/test_ractor.rb \
# ../src/bootstraptest/test_yjit.rb \
diff --git a/zjit/src/asm/arm64/mod.rs b/zjit/src/asm/arm64/mod.rs
index 1e1b125eaa..ef477821aa 100644
--- a/zjit/src/asm/arm64/mod.rs
+++ b/zjit/src/asm/arm64/mod.rs
@@ -936,7 +936,7 @@ pub fn stur(cb: &mut CodeBlock, rt: A64Opnd, rn: A64Opnd) {
let bytes: [u8; 4] = match (rt, rn) {
(A64Opnd::Reg(rt), A64Opnd::Mem(rn)) => {
assert!(rn.num_bits == 32 || rn.num_bits == 64);
- assert!(mem_disp_fits_bits(rn.disp), "Expected displacement to be 9 bits or less");
+ assert!(mem_disp_fits_bits(rn.disp), "Expected displacement {} to be 9 bits or less", rn.disp);
LoadStore::stur(rt.reg_no, rn.base_reg_no, rn.disp as i16, rn.num_bits).into()
},
diff --git a/zjit/src/codegen.rs b/zjit/src/codegen.rs
index 9fa088c0d1..419fc50983 100644
--- a/zjit/src/codegen.rs
+++ b/zjit/src/codegen.rs
@@ -72,6 +72,14 @@ pub extern "C" fn rb_zjit_iseq_gen_entry_point(iseq: IseqPtr, _ec: EcPtr) -> *co
return std::ptr::null();
}
+ // Reject ISEQs with very large temp stacks.
+ // We cannot encode too large offsets to access locals in arm64.
+ let stack_max = unsafe { rb_get_iseq_body_stack_max(iseq) };
+ if stack_max >= i8::MAX as u32 {
+ debug!("ISEQ stack too large: {stack_max}");
+ return std::ptr::null();
+ }
+
// Take a lock to avoid writing to ISEQ in parallel with Ractors.
// with_vm_lock() does nothing if the program doesn't use Ractors.
let code_ptr = with_vm_lock(src_loc!(), || {