|
1 | 1 | /* |
2 | | - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. |
| 2 | + * Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved. |
3 | 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 | 4 | * |
5 | 5 | * The Universal Permissive License (UPL), Version 1.0 |
|
44 | 44 |
|
45 | 45 | import com.oracle.truffle.api.CompilerDirectives; |
46 | 46 | import com.oracle.truffle.api.dsl.Cached; |
| 47 | +import com.oracle.truffle.api.dsl.Cached.Shared; |
| 48 | +import com.oracle.truffle.api.dsl.Fallback; |
| 49 | +import com.oracle.truffle.api.dsl.GenerateCached; |
| 50 | +import com.oracle.truffle.api.dsl.GenerateInline; |
| 51 | +import com.oracle.truffle.api.dsl.ImportStatic; |
47 | 52 | import com.oracle.truffle.api.dsl.Specialization; |
48 | 53 | import com.oracle.truffle.api.interop.InteropLibrary; |
| 54 | +import com.oracle.truffle.api.nodes.Node; |
49 | 55 | import com.oracle.truffle.api.profiles.ConditionProfile; |
50 | | -import com.oracle.truffle.api.profiles.InlinedConditionProfile; |
| 56 | +import com.oracle.truffle.api.profiles.InlinedBranchProfile; |
51 | 57 | import com.oracle.truffle.api.strings.TruffleString; |
52 | 58 | import com.oracle.truffle.js.builtins.DatePrototypeBuiltinsFactory.JSDateGetDateNodeGen; |
53 | 59 | import com.oracle.truffle.js.builtins.DatePrototypeBuiltinsFactory.JSDateGetDayNodeGen; |
|
80 | 86 | import com.oracle.truffle.js.builtins.DatePrototypeBuiltinsFactory.JSDateToStringNodeGen; |
81 | 87 | import com.oracle.truffle.js.builtins.DatePrototypeBuiltinsFactory.JSDateToTimeStringNodeGen; |
82 | 88 | import com.oracle.truffle.js.builtins.DatePrototypeBuiltinsFactory.JSDateValueOfNodeGen; |
| 89 | +import com.oracle.truffle.js.nodes.JavaScriptBaseNode; |
83 | 90 | import com.oracle.truffle.js.nodes.access.IsObjectNode; |
84 | 91 | import com.oracle.truffle.js.nodes.access.PropertyGetNode; |
85 | 92 | import com.oracle.truffle.js.nodes.cast.JSToNumberNode; |
@@ -900,34 +907,49 @@ private JSFunctionCallNode getCallToISOStringFnNode() { |
900 | 907 |
|
901 | 908 | public abstract static class JSDateToPrimitiveNode extends JSBuiltinNode { |
902 | 909 |
|
903 | | - @Child private OrdinaryToPrimitiveNode ordinaryToPrimitiveHintNumber; |
904 | | - @Child private OrdinaryToPrimitiveNode ordinaryToPrimitiveHintString; |
905 | | - |
906 | 910 | public JSDateToPrimitiveNode(JSContext context, JSBuiltin builtin) { |
907 | 911 | super(context, builtin); |
908 | 912 | } |
909 | 913 |
|
910 | 914 | @Specialization |
911 | 915 | protected final Object toPrimitive(Object obj, Object hint, |
912 | 916 | @Cached IsObjectNode isObjectNode, |
913 | | - @Cached InlinedConditionProfile isHintNumber, |
914 | | - @Cached InlinedConditionProfile isHintStringOrDefault) { |
915 | | - if (!isObjectNode.executeBoolean(obj)) { |
| 917 | + @Cached DateToPrimitiveHelperNode dateToPrimitiveHelper, |
| 918 | + @Cached InlinedBranchProfile errorBranch) { |
| 919 | + if (isObjectNode.executeBoolean(obj)) { |
| 920 | + return dateToPrimitiveHelper.execute(this, obj, hint); |
| 921 | + } else { |
| 922 | + errorBranch.enter(this); |
916 | 923 | throw Errors.createTypeErrorNotAnObject(obj); |
917 | 924 | } |
918 | | - if (isHintNumber.profile(this, Strings.HINT_NUMBER.equals(hint))) { |
919 | | - if (ordinaryToPrimitiveHintNumber == null) { |
920 | | - CompilerDirectives.transferToInterpreterAndInvalidate(); |
921 | | - ordinaryToPrimitiveHintNumber = insert(OrdinaryToPrimitiveNode.createHintNumber()); |
922 | | - } |
| 925 | + } |
| 926 | + |
| 927 | + @GenerateInline |
| 928 | + @GenerateCached(false) |
| 929 | + @ImportStatic(Strings.class) |
| 930 | + abstract static class DateToPrimitiveHelperNode extends JavaScriptBaseNode { |
| 931 | + |
| 932 | + abstract Object execute(Node node, Object obj, Object hint); |
| 933 | + |
| 934 | + @SuppressWarnings("unused") |
| 935 | + @Specialization(guards = {"equals(strEqual, HINT_NUMBER, hint)"}) |
| 936 | + static Object toPrimitiveHintNumber(Object obj, TruffleString hint, |
| 937 | + @Cached @Shared TruffleString.EqualNode strEqual, |
| 938 | + @Cached("createHintNumber()") OrdinaryToPrimitiveNode ordinaryToPrimitiveHintNumber) { |
923 | 939 | return ordinaryToPrimitiveHintNumber.execute(obj); |
924 | | - } else if (isHintStringOrDefault.profile(this, Strings.HINT_STRING.equals(hint) || Strings.HINT_DEFAULT.equals(hint))) { |
925 | | - if (ordinaryToPrimitiveHintString == null) { |
926 | | - CompilerDirectives.transferToInterpreterAndInvalidate(); |
927 | | - ordinaryToPrimitiveHintString = insert(OrdinaryToPrimitiveNode.createHintString()); |
928 | | - } |
| 940 | + } |
| 941 | + |
| 942 | + @SuppressWarnings("unused") |
| 943 | + @Specialization(guards = {"equals(strEqual, HINT_STRING, hint) || equals(strEqual, HINT_DEFAULT, hint)"}) |
| 944 | + static Object toPrimitiveHintStringOrDefault(Object obj, TruffleString hint, |
| 945 | + @Cached @Shared TruffleString.EqualNode strEqual, |
| 946 | + @Cached("createHintString()") OrdinaryToPrimitiveNode ordinaryToPrimitiveHintString) { |
929 | 947 | return ordinaryToPrimitiveHintString.execute(obj); |
930 | | - } else { |
| 948 | + } |
| 949 | + |
| 950 | + @Fallback |
| 951 | + static Object invalidHint(@SuppressWarnings("unused") Object obj, Object hint) { |
| 952 | + assert !(Strings.HINT_STRING.equals(hint) || Strings.HINT_NUMBER.equals(hint) || Strings.HINT_DEFAULT.equals(hint)) : hint; |
931 | 953 | throw Errors.createTypeError("invalid hint"); |
932 | 954 | } |
933 | 955 | } |
|
0 commit comments