aboutsummaryrefslogtreecommitdiff
path: root/src/javascript/jsc/bindings/Process.cpp
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-03-14 23:37:56 -0700
committerGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-03-14 23:37:56 -0700
commitaff9d232b1e7dfbac5fa1b18631aba18ed5f27e7 (patch)
tree58585821c513125967ae276174fee06a4d1668bf /src/javascript/jsc/bindings/Process.cpp
parentd0a9b404c39842755b452b93547ee85fe2b368ad (diff)
downloadbun-aff9d232b1e7dfbac5fa1b18631aba18ed5f27e7.tar.gz
bun-aff9d232b1e7dfbac5fa1b18631aba18ed5f27e7.tar.zst
bun-aff9d232b1e7dfbac5fa1b18631aba18ed5f27e7.zip
Unlimited arguments in process.nextTick
Diffstat (limited to 'src/javascript/jsc/bindings/Process.cpp')
-rw-r--r--src/javascript/jsc/bindings/Process.cpp86
1 files changed, 38 insertions, 48 deletions
diff --git a/src/javascript/jsc/bindings/Process.cpp b/src/javascript/jsc/bindings/Process.cpp
index c61bd5db7..3502563b6 100644
--- a/src/javascript/jsc/bindings/Process.cpp
+++ b/src/javascript/jsc/bindings/Process.cpp
@@ -1,7 +1,7 @@
#include "Process.h"
+#include <JavaScriptCore/DeferredWorkTimer.h>
#include <JavaScriptCore/JSMicrotask.h>
#include <JavaScriptCore/ObjectConstructor.h>
-
#pragma mark - Node.js Process
namespace Zig {
@@ -50,55 +50,45 @@ static JSC_DEFINE_HOST_FUNCTION(Process_functionNextTick,
return JSC::JSValue::encode(JSC::JSValue {});
}
- switch (argCount) {
-
- case 1: {
- // This is a JSC builtin function
- globalObject->queueMicrotask(JSC::createJSMicrotask(vm, job, JSC::JSValue {}, JSC::JSValue {},
- JSC::JSValue {}, JSC::JSValue {}));
- break;
- }
-
- case 2:
- case 3:
- case 4:
- case 5: {
- JSC::JSValue argument0 = callFrame->uncheckedArgument(1);
- JSC::JSValue argument1 = argCount > 2 ? callFrame->uncheckedArgument(2) : JSC::JSValue {};
- JSC::JSValue argument2 = argCount > 3 ? callFrame->uncheckedArgument(3) : JSC::JSValue {};
- JSC::JSValue argument3 = argCount > 4 ? callFrame->uncheckedArgument(4) : JSC::JSValue {};
- globalObject->queueMicrotask(
- JSC::createJSMicrotask(vm, job, argument0, argument1, argument2, argument3));
- break;
+ Vector<JSC::Strong<JSC::JSCell>> dependencies;
+ WTF::Vector<JSC::JSValue, 16> args;
+ args.reserveInitialCapacity(argCount);
+ dependencies.append(JSC::Strong<JSC::JSCell>(vm, globalObject));
+ for (unsigned i = 1; i < argCount; i++) {
+ if (callFrame->uncheckedArgument(i).isCell()) {
+ dependencies.append(JSC::Strong<JSC::JSCell>(vm, callFrame->uncheckedArgument(i).asCell()));
+ }
+ args.append(callFrame->uncheckedArgument(i));
}
- default: {
- auto scope = DECLARE_THROW_SCOPE(globalObject->vm());
- JSC::throwTypeError(globalObject, scope,
- "nextTick doesn't support more than 4 arguments currently"_s);
- return JSC::JSValue::encode(JSC::JSValue {});
-
- break;
- }
-
- // JSC::MarkedArgumentBuffer args;
- // for (unsigned i = 1; i < callFrame->argumentCount(); i++) {
- // args.append(callFrame->uncheckedArgument(i));
- // }
-
- // JSC::ArgList argsList(args);
- // JSC::gcProtect(job);
- // JSC::JSFunction *callback = JSC::JSNativeStdFunction::create(
- // vm, globalObject, 0, String(),
- // [job, &argsList](JSC::JSGlobalObject *globalObject, JSC::CallFrame *callFrame) {
- // JSC::VM &vm = globalObject->vm();
- // auto callData = getCallData(vm, job);
-
- // return JSC::JSValue::encode(JSC::call(globalObject, job, callData, job, argsList));
- // });
-
- // globalObject->queueMicrotask(JSC::createJSMicrotask(vm, JSC::JSValue(callback)));
- }
+ auto ticket = vm.deferredWorkTimer->addPendingWork(vm, job.getObject(), WTFMove(dependencies));
+ vm.deferredWorkTimer->scheduleWorkSoon(ticket, [job, args](DeferredWorkTimer::Ticket) {
+ JSGlobalObject* globalObject = job.getObject()->globalObject();
+
+ JSC::MarkedArgumentBuffer argsBuffer;
+ for (auto& arg : args) {
+ argsBuffer.append(arg);
+ }
+ call(globalObject, job, jsUndefined(), argsBuffer, "If you see this, it's a bug in bun!");
+ });
+
+ // JSC::MarkedArgumentBuffer args;
+ // for (unsigned i = 1; i < callFrame->argumentCount(); i++) {
+ // args.append(callFrame->uncheckedArgument(i));
+ // }
+
+ // JSC::ArgList argsList(args);
+ // JSC::gcProtect(job);
+ // JSC::JSFunction *callback = JSC::JSNativeStdFunction::create(
+ // vm, globalObject, 0, String(),
+ // [job, &argsList](JSC::JSGlobalObject *globalObject, JSC::CallFrame *callFrame) {
+ // JSC::VM &vm = globalObject->vm();
+ // auto callData = getCallData(vm, job);
+
+ // return JSC::JSValue::encode(JSC::call(globalObject, job, callData, job, argsList));
+ // });
+
+ // globalObject->queueMicrotask(JSC::createJSMicrotask(vm, JSC::JSValue(callback)));
return JSC::JSValue::encode(JSC::jsUndefined());
}