From 5c120cd471463f2061be8e44559f5b2b88895181 Mon Sep 17 00:00:00 2001 From: Fabrice Bellard Date: Tue, 2 Jan 2024 16:08:08 +0100 Subject: [PATCH] added Error cause --- TODO | 2 +- quickjs-atom.h | 1 + quickjs.c | 26 ++++++++++++++++++++------ test262.conf | 2 +- 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