Skip to content

Commit 05b94d1

Browse files
committed
Correcting guards for creating new tuple.
1 parent feaa22a commit 05b94d1

File tree

2 files changed

+29
-1
lines changed
  • graalpython

2 files changed

+29
-1
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_tuple.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,27 @@ def __iter__(self):
254254
self.assertFalse(m is tm)
255255
self.assertFalse(m is mm)
256256

257+
def test_creating_tuple(self):
258+
class MyTuple(tuple):
259+
pass
260+
261+
def maketuple(t):
262+
return tuple(t)
263+
264+
a = MyTuple((1,2))
265+
b = tuple(a)
266+
self.assertFalse(a is b)
267+
268+
b = MyTuple(a)
269+
self.assertFalse(a is b)
270+
271+
b = tuple((1,2))
272+
self.assertFalse(maketuple(a) is maketuple(b))
273+
self.assertTrue(maketuple(b) is maketuple(b))
274+
self.assertTrue(tuple(b) is b)
275+
self.assertFalse(tuple(a) is a)
276+
277+
257278
class TupleCompareTest(CompareTest):
258279

259280
def test_compare(self):

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/builtins/TupleNodes.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public PTuple tuple(@SuppressWarnings("unused") PythonClass cls, PTuple iterable
102102
return iterable;
103103
}
104104

105-
@Specialization(guards = "!isNoValue(iterable)")
105+
@Specialization(guards = {"createNewTuple(cls, iterable)"})
106106
public PTuple tuple(PythonClass cls, Object iterable,
107107
@Cached("create()") GetIteratorNode getIterator,
108108
@Cached("create()") GetNextNode next,
@@ -126,6 +126,13 @@ public PTuple tuple(@SuppressWarnings("unused") Object cls, Object value) {
126126
throw new RuntimeException("list does not support iterable object " + value);
127127
}
128128

129+
protected boolean createNewTuple(PythonClass cls, Object iterable) {
130+
if (iterable instanceof PTuple) {
131+
return !(PGuards.cannotBeOverridden(cls) && PGuards.cannotBeOverridden(getClass(iterable)));
132+
}
133+
return true;
134+
}
135+
129136
public static ConstructTupleNode create() {
130137
return TupleNodesFactory.ConstructTupleNodeGen.create();
131138
}

0 commit comments

Comments
 (0)