diff options
author | 2022-03-14 23:37:56 -0700 | |
---|---|---|
committer | 2022-03-14 23:37:56 -0700 | |
commit | aff9d232b1e7dfbac5fa1b18631aba18ed5f27e7 (patch) | |
tree | 58585821c513125967ae276174fee06a4d1668bf /src/javascript/jsc/bindings/Process.cpp | |
parent | d0a9b404c39842755b452b93547ee85fe2b368ad (diff) | |
download | bun-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.cpp | 86 |
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()); } |