diff --git a/src/compile.rs b/src/compile.rs index 413c9c4..42c78b2 100644 --- a/src/compile.rs +++ b/src/compile.rs @@ -14,7 +14,7 @@ use crate::symboltable::{ }; use itertools::Itertools; use num_complex::Complex64; -use rustpython_bytecode::bytecode::{self, CallType, CodeObject, Instruction, Label, Varargs}; +use rustpython_bytecode::bytecode::{self, CallType, CodeObject, Instruction, Label}; use rustpython_parser::{ast, parser}; type BasicOutputStream = PeepholeOptimizer; @@ -191,9 +191,9 @@ impl Compiler { Default::default(), 0, Vec::new(), - Varargs::None, + None, Vec::new(), - Varargs::None, + None, self.source_path.clone().unwrap(), line_number, obj_name, @@ -710,14 +710,29 @@ impl Compiler { flags |= bytecode::CodeFlags::HAS_KW_ONLY_DEFAULTS; } + let mut compile_varargs = |va: &ast::Varargs, flag| match va { + ast::Varargs::None => None, + ast::Varargs::Unnamed => { + flags |= flag; + None + } + ast::Varargs::Named(name) => { + flags |= flag; + Some(name.arg.clone()) + } + }; + + let varargs_name = compile_varargs(&args.vararg, bytecode::CodeFlags::HAS_VARARGS); + let varkeywords_name = compile_varargs(&args.kwarg, bytecode::CodeFlags::HAS_VARKEYWORDS); + let line_number = self.get_source_line_number(); self.push_output(CodeObject::new( flags, args.posonlyargs_count, args.args.iter().map(|a| a.arg.clone()).collect(), - compile_varargs(&args.vararg), + varargs_name, args.kwonlyargs.iter().map(|a| a.arg.clone()).collect(), - compile_varargs(&args.kwarg), + varkeywords_name, self.source_path.clone().unwrap(), line_number, name.to_owned(), @@ -994,9 +1009,9 @@ impl Compiler { Default::default(), 0, vec![], - Varargs::None, + None, vec![], - Varargs::None, + None, self.source_path.clone().unwrap(), line_number, name.to_owned(), @@ -1944,9 +1959,9 @@ impl Compiler { Default::default(), 1, vec![".0".to_owned()], - Varargs::None, + None, vec![], - Varargs::None, + None, self.source_path.clone().unwrap(), line_number, name.clone(), @@ -2269,14 +2284,6 @@ fn compile_location(location: &ast::Location) -> bytecode::Location { bytecode::Location::new(location.row(), location.column()) } -fn compile_varargs(varargs: &ast::Varargs) -> bytecode::Varargs { - match varargs { - ast::Varargs::None => bytecode::Varargs::None, - ast::Varargs::Unnamed => bytecode::Varargs::Unnamed, - ast::Varargs::Named(param) => bytecode::Varargs::Named(param.arg.clone()), - } -} - fn compile_conversion_flag(conversion_flag: ast::ConversionFlag) -> bytecode::ConversionFlag { match conversion_flag { ast::ConversionFlag::Ascii => bytecode::ConversionFlag::Ascii,