Skip to content

Commit 4c1bfe9

Browse files
committed
[GR-23266] Make test_types.MappingProxyTest pass
PullRequest: graalpython/1192
2 parents e4a56bd + d5ae88d commit 4c1bfe9

34 files changed

+252
-389
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,17 @@
2222
*graalpython.lib-python.3.test.test_types.CoroutineTests.test_non_gen_values
2323
*graalpython.lib-python.3.test.test_types.CoroutineTests.test_wrapper_object
2424
*graalpython.lib-python.3.test.test_types.CoroutineTests.test_wrong_args
25+
*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_chainmap
26+
*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_constructor
2527
*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_contains
28+
*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_copy
29+
*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_customdict
2630
*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_get
2731
*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_iterators
2832
*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_len
33+
*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_methods
34+
*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_missing
35+
*graalpython.lib-python.3.test.test_types.MappingProxyTests.test_views
2936
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_as_dict
3037
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_attrdel
3138
*graalpython.lib-python.3.test.test_types.SimpleNamespaceTests.test_attrget

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,6 @@ private static String[] initializeCoreFiles() {
219219
"_descriptor",
220220
"object",
221221
"sys",
222-
"_mappingproxy",
223222
"str",
224223
"type",
225224
"_imp",

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinConstructors.java

Lines changed: 22 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,6 @@
121121
import com.oracle.graal.python.builtins.objects.common.HashingStorage;
122122
import com.oracle.graal.python.builtins.objects.common.HashingStorage.DictEntry;
123123
import com.oracle.graal.python.builtins.objects.common.HashingStorageLibrary;
124-
import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
125124
import com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetObjectArrayNode;
126125
import com.oracle.graal.python.builtins.objects.common.SequenceNodesFactory.GetObjectArrayNodeGen;
127126
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
@@ -208,7 +207,6 @@
208207
import com.oracle.graal.python.nodes.util.CastToJavaStringNodeGen;
209208
import com.oracle.graal.python.nodes.util.SplitArgsNode;
210209
import com.oracle.graal.python.runtime.ExecutionContext.ForeignCallContext;
211-
import com.oracle.graal.python.runtime.ExecutionContext.IndirectCallContext;
212210
import com.oracle.graal.python.runtime.PythonContext;
213211
import com.oracle.graal.python.runtime.PythonCore;
214212
import com.oracle.graal.python.runtime.exception.PException;
@@ -1872,6 +1870,10 @@ public abstract static class StrNode extends PythonBuiltinNode {
18721870
@CompilationFinal private ConditionProfile isStringProfile;
18731871
@CompilationFinal private ConditionProfile isPStringProfile;
18741872

1873+
public final Object executeWith(VirtualFrame frame, Object arg) {
1874+
return executeWith(frame, PythonBuiltinClassType.PString, arg, PNone.NO_VALUE, PNone.NO_VALUE);
1875+
}
1876+
18751877
public abstract Object executeWith(VirtualFrame frame, Object strClass, Object arg, Object encoding, Object errors);
18761878

18771879
@Specialization(guards = {"!isNativeClass(strClass)", "isNoValue(arg)", "isNoValue(encoding)", "isNoValue(errors)"})
@@ -1970,6 +1972,10 @@ private ConditionProfile getIsPStringProfile() {
19701972
}
19711973
return isPStringProfile;
19721974
}
1975+
1976+
public static StrNode create() {
1977+
return BuiltinConstructorsFactory.StrNodeFactory.create(null);
1978+
}
19731979
}
19741980

19751981
// tuple([iterable])
@@ -2871,18 +2877,12 @@ Object methodBuiltin(@SuppressWarnings("unused") Object cls, PBuiltinFunction fu
28712877
}
28722878

28732879
@Specialization
2874-
Object methodGeneric(VirtualFrame frame, @SuppressWarnings("unused") Object cls, Object func, Object self,
2880+
Object methodGeneric(@SuppressWarnings("unused") Object cls, Object func, Object self,
28752881
@CachedLibrary(limit = "3") PythonObjectLibrary dataModelLibrary) {
2876-
PythonContext context = getContextRef().get();
2877-
Object state = IndirectCallContext.enter(frame, context, this);
2878-
try {
2879-
if (dataModelLibrary.isCallable(func)) {
2880-
return factory().createMethod(self, func);
2881-
} else {
2882-
throw raise(TypeError, ErrorMessages.FIRST_ARG_MUST_BE_CALLABLE);
2883-
}
2884-
} finally {
2885-
IndirectCallContext.exit(frame, context, state);
2882+
if (dataModelLibrary.isCallable(func)) {
2883+
return factory().createMethod(self, func);
2884+
} else {
2885+
throw raise(TypeError, ErrorMessages.FIRST_ARG_MUST_BE_CALLABLE);
28862886
}
28872887
}
28882888
}
@@ -3053,17 +3053,10 @@ Object initArgs(Object cls, Object[] args, @SuppressWarnings("unused") PKeyword[
30533053
@Builtin(name = "mappingproxy", constructsClass = PythonBuiltinClassType.PMappingproxy, isPublic = false, minNumOfPositionalArgs = 1, maxNumOfPositionalArgs = 2)
30543054
@GenerateNodeFactory
30553055
public abstract static class MappingproxyNode extends PythonBuiltinNode {
3056-
@Specialization
3057-
Object doMapping(Object klass, PHashingCollection obj,
3058-
@Cached HashingCollectionNodes.GetDictStorageNode getStorage) {
3059-
return factory().createMappingproxy(klass, getStorage.execute(obj));
3060-
}
3061-
3062-
@Specialization(guards = {"isSequence(frame, obj, lib)", "!isBuiltinMapping(obj)"}, limit = "1")
3063-
Object doMapping(VirtualFrame frame, Object klass, PythonObject obj,
3064-
@Cached("create()") HashingStorage.InitNode initNode,
3056+
@Specialization(guards = "isMapping(obj, lib)", limit = "1")
3057+
Object doMapping(Object klass, PythonObject obj,
30653058
@SuppressWarnings("unused") @CachedLibrary("obj") PythonObjectLibrary lib) {
3066-
return factory().createMappingproxy(klass, initNode.execute(frame, obj, PKeyword.EMPTY_KEYWORDS));
3059+
return factory().createMappingproxy(klass, obj);
30673060
}
30683061

30693062
@Specialization(guards = "isNoValue(none)")
@@ -3072,24 +3065,17 @@ Object doMissing(Object klass, PNone none) {
30723065
throw raise(TypeError, ErrorMessages.MISSING_D_REQUIRED_S_ARGUMENT_S_POS, "mappingproxy()", "mapping", 1);
30733066
}
30743067

3075-
@Specialization(guards = {"!isSequence(frame, obj, lib)", "!isNoValue(obj)"}, limit = "1")
3076-
Object doInvalid(@SuppressWarnings("unused") VirtualFrame frame, @SuppressWarnings("unused") Object klass, Object obj,
3068+
@Specialization(guards = {"!isMapping(obj, lib)", "!isNoValue(obj)"}, limit = "1")
3069+
Object doInvalid(@SuppressWarnings("unused") Object klass, Object obj,
30773070
@SuppressWarnings("unused") @CachedLibrary("obj") PythonObjectLibrary lib) {
30783071
throw raise(TypeError, ErrorMessages.ARG_MUST_BE_S_NOT_P, "mappingproxy()", "mapping", obj);
30793072
}
30803073

3081-
protected static boolean isBuiltinMapping(Object o) {
3082-
return o instanceof PHashingCollection;
3083-
}
3084-
3085-
protected boolean isSequence(VirtualFrame frame, Object o, PythonObjectLibrary library) {
3086-
PythonContext context = getContextRef().get();
3087-
Object state = IndirectCallContext.enter(frame, context, this);
3088-
try {
3089-
return library.isSequence(o);
3090-
} finally {
3091-
IndirectCallContext.exit(frame, context, state);
3074+
protected boolean isMapping(Object o, PythonObjectLibrary library) {
3075+
if (o instanceof PList || o instanceof PTuple) {
3076+
return false;
30923077
}
3078+
return library.isMapping(o);
30933079
}
30943080
}
30953081

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/BuiltinFunctions.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@
8989
import com.oracle.graal.python.builtins.objects.code.PCode;
9090
import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes;
9191
import com.oracle.graal.python.builtins.objects.common.HashingStorageLibrary;
92-
import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
9392
import com.oracle.graal.python.builtins.objects.common.SequenceNodes;
9493
import com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetObjectArrayNode;
9594
import com.oracle.graal.python.builtins.objects.common.SequenceNodesFactory.GetObjectArrayNodeGen;
@@ -612,7 +611,7 @@ private static void setCustomLocals(Object[] args, Object locals) {
612611

613612
private void setBuiltinsInGlobals(VirtualFrame frame, PDict globals, HashingCollectionNodes.SetItemNode setBuiltins, PythonModule builtins, PythonObjectLibrary lib) {
614613
if (builtins != null) {
615-
PHashingCollection builtinsDict = lib.getDict(builtins);
614+
PDict builtinsDict = lib.getDict(builtins);
616615
if (builtinsDict == null) {
617616
builtinsDict = factory().createDictFixedStorage(builtins);
618617
try {
@@ -1954,7 +1953,7 @@ public Object globals(VirtualFrame frame,
19541953
PFrame callerFrame = readCallerFrameNode.executeWith(frame, 0);
19551954
PythonObject globals = callerFrame.getGlobals();
19561955
if (condProfile.profile(globals instanceof PythonModule)) {
1957-
PHashingCollection dict = lib.getDict(globals);
1956+
PDict dict = lib.getDict(globals);
19581957
if (dict == null) {
19591958
CompilerDirectives.transferToInterpreter();
19601959
dict = factory().createDictFixedStorage(globals);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/DynamicObjectNativeWrapper.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -90,15 +90,13 @@
9090
import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes;
9191
import com.oracle.graal.python.builtins.objects.common.HashingStorage;
9292
import com.oracle.graal.python.builtins.objects.common.HashingStorageLibrary;
93-
import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
9493
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
9594
import com.oracle.graal.python.builtins.objects.dict.PDict;
9695
import com.oracle.graal.python.builtins.objects.floats.PFloat;
9796
import com.oracle.graal.python.builtins.objects.frame.PFrame;
9897
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
9998
import com.oracle.graal.python.builtins.objects.function.PFunction;
10099
import com.oracle.graal.python.builtins.objects.ints.PInt;
101-
import com.oracle.graal.python.builtins.objects.mappingproxy.PMappingproxy;
102100
import com.oracle.graal.python.builtins.objects.memoryview.PBuffer;
103101
import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView;
104102
import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
@@ -588,7 +586,7 @@ static Object doTpDict(PythonManagedClass object, @SuppressWarnings("unused") Py
588586
@CachedLibrary(limit = "2") HashingStorageLibrary storageLib,
589587
@Shared("toSulongNode") @Cached CExtNodes.ToSulongNode toSulongNode) throws UnsupportedMessageException {
590588
// TODO(fa): we could cache the dict instance on the class' native wrapper
591-
PHashingCollection dict = lib.getDict(object);
589+
PDict dict = lib.getDict(object);
592590
HashingStorage dictStorage = dict != null ? dict.getDictStorage() : null;
593591
if (dictStorage instanceof DynamicObjectStorage) {
594592
// reuse the existing and modifiable storage
@@ -599,8 +597,9 @@ static Object doTpDict(PythonManagedClass object, @SuppressWarnings("unused") Py
599597
// copy all mappings to the new storage
600598
storage = storageLib.addAllToOther(dictStorage, storage);
601599
}
602-
lib.setDict(object, factory.createMappingproxy(storage));
603-
return toSulongNode.execute(factory.createDict(storage));
600+
PDict newDict = factory.createDict(storage);
601+
lib.setDict(object, newDict);
602+
return toSulongNode.execute(newDict);
604603
}
605604

606605
@Specialization(guards = "eq(TP_TRAVERSE, key) || eq(TP_CLEAR, key)")
@@ -774,15 +773,11 @@ static Object doTpDict(PythonClass object, @SuppressWarnings("unused") PythonNat
774773
@Cached PythonObjectFactory factory,
775774
@CachedLibrary("object") PythonObjectLibrary lib,
776775
@Shared("toSulongNode") @Cached CExtNodes.ToSulongNode toSulongNode) throws UnsupportedMessageException {
777-
PHashingCollection dict = lib.getDict(object);
778-
if (!(dict instanceof PDict)) {
779-
assert dict instanceof PMappingproxy || dict == null;
780-
// If 'dict instanceof PMappingproxy', it seems that someone already used '__dict__'
781-
// on this type and created a mappingproxy object. We need to replace it by a dict.
776+
PDict dict = lib.getDict(object);
777+
if (dict == null) {
782778
dict = factory.createDictFixedStorage(object);
783779
lib.setDict(object, dict);
784780
}
785-
assert dict != null;
786781
return toSulongNode.execute(dict);
787782
}
788783

@@ -1135,7 +1130,7 @@ static Object doTpDict(PythonManagedClass object, @SuppressWarnings("unused") Py
11351130
for (HashingStorage.DictEntry entry : d.entries()) {
11361131
writeAttrNode.execute(object, entry.getKey(), entry.getValue());
11371132
}
1138-
PHashingCollection existing = lib.getDict(object);
1133+
PDict existing = lib.getDict(object);
11391134
if (existing != null) {
11401135
d.setDictStorage(existing.getDictStorage());
11411136
} else {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/PythonAbstractNativeObject.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.ToJavaNode;
5757
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.ToSulongNode;
5858
import com.oracle.graal.python.builtins.objects.cext.CExtNodesFactory.AsPythonObjectNodeGen;
59-
import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
59+
import com.oracle.graal.python.builtins.objects.dict.PDict;
6060
import com.oracle.graal.python.builtins.objects.function.PArguments.ThreadState;
6161
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
6262
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
@@ -165,7 +165,7 @@ public boolean hasDict() {
165165

166166
@ExportMessage
167167
@SuppressWarnings({"static-method", "unused"})
168-
public void setDict(PHashingCollection value) throws UnsupportedMessageException {
168+
public void setDict(PDict value) throws UnsupportedMessageException {
169169
throw UnsupportedMessageException.create();
170170
}
171171

@@ -190,7 +190,7 @@ public Object asIndexWithState(ThreadState threadState,
190190
@GenerateUncached
191191
public abstract static class GetDict {
192192
@Specialization
193-
public static PHashingCollection getNativeDictionary(PythonAbstractNativeObject self,
193+
public static PDict getNativeDictionary(PythonAbstractNativeObject self,
194194
@Exclusive @Cached PRaiseNode raiseNode,
195195
@Exclusive @Cached ToSulongNode toSulong,
196196
@Exclusive @Cached ToJavaNode toJava,
@@ -199,8 +199,8 @@ public static PHashingCollection getNativeDictionary(PythonAbstractNativeObject
199199
try {
200200
Object func = importCAPISymbolNode.execute(FUN_PY_OBJECT_GENERIC_GET_DICT);
201201
Object javaDict = toJava.execute(interopLibrary.execute(func, toSulong.execute(self)));
202-
if (javaDict instanceof PHashingCollection) {
203-
return (PHashingCollection) javaDict;
202+
if (javaDict instanceof PDict) {
203+
return (PDict) javaDict;
204204
} else if (javaDict == PNone.NO_VALUE) {
205205
return null;
206206
} else {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/HashingCollectionNodes.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@
5050
import com.oracle.graal.python.builtins.objects.dict.PDict;
5151
import com.oracle.graal.python.builtins.objects.dict.PDictView;
5252
import com.oracle.graal.python.builtins.objects.function.PArguments;
53-
import com.oracle.graal.python.builtins.objects.mappingproxy.PMappingproxy;
5453
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
5554
import com.oracle.graal.python.builtins.objects.set.PBaseSet;
5655
import com.oracle.graal.python.builtins.objects.str.PString;
@@ -128,11 +127,6 @@ static HashingStorage get(PDict c) {
128127
return c.getDictStorage();
129128
}
130129

131-
@Specialization
132-
static HashingStorage get(PMappingproxy c) {
133-
return c.getDictStorage();
134-
}
135-
136130
public static GetDictStorageNode create() {
137131
return GetDictStorageNodeGen.create();
138132
}
@@ -158,11 +152,6 @@ static void set(PDict c, HashingStorage storage) {
158152
c.setDictStorage(storage);
159153
}
160154

161-
@Specialization
162-
static void set(PMappingproxy c, HashingStorage storage) {
163-
c.setDictStorage(storage);
164-
}
165-
166155
public static SetDictStorageNode create() {
167156
return SetDictStorageNodeGen.create();
168157
}

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

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@
6767
import com.oracle.graal.python.builtins.objects.function.PArguments;
6868
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
6969
import com.oracle.graal.python.builtins.objects.function.PKeyword;
70-
import com.oracle.graal.python.builtins.objects.mappingproxy.PMappingproxy;
7170
import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
7271
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
7372
import com.oracle.graal.python.builtins.objects.str.PString;
@@ -445,18 +444,6 @@ Object doDictDict(VirtualFrame frame, PDict self, PDict other,
445444
}
446445
}
447446

448-
@Specialization(limit = "3")
449-
Object doDictProxy(VirtualFrame frame, PDict self, PMappingproxy other,
450-
@Cached("createBinaryProfile()") ConditionProfile hasFrame,
451-
@Cached GetDictStorageNode getStorage,
452-
@CachedLibrary("getStorage.execute(self)") HashingStorageLibrary lib) {
453-
if (hasFrame.profile(frame != null)) {
454-
return lib.equalsWithState(getStorage.execute(self), getStorage.execute(other), PArguments.getThreadState(frame));
455-
} else {
456-
return lib.equals(getStorage.execute(self), getStorage.execute(other));
457-
}
458-
}
459-
460447
@Fallback
461448
@SuppressWarnings("unused")
462449
static PNotImplemented doGeneric(Object self, Object other) {

0 commit comments

Comments
 (0)