Skip to content

Commit 3864ad0

Browse files
msimacektimfel
authored andcommitted
Move POL.asFileDescriptor to a node
1 parent e74eded commit 3864ad0

File tree

9 files changed

+118
-131
lines changed

9 files changed

+118
-131
lines changed

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

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
import com.oracle.graal.python.lib.PyLongAsLongAndOverflowNode;
8181
import com.oracle.graal.python.lib.PyLongAsLongNode;
8282
import com.oracle.graal.python.lib.PyNumberIndexNode;
83+
import com.oracle.graal.python.lib.PyObjectAsFileDescriptor;
8384
import com.oracle.graal.python.lib.PyObjectSizeNode;
8485
import com.oracle.graal.python.nodes.ErrorMessages;
8586
import com.oracle.graal.python.nodes.PGuards;
@@ -95,6 +96,7 @@
9596
import com.oracle.graal.python.nodes.function.builtins.PythonTernaryClinicBuiltinNode;
9697
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
9798
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryClinicBuiltinNode;
99+
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentCastNode;
98100
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentCastNode.ArgumentCastNodeWithRaise;
99101
import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider;
100102
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
@@ -2619,20 +2621,11 @@ public static OffsetConversionNode create() {
26192621
* Equivalent of CPython's {@code fildes_converter()}, which in turn delegates to
26202622
* {@code PyObject_AsFileDescriptor}. Always returns an {@code int}.
26212623
*/
2622-
public abstract static class FileDescriptorConversionNode extends ArgumentCastNodeWithRaise {
2624+
public abstract static class FileDescriptorConversionNode extends ArgumentCastNode {
26232625
@Specialization
2624-
int doFdInt(int value) {
2625-
return PInt.asFileDescriptor(value, getRaiseNode());
2626-
}
2627-
2628-
@Specialization(guards = "!isInt(value)", limit = "3")
26292626
static int doIndex(VirtualFrame frame, Object value,
2630-
@CachedLibrary("value") PythonObjectLibrary lib) {
2631-
return lib.asFileDescriptorWithState(value, PArguments.getThreadState(frame));
2632-
}
2633-
2634-
protected static boolean isInt(Object value) {
2635-
return value instanceof Integer;
2627+
@Cached PyObjectAsFileDescriptor asFileDescriptor) {
2628+
return asFileDescriptor.execute(frame, value);
26362629
}
26372630

26382631
@ClinicConverterFactory(shortCircuitPrimitive = PrimitiveType.Int)

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

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,9 @@
5151
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
5252
import com.oracle.graal.python.builtins.PythonBuiltins;
5353
import com.oracle.graal.python.builtins.objects.PNone;
54-
import com.oracle.graal.python.builtins.objects.function.PArguments;
5554
import com.oracle.graal.python.builtins.objects.list.PList;
56-
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
5755
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
56+
import com.oracle.graal.python.lib.PyObjectAsFileDescriptor;
5857
import com.oracle.graal.python.lib.PyObjectSizeNode;
5958
import com.oracle.graal.python.lib.PyTimeFromObjectNode;
6059
import com.oracle.graal.python.nodes.ErrorMessages;
@@ -108,11 +107,11 @@ PTuple doWithoutTimeout(VirtualFrame frame, Object rlist, Object wlist, Object x
108107
@Cached("createGetItem()") LookupAndCallBinaryNode callGetItemNode,
109108
@Cached FastConstructListNode constructListNode,
110109
@Cached PyTimeFromObjectNode pyTimeFromObjectNode,
111-
@CachedLibrary(limit = "3") PythonObjectLibrary itemLib,
110+
@Cached PyObjectAsFileDescriptor asFileDescriptor,
112111
@Cached BranchProfile notSelectableBranch,
113112
@Cached GilNode gil) {
114113
return doGeneric(frame, rlist, wlist, xlist, PNone.NONE, posixLib, sizeNode,
115-
callGetItemNode, constructListNode, pyTimeFromObjectNode, itemLib, notSelectableBranch, gil);
114+
callGetItemNode, constructListNode, pyTimeFromObjectNode, asFileDescriptor, notSelectableBranch, gil);
116115
}
117116

118117
@Specialization(replaces = "doWithoutTimeout")
@@ -122,12 +121,12 @@ PTuple doGeneric(VirtualFrame frame, Object rlist, Object wlist, Object xlist, O
122121
@Cached("createGetItem()") LookupAndCallBinaryNode callGetItemNode,
123122
@Cached FastConstructListNode constructListNode,
124123
@Cached PyTimeFromObjectNode pyTimeFromObjectNode,
125-
@CachedLibrary(limit = "3") PythonObjectLibrary itemLib,
124+
@Cached PyObjectAsFileDescriptor asFileDescriptor,
126125
@Cached BranchProfile notSelectableBranch,
127126
@Cached GilNode gil) {
128-
ObjAndFDList readFDs = seq2set(frame, rlist, sizeNode, itemLib, callGetItemNode, constructListNode);
129-
ObjAndFDList writeFDs = seq2set(frame, wlist, sizeNode, itemLib, callGetItemNode, constructListNode);
130-
ObjAndFDList xFDs = seq2set(frame, xlist, sizeNode, itemLib, callGetItemNode, constructListNode);
127+
ObjAndFDList readFDs = seq2set(frame, rlist, sizeNode, asFileDescriptor, callGetItemNode, constructListNode);
128+
ObjAndFDList writeFDs = seq2set(frame, wlist, sizeNode, asFileDescriptor, callGetItemNode, constructListNode);
129+
ObjAndFDList xFDs = seq2set(frame, xlist, sizeNode, asFileDescriptor, callGetItemNode, constructListNode);
131130

132131
Timeval timeoutval = null;
133132
if (!PGuards.isPNone(timeout)) {
@@ -173,9 +172,8 @@ private PList toList(boolean[] result, ObjAndFDList fds) {
173172
return factory().createList(PythonUtils.arrayCopyOf(resultObjs, resultObjsIdx));
174173
}
175174

176-
private ObjAndFDList seq2set(VirtualFrame frame, Object sequence, PyObjectSizeNode sizeNode, PythonObjectLibrary itemLib, LookupAndCallBinaryNode callGetItemNode,
175+
private ObjAndFDList seq2set(VirtualFrame frame, Object sequence, PyObjectSizeNode sizeNode, PyObjectAsFileDescriptor asFileDescriptor, LookupAndCallBinaryNode callGetItemNode,
177176
FastConstructListNode constructListNode) {
178-
PArguments.ThreadState threadState = PArguments.getThreadState(frame);
179177
// We cannot assume any size of those two arrays, because the sequence may change as a
180178
// side effect of the invocation of fileno. We also need to call PyObjectSizeNode
181179
// repeatedly in the loop condition
@@ -185,7 +183,7 @@ private ObjAndFDList seq2set(VirtualFrame frame, Object sequence, PyObjectSizeNo
185183
for (int i = 0; i < sizeNode.execute(frame, sequence); i++) {
186184
Object pythonObject = callGetItemNode.executeObject(frame, pSequence, i);
187185
objects.add(pythonObject);
188-
int fd = itemLib.asFileDescriptorWithState(pythonObject, threadState);
186+
int fd = asFileDescriptor.execute(frame, pythonObject);
189187
if (fd >= FD_SETSIZE.value) {
190188
throw raise(ValueError, ErrorMessages.FILE_DESCRIPTOR_OUT_OF_RANGE_IN_SELECT);
191189
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/PythonAbstractObject.java

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242

4343
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.AttributeError;
4444
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
45-
import static com.oracle.graal.python.nodes.SpecialMethodNames.FILENO;
4645
import static com.oracle.graal.python.nodes.SpecialMethodNames.KEYS;
4746
import static com.oracle.graal.python.nodes.SpecialMethodNames.__DELETE__;
4847
import static com.oracle.graal.python.nodes.SpecialMethodNames.__DELITEM__;
@@ -79,7 +78,6 @@
7978
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
8079
import com.oracle.graal.python.builtins.objects.function.PFunction;
8180
import com.oracle.graal.python.builtins.objects.function.PKeyword;
82-
import com.oracle.graal.python.builtins.objects.ints.PInt;
8381
import com.oracle.graal.python.builtins.objects.iterator.IteratorNodes;
8482
import com.oracle.graal.python.builtins.objects.list.PList;
8583
import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
@@ -97,7 +95,6 @@
9795
import com.oracle.graal.python.builtins.objects.type.SpecialMethodSlot;
9896
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
9997
import com.oracle.graal.python.builtins.objects.type.TypeNodes.GetMroNode;
100-
import com.oracle.graal.python.lib.PyLongCheckExactNode;
10198
import com.oracle.graal.python.lib.PyMappingCheckNode;
10299
import com.oracle.graal.python.lib.PyObjectIsTrueNode;
103100
import com.oracle.graal.python.lib.PyObjectLookupAttr;
@@ -164,7 +161,6 @@
164161
import com.oracle.truffle.api.object.DynamicObjectLibrary;
165162
import com.oracle.truffle.api.object.HiddenKey;
166163
import com.oracle.truffle.api.object.Shape;
167-
import com.oracle.truffle.api.profiles.BranchProfile;
168164
import com.oracle.truffle.api.profiles.ConditionProfile;
169165
import com.oracle.truffle.api.profiles.ValueProfile;
170166
import com.oracle.truffle.api.utilities.TriState;
@@ -698,34 +694,6 @@ public String asPathWithState(ThreadState state,
698694
}
699695
}
700696

701-
@ExportMessage
702-
public int asFileDescriptorWithState(ThreadState state,
703-
@CachedLibrary("this") PythonObjectLibrary lib,
704-
@Shared("methodLib") @CachedLibrary(limit = "2") PythonObjectLibrary methodLib,
705-
@Shared("raise") @Cached PRaiseNode raiseNode,
706-
@Exclusive @Cached BranchProfile noFilenoMethodProfile,
707-
@Exclusive @Cached PyLongCheckExactNode isInt,
708-
@Exclusive @Cached CastToJavaIntExactNode castToJavaIntNode,
709-
@Exclusive @Cached IsBuiltinClassProfile isAttrError) {
710-
Object filenoFunc = lib.lookupAttributeWithState(this, state, FILENO);
711-
if (filenoFunc == PNone.NO_VALUE) {
712-
noFilenoMethodProfile.enter();
713-
throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.ARG_MUST_BE_INT_OR_HAVE_FILENO_METHOD);
714-
}
715-
716-
Object result = methodLib.callObjectWithState(filenoFunc, state);
717-
if (isInt.execute(result)) {
718-
try {
719-
return PInt.asFileDescriptor(castToJavaIntNode.execute(result), raiseNode);
720-
} catch (PException e) {
721-
e.expect(PythonBuiltinClassType.TypeError, isAttrError);
722-
throw raiseNode.raise(PythonBuiltinClassType.OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "int");
723-
}
724-
} else {
725-
throw raiseNode.raise(PythonBuiltinClassType.TypeError, ErrorMessages.RETURNED_NON_INTEGER, "fileno()");
726-
}
727-
}
728-
729697
@ExportMessage
730698
public Object lookupAttributeInternal(ThreadState state, String name, boolean strict,
731699
@Shared("gotState") @Cached ConditionProfile gotState,

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/PInt.java

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -29,23 +29,17 @@
2929

3030
import java.math.BigInteger;
3131

32-
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
3332
import com.oracle.graal.python.builtins.modules.SysModuleBuiltins;
3433
import com.oracle.graal.python.builtins.objects.cext.capi.PythonNativeWrapperLibrary;
35-
import com.oracle.graal.python.builtins.objects.function.PArguments.ThreadState;
3634
import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject;
37-
import com.oracle.graal.python.builtins.objects.object.PythonObjectLibrary;
3835
import com.oracle.graal.python.nodes.ErrorMessages;
3936
import com.oracle.graal.python.nodes.PRaiseNode;
40-
import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode;
4137
import com.oracle.graal.python.runtime.PythonContext;
42-
import com.oracle.graal.python.runtime.exception.PException;
4338
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
4439
import com.oracle.graal.python.util.OverflowException;
4540
import com.oracle.truffle.api.CompilerDirectives;
4641
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
4742
import com.oracle.truffle.api.dsl.Cached;
48-
import com.oracle.truffle.api.dsl.Cached.Exclusive;
4943
import com.oracle.truffle.api.dsl.Cached.Shared;
5044
import com.oracle.truffle.api.interop.InteropLibrary;
5145
import com.oracle.truffle.api.interop.UnsupportedMessageException;
@@ -57,7 +51,6 @@
5751
import com.oracle.truffle.api.profiles.ConditionProfile;
5852

5953
@ExportLibrary(InteropLibrary.class)
60-
@ExportLibrary(PythonObjectLibrary.class)
6154
public final class PInt extends PythonBuiltinObject {
6255

6356
public static final BigInteger MAX_INT = BigInteger.valueOf(Integer.MAX_VALUE);
@@ -284,27 +277,6 @@ boolean fitsInDouble(
284277
}
285278
}
286279

287-
@ExportMessage
288-
public int asFileDescriptorWithState(@SuppressWarnings("unused") ThreadState state,
289-
@Exclusive @Cached PRaiseNode raiseNode,
290-
@Exclusive @Cached CastToJavaIntExactNode castToJavaIntNode) {
291-
int result;
292-
try {
293-
result = castToJavaIntNode.execute(this);
294-
} catch (PException e) {
295-
throw raiseNode.raise(PythonBuiltinClassType.OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "int");
296-
}
297-
return asFileDescriptor(result, raiseNode);
298-
}
299-
300-
@Ignore
301-
public static int asFileDescriptor(int value, PRaiseNode raiseNode) {
302-
if (value < 0) {
303-
raiseNode.raise(PythonBuiltinClassType.ValueError, ErrorMessages.S_CANNOT_BE_NEGATIVE_INTEGER_D, "file descriptor", value);
304-
}
305-
return value;
306-
}
307-
308280
@Override
309281
public int hashCode() {
310282
return value.hashCode();

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -207,11 +207,6 @@ static boolean bO(Boolean receiver, Object other, PythonObjectLibrary oLib, Thre
207207
}
208208
}
209209

210-
@ExportMessage
211-
static int asFileDescriptorWithState(Boolean x, @SuppressWarnings("unused") ThreadState threadState) {
212-
return x ? 1 : 0;
213-
}
214-
215210
@ExportMessage
216211
static Object lookupAttributeInternal(Boolean receiver, ThreadState state, String name, boolean strict,
217212
@Cached ConditionProfile gotState,

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

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
import com.oracle.graal.python.builtins.objects.ints.PInt;
4949
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
5050
import com.oracle.graal.python.lib.PyLongCheckExactNode;
51-
import com.oracle.graal.python.nodes.PRaiseNode;
5251
import com.oracle.graal.python.nodes.classes.IsSubtypeNode;
5352
import com.oracle.graal.python.nodes.object.GetClassNode;
5453
import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
@@ -241,12 +240,6 @@ static boolean iO(Integer receiver, Object other, PythonObjectLibrary oLib, Thre
241240
}
242241
}
243242

244-
@ExportMessage
245-
static int asFileDescriptorWithState(Integer x, @SuppressWarnings("unused") ThreadState state,
246-
@Cached PRaiseNode raiseNode) {
247-
return PInt.asFileDescriptor(x, raiseNode);
248-
}
249-
250243
@ExportMessage
251244
static Object lookupAttributeInternal(Integer receiver, ThreadState state, String name, boolean strict,
252245
@Cached ConditionProfile gotState,

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

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,11 @@
4848
import com.oracle.graal.python.builtins.objects.ints.PInt;
4949
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
5050
import com.oracle.graal.python.lib.PyLongCheckExactNode;
51-
import com.oracle.graal.python.nodes.ErrorMessages;
52-
import com.oracle.graal.python.nodes.PRaiseNode;
5351
import com.oracle.graal.python.nodes.classes.IsSubtypeNode;
5452
import com.oracle.graal.python.nodes.object.GetClassNode;
5553
import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
56-
import com.oracle.graal.python.nodes.util.CastToJavaIntExactNode;
5754
import com.oracle.graal.python.runtime.GilNode;
5855
import com.oracle.graal.python.runtime.PythonOptions;
59-
import com.oracle.graal.python.runtime.exception.PException;
6056
import com.oracle.graal.python.util.OverflowException;
6157
import com.oracle.truffle.api.dsl.Cached;
6258
import com.oracle.truffle.api.dsl.Cached.Exclusive;
@@ -244,20 +240,6 @@ static boolean lO(Long receiver, Object other, PythonObjectLibrary oLib, ThreadS
244240
}
245241
}
246242

247-
@ExportMessage
248-
static int asFileDescriptorWithState(Long x, @SuppressWarnings("unused") ThreadState state,
249-
@Exclusive @Cached PRaiseNode raiseNode,
250-
@Exclusive @Cached CastToJavaIntExactNode castToJavaIntNode,
251-
@Exclusive @Cached IsBuiltinClassProfile errorProfile) {
252-
try {
253-
return PInt.asFileDescriptor(castToJavaIntNode.execute(x), raiseNode);
254-
} catch (PException e) {
255-
e.expect(PythonBuiltinClassType.TypeError, errorProfile);
256-
// we need to convert the TypeError to an OverflowError
257-
throw raiseNode.raise(PythonBuiltinClassType.OverflowError, ErrorMessages.PYTHON_INT_TOO_LARGE_TO_CONV_TO, "int");
258-
}
259-
}
260-
261243
@ExportMessage
262244
public static Object lookupAttributeInternal(Long receiver, ThreadState state, String name, boolean strict,
263245
@Cached ConditionProfile gotState,

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

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -426,24 +426,6 @@ public final String asPath(Object receiver) {
426426
return asPathWithState(receiver, null);
427427
}
428428

429-
/**
430-
* Coerces a given primitive or object to a file descriptor (i.e. Java {@code int}) just like
431-
* {@code PyObject_AsFileDescriptor} does.
432-
*
433-
* Converted to int if possible, or if the object defines __fileno__(), then return the result
434-
* of that method. Raise TypeError otherwise.
435-
*/
436-
public int asFileDescriptorWithState(Object receiver, @SuppressWarnings("unused") ThreadState threadState) {
437-
throw getDefaultNodes().getRaiseNode().raise(PythonBuiltinClassType.TypeError, ErrorMessages.ARG_MUST_BE_INT_OR_HAVE_FILENO_METHOD);
438-
}
439-
440-
/**
441-
* @see #asFileDescriptorWithState
442-
*/
443-
public final int asFileDescriptor(Object receiver) {
444-
return asFileDescriptorWithState(receiver, null);
445-
}
446-
447429
/**
448430
* Looks up an attribute for the given receiver like {@code PyObject_LookupAttr}.
449431
*

0 commit comments

Comments
 (0)