Skip to content

Commit 1e1c9fd

Browse files
committed
Don't try to cast native primitive subclasses
1 parent 3786d9b commit 1e1c9fd

File tree

3 files changed

+13
-32
lines changed

3 files changed

+13
-32
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyFloatAsDoubleNode.java

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
4848
import com.oracle.graal.python.builtins.modules.WarningsModuleBuiltins;
4949
import com.oracle.graal.python.builtins.objects.PNone;
50-
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
5150
import com.oracle.graal.python.builtins.objects.floats.PFloat;
5251
import com.oracle.graal.python.nodes.ErrorMessages;
5352
import com.oracle.graal.python.nodes.PGuards;
@@ -59,7 +58,6 @@
5958
import com.oracle.graal.python.nodes.object.GetClassNode;
6059
import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
6160
import com.oracle.graal.python.nodes.util.CastToJavaDoubleNode;
62-
import com.oracle.truffle.api.dsl.Bind;
6361
import com.oracle.truffle.api.dsl.Cached;
6462
import com.oracle.truffle.api.dsl.GenerateUncached;
6563
import com.oracle.truffle.api.dsl.ImportStatic;
@@ -103,11 +101,11 @@ public abstract class PyFloatAsDoubleNode extends PNodeWithContext {
103101
return object ? 1.0 : 0.0;
104102
}
105103

106-
@Specialization(guards = {"!isDouble(object)", "!isInteger(object)", "!isBoolean(object)", "!isPFloat(object)", "!isNativeObject(object) || !isSubtypeNode.execute(type, PFloat)"}, limit = "1")
104+
// TODO When we implement casting native floats, this should cast them directly instead of
105+
// calling their __float__
106+
@Specialization(guards = {"!isDouble(object)", "!isInteger(object)", "!isBoolean(object)", "!isPFloat(object)"})
107107
double doObject(VirtualFrame frame, Object object,
108-
@SuppressWarnings("unused") @Cached GetClassNode getClassNode,
109-
@SuppressWarnings("unused") @Cached IsSubtypeNode isSubtypeNode,
110-
@Bind("getClassNode.execute(object)") Object type,
108+
@Cached GetClassNode getClassNode,
111109
@Cached LookupSpecialMethodNode.Dynamic lookup,
112110
@Cached CallUnaryMethodNode call,
113111
@Cached GetClassNode resultClassNode,
@@ -118,6 +116,7 @@ public abstract class PyFloatAsDoubleNode extends PNodeWithContext {
118116
@Cached CastToJavaDoubleNode cast,
119117
@Cached WarningsModuleBuiltins.WarnNode warnNode,
120118
@Cached PRaiseNode raiseNode) {
119+
Object type = getClassNode.execute(object);
121120
Object floatDescr = lookup.execute(frame, type, __FLOAT__, object, false);
122121
if (floatDescr != PNone.NO_VALUE) {
123122
Object result = call.executeObject(frame, floatDescr, object);
@@ -139,14 +138,6 @@ public abstract class PyFloatAsDoubleNode extends PNodeWithContext {
139138
throw raiseNode.raise(TypeError, ErrorMessages.MUST_BE_REAL_NUMBER, object);
140139
}
141140

142-
@Specialization(guards = "isSubtypeNode.execute(getClassNode.execute(object), PFloat)", limit = "1")
143-
double doNativeObject(@SuppressWarnings("unused") PythonAbstractNativeObject object,
144-
@SuppressWarnings("unused") @Cached GetClassNode getClassNode,
145-
@SuppressWarnings("unused") @Cached IsSubtypeNode isSubtypeNode,
146-
@Cached CastToJavaDoubleNode cast) {
147-
return cast.execute(object);
148-
}
149-
150141
public static PyFloatAsDoubleNode create() {
151142
return PyFloatAsDoubleNodeGen.create();
152143
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongAsLongAndOverflowNode.java

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
4949
import com.oracle.graal.python.builtins.modules.WarningsModuleBuiltins;
5050
import com.oracle.graal.python.builtins.objects.PNone;
51-
import com.oracle.graal.python.builtins.objects.cext.PythonAbstractNativeObject;
5251
import com.oracle.graal.python.builtins.objects.ints.PInt;
5352
import com.oracle.graal.python.nodes.ErrorMessages;
5453
import com.oracle.graal.python.nodes.PGuards;
@@ -60,8 +59,6 @@
6059
import com.oracle.graal.python.nodes.object.GetClassNode;
6160
import com.oracle.graal.python.nodes.object.IsBuiltinClassProfile;
6261
import com.oracle.graal.python.util.OverflowException;
63-
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
64-
import com.oracle.truffle.api.dsl.Bind;
6562
import com.oracle.truffle.api.dsl.Cached;
6663
import com.oracle.truffle.api.dsl.GenerateUncached;
6764
import com.oracle.truffle.api.dsl.ImportStatic;
@@ -100,11 +97,11 @@ static long doBoolean(boolean x) {
10097
return x ? 1 : 0;
10198
}
10299

103-
@Specialization(guards = {"!canBeInteger(object)", "!isNativeObject(object) || !isSubtypeNode.execute(type, PInt)"}, limit = "1")
100+
// TODO When we implement casting native longs, this should cast them instead of calling their
101+
// __index__
102+
@Specialization(guards = "!canBeInteger(object)")
104103
long doObject(VirtualFrame frame, Object object,
105-
@SuppressWarnings("unused") @Cached GetClassNode getClassNode,
106-
@SuppressWarnings("unused") @Cached IsSubtypeNode isSubtypeNode,
107-
@Bind("getClassNode.execute(object)") Object type,
104+
@Cached GetClassNode getClassNode,
108105
@Cached GetClassNode resultClassNode,
109106
@Cached LookupSpecialMethodNode.Dynamic lookupIndex,
110107
@Cached LookupSpecialMethodNode.Dynamic lookupInt,
@@ -114,6 +111,7 @@ long doObject(VirtualFrame frame, Object object,
114111
@Cached WarningsModuleBuiltins.WarnNode warnNode,
115112
@Cached PRaiseNode raiseNode,
116113
@Cached PyLongAsLongAndOverflowNode recursive) throws OverflowException {
114+
Object type = getClassNode.execute(object);
117115
Object indexDescr = lookupIndex.execute(frame, type, __INDEX__, object, false);
118116
Object result = null;
119117
if (indexDescr != PNone.NO_VALUE) {
@@ -133,14 +131,6 @@ long doObject(VirtualFrame frame, Object object,
133131
return recursive.execute(frame, result);
134132
}
135133

136-
@Specialization(guards = "isSubtypeNode.execute(getClassNode.execute(object), PInt)", limit = "1")
137-
@TruffleBoundary
138-
long doNativeObject(@SuppressWarnings("unused") PythonAbstractNativeObject object,
139-
@SuppressWarnings("unused") @Cached GetClassNode getClassNode,
140-
@SuppressWarnings("unused") @Cached IsSubtypeNode isSubtypeNode) {
141-
throw new RuntimeException("casting a native long object to a Java long is not implemented yet");
142-
}
143-
144134
private static void checkResult(VirtualFrame frame, Object originalObject, Object result, GetClassNode getClassNode, IsSubtypeNode isSubtype, IsBuiltinClassProfile isInt, PRaiseNode raiseNode,
145135
WarningsModuleBuiltins.WarnNode warnNode, String methodName) {
146136
if (!isInt.profileObject(result, PythonBuiltinClassType.PInt)) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyLongAsLongNode.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,9 @@
5656
import com.oracle.truffle.api.frame.VirtualFrame;
5757

5858
/**
59-
* Equivalent of CPython's {@code PyLong_AsLongAndOverflow}. Converts an object into a Java long
60-
* using it's {@code __index__} or (deprecated) {@code __int__} method. Raises {@code OverflowError}
61-
* on overflow.
59+
* Equivalent of CPython's {@code PyLong_AsLong}. Converts an object into a Java long using it's
60+
* {@code __index__} or (deprecated) {@code __int__} method. Raises {@code OverflowError} on
61+
* overflow.
6262
*/
6363
@GenerateUncached
6464
@ImportStatic({PGuards.class, PythonBuiltinClassType.class})

0 commit comments

Comments
 (0)