From e3349417282bd0c1d96c5f4f29dd078f9d8ce960 Mon Sep 17 00:00:00 2001 From: Windel Bouwman Date: Wed, 17 Oct 2018 22:04:02 +0200 Subject: [PATCH] Removal of Clone trait on ast nodes. Should reduce codesize somewhat. --- parser/src/ast.rs | 18 +++++++++--------- parser/src/python.lalrpop | 23 ++++++++++++++++------- vm/src/bytecode.rs | 1 + vm/src/compile.rs | 19 ++++++++++++++----- vm/src/vm.rs | 4 ++++ 5 files changed, 44 insertions(+), 21 deletions(-) diff --git a/parser/src/ast.rs b/parser/src/ast.rs index f39a7da29..ca29dbf26 100644 --- a/parser/src/ast.rs +++ b/parser/src/ast.rs @@ -116,7 +116,7 @@ pub struct WithItem { pub optional_vars: Option, } -#[derive(Debug, PartialEq, Clone)] +#[derive(Debug, PartialEq)] pub enum Expression { BoolOp { a: Box, @@ -195,21 +195,21 @@ pub enum Expression { None, } -#[derive(Debug, PartialEq, Clone)] +#[derive(Debug, PartialEq)] pub enum ComprehensionKind { List { element: Expression }, Set { element: Expression }, Dict { key: Expression, value: Expression }, } -#[derive(Debug, PartialEq, Clone)] +#[derive(Debug, PartialEq)] pub struct Comprehension { pub target: Expression, pub iter: Expression, pub ifs: Vec, } -#[derive(Debug, PartialEq, Clone)] +#[derive(Debug, PartialEq)] pub struct Keyword { pub name: Option, pub value: Expression, @@ -222,7 +222,7 @@ pub struct ExceptHandler { pub body: Vec, } -#[derive(Debug, PartialEq, Clone)] +#[derive(Debug, PartialEq)] pub enum Operator { Add, Sub, @@ -239,19 +239,19 @@ pub enum Operator { FloorDiv, } -#[derive(Debug, PartialEq, Clone)] +#[derive(Debug, PartialEq)] pub enum BooleanOperator { And, Or, } -#[derive(Debug, PartialEq, Clone)] +#[derive(Debug, PartialEq)] pub enum UnaryOperator { Neg, Not, } -#[derive(Debug, PartialEq, Clone)] +#[derive(Debug, PartialEq)] pub enum Comparison { Equal, NotEqual, @@ -265,7 +265,7 @@ pub enum Comparison { IsNot, } -#[derive(Debug, PartialEq, Clone)] +#[derive(Debug, PartialEq)] pub enum Number { Integer { value: i32 }, Float { value: f64 }, diff --git a/parser/src/python.lalrpop b/parser/src/python.lalrpop index 82c500631..caebd3ea9 100644 --- a/parser/src/python.lalrpop +++ b/parser/src/python.lalrpop @@ -62,22 +62,31 @@ ExpressionStatement: ast::LocatedStatement = { } else { ast::LocatedStatement { location: loc.clone(), - node: ast::Statement::Expression { expression: expr[0].clone() }, + node: ast::Statement::Expression { expression: expr.into_iter().next().unwrap() }, } } } else { let mut targets = vec![if expr.len() > 1 { ast::Expression::Tuple { elements: expr } } else { - expr[0].clone() + expr.into_iter().next().unwrap() }]; - let mut values : Vec = suffix.into_iter().map(|test_list| if test_list.len() > 1 { ast::Expression::Tuple { elements: test_list }} else { test_list[0].clone() }).collect(); + let mut values : Vec = suffix + .into_iter() + .map(|test_list| if test_list.len() > 1 { + ast::Expression::Tuple { + elements: test_list + } + } else { + test_list.into_iter().next().unwrap() + }) + .collect(); while values.len() > 1 { targets.push(values.remove(0)); } - let value = values[0].clone(); + let value = values.into_iter().next().unwrap(); ast::LocatedStatement { location: loc.clone(), @@ -395,7 +404,7 @@ TypedArgsList: Vec<(String, Option)> = { Parameter: (String, Option) = { => (i.clone(), None), - "=" => (i.clone(), Some(e.clone())), + "=" => (i.clone(), Some(e)), }; ClassDef: ast::LocatedStatement = { @@ -738,8 +747,8 @@ ArgumentList: (Vec, Vec) = { }; FunctionArgument: (Option, ast::Expression) = { - => (None, e.clone()), - "=" => (Some(i.clone()), e.clone()), + => (None, e), + "=" => (Some(i.clone()), e), }; Comma: Vec = { diff --git a/vm/src/bytecode.rs b/vm/src/bytecode.rs index ce1c30d70..2441f965c 100644 --- a/vm/src/bytecode.rs +++ b/vm/src/bytecode.rs @@ -111,6 +111,7 @@ pub enum Instruction { }, ForIter, ReturnValue, + YieldValue, SetupLoop { start: Label, end: Label, diff --git a/vm/src/compile.rs b/vm/src/compile.rs index 9b21a2250..cd98927a5 100644 --- a/vm/src/compile.rs +++ b/vm/src/compile.rs @@ -393,9 +393,12 @@ impl Compiler { let have_kwargs = default_elements.len() > 0; if have_kwargs { - self.compile_expression(&ast::Expression::Tuple { - elements: default_elements, - }); + // Construct a tuple: + let size = default_elements.len(); + for element in default_elements { + self.compile_expression(element); + } + self.emit(Instruction::BuildTuple { size }); } self.code_object_stack.push(CodeObject::new( @@ -828,8 +831,14 @@ impl Compiler { } self.emit(Instruction::BuildSlice { size: size }); } - ast::Expression::Yield { .. } => { - unimplemented!("TODO: implement generators"); + ast::Expression::Yield { expression } => { + match expression { + Some(expression) => self.compile_expression(expression), + None => self.emit(Instruction::LoadConst { + value: bytecode::Constant::None, + }), + }; + self.emit(Instruction::YieldValue); } ast::Expression::True => { self.emit(Instruction::LoadConst { diff --git a/vm/src/vm.rs b/vm/src/vm.rs index 441a68c0c..8b502d99e 100644 --- a/vm/src/vm.rs +++ b/vm/src/vm.rs @@ -967,6 +967,10 @@ impl VirtualMachine { Some(Ok(value)) } } + bytecode::Instruction::YieldValue => { + let value = self.pop_value(); + unimplemented!("TODO: implement generators: {:?}", value); + } bytecode::Instruction::SetupLoop { start, end } => { self.push_block(Block::Loop { start: *start,