Skip to content

Commit 2e064e5

Browse files
committed
[GR-52207] Consolidate access to hidden attributes
PullRequest: graalpython/3185
2 parents 4982ba3 + fd4adf9 commit 2e064e5

File tree

69 files changed

+1061
-984
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

69 files changed

+1061
-984
lines changed

ci.jsonnet

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{ "overlay": "df01b1840294d4da3e6e3bfa0e322aa269d7cc86" }
1+
{ "overlay": "2ef2553d7b0fa75b8e15a572047155296d4eb955" }

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/PythonLanguage.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@
7777
import com.oracle.graal.python.compiler.CompilationUnit;
7878
import com.oracle.graal.python.compiler.Compiler;
7979
import com.oracle.graal.python.compiler.RaisePythonExceptionErrorCallback;
80-
import com.oracle.graal.python.nodes.HiddenAttributes;
80+
import com.oracle.graal.python.nodes.HiddenAttr;
8181
import com.oracle.graal.python.nodes.bytecode.PBytecodeRootNode;
8282
import com.oracle.graal.python.nodes.call.CallNode;
8383
import com.oracle.graal.python.nodes.call.GenericInvokeNode;
@@ -132,7 +132,6 @@
132132
import com.oracle.truffle.api.nodes.ExplodeLoop.LoopExplosionKind;
133133
import com.oracle.truffle.api.nodes.Node;
134134
import com.oracle.truffle.api.nodes.RootNode;
135-
import com.oracle.truffle.api.object.HiddenKey;
136135
import com.oracle.truffle.api.object.Shape;
137136
import com.oracle.truffle.api.source.Source;
138137
import com.oracle.truffle.api.source.Source.SourceBuilder;
@@ -371,7 +370,7 @@ public boolean isSingleContext() {
371370
/** For fast access to the PythonThreadState object by the owning thread. */
372371
private final ContextThreadLocal<PythonThreadState> threadState = locals.createContextThreadLocal(PythonContext.PythonThreadState::new);
373372

374-
public final ConcurrentHashMap<String, HiddenKey> typeHiddenKeys = new ConcurrentHashMap<>(TypeBuiltins.INITIAL_HIDDEN_TYPE_KEYS);
373+
public final ConcurrentHashMap<String, HiddenAttr> typeHiddenAttrs = new ConcurrentHashMap<>(TypeBuiltins.INITIAL_HIDDEN_TYPE_ATTRS);
375374

376375
private final MroShape mroShapeRoot = MroShape.createRoot();
377376

@@ -954,7 +953,7 @@ public Shape getEmptyShape() {
954953

955954
public Shape getShapeForClass(PythonAbstractClass klass) {
956955
if (isSingleContext()) {
957-
return Shape.newBuilder(getEmptyShape()).addConstantProperty(HiddenAttributes.CLASS, klass, 0).build();
956+
return Shape.newBuilder(getEmptyShape()).addConstantProperty(HiddenAttr.getClassHiddenKey(), klass, 0).build();
958957
} else {
959958
return getEmptyShape();
960959
}
@@ -969,7 +968,7 @@ public Shape getBuiltinTypeInstanceShape(PythonBuiltinClassType type) {
969968
Shape shape = builtinTypeInstanceShapes[ordinal];
970969
if (shape == null) {
971970
CompilerDirectives.transferToInterpreterAndInvalidate();
972-
Shape.DerivedBuilder shapeBuilder = Shape.newBuilder(getEmptyShape()).addConstantProperty(HiddenAttributes.CLASS, type, 0);
971+
Shape.DerivedBuilder shapeBuilder = Shape.newBuilder(getEmptyShape()).addConstantProperty(HiddenAttr.getClassHiddenKey(), type, 0);
973972
if (!type.isBuiltinWithDict()) {
974973
shapeBuilder.shapeFlags(PythonObject.HAS_SLOTS_BUT_NO_DICT_FLAG);
975974
}

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

Lines changed: 10 additions & 7 deletions
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, 2024, Oracle and/or its affiliates.
33
* Copyright (c) 2013, Regents of the University of California
44
*
55
* All rights reserved.
@@ -122,14 +122,14 @@
122122
import com.oracle.graal.python.builtins.objects.module.PythonModule;
123123
import com.oracle.graal.python.builtins.objects.object.PythonObject;
124124
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
125+
import com.oracle.graal.python.nodes.HiddenAttr;
125126
import com.oracle.graal.python.nodes.PGuards;
126127
import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode;
127128
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
128129
import com.oracle.graal.python.runtime.object.PythonObjectSlowPathFactory;
129130
import com.oracle.graal.python.util.BiConsumer;
130131
import com.oracle.truffle.api.RootCallTarget;
131132
import com.oracle.truffle.api.dsl.NodeFactory;
132-
import com.oracle.truffle.api.object.HiddenKey;
133133
import com.oracle.truffle.api.strings.TruffleString;
134134

135135
public abstract class PythonBuiltins {
@@ -266,11 +266,11 @@ private static int numDefaults(Builtin builtin) {
266266
}
267267

268268
private void addBuiltinConstantInternal(Object name, Object value) {
269-
assert name instanceof TruffleString || name instanceof HiddenKey;
269+
assert name instanceof TruffleString || name instanceof HiddenAttr;
270270
builtinConstants.put(name, ensureNoJavaString(value));
271271
}
272272

273-
protected final void addBuiltinConstant(HiddenKey name, Object value) {
273+
protected final void addBuiltinConstant(HiddenAttr name, Object value) {
274274
addBuiltinConstantInternal(name, value);
275275
}
276276

@@ -290,9 +290,12 @@ void addConstantsToModuleObject(PythonObject obj) {
290290
for (Map.Entry<Object, Object> entry : builtinConstants.entrySet()) {
291291
Object constant = assertNoJavaString(entry.getKey());
292292
Object value = assertNoJavaString(entry.getValue());
293-
assert constant instanceof TruffleString || constant instanceof HiddenKey;
294-
assert !(value instanceof String);
295-
obj.setAttribute(constant, value);
293+
if (constant instanceof HiddenAttr attr) {
294+
HiddenAttr.WriteNode.executeUncached(obj, attr, value);
295+
} else {
296+
assert constant instanceof TruffleString;
297+
obj.setAttribute(constant, value);
298+
}
296299
}
297300
}
298301

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

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -40,7 +40,6 @@
4040
*/
4141
package com.oracle.graal.python.builtins.modules;
4242

43-
import static com.oracle.graal.python.builtins.objects.type.TypeBuiltins.TYPE_FLAGS;
4443
import static com.oracle.graal.python.builtins.objects.type.TypeFlags.COLLECTION_FLAGS;
4544
import static com.oracle.graal.python.builtins.objects.type.TypeFlags.IMMUTABLETYPE;
4645
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
@@ -50,22 +49,25 @@
5049

5150
import com.oracle.graal.python.builtins.Builtin;
5251
import com.oracle.graal.python.builtins.CoreFunctions;
52+
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
5353
import com.oracle.graal.python.builtins.PythonBuiltins;
5454
import com.oracle.graal.python.builtins.objects.PNone;
55+
import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
5556
import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass;
5657
import com.oracle.graal.python.builtins.objects.type.TypeFlags;
5758
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
5859
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetSubclassesAsArrayNode;
5960
import com.oracle.graal.python.lib.PyObjectLookupAttr;
6061
import com.oracle.graal.python.nodes.ErrorMessages;
62+
import com.oracle.graal.python.nodes.HiddenAttr;
6163
import com.oracle.graal.python.nodes.PRaiseNode;
6264
import com.oracle.graal.python.nodes.attributes.DeleteAttributeNode;
63-
import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode;
6465
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
6566
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
6667
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
6768
import com.oracle.graal.python.nodes.util.CannotCastException;
6869
import com.oracle.graal.python.nodes.util.CastToJavaLongLossyNode;
70+
import com.oracle.graal.python.runtime.PythonContext;
6971
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
7072
import com.oracle.truffle.api.dsl.Bind;
7173
import com.oracle.truffle.api.dsl.Cached;
@@ -107,7 +109,14 @@ static Object init(Object object,
107109
}
108110
long tpFlags = TypeNodes.GetTypeFlagsNode.getUncached().execute(object);
109111
tpFlags |= (val & COLLECTION_FLAGS);
110-
WriteAttributeToObjectNode.getUncached().execute(object, TYPE_FLAGS, tpFlags);
112+
PythonAbstractObject type;
113+
if (object instanceof PythonBuiltinClassType pbct) {
114+
type = PythonContext.get(inliningTarget).lookupType(pbct);
115+
} else {
116+
assert object instanceof PythonAbstractObject;
117+
type = (PythonAbstractObject) object;
118+
}
119+
HiddenAttr.WriteNode.executeUncached(type, HiddenAttr.FLAGS, tpFlags);
111120
deleteAttributeNode.execute(null, inliningTarget, object, ABC_TPFLAGS);
112121
}
113122
return PNone.NONE;

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

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -43,7 +43,6 @@
4343
import static com.oracle.graal.python.nodes.BuiltinNames.J_GET_REGISTERED_INTEROP_BEHAVIOR;
4444
import static com.oracle.graal.python.nodes.BuiltinNames.J_INTEROP_BEHAVIOR;
4545
import static com.oracle.graal.python.nodes.BuiltinNames.J_REGISTER_INTEROP_BEHAVIOR;
46-
import static com.oracle.graal.python.nodes.BuiltinNames.J___GRAALPYTHON_INTEROP_BEHAVIOR__;
4746
import static com.oracle.graal.python.nodes.BuiltinNames.T_REGISTER_INTEROP_BEHAVIOR;
4847
import static com.oracle.graal.python.nodes.ErrorMessages.ARG_MUST_BE_NUMBER;
4948
import static com.oracle.graal.python.nodes.ErrorMessages.S_ARG_MUST_BE_S_NOT_P;
@@ -101,6 +100,7 @@
101100
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
102101
import com.oracle.graal.python.lib.PyObjectGetAttr;
103102
import com.oracle.graal.python.nodes.ErrorMessages;
103+
import com.oracle.graal.python.nodes.HiddenAttr;
104104
import com.oracle.graal.python.nodes.PRaiseNode;
105105
import com.oracle.graal.python.nodes.PRootNode;
106106
import com.oracle.graal.python.nodes.SpecialAttributeNames;
@@ -147,8 +147,6 @@
147147
import com.oracle.truffle.api.library.CachedLibrary;
148148
import com.oracle.truffle.api.nodes.LanguageInfo;
149149
import com.oracle.truffle.api.nodes.Node;
150-
import com.oracle.truffle.api.object.DynamicObjectLibrary;
151-
import com.oracle.truffle.api.object.HiddenKey;
152150
import com.oracle.truffle.api.source.Source;
153151
import com.oracle.truffle.api.source.Source.LiteralBuilder;
154152
import com.oracle.truffle.api.source.Source.SourceBuilder;
@@ -653,9 +651,9 @@ PList get(PythonAbstractObject klass,
653651
@Cached TypeNodes.IsTypeNode isTypeNode,
654652
@Cached PythonObjectFactory factory,
655653
@Cached PRaiseNode raiseNode,
656-
@CachedLibrary(limit = "1") DynamicObjectLibrary dylib) {
654+
@Cached HiddenAttr.ReadNode readHiddenAttrNode) {
657655
if (isTypeNode.execute(inliningTarget, klass)) {
658-
Object value = dylib.getOrDefault(klass, RegisterInteropBehaviorNode.HOST_INTEROP_BEHAVIOR, null);
656+
Object value = readHiddenAttrNode.execute(inliningTarget, klass, HiddenAttr.HOST_INTEROP_BEHAVIOR, null);
659657
if (value instanceof InteropBehavior behavior) {
660658
return factory.createList(behavior.getDefinedMethods());
661659
}
@@ -799,7 +797,6 @@ >>> register_interop_behavior(MyType, is_iterator=False, has_iterator=True, get_
799797
""")
800798
@GenerateNodeFactory
801799
public abstract static class RegisterInteropBehaviorNode extends PythonBuiltinNode {
802-
public static final HiddenKey HOST_INTEROP_BEHAVIOR = new HiddenKey(J___GRAALPYTHON_INTEROP_BEHAVIOR__);
803800

804801
void handleArg(Object value, InteropBehaviorMethod method, InteropBehavior interopBehavior, PRaiseNode raiseNode) {
805802
if (value instanceof Boolean boolValue) {
@@ -837,8 +834,7 @@ Object register(PythonAbstractObject receiver, Object is_boolean, Object is_date
837834
Object is_hash_entry_modifiable, Object is_hash_entry_insertable, Object is_hash_entry_removable, Object read_hash_value, Object write_hash_entry, Object remove_hash_entry,
838835
@Bind("this") Node inliningTarget,
839836
@Cached TypeNodes.IsTypeNode isTypeNode,
840-
@Cached PRaiseNode raiseNode,
841-
@CachedLibrary(limit = "1") DynamicObjectLibrary dylib) {
837+
@Cached PRaiseNode raiseNode) {
842838
if (isTypeNode.execute(inliningTarget, receiver)) {
843839
final InteropBehavior interopBehavior = new InteropBehavior(receiver);
844840

@@ -898,7 +894,7 @@ Object register(PythonAbstractObject receiver, Object is_boolean, Object is_date
898894
handleArg(write_hash_entry, InteropBehaviorMethod.write_hash_entry, interopBehavior, raiseNode);
899895
handleArg(remove_hash_entry, InteropBehaviorMethod.remove_hash_entry, interopBehavior, raiseNode);
900896

901-
dylib.put(receiver, HOST_INTEROP_BEHAVIOR, interopBehavior);
897+
HiddenAttr.WriteNode.executeUncached(receiver, HiddenAttr.HOST_INTEROP_BEHAVIOR, interopBehavior);
902898
return PNone.NONE;
903899
}
904900
throw raiseNode.raise(ValueError, S_ARG_MUST_BE_S_NOT_P, "first", "a type", receiver);

0 commit comments

Comments
 (0)