|
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 |
|
45 | 45 | import com.oracle.truffle.api.frame.VirtualFrame; |
46 | 46 | import com.oracle.truffle.api.profiles.InlinedBranchProfile; |
47 | 47 | import com.oracle.truffle.js.builtins.ErrorFunctionBuiltinsFactory.ErrorCaptureStackTraceNodeGen; |
| 48 | +import com.oracle.truffle.js.builtins.ErrorFunctionBuiltinsFactory.ErrorIsErrorNodeGen; |
48 | 49 | import com.oracle.truffle.js.nodes.access.ErrorStackTraceLimitNode; |
49 | 50 | import com.oracle.truffle.js.nodes.access.InitErrorObjectNode; |
50 | 51 | import com.oracle.truffle.js.nodes.function.JSBuiltin; |
51 | 52 | import com.oracle.truffle.js.nodes.function.JSBuiltinNode; |
52 | 53 | import com.oracle.truffle.js.runtime.Errors; |
53 | 54 | import com.oracle.truffle.js.runtime.JSArguments; |
| 55 | +import com.oracle.truffle.js.runtime.JSConfig; |
54 | 56 | import com.oracle.truffle.js.runtime.JSContext; |
55 | 57 | import com.oracle.truffle.js.runtime.JSRuntime; |
56 | | -import com.oracle.truffle.js.runtime.Strings; |
57 | 58 | import com.oracle.truffle.js.runtime.UserScriptException; |
| 59 | +import com.oracle.truffle.js.runtime.builtins.BuiltinEnum; |
58 | 60 | import com.oracle.truffle.js.runtime.builtins.JSError; |
| 61 | +import com.oracle.truffle.js.runtime.builtins.JSErrorObject; |
59 | 62 | import com.oracle.truffle.js.runtime.builtins.JSFunction; |
60 | 63 | import com.oracle.truffle.js.runtime.builtins.JSFunctionObject; |
61 | | -import com.oracle.truffle.js.runtime.objects.JSAttributes; |
62 | 64 | import com.oracle.truffle.js.runtime.objects.JSObject; |
63 | 65 | import com.oracle.truffle.js.runtime.objects.Undefined; |
64 | 66 |
|
65 | 67 | /** |
66 | 68 | * Contains builtins for {@linkplain JSError} function (constructor). |
67 | 69 | */ |
68 | | -public final class ErrorFunctionBuiltins extends JSBuiltinsContainer.Lambda { |
| 70 | +public final class ErrorFunctionBuiltins extends JSBuiltinsContainer.SwitchEnum<ErrorFunctionBuiltins.ErrorFunction> { |
69 | 71 | public static final JSBuiltinsContainer BUILTINS = new ErrorFunctionBuiltins(); |
70 | 72 |
|
71 | 73 | protected ErrorFunctionBuiltins() { |
72 | | - super(JSError.CLASS_NAME); |
73 | | - defineFunction(Strings.CAPTURE_STACK_TRACE, 2, JSAttributes.getDefault(), |
74 | | - (context, builtin) -> ErrorCaptureStackTraceNodeGen.create(context, builtin, args().fixedArgs(2).createArgumentNodes(context))); |
| 74 | + super(JSError.CLASS_NAME, ErrorFunction.class); |
| 75 | + } |
| 76 | + |
| 77 | + public enum ErrorFunction implements BuiltinEnum<ErrorFunction> { |
| 78 | + captureStackTrace(2), |
| 79 | + isError(1); |
| 80 | + |
| 81 | + private final int length; |
| 82 | + |
| 83 | + ErrorFunction(int length) { |
| 84 | + this.length = length; |
| 85 | + } |
| 86 | + |
| 87 | + @Override |
| 88 | + public int getLength() { |
| 89 | + return length; |
| 90 | + } |
| 91 | + |
| 92 | + @Override |
| 93 | + public int getECMAScriptVersion() { |
| 94 | + if (this == isError) { |
| 95 | + return JSConfig.StagingECMAScriptVersion; |
| 96 | + } |
| 97 | + return BuiltinEnum.super.getECMAScriptVersion(); |
| 98 | + } |
| 99 | + |
| 100 | + @Override |
| 101 | + public boolean isOptional() { |
| 102 | + return (this == captureStackTrace); |
| 103 | + } |
| 104 | + |
| 105 | + } |
| 106 | + |
| 107 | + @Override |
| 108 | + protected Object createNode(JSContext context, JSBuiltin builtin, boolean construct, boolean newTarget, ErrorFunction builtinEnum) { |
| 109 | + switch (builtinEnum) { |
| 110 | + case captureStackTrace: |
| 111 | + return ErrorCaptureStackTraceNodeGen.create(context, builtin, args().fixedArgs(2).createArgumentNodes(context)); |
| 112 | + case isError: |
| 113 | + return ErrorIsErrorNodeGen.create(context, builtin, args().fixedArgs(1).createArgumentNodes(context)); |
| 114 | + } |
| 115 | + return null; |
75 | 116 | } |
76 | 117 |
|
77 | 118 | public abstract static class ErrorCaptureStackTraceNode extends JSBuiltinNode { |
@@ -109,4 +150,15 @@ public boolean countsTowardsStackTraceLimit() { |
109 | 150 | return false; |
110 | 151 | } |
111 | 152 | } |
| 153 | + |
| 154 | + public abstract static class ErrorIsErrorNode extends JSBuiltinNode { |
| 155 | + public ErrorIsErrorNode(JSContext context, JSBuiltin builtin) { |
| 156 | + super(context, builtin); |
| 157 | + } |
| 158 | + |
| 159 | + @Specialization |
| 160 | + protected boolean isError(Object argument) { |
| 161 | + return (argument instanceof JSErrorObject); |
| 162 | + } |
| 163 | + } |
112 | 164 | } |
0 commit comments