}
-static JSValue
-qjs_fs_promise_trampoline(JSContext *cx, int argc, JSValueConst *argv)
-{
- return JS_Call(cx, argv[0], JS_UNDEFINED, 1, &argv[1]);
-}
-
-
static JSValue
qjs_fs_result(JSContext *cx, JSValue result, int calltype, JSValue callback)
{
- JS_BOOL is_error;
- JSValue promise, callbacks[2], arguments[2];
+ JSValue promise, arguments[2];
switch (calltype) {
case QJS_FS_DIRECT:
return result;
case QJS_FS_PROMISE:
- promise = JS_NewPromiseCapability(cx, callbacks);
- if (JS_IsException(promise)) {
- JS_FreeValue(cx, result);
- return JS_EXCEPTION;
- }
-
- is_error = !!JS_IsError(cx, result);
-
- arguments[0] = callbacks[is_error];
- arguments[1] = result;
- JS_FreeValue(cx, callbacks[!is_error]);
-
- if (JS_EnqueueJob(cx, qjs_fs_promise_trampoline, 2, arguments) < 0) {
- JS_FreeValue(cx, promise);
- JS_FreeValue(cx, callbacks[is_error]);
- JS_FreeValue(cx, result);
- return JS_EXCEPTION;
+ if (JS_IsError(cx, result)) {
+ JS_Throw(cx, result);
+ return qjs_promise_result(cx, JS_EXCEPTION);
}
- JS_FreeValue(cx, arguments[0]);
- JS_FreeValue(cx, arguments[1]);
-
- return promise;
+ return qjs_promise_result(cx, result);
case QJS_FS_CALLBACK:
if (JS_IsError(cx, result)) {
static const char *qjs_algorithm_hash_name(qjs_webcrypto_hash_t hash);
static JSValue qjs_key_usage(JSContext *cx, JSValue value, unsigned *mask);
static JSValue qjs_key_ops(JSContext *cx, unsigned mask);
-static JSValue qjs_webcrypto_result(JSContext *cx, JSValue result, int rc);
static void qjs_webcrypto_error(JSContext *cx, const char *fmt, ...);
static JSModuleDef *qjs_webcrypto_init(JSContext *cx, const char *name);
}
}
- return qjs_webcrypto_result(cx, ret, 0);
+ return qjs_promise_result(cx, ret);
fail:
- return qjs_webcrypto_result(cx, JS_UNDEFINED, -1);
+ return qjs_promise_result(cx, JS_EXCEPTION);
}
ret = qjs_new_array_buffer(cx, k, length);
}
- return qjs_webcrypto_result(cx, ret, 0);
+ return qjs_promise_result(cx, ret);
fail:
js_free(cx, k);
- return qjs_webcrypto_result(cx, JS_UNDEFINED, -1);
+ return qjs_promise_result(cx, JS_EXCEPTION);
}
}
- return qjs_webcrypto_result(cx, ret, 0);
+ return qjs_promise_result(cx, ret);
fail:
- return qjs_webcrypto_result(cx, JS_UNDEFINED, -1);
+ return qjs_promise_result(cx, JS_EXCEPTION);
}
goto fail;
}
- return qjs_webcrypto_result(cx, obj, 0);
+ return qjs_promise_result(cx, obj);
fail:
JS_FreeValue(cx, key);
JS_FreeValue(cx, keypub);
- return qjs_webcrypto_result(cx, JS_UNDEFINED, -1);
+ return qjs_promise_result(cx, JS_EXCEPTION);
}
break;
}
- return qjs_webcrypto_result(cx, key, 0);
+ return qjs_promise_result(cx, key);
fail:
JS_FreeValue(cx, key);
- return qjs_webcrypto_result(cx, JS_UNDEFINED, -1);
+ return qjs_promise_result(cx, JS_EXCEPTION);
}
ret = JS_NewBool(cx, rc != 0);
}
- return qjs_webcrypto_result(cx, ret, 0);
+ return qjs_promise_result(cx, ret);
fail:
js_free(cx, dst);
}
- return qjs_webcrypto_result(cx, JS_UNDEFINED, -1);
+ return qjs_promise_result(cx, JS_EXCEPTION);
}
}
-static JSValue
-qjs_webcrypto_promise_trampoline(JSContext *cx, int argc, JSValueConst *argv)
-{
- return JS_Call(cx, argv[0], JS_UNDEFINED, 1, &argv[1]);
-}
-
-
-static JSValue
-qjs_webcrypto_result(JSContext *cx, JSValue result, int rc)
-{
- JS_BOOL is_error;
- JSValue promise, callbacks[2], arguments[2];
-
- promise = JS_NewPromiseCapability(cx, callbacks);
- if (JS_IsException(promise)) {
- JS_FreeValue(cx, result);
- return JS_EXCEPTION;
- }
-
- is_error = !!(rc != 0);
-
- JS_FreeValue(cx, callbacks[!is_error]);
- arguments[0] = callbacks[is_error];
- arguments[1] = is_error ? JS_GetException(cx) : result;
-
- if (JS_EnqueueJob(cx, qjs_webcrypto_promise_trampoline, 2, arguments) < 0) {
- JS_FreeValue(cx, promise);
- JS_FreeValue(cx, callbacks[is_error]);
- JS_FreeValue(cx, arguments[1]);
- return JS_EXCEPTION;
- }
-
- JS_FreeValue(cx, arguments[0]);
- JS_FreeValue(cx, arguments[1]);
-
- return promise;
-}
-
-
static void
qjs_webcrypto_error(JSContext *cx, const char *fmt, ...)
{
return ret;
}
+
+
+static JSValue
+qjs_promise_fill_trampoline(JSContext *cx, int argc, JSValueConst *argv)
+{
+ return JS_Call(cx, argv[0], JS_UNDEFINED, 1, &argv[1]);
+}
+
+
+JSValue
+qjs_promise_result(JSContext *cx, JSValue result)
+{
+ JS_BOOL is_error;
+ JSValue promise, callbacks[2], arguments[2];
+
+ promise = JS_NewPromiseCapability(cx, callbacks);
+ if (JS_IsException(promise)) {
+ JS_FreeValue(cx, result);
+ return JS_EXCEPTION;
+ }
+
+ is_error = JS_IsException(result);
+
+ JS_FreeValue(cx, callbacks[!is_error]);
+ arguments[0] = callbacks[is_error];
+ arguments[1] = is_error ? JS_GetException(cx) : result;
+
+ if (JS_EnqueueJob(cx, qjs_promise_fill_trampoline, 2, arguments) < 0) {
+ JS_FreeValue(cx, promise);
+ JS_FreeValue(cx, callbacks[is_error]);
+ JS_FreeValue(cx, result);
+ return JS_EXCEPTION;
+ }
+
+ JS_FreeValue(cx, arguments[0]);
+ JS_FreeValue(cx, arguments[1]);
+
+ return promise;
+}