Skip to content

Commit 110a75c

Browse files
committed
Remove duplicate specializations in GenericSetAttrNode and callers
1 parent 4160318 commit 110a75c

File tree

6 files changed

+43
-125
lines changed

6 files changed

+43
-125
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/UnionTypeBuiltins.java

Lines changed: 9 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
*/
4141
package com.oracle.graal.python.builtins.modules.ctypes;
4242

43+
import static com.oracle.graal.python.nodes.ErrorMessages.ATTR_NAME_MUST_BE_STRING;
4344
import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
4445

4546
import java.util.List;
@@ -53,25 +54,19 @@
5354
import com.oracle.graal.python.builtins.modules.ctypes.StructUnionTypeBuiltins.PyCStructUnionTypeUpdateStgDict;
5455
import com.oracle.graal.python.builtins.modules.ctypes.StructUnionTypeBuiltins.StructUnionTypeNewNode;
5556
import com.oracle.graal.python.builtins.objects.object.ObjectNodes;
56-
import com.oracle.graal.python.builtins.objects.object.ObjectNodes.GenericSetAttrNode;
57+
import com.oracle.graal.python.builtins.objects.str.StringNodes.CastToTruffleStringChecked0Node;
5758
import com.oracle.graal.python.builtins.objects.type.TpSlots;
5859
import com.oracle.graal.python.builtins.objects.type.slots.TpSlotSetAttr.SetAttrBuiltinNode;
59-
import com.oracle.graal.python.nodes.PRaiseNode;
6060
import com.oracle.graal.python.nodes.attributes.WriteAttributeToObjectNode;
6161
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
62-
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
63-
import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
6462
import com.oracle.truffle.api.dsl.Bind;
6563
import com.oracle.truffle.api.dsl.Cached;
66-
import com.oracle.truffle.api.dsl.Cached.Exclusive;
67-
import com.oracle.truffle.api.dsl.Cached.Shared;
6864
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
6965
import com.oracle.truffle.api.dsl.NodeFactory;
7066
import com.oracle.truffle.api.dsl.Specialization;
7167
import com.oracle.truffle.api.frame.VirtualFrame;
7268
import com.oracle.truffle.api.nodes.Node;
7369
import com.oracle.truffle.api.strings.TruffleString;
74-
import com.oracle.truffle.api.strings.TruffleString.EqualNode;
7570

7671
@CoreFunctions(extendClasses = PythonBuiltinClassType.UnionType)
7772
public final class UnionTypeBuiltins extends PythonBuiltins {
@@ -96,38 +91,20 @@ protected boolean isStruct() {
9691
@GenerateNodeFactory
9792
protected abstract static class SetattrNode extends SetAttrBuiltinNode {
9893
@Specialization
99-
static void doStringKey(VirtualFrame frame, Object object, TruffleString key, Object value,
100-
@Bind Node inliningTarget,
101-
@Exclusive @Cached ObjectNodes.GenericSetAttrNode genericSetAttrNode,
102-
@Shared @Cached WriteAttributeToObjectNode write,
103-
@Shared @Cached TruffleString.EqualNode equalNode,
104-
@Shared @Cached PyCStructUnionTypeUpdateStgDict updateStgDict) {
105-
genericSetAttrNode.execute(inliningTarget, frame, object, key, value, write);
106-
updateStgDictIfNecessary(frame, object, key, value, equalNode, updateStgDict);
107-
}
108-
109-
// @Exclusive to address warning
110-
@Specialization
111-
@InliningCutoff
11294
static void doGenericKey(VirtualFrame frame, Object object, Object keyObject, Object value,
11395
@Bind Node inliningTarget,
114-
@Cached CastToTruffleStringNode castKeyNode,
115-
@Cached PRaiseNode raiseNode,
116-
@Exclusive @Cached ObjectNodes.GenericSetAttrNode genericSetAttrNode,
117-
@Shared @Cached WriteAttributeToObjectNode write,
118-
@Shared @Cached TruffleString.EqualNode equalNode,
119-
@Shared @Cached PyCStructUnionTypeUpdateStgDict updateStgDict) {
120-
TruffleString key = GenericSetAttrNode.castAttributeKey(inliningTarget, keyObject, castKeyNode, raiseNode);
96+
@Cached CastToTruffleStringChecked0Node castKeyNode,
97+
@Cached ObjectNodes.GenericSetAttrNode genericSetAttrNode,
98+
@Cached WriteAttributeToObjectNode write,
99+
@Cached TruffleString.EqualNode equalNode,
100+
@Cached PyCStructUnionTypeUpdateStgDict updateStgDict) {
101+
TruffleString key = castKeyNode.cast(inliningTarget, keyObject, ATTR_NAME_MUST_BE_STRING);
121102
genericSetAttrNode.execute(inliningTarget, frame, object, key, value, write);
122-
updateStgDictIfNecessary(frame, object, key, value, equalNode, updateStgDict);
123-
}
124-
125-
private static void updateStgDictIfNecessary(VirtualFrame frame, Object object, TruffleString key, Object value,
126-
EqualNode equalNode, PyCStructUnionTypeUpdateStgDict updateStgDict) {
127103
if (equalNode.execute(key, StructUnionTypeBuiltins.T__FIELDS_, TS_ENCODING)) {
128104
updateStgDict.execute(frame, object, value, false);
129105
}
130106
}
107+
131108
}
132109

133110
}

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

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
3030
import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_PY_OBJECT_NEW;
3131
import static com.oracle.graal.python.nodes.BuiltinNames.J_OBJECT;
32+
import static com.oracle.graal.python.nodes.ErrorMessages.ATTR_NAME_MUST_BE_STRING;
3233
import static com.oracle.graal.python.nodes.PGuards.isDeleteMarker;
3334
import static com.oracle.graal.python.nodes.PGuards.isDict;
3435
import static com.oracle.graal.python.nodes.PGuards.isNoValue;
@@ -87,6 +88,7 @@
8788
import com.oracle.graal.python.builtins.objects.object.ObjectBuiltinsFactory.GetAttributeNodeFactory;
8889
import com.oracle.graal.python.builtins.objects.set.PSet;
8990
import com.oracle.graal.python.builtins.objects.set.SetBuiltins;
91+
import com.oracle.graal.python.builtins.objects.str.StringNodes.CastToTruffleStringChecked0Node;
9092
import com.oracle.graal.python.builtins.objects.str.StringNodes.CastToTruffleStringChecked1Node;
9193
import com.oracle.graal.python.builtins.objects.thread.ThreadLocalBuiltins;
9294
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
@@ -589,19 +591,12 @@ public static GetAttributeNode create() {
589591
@GenerateNodeFactory
590592
public abstract static class SetattrNode extends SetAttrBuiltinNode {
591593
@Specialization
592-
void setString(VirtualFrame frame, Object object, TruffleString key, Object value,
594+
void set(VirtualFrame frame, Object object, Object keyObject, Object value,
593595
@Bind Node inliningTarget,
594-
@Shared @Cached ObjectNodes.GenericSetAttrNode genericSetAttrNode,
595-
@Shared @Cached WriteAttributeToObjectNode write) {
596-
genericSetAttrNode.execute(inliningTarget, frame, object, key, value, write);
597-
}
598-
599-
@Specialization
600-
@InliningCutoff
601-
void setGeneric(VirtualFrame frame, Object object, Object key, Object value,
602-
@Bind Node inliningTarget,
603-
@Shared @Cached ObjectNodes.GenericSetAttrNode genericSetAttrNode,
604-
@Shared @Cached WriteAttributeToObjectNode write) {
596+
@Cached CastToTruffleStringChecked0Node castKeyNode,
597+
@Cached ObjectNodes.GenericSetAttrNode genericSetAttrNode,
598+
@Cached WriteAttributeToObjectNode write) {
599+
TruffleString key = castKeyNode.cast(inliningTarget, keyObject, ATTR_NAME_MUST_BE_STRING);
605600
genericSetAttrNode.execute(inliningTarget, frame, object, key, value, write);
606601
}
607602

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

Lines changed: 9 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.ValueError;
4444
import static com.oracle.graal.python.builtins.objects.cext.capi.NativeCAPISymbol.FUN_CHECK_BASICSIZE_FOR_GETSTATE;
4545
import static com.oracle.graal.python.nodes.BuiltinNames.T_COPYREG;
46-
import static com.oracle.graal.python.nodes.ErrorMessages.ATTR_NAME_MUST_BE_STRING;
4746
import static com.oracle.graal.python.nodes.ErrorMessages.CANNOT_PICKLE_OBJECT_TYPE;
4847
import static com.oracle.graal.python.nodes.ErrorMessages.MUST_BE_TYPE_A_NOT_TYPE_B;
4948
import static com.oracle.graal.python.nodes.ErrorMessages.SHOULD_RETURN_A_NOT_B;
@@ -137,7 +136,6 @@
137136
import com.oracle.graal.python.nodes.object.BuiltinClassProfiles.IsAnyBuiltinObjectProfile;
138137
import com.oracle.graal.python.nodes.object.GetClassNode;
139138
import com.oracle.graal.python.nodes.object.IsForeignObjectNode;
140-
import com.oracle.graal.python.nodes.util.CannotCastException;
141139
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
142140
import com.oracle.graal.python.runtime.PythonContext;
143141
import com.oracle.graal.python.runtime.PythonOptions;
@@ -839,56 +837,16 @@ public abstract static class GenericSetAttrNode extends Node {
839837
*/
840838
public abstract void execute(Node inliningTarget, VirtualFrame frame, Object object, TruffleString key, Object value, WriteAttributeToObjectNode writeNode);
841839

842-
public abstract void execute(Node inliningTarget, VirtualFrame frame, Object object, Object key, Object value, WriteAttributeToObjectNode writeNode);
843-
844-
@Specialization
845-
static void doStringKey(Node inliningTarget, VirtualFrame frame, Object object, TruffleString key, Object value, WriteAttributeToObjectNode writeNode,
846-
@SuppressWarnings("unused") @Shared @Cached CastToTruffleStringNode castKeyToStringNode,
847-
@Shared @Cached GetClassNode getClassNode,
848-
@Shared @Cached InlinedConditionProfile hasDescriptor,
849-
@Shared @Cached GetObjectSlotsNode getDescrSlotsNode,
850-
@Shared @Cached CallSlotDescrSet callSetNode,
851-
@Shared @Cached(inline = false) LookupAttributeInMRONode.Dynamic getExisting,
852-
@Shared @Cached(inline = false) ReadAttributeFromObjectNode attrRead,
853-
@Shared @Cached InlinedBranchProfile deleteNonExistingBranchProfile,
854-
@Shared @Cached PRaiseNode raiseNode) {
855-
setAttr(inliningTarget, frame, object, key, value, writeNode, getClassNode, hasDescriptor,
856-
getDescrSlotsNode, callSetNode, getExisting, attrRead, deleteNonExistingBranchProfile,
857-
raiseNode);
858-
}
859-
860840
@Specialization
861-
@InliningCutoff
862-
static void doGeneric(Node inliningTarget, VirtualFrame frame, Object object, Object keyObject, Object value, WriteAttributeToObjectNode writeNode,
863-
@Shared @Cached CastToTruffleStringNode castKeyToStringNode,
864-
@Shared @Cached GetClassNode getClassNode,
865-
@Shared @Cached InlinedConditionProfile hasDescriptor,
866-
@Shared @Cached GetObjectSlotsNode getDescrSlotsNode,
867-
@Shared @Cached CallSlotDescrSet callSetNode,
868-
@Shared @Cached(inline = false) LookupAttributeInMRONode.Dynamic getExisting,
869-
@Shared @Cached(inline = false) ReadAttributeFromObjectNode attrRead,
870-
@Shared @Cached InlinedBranchProfile deleteNonExistingBranchProfile,
871-
@Shared @Cached PRaiseNode raiseNode) {
872-
TruffleString key = castAttributeKey(inliningTarget, keyObject, castKeyToStringNode, raiseNode);
873-
setAttr(inliningTarget, frame, object, key, value, writeNode, getClassNode, hasDescriptor,
874-
getDescrSlotsNode, callSetNode, getExisting, attrRead, deleteNonExistingBranchProfile,
875-
raiseNode);
876-
}
877-
878-
public static TruffleString castAttributeKey(Node inliningTarget, Object keyObject, CastToTruffleStringNode castKeyToStringNode, PRaiseNode raiseNode) {
879-
try {
880-
return castKeyToStringNode.execute(inliningTarget, keyObject);
881-
} catch (CannotCastException e) {
882-
throw raiseNode.raise(inliningTarget, PythonBuiltinClassType.TypeError, ATTR_NAME_MUST_BE_STRING, keyObject);
883-
}
884-
}
885-
886-
private static void setAttr(Node inliningTarget, VirtualFrame frame, Object object, TruffleString key,
887-
Object value, WriteAttributeToObjectNode writeNode, GetClassNode getClassNode,
888-
InlinedConditionProfile hasDescriptor, GetObjectSlotsNode getDescrSlotsNode,
889-
CallSlotDescrSet callSetNode, LookupAttributeInMRONode.Dynamic getExisting,
890-
ReadAttributeFromObjectNode attrRead, InlinedBranchProfile deleteNonExistingBranchProfile,
891-
PRaiseNode raiseNode) {
841+
static void doGeneric(Node inliningTarget, VirtualFrame frame, Object object, TruffleString key, Object value, WriteAttributeToObjectNode writeNode,
842+
@Cached GetClassNode getClassNode,
843+
@Cached InlinedConditionProfile hasDescriptor,
844+
@Cached GetObjectSlotsNode getDescrSlotsNode,
845+
@Cached CallSlotDescrSet callSetNode,
846+
@Cached(inline = false) LookupAttributeInMRONode.Dynamic getExisting,
847+
@Cached ReadAttributeFromObjectNode attrRead,
848+
@Cached InlinedBranchProfile deleteNonExistingBranchProfile,
849+
@Cached PRaiseNode raiseNode) {
892850
Object type = getClassNode.execute(inliningTarget, object);
893851
Object descr = getExisting.execute(type, key);
894852
if (hasDescriptor.profile(inliningTarget, !PGuards.isNoValue(descr))) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/StringNodes.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
import com.oracle.graal.python.builtins.objects.common.SequenceNodes;
6262
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
6363
import com.oracle.graal.python.builtins.objects.ints.PInt;
64+
import com.oracle.graal.python.builtins.objects.str.StringNodesFactory.CastToTruffleStringChecked0NodeGen;
6465
import com.oracle.graal.python.builtins.objects.str.StringNodesFactory.IsInternedStringNodeGen;
6566
import com.oracle.graal.python.builtins.objects.str.StringNodesFactory.StringMaterializeNodeGen;
6667
import com.oracle.graal.python.lib.IteratorExhausted;
@@ -247,6 +248,10 @@ static String doConvert(Node inliningTarget, Object self, TruffleString errMsgFo
247248
@GenerateInline
248249
@GenerateCached(false)
249250
public abstract static class CastToTruffleStringChecked0Node extends PNodeWithContext {
251+
public static CastToTruffleStringChecked0Node getUncached() {
252+
return CastToTruffleStringChecked0NodeGen.getUncached();
253+
}
254+
250255
public final TruffleString cast(Node inliningTarget, Object object, TruffleString errMsg) {
251256
return execute(inliningTarget, object, errMsg);
252257
}

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

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

43+
import static com.oracle.graal.python.nodes.ErrorMessages.ATTR_NAME_MUST_BE_STRING;
4344
import static com.oracle.graal.python.nodes.SpecialAttributeNames.J___DICT__;
4445

4546
import java.util.List;
@@ -57,8 +58,8 @@
5758
import com.oracle.graal.python.builtins.objects.dict.PDict;
5859
import com.oracle.graal.python.builtins.objects.function.PKeyword;
5960
import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins;
60-
import com.oracle.graal.python.builtins.objects.object.ObjectNodes;
6161
import com.oracle.graal.python.builtins.objects.object.ObjectNodes.GenericSetAttrWithDictNode;
62+
import com.oracle.graal.python.builtins.objects.str.StringNodes.CastToTruffleStringChecked0Node;
6263
import com.oracle.graal.python.builtins.objects.str.StringNodes.CastToTruffleStringChecked1Node;
6364
import com.oracle.graal.python.builtins.objects.type.TpSlots;
6465
import com.oracle.graal.python.builtins.objects.type.TpSlots.GetObjectSlotsNode;
@@ -78,7 +79,6 @@
7879
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
7980
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
8081
import com.oracle.graal.python.nodes.object.GetClassNode;
81-
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
8282
import com.oracle.graal.python.runtime.object.PFactory;
8383
import com.oracle.truffle.api.CompilerDirectives;
8484
import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
@@ -210,27 +210,16 @@ private Object dispatchDescrGet(VirtualFrame frame, Object object, Object type,
210210
@Slot(value = SlotKind.tp_setattro, isComplex = true)
211211
@GenerateNodeFactory
212212
public abstract static class SetattrNode extends SetAttrBuiltinNode {
213-
@Specialization
214-
static void doStringKey(VirtualFrame frame, PThreadLocal object, TruffleString key, Object value,
215-
@Bind Node inliningTarget,
216-
@Exclusive @Cached ThreadLocalNodes.GetThreadLocalDict getThreadLocalDict,
217-
@Exclusive @Cached GenericSetAttrWithDictNode setAttrWithDictNode) {
218-
// Note: getting thread local dict has potential side-effects, don't move
219-
PDict localDict = getThreadLocalDict.execute(frame, object);
220-
setAttrWithDictNode.execute(inliningTarget, frame, object, key, value, localDict);
221-
}
222-
223213
@Specialization
224214
@InliningCutoff
225215
static void doGeneric(VirtualFrame frame, PThreadLocal object, Object keyObject, Object value,
226216
@Bind Node inliningTarget,
227217
@Exclusive @Cached ThreadLocalNodes.GetThreadLocalDict getThreadLocalDict,
228-
@Cached CastToTruffleStringNode castKeyToStringNode,
229-
@Exclusive @Cached PRaiseNode raiseNode,
218+
@Cached CastToTruffleStringChecked0Node castKeyNode,
230219
@Exclusive @Cached GenericSetAttrWithDictNode setAttrWithDictNode) {
231220
// Note: getting thread local dict has potential side-effects, don't move
232221
PDict localDict = getThreadLocalDict.execute(frame, object);
233-
TruffleString key = ObjectNodes.GenericSetAttrNode.castAttributeKey(inliningTarget, keyObject, castKeyToStringNode, raiseNode);
222+
TruffleString key = castKeyNode.cast(inliningTarget, keyObject, ATTR_NAME_MUST_BE_STRING);
234223
setAttrWithDictNode.execute(inliningTarget, frame, object, key, value, localDict);
235224
}
236225
}

0 commit comments

Comments
 (0)