#include "config.h"
#include "JSJob.h"
#include "CatchScope.h"
#include "Error.h"
#include "Exception.h"
#include "JSCInlines.h"
#include "JSGlobalObject.h"
#include "JSObjectInlines.h"
#include "Microtask.h"
#include "StrongInlines.h"
namespace JSC {
class JSJobMicrotask final : public Microtask {
public:
JSJobMicrotask(VM& vm, JSValue job, JSArray* arguments)
{
m_job.set(vm, job);
m_arguments.set(vm, arguments);
}
virtual ~JSJobMicrotask()
{
}
private:
void run(ExecState*) override;
Strong<Unknown> m_job;
Strong<JSArray> m_arguments;
};
Ref<Microtask> createJSJob(VM& vm, JSValue job, JSArray* arguments)
{
return adoptRef(*new JSJobMicrotask(vm, job, arguments));
}
void JSJobMicrotask::run(ExecState* exec)
{
VM& vm = exec->vm();
auto scope = DECLARE_CATCH_SCOPE(vm);
CallData handlerCallData;
CallType handlerCallType = getCallData(vm, m_job.get(), handlerCallData);
ASSERT(handlerCallType != CallType::None);
MarkedArgumentBuffer handlerArguments;
for (unsigned index = 0, length = m_arguments->length(); index < length; ++index) {
JSValue arg = m_arguments->JSArray::get(exec, index);
CLEAR_AND_RETURN_IF_EXCEPTION(scope, handlerArguments.overflowCheckNotNeeded());
handlerArguments.append(arg);
}
if (UNLIKELY(handlerArguments.hasOverflowed()))
return;
profiledCall(exec, ProfilingReason::Microtask, m_job.get(), handlerCallType, handlerCallData, jsUndefined(), handlerArguments);
scope.clearException();
}
}