Change FunctionOpArg to CodeFlags, stored in CodeObject

This commit is contained in:
coolreader18 2019-10-13 22:43:11 -05:00 committed by Noah
parent 939b49dc81
commit 0fd098569e
2 changed files with 26 additions and 29 deletions

View file

@ -137,6 +137,7 @@ impl<O: OutputStream> Compiler<O> {
fn push_new_code_object(&mut self, obj_name: String) { fn push_new_code_object(&mut self, obj_name: String) {
let line_number = self.get_source_line_number(); let line_number = self.get_source_line_number();
self.push_output(CodeObject::new( self.push_output(CodeObject::new(
Default::default(),
Vec::new(), Vec::new(),
Varargs::None, Varargs::None,
Vec::new(), Vec::new(),
@ -595,11 +596,7 @@ impl<O: OutputStream> Compiler<O> {
Ok(()) Ok(())
} }
fn enter_function( fn enter_function(&mut self, name: &str, args: &ast::Parameters) -> Result<(), CompileError> {
&mut self,
name: &str,
args: &ast::Parameters,
) -> Result<bytecode::FunctionOpArg, CompileError> {
let have_defaults = !args.defaults.is_empty(); let have_defaults = !args.defaults.is_empty();
if have_defaults { if have_defaults {
// Construct a tuple: // Construct a tuple:
@ -633,8 +630,17 @@ impl<O: OutputStream> Compiler<O> {
}); });
} }
let mut flags = bytecode::CodeFlags::default();
if have_defaults {
flags |= bytecode::CodeFlags::HAS_DEFAULTS;
}
if num_kw_only_defaults > 0 {
flags |= bytecode::CodeFlags::HAS_KW_ONLY_DEFAULTS;
}
let line_number = self.get_source_line_number(); let line_number = self.get_source_line_number();
self.push_output(CodeObject::new( self.push_output(CodeObject::new(
flags,
args.args.iter().map(|a| a.arg.clone()).collect(), args.args.iter().map(|a| a.arg.clone()).collect(),
compile_varargs(&args.vararg), compile_varargs(&args.vararg),
args.kwonlyargs.iter().map(|a| a.arg.clone()).collect(), args.kwonlyargs.iter().map(|a| a.arg.clone()).collect(),
@ -645,15 +651,7 @@ impl<O: OutputStream> Compiler<O> {
)); ));
self.enter_scope(); self.enter_scope();
let mut flags = bytecode::FunctionOpArg::default(); Ok(())
if have_defaults {
flags |= bytecode::FunctionOpArg::HAS_DEFAULTS;
}
if num_kw_only_defaults > 0 {
flags |= bytecode::FunctionOpArg::HAS_KW_ONLY_DEFAULTS;
}
Ok(flags)
} }
fn prepare_decorators( fn prepare_decorators(
@ -813,7 +811,7 @@ impl<O: OutputStream> Compiler<O> {
self.prepare_decorators(decorator_list)?; self.prepare_decorators(decorator_list)?;
let mut flags = self.enter_function(name, args)?; self.enter_function(name, args)?;
let (body, doc_str) = get_doc(body); let (body, doc_str) = get_doc(body);
@ -832,7 +830,7 @@ impl<O: OutputStream> Compiler<O> {
} }
} }
let code = self.pop_code_object(); let mut code = self.pop_code_object();
self.leave_scope(); self.leave_scope();
// Prepare type annotations: // Prepare type annotations:
@ -864,7 +862,7 @@ impl<O: OutputStream> Compiler<O> {
} }
if num_annotations > 0 { if num_annotations > 0 {
flags |= bytecode::FunctionOpArg::HAS_ANNOTATIONS; code.flags |= bytecode::CodeFlags::HAS_ANNOTATIONS;
self.emit(Instruction::BuildMap { self.emit(Instruction::BuildMap {
size: num_annotations, size: num_annotations,
unpack: false, unpack: false,
@ -884,7 +882,7 @@ impl<O: OutputStream> Compiler<O> {
}); });
// Turn code object into function object: // Turn code object into function object:
self.emit(Instruction::MakeFunction { flags }); self.emit(Instruction::MakeFunction);
self.store_docstring(doc_str); self.store_docstring(doc_str);
self.apply_decorators(decorator_list); self.apply_decorators(decorator_list);
@ -915,6 +913,7 @@ impl<O: OutputStream> Compiler<O> {
self.emit(Instruction::LoadBuildClass); self.emit(Instruction::LoadBuildClass);
let line_number = self.get_source_line_number(); let line_number = self.get_source_line_number();
self.push_output(CodeObject::new( self.push_output(CodeObject::new(
Default::default(),
vec![], vec![],
Varargs::None, Varargs::None,
vec![], vec![],
@ -950,7 +949,8 @@ impl<O: OutputStream> Compiler<O> {
}); });
self.emit(Instruction::ReturnValue); self.emit(Instruction::ReturnValue);
let code = self.pop_code_object(); let mut code = self.pop_code_object();
code.flags &= !bytecode::CodeFlags::NEW_LOCALS;
self.leave_scope(); self.leave_scope();
self.emit(Instruction::LoadConst { self.emit(Instruction::LoadConst {
@ -965,9 +965,7 @@ impl<O: OutputStream> Compiler<O> {
}); });
// Turn code object into function object: // Turn code object into function object:
self.emit(Instruction::MakeFunction { self.emit(Instruction::MakeFunction);
flags: bytecode::FunctionOpArg::default() & !bytecode::FunctionOpArg::NEW_LOCALS,
});
self.emit(Instruction::LoadConst { self.emit(Instruction::LoadConst {
value: bytecode::Constant::String { value: bytecode::Constant::String {
@ -1615,7 +1613,7 @@ impl<O: OutputStream> Compiler<O> {
Lambda { args, body } => { Lambda { args, body } => {
let name = "<lambda>".to_string(); let name = "<lambda>".to_string();
// no need to worry about the self.loop_depth because there are no loops in lambda expressions // no need to worry about the self.loop_depth because there are no loops in lambda expressions
let flags = self.enter_function(&name, args)?; self.enter_function(&name, args)?;
self.compile_expression(body)?; self.compile_expression(body)?;
self.emit(Instruction::ReturnValue); self.emit(Instruction::ReturnValue);
let code = self.pop_code_object(); let code = self.pop_code_object();
@ -1629,7 +1627,7 @@ impl<O: OutputStream> Compiler<O> {
value: bytecode::Constant::String { value: name }, value: bytecode::Constant::String { value: name },
}); });
// Turn code object into function object: // Turn code object into function object:
self.emit(Instruction::MakeFunction { flags }); self.emit(Instruction::MakeFunction);
} }
Comprehension { kind, generators } => { Comprehension { kind, generators } => {
self.compile_comprehension(kind, generators)?; self.compile_comprehension(kind, generators)?;
@ -1810,6 +1808,7 @@ impl<O: OutputStream> Compiler<O> {
let line_number = self.get_source_line_number(); let line_number = self.get_source_line_number();
// Create magnificent function <listcomp>: // Create magnificent function <listcomp>:
self.push_output(CodeObject::new( self.push_output(CodeObject::new(
Default::default(),
vec![".0".to_string()], vec![".0".to_string()],
Varargs::None, Varargs::None,
vec![], vec![],
@ -1945,9 +1944,7 @@ impl<O: OutputStream> Compiler<O> {
}); });
// Turn code object into function object: // Turn code object into function object:
self.emit(Instruction::MakeFunction { self.emit(Instruction::MakeFunction);
flags: bytecode::FunctionOpArg::default(),
});
// Evaluate iterated item: // Evaluate iterated item:
self.compile_expression(&generators[0].iter)?; self.compile_expression(&generators[0].iter)?;

View file

@ -1,4 +1,4 @@
use rustpython_bytecode::bytecode::{CodeObject, Instruction, Label, Location}; use rustpython_bytecode::bytecode::{CodeFlags, CodeObject, Instruction, Label, Location};
pub trait OutputStream: From<CodeObject> + Into<CodeObject> { pub trait OutputStream: From<CodeObject> + Into<CodeObject> {
/// Output an instruction /// Output an instruction
@ -34,6 +34,6 @@ impl OutputStream for CodeObjectStream {
self.code.label_map.insert(label, position); self.code.label_map.insert(label, position);
} }
fn mark_generator(&mut self) { fn mark_generator(&mut self) {
self.code.is_generator = true; self.code.flags |= CodeFlags::IS_GENERATOR;
} }
} }