Skip to content

Commit e334941

Browse files
committed
Removal of Clone trait on ast nodes. Should reduce codesize somewhat.
1 parent 5707548 commit e334941

File tree

5 files changed

+44
-21
lines changed

5 files changed

+44
-21
lines changed

parser/src/ast.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ pub struct WithItem {
116116
pub optional_vars: Option<Expression>,
117117
}
118118

119-
#[derive(Debug, PartialEq, Clone)]
119+
#[derive(Debug, PartialEq)]
120120
pub enum Expression {
121121
BoolOp {
122122
a: Box<Expression>,
@@ -195,21 +195,21 @@ pub enum Expression {
195195
None,
196196
}
197197

198-
#[derive(Debug, PartialEq, Clone)]
198+
#[derive(Debug, PartialEq)]
199199
pub enum ComprehensionKind {
200200
List { element: Expression },
201201
Set { element: Expression },
202202
Dict { key: Expression, value: Expression },
203203
}
204204

205-
#[derive(Debug, PartialEq, Clone)]
205+
#[derive(Debug, PartialEq)]
206206
pub struct Comprehension {
207207
pub target: Expression,
208208
pub iter: Expression,
209209
pub ifs: Vec<Expression>,
210210
}
211211

212-
#[derive(Debug, PartialEq, Clone)]
212+
#[derive(Debug, PartialEq)]
213213
pub struct Keyword {
214214
pub name: Option<String>,
215215
pub value: Expression,
@@ -222,7 +222,7 @@ pub struct ExceptHandler {
222222
pub body: Vec<LocatedStatement>,
223223
}
224224

225-
#[derive(Debug, PartialEq, Clone)]
225+
#[derive(Debug, PartialEq)]
226226
pub enum Operator {
227227
Add,
228228
Sub,
@@ -239,19 +239,19 @@ pub enum Operator {
239239
FloorDiv,
240240
}
241241

242-
#[derive(Debug, PartialEq, Clone)]
242+
#[derive(Debug, PartialEq)]
243243
pub enum BooleanOperator {
244244
And,
245245
Or,
246246
}
247247

248-
#[derive(Debug, PartialEq, Clone)]
248+
#[derive(Debug, PartialEq)]
249249
pub enum UnaryOperator {
250250
Neg,
251251
Not,
252252
}
253253

254-
#[derive(Debug, PartialEq, Clone)]
254+
#[derive(Debug, PartialEq)]
255255
pub enum Comparison {
256256
Equal,
257257
NotEqual,
@@ -265,7 +265,7 @@ pub enum Comparison {
265265
IsNot,
266266
}
267267

268-
#[derive(Debug, PartialEq, Clone)]
268+
#[derive(Debug, PartialEq)]
269269
pub enum Number {
270270
Integer { value: i32 },
271271
Float { value: f64 },

parser/src/python.lalrpop

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,22 +62,31 @@ ExpressionStatement: ast::LocatedStatement = {
6262
} else {
6363
ast::LocatedStatement {
6464
location: loc.clone(),
65-
node: ast::Statement::Expression { expression: expr[0].clone() },
65+
node: ast::Statement::Expression { expression: expr.into_iter().next().unwrap() },
6666
}
6767
}
6868
} else {
6969
let mut targets = vec![if expr.len() > 1 {
7070
ast::Expression::Tuple { elements: expr }
7171
} else {
72-
expr[0].clone()
72+
expr.into_iter().next().unwrap()
7373
}];
74-
let mut values : Vec<ast::Expression> = suffix.into_iter().map(|test_list| if test_list.len() > 1 { ast::Expression::Tuple { elements: test_list }} else { test_list[0].clone() }).collect();
74+
let mut values : Vec<ast::Expression> = suffix
75+
.into_iter()
76+
.map(|test_list| if test_list.len() > 1 {
77+
ast::Expression::Tuple {
78+
elements: test_list
79+
}
80+
} else {
81+
test_list.into_iter().next().unwrap()
82+
})
83+
.collect();
7584

7685
while values.len() > 1 {
7786
targets.push(values.remove(0));
7887
}
7988

80-
let value = values[0].clone();
89+
let value = values.into_iter().next().unwrap();
8190

8291
ast::LocatedStatement {
8392
location: loc.clone(),
@@ -395,7 +404,7 @@ TypedArgsList: Vec<(String, Option<ast::Expression>)> = {
395404

396405
Parameter: (String, Option<ast::Expression>) = {
397406
<i:Identifier> => (i.clone(), None),
398-
<i:Identifier> "=" <e:Expression> => (i.clone(), Some(e.clone())),
407+
<i:Identifier> "=" <e:Expression> => (i.clone(), Some(e)),
399408
};
400409

401410
ClassDef: ast::LocatedStatement = {
@@ -738,8 +747,8 @@ ArgumentList: (Vec<ast::Expression>, Vec<ast::Keyword>) = {
738747
};
739748

740749
FunctionArgument: (Option<String>, ast::Expression) = {
741-
<e:Expression> => (None, e.clone()),
742-
<i:Identifier> "=" <e:Expression> => (Some(i.clone()), e.clone()),
750+
<e:Expression> => (None, e),
751+
<i:Identifier> "=" <e:Expression> => (Some(i.clone()), e),
743752
};
744753

745754
Comma<T>: Vec<T> = {

vm/src/bytecode.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ pub enum Instruction {
111111
},
112112
ForIter,
113113
ReturnValue,
114+
YieldValue,
114115
SetupLoop {
115116
start: Label,
116117
end: Label,

vm/src/compile.rs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -393,9 +393,12 @@ impl Compiler {
393393

394394
let have_kwargs = default_elements.len() > 0;
395395
if have_kwargs {
396-
self.compile_expression(&ast::Expression::Tuple {
397-
elements: default_elements,
398-
});
396+
// Construct a tuple:
397+
let size = default_elements.len();
398+
for element in default_elements {
399+
self.compile_expression(element);
400+
}
401+
self.emit(Instruction::BuildTuple { size });
399402
}
400403

401404
self.code_object_stack.push(CodeObject::new(
@@ -828,8 +831,14 @@ impl Compiler {
828831
}
829832
self.emit(Instruction::BuildSlice { size: size });
830833
}
831-
ast::Expression::Yield { .. } => {
832-
unimplemented!("TODO: implement generators");
834+
ast::Expression::Yield { expression } => {
835+
match expression {
836+
Some(expression) => self.compile_expression(expression),
837+
None => self.emit(Instruction::LoadConst {
838+
value: bytecode::Constant::None,
839+
}),
840+
};
841+
self.emit(Instruction::YieldValue);
833842
}
834843
ast::Expression::True => {
835844
self.emit(Instruction::LoadConst {

vm/src/vm.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -967,6 +967,10 @@ impl VirtualMachine {
967967
Some(Ok(value))
968968
}
969969
}
970+
bytecode::Instruction::YieldValue => {
971+
let value = self.pop_value();
972+
unimplemented!("TODO: implement generators: {:?}", value);
973+
}
970974
bytecode::Instruction::SetupLoop { start, end } => {
971975
self.push_block(Block::Loop {
972976
start: *start,

0 commit comments

Comments
 (0)