|
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