(self, pattern: ClassPattern)
| 130 | self.builder.goto(self.next_block) |
| 131 | |
| 132 | def visit_class_pattern(self, pattern: ClassPattern) -> None: |
| 133 | # TODO: use faster instance check for native classes (while still |
| 134 | # making sure to account for inheritance) |
| 135 | isinstance_op = ( |
| 136 | fast_isinstance_op |
| 137 | if self.builder.is_builtin_ref_expr(pattern.class_ref) |
| 138 | else slow_isinstance_op |
| 139 | ) |
| 140 | |
| 141 | cond = self.builder.primitive_op( |
| 142 | isinstance_op, [self.subject, self.builder.accept(pattern.class_ref)], pattern.line |
| 143 | ) |
| 144 | |
| 145 | self.builder.add_bool_branch(cond, self.code_block, self.next_block) |
| 146 | |
| 147 | self.bind_as_pattern(self.subject, new_block=True) |
| 148 | |
| 149 | if pattern.positionals: |
| 150 | if pattern.class_ref.fullname in MATCHABLE_BUILTINS: |
| 151 | self.builder.activate_block(self.code_block) |
| 152 | self.code_block = BasicBlock() |
| 153 | |
| 154 | pattern.positionals[0].accept(self) |
| 155 | |
| 156 | return |
| 157 | |
| 158 | node = pattern.class_ref.node |
| 159 | assert isinstance(node, TypeInfo), node |
| 160 | match_args = extract_dunder_match_args_names(node) |
| 161 | |
| 162 | for i, expr in enumerate(pattern.positionals): |
| 163 | self.builder.activate_block(self.code_block) |
| 164 | self.code_block = BasicBlock() |
| 165 | |
| 166 | # TODO: use faster "get_attr" method instead when calling on native or |
| 167 | # builtin objects |
| 168 | positional = self.builder.py_get_attr(self.subject, match_args[i], expr.line) |
| 169 | |
| 170 | with self.enter_subpattern(positional): |
| 171 | expr.accept(self) |
| 172 | |
| 173 | for key, value in zip(pattern.keyword_keys, pattern.keyword_values): |
| 174 | self.builder.activate_block(self.code_block) |
| 175 | self.code_block = BasicBlock() |
| 176 | |
| 177 | # TODO: same as above "get_attr" comment |
| 178 | attr = self.builder.py_get_attr(self.subject, key, value.line) |
| 179 | |
| 180 | with self.enter_subpattern(attr): |
| 181 | value.accept(self) |
| 182 | |
| 183 | def visit_as_pattern(self, pattern: AsPattern) -> None: |
| 184 | if pattern.pattern: |
nothing calls this directly
no test coverage detected