Import ConstantData in compile.rs

This commit is contained in:
Noah 2020-12-10 12:36:29 -06:00
parent ff8512cd54
commit 281e955663

View file

@ -12,7 +12,7 @@ use indexmap::IndexSet;
use itertools::Itertools; use itertools::Itertools;
use num_complex::Complex64; use num_complex::Complex64;
use rustpython_ast as ast; use rustpython_ast as ast;
use rustpython_bytecode::bytecode::{self, CallType, CodeObject, Instruction, Label}; use rustpython_bytecode::bytecode::{self, CallType, CodeObject, ConstantData, Instruction, Label};
type CompileResult<T> = Result<T, CompileError>; type CompileResult<T> = Result<T, CompileError>;
@ -20,7 +20,7 @@ struct CodeInfo {
code: CodeObject, code: CodeObject,
instructions: Vec<Instruction>, instructions: Vec<Instruction>,
locations: Vec<bytecode::Location>, locations: Vec<bytecode::Location>,
constants: Vec<bytecode::ConstantData>, constants: Vec<ConstantData>,
name_cache: IndexSet<String>, name_cache: IndexSet<String>,
varname_cache: IndexSet<String>, varname_cache: IndexSet<String>,
cellvar_cache: IndexSet<String>, cellvar_cache: IndexSet<String>,
@ -343,7 +343,7 @@ impl Compiler {
let (statements, doc) = get_doc(&program.statements); let (statements, doc) = get_doc(&program.statements);
if let Some(value) = doc { if let Some(value) = doc {
self.emit_constant(bytecode::ConstantData::Str { value }); self.emit_constant(ConstantData::Str { value });
let doc = self.name("__doc__"); let doc = self.name("__doc__");
self.emit(Instruction::StoreGlobal(doc)) self.emit(Instruction::StoreGlobal(doc))
} }
@ -357,7 +357,7 @@ impl Compiler {
assert_eq!(self.code_stack.len(), size_before); assert_eq!(self.code_stack.len(), size_before);
// Emit None at end: // Emit None at end:
self.emit_constant(bytecode::ConstantData::None); self.emit_constant(ConstantData::None);
self.emit(Instruction::ReturnValue); self.emit(Instruction::ReturnValue);
Ok(()) Ok(())
} }
@ -391,7 +391,7 @@ impl Compiler {
} }
if !emitted_return { if !emitted_return {
self.emit_constant(bytecode::ConstantData::None); self.emit_constant(ConstantData::None);
self.emit(Instruction::ReturnValue); self.emit(Instruction::ReturnValue);
} }
@ -636,7 +636,7 @@ impl Compiler {
if is_async { if is_async {
self.emit(Instruction::BeforeAsyncWith); self.emit(Instruction::BeforeAsyncWith);
self.emit(Instruction::GetAwaitable); self.emit(Instruction::GetAwaitable);
self.emit_constant(bytecode::ConstantData::None); self.emit_constant(ConstantData::None);
self.emit(Instruction::YieldFrom); self.emit(Instruction::YieldFrom);
self.emit(Instruction::SetupAsyncWith { end: end_label }); self.emit(Instruction::SetupAsyncWith { end: end_label });
} else { } else {
@ -667,7 +667,7 @@ impl Compiler {
if is_async { if is_async {
self.emit(Instruction::GetAwaitable); self.emit(Instruction::GetAwaitable);
self.emit_constant(bytecode::ConstantData::None); self.emit_constant(ConstantData::None);
self.emit(Instruction::YieldFrom); self.emit(Instruction::YieldFrom);
} }
@ -779,7 +779,7 @@ impl Compiler {
self.compile_expression(v)?; self.compile_expression(v)?;
} }
None => { None => {
self.emit_constant(bytecode::ConstantData::None); self.emit_constant(ConstantData::None);
} }
} }
@ -862,7 +862,7 @@ impl Compiler {
let mut num_kw_only_defaults = 0; let mut num_kw_only_defaults = 0;
for (kw, default) in args.kwonlyargs.iter().zip(&args.kw_defaults) { for (kw, default) in args.kwonlyargs.iter().zip(&args.kw_defaults) {
if let Some(default) = default { if let Some(default) = default {
self.emit_constant(bytecode::ConstantData::Str { self.emit_constant(ConstantData::Str {
value: kw.arg.clone(), value: kw.arg.clone(),
}); });
self.compile_expression(default)?; self.compile_expression(default)?;
@ -1086,7 +1086,7 @@ impl Compiler {
// the last instruction is a ReturnValue already, we don't need to emit it // the last instruction is a ReturnValue already, we don't need to emit it
} }
_ => { _ => {
self.emit_constant(bytecode::ConstantData::None); self.emit_constant(ConstantData::None);
self.emit(Instruction::ReturnValue); self.emit(Instruction::ReturnValue);
} }
} }
@ -1101,7 +1101,7 @@ impl Compiler {
// Return annotation: // Return annotation:
if let Some(annotation) = returns { if let Some(annotation) = returns {
// key: // key:
self.emit_constant(bytecode::ConstantData::Str { self.emit_constant(ConstantData::Str {
value: "return".to_owned(), value: "return".to_owned(),
}); });
// value: // value:
@ -1111,7 +1111,7 @@ impl Compiler {
let mut visit_arg_annotation = |arg: &ast::Parameter| -> CompileResult<()> { let mut visit_arg_annotation = |arg: &ast::Parameter| -> CompileResult<()> {
if let Some(annotation) = &arg.annotation { if let Some(annotation) = &arg.annotation {
self.emit_constant(bytecode::ConstantData::Str { self.emit_constant(ConstantData::Str {
value: arg.arg.to_owned(), value: arg.arg.to_owned(),
}); });
self.compile_expression(&annotation)?; self.compile_expression(&annotation)?;
@ -1147,10 +1147,10 @@ impl Compiler {
self.build_closure(&code); self.build_closure(&code);
self.emit_constant(bytecode::ConstantData::Code { self.emit_constant(ConstantData::Code {
code: Box::new(code), code: Box::new(code),
}); });
self.emit_constant(bytecode::ConstantData::Str { self.emit_constant(ConstantData::Str {
value: qualified_name, value: qualified_name,
}); });
@ -1294,7 +1294,7 @@ impl Compiler {
self.emit(Instruction::LoadGlobal(dunder_name)); self.emit(Instruction::LoadGlobal(dunder_name));
let dunder_module = self.name("__module__"); let dunder_module = self.name("__module__");
self.emit(Instruction::StoreLocal(dunder_module)); self.emit(Instruction::StoreLocal(dunder_module));
self.emit_constant(bytecode::ConstantData::Str { self.emit_constant(ConstantData::Str {
value: qualified_name.clone(), value: qualified_name.clone(),
}); });
let qualname = self.name("__qualname__"); let qualname = self.name("__qualname__");
@ -1322,7 +1322,7 @@ impl Compiler {
let classcell = self.name("__classcell__"); let classcell = self.name("__classcell__");
self.emit(Instruction::StoreLocal(classcell)); self.emit(Instruction::StoreLocal(classcell));
} else { } else {
self.emit_constant(bytecode::ConstantData::None); self.emit_constant(ConstantData::None);
} }
self.emit(Instruction::ReturnValue); self.emit(Instruction::ReturnValue);
@ -1334,17 +1334,17 @@ impl Compiler {
self.build_closure(&code); self.build_closure(&code);
self.emit_constant(bytecode::ConstantData::Code { self.emit_constant(ConstantData::Code {
code: Box::new(code), code: Box::new(code),
}); });
self.emit_constant(bytecode::ConstantData::Str { self.emit_constant(ConstantData::Str {
value: name.to_owned(), value: name.to_owned(),
}); });
// Turn code object into function object: // Turn code object into function object:
self.emit(Instruction::MakeFunction); self.emit(Instruction::MakeFunction);
self.emit_constant(bytecode::ConstantData::Str { self.emit_constant(ConstantData::Str {
value: qualified_name, value: qualified_name,
}); });
@ -1356,7 +1356,7 @@ impl Compiler {
let mut kwarg_names = vec![]; let mut kwarg_names = vec![];
for keyword in keywords { for keyword in keywords {
if let Some(name) = &keyword.name { if let Some(name) = &keyword.name {
kwarg_names.push(bytecode::ConstantData::Str { kwarg_names.push(ConstantData::Str {
value: name.to_owned(), value: name.to_owned(),
}); });
} else { } else {
@ -1366,7 +1366,7 @@ impl Compiler {
self.compile_expression(&keyword.value)?; self.compile_expression(&keyword.value)?;
} }
self.emit_constant(bytecode::ConstantData::Tuple { self.emit_constant(ConstantData::Tuple {
elements: kwarg_names, elements: kwarg_names,
}); });
self.emit(Instruction::CallFunction { self.emit(Instruction::CallFunction {
@ -1390,8 +1390,8 @@ impl Compiler {
// Doc string value: // Doc string value:
self.emit_constant(match doc_str { self.emit_constant(match doc_str {
Some(doc) => bytecode::ConstantData::Str { value: doc }, Some(doc) => ConstantData::Str { value: doc },
None => bytecode::ConstantData::None, // set docstring None if not declared None => ConstantData::None, // set docstring None if not declared
}); });
} }
@ -1461,7 +1461,7 @@ impl Compiler {
handler: check_asynciter_label, handler: check_asynciter_label,
}); });
self.emit(Instruction::GetANext); self.emit(Instruction::GetANext);
self.emit_constant(bytecode::ConstantData::None); self.emit_constant(ConstantData::None);
self.emit(Instruction::YieldFrom); self.emit(Instruction::YieldFrom);
self.compile_store(target)?; self.compile_store(target)?;
self.emit(Instruction::PopBlock); self.emit(Instruction::PopBlock);
@ -1610,7 +1610,7 @@ impl Compiler {
// Store as dict entry in __annotations__ dict: // Store as dict entry in __annotations__ dict:
let annotations = self.name("__annotations__"); let annotations = self.name("__annotations__");
self.emit(Instruction::LoadNameAny(annotations)); self.emit(Instruction::LoadNameAny(annotations));
self.emit_constant(bytecode::ConstantData::Str { self.emit_constant(ConstantData::Str {
value: name.to_owned(), value: name.to_owned(),
}); });
self.emit(Instruction::StoreSubscript); self.emit(Instruction::StoreSubscript);
@ -1909,11 +1909,11 @@ impl Compiler {
} }
Number { value } => { Number { value } => {
let const_value = match value { let const_value = match value {
ast::Number::Integer { value } => bytecode::ConstantData::Integer { ast::Number::Integer { value } => ConstantData::Integer {
value: value.clone(), value: value.clone(),
}, },
ast::Number::Float { value } => bytecode::ConstantData::Float { value: *value }, ast::Number::Float { value } => ConstantData::Float { value: *value },
ast::Number::Complex { real, imag } => bytecode::ConstantData::Complex { ast::Number::Complex { real, imag } => ConstantData::Complex {
value: Complex64::new(*real, *imag), value: Complex64::new(*real, *imag),
}, },
}; };
@ -1960,7 +1960,7 @@ impl Compiler {
self.mark_generator(); self.mark_generator();
match value { match value {
Some(expression) => self.compile_expression(expression)?, Some(expression) => self.compile_expression(expression)?,
Option::None => self.emit_constant(bytecode::ConstantData::None), Option::None => self.emit_constant(ConstantData::None),
}; };
self.emit(Instruction::YieldValue); self.emit(Instruction::YieldValue);
} }
@ -1970,7 +1970,7 @@ impl Compiler {
} }
self.compile_expression(value)?; self.compile_expression(value)?;
self.emit(Instruction::GetAwaitable); self.emit(Instruction::GetAwaitable);
self.emit_constant(bytecode::ConstantData::None); self.emit_constant(ConstantData::None);
self.emit(Instruction::YieldFrom); self.emit(Instruction::YieldFrom);
} }
YieldFrom { value } => { YieldFrom { value } => {
@ -1986,26 +1986,26 @@ impl Compiler {
self.mark_generator(); self.mark_generator();
self.compile_expression(value)?; self.compile_expression(value)?;
self.emit(Instruction::GetIter); self.emit(Instruction::GetIter);
self.emit_constant(bytecode::ConstantData::None); self.emit_constant(ConstantData::None);
self.emit(Instruction::YieldFrom); self.emit(Instruction::YieldFrom);
} }
True => { True => {
self.emit_constant(bytecode::ConstantData::Boolean { value: true }); self.emit_constant(ConstantData::Boolean { value: true });
} }
False => { False => {
self.emit_constant(bytecode::ConstantData::Boolean { value: false }); self.emit_constant(ConstantData::Boolean { value: false });
} }
ast::ExpressionType::None => { ast::ExpressionType::None => {
self.emit_constant(bytecode::ConstantData::None); self.emit_constant(ConstantData::None);
} }
Ellipsis => { Ellipsis => {
self.emit_constant(bytecode::ConstantData::Ellipsis); self.emit_constant(ConstantData::Ellipsis);
} }
ast::ExpressionType::String { value } => { ast::ExpressionType::String { value } => {
self.compile_string(value)?; self.compile_string(value)?;
} }
Bytes { value } => { Bytes { value } => {
self.emit_constant(bytecode::ConstantData::Bytes { self.emit_constant(ConstantData::Bytes {
value: value.clone(), value: value.clone(),
}); });
} }
@ -2026,10 +2026,10 @@ impl Compiler {
self.emit(Instruction::ReturnValue); self.emit(Instruction::ReturnValue);
let code = self.pop_code_object(); let code = self.pop_code_object();
self.build_closure(&code); self.build_closure(&code);
self.emit_constant(bytecode::ConstantData::Code { self.emit_constant(ConstantData::Code {
code: Box::new(code), code: Box::new(code),
}); });
self.emit_constant(bytecode::ConstantData::Str { value: name }); self.emit_constant(ConstantData::Str { value: name });
// Turn code object into function object: // Turn code object into function object:
self.emit(Instruction::MakeFunction); self.emit(Instruction::MakeFunction);
@ -2076,7 +2076,7 @@ impl Compiler {
let mut subsize = 0; let mut subsize = 0;
for keyword in subkeywords { for keyword in subkeywords {
if let Some(name) = &keyword.name { if let Some(name) = &keyword.name {
self.emit_constant(bytecode::ConstantData::Str { self.emit_constant(ConstantData::Str {
value: name.to_owned(), value: name.to_owned(),
}); });
self.compile_expression(&keyword.value)?; self.compile_expression(&keyword.value)?;
@ -2138,7 +2138,7 @@ impl Compiler {
let mut kwarg_names = vec![]; let mut kwarg_names = vec![];
for keyword in keywords { for keyword in keywords {
if let Some(name) = &keyword.name { if let Some(name) = &keyword.name {
kwarg_names.push(bytecode::ConstantData::Str { kwarg_names.push(ConstantData::Str {
value: name.to_owned(), value: name.to_owned(),
}); });
} else { } else {
@ -2148,7 +2148,7 @@ impl Compiler {
self.compile_expression(&keyword.value)?; self.compile_expression(&keyword.value)?;
} }
self.emit_constant(bytecode::ConstantData::Tuple { self.emit_constant(ConstantData::Tuple {
elements: kwarg_names, elements: kwarg_names,
}); });
self.emit(Instruction::CallFunction { self.emit(Instruction::CallFunction {
@ -2349,12 +2349,12 @@ impl Compiler {
self.build_closure(&code); self.build_closure(&code);
// List comprehension code: // List comprehension code:
self.emit_constant(bytecode::ConstantData::Code { self.emit_constant(ConstantData::Code {
code: Box::new(code), code: Box::new(code),
}); });
// List comprehension function name: // List comprehension function name:
self.emit_constant(bytecode::ConstantData::Str { value: name }); self.emit_constant(ConstantData::Str { value: name });
// Turn code object into function object: // Turn code object into function object:
self.emit(Instruction::MakeFunction); self.emit(Instruction::MakeFunction);
@ -2374,7 +2374,7 @@ impl Compiler {
fn compile_string(&mut self, string: &ast::StringGroup) -> CompileResult<()> { fn compile_string(&mut self, string: &ast::StringGroup) -> CompileResult<()> {
if let Some(value) = try_get_constant_string(string) { if let Some(value) = try_get_constant_string(string) {
self.emit_constant(bytecode::ConstantData::Str { value }); self.emit_constant(ConstantData::Str { value });
} else { } else {
match string { match string {
ast::StringGroup::Joined { values } => { ast::StringGroup::Joined { values } => {
@ -2384,7 +2384,7 @@ impl Compiler {
self.emit(Instruction::BuildString { size: values.len() }) self.emit(Instruction::BuildString { size: values.len() })
} }
ast::StringGroup::Constant { value } => { ast::StringGroup::Constant { value } => {
self.emit_constant(bytecode::ConstantData::Str { self.emit_constant(ConstantData::Str {
value: value.to_owned(), value: value.to_owned(),
}); });
} }
@ -2395,7 +2395,7 @@ impl Compiler {
} => { } => {
match spec { match spec {
Some(spec) => self.compile_string(spec)?, Some(spec) => self.compile_string(spec)?,
None => self.emit_constant(bytecode::ConstantData::Str { None => self.emit_constant(ConstantData::Str {
value: String::new(), value: String::new(),
}), }),
}; };
@ -2440,7 +2440,7 @@ impl Compiler {
info.locations.push(location); info.locations.push(location);
} }
fn emit_constant(&mut self, constant: bytecode::ConstantData) { fn emit_constant(&mut self, constant: ConstantData) {
let info = self.current_codeinfo(); let info = self.current_codeinfo();
let idx = info.constants.len(); let idx = info.constants.len();
info.constants.push(constant); info.constants.push(constant);