Skip to content

Commit 9f00818

Browse files
committed
Finish getDict/setDict migration
1 parent 58007ca commit 9f00818

File tree

13 files changed

+125
-220
lines changed

13 files changed

+125
-220
lines changed

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

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -40,26 +40,16 @@
4040
*/
4141
package com.oracle.graal.python.builtins.objects.cext;
4242

43-
import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_OBJECT_GENERIC_GET_DICT;
44-
4543
import java.util.Objects;
4644

47-
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
48-
import com.oracle.graal.python.builtins.objects.PNone;
4945
import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
5046
import com.oracle.graal.python.builtins.objects.buffer.PythonBufferAcquireLibrary;
5147
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes;
5248
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.GetTypeMemberNode;
53-
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PCallCapiFunction;
54-
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ToJavaNode;
55-
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ToSulongNode;
5649
import com.oracle.graal.python.builtins.objects.cext.capi.NativeMember;
57-
import com.oracle.graal.python.builtins.objects.dict.PDict;
5850
import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView;
5951
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
6052
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
61-
import com.oracle.graal.python.nodes.ErrorMessages;
62-
import com.oracle.graal.python.nodes.PRaiseNode;
6353
import com.oracle.graal.python.nodes.classes.IsSubtypeNode;
6454
import com.oracle.graal.python.nodes.interop.PForeignToPTypeNode;
6555
import com.oracle.graal.python.nodes.object.GetClassNode;
@@ -146,40 +136,6 @@ public String toString() {
146136
return String.format("PythonAbstractNativeObject(%s)", object);
147137
}
148138

149-
@ExportMessage
150-
@SuppressWarnings("static-method")
151-
public boolean hasDict() {
152-
return true;
153-
}
154-
155-
@ExportMessage
156-
@SuppressWarnings({"static-method", "unused"})
157-
public void setDict(PDict value) throws UnsupportedMessageException {
158-
throw UnsupportedMessageException.create();
159-
}
160-
161-
@ExportMessage
162-
@SuppressWarnings({"static-method", "unused"})
163-
public void deleteDict() throws UnsupportedMessageException {
164-
throw UnsupportedMessageException.create();
165-
}
166-
167-
@ExportMessage
168-
public PDict getDict(
169-
@Exclusive @Cached PRaiseNode raiseNode,
170-
@Exclusive @Cached ToSulongNode toSulong,
171-
@Exclusive @Cached ToJavaNode toJava,
172-
@Exclusive @Cached PCallCapiFunction callGetDictNode) {
173-
Object javaDict = toJava.execute(callGetDictNode.call(FUN_PY_OBJECT_GENERIC_GET_DICT, toSulong.execute(this)));
174-
if (javaDict instanceof PDict) {
175-
return (PDict) javaDict;
176-
} else if (javaDict == PNone.NO_VALUE) {
177-
return null;
178-
} else {
179-
throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.DICT_MUST_BE_SET_TO_DICT, javaDict);
180-
}
181-
}
182-
183139
@ExportMessage
184140
int identityHashCode(@CachedLibrary("this.object") InteropLibrary lib) throws UnsupportedMessageException {
185141
return lib.identityHashCode(object);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/module/PythonModule.java

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -39,26 +39,13 @@
3939
import com.oracle.graal.python.builtins.objects.PNone;
4040
import com.oracle.graal.python.builtins.objects.dict.PDict;
4141
import com.oracle.graal.python.builtins.objects.object.PythonObject;
42-
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
43-
import com.oracle.graal.python.nodes.HiddenAttributes;
4442
import com.oracle.graal.python.nodes.PGuards;
4543
import com.oracle.graal.python.nodes.object.SetDictNode;
4644
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
4745
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
4846
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
49-
import com.oracle.truffle.api.dsl.Cached;
50-
import com.oracle.truffle.api.dsl.Cached.Shared;
51-
import com.oracle.truffle.api.dsl.ImportStatic;
52-
import com.oracle.truffle.api.dsl.Specialization;
53-
import com.oracle.truffle.api.interop.InteropLibrary;
54-
import com.oracle.truffle.api.library.CachedLibrary;
55-
import com.oracle.truffle.api.library.ExportLibrary;
56-
import com.oracle.truffle.api.library.ExportMessage;
57-
import com.oracle.truffle.api.object.DynamicObjectLibrary;
5847
import com.oracle.truffle.api.object.Shape;
5948

60-
@ImportStatic(HiddenAttributes.class)
61-
@ExportLibrary(PythonObjectLibrary.class)
6249
public final class PythonModule extends PythonObject {
6350

6451
@CompilationFinal(dimensions = 1) static final Object[] INITIAL_MODULE_ATTRS = new Object[]{__NAME__, __DOC__, __PACKAGE__, __LOADER__, __SPEC__, __CACHED__, __FILE__};
@@ -123,29 +110,6 @@ public String toString() {
123110
return "<module '" + (PGuards.isNoValue(attribute) ? "?" : attribute) + "'>";
124111
}
125112

126-
@ExportMessage
127-
static class GetDict {
128-
protected static boolean dictExists(Object dict) {
129-
return dict instanceof PDict;
130-
}
131-
132-
@SuppressWarnings("unused")
133-
@Specialization(guards = {"self == cachedModule", "dictExists(dict)"}, assumptions = "singleContextAssumption(lib)", limit = "1")
134-
static PDict getConstant(PythonModule self,
135-
@Cached(value = "self", weak = true) PythonModule cachedModule,
136-
@Cached(value = "self.getAttribute(DICT)", weak = true) Object dict,
137-
@SuppressWarnings("unused") @CachedLibrary(limit = "1") InteropLibrary lib) {
138-
// module.__dict__ is a read-only attribute
139-
return (PDict) dict;
140-
}
141-
142-
@Specialization(replaces = "getConstant")
143-
static PDict getDict(PythonModule self,
144-
@Shared("dylib") @CachedLibrary(limit = "4") DynamicObjectLibrary dylib) {
145-
return (PDict) dylib.getOrDefault(self, DICT, null);
146-
}
147-
}
148-
149113
public Object getNativeModuleDef() {
150114
return nativeModuleDef;
151115
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/ObjectBuiltins.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@
110110
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
111111
import com.oracle.graal.python.nodes.function.builtins.PythonVarargsBuiltinNode;
112112
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
113+
import com.oracle.graal.python.nodes.object.DeleteDictNode;
113114
import com.oracle.graal.python.nodes.object.GetClassNode;
114115
import com.oracle.graal.python.nodes.object.GetDictIfExistsNode;
115116
import com.oracle.graal.python.nodes.object.GetOrCreateDictNode;
@@ -134,7 +135,6 @@
134135
import com.oracle.truffle.api.library.CachedLibrary;
135136
import com.oracle.truffle.api.nodes.Node;
136137
import com.oracle.truffle.api.nodes.UnexpectedResultException;
137-
import com.oracle.truffle.api.object.DynamicObjectLibrary;
138138
import com.oracle.truffle.api.profiles.BranchProfile;
139139
import com.oracle.truffle.api.profiles.ConditionProfile;
140140
import com.oracle.truffle.api.profiles.ValueProfile;
@@ -736,21 +736,21 @@ Object dict(PythonAbstractNativeObject self, @SuppressWarnings("unused") PNone n
736736
return dict;
737737
}
738738

739-
@Specialization(limit = "1")
739+
@Specialization
740740
static Object dict(VirtualFrame frame, @SuppressWarnings("unused") PythonObject self, @SuppressWarnings("unused") DescriptorDeleteMarker marker,
741741
@Cached GetClassNode getClassNode,
742742
@Cached GetBaseClassNode getBaseNode,
743743
@Cached("createForLookupOfUnmanagedClasses(__DICT__)") LookupAttributeInMRONode getDescrNode,
744744
@Cached DescrDeleteNode deleteNode,
745-
@CachedLibrary("self") DynamicObjectLibrary dylib,
745+
@Cached DeleteDictNode deleteDictNode,
746746
@Cached BranchProfile branchProfile) {
747747
// typeobject.c#subtype_setdict()
748748
Object func = getDescrFromBuiltinBase(getClassNode.execute(self), getBaseNode, getDescrNode);
749749
if (func != null) {
750750
branchProfile.enter();
751751
return deleteNode.execute(frame, func, self);
752752
}
753-
dylib.put(self, PythonObject.DICT, null);
753+
deleteDictNode.execute(self);
754754
return PNone.NONE;
755755
}
756756

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/PythonObject.java

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,13 @@
3333
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
3434
import com.oracle.graal.python.builtins.objects.PNone;
3535
import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
36-
import com.oracle.graal.python.builtins.objects.dict.PDict;
3736
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
3837
import com.oracle.graal.python.builtins.objects.type.PythonManagedClass;
3938
import com.oracle.graal.python.nodes.HiddenAttributes;
4039
import com.oracle.graal.python.nodes.PGuards;
4140
import com.oracle.graal.python.runtime.PythonOptions;
4241
import com.oracle.truffle.api.CompilerAsserts;
4342
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
44-
import com.oracle.truffle.api.dsl.Cached.Shared;
4543
import com.oracle.truffle.api.library.CachedLibrary;
4644
import com.oracle.truffle.api.library.ExportLibrary;
4745
import com.oracle.truffle.api.library.ExportMessage;
@@ -84,7 +82,7 @@ private boolean consistentStorage(Object pythonClass) {
8482

8583
@ExportMessage
8684
public void setLazyPythonClass(Object cls,
87-
@Shared("dylib") @CachedLibrary(limit = "4") DynamicObjectLibrary dylib) {
85+
@CachedLibrary(limit = "4") DynamicObjectLibrary dylib) {
8886
// n.b.: the CLASS property is usually a constant property that is stored in the shape
8987
// in
9088
// single-context-mode. If we change it for the first time, there's an implicit shape
@@ -154,28 +152,6 @@ public String toString() {
154152
return "<" + className + " object at 0x" + Integer.toHexString(hashCode()) + ">";
155153
}
156154

157-
@ExportMessage
158-
public boolean hasDict(@Shared("dylib") @CachedLibrary(limit = "4") DynamicObjectLibrary dylib) {
159-
return dylib.containsKey(this, DICT);
160-
}
161-
162-
@ExportMessage
163-
public PDict getDict(@Shared("dylib") @CachedLibrary(limit = "4") DynamicObjectLibrary dylib) {
164-
return (PDict) dylib.getOrDefault(this, DICT, null);
165-
}
166-
167-
// Note: setDict and deleteDict are "overridden" in PythonClass
168-
@ExportMessage
169-
public final void setDict(PDict dict,
170-
@Shared("dylib") @CachedLibrary(limit = "4") DynamicObjectLibrary dylib) {
171-
dylib.put(this, DICT, dict);
172-
}
173-
174-
@ExportMessage
175-
public final void deleteDict(@Shared("dylib") @CachedLibrary(limit = "4") DynamicObjectLibrary dylib) {
176-
dylib.put(this, DICT, null);
177-
}
178-
179155
/* needed for some guards in exported messages of subclasses */
180156
public static int getCallSiteInlineCacheMaxDepth() {
181157
return PythonOptions.getCallSiteInlineCacheMaxDepth();

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/object/PythonObjectLibrary.java

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545

4646
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
4747
import com.oracle.graal.python.builtins.objects.PNone;
48-
import com.oracle.graal.python.builtins.objects.dict.PDict;
4948
import com.oracle.graal.python.builtins.objects.function.PArguments;
5049
import com.oracle.graal.python.builtins.objects.function.PArguments.ThreadState;
5150
import com.oracle.graal.python.builtins.objects.type.TypeNodes.IsSameTypeNode;
@@ -85,42 +84,6 @@
8584
@DefaultExport(DefaultPythonObjectExports.class)
8685
@SuppressWarnings("unused")
8786
public abstract class PythonObjectLibrary extends Library {
88-
/**
89-
* @return {@code true} if the object has a {@code __dict__} attribute
90-
*/
91-
public boolean hasDict(Object receiver) {
92-
return false;
93-
}
94-
95-
/**
96-
* Note that not returning a value from this message does not mean that the object cannot have a
97-
* {@code __dict__}. It may be that the object has inlined the representation of its
98-
* {@code __dict__} and thus no object is available, yet.
99-
*
100-
* @return the value in {@code __dict__} or {@code null}, if there is none.
101-
* @see #hasDict
102-
*/
103-
@Abstract(ifExported = "hasDict")
104-
public PDict getDict(Object receiver) {
105-
return null;
106-
}
107-
108-
/**
109-
* Set the {@code __dict__} attribute of the object
110-
*/
111-
@Abstract(ifExported = "hasDict")
112-
public void setDict(Object receiver, PDict dict) throws UnsupportedMessageException {
113-
throw UnsupportedMessageException.create();
114-
}
115-
116-
/**
117-
* Delete the {@code __dict__} attribute of the object
118-
*/
119-
@Abstract(ifExported = "hasDict")
120-
public void deleteDict(Object receiver) throws UnsupportedMessageException {
121-
throw UnsupportedMessageException.create();
122-
}
123-
12487
/**
12588
* @return true if the receiver of a Python type.<br>
12689
* <br>

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/MroShape.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import com.oracle.graal.python.PythonLanguage;
5151
import com.oracle.graal.python.builtins.objects.PNone;
5252
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromDynamicObjectNode;
53+
import com.oracle.graal.python.nodes.object.GetDictIfExistsNode;
5354
import com.oracle.graal.python.runtime.sequence.storage.MroSequenceStorage;
5455
import com.oracle.truffle.api.CompilerAsserts;
5556
import com.oracle.truffle.api.nodes.Node;
@@ -92,7 +93,7 @@ public static MroShape create(MroSequenceStorage mro, PythonLanguage lang) {
9293
PythonAbstractClass element = mro.getItemNormalized(i);
9394
if (PythonManagedClass.isInstance(element)) {
9495
PythonManagedClass managedClass = PythonManagedClass.cast(element);
95-
if (managedClass.hasDict(DynamicObjectLibrary.getUncached())) {
96+
if (GetDictIfExistsNode.getUncached().execute(managedClass) != null) {
9697
// On top of not having a shape, the dictionary may also contain items with side
9798
// effecting __eq__ and/or __hash__
9899
return null;

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/PythonClass.java

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232

3333
import com.oracle.graal.python.PythonLanguage;
3434
import com.oracle.graal.python.builtins.objects.PNone;
35-
import com.oracle.graal.python.builtins.objects.dict.PDict;
3635
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
3736
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromDynamicObjectNode;
3837
import com.oracle.graal.python.nodes.classes.IsSubtypeNode;
@@ -50,7 +49,6 @@
5049
import com.oracle.truffle.api.dsl.Cached.Shared;
5150
import com.oracle.truffle.api.interop.InteropLibrary;
5251
import com.oracle.truffle.api.interop.UnsupportedMessageException;
53-
import com.oracle.truffle.api.library.CachedLibrary;
5452
import com.oracle.truffle.api.library.ExportLibrary;
5553
import com.oracle.truffle.api.library.ExportMessage;
5654
import com.oracle.truffle.api.object.DynamicObjectLibrary;
@@ -234,20 +232,7 @@ public void setMRO(PythonAbstractClass[] mro, PythonLanguage language) {
234232
}
235233
}
236234

237-
@ExportMessage(name = "setDict")
238-
void setDictOverride(PDict dict,
239-
@Shared("hasMroShape") @Cached BranchProfile hasMroShapeProfile,
240-
@Shared("dylib") @CachedLibrary(limit = "4") DynamicObjectLibrary dylib) {
241-
setDictHiddenProp(dylib, hasMroShapeProfile, dict);
242-
}
243-
244-
@ExportMessage(name = "deleteDict")
245-
void deleteDictOverride(@Shared("hasMroShape") @Cached BranchProfile hasMroShapeProfile,
246-
@Shared("dylib") @CachedLibrary(limit = "4") DynamicObjectLibrary dylib) {
247-
setDictHiddenProp(dylib, hasMroShapeProfile, null);
248-
}
249-
250-
private void setDictHiddenProp(DynamicObjectLibrary dylib, BranchProfile hasMroShapeProfile, Object value) {
235+
public void setDictHiddenProp(DynamicObjectLibrary dylib, BranchProfile hasMroShapeProfile, Object value) {
251236
dylib.put(this, DICT, value);
252237
if (mroShapeSubTypes != null) {
253238
hasMroShapeProfile.enter();

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/PythonManagedClass.java

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,7 @@
3636
import com.oracle.graal.python.PythonLanguage;
3737
import com.oracle.graal.python.builtins.objects.PNone;
3838
import com.oracle.graal.python.builtins.objects.cext.capi.PythonClassNativeWrapper;
39-
import com.oracle.graal.python.builtins.objects.dict.PDict;
4039
import com.oracle.graal.python.builtins.objects.object.PythonObject;
41-
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
4240
import com.oracle.graal.python.builtins.objects.type.TypeNodes.ComputeMroNode;
4341
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetSubclassesNode;
4442
import com.oracle.graal.python.nodes.ErrorMessages;
@@ -50,16 +48,8 @@
5048
import com.oracle.truffle.api.CompilerAsserts;
5149
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
5250
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
53-
import com.oracle.truffle.api.dsl.Cached;
54-
import com.oracle.truffle.api.dsl.Cached.Shared;
55-
import com.oracle.truffle.api.dsl.Specialization;
56-
import com.oracle.truffle.api.library.CachedLibrary;
57-
import com.oracle.truffle.api.library.ExportLibrary;
58-
import com.oracle.truffle.api.library.ExportMessage;
59-
import com.oracle.truffle.api.object.DynamicObjectLibrary;
6051
import com.oracle.truffle.api.object.Shape;
6152

62-
@ExportLibrary(PythonObjectLibrary.class)
6353
public abstract class PythonManagedClass extends PythonObject implements PythonAbstractClass {
6454
@CompilationFinal(dimensions = 1) private PythonAbstractClass[] baseClasses;
6555

@@ -392,26 +382,4 @@ public static PythonManagedClass cast(Object object) {
392382
public void setHasSlotsButNoDictFlag() {
393383
instanceShape = PythonLanguage.getShapeForClassWithoutDict(this);
394384
}
395-
396-
@ExportMessage
397-
static class GetDict {
398-
protected static boolean dictExists(Object dict) {
399-
return dict instanceof PDict;
400-
}
401-
402-
@SuppressWarnings("unused")
403-
@Specialization(guards = {"self == cachedManagedClass", "dictExists(dict)"}, assumptions = "singleContextAssumption()", limit = "1")
404-
static PDict getConstant(PythonManagedClass self,
405-
@Cached(value = "self", weak = true) PythonManagedClass cachedManagedClass,
406-
@Cached(value = "self.getAttribute(DICT)", weak = true) Object dict) {
407-
// type.__dict__ is a read-only attribute
408-
return (PDict) dict;
409-
}
410-
411-
@Specialization(replaces = "getConstant")
412-
static PDict getDict(PythonManagedClass self,
413-
@Shared("dylib") @CachedLibrary(limit = "4") DynamicObjectLibrary dylib) {
414-
return (PDict) dylib.getOrDefault(self, DICT, null);
415-
}
416-
}
417385
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/ReadAttributeFromObjectNode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,8 @@ protected static Object readForeign(Object object, Object key,
170170
@Specialization(guards = {"!isPythonObject(object)", "!isNativeObject(object)", "!isForeignObjectNode.execute(object)"}, limit = "1")
171171
protected static PNone readUnboxed(Object object, Object key,
172172
@SuppressWarnings("unused") @Shared("isForeign") @Cached IsForeignObjectNode isForeignObjectNode,
173-
// We want to share hlib with subclasses, this is to make Truffle shut up about
174-
// not being able to share it in the base class
173+
// We want to share "hlib" with subclasses, this is to make Truffle shut up
174+
// about not being able to share it in the base class
175175
@SuppressWarnings("unused") @Shared("hlib") @CachedLibrary(limit = "MAX_DICT_TYPES") HashingStorageLibrary hlib) {
176176
return PNone.NO_VALUE;
177177
}

0 commit comments

Comments
 (0)