diff options
author | 2022-09-28 23:34:03 -0700 | |
---|---|---|
committer | 2022-09-28 23:34:03 -0700 | |
commit | 16929129f0259c63f63d7db20e2121dc2581deaa (patch) | |
tree | 8a384c4706425c4dd6b6c6b90302374f223e219e /src/bun.js | |
parent | 524e48a81dfc6106ffcdd07b6fd035000b03146c (diff) | |
download | bun-16929129f0259c63f63d7db20e2121dc2581deaa.tar.gz bun-16929129f0259c63f63d7db20e2121dc2581deaa.tar.zst bun-16929129f0259c63f63d7db20e2121dc2581deaa.zip |
Clean up some of the event loop code
Diffstat (limited to 'src/bun.js')
-rw-r--r-- | src/bun.js/base.zig | 13 | ||||
-rw-r--r-- | src/bun.js/bindings/ZigGlobalObject.cpp | 12 | ||||
-rw-r--r-- | src/bun.js/bindings/ZigGlobalObject.h | 9 | ||||
-rw-r--r-- | src/bun.js/bindings/bindings.cpp | 29 | ||||
-rw-r--r-- | src/bun.js/bindings/bindings.zig | 41 | ||||
-rw-r--r-- | src/bun.js/bindings/exports.zig | 5 | ||||
-rw-r--r-- | src/bun.js/bindings/headers-cpp.h | 2 | ||||
-rw-r--r-- | src/bun.js/bindings/headers.h | 9 | ||||
-rw-r--r-- | src/bun.js/bindings/napi.cpp | 19 | ||||
-rw-r--r-- | src/bun.js/bindings/napi.h | 6 | ||||
-rw-r--r-- | src/bun.js/event_loop.zig | 17 | ||||
-rw-r--r-- | src/bun.js/javascript.zig | 7 |
12 files changed, 100 insertions, 69 deletions
diff --git a/src/bun.js/base.zig b/src/bun.js/base.zig index 09a84450e..e3ffa660d 100644 --- a/src/bun.js/base.zig +++ b/src/bun.js/base.zig @@ -2766,7 +2766,6 @@ const BigIntStats = JSC.Node.BigIntStats; const Transpiler = @import("./api/transpiler.zig"); const TextEncoder = WebCore.TextEncoder; const TextDecoder = WebCore.TextDecoder; -const TimeoutTask = JSC.BunTimer.Timeout.TimeoutTask; const HTMLRewriter = JSC.Cloudflare.HTMLRewriter; const Element = JSC.Cloudflare.Element; const Comment = JSC.Cloudflare.Comment; @@ -2823,7 +2822,6 @@ pub const JSPrivateDataPtr = TaggedPointerUnion(.{ SSLServer, Stats, TextChunk, - TimeoutTask, Transpiler, FFI, }); @@ -3936,6 +3934,16 @@ pub const Strong = struct { return .{}; } + pub fn create( + value: JSC.JSValue, + globalThis: *JSC.JSGlobalObject, + ) Strong { + var str = Strong.init(); + if (value != .zero) + str.set(globalThis, value); + return str; + } + pub fn get(this: *Strong) ?JSValue { var ref = this.ref orelse return null; const result = ref.get(); @@ -3959,6 +3967,7 @@ pub const Strong = struct { pub fn set(this: *Strong, globalThis: *JSC.JSGlobalObject, value: JSValue) void { var ref: *JSC.napi.Ref = this.ref orelse { + if (value == .zero) return; this.ref = JSC.napi.Ref.create(globalThis, value); return; }; diff --git a/src/bun.js/bindings/ZigGlobalObject.cpp b/src/bun.js/bindings/ZigGlobalObject.cpp index f14352230..40bb75d9b 100644 --- a/src/bun.js/bindings/ZigGlobalObject.cpp +++ b/src/bun.js/bindings/ZigGlobalObject.cpp @@ -2108,6 +2108,18 @@ void GlobalObject::finishCreation(VM& vm) RELEASE_ASSERT(classInfo()); } +extern "C" void Bun__setOnEachMicrotaskTick(JSC::VM* vm, void* ptr, void (*callback)(void* ptr)) +{ + if (callback == nullptr) { + vm->setOnEachMicrotaskTick(nullptr); + return; + } + + vm->setOnEachMicrotaskTick([=](JSC::VM& vm) { + callback(ptr); + }); +} + // This implementation works the same as setTimeout(myFunction, 0) // TODO: make it more efficient // https://developer.mozilla.org/en-US/docs/Web/API/Window/setImmediate diff --git a/src/bun.js/bindings/ZigGlobalObject.h b/src/bun.js/bindings/ZigGlobalObject.h index 37c9c492c..550d4d853 100644 --- a/src/bun.js/bindings/ZigGlobalObject.h +++ b/src/bun.js/bindings/ZigGlobalObject.h @@ -256,8 +256,11 @@ public: jsFunctionOnLoadObjectResultResolve, jsFunctionOnLoadObjectResultReject, + + Bun__TestScope__onReject, + Bun__TestScope__onResolve, }; - static constexpr size_t promiseFunctionsSize = 18; + static constexpr size_t promiseFunctionsSize = 20; static PromiseFunctions promiseHandlerID(EncodedJSValue (*handler)(JSC__JSGlobalObject* arg0, JSC__CallFrame* arg1)) { @@ -301,6 +304,10 @@ public: return PromiseFunctions::jsFunctionOnLoadObjectResultResolve; } else if (handler == jsFunctionOnLoadObjectResultReject) { return PromiseFunctions::jsFunctionOnLoadObjectResultReject; + } else if (handler == Bun__TestScope__onReject) { + return PromiseFunctions::Bun__TestScope__onReject; + } else if (handler == Bun__TestScope__onResolve) { + return PromiseFunctions::Bun__TestScope__onResolve; } else { RELEASE_ASSERT_NOT_REACHED(); } diff --git a/src/bun.js/bindings/bindings.cpp b/src/bun.js/bindings/bindings.cpp index 41337fd44..1c82972a9 100644 --- a/src/bun.js/bindings/bindings.cpp +++ b/src/bun.js/bindings/bindings.cpp @@ -134,8 +134,7 @@ void WebCore__FetchHeaders__toUWSResponse(WebCore__FetchHeaders* arg0, bool is_s WebCore__FetchHeaders* WebCore__FetchHeaders__createEmpty() { - RefPtr<WebCore::FetchHeaders> headers = adoptRef(*new WebCore::FetchHeaders({ WebCore::FetchHeaders::Guard::None, {} })); - return headers.leakRef(); + return new WebCore::FetchHeaders({ WebCore::FetchHeaders::Guard::None, {} }); } void WebCore__FetchHeaders__append(WebCore__FetchHeaders* headers, const ZigString* arg1, const ZigString* arg2) { @@ -155,10 +154,10 @@ WebCore__FetchHeaders* WebCore__FetchHeaders__createFromJS(JSC__JSGlobalObject* auto throwScope = DECLARE_THROW_SCOPE(lexicalGlobalObject->vm()); auto init = argument0.value().isUndefined() ? std::optional<Converter<IDLUnion<IDLSequence<IDLSequence<IDLByteString>>, IDLRecord<IDLByteString, IDLByteString>>>::ReturnType>() : std::optional<Converter<IDLUnion<IDLSequence<IDLSequence<IDLByteString>>, IDLRecord<IDLByteString, IDLByteString>>>::ReturnType>(convert<IDLUnion<IDLSequence<IDLSequence<IDLByteString>>, IDLRecord<IDLByteString, IDLByteString>>>(*lexicalGlobalObject, argument0.value())); RETURN_IF_EXCEPTION(throwScope, nullptr); - RefPtr<WebCore::FetchHeaders> headers = adoptRef(*new WebCore::FetchHeaders({ WebCore::FetchHeaders::Guard::None, {} })); + auto* headers = new WebCore::FetchHeaders({ WebCore::FetchHeaders::Guard::None, {} }); if (init) headers->fill(WTFMove(init.value())); - return headers.leakRef(); + return headers; } JSC__JSValue WebCore__FetchHeaders__toJS(WebCore__FetchHeaders* headers, JSC__JSGlobalObject* lexicalGlobalObject) @@ -170,19 +169,16 @@ JSC__JSValue WebCore__FetchHeaders__toJS(WebCore__FetchHeaders* headers, JSC__JS JSC__JSValue WebCore__FetchHeaders__clone(WebCore__FetchHeaders* headers, JSC__JSGlobalObject* arg1) { Zig::GlobalObject* globalObject = reinterpret_cast<Zig::GlobalObject*>(arg1); - auto clone = WebCore::FetchHeaders::create(); + auto* clone = new WebCore::FetchHeaders({ WebCore::FetchHeaders::Guard::None, {} }); clone->fill(*headers); return JSC::JSValue::encode(WebCore::toJSNewlyCreated(arg1, globalObject, WTFMove(clone))); } WebCore__FetchHeaders* WebCore__FetchHeaders__cloneThis(WebCore__FetchHeaders* headers) { - RefPtr<WebCore::FetchHeaders> clone = adoptRef(*new WebCore::FetchHeaders({ WebCore::FetchHeaders::Guard::None, {} })); - if (headers->size() > 0) { - clone->fill(*headers); - } - - return clone.leakRef(); + auto* clone = new WebCore::FetchHeaders({ WebCore::FetchHeaders::Guard::None, {} }); + clone->fill(*headers); + return clone; } bool WebCore__FetchHeaders__fastHas_(WebCore__FetchHeaders* arg0, unsigned char HTTPHeaderName1) @@ -232,7 +228,7 @@ typedef struct PicoHTTPHeaders { WebCore::FetchHeaders* WebCore__FetchHeaders__createFromPicoHeaders_(JSC__JSGlobalObject* arg0, const void* arg1) { PicoHTTPHeaders pico_headers = *reinterpret_cast<const PicoHTTPHeaders*>(arg1); - RefPtr<WebCore::FetchHeaders> headers = adoptRef(*new WebCore::FetchHeaders({ WebCore::FetchHeaders::Guard::None, {} })); + auto* headers = new WebCore::FetchHeaders({ WebCore::FetchHeaders::Guard::None, {} }); if (pico_headers.len > 0) { Vector<KeyValuePair<String, String>> pairs; @@ -246,7 +242,7 @@ WebCore::FetchHeaders* WebCore__FetchHeaders__createFromPicoHeaders_(JSC__JSGlob pairs.releaseBuffer(); } - return headers.leakRef(); + return headers; } WebCore::FetchHeaders* WebCore__FetchHeaders__createFromUWS(JSC__JSGlobalObject* arg0, void* arg1) { @@ -256,7 +252,7 @@ WebCore::FetchHeaders* WebCore__FetchHeaders__createFromUWS(JSC__JSGlobalObject* uint32_t nameHashes[55]; size_t i = 0; - RefPtr<WebCore::FetchHeaders> headers = adoptRef(*new WebCore::FetchHeaders({ WebCore::FetchHeaders::Guard::None, {} })); + auto* headers = new WebCore::FetchHeaders({ WebCore::FetchHeaders::Guard::None, {} }); HTTPHeaderMap map = HTTPHeaderMap(); for (const auto& header : req) { @@ -298,12 +294,11 @@ WebCore::FetchHeaders* WebCore__FetchHeaders__createFromUWS(JSC__JSGlobalObject* } headers->setInternalHeaders(WTFMove(map)); - return headers.leakRef(); + return headers; } void WebCore__FetchHeaders__deref(WebCore__FetchHeaders* arg0) { - RefPtr<WebCore::FetchHeaders> clone = arg0; - clone->deref(); + arg0->deref(); } JSC__JSValue WebCore__FetchHeaders__createValue(JSC__JSGlobalObject* arg0, StringPointer* arg1, StringPointer* arg2, const ZigString* arg3, uint32_t count) diff --git a/src/bun.js/bindings/bindings.zig b/src/bun.js/bindings/bindings.zig index 54c574562..c9933ebce 100644 --- a/src/bun.js/bindings/bindings.zig +++ b/src/bun.js/bindings/bindings.zig @@ -1758,19 +1758,6 @@ pub const SourceCode = extern struct { pub const Thenables = opaque {}; -pub const StrongValue = opaque { - pub const shim = Shimmer("JSC", "JSFunction", @This()); - - const cppFn = shim.cppFn; - pub const include = "JavaScriptCore/JSFunction.h"; - pub const name = "JSC::JSFunction"; - pub const namespace = "JSC"; - - pub fn get(this: *StrongValue) JSValue { - return cppFn("get", .{this}); - } -}; - pub const JSFunction = extern struct { pub const shim = Shimmer("JSC", "JSFunction", @This()); bytes: shim.Bytes, @@ -2685,7 +2672,7 @@ pub const JSValue = enum(JSValueReprInt) { this.asObjectRef(), @ptrCast(JSC.C.JSValueRef, thisValue.asNullableVoid()), args.len, - @ptrCast([*]const JSC.C.JSValueRef, args.ptr), + @ptrCast(?[*]const JSC.C.JSValueRef, args.ptr), ); } @@ -3571,6 +3558,32 @@ pub const VM = extern struct { return cppFn("deleteAllCode", .{ vm, global_object }); } + extern fn Bun__setOnEachMicrotaskTick(vm: *VM, ptr: ?*anyopaque, callback: ?(fn (*anyopaque) callconv(.C) void)) void; + + pub fn onEachMicrotask(vm: *VM, comptime Ptr: type, ptr: *Ptr, comptime callback: fn (*Ptr) void) void { + if (comptime is_bindgen) { + return; + } + + const callback_ = callback; + const Wrapper = struct { + pub fn run(ptr_: *anyopaque) callconv(.C) void { + var ptr__ = @ptrCast(*Ptr, @alignCast(@alignOf(Ptr), ptr_)); + callback_(ptr__); + } + }; + + Bun__setOnEachMicrotaskTick(vm, ptr, Wrapper.run); + } + + pub fn clearMicrotaskCallback(vm: *VM) void { + if (comptime is_bindgen) { + return; + } + + Bun__setOnEachMicrotaskTick(vm, null, null); + } + pub fn whenIdle( vm: *VM, callback: fn (...) callconv(.C) void, diff --git a/src/bun.js/bindings/exports.zig b/src/bun.js/bindings/exports.zig index 1d9eddf49..50755a31a 100644 --- a/src/bun.js/bindings/exports.zig +++ b/src/bun.js/bindings/exports.zig @@ -2758,7 +2758,7 @@ pub const HTTPServerRequestContext = JSC.API.Server.RequestContext; pub const HTTPSSLServerRequestContext = JSC.API.SSLServer.RequestContext; pub const HTTPDebugServerRequestContext = JSC.API.DebugServer.RequestContext; pub const HTTPDebugSSLServerRequestContext = JSC.API.DebugSSLServer.RequestContext; - +pub const TestScope = @import("../test/jest.zig").TestScope; comptime { if (!is_bindgen) { WebSocketHTTPClient.shim.ref(); @@ -2782,10 +2782,11 @@ comptime { JSHTTPResponseSink.shim.ref(); JSHTTPSResponseSink.shim.ref(); JSFileSink.shim.ref(); - JSReadableStreamBytes.shim.ref(); JSReadableStreamFile.shim.ref(); _ = ZigString__free; _ = ZigString__free_global; + + TestScope.shim.ref(); } } diff --git a/src/bun.js/bindings/headers-cpp.h b/src/bun.js/bindings/headers-cpp.h index 73446d12e..976d4e940 100644 --- a/src/bun.js/bindings/headers-cpp.h +++ b/src/bun.js/bindings/headers-cpp.h @@ -1,4 +1,4 @@ -//-- AUTOGENERATED FILE -- 1664343178 +//-- AUTOGENERATED FILE -- 1664421569 // clang-format off #pragma once diff --git a/src/bun.js/bindings/headers.h b/src/bun.js/bindings/headers.h index 91652804a..365ed5c8e 100644 --- a/src/bun.js/bindings/headers.h +++ b/src/bun.js/bindings/headers.h @@ -1,5 +1,5 @@ // clang-format off -//-- AUTOGENERATED FILE -- 1664343178 +//-- AUTOGENERATED FILE -- 1664421569 #pragma once #include <stddef.h> @@ -1026,3 +1026,10 @@ ZIG_DECL JSC__JSValue Bun__HTTPRequestContextDebugTLS__onResolve(JSC__JSGlobalOb ZIG_DECL JSC__JSValue Bun__HTTPRequestContextDebugTLS__onResolveStream(JSC__JSGlobalObject* arg0, JSC__CallFrame* arg1); #endif + +#ifdef __cplusplus + +ZIG_DECL JSC__JSValue Bun__TestScope__onReject(JSC__JSGlobalObject* arg0, JSC__CallFrame* arg1); +ZIG_DECL JSC__JSValue Bun__TestScope__onResolve(JSC__JSGlobalObject* arg0, JSC__CallFrame* arg1); + +#endif diff --git a/src/bun.js/bindings/napi.cpp b/src/bun.js/bindings/napi.cpp index abd603c41..f4897db43 100644 --- a/src/bun.js/bindings/napi.cpp +++ b/src/bun.js/bindings/napi.cpp @@ -132,13 +132,15 @@ void NapiRef::unref() bool clear = refCount == 1; refCount = refCount > 0 ? refCount - 1 : 0; if (clear) { - JSC::JSValue val = strongRef.get(); - if (val.isString()) { - weakValueRef.setString(val.toString(globalObject.get()), weakValueHandleOwner(), this); - } else if (val.isObject()) { - weakValueRef.setObject(val.getObject(), weakValueHandleOwner(), this); - } else { - weakValueRef.setPrimitive(val); + if (JSC::JSValue val = strongRef.get()) { + + if (val.isString()) { + weakValueRef.setString(val.toString(globalObject.get()), weakValueHandleOwner(), this); + } else if (val.isObject()) { + weakValueRef.setObject(val.getObject(), weakValueHandleOwner(), this); + } else { + weakValueRef.setPrimitive(val); + } } strongRef.clear(); } @@ -717,8 +719,7 @@ extern "C" napi_status napi_create_reference(napi_env env, napi_value value, JSC::JSValue val = toJS(value); - if (!val.isObject()) { - + if (!val || !val.isObject()) { return napi_object_expected; } diff --git a/src/bun.js/bindings/napi.h b/src/bun.js/bindings/napi.h index 754c34ec4..1df8fad8d 100644 --- a/src/bun.js/bindings/napi.h +++ b/src/bun.js/bindings/napi.h @@ -100,10 +100,8 @@ public: ~NapiRef() { - if (this->refCount > 0) { - this->refCount = 1; - this->unref(); - } + strongRef.clear(); + weakValueRef.clear(); } JSC::Weak<JSC::JSGlobalObject> globalObject; diff --git a/src/bun.js/event_loop.zig b/src/bun.js/event_loop.zig index d3d431597..56f2e661e 100644 --- a/src/bun.js/event_loop.zig +++ b/src/bun.js/event_loop.zig @@ -13,7 +13,6 @@ const TaggedPointerUnion = @import("../tagged_pointer.zig").TaggedPointerUnion; const typeBaseName = @import("../meta.zig").typeBaseName; const CopyFilePromiseTask = WebCore.Blob.Store.CopyFile.CopyFilePromiseTask; const AsyncTransformTask = @import("./api/transpiler.zig").TransformTask.AsyncTransformTask; -const BunTimerTimeoutTask = Bun.Timer.Timeout.TimeoutTask; const ReadFileTask = WebCore.Blob.Store.ReadFile.ReadFileTask; const WriteFileTask = WebCore.Blob.Store.WriteFile.WriteFileTask; const napi_async_work = JSC.napi.napi_async_work; @@ -175,7 +174,6 @@ pub const Task = TaggedPointerUnion(.{ Microtask, MicrotaskForDefaultGlobalObject, AsyncTransformTask, - BunTimerTimeoutTask, ReadFileTask, CopyFilePromiseTask, WriteFileTask, @@ -255,11 +253,6 @@ pub const EventLoop = struct { transform_task.*.runFromJS(); vm_.active_tasks -|= 1; }, - @field(Task.Tag, @typeName(BunTimerTimeoutTask)) => { - var transform_task: *BunTimerTimeoutTask = task.get(BunTimerTimeoutTask).?; - transform_task.*.runFromJS(); - vm_.active_tasks -|= 1; - }, @field(Task.Tag, @typeName(ReadFileTask)) => { var transform_task: *ReadFileTask = task.get(ReadFileTask).?; transform_task.*.runFromJS(); @@ -416,8 +409,8 @@ pub const EventLoop = struct { if (this.virtual_machine.uws_event_loop == null) { var actual = uws.Loop.get().?; this.virtual_machine.uws_event_loop = actual; - _ = actual.addPostHandler(*JSC.EventLoop, this, JSC.EventLoop.afterUSocketsTick); - _ = actual.addPreHandler(*JSC.VM, this.virtual_machine.global.vm(), JSC.VM.drainMicrotasks); + // _ = actual.addPostHandler(*JSC.EventLoop, this, JSC.EventLoop.afterUSocketsTick); + // _ = actual.addPreHandler(*JSC.VM, this.virtual_machine.global.vm(), JSC.VM.drainMicrotasks); } } @@ -440,10 +433,8 @@ pub const EventLoop = struct { this.concurrent_tasks.push(task); if (this.virtual_machine.uws_event_loop) |loop| { - const deferCount = this.defer_count.fetchAdd(1, .Monotonic); - if (deferCount == 0) { - loop.wakeup(); - } + _ = this.defer_count.fetchAdd(1, .Monotonic); + loop.wakeup(); } } }; diff --git a/src/bun.js/javascript.zig b/src/bun.js/javascript.zig index ae1832b21..52ac2f1fb 100644 --- a/src/bun.js/javascript.zig +++ b/src/bun.js/javascript.zig @@ -412,10 +412,7 @@ pub const VirtualMachine = struct { return this.event_loop; } - pub fn prepareLoop(this: *VirtualMachine) void { - var loop = this.uws_event_loop.?; - _ = loop.addPostHandler(*JSC.EventLoop, this.eventLoop(), JSC.EventLoop.tick); - } + pub fn prepareLoop(_: *VirtualMachine) void {} pub fn enterUWSLoop(this: *VirtualMachine) void { var loop = this.uws_event_loop.?; @@ -1473,7 +1470,7 @@ pub const VirtualMachine = struct { this.waitForPromise(promise); if (this.eventLoop().start_server_on_next_tick) { - this.enterUWSLoop(); + this.uws_event_loop.?.tick(); } return promise; |