Skip to content

Commit 462d903

Browse files
committed
[GR-48262] Filter out hidden keys
PullRequest: graalpython/2935
2 parents 97b26c1 + 56300d7 commit 462d903

File tree

5 files changed

+27
-25
lines changed

5 files changed

+27
-25
lines changed

graalpython/com.oracle.graal.python.test/src/tests/cpyext/test_object.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,9 @@ def test_inheret_numbers_slots(self):
305305
assert X.B_has_add_slot()
306306
assert Y.E_has_add_slot()
307307

308+
# check dir & __dir__
309+
assert sorted(list(B.__dir__())) == dir(B)
310+
308311
def test_managed_class_with_native_base(self):
309312
NativeModule = CPyExtType("NativeModule_",
310313
'''

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ def __init__(self):
104104
assert "d" in m.__dict__
105105
assert m.__dict__ == {'a': 10, 'd': 20}
106106

107+
# check dir & __dir__
108+
assert sorted(list(m.__dir__())) == dir(m)
107109

108110
def test_set_attr_builtins():
109111
lst = list()

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/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/runtime/sequence/storage/ObjectSequenceStorage.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2022, Oracle and/or its affiliates.
2+
* Copyright (c) 2017, 2023, Oracle and/or its affiliates.
33
* Copyright (c) 2013, Regents of the University of California
44
*
55
* All rights reserved.
@@ -176,6 +176,7 @@ public Object getCopyOfInternalArrayObject() {
176176
@Override
177177
public void setInternalArrayObject(Object arrayObject) {
178178
this.values = (Object[]) arrayObject;
179+
this.capacity = values.length;
179180
assertContainsNoJavaString(values);
180181
}
181182

0 commit comments

Comments
 (0)