aboutsummaryrefslogtreecommitdiff
path: root/src/javascript/jsc/bindings/ZigGlobalObject.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/javascript/jsc/bindings/ZigGlobalObject.h')
-rw-r--r--src/javascript/jsc/bindings/ZigGlobalObject.h28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/javascript/jsc/bindings/ZigGlobalObject.h b/src/javascript/jsc/bindings/ZigGlobalObject.h
index 4b1e1e935..64ece0c64 100644
--- a/src/javascript/jsc/bindings/ZigGlobalObject.h
+++ b/src/javascript/jsc/bindings/ZigGlobalObject.h
@@ -10,10 +10,10 @@ class Identifier;
} // namespace JSC
#include "ZigConsoleClient.h"
+#include <JavaScriptCore/CatchScope.h>
#include <JavaScriptCore/JSGlobalObject.h>
#include <JavaScriptCore/JSTypeInfo.h>
#include <JavaScriptCore/Structure.h>
-
namespace Zig {
class GlobalObject : public JSC::JSGlobalObject {
@@ -45,6 +45,7 @@ class GlobalObject : public JSC::JSGlobalObject {
static void reportUncaughtExceptionAtEventLoop(JSGlobalObject *, JSC::Exception *);
+ static void queueMicrotaskToEventLoop(JSC::JSGlobalObject &global, Ref<JSC::Microtask> &&task);
static JSC::JSInternalPromise *moduleLoaderImportModule(JSGlobalObject *, JSC::JSModuleLoader *,
JSC::JSString *moduleNameValue,
JSC::JSValue parameters,
@@ -69,4 +70,29 @@ class GlobalObject : public JSC::JSGlobalObject {
: JSC::JSGlobalObject(vm, structure, &s_globalObjectMethodTable) {}
};
+class JSMicrotaskCallback : public RefCounted<JSMicrotaskCallback> {
+ public:
+ static Ref<JSMicrotaskCallback> create(JSC::JSGlobalObject &globalObject,
+ Ref<JSC::Microtask> &&task) {
+ return adoptRef(*new JSMicrotaskCallback(globalObject, WTFMove(task)));
+ }
+
+ void call() {
+ auto protectedThis{makeRef(*this)};
+ JSC::VM &vm = m_globalObject->vm();
+ JSC::JSLockHolder lock(vm);
+ auto scope = DECLARE_CATCH_SCOPE(vm);
+ auto task = &m_task.get();
+ task->run(m_globalObject.get());
+ scope.assertNoExceptionExceptTermination();
+ }
+
+ private:
+ JSMicrotaskCallback(JSC::JSGlobalObject &globalObject, Ref<JSC::Microtask> &&task)
+ : m_globalObject{globalObject.vm(), &globalObject}, m_task{WTFMove(task)} {}
+
+ JSC::Strong<JSC::JSGlobalObject> m_globalObject;
+ Ref<JSC::Microtask> m_task;
+};
+
} // namespace Zig