From 8926c8f1ceadf54c32caf59f90a89a9b8e073ed8 Mon Sep 17 00:00:00 2001 From: coolreader18 <33094578+coolreader18@users.noreply.github.com> Date: Thu, 25 Jul 2019 10:27:04 -0400 Subject: [PATCH 1/2] Add empty tuple optimization --- vm/src/pyobject.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/vm/src/pyobject.rs b/vm/src/pyobject.rs index bc9891511e..3b1c704c5c 100644 --- a/vm/src/pyobject.rs +++ b/vm/src/pyobject.rs @@ -146,6 +146,7 @@ pub struct PyContext { pub none: PyNoneRef, pub ellipsis: PyEllipsisRef, pub not_implemented: PyNotImplementedRef, + pub empty_tuple: PyTupleRef, pub tuple_type: PyClassRef, pub tupleiterator_type: PyClassRef, pub set_type: PyClassRef, @@ -324,6 +325,9 @@ impl PyContext { let true_value = create_object(PyInt::new(BigInt::one()), &bool_type); let false_value = create_object(PyInt::new(BigInt::zero()), &bool_type); + + let empty_tuple = create_object(PyTuple::from(vec![]), &tuple_type); + let context = PyContext { bool_type, memoryview_type, @@ -382,6 +386,7 @@ impl PyContext { weakproxy_type, type_type, exceptions, + empty_tuple, }; objtype::init(&context); objlist::init(&context); @@ -645,7 +650,11 @@ impl PyContext { } pub fn new_tuple(&self, elements: Vec) -> PyObjectRef { - PyObject::new(PyTuple::from(elements), self.tuple_type(), None) + if elements.is_empty() { + self.empty_tuple.clone().into_object() + } else { + PyObject::new(PyTuple::from(elements), self.tuple_type(), None) + } } pub fn new_list(&self, elements: Vec) -> PyObjectRef { From 8aee7457b7622aff928018200895236ef7bba9c5 Mon Sep 17 00:00:00 2001 From: coolreader18 <33094578+coolreader18@users.noreply.github.com> Date: Thu, 25 Jul 2019 10:28:13 -0400 Subject: [PATCH 2/2] Add test snippet for empty tuple --- tests/snippets/tuple.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/snippets/tuple.py b/tests/snippets/tuple.py index 86f12fe943..f7d880e901 100644 --- a/tests/snippets/tuple.py +++ b/tests/snippets/tuple.py @@ -38,3 +38,9 @@ def __eq__(self, x): a = (1, 2, 3) a += 1, assert a == (1, 2, 3, 1) + +assert () is () + +a = () +b = () +assert a is b