bail on compilation if the comptime receiver is frozen
This commit is contained in:
parent
7b5ee9a8a6
commit
744b0527ea
Notes:
git
2022-12-02 20:54:16 +00:00
@ -95,6 +95,7 @@ fn main() {
|
|||||||
|
|
||||||
// From ruby/internal/intern/object.h
|
// From ruby/internal/intern/object.h
|
||||||
.allowlist_function("rb_obj_is_kind_of")
|
.allowlist_function("rb_obj_is_kind_of")
|
||||||
|
.allowlist_function("rb_obj_frozen_p")
|
||||||
|
|
||||||
// From ruby/internal/encoding/encoding.h
|
// From ruby/internal/encoding/encoding.h
|
||||||
.allowlist_type("ruby_encoding_consts")
|
.allowlist_type("ruby_encoding_consts")
|
||||||
|
@ -2191,6 +2191,12 @@ fn gen_setinstancevariable(
|
|||||||
let comptime_receiver = jit_peek_at_self(jit);
|
let comptime_receiver = jit_peek_at_self(jit);
|
||||||
let comptime_val_klass = comptime_receiver.class_of();
|
let comptime_val_klass = comptime_receiver.class_of();
|
||||||
|
|
||||||
|
// If the comptime receiver is frozen, writing an IV will raise an exception
|
||||||
|
// and we don't want to JIT code to deal with that situation.
|
||||||
|
if comptime_receiver.is_frozen() {
|
||||||
|
return CantCompile;
|
||||||
|
}
|
||||||
|
|
||||||
// Check if the comptime class uses a custom allocator
|
// Check if the comptime class uses a custom allocator
|
||||||
let custom_allocator = unsafe { rb_get_alloc_func(comptime_val_klass) };
|
let custom_allocator = unsafe { rb_get_alloc_func(comptime_val_klass) };
|
||||||
let uses_custom_allocator = match custom_allocator {
|
let uses_custom_allocator = match custom_allocator {
|
||||||
|
@ -394,6 +394,10 @@ impl VALUE {
|
|||||||
unsafe { CLASS_OF(self) }
|
unsafe { CLASS_OF(self) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn is_frozen(self) -> bool {
|
||||||
|
unsafe { rb_obj_frozen_p(self) != VALUE(0) }
|
||||||
|
}
|
||||||
|
|
||||||
pub fn shape_id_of(self) -> u32 {
|
pub fn shape_id_of(self) -> u32 {
|
||||||
unsafe { rb_shape_get_shape_id(self) }
|
unsafe { rb_shape_get_shape_id(self) }
|
||||||
}
|
}
|
||||||
|
@ -357,6 +357,9 @@ extern "C" {
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
pub fn rb_obj_is_kind_of(obj: VALUE, klass: VALUE) -> VALUE;
|
pub fn rb_obj_is_kind_of(obj: VALUE, klass: VALUE) -> VALUE;
|
||||||
}
|
}
|
||||||
|
extern "C" {
|
||||||
|
pub fn rb_obj_frozen_p(obj: VALUE) -> VALUE;
|
||||||
|
}
|
||||||
extern "C" {
|
extern "C" {
|
||||||
pub fn rb_backref_get() -> VALUE;
|
pub fn rb_backref_get() -> VALUE;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user