(&mut self, target: &ast::Expr)
| 7167 | } |
| 7168 | |
| 7169 | fn compile_store(&mut self, target: &ast::Expr) -> CompileResult<()> { |
| 7170 | match &target { |
| 7171 | ast::Expr::Name(ast::ExprName { id, .. }) => self.store_name(id.as_str())?, |
| 7172 | ast::Expr::Subscript(ast::ExprSubscript { |
| 7173 | value, slice, ctx, .. |
| 7174 | }) => { |
| 7175 | self.compile_subscript(value, slice, *ctx)?; |
| 7176 | } |
| 7177 | ast::Expr::Attribute(ast::ExprAttribute { value, attr, .. }) => { |
| 7178 | self.compile_expression(value)?; |
| 7179 | let namei = self.name(attr.as_str()); |
| 7180 | emit!(self, Instruction::StoreAttr { namei }); |
| 7181 | } |
| 7182 | ast::Expr::List(ast::ExprList { elts, .. }) |
| 7183 | | ast::Expr::Tuple(ast::ExprTuple { elts, .. }) => { |
| 7184 | let mut seen_star = false; |
| 7185 | |
| 7186 | // Scan for star args: |
| 7187 | for (i, element) in elts.iter().enumerate() { |
| 7188 | if let ast::Expr::Starred(_) = &element { |
| 7189 | if seen_star { |
| 7190 | return Err(self.error(CodegenErrorType::MultipleStarArgs)); |
| 7191 | } else { |
| 7192 | seen_star = true; |
| 7193 | let before = i; |
| 7194 | let after = elts.len() - i - 1; |
| 7195 | let (before, after) = (|| Some((before.to_u8()?, after.to_u8()?)))() |
| 7196 | .ok_or_else(|| { |
| 7197 | self.error_ranged( |
| 7198 | CodegenErrorType::TooManyStarUnpack, |
| 7199 | target.range(), |
| 7200 | ) |
| 7201 | })?; |
| 7202 | let counts = bytecode::UnpackExArgs { before, after }; |
| 7203 | emit!(self, Instruction::UnpackEx { counts }); |
| 7204 | } |
| 7205 | } |
| 7206 | } |
| 7207 | |
| 7208 | if !seen_star { |
| 7209 | emit!( |
| 7210 | self, |
| 7211 | Instruction::UnpackSequence { |
| 7212 | count: elts.len().to_u32(), |
| 7213 | } |
| 7214 | ); |
| 7215 | } |
| 7216 | |
| 7217 | for element in elts { |
| 7218 | if let ast::Expr::Starred(ast::ExprStarred { value, .. }) = &element { |
| 7219 | self.compile_store(value)?; |
| 7220 | } else { |
| 7221 | self.compile_store(element)?; |
| 7222 | } |
| 7223 | } |
| 7224 | } |
| 7225 | _ => { |
| 7226 | return Err(self.error(match target { |
no test coverage detected