MCPcopy Index your code
hub / github.com/python/mypy / visit_sequence_pattern

Method visit_sequence_pattern

mypyc/irbuild/match.py:251–307  ·  view source on GitHub ↗
(self, seq_pattern: SequencePattern)

Source from the content-addressed store, hash-verified

249 self.builder.goto(self.code_block)
250
251 def visit_sequence_pattern(self, seq_pattern: SequencePattern) -> None:
252 star_index, capture, patterns = prep_sequence_pattern(seq_pattern)
253
254 is_list = self.builder.call_c(supports_sequence_protocol, [self.subject], seq_pattern.line)
255
256 self.builder.add_bool_branch(is_list, self.code_block, self.next_block)
257
258 self.builder.activate_block(self.code_block)
259 self.code_block = BasicBlock()
260
261 actual_len = self.builder.call_c(generic_ssize_t_len_op, [self.subject], seq_pattern.line)
262 min_len = len(patterns)
263
264 is_long_enough = self.builder.binary_op(
265 actual_len,
266 self.builder.load_int(min_len),
267 "==" if star_index is None else ">=",
268 seq_pattern.line,
269 )
270
271 self.builder.add_bool_branch(is_long_enough, self.code_block, self.next_block)
272
273 for i, pattern in enumerate(patterns):
274 self.builder.activate_block(self.code_block)
275 self.code_block = BasicBlock()
276
277 if star_index is not None and i >= star_index:
278 current = self.builder.binary_op(
279 actual_len, self.builder.load_int(min_len - i), "-", pattern.line
280 )
281
282 else:
283 current = self.builder.load_int(i)
284
285 item = self.builder.call_c(sequence_get_item, [self.subject, current], pattern.line)
286
287 with self.enter_subpattern(item):
288 pattern.accept(self)
289
290 if capture and star_index is not None:
291 self.builder.activate_block(self.code_block)
292 self.code_block = BasicBlock()
293
294 capture_end = self.builder.binary_op(
295 actual_len, self.builder.load_int(min_len - star_index), "-", capture.line
296 )
297
298 rest = self.builder.call_c(
299 sequence_get_slice,
300 [self.subject, self.builder.load_int(star_index), capture_end],
301 capture.line,
302 )
303
304 target = self.builder.get_assignment_target(capture)
305 self.builder.assign(target, rest, capture.line)
306
307 self.builder.goto(self.code_block)
308

Callers

nothing calls this directly

Calls 14

enter_subpatternMethod · 0.95
BasicBlockClass · 0.90
prep_sequence_patternFunction · 0.85
lenFunction · 0.85
enumerateFunction · 0.85
get_assignment_targetMethod · 0.80
call_cMethod · 0.45
add_bool_branchMethod · 0.45
activate_blockMethod · 0.45
binary_opMethod · 0.45
load_intMethod · 0.45
acceptMethod · 0.45

Tested by

no test coverage detected