Skip to content

Commit bde8465

Browse files
committed
move handling of native float subclasses in float constructor into the __float__ builtin
1 parent dcc3b60 commit bde8465

File tree

2 files changed

+20
-21
lines changed

2 files changed

+20
-21
lines changed

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

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,6 @@
6969
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
7070
import com.oracle.graal.python.builtins.objects.bytes.PIBytesLike;
7171
import com.oracle.graal.python.builtins.objects.cell.PCell;
72-
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.FromNativeSubclassNode;
73-
import com.oracle.graal.python.builtins.objects.cext.NativeCAPISymbols;
74-
import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass;
75-
import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject;
7672
import com.oracle.graal.python.builtins.objects.common.HashingStorage.DictEntry;
7773
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes;
7874
import com.oracle.graal.python.builtins.objects.complex.PComplex;
@@ -155,6 +151,7 @@
155151
import com.oracle.truffle.api.dsl.Specialization;
156152
import com.oracle.truffle.api.dsl.TypeSystemReference;
157153
import com.oracle.truffle.api.nodes.UnexpectedResultException;
154+
import com.oracle.truffle.api.profiles.BranchProfile;
158155
import com.oracle.truffle.api.profiles.ConditionProfile;
159156

160157
@CoreFunctions(defineModule = "builtins")
@@ -490,11 +487,13 @@ public Object floatFromNone(PythonClass cls, @SuppressWarnings("unused") PNone a
490487
}
491488

492489
@Specialization
493-
Object doPythonObject(PythonClass cls, PythonObject obj,
494-
@Cached("create(__FLOAT__)") LookupAndCallUnaryNode callFloatNode) {
490+
Object doPythonObject(PythonClass cls, Object obj,
491+
@Cached("create(__FLOAT__)") LookupAndCallUnaryNode callFloatNode,
492+
@Cached("create()") BranchProfile gotException) {
495493
try {
496494
return floatFromFloat(cls, callFloatNode.executeDouble(obj));
497495
} catch (UnexpectedResultException e) {
496+
gotException.enter();
498497
Object result = e.getResult();
499498
if (result == PNone.NO_VALUE) {
500499
throw raise(TypeError, "must be real number, not %p", obj);
@@ -507,21 +506,6 @@ Object doPythonObject(PythonClass cls, PythonObject obj,
507506
}
508507
}
509508

510-
protected static FromNativeSubclassNode cacheGetFloat() {
511-
return FromNativeSubclassNode.create(PythonBuiltinClassType.PFloat, NativeCAPISymbols.FUN_PY_FLOAT_AS_DOUBLE);
512-
}
513-
514-
@Specialization
515-
Object doNativeFloat(@SuppressWarnings("unused") PythonNativeClass cls, PythonNativeObject possibleBase,
516-
@Cached("cacheGetFloat()") FromNativeSubclassNode getFloat) {
517-
Object convertedFloat = getFloat.execute(possibleBase);
518-
if (convertedFloat instanceof Double) {
519-
return possibleBase; // TODO (tfel): we really need to call back into C
520-
} else {
521-
throw raise(TypeError, "must be real number, not %p", possibleBase);
522-
}
523-
}
524-
525509
@Fallback
526510
@TruffleBoundary
527511
public Object floatFromObject(@SuppressWarnings("unused") Object cls, Object arg) {

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,21 @@ abstract static class FloatNode extends PythonUnaryBuiltinNode {
177177
PFloat doPFloat(PFloat self) {
178178
return self;
179179
}
180+
181+
protected static FromNativeSubclassNode cacheGetFloat() {
182+
return FromNativeSubclassNode.create(PythonBuiltinClassType.PFloat, NativeCAPISymbols.FUN_PY_FLOAT_AS_DOUBLE);
183+
}
184+
185+
@Specialization
186+
Object doNativeFloat(PythonNativeObject possibleBase,
187+
@Cached("cacheGetFloat()") FromNativeSubclassNode getFloat) {
188+
Object convertedFloat = getFloat.execute(possibleBase);
189+
if (convertedFloat instanceof Double) {
190+
return possibleBase;
191+
} else {
192+
throw raise(PythonErrorType.TypeError, "must be real number, not %p", possibleBase);
193+
}
194+
}
180195
}
181196

182197
@Builtin(name = __ADD__, fixedNumOfArguments = 2)

0 commit comments

Comments
 (0)