(&mut self)
| 426 | } |
| 427 | |
| 428 | pub(super) fn parse_args(&mut self) -> (u16, u16) { |
| 429 | self.advance(); |
| 430 | let mut pos = 0u16; |
| 431 | let mut kw = 0u16; |
| 432 | self.comma_list(|t| t == TokenType::Rpar, |s| { |
| 433 | let unpack = if s.eat_if(TokenType::DoubleStar) { Some(2u16) } |
| 434 | else if s.eat_if(TokenType::Star) { Some(1u16) } |
| 435 | else { None }; |
| 436 | if let Some(kind) = unpack { |
| 437 | s.expr(); |
| 438 | s.chunk.emit(OpCode::UnpackArgs, kind); |
| 439 | pos = pos.saturating_add(1); |
| 440 | } else if matches!(s.peek(), Some(TokenType::Name)) { |
| 441 | let t = s.advance(); |
| 442 | if matches!(s.peek(), Some(TokenType::Equal)) { |
| 443 | let kw_name = s.lexeme(&t).to_string(); |
| 444 | s.advance(); |
| 445 | let i = s.chunk.push_const(Value::Str(kw_name)); |
| 446 | s.chunk.emit(OpCode::LoadConst, i); |
| 447 | s.expr(); |
| 448 | kw = kw.saturating_add(1); |
| 449 | } else { |
| 450 | let elem_start = s.chunk.instructions.len(); |
| 451 | s.name(t); |
| 452 | s.infix_bp(0); |
| 453 | if matches!(s.peek(), Some(TokenType::For)) { |
| 454 | let versions_before = s.ssa_versions.clone(); |
| 455 | let elem_ins: Vec<Instruction> = s.chunk.instructions.drain(elem_start..).collect(); |
| 456 | s.chunk.emit(OpCode::BuildList, 0); |
| 457 | s.comprehension_loop(&[(elem_start, elem_ins)], OpCode::ListAppend, &versions_before); |
| 458 | } |
| 459 | pos = pos.saturating_add(1); |
| 460 | } |
| 461 | } else { |
| 462 | let elem_start = s.chunk.instructions.len(); |
| 463 | s.expr(); |
| 464 | if matches!(s.peek(), Some(TokenType::For)) { |
| 465 | let versions_before = s.ssa_versions.clone(); |
| 466 | let elem_ins: Vec<Instruction> = s.chunk.instructions.drain(elem_start..).collect(); |
| 467 | s.chunk.emit(OpCode::BuildList, 0); |
| 468 | s.comprehension_loop(&[(elem_start, elem_ins)], OpCode::ListAppend, &versions_before); |
| 469 | } |
| 470 | pos = pos.saturating_add(1); |
| 471 | } |
| 472 | }); |
| 473 | self.eat(TokenType::Rpar); |
| 474 | (pos, kw) |
| 475 | } |
| 476 | |
| 477 | /* class: compiles body into fresh chunk, emits MakeClass+decorators+StoreName. */ |
| 478 | pub(super) fn class_def(&mut self) { self.class_def_with(0) } |
no test coverage detected