summaryrefslogtreecommitdiff
path: root/yjit_codegen.c
diff options
context:
space:
mode:
authorJohn Hawthorn <[email protected]>2021-05-26 13:09:32 -0700
committerAlan Wu <[email protected]>2021-10-20 18:19:35 -0400
commit546ca8167d341bca2b7a1927950a0369b5185bf0 (patch)
tree0897c937641d87e6ae050169dc4ead242cc1a5db /yjit_codegen.c
parent9283fc1bb554da800fe02bdd1653520f8b743344 (diff)
Guard for T_OBJECT at compile time (#53)
Previously this could crash on Nokogiri when JITing the getivar instruction because we would attempt to treat Nokogiri::XML::Document's T_DATA as a T_OBJECT in calling rb_iv_index_tbl_lookup. This commit also checks for T_OBJECT at compile time and emits the rb_ivar_get fallback in that case. Co-authored-by: HParker <[email protected]> Co-authored-by: Dinah Shi <[email protected]> Co-authored-by: HParker <[email protected]> Co-authored-by: Dinah Shi <[email protected]>
Diffstat (limited to 'yjit_codegen.c')
-rw-r--r--yjit_codegen.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/yjit_codegen.c b/yjit_codegen.c
index c2bdd96e86..8a8a9aa565 100644
--- a/yjit_codegen.c
+++ b/yjit_codegen.c
@@ -1014,7 +1014,8 @@ gen_get_ivar(jitstate_t *jit, ctx_t *ctx, const int max_chain_depth, VALUE compt
// NOTE: This assumes nobody changes the allocator of the class after allocation.
// Eventually, we can encode whether an object is T_OBJECT or not
// inside object shapes.
- if (rb_get_alloc_func(comptime_val_klass) != rb_class_allocate_instance) {
+ if (!RB_TYPE_P(comptime_receiver, T_OBJECT) ||
+ rb_get_alloc_func(comptime_val_klass) != rb_class_allocate_instance) {
// General case. Call rb_ivar_get(). No need to reconstruct interpreter
// state since the routine never raises exceptions or allocate objects
// visibile to Ruby.