Skip to content

Commit fd66252

Browse files
jhawthornHParkerDinah Shi
authored
Guard for T_OBJECT at compile time (ruby#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 <HParker@github.com> Co-authored-by: Dinah Shi <dinahshi@github.com> Co-authored-by: HParker <HParker@github.com> Co-authored-by: Dinah Shi <dinahshi@github.com>
1 parent ea76369 commit fd66252

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

yjit_codegen.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1012,7 +1012,8 @@ gen_get_ivar(jitstate_t *jit, ctx_t *ctx, const int max_chain_depth, VALUE compt
10121012
// NOTE: This assumes nobody changes the allocator of the class after allocation.
10131013
// Eventually, we can encode whether an object is T_OBJECT or not
10141014
// inside object shapes.
1015-
if (rb_get_alloc_func(comptime_val_klass) != rb_class_allocate_instance) {
1015+
if (!RB_TYPE_P(comptime_receiver, T_OBJECT) ||
1016+
rb_get_alloc_func(comptime_val_klass) != rb_class_allocate_instance) {
10161017
// General case. Call rb_ivar_get(). No need to reconstruct interpreter
10171018
// state since the routine never raises exceptions or allocate objects
10181019
// visibile to Ruby.

0 commit comments

Comments
 (0)