summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabrice Bellard <fabrice@bellard.org>2024-01-02 16:08:08 +0100
committerFabrice Bellard <fabrice@bellard.org>2024-01-02 16:08:08 +0100
commit5c120cd471463f2061be8e44559f5b2b88895181 (patch)
treeb8b53f56f8500550691075f68016dff5b5ff655e
parent2ee6be705fde0eb68acec25915d2947de1207abb (diff)
downloadquickjs-5c120cd471463f2061be8e44559f5b2b88895181.tar.gz
quickjs-5c120cd471463f2061be8e44559f5b2b88895181.zip
added Error cause
-rw-r--r--TODO2
-rw-r--r--quickjs-atom.h1
-rw-r--r--quickjs.c26
-rw-r--r--test262.conf2
4 files changed, 23 insertions, 8 deletions
diff --git a/TODO b/TODO
index f17eb19..aba5731 100644
--- a/TODO
+++ b/TODO
@@ -63,5 +63,5 @@ Optimization ideas:
Test262o: 0/11262 errors, 463 excluded
Test262o commit: 7da91bceb9ce7613f87db47ddd1292a2dda58b42 (es5-tests branch)
-Result: 16/76773 errors, 1497 excluded, 8204 skipped
+Result: 16/76783 errors, 1497 excluded, 8199 skipped
Test262 commit: 6cbb6da9473c56d95358d8e679c5a6d2b4574efb
diff --git a/quickjs-atom.h b/quickjs-atom.h
index e931c31..f62a7c4 100644
--- a/quickjs-atom.h
+++ b/quickjs-atom.h
@@ -82,6 +82,7 @@ DEF(length, "length")
DEF(fileName, "fileName")
DEF(lineNumber, "lineNumber")
DEF(message, "message")
+DEF(cause, "cause")
DEF(errors, "errors")
DEF(stack, "stack")
DEF(name, "name")
diff --git a/quickjs.c b/quickjs.c
index 719fde1..7eaee1a 100644
--- a/quickjs.c
+++ b/quickjs.c
@@ -38204,7 +38204,8 @@ static JSValue js_error_constructor(JSContext *ctx, JSValueConst new_target,
int argc, JSValueConst *argv, int magic)
{
JSValue obj, msg, proto;
- JSValueConst message;
+ JSValueConst message, options;
+ int arg_index;
if (JS_IsUndefined(new_target))
new_target = JS_GetActiveFunction(ctx);
@@ -38230,12 +38231,9 @@ static JSValue js_error_constructor(JSContext *ctx, JSValueConst new_target,
JS_FreeValue(ctx, proto);
if (JS_IsException(obj))
return obj;
- if (magic == JS_AGGREGATE_ERROR) {
- message = argv[1];
- } else {
- message = argv[0];
- }
+ arg_index = (magic == JS_AGGREGATE_ERROR);
+ message = argv[arg_index++];
if (!JS_IsUndefined(message)) {
msg = JS_ToString(ctx, message);
if (unlikely(JS_IsException(msg)))
@@ -38244,6 +38242,22 @@ static JSValue js_error_constructor(JSContext *ctx, JSValueConst new_target,
JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
}
+ if (arg_index < argc) {
+ options = argv[arg_index];
+ if (JS_IsObject(options)) {
+ int present = JS_HasProperty(ctx, options, JS_ATOM_cause);
+ if (present < 0)
+ goto exception;
+ if (present) {
+ JSValue cause = JS_GetProperty(ctx, options, JS_ATOM_cause);
+ if (JS_IsException(cause))
+ goto exception;
+ JS_DefinePropertyValue(ctx, obj, JS_ATOM_cause, cause,
+ JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
+ }
+ }
+ }
+
if (magic == JS_AGGREGATE_ERROR) {
JSValue error_list = iterator_to_array(ctx, argv[0]);
if (JS_IsException(error_list))
diff --git a/test262.conf b/test262.conf
index 6dca0fe..4dc6987 100644
--- a/test262.conf
+++ b/test262.conf
@@ -102,7 +102,7 @@ default-parameters
destructuring-assignment
destructuring-binding
dynamic-import
-error-cause=skip
+error-cause
exponentiation
export-star-as-namespace-from-module
FinalizationGroup=skip