Skip to content

Commit fb40069

Browse files
committed
[GR-23330][GR-23347][GR-23354] make test_user(list and dict) pass and test_reprlib partially pass
PullRequest: graalpython/1392
2 parents 5dcdc23 + e645842 commit fb40069

File tree

9 files changed

+80
-18
lines changed

9 files changed

+80
-18
lines changed

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_reprlib.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*graalpython.lib-python.3.test.test_reprlib.LongReprTest.test_object
77
*graalpython.lib-python.3.test.test_reprlib.LongReprTest.test_type
88
*graalpython.lib-python.3.test.test_reprlib.ReprTests.test_builtin_function
9+
*graalpython.lib-python.3.test.test_reprlib.ReprTests.test_cell
910
*graalpython.lib-python.3.test.test_reprlib.ReprTests.test_descriptors
1011
*graalpython.lib-python.3.test.test_reprlib.ReprTests.test_frozenset
1112
*graalpython.lib-python.3.test.test_reprlib.ReprTests.test_instance

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_userdict.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_pop
1818
*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_popitem
1919
*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_read
20+
*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_repr
2021
*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_repr_deep
2122
*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_setdefault
2223
*graalpython.lib-python.3.test.test_userdict.UserDictTest.test_update

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_userlist.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*graalpython.lib-python.3.test.test_userlist.UserListTest.test_exhausted_iterator
1616
*graalpython.lib-python.3.test.test_userlist.UserListTest.test_extend
1717
*graalpython.lib-python.3.test.test_userlist.UserListTest.test_extendedslicing
18+
*graalpython.lib-python.3.test.test_userlist.UserListTest.test_free_after_iterating
1819
*graalpython.lib-python.3.test.test_userlist.UserListTest.test_getitem
1920
*graalpython.lib-python.3.test.test_userlist.UserListTest.test_getitem_error
2021
*graalpython.lib-python.3.test.test_userlist.UserListTest.test_getitemoverwriteiter
@@ -30,9 +31,11 @@
3031
*graalpython.lib-python.3.test.test_userlist.UserListTest.test_mixedcmp
3132
*graalpython.lib-python.3.test.test_userlist.UserListTest.test_pickle
3233
*graalpython.lib-python.3.test.test_userlist.UserListTest.test_pop
34+
*graalpython.lib-python.3.test.test_userlist.UserListTest.test_print
3335
*graalpython.lib-python.3.test.test_userlist.UserListTest.test_radd_specials
3436
*graalpython.lib-python.3.test.test_userlist.UserListTest.test_remove
3537
*graalpython.lib-python.3.test.test_userlist.UserListTest.test_repeat
38+
*graalpython.lib-python.3.test.test_userlist.UserListTest.test_repr
3639
*graalpython.lib-python.3.test.test_userlist.UserListTest.test_repr_deep
3740
*graalpython.lib-python.3.test.test_userlist.UserListTest.test_reverse
3841
*graalpython.lib-python.3.test.test_userlist.UserListTest.test_reversed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cell/CellBuiltins.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import com.oracle.graal.python.builtins.PythonBuiltins;
6060
import com.oracle.graal.python.builtins.objects.PNone;
6161
import com.oracle.graal.python.builtins.objects.PNotImplemented;
62+
import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
6263
import com.oracle.graal.python.builtins.objects.cell.CellBuiltinsFactory.GetRefNodeGen;
6364
import com.oracle.graal.python.builtins.objects.function.PArguments;
6465
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
@@ -280,10 +281,10 @@ public String repr(PCell self,
280281
@Cached("create()") TypeNodes.GetNameNode getNameNode) {
281282
Object ref = getRef.execute(self);
282283
if (ref == null) {
283-
return String.format("<cell at %s: empty>", self.hashCode());
284+
return String.format("<cell at 0x%x: empty>", PythonAbstractObject.systemHashCode(self));
284285
}
285286
String typeName = getNameNode.execute(lib.getLazyPythonClass(ref));
286-
return String.format("<cell at %s: %s object at %s>", self.hashCode(), typeName, ref.hashCode());
287+
return String.format("<cell at 0x%x: %s object at 0x%x>", PythonAbstractObject.systemHashCode(self), typeName, PythonAbstractObject.systemHashCode(ref));
287288
}
288289

289290
@Fallback

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/dict/DictReprBuiltin.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444

4545
import java.util.List;
4646

47+
import com.oracle.graal.python.PythonLanguage;
4748
import com.oracle.graal.python.builtins.Builtin;
4849
import com.oracle.graal.python.builtins.CoreFunctions;
4950
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
@@ -63,11 +64,12 @@
6364
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
6465
import com.oracle.graal.python.nodes.util.CannotCastException;
6566
import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
66-
import com.oracle.graal.python.runtime.exception.PException;
67+
import com.oracle.graal.python.runtime.PythonContext;
6768
import com.oracle.graal.python.runtime.exception.PythonErrorType;
6869
import com.oracle.graal.python.util.PythonUtils;
6970
import com.oracle.truffle.api.CompilerDirectives;
7071
import com.oracle.truffle.api.dsl.Cached;
72+
import com.oracle.truffle.api.dsl.CachedContext;
7173
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
7274
import com.oracle.truffle.api.dsl.NodeFactory;
7375
import com.oracle.truffle.api.dsl.Specialization;
@@ -119,8 +121,11 @@ public final ReprState execute(Object key, ReprState arg) {
119121
return executeReprState(key, arg);
120122
}
121123

122-
protected String getReprString(Object obj, ReprState s, LookupAndCallUnaryDynamicNode reprNode, CastToJavaStringNode castStr, BranchProfile nullBranch, PRaiseNode raiseNode)
123-
throws PException {
124+
protected static String getReprString(Object obj, ReprState s,
125+
LookupAndCallUnaryDynamicNode reprNode,
126+
CastToJavaStringNode castStr,
127+
BranchProfile nullBranch,
128+
PRaiseNode raiseNode) {
124129
Object reprObj = s == null || obj != s.self ? reprNode.executeObject(obj, __REPR__) : "{...}";
125130
try {
126131
return castStr.execute(reprObj);
@@ -130,7 +135,7 @@ protected String getReprString(Object obj, ReprState s, LookupAndCallUnaryDynami
130135
}
131136
}
132137

133-
protected static final void appendSeparator(ReprState s, ConditionProfile lengthCheck) {
138+
protected static void appendSeparator(ReprState s, ConditionProfile lengthCheck) {
134139
if (lengthCheck.profile(s.result.length() > s.initialLength)) {
135140
PythonUtils.append(s.result, ", ");
136141
}
@@ -226,13 +231,18 @@ public ReprState dict(Object key, ReprState s,
226231

227232
@Specialization // use same limit as for EachRepr nodes library
228233
public Object repr(PDict dict,
234+
@CachedContext(PythonLanguage.class) PythonContext ctxt,
229235
@Cached("create(3)") ForEachDictRepr consumerNode,
230236
@Cached HashingCollectionNodes.GetDictStorageNode getDictStorage,
231237
@CachedLibrary(limit = "3") HashingStorageLibrary lib) {
238+
if (!ctxt.reprEnter(dict)) {
239+
return "{...}";
240+
}
232241
StringBuilder sb = PythonUtils.newStringBuilder("{");
233242
HashingStorage dictStorage = getDictStorage.execute(dict);
234243
lib.forEach(dictStorage, consumerNode, new ReprState(dict, dictStorage, sb));
235244
PythonUtils.append(sb, "}");
245+
ctxt.reprLeave(dict);
236246
return PythonUtils.sbToString(sb);
237247
}
238248

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/list/ListBuiltins.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import java.math.BigInteger;
5353
import java.util.List;
5454

55+
import com.oracle.graal.python.PythonLanguage;
5556
import com.oracle.graal.python.builtins.Builtin;
5657
import com.oracle.graal.python.builtins.CoreFunctions;
5758
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
@@ -97,6 +98,7 @@
9798
import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
9899
import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
99100
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
101+
import com.oracle.graal.python.runtime.PythonContext;
100102
import com.oracle.graal.python.runtime.PythonCore;
101103
import com.oracle.graal.python.runtime.exception.PException;
102104
import com.oracle.graal.python.runtime.exception.PythonErrorType;
@@ -111,6 +113,7 @@
111113
import com.oracle.truffle.api.CompilerDirectives;
112114
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
113115
import com.oracle.truffle.api.dsl.Cached;
116+
import com.oracle.truffle.api.dsl.CachedContext;
114117
import com.oracle.truffle.api.dsl.Fallback;
115118
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
116119
import com.oracle.truffle.api.dsl.ImportStatic;
@@ -141,24 +144,29 @@ public abstract static class ReprNode extends PythonUnaryBuiltinNode {
141144

142145
@Specialization
143146
public Object repr(VirtualFrame frame, PList self,
147+
@CachedContext(PythonLanguage.class) PythonContext ctxt,
144148
@Cached("create(__REPR__)") LookupAndCallUnaryNode repr,
145149
@Cached SequenceStorageNodes.LenNode lenNode,
146150
@Cached SequenceStorageNodes.GetItemNode getItem) {
151+
SequenceStorage storage = self.getSequenceStorage();
152+
int length = lenNode.execute(storage);
153+
if (length == 0) {
154+
return "[]";
155+
}
156+
if (!ctxt.reprEnter(self)) {
157+
return "[...]";
158+
}
159+
147160
StringBuilder result = PythonUtils.newStringBuilder();
148161
PythonUtils.append(result, "[");
149-
SequenceStorage storage = self.getSequenceStorage();
150162
boolean initial = true;
151163
Object value;
152164
Object reprString;
153-
for (int index = 0; index < lenNode.execute(storage); index++) {
165+
for (int index = 0; index < length; index++) {
154166
value = getItem.execute(frame, storage, index);
155-
if (self != value) {
156-
reprString = repr.executeObject(frame, value);
157-
if (reprString instanceof PString) {
158-
reprString = ((PString) reprString).getValue();
159-
}
160-
} else {
161-
reprString = "[...]";
167+
reprString = repr.executeObject(frame, value);
168+
if (reprString instanceof PString) {
169+
reprString = ((PString) reprString).getValue();
162170
}
163171
if (reprString instanceof String) {
164172
if (initial) {
@@ -171,6 +179,7 @@ public Object repr(VirtualFrame frame, PList self,
171179
raise(PythonErrorType.TypeError, ErrorMessages.RETURNED_NON_STRING, "__repr__", reprString);
172180
}
173181
}
182+
ctxt.reprLeave(self);
174183
return PythonUtils.sbToString(PythonUtils.append(result, "]"));
175184
}
176185
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/tuple/TupleBuiltins.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545

4646
import java.util.List;
4747

48+
import com.oracle.graal.python.PythonLanguage;
4849
import com.oracle.graal.python.annotations.ArgumentClinic;
4950
import com.oracle.graal.python.builtins.Builtin;
5051
import com.oracle.graal.python.builtins.CoreFunctions;
@@ -54,10 +55,10 @@
5455
import com.oracle.graal.python.builtins.modules.BuiltinFunctionsFactory;
5556
import com.oracle.graal.python.builtins.modules.MathGuards;
5657
import com.oracle.graal.python.builtins.objects.PNotImplemented;
58+
import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject;
5759
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes;
5860
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PCallCapiFunction;
5961
import com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbols;
60-
import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject;
6162
import com.oracle.graal.python.builtins.objects.common.IndexNodes.NormalizeIndexNode;
6263
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
6364
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
@@ -74,11 +75,13 @@
7475
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
7576
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
7677
import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode;
78+
import com.oracle.graal.python.runtime.PythonContext;
7779
import com.oracle.graal.python.runtime.exception.PythonErrorType;
7880
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
7981
import com.oracle.graal.python.util.PythonUtils;
8082
import com.oracle.truffle.api.CompilerDirectives;
8183
import com.oracle.truffle.api.dsl.Cached;
84+
import com.oracle.truffle.api.dsl.CachedContext;
8285
import com.oracle.truffle.api.dsl.Fallback;
8386
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
8487
import com.oracle.truffle.api.dsl.ImportStatic;
@@ -202,11 +205,18 @@ public String toString(VirtualFrame frame, Object item, BuiltinFunctions.ReprNod
202205

203206
@Specialization
204207
public String repr(VirtualFrame frame, PTuple self,
208+
@CachedContext(PythonLanguage.class) PythonContext ctxt,
205209
@Cached("create()") SequenceStorageNodes.LenNode getLen,
206210
@Cached("createNotNormalized()") SequenceStorageNodes.GetItemNode getItemNode,
207211
@Cached("createRepr()") BuiltinFunctions.ReprNode reprNode) {
208212
SequenceStorage tupleStore = self.getSequenceStorage();
209213
int len = getLen.execute(tupleStore);
214+
if (len == 0) {
215+
return "()";
216+
}
217+
if (!ctxt.reprEnter(self)) {
218+
return "(...)";
219+
}
210220
StringBuilder buf = PythonUtils.newStringBuilder();
211221
PythonUtils.append(buf, "(");
212222
for (int i = 0; i < len - 1; i++) {
@@ -223,6 +233,7 @@ public String repr(VirtualFrame frame, PTuple self,
223233
}
224234

225235
PythonUtils.append(buf, ")");
236+
ctxt.reprLeave(self);
226237
return PythonUtils.sbToString(buf);
227238
}
228239

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import java.util.ArrayDeque;
4343
import java.util.ArrayList;
4444
import java.util.HashMap;
45+
import java.util.HashSet;
4546
import java.util.LinkedList;
4647
import java.util.List;
4748
import java.util.Map;
@@ -57,10 +58,10 @@
5758
import com.oracle.graal.python.PythonLanguage;
5859
import com.oracle.graal.python.builtins.objects.PNone;
5960
import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
60-
import com.oracle.graal.python.builtins.objects.cext.capi.PThreadState;
6161
import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass;
62-
import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper;
6362
import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext;
63+
import com.oracle.graal.python.builtins.objects.cext.capi.PThreadState;
64+
import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapper;
6465
import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContext;
6566
import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes.GetDictStorageNode;
6667
import com.oracle.graal.python.builtins.objects.common.HashingStorage;
@@ -129,6 +130,9 @@ private static final class PythonThreadState {
129130
/* corresponds to 'PyThreadState.exc_*' */
130131
PException caughtException;
131132

133+
/* set to emulate Py_ReprEnter/Leave */
134+
HashSet<Object> reprObjectSet;
135+
132136
PythonThreadState() {
133137
owners = new LinkedList<>();
134138
}
@@ -164,6 +168,19 @@ boolean hasOwners() {
164168
List<WeakReference<Thread>> getOwners() {
165169
return owners;
166170
}
171+
172+
@TruffleBoundary
173+
boolean reprEnter(Object item) {
174+
if (reprObjectSet == null) {
175+
reprObjectSet = new HashSet<>();
176+
}
177+
return reprObjectSet.add(item);
178+
}
179+
180+
@TruffleBoundary
181+
void reprLeave(Object item) {
182+
reprObjectSet.remove(item);
183+
}
167184
}
168185

169186
private static final class AtExitHook {
@@ -388,6 +405,14 @@ public PFrame.Reference peekTopFrameInfo() {
388405
return getThreadState().topframeref;
389406
}
390407

408+
public boolean reprEnter(Object item) {
409+
return getThreadState().reprEnter(item);
410+
}
411+
412+
public void reprLeave(Object item) {
413+
getThreadState().reprLeave(item);
414+
}
415+
391416
public boolean isInitialized() {
392417
return isInitialized;
393418
}

graalpython/lib-python/3/test/seq_tests.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,7 @@ def test_pickle(self):
412412
self.assertEqual(lst2, lst)
413413
self.assertNotEqual(id(lst2), id(lst))
414414

415+
@support.impl_detail("finalization", graalvm=False)
415416
def test_free_after_iterating(self):
416417
support.check_free_after_iterating(self, iter, self.type2test)
417418
support.check_free_after_iterating(self, reversed, self.type2test)

0 commit comments

Comments
 (0)