. auto/feature
- njs_feature="QuickJS JS_NewError() attaches stack"
- njs_feature_run=value
- njs_feature_name=NJS_HAVE_QUICKJS_NEW_ERROR_STACK
- njs_feature_test="#include <quickjs_compat.h>
-
- int main() {
- int rc;
- JSAtom atom;
- JSValue err;
- JSRuntime *rt;
- JSContext *ctx;
-
- rt = JS_NewRuntime();
- ctx = JS_NewContext(rt);
- err = JS_NewError(ctx);
- atom = JS_NewAtom(ctx, \"stack\");
- rc = JS_HasProperty(ctx, err, atom);
- printf(\"%d\", rc);
- JS_FreeAtom(ctx, atom);
- JS_FreeValue(ctx, err);
- JS_FreeContext(ctx);
- JS_FreeRuntime(rt);
- return 0;
- }"
-
- . auto/feature
-
njs_feature="QuickJS version"
njs_feature_name=NJS_QUICKJS_VERSION
njs_feature_run=value
}
/*
- * QuickJS-NG attaches the "stack" property to an Error object too early,
- * which results in empty stack trace when called from C code.
- * Removing it allows the stack to be attached later during unwinding.
+ * JS_NewError() records the stack of the caller, which is empty for an
+ * error created outside of a JS frame. Since QuickJS-NG 0.16.0 the
+ * recorded stack is also final, the engine never replaces it. Creating
+ * the object without letting the engine record anything allows the stack
+ * to be attached where the error is actually thrown.
*/
-static inline JSValue qjs_new_error2(JSContext *cx)
+static inline JSValue qjs_new_error(JSContext *cx)
{
- JSAtom stack;
- JSValue error;
-
- stack = JS_NewAtom(cx, "stack");
- if (stack == JS_ATOM_NULL) {
- return JS_EXCEPTION;
- }
+ JSValue error;
+ JSClassID class_id;
error = JS_NewError(cx);
if (JS_IsException(error)) {
- JS_FreeAtom(cx, stack);
return JS_EXCEPTION;
}
- JS_DeleteProperty(cx, error, stack, 0);
- JS_FreeAtom(cx, stack);
+ class_id = JS_GetClassID(error);
+ JS_FreeValue(cx, error);
- return error;
+ return JS_NewObjectClass(cx, class_id);
}
#ifdef NJS_HAVE_QUICKJS_IS_SAME_VALUE
#define qjs_is_error(cx, a) JS_IsError(cx, a)
#endif
-#ifdef NJS_HAVE_QUICKJS_NEW_ERROR_STACK
-#define qjs_new_error(cx) qjs_new_error2(cx)
-#else
-#define qjs_new_error(cx) JS_NewError(cx)
-#endif
-
extern qjs_module_t *qjs_modules[];
#endif /* _QJS_H_INCLUDED_ */