Skip to content

Commit b044539

Browse files
committed
compactize invoke args
1 parent 0d7738c commit b044539

34 files changed

+165
-255
lines changed

src/main.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ fn run_module(vm: &VirtualMachine, module: &str) -> PyResult<()> {
496496
debug!("Running module {}", module);
497497
let runpy = vm.import("runpy", &[], 0)?;
498498
let run_module_as_main = vm.get_attribute(runpy, "_run_module_as_main")?;
499-
vm.invoke(&run_module_as_main, vec![vm.ctx.new_str(module)])?;
499+
vm.invoke(&run_module_as_main, (module,))?;
500500
Ok(())
501501
}
502502

@@ -527,11 +527,7 @@ fn run_script(vm: &VirtualMachine, scope: Scope, script_file: &str) -> PyResult<
527527

528528
let dir = file_path.parent().unwrap().to_str().unwrap().to_owned();
529529
let sys_path = vm.get_attribute(vm.sys_module.clone(), "path").unwrap();
530-
vm.call_method(
531-
&sys_path,
532-
"insert",
533-
vec![vm.ctx.new_int(0), vm.ctx.new_str(dir)],
534-
)?;
530+
vm.call_method(&sys_path, "insert", (0, dir))?;
535531

536532
match util::read_file(&file_path) {
537533
Ok(source) => {

src/shell/helper.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ impl<'vm> ShellHelper<'vm> {
6464
let (first, rest) = words.split_first().unwrap();
6565

6666
let str_iter_method = |obj, name| {
67-
let iter = self.vm.call_method(obj, name, vec![])?;
67+
let iter = self.vm.call_method(obj, name, ())?;
6868
PyIterable::<PyStrRef>::try_from_object(self.vm, iter)?.iter(self.vm)
6969
};
7070

vm/src/builtins.rs

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ mod decl {
4949
let method = vm.get_method_or_type_error(x.clone(), "__abs__", || {
5050
format!("bad operand type for abs(): '{}'", x.class().name)
5151
})?;
52-
vm.invoke(&method, vec![])
52+
vm.invoke(&method, ())
5353
}
5454

5555
#[pyfunction]
@@ -169,10 +169,8 @@ mod decl {
169169
#[pyfunction]
170170
fn dir(obj: OptionalArg<PyObjectRef>, vm: &VirtualMachine) -> PyResult<PyList> {
171171
let seq = match obj {
172-
OptionalArg::Present(obj) => vm.call_method(&obj, "__dir__", vec![])?,
173-
OptionalArg::Missing => {
174-
vm.call_method(&vm.get_locals().into_object(), "keys", vec![])?
175-
}
172+
OptionalArg::Present(obj) => vm.call_method(&obj, "__dir__", ())?,
173+
OptionalArg::Missing => vm.call_method(&vm.get_locals().into_object(), "keys", ())?,
176174
};
177175
let sorted = sorted(seq, Default::default(), vm)?;
178176
Ok(sorted)
@@ -279,7 +277,7 @@ mod decl {
279277
.into_option()
280278
.unwrap_or_else(|| PyStr::from("").into_ref(vm));
281279

282-
vm.call_method(&value, "__format__", vec![format_spec.into_object()])?
280+
vm.call_method(&value, "__format__", (format_spec,))?
283281
.downcast()
284282
.map_err(|obj| {
285283
vm.new_type_error(format!(
@@ -360,10 +358,10 @@ mod decl {
360358
let stdout = sysmodule::get_stdout(vm)?;
361359
let stderr = sysmodule::get_stderr(vm)?;
362360

363-
let _ = vm.call_method(&stderr, "flush", vec![]);
361+
let _ = vm.call_method(&stderr, "flush", ());
364362

365363
let fd_matches = |obj, expected| {
366-
vm.call_method(obj, "fileno", vec![])
364+
vm.call_method(obj, "fileno", ())
367365
.and_then(|o| i64::try_from_object(vm, o))
368366
.ok()
369367
.map_or(false, |fd| fd == expected)
@@ -389,9 +387,9 @@ mod decl {
389387
}
390388
} else {
391389
if let OptionalArg::Present(prompt) = prompt {
392-
vm.call_method(&stdout, "write", vec![prompt.into_object()])?;
390+
vm.call_method(&stdout, "write", (prompt,))?;
393391
}
394-
let _ = vm.call_method(&stdout, "flush", vec![]);
392+
let _ = vm.call_method(&stdout, "flush", ());
395393
py_io::file_readline(&stdin, None, vm)
396394
}
397395
}
@@ -497,9 +495,9 @@ mod decl {
497495

498496
let key_func = key_func.filter(|f| !vm.is_none(f));
499497
if let Some(ref key_func) = key_func {
500-
let mut x_key = vm.invoke(key_func, x.clone())?;
498+
let mut x_key = vm.invoke(key_func, (x.clone(),))?;
501499
for y in candidates_iter {
502-
let y_key = vm.invoke(key_func, y.clone())?;
500+
let y_key = vm.invoke(key_func, (y.clone(),))?;
503501
if vm.bool_cmp(&y_key, &x_key, PyComparisonOp::Gt)? {
504502
x = y;
505503
x_key = y_key;
@@ -540,14 +538,14 @@ mod decl {
540538
// TODO: this key function looks pretty duplicate. Maybe we can create
541539
// a local function?
542540
let mut x_key = if let Some(ref f) = &key_func {
543-
vm.invoke(f, vec![x.clone()])?
541+
vm.invoke(f, (x.clone(),))?
544542
} else {
545543
x.clone()
546544
};
547545

548546
for y in candidates_iter {
549547
let y_key = if let Some(ref f) = &key_func {
550-
vm.invoke(f, vec![y.clone()])?
548+
vm.invoke(f, (y.clone(),))?
551549
} else {
552550
y.clone()
553551
};
@@ -567,7 +565,7 @@ mod decl {
567565
default_value: OptionalArg<PyObjectRef>,
568566
vm: &VirtualMachine,
569567
) -> PyResult {
570-
match vm.call_method(&iterator, "__next__", vec![]) {
568+
match vm.call_method(&iterator, "__next__", ()) {
571569
Ok(value) => Ok(value),
572570
Err(value) => {
573571
if objtype::isinstance(&value, &vm.ctx.exceptions.stop_iteration) {
@@ -690,7 +688,7 @@ mod decl {
690688
Some(f) => f,
691689
None => sysmodule::get_stdout(vm)?,
692690
};
693-
let write = |obj: PyStrRef| vm.call_method(&file, "write", vec![obj.into_object()]);
691+
let write = |obj: PyStrRef| vm.call_method(&file, "write", (obj,));
694692

695693
let sep = options.sep.unwrap_or_else(|| PyStr::from(" ").into_ref(vm));
696694

@@ -711,7 +709,7 @@ mod decl {
711709
write(end)?;
712710

713711
if options.flush.to_bool() {
714-
vm.call_method(&file, "flush", vec![])?;
712+
vm.call_method(&file, "flush", ())?;
715713
}
716714

717715
Ok(())
@@ -725,12 +723,12 @@ mod decl {
725723
#[pyfunction]
726724
fn reversed(obj: PyObjectRef, vm: &VirtualMachine) -> PyResult {
727725
if let Some(reversed_method) = vm.get_method(obj.clone(), "__reversed__") {
728-
vm.invoke(&reversed_method?, PyFuncArgs::default())
726+
vm.invoke(&reversed_method?, ())
729727
} else {
730728
vm.get_method_or_type_error(obj.clone(), "__getitem__", || {
731729
"argument to reversed() must be a sequence".to_owned()
732730
})?;
733-
let len = vm.call_method(&obj, "__len__", PyFuncArgs::default())?;
731+
let len = vm.call_method(&obj, "__len__", ())?;
734732
let len = objint::get_value(&len).to_isize().unwrap();
735733
let obj_iterator = objiter::PySequenceIterator::new_reversed(obj, len);
736734
Ok(obj_iterator.into_object(vm))
@@ -746,14 +744,14 @@ mod decl {
746744
let rounded = match ndigits {
747745
OptionalArg::Present(ndigits) => match ndigits {
748746
Some(int) => {
749-
let ndigits = vm.call_method(int.as_object(), "__int__", vec![])?;
750-
vm.call_method(&number, "__round__", vec![ndigits])?
747+
let ndigits = vm.call_method(int.as_object(), "__int__", ())?;
748+
vm.call_method(&number, "__round__", (ndigits,))?
751749
}
752-
None => vm.call_method(&number, "__round__", vec![])?,
750+
None => vm.call_method(&number, "__round__", ())?,
753751
},
754752
OptionalArg::Missing => {
755753
// without a parameter, the result type is coerced to int
756-
vm.call_method(&number, "__round__", vec![])?
754+
vm.call_method(&number, "__round__", ())?
757755
}
758756
};
759757
Ok(rounded)
@@ -853,7 +851,7 @@ mod decl {
853851
.new_child_scope_with_locals(cells.clone())
854852
.new_child_scope_with_locals(namespace.clone());
855853

856-
function.invoke_with_scope(vec![].into(), &scope, vm)?;
854+
function.invoke_with_scope(().into(), &scope, vm)?;
857855

858856
let class = vm.invoke(
859857
metaclass.as_object(),

vm/src/bytesinner.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ impl ByteInnerNewOptions {
131131
if let Some(bytes_method) =
132132
vm.get_method(obj.clone(), "__bytes__")
133133
{
134-
let bytes = vm.invoke(&bytes_method?, vec![])?;
134+
let bytes = vm.invoke(&bytes_method?, ())?;
135135
return PyBytesInner::try_from_object(vm, bytes);
136136
}
137137
PyBytesInner::value_seq_try_from_object(vm, obj.clone())

vm/src/cformat.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ impl CFormatSpec {
296296
CFormatPreconversor::Str => vm.to_str(&obj)?,
297297
CFormatPreconversor::Repr | CFormatPreconversor::Ascii => vm.to_repr(&obj)?,
298298
CFormatPreconversor::Bytes => {
299-
TryFromObject::try_from_object(vm, vm.call_method(&obj, "decode", vec![])?)?
299+
TryFromObject::try_from_object(vm, vm.call_method(&obj, "decode", ())?)?
300300
}
301301
};
302302
self.format_string(result.borrow_value().to_owned())

vm/src/format.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -894,15 +894,13 @@ fn call_object_format(
894894
format_spec: &str,
895895
) -> PyResult {
896896
let argument = match preconversion_spec.and_then(FormatPreconversor::from_char) {
897-
Some(FormatPreconversor::Str) => vm.call_method(&argument, "__str__", vec![])?,
898-
Some(FormatPreconversor::Repr) => vm.call_method(&argument, "__repr__", vec![])?,
899-
Some(FormatPreconversor::Ascii) => vm.call_method(&argument, "__repr__", vec![])?,
900-
Some(FormatPreconversor::Bytes) => vm.call_method(&argument, "decode", vec![])?,
897+
Some(FormatPreconversor::Str) => vm.call_method(&argument, "__str__", ())?,
898+
Some(FormatPreconversor::Repr) => vm.call_method(&argument, "__repr__", ())?,
899+
Some(FormatPreconversor::Ascii) => vm.call_method(&argument, "__repr__", ())?,
900+
Some(FormatPreconversor::Bytes) => vm.call_method(&argument, "decode", ())?,
901901
None => argument,
902902
};
903-
let returned_type = vm.ctx.new_str(format_spec);
904-
905-
let result = vm.call_method(&argument, "__format__", vec![returned_type])?;
903+
let result = vm.call_method(&argument, "__format__", (format_spec,))?;
906904
if !objtype::isinstance(&result, &vm.ctx.types.str_type) {
907905
return Err(vm.new_type_error(format!(
908906
"__format__ must return a str, not {}",

vm/src/frame.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,7 @@ impl ExecutingFrame<'_> {
516516
let exit = vm.get_attribute(context_manager.clone(), "__exit__")?;
517517
self.push_value(exit);
518518
// Call enter:
519-
let enter_res = vm.call_method(&context_manager, "__enter__", vec![])?;
519+
let enter_res = vm.call_method(&context_manager, "__enter__", ())?;
520520
self.push_block(BlockType::Finally { handler: *end });
521521
self.push_value(enter_res);
522522
Ok(None)
@@ -525,7 +525,7 @@ impl ExecutingFrame<'_> {
525525
let mgr = self.pop_value();
526526
let aexit = vm.get_attribute(mgr.clone(), "__aexit__")?;
527527
self.push_value(aexit);
528-
let aenter_res = vm.call_method(&mgr, "__aenter__", vec![])?;
528+
let aenter_res = vm.call_method(&mgr, "__aenter__", ())?;
529529
self.push_value(aenter_res);
530530

531531
Ok(None)
@@ -552,7 +552,7 @@ impl ExecutingFrame<'_> {
552552
} else {
553553
(vm.ctx.none(), vm.ctx.none(), vm.ctx.none())
554554
};
555-
let exit_res = vm.invoke(&exit, vec![args.0, args.1, args.2])?;
555+
let exit_res = vm.invoke(&exit, args)?;
556556
self.push_value(exit_res);
557557

558558
Ok(None)
@@ -596,24 +596,24 @@ impl ExecutingFrame<'_> {
596596
awaited_obj.class().name,
597597
)
598598
})?;
599-
vm.invoke(&await_method, vec![])?
599+
vm.invoke(&await_method, ())?
600600
};
601601
self.push_value(awaitable);
602602
Ok(None)
603603
}
604604
bytecode::Instruction::GetAIter => {
605605
let aiterable = self.pop_value();
606-
let aiter = vm.call_method(&aiterable, "__aiter__", vec![])?;
606+
let aiter = vm.call_method(&aiterable, "__aiter__", ())?;
607607
self.push_value(aiter);
608608
Ok(None)
609609
}
610610
bytecode::Instruction::GetANext => {
611611
let aiter = self.last_value();
612-
let awaitable = vm.call_method(&aiter, "__anext__", vec![])?;
612+
let awaitable = vm.call_method(&aiter, "__anext__", ())?;
613613
let awaitable = if awaitable.payload_is::<PyCoroutine>() {
614614
awaitable
615615
} else {
616-
vm.call_method(&awaitable, "__await__", vec![])?
616+
vm.call_method(&awaitable, "__await__", ())?
617617
};
618618
self.push_value(awaitable);
619619
Ok(None)
@@ -675,7 +675,7 @@ impl ExecutingFrame<'_> {
675675
let displayhook = vm
676676
.get_attribute(vm.sys_module.clone(), "displayhook")
677677
.map_err(|_| vm.new_runtime_error("lost sys.displayhook".to_owned()))?;
678-
vm.invoke(&displayhook, vec![expr])?;
678+
vm.invoke(&displayhook, (expr,))?;
679679

680680
Ok(None)
681681
}
@@ -729,8 +729,8 @@ impl ExecutingFrame<'_> {
729729
None => self.pop_value(),
730730
};
731731

732-
let spec = vm.to_str(&self.pop_value())?.into_object();
733-
let formatted = vm.call_method(&value, "__format__", vec![spec])?;
732+
let spec = self.pop_value();
733+
let formatted = vm.call_method(&value, "__format__", (spec,))?;
734734
self.push_value(formatted);
735735
Ok(None)
736736
}
@@ -1149,7 +1149,7 @@ impl ExecutingFrame<'_> {
11491149
match self.builtin_coro(&coro) {
11501150
Some(coro) => coro.send(val, vm),
11511151
None if vm.is_none(&val) => objiter::call_next(vm, &coro),
1152-
None => vm.call_method(&coro, "send", vec![val]),
1152+
None => vm.call_method(&coro, "send", (val,)),
11531153
}
11541154
}
11551155

@@ -1358,9 +1358,9 @@ impl ExecutingFrame<'_> {
13581358
fn execute_unop(&mut self, vm: &VirtualMachine, op: &bytecode::UnaryOperator) -> FrameResult {
13591359
let a = self.pop_value();
13601360
let value = match *op {
1361-
bytecode::UnaryOperator::Minus => vm.call_method(&a, "__neg__", vec![])?,
1362-
bytecode::UnaryOperator::Plus => vm.call_method(&a, "__pos__", vec![])?,
1363-
bytecode::UnaryOperator::Invert => vm.call_method(&a, "__invert__", vec![])?,
1361+
bytecode::UnaryOperator::Minus => vm.call_method(&a, "__neg__", ())?,
1362+
bytecode::UnaryOperator::Plus => vm.call_method(&a, "__pos__", ())?,
1363+
bytecode::UnaryOperator::Invert => vm.call_method(&a, "__invert__", ())?,
13641364
bytecode::UnaryOperator::Not => {
13651365
let value = objbool::boolval(vm, a)?;
13661366
vm.ctx.new_bool(!value)

vm/src/function.rs

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -71,27 +71,6 @@ where
7171
}
7272
}
7373

74-
impl From<PyObjectRef> for PyFuncArgs {
75-
fn from(arg: PyObjectRef) -> Self {
76-
PyFuncArgs {
77-
args: vec![arg],
78-
kwargs: IndexMap::new(),
79-
}
80-
}
81-
}
82-
83-
impl<T> From<PyRef<T>> for PyFuncArgs
84-
where
85-
T: PyValue,
86-
{
87-
fn from(arg: PyRef<T>) -> Self {
88-
PyFuncArgs {
89-
args: vec![arg.into_object()],
90-
kwargs: IndexMap::new(),
91-
}
92-
}
93-
}
94-
9574
impl From<KwArgs> for PyFuncArgs {
9675
fn from(kwargs: KwArgs) -> Self {
9776
PyFuncArgs {

vm/src/import.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ pub(crate) fn init_importlib(
3434
enter_vm(vm, || {
3535
flame_guard!("install_external");
3636
let install_external = vm.get_attribute(importlib, "_install_external_importers")?;
37-
vm.invoke(&install_external, vec![])?;
37+
vm.invoke(&install_external, ())?;
3838
// Set pyc magic number to commit hash. Should be changed when bytecode will be more stable.
3939
let importlib_external = vm.import("_frozen_importlib_external", &[], 0)?;
4040
let mut magic = get_git_revision().into_bytes();

vm/src/obj/objbool.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use num_bigint::Sign;
22
use num_traits::Zero;
33

4-
use crate::function::{OptionalArg, PyFuncArgs};
4+
use crate::function::OptionalArg;
55
use crate::pyobject::{
66
BorrowValue, IdProtocol, IntoPyObject, PyClassImpl, PyContext, PyObjectRef, PyResult,
77
TryFromObject, TypeProtocol,
@@ -40,7 +40,7 @@ pub fn boolval(vm: &VirtualMachine, obj: PyObjectRef) -> PyResult<bool> {
4040
Some(method_or_err) => {
4141
// If descriptor returns Error, propagate it further
4242
let method = method_or_err?;
43-
let bool_obj = vm.invoke(&method, PyFuncArgs::default())?;
43+
let bool_obj = vm.invoke(&method, ())?;
4444
if !objtype::isinstance(&bool_obj, &vm.ctx.types.bool_type) {
4545
return Err(vm.new_type_error(format!(
4646
"__bool__ should return bool, returned type {}",
@@ -53,7 +53,7 @@ pub fn boolval(vm: &VirtualMachine, obj: PyObjectRef) -> PyResult<bool> {
5353
None => match vm.get_method(obj, "__len__") {
5454
Some(method_or_err) => {
5555
let method = method_or_err?;
56-
let bool_obj = vm.invoke(&method, PyFuncArgs::default())?;
56+
let bool_obj = vm.invoke(&method, ())?;
5757
let int_obj = bool_obj.payload::<PyInt>().ok_or_else(|| {
5858
vm.new_type_error(format!(
5959
"'{}' object cannot be interpreted as an integer",

0 commit comments

Comments
 (0)