@@ -2257,7 +2257,10 @@ jit_guard_known_klass(jitstate_t *jit, ctx_t *ctx, VALUE known_klass, insn_opnd_
2257
2257
val_type_t val_type = ctx_get_opnd_type (ctx , insn_opnd );
2258
2258
2259
2259
if (known_klass == rb_cNilClass ) {
2260
+ RUBY_ASSERT (!val_type .is_heap );
2260
2261
if (val_type .type != ETYPE_NIL ) {
2262
+ RUBY_ASSERT (val_type .type == ETYPE_UNKNOWN );
2263
+
2261
2264
ADD_COMMENT (cb , "guard object is nil" );
2262
2265
cmp (cb , REG0 , imm_opnd (Qnil ));
2263
2266
jit_chain_guard (JCC_JNE , jit , ctx , max_chain_depth , side_exit );
@@ -2266,7 +2269,10 @@ jit_guard_known_klass(jitstate_t *jit, ctx_t *ctx, VALUE known_klass, insn_opnd_
2266
2269
}
2267
2270
}
2268
2271
else if (known_klass == rb_cTrueClass ) {
2272
+ RUBY_ASSERT (!val_type .is_heap );
2269
2273
if (val_type .type != ETYPE_TRUE ) {
2274
+ RUBY_ASSERT (val_type .type == ETYPE_UNKNOWN );
2275
+
2270
2276
ADD_COMMENT (cb , "guard object is true" );
2271
2277
cmp (cb , REG0 , imm_opnd (Qtrue ));
2272
2278
jit_chain_guard (JCC_JNE , jit , ctx , max_chain_depth , side_exit );
@@ -2275,7 +2281,10 @@ jit_guard_known_klass(jitstate_t *jit, ctx_t *ctx, VALUE known_klass, insn_opnd_
2275
2281
}
2276
2282
}
2277
2283
else if (known_klass == rb_cFalseClass ) {
2284
+ RUBY_ASSERT (!val_type .is_heap );
2278
2285
if (val_type .type != ETYPE_FALSE ) {
2286
+ RUBY_ASSERT (val_type .type == ETYPE_UNKNOWN );
2287
+
2279
2288
ADD_COMMENT (cb , "guard object is false" );
2280
2289
STATIC_ASSERT (qfalse_is_zero , Qfalse == 0 );
2281
2290
test (cb , REG0 , REG0 );
@@ -2285,19 +2294,25 @@ jit_guard_known_klass(jitstate_t *jit, ctx_t *ctx, VALUE known_klass, insn_opnd_
2285
2294
}
2286
2295
}
2287
2296
else if (known_klass == rb_cInteger && FIXNUM_P (sample_instance )) {
2297
+ RUBY_ASSERT (!val_type .is_heap );
2288
2298
// We will guard fixnum and bignum as though they were separate classes
2289
2299
// BIGNUM can be handled by the general else case below
2290
2300
if (val_type .type != ETYPE_FIXNUM || !val_type .is_imm ) {
2301
+ RUBY_ASSERT (val_type .type == ETYPE_UNKNOWN );
2302
+
2291
2303
ADD_COMMENT (cb , "guard object is fixnum" );
2292
2304
test (cb , REG0 , imm_opnd (RUBY_FIXNUM_FLAG ));
2293
2305
jit_chain_guard (JCC_JZ , jit , ctx , max_chain_depth , side_exit );
2294
2306
ctx_set_opnd_type (ctx , insn_opnd , TYPE_FIXNUM );
2295
2307
}
2296
2308
}
2297
2309
else if (known_klass == rb_cSymbol && STATIC_SYM_P (sample_instance )) {
2310
+ RUBY_ASSERT (!val_type .is_heap );
2298
2311
// We will guard STATIC vs DYNAMIC as though they were separate classes
2299
2312
// DYNAMIC symbols can be handled by the general else case below
2300
2313
if (val_type .type != ETYPE_SYMBOL || !val_type .is_imm ) {
2314
+ RUBY_ASSERT (val_type .type == ETYPE_UNKNOWN );
2315
+
2301
2316
ADD_COMMENT (cb , "guard object is static symbol" );
2302
2317
STATIC_ASSERT (special_shift_is_8 , RUBY_SPECIAL_SHIFT == 8 );
2303
2318
cmp (cb , REG0_8 , imm_opnd (RUBY_SYMBOL_FLAG ));
@@ -2306,7 +2321,10 @@ jit_guard_known_klass(jitstate_t *jit, ctx_t *ctx, VALUE known_klass, insn_opnd_
2306
2321
}
2307
2322
}
2308
2323
else if (known_klass == rb_cFloat && FLONUM_P (sample_instance )) {
2324
+ RUBY_ASSERT (!val_type .is_heap );
2309
2325
if (val_type .type != ETYPE_FLONUM || !val_type .is_imm ) {
2326
+ RUBY_ASSERT (val_type .type == ETYPE_UNKNOWN );
2327
+
2310
2328
// We will guard flonum vs heap float as though they were separate classes
2311
2329
ADD_COMMENT (cb , "guard object is flonum" );
2312
2330
mov (cb , REG1 , REG0 );
@@ -2334,6 +2352,8 @@ jit_guard_known_klass(jitstate_t *jit, ctx_t *ctx, VALUE known_klass, insn_opnd_
2334
2352
jit_chain_guard (JCC_JNE , jit , ctx , max_chain_depth , side_exit );
2335
2353
}
2336
2354
else {
2355
+ RUBY_ASSERT (!val_type .is_imm );
2356
+
2337
2357
// Check that the receiver is a heap object
2338
2358
// Note: if we get here, the class doesn't have immediate instances.
2339
2359
if (!val_type .is_heap ) {
@@ -2387,18 +2407,19 @@ static bool
2387
2407
jit_rb_obj_not (jitstate_t * jit , ctx_t * ctx , const struct rb_callinfo * ci , const rb_callable_method_entry_t * cme , rb_iseq_t * block , const int32_t argc )
2388
2408
{
2389
2409
const val_type_t recv_opnd = ctx_get_opnd_type (ctx , OPND_STACK (0 ));
2390
- x86opnd_t out_opnd = ctx_stack_opnd (ctx , 0 );
2391
2410
2392
2411
if (recv_opnd .type == ETYPE_NIL || recv_opnd .type == ETYPE_FALSE ) {
2393
2412
ADD_COMMENT (cb , "rb_obj_not(nil_or_false)" );
2413
+ ctx_stack_pop (ctx , 1 );
2414
+ x86opnd_t out_opnd = ctx_stack_push (ctx , TYPE_TRUE );
2394
2415
mov (cb , out_opnd , imm_opnd (Qtrue ));
2395
- ctx_set_opnd_type (ctx , OPND_STACK (0 ), TYPE_TRUE );
2396
2416
}
2397
2417
else if (recv_opnd .is_heap || recv_opnd .type != ETYPE_UNKNOWN ) {
2398
2418
// Note: recv_opnd.type != ETYPE_NIL && recv_opnd.type != ETYPE_FALSE.
2399
2419
ADD_COMMENT (cb , "rb_obj_not(truthy)" );
2420
+ ctx_stack_pop (ctx , 1 );
2421
+ x86opnd_t out_opnd = ctx_stack_push (ctx , TYPE_FALSE );
2400
2422
mov (cb , out_opnd , imm_opnd (Qfalse ));
2401
- ctx_set_opnd_type (ctx , OPND_STACK (0 ), TYPE_FALSE );
2402
2423
}
2403
2424
else {
2404
2425
// jit_guard_known_klass() already ran on the receiver which should
0 commit comments