aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-09-28 23:34:03 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-09-28 23:34:03 -0700
commit16929129f0259c63f63d7db20e2121dc2581deaa (patch)
tree8a384c4706425c4dd6b6c6b90302374f223e219e /src
parent524e48a81dfc6106ffcdd07b6fd035000b03146c (diff)
downloadbun-16929129f0259c63f63d7db20e2121dc2581deaa.tar.gz
bun-16929129f0259c63f63d7db20e2121dc2581deaa.tar.zst
bun-16929129f0259c63f63d7db20e2121dc2581deaa.zip
Clean up some of the event loop code
Diffstat (limited to 'src')
-rw-r--r--src/bun.js/base.zig13
-rw-r--r--src/bun.js/bindings/ZigGlobalObject.cpp12
-rw-r--r--src/bun.js/bindings/ZigGlobalObject.h9
-rw-r--r--src/bun.js/bindings/bindings.cpp29
-rw-r--r--src/bun.js/bindings/bindings.zig41
-rw-r--r--src/bun.js/bindings/exports.zig5
-rw-r--r--src/bun.js/bindings/headers-cpp.h2
-rw-r--r--src/bun.js/bindings/headers.h9
-rw-r--r--src/bun.js/bindings/napi.cpp19
-rw-r--r--src/bun.js/bindings/napi.h6
-rw-r--r--src/bun.js/event_loop.zig17
-rw-r--r--src/bun.js/javascript.zig7
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;