Skip to content

Commit 1b0ce03

Browse files
committed
add a bit more native float subtype support
1 parent 72d723e commit 1b0ce03

File tree

5 files changed

+115
-29
lines changed

5 files changed

+115
-29
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/CExtNodes.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public Object execute(PythonNativeClass object, Object arg) {
108108
}
109109
}
110110

111-
public static class FromNativeSubclassNode extends PBaseNode {
111+
public static class FromNativeSubclassNode<T> extends PBaseNode {
112112
private final PythonBuiltinClassType expectedType;
113113
private final String conversionFuncName;
114114
@CompilationFinal private PythonBuiltinClass expectedClass;
@@ -155,19 +155,24 @@ private ToSulongNode getToSulongNode() {
155155
return toSulongNode;
156156
}
157157

158-
public Object execute(PythonNativeObject object) {
159-
if (isSubtype.execute(getClass.execute(object), getExpectedClass())) {
158+
@SuppressWarnings("unchecked")
159+
public T execute(PythonNativeObject object) {
160+
if (isSubtype(object)) {
160161
try {
161-
return ForeignAccess.sendExecute(getExecNode(), getConversionFunc(), getToSulongNode().execute(object));
162+
return (T) ForeignAccess.sendExecute(getExecNode(), getConversionFunc(), getToSulongNode().execute(object));
162163
} catch (UnsupportedMessageException | UnsupportedTypeException | ArityException e) {
163164
throw new IllegalStateException("C object conversion function failed", e);
164165
}
165166
}
166167
return null;
167168
}
168169

169-
public static FromNativeSubclassNode create(PythonBuiltinClassType expectedType, String conversionFuncName) {
170-
return new FromNativeSubclassNode(expectedType, conversionFuncName);
170+
public boolean isSubtype(PythonNativeObject object) {
171+
return isSubtype.execute(getClass.execute(object), getExpectedClass());
172+
}
173+
174+
public static <T> FromNativeSubclassNode<T> create(PythonBuiltinClassType expectedType, String conversionFuncName) {
175+
return new FromNativeSubclassNode<>(expectedType, conversionFuncName);
171176
}
172177
}
173178

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/floats/FloatBuiltins.java

Lines changed: 86 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,11 @@
6363

6464
import com.oracle.graal.python.builtins.Builtin;
6565
import com.oracle.graal.python.builtins.CoreFunctions;
66-
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
6766
import com.oracle.graal.python.builtins.PythonBuiltins;
6867
import com.oracle.graal.python.builtins.modules.MathGuards;
6968
import com.oracle.graal.python.builtins.objects.PNone;
7069
import com.oracle.graal.python.builtins.objects.PNotImplemented;
7170
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.FromNativeSubclassNode;
72-
import com.oracle.graal.python.builtins.objects.cext.NativeCAPISymbols;
7371
import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject;
7472
import com.oracle.graal.python.builtins.objects.ints.PInt;
7573
import com.oracle.graal.python.builtins.objects.type.PythonClass;
@@ -95,7 +93,6 @@
9593

9694
@CoreFunctions(extendClasses = PFloat.class)
9795
public final class FloatBuiltins extends PythonBuiltins {
98-
9996
@Override
10097
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
10198
return FloatBuiltinsFactory.getFactories();
@@ -177,19 +174,15 @@ PFloat doPFloat(PFloat self) {
177174
return self;
178175
}
179176

180-
protected static FromNativeSubclassNode cacheGetFloat() {
181-
return FromNativeSubclassNode.create(PythonBuiltinClassType.PFloat, NativeCAPISymbols.FUN_PY_FLOAT_AS_DOUBLE);
177+
@Specialization(guards = "getFloat.isSubtype(possibleBase)", limit = "1")
178+
PythonNativeObject doNativeFloat(PythonNativeObject possibleBase,
179+
@SuppressWarnings("unused") @Cached("nativeFloat()") FromNativeSubclassNode<Double> getFloat) {
180+
return possibleBase;
182181
}
183182

184-
@Specialization
185-
Object doNativeFloat(PythonNativeObject possibleBase,
186-
@Cached("cacheGetFloat()") FromNativeSubclassNode getFloat) {
187-
Object convertedFloat = getFloat.execute(possibleBase);
188-
if (convertedFloat instanceof Double) {
189-
return possibleBase;
190-
} else {
191-
throw raise(PythonErrorType.TypeError, "must be real number, not %p", possibleBase);
192-
}
183+
@Fallback
184+
Object doFallback(Object possibleBase) {
185+
throw raise(PythonErrorType.TypeError, "must be real number, not %p", possibleBase);
193186
}
194187
}
195188

@@ -295,16 +288,12 @@ abstract static class MulNode extends PythonBinaryBuiltinNode {
295288
return left * right.doubleValue();
296289
}
297290

298-
protected static FromNativeSubclassNode cacheGetFloat() {
299-
return FromNativeSubclassNode.create(PythonBuiltinClassType.PFloat, NativeCAPISymbols.FUN_PY_FLOAT_AS_DOUBLE);
300-
}
301-
302291
@Specialization
303292
Object doDP(PythonNativeObject left, double right,
304-
@Cached("cacheGetFloat()") FromNativeSubclassNode getFloat) {
305-
Object leftPrimitive = getFloat.execute(left);
306-
if (leftPrimitive != null && leftPrimitive instanceof Double) {
307-
return ((double) leftPrimitive) * right;
293+
@Cached("nativeFloat()") FromNativeSubclassNode<Double> getFloat) {
294+
Double leftPrimitive = getFloat.execute(left);
295+
if (leftPrimitive != null) {
296+
return leftPrimitive * right;
308297
} else {
309298
return PNotImplemented.NOT_IMPLEMENTED;
310299
}
@@ -811,6 +800,31 @@ boolean doDL(double x, long y) {
811800
return x < y;
812801
}
813802

803+
@Specialization(guards = "fromNativeNode.isSubtype(y)", limit = "1")
804+
boolean doDN(double x, PythonNativeObject y,
805+
@Cached("nativeFloat()") FromNativeSubclassNode<Double> fromNativeNode) {
806+
return x < fromNativeNode.execute(y);
807+
}
808+
809+
@Specialization(guards = {"nativeLeft.isSubtype(x)", "nativeRight.isSubtype(y)"}, limit = "1")
810+
boolean doDN(PythonNativeObject x, PythonNativeObject y,
811+
@Cached("nativeFloat()") FromNativeSubclassNode<Double> nativeLeft,
812+
@Cached("nativeFloat()") FromNativeSubclassNode<Double> nativeRight) {
813+
return nativeLeft.execute(x) < nativeRight.execute(y);
814+
}
815+
816+
@Specialization(guards = "fromNativeNode.isSubtype(x)", limit = "1")
817+
boolean doDN(PythonNativeObject x, double y,
818+
@Cached("nativeFloat()") FromNativeSubclassNode<Double> fromNativeNode) {
819+
return fromNativeNode.execute(x) < y;
820+
}
821+
822+
@Specialization(guards = "fromNativeNode.isSubtype(x)", limit = "1")
823+
boolean doDN(PythonNativeObject x, long y,
824+
@Cached("nativeFloat()") FromNativeSubclassNode<Double> fromNativeNode) {
825+
return fromNativeNode.execute(x) < y;
826+
}
827+
814828
@Fallback
815829
@SuppressWarnings("unused")
816830
PNotImplemented doGeneric(Object a, Object b) {
@@ -832,6 +846,31 @@ boolean doDL(double x, long y) {
832846
return x <= y;
833847
}
834848

849+
@Specialization(guards = "fromNativeNode.isSubtype(y)", limit = "1")
850+
boolean doDN(double x, PythonNativeObject y,
851+
@Cached("nativeFloat()") FromNativeSubclassNode<Double> fromNativeNode) {
852+
return x <= fromNativeNode.execute(y);
853+
}
854+
855+
@Specialization(guards = {"nativeLeft.isSubtype(x)", "nativeRight.isSubtype(y)"}, limit = "1")
856+
boolean doNN(PythonNativeObject x, PythonNativeObject y,
857+
@Cached("nativeFloat()") FromNativeSubclassNode<Double> nativeLeft,
858+
@Cached("nativeFloat()") FromNativeSubclassNode<Double> nativeRight) {
859+
return nativeLeft.execute(x) <= nativeRight.execute(y);
860+
}
861+
862+
@Specialization(guards = "fromNativeNode.isSubtype(x)", limit = "1")
863+
boolean doND(PythonNativeObject x, double y,
864+
@Cached("nativeFloat()") FromNativeSubclassNode<Double> fromNativeNode) {
865+
return fromNativeNode.execute(x) <= y;
866+
}
867+
868+
@Specialization(guards = "fromNativeNode.isSubtype(x)", limit = "1")
869+
boolean doNL(PythonNativeObject x, long y,
870+
@Cached("nativeFloat()") FromNativeSubclassNode<Double> fromNativeNode) {
871+
return fromNativeNode.execute(x) <= y;
872+
}
873+
835874
@Fallback
836875
@SuppressWarnings("unused")
837876
PNotImplemented doGeneric(Object a, Object b) {
@@ -853,6 +892,31 @@ boolean doDL(double x, long y) {
853892
return x > y;
854893
}
855894

895+
@Specialization(guards = "fromNativeNode.isSubtype(y)", limit = "1")
896+
boolean doDN(double x, PythonNativeObject y,
897+
@Cached("nativeFloat()") FromNativeSubclassNode<Double> fromNativeNode) {
898+
return x > fromNativeNode.execute(y);
899+
}
900+
901+
@Specialization(guards = {"nativeLeft.isSubtype(x)", "nativeRight.isSubtype(y)"}, limit = "1")
902+
boolean doNN(PythonNativeObject x, PythonNativeObject y,
903+
@Cached("nativeFloat()") FromNativeSubclassNode<Double> nativeLeft,
904+
@Cached("nativeFloat()") FromNativeSubclassNode<Double> nativeRight) {
905+
return nativeLeft.execute(x) > nativeRight.execute(y);
906+
}
907+
908+
@Specialization(guards = "fromNativeNode.isSubtype(x)", limit = "1")
909+
boolean doND(PythonNativeObject x, double y,
910+
@Cached("nativeFloat()") FromNativeSubclassNode<Double> fromNativeNode) {
911+
return fromNativeNode.execute(x) > y;
912+
}
913+
914+
@Specialization(guards = "fromNativeNode.isSubtype(x)", limit = "1")
915+
boolean doNL(PythonNativeObject x, long y,
916+
@Cached("nativeFloat()") FromNativeSubclassNode<Double> fromNativeNode) {
917+
return fromNativeNode.execute(x) > y;
918+
}
919+
856920
@Fallback
857921
@SuppressWarnings("unused")
858922
PNotImplemented doGeneric(Object a, Object b) {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.oracle.graal.python.nodes;
2+
3+
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
4+
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.FromNativeSubclassNode;
5+
import com.oracle.graal.python.builtins.objects.cext.NativeCAPISymbols;
6+
7+
public final class NativeConversions {
8+
public static FromNativeSubclassNode<Double> nativeFloat() {
9+
return FromNativeSubclassNode.create(PythonBuiltinClassType.PFloat, NativeCAPISymbols.FUN_PY_FLOAT_AS_DOUBLE);
10+
}
11+
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/PGuards.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import com.oracle.graal.python.builtins.objects.bytes.PByteArray;
4747
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
4848
import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass;
49+
import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject;
4950
import com.oracle.graal.python.builtins.objects.dict.PDict;
5051
import com.oracle.graal.python.builtins.objects.floats.PFloat;
5152
import com.oracle.graal.python.builtins.objects.function.PArguments;
@@ -279,6 +280,10 @@ public static boolean isPythonBuiltinClass(Object klass) {
279280
return klass instanceof PythonBuiltinClass;
280281
}
281282

283+
public static boolean isNativeObject(Object object) {
284+
return object instanceof PythonNativeObject;
285+
}
286+
282287
public static boolean isNativeClass(Object klass) {
283288
return klass instanceof PythonNativeClass;
284289
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/PythonBuiltinBaseNode.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
package com.oracle.graal.python.nodes.function;
4242

4343
import com.oracle.graal.python.nodes.BuiltinNames;
44+
import com.oracle.graal.python.nodes.NativeConversions;
4445
import com.oracle.graal.python.nodes.PBaseNode;
4546
import com.oracle.graal.python.nodes.PGuards;
4647
import com.oracle.graal.python.nodes.SpecialAttributeNames;
@@ -50,6 +51,6 @@
5051
import com.oracle.truffle.api.dsl.ReportPolymorphism;
5152

5253
@ReportPolymorphism
53-
@ImportStatic({PGuards.class, PythonOptions.class, SpecialMethodNames.class, SpecialAttributeNames.class, BuiltinNames.class})
54+
@ImportStatic({PGuards.class, PythonOptions.class, SpecialMethodNames.class, SpecialAttributeNames.class, BuiltinNames.class, NativeConversions.class})
5455
public abstract class PythonBuiltinBaseNode extends PBaseNode {
5556
}

0 commit comments

Comments
 (0)