|
91 | 91 | import com.oracle.graal.python.builtins.objects.floats.FloatBuiltinsClinicProviders.FormatNodeClinicProviderGen; |
92 | 92 | import com.oracle.graal.python.builtins.objects.ints.PInt; |
93 | 93 | import com.oracle.graal.python.builtins.objects.tuple.PTuple; |
94 | | -import com.oracle.graal.python.lib.CanBeDoubleNode; |
95 | | -import com.oracle.graal.python.lib.PyFloatAsDoubleNode; |
96 | 94 | import com.oracle.graal.python.lib.PyObjectHashNode; |
97 | 95 | import com.oracle.graal.python.nodes.ErrorMessages; |
98 | 96 | import com.oracle.graal.python.nodes.call.special.LookupAndCallTernaryNode; |
|
108 | 106 | import com.oracle.graal.python.nodes.object.GetClassNode; |
109 | 107 | import com.oracle.graal.python.nodes.object.InlinedGetClassNode.GetPythonObjectClassNode; |
110 | 108 | import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes; |
| 109 | +import com.oracle.graal.python.nodes.util.CannotCastException; |
| 110 | +import com.oracle.graal.python.nodes.util.CastToJavaDoubleNode; |
111 | 111 | import com.oracle.graal.python.runtime.exception.PythonErrorType; |
112 | 112 | import com.oracle.graal.python.runtime.formatting.FloatFormatter; |
113 | 113 | import com.oracle.graal.python.runtime.formatting.InternalFormat; |
@@ -290,6 +290,16 @@ static boolean isFloatSubtype(Node inliningTarget, PythonAbstractNativeObject ob |
290 | 290 | } |
291 | 291 | } |
292 | 292 |
|
| 293 | + static Object convertToDouble(Object obj, |
| 294 | + CastToJavaDoubleNode asDoubleNode) { |
| 295 | + try { |
| 296 | + return asDoubleNode.execute(obj); |
| 297 | + } catch (CannotCastException e) { |
| 298 | + // This can only happen to values that are expected to be long. |
| 299 | + return PNotImplemented.NOT_IMPLEMENTED; |
| 300 | + } |
| 301 | + } |
| 302 | + |
293 | 303 | @Builtin(name = J___RADD__, minNumOfPositionalArgs = 2) |
294 | 304 | @Builtin(name = J___ADD__, minNumOfPositionalArgs = 2) |
295 | 305 | @TypeSystemReference(PythonArithmeticTypes.class) |
@@ -337,10 +347,23 @@ static Object doDP(VirtualFrame frame, PythonAbstractNativeObject left, double r |
337 | 347 | } |
338 | 348 | } |
339 | 349 |
|
340 | | - @SuppressWarnings("unused") |
341 | 350 | @Fallback |
342 | | - static PNotImplemented doGeneric(Object left, Object right) { |
343 | | - return PNotImplemented.NOT_IMPLEMENTED; |
| 351 | + Object doGeneric(Object left, Object right, |
| 352 | + @Cached CastToJavaDoubleNode castToJavaDoubleNode) { |
| 353 | + |
| 354 | + Object objLeft = convertToDouble(left, castToJavaDoubleNode); |
| 355 | + if (objLeft == PNotImplemented.NOT_IMPLEMENTED) { |
| 356 | + return PNotImplemented.NOT_IMPLEMENTED; |
| 357 | + } |
| 358 | + |
| 359 | + Object objRight = convertToDouble(right, castToJavaDoubleNode); |
| 360 | + if (objRight == PNotImplemented.NOT_IMPLEMENTED) { |
| 361 | + return PNotImplemented.NOT_IMPLEMENTED; |
| 362 | + } |
| 363 | + |
| 364 | + double leftDouble = (double) objLeft; |
| 365 | + double rightDouble = (double) objRight; |
| 366 | + return leftDouble + rightDouble; |
344 | 367 | } |
345 | 368 | } |
346 | 369 |
|
@@ -374,10 +397,23 @@ static double doLD(long left, double right) { |
374 | 397 | return left.doubleValueWithOverflow(getRaiseNode()) - right; |
375 | 398 | } |
376 | 399 |
|
377 | | - @SuppressWarnings("unused") |
378 | 400 | @Fallback |
379 | | - static PNotImplemented doGeneric(Object left, Object right) { |
380 | | - return PNotImplemented.NOT_IMPLEMENTED; |
| 401 | + Object doGeneric(Object left, Object right, |
| 402 | + @Cached CastToJavaDoubleNode castToJavaDoubleNode) { |
| 403 | + |
| 404 | + Object objLeft = convertToDouble(left, castToJavaDoubleNode); |
| 405 | + if (objLeft == PNotImplemented.NOT_IMPLEMENTED) { |
| 406 | + return PNotImplemented.NOT_IMPLEMENTED; |
| 407 | + } |
| 408 | + |
| 409 | + Object objRight = convertToDouble(right, castToJavaDoubleNode); |
| 410 | + if (objRight == PNotImplemented.NOT_IMPLEMENTED) { |
| 411 | + return PNotImplemented.NOT_IMPLEMENTED; |
| 412 | + } |
| 413 | + |
| 414 | + double leftDouble = (double) objLeft; |
| 415 | + double rightDouble = (double) objRight; |
| 416 | + return leftDouble - rightDouble; |
381 | 417 | } |
382 | 418 | } |
383 | 419 |
|
@@ -439,10 +475,23 @@ Object doDP(VirtualFrame frame, PythonAbstractNativeObject left, PInt right, |
439 | 475 | } |
440 | 476 | } |
441 | 477 |
|
442 | | - @SuppressWarnings("unused") |
443 | 478 | @Fallback |
444 | | - static PNotImplemented doGeneric(Object left, Object right) { |
445 | | - return PNotImplemented.NOT_IMPLEMENTED; |
| 479 | + Object doGeneric(Object left, Object right, |
| 480 | + @Cached CastToJavaDoubleNode castToJavaDoubleNode) { |
| 481 | + |
| 482 | + Object objLeft = convertToDouble(left, castToJavaDoubleNode); |
| 483 | + if (objLeft == PNotImplemented.NOT_IMPLEMENTED) { |
| 484 | + return PNotImplemented.NOT_IMPLEMENTED; |
| 485 | + } |
| 486 | + |
| 487 | + Object objRight = convertToDouble(right, castToJavaDoubleNode); |
| 488 | + if (objRight == PNotImplemented.NOT_IMPLEMENTED) { |
| 489 | + return PNotImplemented.NOT_IMPLEMENTED; |
| 490 | + } |
| 491 | + |
| 492 | + double leftDouble = (double) objLeft; |
| 493 | + double rightDouble = (double) objRight; |
| 494 | + return leftDouble * rightDouble; |
446 | 495 | } |
447 | 496 | } |
448 | 497 |
|
@@ -555,24 +604,24 @@ Object doDPiToComplex(VirtualFrame frame, PInt left, double right, @SuppressWarn |
555 | 604 |
|
556 | 605 | @Specialization |
557 | 606 | Object doGeneric(VirtualFrame frame, Object left, Object right, Object mod, |
558 | | - @Cached CanBeDoubleNode canBeDoubleNode, |
559 | | - @Cached PyFloatAsDoubleNode asDoubleNode, |
| 607 | + @Cached CastToJavaDoubleNode castToJavaDoubleNode, |
560 | 608 | @Shared("powCall") @Cached("create(Pow)") LookupAndCallTernaryNode callPow) { |
561 | 609 | if (!(mod instanceof PNone)) { |
562 | 610 | throw raise(PythonBuiltinClassType.TypeError, ErrorMessages.POW_3RD_ARG_NOT_ALLOWED_UNLESS_INTEGERS); |
563 | 611 | } |
564 | | - double leftDouble; |
565 | | - double rightDouble; |
566 | | - if (canBeDoubleNode.execute(left)) { |
567 | | - leftDouble = asDoubleNode.execute(frame, left); |
568 | | - } else { |
| 612 | + |
| 613 | + Object objLeft = convertToDouble(left, castToJavaDoubleNode); |
| 614 | + if (objLeft == PNotImplemented.NOT_IMPLEMENTED) { |
569 | 615 | return PNotImplemented.NOT_IMPLEMENTED; |
570 | 616 | } |
571 | | - if (canBeDoubleNode.execute(right)) { |
572 | | - rightDouble = asDoubleNode.execute(frame, right); |
573 | | - } else { |
| 617 | + |
| 618 | + Object objRight = convertToDouble(right, castToJavaDoubleNode); |
| 619 | + if (objRight == PNotImplemented.NOT_IMPLEMENTED) { |
574 | 620 | return PNotImplemented.NOT_IMPLEMENTED; |
575 | 621 | } |
| 622 | + |
| 623 | + double leftDouble = (double) objLeft; |
| 624 | + double rightDouble = (double) objRight; |
576 | 625 | return doDDToComplex(frame, leftDouble, rightDouble, PNone.NONE, callPow); |
577 | 626 | } |
578 | 627 |
|
@@ -653,10 +702,23 @@ PTuple doGenericFloat(VirtualFrame frame, Object left, Object right, |
653 | 702 | return factory().createTuple(new Object[]{floorDivNode.execute(frame, left, right), modNode.execute(frame, left, right)}); |
654 | 703 | } |
655 | 704 |
|
656 | | - @SuppressWarnings("unused") |
657 | 705 | @Fallback |
658 | | - static PNotImplemented doGeneric(Object left, Object right) { |
659 | | - return PNotImplemented.NOT_IMPLEMENTED; |
| 706 | + Object doGeneric(Object left, Object right, |
| 707 | + @Cached CastToJavaDoubleNode castToJavaDoubleNode) { |
| 708 | + |
| 709 | + Object objLeft = convertToDouble(left, castToJavaDoubleNode); |
| 710 | + if (objLeft == PNotImplemented.NOT_IMPLEMENTED) { |
| 711 | + return PNotImplemented.NOT_IMPLEMENTED; |
| 712 | + } |
| 713 | + |
| 714 | + Object objRight = convertToDouble(right, castToJavaDoubleNode); |
| 715 | + if (objRight == PNotImplemented.NOT_IMPLEMENTED) { |
| 716 | + return PNotImplemented.NOT_IMPLEMENTED; |
| 717 | + } |
| 718 | + |
| 719 | + double leftDouble = (double) objLeft; |
| 720 | + double rightDouble = (double) objRight; |
| 721 | + return doDD(leftDouble, rightDouble); |
660 | 722 | } |
661 | 723 |
|
662 | 724 | protected static boolean accepts(Object obj) { |
@@ -842,10 +904,23 @@ public abstract static class ModNode extends FloatBinaryBuiltinNode { |
842 | 904 | return op(left.doubleValue(), right); |
843 | 905 | } |
844 | 906 |
|
845 | | - @SuppressWarnings("unused") |
846 | 907 | @Fallback |
847 | | - static PNotImplemented doGeneric(Object right, Object left) { |
848 | | - return PNotImplemented.NOT_IMPLEMENTED; |
| 908 | + Object doGeneric(Object left, Object right, |
| 909 | + @Cached CastToJavaDoubleNode castToJavaDoubleNode) { |
| 910 | + |
| 911 | + Object objLeft = convertToDouble(left, castToJavaDoubleNode); |
| 912 | + if (objLeft == PNotImplemented.NOT_IMPLEMENTED) { |
| 913 | + return PNotImplemented.NOT_IMPLEMENTED; |
| 914 | + } |
| 915 | + |
| 916 | + Object objRight = convertToDouble(right, castToJavaDoubleNode); |
| 917 | + if (objRight == PNotImplemented.NOT_IMPLEMENTED) { |
| 918 | + return PNotImplemented.NOT_IMPLEMENTED; |
| 919 | + } |
| 920 | + |
| 921 | + double leftDouble = (double) objLeft; |
| 922 | + double rightDouble = (double) objRight; |
| 923 | + return doDD(leftDouble, rightDouble); |
849 | 924 | } |
850 | 925 |
|
851 | 926 | public static double op(double left, double right) { |
@@ -908,10 +983,23 @@ Object doDP(VirtualFrame frame, long left, PythonAbstractNativeObject right, |
908 | 983 | } |
909 | 984 | } |
910 | 985 |
|
911 | | - @SuppressWarnings("unused") |
912 | 986 | @Fallback |
913 | | - static PNotImplemented doGeneric(Object left, Object right) { |
914 | | - return PNotImplemented.NOT_IMPLEMENTED; |
| 987 | + Object doGeneric(Object left, Object right, |
| 988 | + @Cached CastToJavaDoubleNode castToJavaDoubleNode) { |
| 989 | + |
| 990 | + Object objLeft = convertToDouble(left, castToJavaDoubleNode); |
| 991 | + if (objLeft == PNotImplemented.NOT_IMPLEMENTED) { |
| 992 | + return PNotImplemented.NOT_IMPLEMENTED; |
| 993 | + } |
| 994 | + |
| 995 | + Object objRight = convertToDouble(right, castToJavaDoubleNode); |
| 996 | + if (objRight == PNotImplemented.NOT_IMPLEMENTED) { |
| 997 | + return PNotImplemented.NOT_IMPLEMENTED; |
| 998 | + } |
| 999 | + |
| 1000 | + double leftDouble = (double) objLeft; |
| 1001 | + double rightDouble = (double) objRight; |
| 1002 | + return doDD(leftDouble, rightDouble); |
915 | 1003 | } |
916 | 1004 | } |
917 | 1005 |
|
@@ -1579,7 +1667,8 @@ PTuple get(double self, |
1579 | 1667 | throw raise(PythonErrorType.OverflowError, ErrorMessages.CANNOT_CONVERT_S_TO_INT_RATIO, "Infinity"); |
1580 | 1668 | } |
1581 | 1669 |
|
1582 | | - // At the first time find mantissa and exponent. This is functionanlity of Math.frexp |
| 1670 | + // At the first time find mantissa and exponent. This is functionanlity of |
| 1671 | + // Math.frexp |
1583 | 1672 | // node basically. |
1584 | 1673 | int exponent = 0; |
1585 | 1674 | double mantissa = 0.0; |
|
0 commit comments