Skip to content

Commit a0b4283

Browse files
qunaibitsteve-s
authored andcommitted
Avoid storing hidden keys in dict storage
1 parent 90d29e8 commit a0b4283

File tree

6 files changed

+25
-94
lines changed

6 files changed

+25
-94
lines changed

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
package com.oracle.graal.python.builtins.objects.module;
4242

4343
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
44-
import static com.oracle.graal.python.lib.PyObjectDir.filterHiddenKeys;
4544
import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___ANNOTATIONS__;
4645
import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___DICT__;
4746
import static com.oracle.graal.python.nodes.SpecialAttributeNames.T___ANNOTATIONS__;
@@ -73,7 +72,6 @@
7372
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetItem;
7473
import com.oracle.graal.python.builtins.objects.common.PHashingCollection;
7574
import com.oracle.graal.python.builtins.objects.dict.PDict;
76-
import com.oracle.graal.python.builtins.objects.list.PList;
7775
import com.oracle.graal.python.builtins.objects.module.ModuleBuiltinsClinicProviders.ModuleNodeClinicProviderGen;
7876
import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins;
7977
import com.oracle.graal.python.lib.PyObjectLookupAttr;
@@ -175,9 +173,7 @@ Object dir(VirtualFrame frame, PythonModule self,
175173
if (dirFunc != null) {
176174
return callNode.execute(frame, dirFunc);
177175
} else {
178-
PList list = constructListNode.execute(frame, dict);
179-
filterHiddenKeys(list.getSequenceStorage());
180-
return list;
176+
return constructListNode.execute(frame, dict);
181177
}
182178
} else {
183179
throw raise(PythonBuiltinClassType.TypeError, ErrorMessages.IS_NOT_A_DICTIONARY, "<module>.__dict__");

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626

2727
package com.oracle.graal.python.builtins.objects.object;
2828

29-
import static com.oracle.graal.python.lib.PyObjectDir.filterHiddenKeys;
3029
import static com.oracle.graal.python.nodes.PGuards.isDeleteMarker;
3130
import static com.oracle.graal.python.nodes.PGuards.isDict;
3231
import static com.oracle.graal.python.nodes.PGuards.isNoValue;
@@ -80,7 +79,6 @@
8079
import com.oracle.graal.python.builtins.objects.PNotImplemented;
8180
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
8281
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes;
83-
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageDelItem;
8482
import com.oracle.graal.python.builtins.objects.dict.PDict;
8583
import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor;
8684
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
@@ -107,7 +105,6 @@
107105
import com.oracle.graal.python.nodes.attributes.LookupCallableSlotInMRONode;
108106
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
109107
import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode;
110-
import com.oracle.graal.python.nodes.builtins.ListNodes;
111108
import com.oracle.graal.python.nodes.call.CallNode;
112109
import com.oracle.graal.python.nodes.call.special.CallBinaryMethodNode;
113110
import com.oracle.graal.python.nodes.call.special.CallTernaryMethodNode;
@@ -929,16 +926,13 @@ Object dir(VirtualFrame frame, Object obj,
929926
@Cached CallNode callNode,
930927
@Cached GetClassNode getClassNode,
931928
@Cached IsSubtypeNode isSubtypeNode,
932-
@Cached ListNodes.ConstructListNode constructListNode,
933-
@Cached HashingStorageDelItem delItem,
934929
@Cached com.oracle.graal.python.builtins.objects.type.TypeBuiltins.DirNode dirNode) {
935930
PSet names = factory().createSet();
936931
Object updateCallable = lookupAttrNode.execute(frame, inliningTarget, names, T_UPDATE);
937932
Object ns = lookupAttrNode.execute(frame, inliningTarget, obj, T___DICT__);
938933
if (isSubtypeNode.execute(frame, getClassNode.execute(inliningTarget, ns), PythonBuiltinClassType.PDict)) {
939934
callNode.execute(frame, updateCallable, ns);
940935
}
941-
filterHiddenKeys(frame, names, inliningTarget, constructListNode, delItem);
942936
Object klass = lookupAttrNode.execute(frame, inliningTarget, obj, T___CLASS__);
943937
if (klass != PNone.NO_VALUE) {
944938
callNode.execute(frame, updateCallable, dirNode.execute(frame, klass));

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
*/
4141
package com.oracle.graal.python.builtins.objects.type;
4242

43-
import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_dict;
4443
import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.NB_ADD;
4544
import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.NB_AND;
4645
import static com.oracle.graal.python.builtins.objects.type.MethodsFlags.NB_BOOL;
@@ -151,11 +150,10 @@
151150
import com.oracle.graal.python.builtins.Python3Core;
152151
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
153152
import com.oracle.graal.python.builtins.objects.PNone;
153+
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
154154
import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass;
155-
import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess;
156155
import com.oracle.graal.python.builtins.objects.common.HashingStorage;
157156
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetItem;
158-
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageSetItem;
159157
import com.oracle.graal.python.builtins.objects.dict.PDict;
160158
import com.oracle.graal.python.builtins.objects.function.BuiltinMethodDescriptor;
161159
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
@@ -627,8 +625,9 @@ private static void setMethodsFlag(PythonNativeClass cls, long flag, PythonConte
627625
if (assumption != null && assumption.getAssumption().isValid()) {
628626
assumption.invalidate("methods flags have changed after class creation");
629627
}
630-
PDict dict = (PDict) CStructAccess.ReadObjectNode.getUncached().readFromObj(cls, PyTypeObject__tp_dict);
631-
dict.setDictStorage(HashingStorageSetItem.executeUncached(dict.getDictStorage(), METHODS_FLAGS, flags | flag));
628+
if (cls instanceof PythonAbstractNativeObject nclass) {
629+
DynamicObjectLibrary.getUncached().putLong(nclass, METHODS_FLAGS, flags | flag);
630+
}
632631
}
633632
}
634633

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

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828

2929
import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_name;
3030
import static com.oracle.graal.python.builtins.objects.object.ObjectBuiltins.InitNode.overridesBuiltinMethod;
31-
import static com.oracle.graal.python.lib.PyObjectDir.filterHiddenKeys;
3231
import static com.oracle.graal.python.nodes.BuiltinNames.T_BUILTINS;
3332
import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___ABSTRACTMETHODS__;
3433
import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___ANNOTATIONS__;
@@ -98,7 +97,6 @@
9897
import com.oracle.graal.python.builtins.objects.cext.structs.CFields;
9998
import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess;
10099
import com.oracle.graal.python.builtins.objects.common.DynamicObjectStorage;
101-
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageDelItem;
102100
import com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetObjectArrayNode;
103101
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.ToArrayNode;
104102
import com.oracle.graal.python.builtins.objects.dict.PDict;
@@ -148,7 +146,6 @@
148146
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
149147
import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode;
150148
import com.oracle.graal.python.nodes.builtins.FunctionNodes;
151-
import com.oracle.graal.python.nodes.builtins.ListNodes;
152149
import com.oracle.graal.python.nodes.call.special.CallTernaryMethodNode;
153150
import com.oracle.graal.python.nodes.call.special.CallVarargsMethodNode;
154151
import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode;
@@ -1407,11 +1404,9 @@ Object dir(VirtualFrame frame, Object klass,
14071404
@Cached PyObjectLookupAttr lookupAttrNode,
14081405
@Cached com.oracle.graal.python.nodes.call.CallNode callNode,
14091406
@Cached ToArrayNode toArrayNode,
1410-
@Cached("createGetAttrNode()") GetFixedAttributeNode getBasesNode,
1411-
@Cached ListNodes.ConstructListNode constructListNode,
1412-
@Cached HashingStorageDelItem delItem) {
1407+
@Cached("createGetAttrNode()") GetFixedAttributeNode getBasesNode) {
14131408
PSet names = dir(frame, klass,
1414-
inliningTarget, lookupAttrNode, callNode, getBasesNode, toArrayNode, constructListNode, delItem);
1409+
inliningTarget, lookupAttrNode, callNode, getBasesNode, toArrayNode);
14151410
return names;
14161411
}
14171412

@@ -1420,24 +1415,21 @@ private PSet dir(VirtualFrame frame, Object klass,
14201415
PyObjectLookupAttr lookupAttrNode,
14211416
com.oracle.graal.python.nodes.call.CallNode callNode,
14221417
GetFixedAttributeNode getBasesNode,
1423-
ToArrayNode toArrayNode,
1424-
ListNodes.ConstructListNode constructListNode,
1425-
HashingStorageDelItem delItem) {
1418+
ToArrayNode toArrayNode) {
14261419
PSet names = factory().createSet();
14271420
Object updateCallable = lookupAttrNode.execute(frame, inliningTarget, names, T_UPDATE);
14281421
Object ns = lookupAttrNode.execute(frame, inliningTarget, klass, T___DICT__);
14291422
if (ns != PNone.NO_VALUE) {
14301423
callNode.execute(frame, updateCallable, ns);
14311424
}
1432-
filterHiddenKeys(frame, names, inliningTarget, constructListNode, delItem);
14331425
Object basesAttr = getBasesNode.execute(frame, klass);
14341426
if (basesAttr instanceof PTuple) {
14351427
Object[] bases = toArrayNode.execute(inliningTarget, ((PTuple) basesAttr).getSequenceStorage());
14361428
for (Object cls : bases) {
14371429
// Note that since we are only interested in the keys, the order
14381430
// we merge classes is unimportant
14391431
Object baseNames = dir(frame, cls,
1440-
inliningTarget, lookupAttrNode, callNode, getBasesNode, toArrayNode, constructListNode, delItem);
1432+
inliningTarget, lookupAttrNode, callNode, getBasesNode, toArrayNode);
14411433
callNode.execute(frame, updateCallable, baseNames);
14421434
}
14431435
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/GetMethodsFlagsNode.java

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -40,28 +40,24 @@
4040
*/
4141
package com.oracle.graal.python.lib;
4242

43-
import static com.oracle.graal.python.builtins.objects.cext.structs.CFields.PyTypeObject__tp_dict;
44-
4543
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
4644
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
4745
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.PCallCapiFunction;
4846
import com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol;
49-
import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess;
50-
import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccessFactory;
51-
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageGetItem;
52-
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageSetItem;
53-
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodesFactory.HashingStorageGetItemNodeGen;
54-
import com.oracle.graal.python.builtins.objects.dict.PDict;
5547
import com.oracle.graal.python.builtins.objects.type.PythonManagedClass;
5648
import com.oracle.graal.python.runtime.PythonContext;
5749
import com.oracle.truffle.api.Assumption;
50+
import com.oracle.truffle.api.CompilerDirectives;
5851
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
5952
import com.oracle.truffle.api.dsl.Cached;
6053
import com.oracle.truffle.api.dsl.Fallback;
6154
import com.oracle.truffle.api.dsl.GenerateInline;
6255
import com.oracle.truffle.api.dsl.GenerateUncached;
6356
import com.oracle.truffle.api.dsl.Specialization;
57+
import com.oracle.truffle.api.library.CachedLibrary;
6458
import com.oracle.truffle.api.nodes.Node;
59+
import com.oracle.truffle.api.nodes.UnexpectedResultException;
60+
import com.oracle.truffle.api.object.DynamicObjectLibrary;
6561
import com.oracle.truffle.api.object.HiddenKey;
6662

6763
/**
@@ -87,14 +83,14 @@ protected static long pythonclasstype(PythonBuiltinClassType cls) {
8783
public static final HiddenKey METHODS_FLAGS = new HiddenKey("__methods_flags__");
8884

8985
@TruffleBoundary
90-
private static long populateMethodsFlags(PythonAbstractNativeObject cls, PDict dict) {
86+
private static long populateMethodsFlags(PythonAbstractNativeObject cls, DynamicObjectLibrary dynlib) {
9187
Long flags = (Long) PCallCapiFunction.getUncached().call(NativeCAPISymbol.FUN_GET_METHODS_FLAGS, cls.getPtr());
92-
dict.setDictStorage(HashingStorageSetItem.executeUncached(dict.getDictStorage(), METHODS_FLAGS, flags));
88+
dynlib.putLong(cls, METHODS_FLAGS, flags);
9389
return flags;
9490
}
9591

9692
protected static long getMethodsFlags(PythonAbstractNativeObject cls) {
97-
return doNative(null, cls, CStructAccessFactory.ReadObjectNodeGen.getUncached(), HashingStorageGetItemNodeGen.getUncached());
93+
return doNative(cls, DynamicObjectLibrary.getUncached());
9894
}
9995

10096
// The assumption should hold unless `PyType_Modified` is called.
@@ -110,16 +106,17 @@ static long doNativeCached(@SuppressWarnings("unused") PythonAbstractNativeObjec
110106
}
111107

112108
@Specialization(replaces = "doNativeCached")
113-
static long doNative(Node inliningTarget, PythonAbstractNativeObject cls,
114-
@Cached(inline = false) CStructAccess.ReadObjectNode getTpDictNode,
115-
@Cached HashingStorageGetItem getItem) {
109+
static long doNative(PythonAbstractNativeObject cls,
110+
@CachedLibrary(limit = "1") DynamicObjectLibrary dynlib) {
116111
// classes must have tp_dict since they are set during PyType_Ready
117-
PDict dict = (PDict) getTpDictNode.readFromObj(cls, PyTypeObject__tp_dict);
118-
Object f = getItem.execute(inliningTarget, dict.getDictStorage(), METHODS_FLAGS);
119-
if (f == null) {
120-
return populateMethodsFlags(cls, dict);
112+
if (!dynlib.containsKey(cls, METHODS_FLAGS)) {
113+
return populateMethodsFlags(cls, dynlib);
114+
}
115+
try {
116+
return dynlib.getLongOrDefault(cls, METHODS_FLAGS, 0L);
117+
} catch (UnexpectedResultException e) {
118+
throw CompilerDirectives.shouldNotReachHere(e);
121119
}
122-
return (Long) f;
123120
}
124121

125122
@Fallback

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyObjectDir.java

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -43,27 +43,19 @@
4343
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
4444

4545
import com.oracle.graal.python.builtins.objects.PNone;
46-
import com.oracle.graal.python.builtins.objects.common.EmptyStorage;
47-
import com.oracle.graal.python.builtins.objects.common.HashingStorage;
48-
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.HashingStorageDelItem;
4946
import com.oracle.graal.python.builtins.objects.list.ListBuiltins;
5047
import com.oracle.graal.python.builtins.objects.list.PList;
51-
import com.oracle.graal.python.builtins.objects.set.PSet;
5248
import com.oracle.graal.python.nodes.ErrorMessages;
5349
import com.oracle.graal.python.nodes.PNodeWithContext;
5450
import com.oracle.graal.python.nodes.PRaiseNode;
5551
import com.oracle.graal.python.nodes.builtins.ListNodes;
5652
import com.oracle.graal.python.nodes.call.special.LookupAndCallUnaryNode;
57-
import com.oracle.graal.python.runtime.sequence.storage.EmptySequenceStorage;
58-
import com.oracle.graal.python.runtime.sequence.storage.ObjectSequenceStorage;
59-
import com.oracle.graal.python.runtime.sequence.storage.SequenceStorage;
6053
import com.oracle.truffle.api.dsl.Cached;
6154
import com.oracle.truffle.api.dsl.GenerateCached;
6255
import com.oracle.truffle.api.dsl.GenerateInline;
6356
import com.oracle.truffle.api.dsl.Specialization;
6457
import com.oracle.truffle.api.frame.VirtualFrame;
6558
import com.oracle.truffle.api.nodes.Node;
66-
import com.oracle.truffle.api.object.HiddenKey;
6759

6860
/**
6961
* Partial equivalent of CPython's {@code PyObject_Dir}. Only supports listing attributes of an
@@ -85,46 +77,7 @@ static PList dir(VirtualFrame frame, Node inliningTarget, Object object,
8577
throw raiseNode.get(inliningTarget).raise(TypeError, ErrorMessages.OBJ_DOES_NOT_PROVIDE_DIR);
8678
}
8779
PList list = constructListNode.execute(frame, result);
88-
filterHiddenKeys(list.getSequenceStorage());
8980
sortNode.execute(frame, list);
9081
return list;
9182
}
92-
93-
public static void filterHiddenKeys(SequenceStorage s) {
94-
if (s instanceof ObjectSequenceStorage storage) {
95-
// String do not have a special storage
96-
Object[] oldarray = storage.getInternalArray();
97-
Object[] newarray = new Object[storage.length()];
98-
int j = 0;
99-
for (int i = 0; i < storage.length(); i++) {
100-
Object o = oldarray[i];
101-
if (o instanceof HiddenKey) {
102-
continue;
103-
}
104-
newarray[j++] = o;
105-
}
106-
storage.setInternalArrayObject(newarray);
107-
storage.setNewLength(j);
108-
} else if (!(s instanceof EmptySequenceStorage)) {
109-
assert false : "Unexpected storage type!";
110-
}
111-
}
112-
113-
public static void filterHiddenKeys(VirtualFrame frame, PSet names,
114-
Node inliningTarget,
115-
ListNodes.ConstructListNode constructListNode,
116-
HashingStorageDelItem delItem) {
117-
HashingStorage set = names.getDictStorage();
118-
if (set != EmptyStorage.INSTANCE) {
119-
PList list = constructListNode.execute(frame, names);
120-
ObjectSequenceStorage storage = (ObjectSequenceStorage) list.getSequenceStorage();
121-
Object[] array = storage.getInternalArray();
122-
for (int i = 0; i < storage.length(); i++) {
123-
Object o = array[i];
124-
if (o instanceof HiddenKey) {
125-
delItem.execute(frame, inliningTarget, set, o, names);
126-
}
127-
}
128-
}
129-
}
13083
}

0 commit comments

Comments
 (0)