Skip to content

Commit ab0832d

Browse files
committed
Fix recursion in PE in object.__dir__ and type.__dir__
1 parent 56ea39a commit ab0832d

File tree

3 files changed

+37
-23
lines changed

3 files changed

+37
-23
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/common/SequenceStorageNodes.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.SetItemDynamicNodeGen;
7171
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.SetItemNodeGen;
7272
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.StorageToNativeNodeGen;
73+
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.ToArrayNodeGen;
7374
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodesFactory.ToByteArrayNodeGen;
7475
import com.oracle.graal.python.builtins.objects.floats.PFloat;
7576
import com.oracle.graal.python.builtins.objects.ints.PInt;
@@ -3933,6 +3934,10 @@ protected static boolean isMroStorage(SequenceStorage storage) {
39333934
public abstract static class ToArrayNode extends Node {
39343935
public abstract Object[] execute(Node inliningTarget, SequenceStorage s);
39353936

3937+
public static Object[] executeUncached(SequenceStorage s) {
3938+
return ToArrayNodeGen.getUncached().execute(null, s);
3939+
}
3940+
39363941
@Specialization
39373942
static Object[] doObjectSequenceStorage(Node inliningTarget, ObjectSequenceStorage s,
39383943
@Cached InlinedConditionProfile profile) {

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

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SUBCLASSHOOK__;
4949
import static com.oracle.graal.python.nodes.SpecialMethodNames.T_JOIN;
5050
import static com.oracle.graal.python.nodes.SpecialMethodNames.T_SORT;
51-
import static com.oracle.graal.python.nodes.SpecialMethodNames.T_UPDATE;
5251
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___LEN__;
5352
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___REDUCE__;
5453
import static com.oracle.graal.python.nodes.StringLiterals.T_COMMA_SPACE;
@@ -89,6 +88,7 @@
8988
import com.oracle.graal.python.builtins.objects.object.ObjectBuiltinsFactory.DictNodeFactory;
9089
import com.oracle.graal.python.builtins.objects.object.ObjectBuiltinsFactory.GetAttributeNodeFactory;
9190
import com.oracle.graal.python.builtins.objects.set.PSet;
91+
import com.oracle.graal.python.builtins.objects.set.SetBuiltins;
9292
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
9393
import com.oracle.graal.python.builtins.objects.type.PythonManagedClass;
9494
import com.oracle.graal.python.builtins.objects.type.TpSlots;
@@ -141,6 +141,8 @@
141141
import com.oracle.graal.python.nodes.object.SetDictNode;
142142
import com.oracle.graal.python.nodes.util.CannotCastException;
143143
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
144+
import com.oracle.graal.python.runtime.ExecutionContext.IndirectCallContext;
145+
import com.oracle.graal.python.runtime.IndirectCallData;
144146
import com.oracle.graal.python.runtime.exception.PException;
145147
import com.oracle.graal.python.runtime.object.PFactory;
146148
import com.oracle.truffle.api.CompilerAsserts;
@@ -888,21 +890,25 @@ public abstract static class DirNode extends PythonBuiltinNode {
888890
@Specialization
889891
static Object dir(VirtualFrame frame, Object obj,
890892
@Bind("this") Node inliningTarget,
893+
@Cached("createFor(this)") IndirectCallData indirectCallData,
894+
@Cached SetBuiltins.UpdateSingleNode updateSetNode,
891895
@Cached PyObjectLookupAttr lookupAttrNode,
892-
@Cached CallNode callNode,
893896
@Cached GetClassNode getClassNode,
894897
@Cached IsSubtypeNode isSubtypeNode,
895-
@Cached com.oracle.graal.python.builtins.objects.type.TypeBuiltins.DirNode dirNode,
896898
@Bind PythonLanguage language) {
897899
PSet names = PFactory.createSet(language);
898-
Object updateCallable = lookupAttrNode.execute(frame, inliningTarget, names, T_UPDATE);
899900
Object ns = lookupAttrNode.execute(frame, inliningTarget, obj, T___DICT__);
900901
if (isSubtypeNode.execute(getClassNode.execute(inliningTarget, ns), PythonBuiltinClassType.PDict)) {
901-
callNode.execute(frame, updateCallable, ns);
902+
updateSetNode.execute(frame, names, ns);
902903
}
903904
Object klass = lookupAttrNode.execute(frame, inliningTarget, obj, T___CLASS__);
904905
if (klass != PNone.NO_VALUE) {
905-
callNode.execute(frame, updateCallable, dirNode.execute(frame, klass));
906+
Object state = IndirectCallContext.enter(frame, indirectCallData);
907+
try {
908+
com.oracle.graal.python.builtins.objects.type.TypeBuiltins.DirNode.dir(names, klass);
909+
} finally {
910+
IndirectCallContext.exit(frame, indirectCallData, state);
911+
}
906912
}
907913
return names;
908914
}

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

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@
6363
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SUBCLASSES__;
6464
import static com.oracle.graal.python.nodes.SpecialMethodNames.J___SUBCLASSHOOK__;
6565
import static com.oracle.graal.python.nodes.SpecialMethodNames.T_MRO;
66-
import static com.oracle.graal.python.nodes.SpecialMethodNames.T_UPDATE;
6766
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___MRO_ENTRIES__;
6867
import static com.oracle.graal.python.runtime.exception.PythonErrorType.AttributeError;
6968
import static com.oracle.graal.python.runtime.exception.PythonErrorType.NotImplementedError;
@@ -101,6 +100,7 @@
101100
import com.oracle.graal.python.builtins.objects.object.ObjectBuiltins;
102101
import com.oracle.graal.python.builtins.objects.object.ObjectNodes;
103102
import com.oracle.graal.python.builtins.objects.set.PSet;
103+
import com.oracle.graal.python.builtins.objects.set.SetBuiltins.UpdateSingleNode;
104104
import com.oracle.graal.python.builtins.objects.str.PString;
105105
import com.oracle.graal.python.builtins.objects.str.StringUtils.SimpleTruffleStringFormatNode;
106106
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
@@ -151,6 +151,8 @@
151151
import com.oracle.graal.python.nodes.object.GetDictIfExistsNode;
152152
import com.oracle.graal.python.nodes.util.CannotCastException;
153153
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
154+
import com.oracle.graal.python.runtime.ExecutionContext.IndirectCallContext;
155+
import com.oracle.graal.python.runtime.IndirectCallData;
154156
import com.oracle.graal.python.runtime.PythonContext;
155157
import com.oracle.graal.python.runtime.exception.PException;
156158
import com.oracle.graal.python.runtime.exception.PythonErrorType;
@@ -1205,32 +1207,33 @@ public abstract static class DirNode extends PythonUnaryBuiltinNode {
12051207
@Specialization
12061208
static PSet dir(VirtualFrame frame, Object klass,
12071209
@Bind("this") Node inliningTarget,
1208-
@Cached PyObjectLookupAttr lookupAttrNode,
1209-
@Cached com.oracle.graal.python.nodes.call.CallNode callNode,
1210-
@Cached ToArrayNode toArrayNode,
1211-
@Cached("createGetAttrNode()") GetFixedAttributeNode getBasesNode) {
1212-
return dir(frame, inliningTarget, klass, lookupAttrNode, callNode, getBasesNode, toArrayNode);
1210+
@Cached("createFor(this)") IndirectCallData indirectCallData) {
1211+
PSet names = PFactory.createSet(PythonLanguage.get(inliningTarget));
1212+
Object state = IndirectCallContext.enter(frame, indirectCallData);
1213+
try {
1214+
dir(names, klass);
1215+
} finally {
1216+
IndirectCallContext.exit(frame, indirectCallData, state);
1217+
}
1218+
return names;
12131219
}
12141220

1215-
private static PSet dir(VirtualFrame frame, Node inliningTarget, Object klass, PyObjectLookupAttr lookupAttrNode, com.oracle.graal.python.nodes.call.CallNode callNode,
1216-
GetFixedAttributeNode getBasesNode, ToArrayNode toArrayNode) {
1217-
PSet names = PFactory.createSet(PythonLanguage.get(inliningTarget));
1218-
Object updateCallable = lookupAttrNode.execute(frame, inliningTarget, names, T_UPDATE);
1219-
Object ns = lookupAttrNode.execute(frame, inliningTarget, klass, T___DICT__);
1221+
@TruffleBoundary
1222+
public static void dir(PSet names, Object klass) {
1223+
Object ns = PyObjectLookupAttr.executeUncached(klass, T___DICT__);
1224+
UpdateSingleNode updateSingleNode = UpdateSingleNode.getUncached();
12201225
if (ns != NO_VALUE) {
1221-
callNode.execute(frame, updateCallable, ns);
1226+
updateSingleNode.execute(null, names, ns);
12221227
}
1223-
Object basesAttr = getBasesNode.execute(frame, klass);
1228+
Object basesAttr = PyObjectLookupAttr.executeUncached(klass, T___BASES__);
12241229
if (basesAttr instanceof PTuple) {
1225-
Object[] bases = toArrayNode.execute(inliningTarget, ((PTuple) basesAttr).getSequenceStorage());
1230+
Object[] bases = ToArrayNode.executeUncached(((PTuple) basesAttr).getSequenceStorage());
12261231
for (Object cls : bases) {
12271232
// Note that since we are only interested in the keys, the order
12281233
// we merge classes is unimportant
1229-
Object baseNames = dir(frame, inliningTarget, cls, lookupAttrNode, callNode, getBasesNode, toArrayNode);
1230-
callNode.execute(frame, updateCallable, baseNames);
1234+
dir(names, cls);
12311235
}
12321236
}
1233-
return names;
12341237
}
12351238

12361239
@NeverDefault

0 commit comments

Comments
 (0)