Skip to content

Commit 9a37f94

Browse files
committed
Assume fixed key in merged object/type/module GetAttribute node.
1 parent 7957a13 commit 9a37f94

6 files changed

Lines changed: 22 additions & 43 deletions

File tree

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2019, 2026, 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
@@ -86,7 +86,6 @@
8686
import com.oracle.graal.python.nodes.ErrorMessages;
8787
import com.oracle.graal.python.nodes.PNodeWithContext;
8888
import com.oracle.graal.python.nodes.PRaiseNode;
89-
import com.oracle.graal.python.nodes.attributes.MergedObjectTypeModuleGetAttributeNode;
9089
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromModuleNode;
9190
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
9291
import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode;
@@ -238,7 +237,8 @@ static Object doError(Object self, @SuppressWarnings("unused") Object dict,
238237
@GenerateNodeFactory
239238
public abstract static class ModuleGetattributeNode extends GetAttrBuiltinNode {
240239
/**
241-
* Keep in sync with {@link MergedObjectTypeModuleGetAttributeNode}
240+
* Keep in sync with
241+
* {@link com.oracle.graal.python.nodes.attributes.MergedObjectTypeModuleGetFixedAttributeNode}
242242
*/
243243
@Specialization
244244
static Object getattribute(VirtualFrame frame, PythonModule self, Object keyObj,

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2025, Oracle and/or its affiliates.
2+
* Copyright (c) 2017, 2026, Oracle and/or its affiliates.
33
* Copyright (c) 2014, Regents of the University of California
44
*
55
* All rights reserved.
@@ -119,7 +119,6 @@
119119
import com.oracle.graal.python.nodes.PNodeWithContext;
120120
import com.oracle.graal.python.nodes.PRaiseNode;
121121
import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode;
122-
import com.oracle.graal.python.nodes.attributes.MergedObjectTypeModuleGetAttributeNode;
123122
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
124123
import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode;
125124
import com.oracle.graal.python.nodes.builtins.ListNodes;
@@ -510,7 +509,8 @@ public abstract static class GetAttributeNode extends GetAttrBuiltinNode {
510509
* Keep in sync with
511510
* {@link com.oracle.graal.python.builtins.objects.type.TypeBuiltins.GetattributeNode} and
512511
* {@link com.oracle.graal.python.builtins.objects.thread.ThreadLocalBuiltins.GetAttributeNode}
513-
* and {@link MergedObjectTypeModuleGetAttributeNode}
512+
* and
513+
* {@link com.oracle.graal.python.nodes.attributes.MergedObjectTypeModuleGetFixedAttributeNode}
514514
*/
515515
@Specialization
516516
@SuppressWarnings("truffle-static-method")

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/thread/ThreadLocalBuiltins.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021, 2025, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2021, 2026, 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
@@ -72,7 +72,6 @@
7272
import com.oracle.graal.python.nodes.PGuards;
7373
import com.oracle.graal.python.nodes.PRaiseNode;
7474
import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode;
75-
import com.oracle.graal.python.nodes.attributes.MergedObjectTypeModuleGetAttributeNode;
7675
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
7776
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
7877
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
@@ -141,7 +140,8 @@ public abstract static class GetAttributeNode extends GetAttrBuiltinNode {
141140
* Keep in sync with
142141
* {@link com.oracle.graal.python.builtins.objects.object.ObjectBuiltins.GetAttributeNode}
143142
* and {@link com.oracle.graal.python.builtins.objects.type.TypeBuiltins.GetattributeNode}
144-
* and {@link MergedObjectTypeModuleGetAttributeNode}
143+
* and
144+
* {@link com.oracle.graal.python.nodes.attributes.MergedObjectTypeModuleGetFixedAttributeNode}
145145
*/
146146
@Specialization
147147
Object doIt(VirtualFrame frame, PThreadLocal object, Object keyObj,

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,6 @@
140140
import com.oracle.graal.python.nodes.SpecialAttributeNames;
141141
import com.oracle.graal.python.nodes.attributes.GetFixedAttributeNode;
142142
import com.oracle.graal.python.nodes.attributes.LookupAttributeInMRONode;
143-
import com.oracle.graal.python.nodes.attributes.MergedObjectTypeModuleGetAttributeNode;
144143
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
145144
import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode;
146145
import com.oracle.graal.python.nodes.builtins.ListNodes.ConstructListNode;
@@ -537,7 +536,8 @@ public abstract static class GetattributeNode extends GetAttrBuiltinNode {
537536
* {@link com.oracle.graal.python.builtins.objects.object.ObjectBuiltins.GetAttributeNode}
538537
* and
539538
* {@link com.oracle.graal.python.builtins.objects.thread.ThreadLocalBuiltins.GetAttributeNode}
540-
* and {@link MergedObjectTypeModuleGetAttributeNode}
539+
* and
540+
* {@link com.oracle.graal.python.nodes.attributes.MergedObjectTypeModuleGetFixedAttributeNode}
541541
*/
542542
@Specialization
543543
protected Object doIt(VirtualFrame frame, Object object, Object keyObj,

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2017, 2026, 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
@@ -66,7 +66,7 @@ Object doIt(VirtualFrame frame, Object object,
6666
@Bind Node inliningTarget,
6767
@Cached GetClassNode getClassNode,
6868
@Cached GetCachedTpSlotsNode getSlotsNode,
69-
@Cached MergedObjectTypeModuleGetAttributeInnerNode innerNode) {
69+
@Cached MergedObjectTypeModuleGetFixedAttributeNode innerNode) {
7070
Object type = getClassNode.execute(inliningTarget, object);
7171
TpSlots slots = getSlotsNode.execute(inliningTarget, type);
7272
return innerNode.execute(frame, inliningTarget, object, key, type, slots);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/MergedObjectTypeModuleGetAttributeNode.java renamed to graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/attributes/MergedObjectTypeModuleGetFixedAttributeNode.java

Lines changed: 9 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,7 @@
4747
import com.oracle.graal.python.builtins.objects.module.ModuleBuiltins;
4848
import com.oracle.graal.python.builtins.objects.module.PythonModule;
4949
import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins;
50-
import com.oracle.graal.python.builtins.objects.str.StringNodes.CastToTruffleStringChecked1Node;
5150
import com.oracle.graal.python.builtins.objects.type.TpSlots;
52-
import com.oracle.graal.python.builtins.objects.type.TpSlots.GetCachedTpSlotsNode;
5351
import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode;
5452
import com.oracle.graal.python.builtins.objects.type.TypeBuiltins;
5553
import com.oracle.graal.python.builtins.objects.type.slots.TpSlot;
@@ -65,7 +63,6 @@
6563
import com.oracle.truffle.api.dsl.Cached;
6664
import com.oracle.truffle.api.dsl.GenerateCached;
6765
import com.oracle.truffle.api.dsl.GenerateInline;
68-
import com.oracle.truffle.api.dsl.GenerateUncached;
6966
import com.oracle.truffle.api.dsl.Idempotent;
7067
import com.oracle.truffle.api.dsl.Specialization;
7168
import com.oracle.truffle.api.frame.VirtualFrame;
@@ -79,32 +76,14 @@
7976
* {@link com.oracle.graal.python.builtins.objects.object.ObjectBuiltins.GetAttributeNode},
8077
* {@link com.oracle.graal.python.builtins.objects.type.TypeBuiltins.GetattributeNode} and
8178
* {@link com.oracle.graal.python.builtins.objects.module.ModuleBuiltins.ModuleGetattributeNode} to
82-
* reduce code size by about 3x for host inlining
79+
* reduce code size for host inlining.
80+
*
81+
* Fixed-key version used by {@link GetFixedAttributeNode}. The key is passed via execute for
82+
* inlining, but the caller is expected to keep its identity stable for the lifetime of the node.
8383
*/
84-
@GenerateUncached
85-
@GenerateInline
86-
@GenerateCached(false)
87-
public abstract class MergedObjectTypeModuleGetAttributeNode extends PNodeWithContext {
88-
89-
public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object object, Object keyObj);
90-
91-
@Specialization
92-
static Object doIt(VirtualFrame frame, Node inliningTarget, Object object, Object keyObj,
93-
@Cached CastToTruffleStringChecked1Node castToString,
94-
@Cached GetClassNode getClassNode,
95-
@Cached GetCachedTpSlotsNode getSlotsNode,
96-
@Cached MergedObjectTypeModuleGetAttributeInnerNode innerNode) {
97-
TruffleString key = castToString.cast(inliningTarget, keyObj, ErrorMessages.ATTR_NAME_MUST_BE_STRING, keyObj);
98-
Object type = getClassNode.execute(inliningTarget, object);
99-
TpSlots slots = getSlotsNode.execute(inliningTarget, type);
100-
return innerNode.execute(frame, inliningTarget, object, key, type, slots);
101-
}
102-
}
103-
104-
@GenerateUncached
10584
@GenerateInline
10685
@GenerateCached(false)
107-
abstract class MergedObjectTypeModuleGetAttributeInnerNode extends PNodeWithContext {
86+
public abstract class MergedObjectTypeModuleGetFixedAttributeNode extends PNodeWithContext {
10887

10988
public abstract Object execute(VirtualFrame frame, Node inliningTarget, Object object, TruffleString key, Object type, TpSlots slots);
11089

@@ -121,22 +100,22 @@ static Object doIt(VirtualFrame frame, Node inliningTarget, Object object, Truff
121100
@Cached("slots.tp_getattro()") TpSlot cachedSlot,
122101
// Common
123102
@Cached GetObjectSlotsNode getDescrSlotsNode,
124-
@Cached LookupAttributeInMRONode.Dynamic lookup,
103+
@Cached("create(key)") LookupAttributeInMRONode lookup,
125104
@Cached InlinedConditionProfile hasDescProfile,
126105
@Cached InlinedConditionProfile hasDescrGetProfile,
127106
@Cached InlinedConditionProfile hasValueProfile,
128107
@Cached PRaiseNode raiseNode,
129108
@Cached CallSlotDescrGet.Lazy callSlotDescrGet,
130109
// Specific to a given tp_getattro, some should probably be lazy
131110
@Cached ReadAttributeFromObjectNode readAttributeOfObjectNode,
132-
@Cached LookupAttributeInMRONode.Dynamic readAttributeOfClassNode,
111+
@Cached("create(key)") LookupAttributeInMRONode readAttributeOfClassNode,
133112
@Cached GetObjectSlotsNode getValueSlotsNode,
134113
@Cached InlinedBranchProfile hasNonDescriptorValueProfile,
135114
@Cached CallSlotDescrGet.Lazy callSlotValueGet,
136115
@Cached ModuleBuiltins.LazyHandleGetattrExceptionNode handleException) {
137116
assert hasNoGetAttr(type);
138117
try {
139-
Object descr = lookup.execute(type, key);
118+
Object descr = lookup.execute(type);
140119
boolean hasDescr = hasDescProfile.profile(inliningTarget, descr != PNone.NO_VALUE);
141120

142121
TpSlot get = null;
@@ -162,7 +141,7 @@ static Object doIt(VirtualFrame frame, Node inliningTarget, Object object, Truff
162141
}
163142
} else {
164143
// TypeBuiltins.SLOTS.tp_getattro()
165-
Object value = readAttributeOfClassNode.execute(object, key);
144+
Object value = readAttributeOfClassNode.execute(object);
166145
if (hasValueProfile.profile(inliningTarget, value != PNone.NO_VALUE)) {
167146
var valueGet = getValueSlotsNode.execute(inliningTarget, value).tp_descr_get();
168147
if (valueGet == null) {

0 commit comments

Comments
 (0)