[前][次][番号順一覧][スレッド一覧]

ruby-changes:69070

From: John <ko1@a...>
Date: Thu, 21 Oct 2021 08:20:45 +0900 (JST)
Subject: [ruby-changes:69070] 0c390e9965 (master): Add assertions of types in jit_guard_known_klass

https://git.ruby-lang.org/ruby.git/commit/?id=0c390e9965

From 0c390e99652a2a8880f06be17c663d3408e97772 Mon Sep 17 00:00:00 2001
From: John Hawthorn <john@h...>
Date: Mon, 12 Jul 2021 12:28:03 -0700
Subject: Add assertions of types in jit_guard_known_klass

---
 yjit_codegen.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/yjit_codegen.c b/yjit_codegen.c
index 8cb5a105ce..b75b6f26cf 100644
--- a/yjit_codegen.c
+++ b/yjit_codegen.c
@@ -2259,7 +2259,10 @@ jit_guard_known_klass(jitstate_t *jit, ctx_t *ctx, VALUE known_klass, insn_opnd_ https://github.com/ruby/ruby/blob/trunk/yjit_codegen.c#L2259
     val_type_t val_type = ctx_get_opnd_type(ctx, insn_opnd);
 
     if (known_klass == rb_cNilClass) {
+        RUBY_ASSERT(!val_type.is_heap);
         if (val_type.type != ETYPE_NIL) {
+            RUBY_ASSERT(val_type.type == ETYPE_UNKNOWN);
+
             ADD_COMMENT(cb, "guard object is nil");
             cmp(cb, REG0, imm_opnd(Qnil));
             jit_chain_guard(JCC_JNE, jit, ctx, max_chain_depth, side_exit);
@@ -2268,7 +2271,10 @@ jit_guard_known_klass(jitstate_t *jit, ctx_t *ctx, VALUE known_klass, insn_opnd_ https://github.com/ruby/ruby/blob/trunk/yjit_codegen.c#L2271
         }
     }
     else if (known_klass == rb_cTrueClass) {
+        RUBY_ASSERT(!val_type.is_heap);
         if (val_type.type != ETYPE_TRUE) {
+            RUBY_ASSERT(val_type.type == ETYPE_UNKNOWN);
+
             ADD_COMMENT(cb, "guard object is true");
             cmp(cb, REG0, imm_opnd(Qtrue));
             jit_chain_guard(JCC_JNE, jit, ctx, max_chain_depth, side_exit);
@@ -2277,7 +2283,10 @@ jit_guard_known_klass(jitstate_t *jit, ctx_t *ctx, VALUE known_klass, insn_opnd_ https://github.com/ruby/ruby/blob/trunk/yjit_codegen.c#L2283
         }
     }
     else if (known_klass == rb_cFalseClass) {
+        RUBY_ASSERT(!val_type.is_heap);
         if (val_type.type != ETYPE_FALSE) {
+            RUBY_ASSERT(val_type.type == ETYPE_UNKNOWN);
+
             ADD_COMMENT(cb, "guard object is false");
             STATIC_ASSERT(qfalse_is_zero, Qfalse == 0);
             test(cb, REG0, REG0);
@@ -2287,9 +2296,12 @@ jit_guard_known_klass(jitstate_t *jit, ctx_t *ctx, VALUE known_klass, insn_opnd_ https://github.com/ruby/ruby/blob/trunk/yjit_codegen.c#L2296
         }
     }
     else if (known_klass == rb_cInteger && FIXNUM_P(sample_instance)) {
+        RUBY_ASSERT(!val_type.is_heap);
         // We will guard fixnum and bignum as though they were separate classes
         // BIGNUM can be handled by the general else case below
         if (val_type.type != ETYPE_FIXNUM || !val_type.is_imm) {
+            RUBY_ASSERT(val_type.type == ETYPE_UNKNOWN);
+
             ADD_COMMENT(cb, "guard object is fixnum");
             test(cb, REG0, imm_opnd(RUBY_FIXNUM_FLAG));
             jit_chain_guard(JCC_JZ, jit, ctx, max_chain_depth, side_exit);
@@ -2297,9 +2309,12 @@ jit_guard_known_klass(jitstate_t *jit, ctx_t *ctx, VALUE known_klass, insn_opnd_ https://github.com/ruby/ruby/blob/trunk/yjit_codegen.c#L2309
         }
     }
     else if (known_klass == rb_cSymbol && STATIC_SYM_P(sample_instance)) {
+        RUBY_ASSERT(!val_type.is_heap);
         // We will guard STATIC vs DYNAMIC as though they were separate classes
         // DYNAMIC symbols can be handled by the general else case below
         if (val_type.type != ETYPE_SYMBOL || !val_type.is_imm) {
+            RUBY_ASSERT(val_type.type == ETYPE_UNKNOWN);
+
             ADD_COMMENT(cb, "guard object is static symbol");
             STATIC_ASSERT(special_shift_is_8, RUBY_SPECIAL_SHIFT == 8);
             cmp(cb, REG0_8, imm_opnd(RUBY_SYMBOL_FLAG));
@@ -2308,7 +2323,10 @@ jit_guard_known_klass(jitstate_t *jit, ctx_t *ctx, VALUE known_klass, insn_opnd_ https://github.com/ruby/ruby/blob/trunk/yjit_codegen.c#L2323
         }
     }
     else if (known_klass == rb_cFloat && FLONUM_P(sample_instance)) {
+        RUBY_ASSERT(!val_type.is_heap);
         if (val_type.type != ETYPE_FLONUM || !val_type.is_imm) {
+            RUBY_ASSERT(val_type.type == ETYPE_UNKNOWN);
+
             // We will guard flonum vs heap float as though they were separate classes
             ADD_COMMENT(cb, "guard object is flonum");
             mov(cb, REG1, REG0);
@@ -2336,6 +2354,8 @@ jit_guard_known_klass(jitstate_t *jit, ctx_t *ctx, VALUE known_klass, insn_opnd_ https://github.com/ruby/ruby/blob/trunk/yjit_codegen.c#L2354
         jit_chain_guard(JCC_JNE, jit, ctx, max_chain_depth, side_exit);
     }
     else {
+        RUBY_ASSERT(!val_type.is_imm);
+
         // Check that the receiver is a heap object
         // Note: if we get here, the class doesn't have immediate instances.
         if (!val_type.is_heap) {
-- 
cgit v1.2.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]