From ca6013acef2011ea5130836968b4d5a6c9243cb5 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Tue, 8 Oct 2024 23:04:05 -0700 Subject: [PATCH] move .clang-format up a folder so it affects all our c/cpp files (#14400) Co-authored-by: nektro --- .github/workflows/clang-format.yml | 2 +- src/{bun.js/bindings => }/.clang-format | 0 src/bake/BakeDevGlobalObject.cpp | 170 ++-- src/bun.js/modules/BunObjectModule.cpp | 24 +- src/bun.js/modules/NodeModuleModule.cpp | 1016 ++++++++++++----------- src/bun.js/modules/NodeTTYModule.cpp | 55 +- src/bun.js/modules/ObjectModule.cpp | 157 ++-- src/io/io_darwin.cpp | 188 +++-- 8 files changed, 823 insertions(+), 789 deletions(-) rename src/{bun.js/bindings => }/.clang-format (100%) diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml index c9a5a23b9a..4684d8ad1f 100644 --- a/.github/workflows/clang-format.yml +++ b/.github/workflows/clang-format.yml @@ -33,7 +33,7 @@ jobs: env: LLVM_VERSION: ${{ env.LLVM_VERSION }} run: | - bun run clang-format:diff + bun run clang-format - name: Commit uses: stefanzweifel/git-auto-commit-action@v5 with: diff --git a/src/bun.js/bindings/.clang-format b/src/.clang-format similarity index 100% rename from src/bun.js/bindings/.clang-format rename to src/.clang-format diff --git a/src/bake/BakeDevGlobalObject.cpp b/src/bake/BakeDevGlobalObject.cpp index bb9b626169..de00154005 100644 --- a/src/bake/BakeDevGlobalObject.cpp +++ b/src/bake/BakeDevGlobalObject.cpp @@ -7,108 +7,112 @@ namespace Bake { -extern "C" void BakeInitProcessIdentifier() { - // assert is on main thread - WebCore::Process::identifier(); +extern "C" void BakeInitProcessIdentifier() +{ + // assert is on main thread + WebCore::Process::identifier(); } -JSC::JSInternalPromise * -moduleLoaderImportModule(JSC::JSGlobalObject *jsGlobalObject, - JSC::JSModuleLoader *, JSC::JSString *moduleNameValue, - JSC::JSValue parameters, - const JSC::SourceOrigin &sourceOrigin) { - // TODO: forward this to the runtime? - JSC::VM &vm = jsGlobalObject->vm(); - auto err = JSC::createTypeError( - jsGlobalObject, - WTF::makeString( - "Dynamic import should have been replaced with a hook into the module runtime"_s)); - auto *promise = JSC::JSInternalPromise::create( - vm, jsGlobalObject->internalPromiseStructure()); - promise->reject(jsGlobalObject, err); - return promise; +JSC::JSInternalPromise* +moduleLoaderImportModule(JSC::JSGlobalObject* jsGlobalObject, + JSC::JSModuleLoader*, JSC::JSString* moduleNameValue, + JSC::JSValue parameters, + const JSC::SourceOrigin& sourceOrigin) +{ + // TODO: forward this to the runtime? + JSC::VM& vm = jsGlobalObject->vm(); + auto err = JSC::createTypeError( + jsGlobalObject, + WTF::makeString( + "Dynamic import should have been replaced with a hook into the module runtime"_s)); + auto* promise = JSC::JSInternalPromise::create( + vm, jsGlobalObject->internalPromiseStructure()); + promise->reject(jsGlobalObject, err); + return promise; } -#define INHERIT_HOOK_METHOD(name) \ - Zig::GlobalObject::s_globalObjectMethodTable.name +#define INHERIT_HOOK_METHOD(name) \ + Zig::GlobalObject::s_globalObjectMethodTable.name -const JSC::GlobalObjectMethodTable DevGlobalObject::s_globalObjectMethodTable = - { - INHERIT_HOOK_METHOD(supportsRichSourceInfo), - INHERIT_HOOK_METHOD(shouldInterruptScript), - INHERIT_HOOK_METHOD(javaScriptRuntimeFlags), - INHERIT_HOOK_METHOD(queueMicrotaskToEventLoop), - INHERIT_HOOK_METHOD(shouldInterruptScriptBeforeTimeout), - moduleLoaderImportModule, - INHERIT_HOOK_METHOD(moduleLoaderResolve), - INHERIT_HOOK_METHOD(moduleLoaderFetch), - INHERIT_HOOK_METHOD(moduleLoaderCreateImportMetaProperties), - INHERIT_HOOK_METHOD(moduleLoaderEvaluate), - INHERIT_HOOK_METHOD(promiseRejectionTracker), - INHERIT_HOOK_METHOD(reportUncaughtExceptionAtEventLoop), - INHERIT_HOOK_METHOD(currentScriptExecutionOwner), - INHERIT_HOOK_METHOD(scriptExecutionStatus), - INHERIT_HOOK_METHOD(reportViolationForUnsafeEval), - INHERIT_HOOK_METHOD(defaultLanguage), - INHERIT_HOOK_METHOD(compileStreaming), - INHERIT_HOOK_METHOD(instantiateStreaming), - INHERIT_HOOK_METHOD(deriveShadowRealmGlobalObject), - INHERIT_HOOK_METHOD(codeForEval), - INHERIT_HOOK_METHOD(canCompileStrings), +const JSC::GlobalObjectMethodTable DevGlobalObject::s_globalObjectMethodTable = { + INHERIT_HOOK_METHOD(supportsRichSourceInfo), + INHERIT_HOOK_METHOD(shouldInterruptScript), + INHERIT_HOOK_METHOD(javaScriptRuntimeFlags), + INHERIT_HOOK_METHOD(queueMicrotaskToEventLoop), + INHERIT_HOOK_METHOD(shouldInterruptScriptBeforeTimeout), + moduleLoaderImportModule, + INHERIT_HOOK_METHOD(moduleLoaderResolve), + INHERIT_HOOK_METHOD(moduleLoaderFetch), + INHERIT_HOOK_METHOD(moduleLoaderCreateImportMetaProperties), + INHERIT_HOOK_METHOD(moduleLoaderEvaluate), + INHERIT_HOOK_METHOD(promiseRejectionTracker), + INHERIT_HOOK_METHOD(reportUncaughtExceptionAtEventLoop), + INHERIT_HOOK_METHOD(currentScriptExecutionOwner), + INHERIT_HOOK_METHOD(scriptExecutionStatus), + INHERIT_HOOK_METHOD(reportViolationForUnsafeEval), + INHERIT_HOOK_METHOD(defaultLanguage), + INHERIT_HOOK_METHOD(compileStreaming), + INHERIT_HOOK_METHOD(instantiateStreaming), + INHERIT_HOOK_METHOD(deriveShadowRealmGlobalObject), + INHERIT_HOOK_METHOD(codeForEval), + INHERIT_HOOK_METHOD(canCompileStrings), }; -DevGlobalObject * -DevGlobalObject::create(JSC::VM &vm, JSC::Structure *structure, - const JSC::GlobalObjectMethodTable *methodTable) { - DevGlobalObject *ptr = new (NotNull, JSC::allocateCell(vm)) - DevGlobalObject(vm, structure, methodTable); - ptr->finishCreation(vm); - return ptr; +DevGlobalObject* +DevGlobalObject::create(JSC::VM& vm, JSC::Structure* structure, + const JSC::GlobalObjectMethodTable* methodTable) +{ + DevGlobalObject* ptr = new (NotNull, JSC::allocateCell(vm)) + DevGlobalObject(vm, structure, methodTable); + ptr->finishCreation(vm); + return ptr; } -void DevGlobalObject::finishCreation(JSC::VM &vm) { - Base::finishCreation(vm); - ASSERT(inherits(info())); +void DevGlobalObject::finishCreation(JSC::VM& vm) +{ + Base::finishCreation(vm); + ASSERT(inherits(info())); } -extern "C" BunVirtualMachine *Bun__getVM(); +extern "C" BunVirtualMachine* Bun__getVM(); // A lot of this function is taken from 'Zig__GlobalObject__create' -extern "C" DevGlobalObject *BakeCreateDevGlobal(DevServer *owner, - void *console) { - JSC::VM &vm = JSC::VM::create(JSC::HeapType::Large).leakRef(); - vm.heap.acquireAccess(); - JSC::JSLockHolder locker(vm); - BunVirtualMachine *bunVM = Bun__getVM(); - WebCore::JSVMClientData::create(&vm, bunVM); +extern "C" DevGlobalObject* BakeCreateDevGlobal(DevServer* owner, + void* console) +{ + JSC::VM& vm = JSC::VM::create(JSC::HeapType::Large).leakRef(); + vm.heap.acquireAccess(); + JSC::JSLockHolder locker(vm); + BunVirtualMachine* bunVM = Bun__getVM(); + WebCore::JSVMClientData::create(&vm, bunVM); - JSC::Structure *structure = DevGlobalObject::createStructure(vm); - DevGlobalObject *global = DevGlobalObject::create( - vm, structure, &DevGlobalObject::s_globalObjectMethodTable); - if (!global) - BUN_PANIC("Failed to create DevGlobalObject"); + JSC::Structure* structure = DevGlobalObject::createStructure(vm); + DevGlobalObject* global = DevGlobalObject::create( + vm, structure, &DevGlobalObject::s_globalObjectMethodTable); + if (!global) + BUN_PANIC("Failed to create DevGlobalObject"); - global->m_devServer = owner; - global->m_bunVM = bunVM; + global->m_devServer = owner; + global->m_bunVM = bunVM; - JSC::gcProtect(global); + JSC::gcProtect(global); - global->setConsole(console); - global->setStackTraceLimit(10); // Node.js defaults to 10 + global->setConsole(console); + global->setStackTraceLimit(10); // Node.js defaults to 10 - // TODO: it segfaults! process.nextTick is scoped out for now i guess! - // vm.setOnComputeErrorInfo(computeErrorInfoWrapper); - // vm.setOnEachMicrotaskTick([global](JSC::VM &vm) -> void { - // if (auto nextTickQueue = global->m_nextTickQueue.get()) { - // global->resetOnEachMicrotaskTick(); - // // Bun::JSNextTickQueue *queue = - // // jsCast(nextTickQueue); - // // queue->drain(vm, global); - // return; - // } - // }); + // TODO: it segfaults! process.nextTick is scoped out for now i guess! + // vm.setOnComputeErrorInfo(computeErrorInfoWrapper); + // vm.setOnEachMicrotaskTick([global](JSC::VM &vm) -> void { + // if (auto nextTickQueue = global->m_nextTickQueue.get()) { + // global->resetOnEachMicrotaskTick(); + // // Bun::JSNextTickQueue *queue = + // // jsCast(nextTickQueue); + // // queue->drain(vm, global); + // return; + // } + // }); - return global; + return global; } }; // namespace Bake diff --git a/src/bun.js/modules/BunObjectModule.cpp b/src/bun.js/modules/BunObjectModule.cpp index 910614ce3f..f018845674 100644 --- a/src/bun.js/modules/BunObjectModule.cpp +++ b/src/bun.js/modules/BunObjectModule.cpp @@ -5,19 +5,19 @@ #include "ObjectModule.h" namespace Zig { -void generateNativeModule_BunObject(JSC::JSGlobalObject *lexicalGlobalObject, - JSC::Identifier moduleKey, - Vector &exportNames, - JSC::MarkedArgumentBuffer &exportValues) { - // FIXME: this does not add each property as a top level export - JSC::VM &vm = lexicalGlobalObject->vm(); - Zig::GlobalObject *globalObject = - jsCast(lexicalGlobalObject); +void generateNativeModule_BunObject(JSC::JSGlobalObject* lexicalGlobalObject, + JSC::Identifier moduleKey, + Vector& exportNames, + JSC::MarkedArgumentBuffer& exportValues) +{ + // FIXME: this does not add each property as a top level export + JSC::VM& vm = lexicalGlobalObject->vm(); + Zig::GlobalObject* globalObject = jsCast(lexicalGlobalObject); - JSObject *object = globalObject->bunObject(); + JSObject* object = globalObject->bunObject(); - exportNames.append(vm.propertyNames->defaultKeyword); - exportValues.append(object); + exportNames.append(vm.propertyNames->defaultKeyword); + exportValues.append(object); } -} // namespace Zig \ No newline at end of file +} // namespace Zig diff --git a/src/bun.js/modules/NodeModuleModule.cpp b/src/bun.js/modules/NodeModuleModule.cpp index 46d0cf36fb..f412eb6785 100644 --- a/src/bun.js/modules/NodeModuleModule.cpp +++ b/src/bun.js/modules/NodeModuleModule.cpp @@ -120,399 +120,406 @@ static constexpr ASCIILiteral builtinModuleNames[] = { "zlib"_s, }; -template consteval std::size_t countof(T (&)[N]) { - return N; +template consteval std::size_t countof(T (&)[N]) +{ + return N; } JSC_DEFINE_HOST_FUNCTION(jsFunctionDebugNoop, - (JSC::JSGlobalObject * globalObject, - JSC::CallFrame *callFrame)) { - return JSValue::encode(jsUndefined()); + (JSC::JSGlobalObject * globalObject, + JSC::CallFrame* callFrame)) +{ + return JSValue::encode(jsUndefined()); } JSC_DEFINE_HOST_FUNCTION(jsFunctionNodeModuleModuleCall, - (JSC::JSGlobalObject * globalObject, - JSC::CallFrame *callFrame)) { - return JSValue::encode(jsUndefined()); + (JSC::JSGlobalObject * globalObject, + JSC::CallFrame* callFrame)) +{ + return JSValue::encode(jsUndefined()); } JSC_DEFINE_HOST_FUNCTION(jsFunctionNodeModuleModuleConstructor, - (JSC::JSGlobalObject * globalObject, - JSC::CallFrame *callFrame)) { + (JSC::JSGlobalObject * globalObject, + JSC::CallFrame* callFrame)) +{ - // In node, this is supposed to be the actual CommonJSModule constructor. - // We are cutting a huge corner by not doing all that work. - // This code is only to support babel. - JSC::VM &vm = globalObject->vm(); - JSString *idString = JSC::jsString(vm, WTF::String("."_s)); + // In node, this is supposed to be the actual CommonJSModule constructor. + // We are cutting a huge corner by not doing all that work. + // This code is only to support babel. + JSC::VM& vm = globalObject->vm(); + JSString* idString = JSC::jsString(vm, WTF::String("."_s)); - JSString *dirname = jsEmptyString(vm); + JSString* dirname = jsEmptyString(vm); - // TODO: handle when JSGlobalObject !== Zig::GlobalObject, such as in node:vm - Structure *structure = static_cast(globalObject) - ->CommonJSModuleObjectStructure(); + // TODO: handle when JSGlobalObject !== Zig::GlobalObject, such as in node:vm + Structure* structure = static_cast(globalObject) + ->CommonJSModuleObjectStructure(); - // TODO: handle ShadowRealm, node:vm, new.target, subclasses - JSValue idValue = callFrame->argument(0); - JSValue parentValue = callFrame->argument(1); + // TODO: handle ShadowRealm, node:vm, new.target, subclasses + JSValue idValue = callFrame->argument(0); + JSValue parentValue = callFrame->argument(1); - auto scope = DECLARE_THROW_SCOPE(vm); - if (idValue.isString()) { - idString = idValue.toString(globalObject); - RETURN_IF_EXCEPTION(scope, {}); + auto scope = DECLARE_THROW_SCOPE(vm); + if (idValue.isString()) { + idString = idValue.toString(globalObject); + RETURN_IF_EXCEPTION(scope, {}); - auto index = idString->tryGetValue()->reverseFind('/', idString->length()); + auto index = idString->tryGetValue()->reverseFind('/', idString->length()); - if (index != WTF::notFound) { - dirname = JSC::jsSubstring(globalObject, idString, 0, index); + if (index != WTF::notFound) { + dirname = JSC::jsSubstring(globalObject, idString, 0, index); + } } - } - auto *out = Bun::JSCommonJSModule::create(vm, structure, idString, jsNull(), - dirname, SourceCode()); + auto* out = Bun::JSCommonJSModule::create(vm, structure, idString, jsNull(), + dirname, SourceCode()); - if (!parentValue.isUndefined()) { - out->putDirect(vm, JSC::Identifier::fromString(vm, "parent"_s), parentValue, - 0); - } + if (!parentValue.isUndefined()) { + out->putDirect(vm, JSC::Identifier::fromString(vm, "parent"_s), parentValue, + 0); + } - out->putDirect(vm, JSC::Identifier::fromString(vm, "exports"_s), - JSC::constructEmptyObject(globalObject, - globalObject->objectPrototype(), 0), - 0); + out->putDirect(vm, JSC::Identifier::fromString(vm, "exports"_s), + JSC::constructEmptyObject(globalObject, + globalObject->objectPrototype(), 0), + 0); - return JSValue::encode(out); + return JSValue::encode(out); } JSC_DEFINE_HOST_FUNCTION(jsFunctionIsBuiltinModule, - (JSC::JSGlobalObject * globalObject, - JSC::CallFrame *callFrame)) { - JSC::VM &vm = globalObject->vm(); - auto scope = DECLARE_THROW_SCOPE(vm); - JSValue moduleName = callFrame->argument(0); - if (!moduleName.isString()) { - return JSValue::encode(jsBoolean(false)); - } + (JSC::JSGlobalObject * globalObject, + JSC::CallFrame* callFrame)) +{ + JSC::VM& vm = globalObject->vm(); + auto scope = DECLARE_THROW_SCOPE(vm); + JSValue moduleName = callFrame->argument(0); + if (!moduleName.isString()) { + return JSValue::encode(jsBoolean(false)); + } - auto moduleStr = moduleName.toWTFString(globalObject); - RETURN_IF_EXCEPTION(scope, JSValue::encode(jsBoolean(false))); + auto moduleStr = moduleName.toWTFString(globalObject); + RETURN_IF_EXCEPTION(scope, JSValue::encode(jsBoolean(false))); - return JSValue::encode(jsBoolean(Bun::isBuiltinModule(moduleStr))); + return JSValue::encode(jsBoolean(Bun::isBuiltinModule(moduleStr))); } -JSC_DEFINE_HOST_FUNCTION(jsFunctionWrap, (JSC::JSGlobalObject * globalObject, - JSC::CallFrame *callFrame)) { - auto &vm = globalObject->vm(); - auto scope = DECLARE_THROW_SCOPE(vm); - JSString *code = callFrame->argument(0).toStringOrNull(globalObject); - RETURN_IF_EXCEPTION(scope, {}); - if (!code) { - return JSC::JSValue::encode(JSC::jsUndefined()); - } +JSC_DEFINE_HOST_FUNCTION(jsFunctionWrap, (JSC::JSGlobalObject * globalObject, JSC::CallFrame* callFrame)) +{ + auto& vm = globalObject->vm(); + auto scope = DECLARE_THROW_SCOPE(vm); + JSString* code = callFrame->argument(0).toStringOrNull(globalObject); + RETURN_IF_EXCEPTION(scope, {}); + if (!code) { + return JSC::JSValue::encode(JSC::jsUndefined()); + } - JSString *prefix = jsString( - vm, - String( - "(function (exports, require, module, __filename, __dirname) { "_s)); - JSString *suffix = jsString(vm, String("\n});"_s)); + JSString* prefix = jsString( + vm, + String( + "(function (exports, require, module, __filename, __dirname) { "_s)); + JSString* suffix = jsString(vm, String("\n});"_s)); - return JSValue::encode(jsString(globalObject, prefix, code, suffix)); + return JSValue::encode(jsString(globalObject, prefix, code, suffix)); } -extern "C" void Bun__Node__Path_joinWTF(BunString *lhs, const char *rhs, - size_t len, BunString *result); +extern "C" void Bun__Node__Path_joinWTF(BunString* lhs, const char* rhs, + size_t len, BunString* result); JSC_DEFINE_HOST_FUNCTION(jsFunctionNodeModuleCreateRequire, - (JSC::JSGlobalObject * globalObject, - JSC::CallFrame *callFrame)) { - JSC::VM &vm = globalObject->vm(); - auto scope = DECLARE_THROW_SCOPE(vm); - if (callFrame->argumentCount() < 1) { - return Bun::throwError(globalObject, scope, - Bun::ErrorCode::ERR_MISSING_ARGS, - "createRequire() requires at least one argument"_s); - } - - auto val = callFrame->uncheckedArgument(0).toWTFString(globalObject); - RETURN_IF_EXCEPTION(scope, {}); - - if (val.startsWith("file://"_s)) { - WTF::URL url(val); - if (!url.isValid()) { - throwTypeError(globalObject, scope, - makeString("createRequire() was given an invalid URL '"_s, - url.string(), "'"_s)); - RELEASE_AND_RETURN(scope, JSValue::encode({})); + (JSC::JSGlobalObject * globalObject, + JSC::CallFrame* callFrame)) +{ + JSC::VM& vm = globalObject->vm(); + auto scope = DECLARE_THROW_SCOPE(vm); + if (callFrame->argumentCount() < 1) { + return Bun::throwError(globalObject, scope, + Bun::ErrorCode::ERR_MISSING_ARGS, + "createRequire() requires at least one argument"_s); } - if (!url.protocolIsFile()) { - throwTypeError(globalObject, scope, - "createRequire() does not support non-file URLs"_s); - RELEASE_AND_RETURN(scope, JSValue::encode({})); - } - val = url.fileSystemPath(); - } - bool trailingSlash = val.endsWith('/'); + auto val = callFrame->uncheckedArgument(0).toWTFString(globalObject); + RETURN_IF_EXCEPTION(scope, {}); + + if (val.startsWith("file://"_s)) { + WTF::URL url(val); + if (!url.isValid()) { + throwTypeError(globalObject, scope, + makeString("createRequire() was given an invalid URL '"_s, + url.string(), "'"_s)); + RELEASE_AND_RETURN(scope, JSValue::encode({})); + } + if (!url.protocolIsFile()) { + throwTypeError(globalObject, scope, + "createRequire() does not support non-file URLs"_s); + RELEASE_AND_RETURN(scope, JSValue::encode({})); + } + val = url.fileSystemPath(); + } + + bool trailingSlash = val.endsWith('/'); #if OS(WINDOWS) - if (val.endsWith('\\')) { - trailingSlash = true; - } + if (val.endsWith('\\')) { + trailingSlash = true; + } #endif - // https://github.com/nodejs/node/blob/2eff28fb7a93d3f672f80b582f664a7c701569fb/lib/internal/modules/cjs/loader.js#L1603-L1620 - if (trailingSlash) { - BunString lhs = Bun::toString(val); - BunString result; - Bun__Node__Path_joinWTF(&lhs, "noop.js", sizeof("noop.js") - 1, &result); - val = result.toWTFString(); - if (!val.isNull()) { - ASSERT(val.impl()->refCount() == 2); - val.impl()->deref(); + // https://github.com/nodejs/node/blob/2eff28fb7a93d3f672f80b582f664a7c701569fb/lib/internal/modules/cjs/loader.js#L1603-L1620 + if (trailingSlash) { + BunString lhs = Bun::toString(val); + BunString result; + Bun__Node__Path_joinWTF(&lhs, "noop.js", sizeof("noop.js") - 1, &result); + val = result.toWTFString(); + if (!val.isNull()) { + ASSERT(val.impl()->refCount() == 2); + val.impl()->deref(); + } } - } - RETURN_IF_EXCEPTION(scope, {}); - RELEASE_AND_RETURN( - scope, JSValue::encode(Bun::JSCommonJSModule::createBoundRequireFunction( - vm, globalObject, val))); + RETURN_IF_EXCEPTION(scope, {}); + RELEASE_AND_RETURN( + scope, JSValue::encode(Bun::JSCommonJSModule::createBoundRequireFunction(vm, globalObject, val))); } JSC_DEFINE_HOST_FUNCTION(jsFunctionFindSourceMap, - (JSGlobalObject * globalObject, - CallFrame *callFrame)) { - auto &vm = globalObject->vm(); - auto scope = DECLARE_THROW_SCOPE(vm); - throwException( - globalObject, scope, - createError(globalObject, - "module.SourceMap is not yet implemented in Bun"_s)); - return {}; + (JSGlobalObject * globalObject, + CallFrame* callFrame)) +{ + auto& vm = globalObject->vm(); + auto scope = DECLARE_THROW_SCOPE(vm); + throwException( + globalObject, scope, + createError(globalObject, + "module.SourceMap is not yet implemented in Bun"_s)); + return {}; } JSC_DEFINE_HOST_FUNCTION(jsFunctionSyncBuiltinExports, - (JSGlobalObject * globalObject, - CallFrame *callFrame)) { - return JSValue::encode(jsUndefined()); + (JSGlobalObject * globalObject, + CallFrame* callFrame)) +{ + return JSValue::encode(jsUndefined()); } -JSC_DEFINE_HOST_FUNCTION(jsFunctionSourceMap, (JSGlobalObject * globalObject, - CallFrame *callFrame)) { - auto &vm = globalObject->vm(); - auto scope = DECLARE_THROW_SCOPE(vm); - throwException(globalObject, scope, - createError(globalObject, "Not implemented"_s)); - return {}; +JSC_DEFINE_HOST_FUNCTION(jsFunctionSourceMap, (JSGlobalObject * globalObject, CallFrame* callFrame)) +{ + auto& vm = globalObject->vm(); + auto scope = DECLARE_THROW_SCOPE(vm); + throwException(globalObject, scope, + createError(globalObject, "Not implemented"_s)); + return {}; } JSC_DEFINE_HOST_FUNCTION(jsFunctionResolveFileName, - (JSC::JSGlobalObject * globalObject, - JSC::CallFrame *callFrame)) { - JSC::VM &vm = globalObject->vm(); + (JSC::JSGlobalObject * globalObject, + JSC::CallFrame* callFrame)) +{ + JSC::VM& vm = globalObject->vm(); - switch (callFrame->argumentCount()) { - case 0: { - auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); - // not "requires" because "require" could be confusing - JSC::throwTypeError( - globalObject, scope, - "Module._resolveFilename needs 2+ arguments (a string)"_s); - scope.release(); - return JSC::JSValue::encode(JSC::JSValue{}); - } - default: { - JSC::JSValue moduleName = callFrame->argument(0); - JSC::JSValue fromValue = callFrame->argument(1); - - if (moduleName.isUndefinedOrNull()) { - auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); - JSC::throwTypeError(globalObject, scope, - "Module._resolveFilename expects a string"_s); - scope.release(); - return JSC::JSValue::encode(JSC::JSValue{}); + switch (callFrame->argumentCount()) { + case 0: { + auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); + // not "requires" because "require" could be confusing + JSC::throwTypeError( + globalObject, scope, + "Module._resolveFilename needs 2+ arguments (a string)"_s); + scope.release(); + return JSC::JSValue::encode(JSC::JSValue {}); } + default: { + JSC::JSValue moduleName = callFrame->argument(0); + JSC::JSValue fromValue = callFrame->argument(1); - if ( - // fast path: it's a real CommonJS module object. - auto *cjs = jsDynamicCast(fromValue)) { - fromValue = cjs->id(); - } else if - // slow path: userland code did something weird. lets let them do that - // weird thing. - (fromValue.isObject()) { - - if (auto idValue = fromValue.getObject()->getIfPropertyExists( - globalObject, builtinNames(vm).filenamePublicName())) { - if (idValue.isString()) { - fromValue = idValue; + if (moduleName.isUndefinedOrNull()) { + auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); + JSC::throwTypeError(globalObject, scope, + "Module._resolveFilename expects a string"_s); + scope.release(); + return JSC::JSValue::encode(JSC::JSValue {}); } - } + + if ( + // fast path: it's a real CommonJS module object. + auto* cjs = jsDynamicCast(fromValue)) { + fromValue = cjs->id(); + } else if + // slow path: userland code did something weird. lets let them do that + // weird thing. + (fromValue.isObject()) { + + if (auto idValue = fromValue.getObject()->getIfPropertyExists( + globalObject, builtinNames(vm).filenamePublicName())) { + if (idValue.isString()) { + fromValue = idValue; + } + } + } + + auto result = Bun__resolveSync(globalObject, JSC::JSValue::encode(moduleName), + JSValue::encode(fromValue), false); + auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); + + if (!JSC::JSValue::decode(result).isString()) { + JSC::throwException(globalObject, scope, JSC::JSValue::decode(result)); + return JSC::JSValue::encode(JSC::JSValue {}); + } + + scope.release(); + return result; } - - auto result = - Bun__resolveSync(globalObject, JSC::JSValue::encode(moduleName), - JSValue::encode(fromValue), false); - auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); - - if (!JSC::JSValue::decode(result).isString()) { - JSC::throwException(globalObject, scope, JSC::JSValue::decode(result)); - return JSC::JSValue::encode(JSC::JSValue{}); } - - scope.release(); - return result; - } - } } JSC_DEFINE_CUSTOM_GETTER(nodeModuleResolveFilename, - (JSGlobalObject * lexicalGlobalObject, - EncodedJSValue thisValue, - PropertyName propertyName)) { + (JSGlobalObject * lexicalGlobalObject, + EncodedJSValue thisValue, + PropertyName propertyName)) +{ - auto *globalObject = defaultGlobalObject(lexicalGlobalObject); - return JSValue::encode( - globalObject->m_moduleResolveFilenameFunction.getInitializedOnMainThread( - globalObject)); + auto* globalObject = defaultGlobalObject(lexicalGlobalObject); + return JSValue::encode( + globalObject->m_moduleResolveFilenameFunction.getInitializedOnMainThread( + globalObject)); } JSC_DEFINE_CUSTOM_SETTER(setNodeModuleResolveFilename, - (JSGlobalObject * lexicalGlobalObject, - EncodedJSValue thisValue, EncodedJSValue encodedValue, - PropertyName propertyName)) { - auto *globalObject = defaultGlobalObject(lexicalGlobalObject); - auto value = JSValue::decode(encodedValue); - if (value.isCell()) { - bool isOriginal = false; - if (value.isCallable()) { - JSC::CallData callData = JSC::getCallData(value); + (JSGlobalObject * lexicalGlobalObject, + EncodedJSValue thisValue, EncodedJSValue encodedValue, + PropertyName propertyName)) +{ + auto* globalObject = defaultGlobalObject(lexicalGlobalObject); + auto value = JSValue::decode(encodedValue); + if (value.isCell()) { + bool isOriginal = false; + if (value.isCallable()) { + JSC::CallData callData = JSC::getCallData(value); - if (callData.type == JSC::CallData::Type::Native) { - if (callData.native.function.untaggedPtr() == - &jsFunctionResolveFileName) { - isOriginal = true; + if (callData.type == JSC::CallData::Type::Native) { + if (callData.native.function.untaggedPtr() == &jsFunctionResolveFileName) { + isOriginal = true; + } + } } - } + globalObject->hasOverridenModuleResolveFilenameFunction = !isOriginal; + globalObject->m_moduleResolveFilenameFunction.set( + lexicalGlobalObject->vm(), globalObject, value.asCell()); } - globalObject->hasOverridenModuleResolveFilenameFunction = !isOriginal; - globalObject->m_moduleResolveFilenameFunction.set( - lexicalGlobalObject->vm(), globalObject, value.asCell()); - } - return true; + return true; } -extern "C" bool ModuleLoader__isBuiltin(const char *data, size_t len); +extern "C" bool ModuleLoader__isBuiltin(const char* data, size_t len); struct Parent { - JSArray *paths; - JSString *filename; + JSArray* paths; + JSString* filename; }; -Parent getParent(VM &vm, JSGlobalObject *global, JSValue maybe_parent) { - Parent value{nullptr, nullptr}; +Parent getParent(VM& vm, JSGlobalObject* global, JSValue maybe_parent) +{ + Parent value { nullptr, nullptr }; - if (!maybe_parent) { - return value; - } + if (!maybe_parent) { + return value; + } - auto parent = maybe_parent.getObject(); - if (!parent) { - return value; - } + auto parent = maybe_parent.getObject(); + if (!parent) { + return value; + } - auto scope = DECLARE_THROW_SCOPE(vm); - const auto &builtinNames = Bun::builtinNames(vm); - JSValue paths = parent->get(global, builtinNames.pathsPublicName()); - RETURN_IF_EXCEPTION(scope, value); - if (paths.isCell()) { - value.paths = jsDynamicCast(paths); - } + auto scope = DECLARE_THROW_SCOPE(vm); + const auto& builtinNames = Bun::builtinNames(vm); + JSValue paths = parent->get(global, builtinNames.pathsPublicName()); + RETURN_IF_EXCEPTION(scope, value); + if (paths.isCell()) { + value.paths = jsDynamicCast(paths); + } - JSValue filename = parent->get(global, builtinNames.filenamePublicName()); - RETURN_IF_EXCEPTION(scope, value); - if (filename.isString()) { - value.filename = filename.toString(global); - } - RELEASE_AND_RETURN(scope, value); + JSValue filename = parent->get(global, builtinNames.filenamePublicName()); + RETURN_IF_EXCEPTION(scope, value); + if (filename.isString()) { + value.filename = filename.toString(global); + } + RELEASE_AND_RETURN(scope, value); } // https://github.com/nodejs/node/blob/40ef9d541ed79470977f90eb445c291b95ab75a0/lib/internal/modules/cjs/loader.js#L895 JSC_DEFINE_HOST_FUNCTION(jsFunctionResolveLookupPaths, - (JSC::JSGlobalObject * globalObject, - JSC::CallFrame *callFrame)) { - auto &vm = globalObject->vm(); - auto scope = DECLARE_THROW_SCOPE(vm); + (JSC::JSGlobalObject * globalObject, + JSC::CallFrame* callFrame)) +{ + auto& vm = globalObject->vm(); + auto scope = DECLARE_THROW_SCOPE(vm); - String request = callFrame->argument(0).toWTFString(globalObject); - RETURN_IF_EXCEPTION(scope, {}); + String request = callFrame->argument(0).toWTFString(globalObject); + RETURN_IF_EXCEPTION(scope, {}); - auto utf8 = request.utf8(); - if (ModuleLoader__isBuiltin(utf8.data(), utf8.length())) { - return JSC::JSValue::encode(JSC::jsNull()); - } - - auto parent = getParent(vm, globalObject, callFrame->argument(1)); - RETURN_IF_EXCEPTION(scope, {}); - - // Check for node modules paths. - if (request.characterAt(0) != '.' || - (request.length() > 1 && request.characterAt(1) != '.' && - request.characterAt(1) != '/' && -#if OS(WINDOWS) - request.characterAt(1) != '\\' -#else - true -#endif - )) { - auto array = JSC::constructArray( - globalObject, (ArrayAllocationProfile *)nullptr, nullptr, 0); - if (parent.paths) { - auto len = parent.paths->length(); - for (size_t i = 0; i < len; i++) { - auto path = parent.paths->getIndex(globalObject, i); - array->push(globalObject, path); - } + auto utf8 = request.utf8(); + if (ModuleLoader__isBuiltin(utf8.data(), utf8.length())) { + return JSC::JSValue::encode(JSC::jsNull()); } - return JSValue::encode(array); - } - JSValue dirname; - if (parent.filename) { - EncodedJSValue encodedFilename = JSValue::encode(parent.filename); + auto parent = getParent(vm, globalObject, callFrame->argument(1)); + RETURN_IF_EXCEPTION(scope, {}); + + // Check for node modules paths. + if (request.characterAt(0) != '.' || (request.length() > 1 && request.characterAt(1) != '.' && request.characterAt(1) != '/' && #if OS(WINDOWS) - dirname = JSValue::decode( - Bun__Path__dirname(globalObject, true, &encodedFilename, 1)); + request.characterAt(1) != '\\' #else - dirname = JSValue::decode( - Bun__Path__dirname(globalObject, false, &encodedFilename, 1)); + true #endif - } else { - dirname = jsString(vm, String("."_s)); - } + )) { + auto array = JSC::constructArray( + globalObject, (ArrayAllocationProfile*)nullptr, nullptr, 0); + if (parent.paths) { + auto len = parent.paths->length(); + for (size_t i = 0; i < len; i++) { + auto path = parent.paths->getIndex(globalObject, i); + array->push(globalObject, path); + } + } + return JSValue::encode(array); + } - JSValue values[] = {dirname}; - auto array = JSC::constructArray( - globalObject, (ArrayAllocationProfile *)nullptr, values, 1); - RELEASE_AND_RETURN(scope, JSValue::encode(array)); + JSValue dirname; + if (parent.filename) { + EncodedJSValue encodedFilename = JSValue::encode(parent.filename); +#if OS(WINDOWS) + dirname = JSValue::decode( + Bun__Path__dirname(globalObject, true, &encodedFilename, 1)); +#else + dirname = JSValue::decode( + Bun__Path__dirname(globalObject, false, &encodedFilename, 1)); +#endif + } else { + dirname = jsString(vm, String("."_s)); + } + + JSValue values[] = { dirname }; + auto array = JSC::constructArray( + globalObject, (ArrayAllocationProfile*)nullptr, values, 1); + RELEASE_AND_RETURN(scope, JSValue::encode(array)); } -extern "C" JSC::EncodedJSValue NodeModuleModule__findPath(JSGlobalObject *, - BunString, JSArray *); +extern "C" JSC::EncodedJSValue NodeModuleModule__findPath(JSGlobalObject*, + BunString, JSArray*); -JSC_DEFINE_HOST_FUNCTION(jsFunctionFindPath, (JSGlobalObject * globalObject, - JSC::CallFrame *callFrame)) { - JSC::VM &vm = globalObject->vm(); - auto scope = DECLARE_THROW_SCOPE(vm); +JSC_DEFINE_HOST_FUNCTION(jsFunctionFindPath, (JSGlobalObject * globalObject, JSC::CallFrame* callFrame)) +{ + JSC::VM& vm = globalObject->vm(); + auto scope = DECLARE_THROW_SCOPE(vm); - JSValue request_value = callFrame->argument(0); - JSValue paths_value = callFrame->argument(1); + JSValue request_value = callFrame->argument(0); + JSValue paths_value = callFrame->argument(1); - String request = request_value.toWTFString(globalObject); - RETURN_IF_EXCEPTION(scope, {}); - BunString request_bun_str = Bun::toString(request); + String request = request_value.toWTFString(globalObject); + RETURN_IF_EXCEPTION(scope, {}); + BunString request_bun_str = Bun::toString(request); - JSArray *paths = - paths_value.isCell() ? jsDynamicCast(paths_value) : nullptr; + JSArray* paths = paths_value.isCell() ? jsDynamicCast(paths_value) : nullptr; - return NodeModuleModule__findPath(globalObject, request_bun_str, paths); + return NodeModuleModule__findPath(globalObject, request_bun_str, paths); } // These two setters are only used if you directly hit @@ -527,158 +534,171 @@ JSC_DEFINE_HOST_FUNCTION(jsFunctionFindPath, (JSGlobalObject * globalObject, // work (they do Module.prototype.require = ...) JSC_DEFINE_CUSTOM_GETTER(getterRequireFunction, - (JSC::JSGlobalObject * globalObject, - JSC::EncodedJSValue thisValue, JSC::PropertyName)) { - return JSValue::encode(globalObject->getDirect( - globalObject->vm(), WebCore::clientData(globalObject->vm()) - ->builtinNames() - .overridableRequirePrivateName())); + (JSC::JSGlobalObject * globalObject, + JSC::EncodedJSValue thisValue, JSC::PropertyName)) +{ + return JSValue::encode(globalObject->getDirect( + globalObject->vm(), WebCore::clientData(globalObject->vm())->builtinNames().overridableRequirePrivateName())); } JSC_DEFINE_CUSTOM_SETTER(setterRequireFunction, - (JSC::JSGlobalObject * globalObject, - JSC::EncodedJSValue thisValue, - JSC::EncodedJSValue value, - JSC::PropertyName propertyName)) { - globalObject->putDirect(globalObject->vm(), - WebCore::clientData(globalObject->vm()) - ->builtinNames() - .overridableRequirePrivateName(), - JSValue::decode(value), 0); - return true; + (JSC::JSGlobalObject * globalObject, + JSC::EncodedJSValue thisValue, + JSC::EncodedJSValue value, + JSC::PropertyName propertyName)) +{ + globalObject->putDirect(globalObject->vm(), + WebCore::clientData(globalObject->vm()) + ->builtinNames() + .overridableRequirePrivateName(), + JSValue::decode(value), 0); + return true; } -static JSValue getModuleCacheObject(VM &vm, JSObject *moduleObject) { - return jsCast(moduleObject->globalObject()) - ->lazyRequireCacheObject(); +static JSValue getModuleCacheObject(VM& vm, JSObject* moduleObject) +{ + return jsCast(moduleObject->globalObject()) + ->lazyRequireCacheObject(); } -static JSValue getModuleDebugObject(VM &vm, JSObject *moduleObject) { - return JSC::constructEmptyObject(moduleObject->globalObject()); +static JSValue getModuleDebugObject(VM& vm, JSObject* moduleObject) +{ + return JSC::constructEmptyObject(moduleObject->globalObject()); } -static JSValue getPathCacheObject(VM &vm, JSObject *moduleObject) { - auto *globalObject = defaultGlobalObject(moduleObject->globalObject()); - return JSC::constructEmptyObject( - vm, globalObject->nullPrototypeObjectStructure()); +static JSValue getPathCacheObject(VM& vm, JSObject* moduleObject) +{ + auto* globalObject = defaultGlobalObject(moduleObject->globalObject()); + return JSC::constructEmptyObject( + vm, globalObject->nullPrototypeObjectStructure()); } -static JSValue getModuleExtensionsObject(VM &vm, JSObject *moduleObject) { - auto *globalObject = defaultGlobalObject(moduleObject->globalObject()); - return globalObject->requireFunctionUnbound()->getIfPropertyExists( - globalObject, Identifier::fromString(vm, "extensions"_s)); +static JSValue getModuleExtensionsObject(VM& vm, JSObject* moduleObject) +{ + auto* globalObject = defaultGlobalObject(moduleObject->globalObject()); + return globalObject->requireFunctionUnbound()->getIfPropertyExists( + globalObject, Identifier::fromString(vm, "extensions"_s)); } -static JSValue getSourceMapFunction(VM &vm, JSObject *moduleObject) { - auto *globalObject = defaultGlobalObject(moduleObject->globalObject()); - JSFunction *sourceMapFunction = JSFunction::create( - vm, globalObject, 1, "SourceMap"_s, jsFunctionSourceMap, - ImplementationVisibility::Public, NoIntrinsic, jsFunctionSourceMap); - return sourceMapFunction; +static JSValue getSourceMapFunction(VM& vm, JSObject* moduleObject) +{ + auto* globalObject = defaultGlobalObject(moduleObject->globalObject()); + JSFunction* sourceMapFunction = JSFunction::create( + vm, globalObject, 1, "SourceMap"_s, jsFunctionSourceMap, + ImplementationVisibility::Public, NoIntrinsic, jsFunctionSourceMap); + return sourceMapFunction; } -static JSValue getBuiltinModulesObject(VM &vm, JSObject *moduleObject) { - MarkedArgumentBuffer args; - args.ensureCapacity(countof(builtinModuleNames)); +static JSValue getBuiltinModulesObject(VM& vm, JSObject* moduleObject) +{ + MarkedArgumentBuffer args; + args.ensureCapacity(countof(builtinModuleNames)); - for (unsigned i = 0; i < countof(builtinModuleNames); ++i) { - args.append(JSC::jsOwnedString(vm, String(builtinModuleNames[i]))); - } + for (unsigned i = 0; i < countof(builtinModuleNames); ++i) { + args.append(JSC::jsOwnedString(vm, String(builtinModuleNames[i]))); + } - auto *globalObject = defaultGlobalObject(moduleObject->globalObject()); - return JSC::constructArray( - globalObject, static_cast(nullptr), - JSC::ArgList(args)); + auto* globalObject = defaultGlobalObject(moduleObject->globalObject()); + return JSC::constructArray( + globalObject, static_cast(nullptr), + JSC::ArgList(args)); } -static JSValue getConstantsObject(VM &vm, JSObject *moduleObject) { - auto *globalObject = defaultGlobalObject(moduleObject->globalObject()); - auto *compileCacheStatus = JSC::constructEmptyObject( - vm, globalObject->nullPrototypeObjectStructure()); - compileCacheStatus->putDirect(vm, JSC::Identifier::fromString(vm, "FAILED"_s), - JSC::jsNumber(0)); - compileCacheStatus->putDirect( - vm, JSC::Identifier::fromString(vm, "ENABLED"_s), JSC::jsNumber(1)); - compileCacheStatus->putDirect( - vm, JSC::Identifier::fromString(vm, "ALREADY_ENABLED"_s), - JSC::jsNumber(2)); - compileCacheStatus->putDirect( - vm, JSC::Identifier::fromString(vm, "DISABLED"_s), JSC::jsNumber(3)); +static JSValue getConstantsObject(VM& vm, JSObject* moduleObject) +{ + auto* globalObject = defaultGlobalObject(moduleObject->globalObject()); + auto* compileCacheStatus = JSC::constructEmptyObject( + vm, globalObject->nullPrototypeObjectStructure()); + compileCacheStatus->putDirect(vm, JSC::Identifier::fromString(vm, "FAILED"_s), + JSC::jsNumber(0)); + compileCacheStatus->putDirect( + vm, JSC::Identifier::fromString(vm, "ENABLED"_s), JSC::jsNumber(1)); + compileCacheStatus->putDirect( + vm, JSC::Identifier::fromString(vm, "ALREADY_ENABLED"_s), + JSC::jsNumber(2)); + compileCacheStatus->putDirect( + vm, JSC::Identifier::fromString(vm, "DISABLED"_s), JSC::jsNumber(3)); - auto *constantsObject = JSC::constructEmptyObject( - vm, globalObject->nullPrototypeObjectStructure()); - constantsObject->putDirect( - vm, JSC::Identifier::fromString(vm, "compileCacheStatus"_s), - compileCacheStatus); - return constantsObject; + auto* constantsObject = JSC::constructEmptyObject( + vm, globalObject->nullPrototypeObjectStructure()); + constantsObject->putDirect( + vm, JSC::Identifier::fromString(vm, "compileCacheStatus"_s), + compileCacheStatus); + return constantsObject; } -static JSValue getGlobalPathsObject(VM &vm, JSObject *moduleObject) { - return JSC::constructEmptyArray( - moduleObject->globalObject(), - static_cast(nullptr), 0); +static JSValue getGlobalPathsObject(VM& vm, JSObject* moduleObject) +{ + return JSC::constructEmptyArray( + moduleObject->globalObject(), + static_cast(nullptr), 0); } -JSC_DEFINE_HOST_FUNCTION(jsFunctionInitPaths, (JSGlobalObject * globalObject, - JSC::CallFrame *callFrame)) { - return JSC::JSValue::encode(JSC::jsUndefined()); +JSC_DEFINE_HOST_FUNCTION(jsFunctionInitPaths, (JSGlobalObject * globalObject, JSC::CallFrame* callFrame)) +{ + return JSC::JSValue::encode(JSC::jsUndefined()); } -static JSValue getModulePrototypeObject(VM &vm, JSObject *moduleObject) { - auto *globalObject = defaultGlobalObject(moduleObject->globalObject()); - auto prototype = - constructEmptyObject(globalObject, globalObject->objectPrototype(), 2); +static JSValue getModulePrototypeObject(VM& vm, JSObject* moduleObject) +{ + auto* globalObject = defaultGlobalObject(moduleObject->globalObject()); + auto prototype = constructEmptyObject(globalObject, globalObject->objectPrototype(), 2); - prototype->putDirectCustomAccessor( - vm, WebCore::clientData(vm)->builtinNames().requirePublicName(), - JSC::CustomGetterSetter::create(vm, getterRequireFunction, - setterRequireFunction), - 0); + prototype->putDirectCustomAccessor( + vm, WebCore::clientData(vm)->builtinNames().requirePublicName(), + JSC::CustomGetterSetter::create(vm, getterRequireFunction, + setterRequireFunction), + 0); - return prototype; + return prototype; } -JSC_DEFINE_HOST_FUNCTION(jsFunctionLoad, (JSGlobalObject * globalObject, - JSC::CallFrame *callFrame)) { - return JSC::JSValue::encode(JSC::jsUndefined()); +JSC_DEFINE_HOST_FUNCTION(jsFunctionLoad, (JSGlobalObject * globalObject, JSC::CallFrame* callFrame)) +{ + return JSC::JSValue::encode(JSC::jsUndefined()); } -JSC_DEFINE_HOST_FUNCTION(jsFunctionRunMain, (JSGlobalObject * globalObject, - JSC::CallFrame *callFrame)) { - return JSC::JSValue::encode(JSC::jsUndefined()); +JSC_DEFINE_HOST_FUNCTION(jsFunctionRunMain, (JSGlobalObject * globalObject, JSC::CallFrame* callFrame)) +{ + return JSC::JSValue::encode(JSC::jsUndefined()); } JSC_DEFINE_HOST_FUNCTION(jsFunctionPreloadModules, - (JSGlobalObject * globalObject, - JSC::CallFrame *callFrame)) { - return JSC::JSValue::encode(JSC::jsUndefined()); + (JSGlobalObject * globalObject, + JSC::CallFrame* callFrame)) +{ + return JSC::JSValue::encode(JSC::jsUndefined()); } JSC_DEFINE_HOST_FUNCTION(jsFunctionSyncBuiltinESMExports, - (JSGlobalObject * globalObject, - JSC::CallFrame *callFrame)) { - return JSC::JSValue::encode(JSC::jsUndefined()); + (JSGlobalObject * globalObject, + JSC::CallFrame* callFrame)) +{ + return JSC::JSValue::encode(JSC::jsUndefined()); } -JSC_DEFINE_HOST_FUNCTION(jsFunctionRegister, (JSGlobalObject * globalObject, - JSC::CallFrame *callFrame)) { - return JSC::JSValue::encode(JSC::jsUndefined()); +JSC_DEFINE_HOST_FUNCTION(jsFunctionRegister, (JSGlobalObject * globalObject, JSC::CallFrame* callFrame)) +{ + return JSC::JSValue::encode(JSC::jsUndefined()); } JSC_DEFINE_HOST_FUNCTION(jsFunctionEnableCompileCache, - (JSGlobalObject * globalObject, - JSC::CallFrame *callFrame)) { - return JSC::JSValue::encode(JSC::jsUndefined()); + (JSGlobalObject * globalObject, + JSC::CallFrame* callFrame)) +{ + return JSC::JSValue::encode(JSC::jsUndefined()); } JSC_DEFINE_HOST_FUNCTION(jsFunctionGetCompileCacheDir, - (JSGlobalObject * globalObject, - JSC::CallFrame *callFrame)) { - return JSC::JSValue::encode(JSC::jsUndefined()); + (JSGlobalObject * globalObject, + JSC::CallFrame* callFrame)) +{ + return JSC::JSValue::encode(JSC::jsUndefined()); } -static JSValue getModuleObject(VM &vm, JSObject *moduleObject) { - return moduleObject; +static JSValue getModuleObject(VM& vm, JSObject* moduleObject) +{ + return moduleObject; } /* Source for NodeModuleModule.lut.h @@ -714,128 +734,132 @@ Module getModuleObject PropertyCallback #include "NodeModuleModule.lut.h" class JSModuleConstructor : public JSC::InternalFunction { - using Base = JSC::InternalFunction; + using Base = JSC::InternalFunction; public: - DECLARE_EXPORT_INFO; - static constexpr bool needsDestruction = false; - static constexpr unsigned StructureFlags = - Base::StructureFlags | HasStaticPropertyTable; + DECLARE_EXPORT_INFO; + static constexpr bool needsDestruction = false; + static constexpr unsigned StructureFlags = Base::StructureFlags | HasStaticPropertyTable; - static JSC::Structure *createStructure(JSC::VM &vm, - JSC::JSGlobalObject *globalObject, - JSC::JSValue prototype) { - ASSERT(globalObject); - return JSC::Structure::create( - vm, globalObject, prototype, - JSC::TypeInfo(JSC::InternalFunctionType, StructureFlags), info()); - } + static JSC::Structure* createStructure(JSC::VM& vm, + JSC::JSGlobalObject* globalObject, + JSC::JSValue prototype) + { + ASSERT(globalObject); + return JSC::Structure::create( + vm, globalObject, prototype, + JSC::TypeInfo(JSC::InternalFunctionType, StructureFlags), info()); + } - template - static JSC::GCClient::IsoSubspace *subspaceFor(JSC::VM &vm) { - STATIC_ASSERT_ISO_SUBSPACE_SHARABLE(JSModuleConstructor, Base); - return &vm.internalFunctionSpace(); - } + template + static JSC::GCClient::IsoSubspace* subspaceFor(JSC::VM& vm) + { + STATIC_ASSERT_ISO_SUBSPACE_SHARABLE(JSModuleConstructor, Base); + return &vm.internalFunctionSpace(); + } - static JSModuleConstructor *create(JSC::VM &vm, - Zig::GlobalObject *globalObject) { - auto *structure = - createStructure(vm, globalObject, globalObject->functionPrototype()); + static JSModuleConstructor* create(JSC::VM& vm, + Zig::GlobalObject* globalObject) + { + auto* structure = createStructure(vm, globalObject, globalObject->functionPrototype()); - auto *moduleConstructor = - new (NotNull, JSC::allocateCell(vm)) + auto* moduleConstructor = new (NotNull, JSC::allocateCell(vm)) JSModuleConstructor(vm, structure); - moduleConstructor->finishCreation(vm); - return moduleConstructor; - } + moduleConstructor->finishCreation(vm); + return moduleConstructor; + } private: - JSModuleConstructor(JSC::VM &vm, JSC::Structure *structure) - : Base(vm, structure, jsFunctionNodeModuleModuleCall, - jsFunctionNodeModuleModuleConstructor) {} + JSModuleConstructor(JSC::VM& vm, JSC::Structure* structure) + : Base(vm, structure, jsFunctionNodeModuleModuleCall, + jsFunctionNodeModuleModuleConstructor) + { + } - void finishCreation(JSC::VM &vm) { - Base::finishCreation(vm, 1, "Module"_s, - PropertyAdditionMode::WithoutStructureTransition); - } + void finishCreation(JSC::VM& vm) + { + Base::finishCreation(vm, 1, "Module"_s, + PropertyAdditionMode::WithoutStructureTransition); + } }; const JSC::ClassInfo JSModuleConstructor::s_info = { "Module"_s, &Base::s_info, &nodeModuleObjectTable, nullptr, - CREATE_METHOD_TABLE(JSModuleConstructor)}; + CREATE_METHOD_TABLE(JSModuleConstructor) +}; -void addNodeModuleConstructorProperties(JSC::VM &vm, - Zig::GlobalObject *globalObject) { - globalObject->m_nodeModuleConstructor.initLater( - [](const Zig::GlobalObject::Initializer &init) { - JSObject *moduleConstructor = JSModuleConstructor::create( - init.vm, static_cast(init.owner)); - init.set(moduleConstructor); - }); +void addNodeModuleConstructorProperties(JSC::VM& vm, + Zig::GlobalObject* globalObject) +{ + globalObject->m_nodeModuleConstructor.initLater( + [](const Zig::GlobalObject::Initializer& init) { + JSObject* moduleConstructor = JSModuleConstructor::create( + init.vm, static_cast(init.owner)); + init.set(moduleConstructor); + }); - globalObject->m_moduleResolveFilenameFunction.initLater( - [](const Zig::GlobalObject::Initializer &init) { - JSFunction *resolveFilenameFunction = JSFunction::create( - init.vm, init.owner, 2, "_resolveFilename"_s, - jsFunctionResolveFileName, JSC::ImplementationVisibility::Public, - JSC::NoIntrinsic, jsFunctionResolveFileName); - init.set(resolveFilenameFunction); - }); + globalObject->m_moduleResolveFilenameFunction.initLater( + [](const Zig::GlobalObject::Initializer& init) { + JSFunction* resolveFilenameFunction = JSFunction::create( + init.vm, init.owner, 2, "_resolveFilename"_s, + jsFunctionResolveFileName, JSC::ImplementationVisibility::Public, + JSC::NoIntrinsic, jsFunctionResolveFileName); + init.set(resolveFilenameFunction); + }); } JSC_DEFINE_HOST_FUNCTION(jsFunctionIsModuleResolveFilenameSlowPathEnabled, - (JSGlobalObject * globalObject, - CallFrame *callframe)) { - return JSValue::encode( - jsBoolean(defaultGlobalObject(globalObject) - ->hasOverridenModuleResolveFilenameFunction)); + (JSGlobalObject * globalObject, + CallFrame* callframe)) +{ + return JSValue::encode( + jsBoolean(defaultGlobalObject(globalObject) + ->hasOverridenModuleResolveFilenameFunction)); } } // namespace Bun namespace Zig { -void generateNativeModule_NodeModule(JSC::JSGlobalObject *lexicalGlobalObject, - JSC::Identifier moduleKey, - Vector &exportNames, - JSC::MarkedArgumentBuffer &exportValues) { - Zig::GlobalObject *globalObject = defaultGlobalObject(lexicalGlobalObject); - auto &vm = globalObject->vm(); - auto catchScope = DECLARE_CATCH_SCOPE(vm); - auto *constructor = - globalObject->m_nodeModuleConstructor.getInitializedOnMainThread( - globalObject); - if (constructor->hasNonReifiedStaticProperties()) { - constructor->reifyAllStaticProperties(globalObject); - if (catchScope.exception()) { - catchScope.clearException(); - } - } - - exportNames.reserveCapacity(Bun::countof(Bun::nodeModuleObjectTableValues) + - 1); - exportValues.ensureCapacity(Bun::countof(Bun::nodeModuleObjectTableValues) + - 1); - - for (unsigned i = 0; i < Bun::countof(Bun::nodeModuleObjectTableValues); - ++i) { - const auto &entry = Bun::nodeModuleObjectTableValues[i]; - const auto &property = Identifier::fromString(vm, entry.m_key); - JSValue value = constructor->getIfPropertyExists(globalObject, property); - - if (UNLIKELY(catchScope.exception())) { - value = {}; - catchScope.clearException(); - } - if (UNLIKELY(value.isEmpty())) { - value = JSC::jsUndefined(); +void generateNativeModule_NodeModule(JSC::JSGlobalObject* lexicalGlobalObject, + JSC::Identifier moduleKey, + Vector& exportNames, + JSC::MarkedArgumentBuffer& exportValues) +{ + Zig::GlobalObject* globalObject = defaultGlobalObject(lexicalGlobalObject); + auto& vm = globalObject->vm(); + auto catchScope = DECLARE_CATCH_SCOPE(vm); + auto* constructor = globalObject->m_nodeModuleConstructor.getInitializedOnMainThread( + globalObject); + if (constructor->hasNonReifiedStaticProperties()) { + constructor->reifyAllStaticProperties(globalObject); + if (catchScope.exception()) { + catchScope.clearException(); + } } - exportNames.append(property); - exportValues.append(value); - } + exportNames.reserveCapacity(Bun::countof(Bun::nodeModuleObjectTableValues) + 1); + exportValues.ensureCapacity(Bun::countof(Bun::nodeModuleObjectTableValues) + 1); - exportNames.append(vm.propertyNames->defaultKeyword); - exportValues.append(constructor); + for (unsigned i = 0; i < Bun::countof(Bun::nodeModuleObjectTableValues); + ++i) { + const auto& entry = Bun::nodeModuleObjectTableValues[i]; + const auto& property = Identifier::fromString(vm, entry.m_key); + JSValue value = constructor->getIfPropertyExists(globalObject, property); + + if (UNLIKELY(catchScope.exception())) { + value = {}; + catchScope.clearException(); + } + if (UNLIKELY(value.isEmpty())) { + value = JSC::jsUndefined(); + } + + exportNames.append(property); + exportValues.append(value); + } + + exportNames.append(vm.propertyNames->defaultKeyword); + exportValues.append(constructor); } } // namespace Zig diff --git a/src/bun.js/modules/NodeTTYModule.cpp b/src/bun.js/modules/NodeTTYModule.cpp index c5521dd97a..3ea4c15316 100644 --- a/src/bun.js/modules/NodeTTYModule.cpp +++ b/src/bun.js/modules/NodeTTYModule.cpp @@ -6,41 +6,42 @@ using namespace JSC; namespace Zig { -JSC_DEFINE_HOST_FUNCTION(jsFunctionTty_isatty, (JSGlobalObject * globalObject, - CallFrame *callFrame)) { - VM &vm = globalObject->vm(); - if (callFrame->argumentCount() < 1) { - return JSValue::encode(jsBoolean(false)); - } +JSC_DEFINE_HOST_FUNCTION(jsFunctionTty_isatty, (JSGlobalObject * globalObject, CallFrame* callFrame)) +{ + VM& vm = globalObject->vm(); + if (callFrame->argumentCount() < 1) { + return JSValue::encode(jsBoolean(false)); + } - auto scope = DECLARE_CATCH_SCOPE(vm); - int fd = callFrame->argument(0).toInt32(globalObject); - RETURN_IF_EXCEPTION(scope, {}); + auto scope = DECLARE_CATCH_SCOPE(vm); + int fd = callFrame->argument(0).toInt32(globalObject); + RETURN_IF_EXCEPTION(scope, {}); #if !OS(WINDOWS) - bool isTTY = isatty(fd); + bool isTTY = isatty(fd); #else - bool isTTY = false; - switch (uv_guess_handle(fd)) { - case UV_TTY: - isTTY = true; - break; - default: - break; - } + bool isTTY = false; + switch (uv_guess_handle(fd)) { + case UV_TTY: + isTTY = true; + break; + default: + break; + } #endif - return JSValue::encode(jsBoolean(isTTY)); + return JSValue::encode(jsBoolean(isTTY)); } JSC_DEFINE_HOST_FUNCTION(jsFunctionNotImplementedYet, - (JSGlobalObject * globalObject, - CallFrame *callFrame)) { - VM &vm = globalObject->vm(); - auto throwScope = DECLARE_THROW_SCOPE(vm); - throwException(globalObject, throwScope, - createError(globalObject, "Not implemented yet"_s)); - return {}; + (JSGlobalObject * globalObject, + CallFrame* callFrame)) +{ + VM& vm = globalObject->vm(); + auto throwScope = DECLARE_THROW_SCOPE(vm); + throwException(globalObject, throwScope, + createError(globalObject, "Not implemented yet"_s)); + return {}; } -} // namespace Zig \ No newline at end of file +} // namespace Zig diff --git a/src/bun.js/modules/ObjectModule.cpp b/src/bun.js/modules/ObjectModule.cpp index 309332506c..9d3a5fe9e9 100644 --- a/src/bun.js/modules/ObjectModule.cpp +++ b/src/bun.js/modules/ObjectModule.cpp @@ -2,99 +2,100 @@ namespace Zig { JSC::SyntheticSourceProvider::SyntheticSourceGenerator -generateObjectModuleSourceCode(JSC::JSGlobalObject *globalObject, - JSC::JSObject *object) { - gcProtectNullTolerant(object); - return [object](JSC::JSGlobalObject *lexicalGlobalObject, - JSC::Identifier moduleKey, - Vector &exportNames, - JSC::MarkedArgumentBuffer &exportValues) -> void { - JSC::VM &vm = lexicalGlobalObject->vm(); - GlobalObject *globalObject = - reinterpret_cast(lexicalGlobalObject); - JSC::EnsureStillAliveScope stillAlive(object); +generateObjectModuleSourceCode(JSC::JSGlobalObject* globalObject, + JSC::JSObject* object) +{ + gcProtectNullTolerant(object); + return [object](JSC::JSGlobalObject* lexicalGlobalObject, + JSC::Identifier moduleKey, + Vector& exportNames, + JSC::MarkedArgumentBuffer& exportValues) -> void { + JSC::VM& vm = lexicalGlobalObject->vm(); + GlobalObject* globalObject = reinterpret_cast(lexicalGlobalObject); + JSC::EnsureStillAliveScope stillAlive(object); - PropertyNameArray properties(vm, PropertyNameMode::Strings, - PrivateSymbolMode::Exclude); - object->getPropertyNames(globalObject, properties, - DontEnumPropertiesMode::Exclude); - gcUnprotectNullTolerant(object); + PropertyNameArray properties(vm, PropertyNameMode::Strings, + PrivateSymbolMode::Exclude); + object->getPropertyNames(globalObject, properties, + DontEnumPropertiesMode::Exclude); + gcUnprotectNullTolerant(object); - for (auto &entry : properties) { - exportNames.append(entry); + for (auto& entry : properties) { + exportNames.append(entry); - auto scope = DECLARE_CATCH_SCOPE(vm); - JSValue value = object->get(globalObject, entry); - if (scope.exception()) { - scope.clearException(); - value = jsUndefined(); - } - exportValues.append(value); - } - }; + auto scope = DECLARE_CATCH_SCOPE(vm); + JSValue value = object->get(globalObject, entry); + if (scope.exception()) { + scope.clearException(); + value = jsUndefined(); + } + exportValues.append(value); + } + }; } JSC::SyntheticSourceProvider::SyntheticSourceGenerator -generateObjectModuleSourceCodeForJSON(JSC::JSGlobalObject *globalObject, - JSC::JSObject *object) { - gcProtectNullTolerant(object); - return [object](JSC::JSGlobalObject *lexicalGlobalObject, - JSC::Identifier moduleKey, - Vector &exportNames, - JSC::MarkedArgumentBuffer &exportValues) -> void { - JSC::VM &vm = lexicalGlobalObject->vm(); - GlobalObject *globalObject = - reinterpret_cast(lexicalGlobalObject); - JSC::EnsureStillAliveScope stillAlive(object); +generateObjectModuleSourceCodeForJSON(JSC::JSGlobalObject* globalObject, + JSC::JSObject* object) +{ + gcProtectNullTolerant(object); + return [object](JSC::JSGlobalObject* lexicalGlobalObject, + JSC::Identifier moduleKey, + Vector& exportNames, + JSC::MarkedArgumentBuffer& exportValues) -> void { + JSC::VM& vm = lexicalGlobalObject->vm(); + GlobalObject* globalObject = reinterpret_cast(lexicalGlobalObject); + JSC::EnsureStillAliveScope stillAlive(object); - PropertyNameArray properties(vm, PropertyNameMode::Strings, - PrivateSymbolMode::Exclude); - object->getPropertyNames(globalObject, properties, - DontEnumPropertiesMode::Exclude); - gcUnprotectNullTolerant(object); + PropertyNameArray properties(vm, PropertyNameMode::Strings, + PrivateSymbolMode::Exclude); + object->getPropertyNames(globalObject, properties, + DontEnumPropertiesMode::Exclude); + gcUnprotectNullTolerant(object); - for (auto &entry : properties) { - if (entry == vm.propertyNames->defaultKeyword) { - continue; - } + for (auto& entry : properties) { + if (entry == vm.propertyNames->defaultKeyword) { + continue; + } - exportNames.append(entry); + exportNames.append(entry); - auto scope = DECLARE_CATCH_SCOPE(vm); - JSValue value = object->get(globalObject, entry); - if (scope.exception()) { - scope.clearException(); - value = jsUndefined(); - } - exportValues.append(value); - } + auto scope = DECLARE_CATCH_SCOPE(vm); + JSValue value = object->get(globalObject, entry); + if (scope.exception()) { + scope.clearException(); + value = jsUndefined(); + } + exportValues.append(value); + } - exportNames.append(vm.propertyNames->defaultKeyword); - exportValues.append(object); - }; + exportNames.append(vm.propertyNames->defaultKeyword); + exportValues.append(object); + }; } JSC::SyntheticSourceProvider::SyntheticSourceGenerator -generateJSValueModuleSourceCode(JSC::JSGlobalObject *globalObject, - JSC::JSValue value) { +generateJSValueModuleSourceCode(JSC::JSGlobalObject* globalObject, + JSC::JSValue value) +{ - if (value.isObject() && !JSC::isJSArray(value)) { - return generateObjectModuleSourceCodeForJSON(globalObject, - value.getObject()); - } - - if (value.isCell()) - gcProtectNullTolerant(value.asCell()); - return [value](JSC::JSGlobalObject *lexicalGlobalObject, - JSC::Identifier moduleKey, - Vector &exportNames, - JSC::MarkedArgumentBuffer &exportValues) -> void { - JSC::VM &vm = lexicalGlobalObject->vm(); - exportNames.append(vm.propertyNames->defaultKeyword); - exportValues.append(value); + if (value.isObject() && !JSC::isJSArray(value)) { + return generateObjectModuleSourceCodeForJSON(globalObject, + value.getObject()); + } if (value.isCell()) - gcUnprotectNullTolerant(value.asCell()); - }; + gcProtectNullTolerant(value.asCell()); + return [value](JSC::JSGlobalObject* lexicalGlobalObject, + JSC::Identifier moduleKey, + Vector& exportNames, + JSC::MarkedArgumentBuffer& exportValues) -> void { + JSC::VM& vm = lexicalGlobalObject->vm(); + exportNames.append(vm.propertyNames->defaultKeyword); + exportValues.append(value); + + if (value.isCell()) + gcUnprotectNullTolerant(value.asCell()); + }; } -} // namespace Zig \ No newline at end of file +} // namespace Zig diff --git a/src/io/io_darwin.cpp b/src/io/io_darwin.cpp index 00cc31dd75..d3636801f9 100644 --- a/src/io/io_darwin.cpp +++ b/src/io/io_darwin.cpp @@ -10,120 +10,124 @@ #include "wtf/Assertions.h" extern "C" mach_port_t io_darwin_create_machport(uint64_t wakeup, int32_t fd, - void *wakeup_buffer_, - size_t nbytes) { + void* wakeup_buffer_, + size_t nbytes) +{ - mach_port_t port; - mach_port_t self = mach_task_self(); - kern_return_t kr = mach_port_allocate(self, MACH_PORT_RIGHT_RECEIVE, &port); + mach_port_t port; + mach_port_t self = mach_task_self(); + kern_return_t kr = mach_port_allocate(self, MACH_PORT_RIGHT_RECEIVE, &port); - if (UNLIKELY(kr != KERN_SUCCESS)) { - return 0; - } - - // Insert a send right into the port since we also use this to send - kr = mach_port_insert_right(self, port, port, MACH_MSG_TYPE_MAKE_SEND); - if (UNLIKELY(kr != KERN_SUCCESS)) { - return 0; - } - - // Modify the port queue size to be 1 because we are only - // using it for notifications and not for any other purpose. - mach_port_limits_t limits = {.mpl_qlimit = 1}; - kr = mach_port_set_attributes(self, port, MACH_PORT_LIMITS_INFO, - (mach_port_info_t)&limits, - MACH_PORT_LIMITS_INFO_COUNT); - - if (UNLIKELY(kr != KERN_SUCCESS)) { - return 0; - } - - // Configure the event to directly receive the Mach message as part of the - // kevent64() call. - kevent64_s event{}; - event.ident = port; - event.filter = EVFILT_MACHPORT; - event.flags = EV_ADD | EV_ENABLE; - event.fflags = MACH_RCV_MSG | MACH_RCV_OVERWRITE; - event.ext[0] = reinterpret_cast(wakeup_buffer_); - event.ext[1] = nbytes; - - while (true) { - int rv = kevent64(fd, &event, 1, NULL, 0, 0, NULL); - if (rv == -1) { - if (errno == EINTR) { - continue; - } - - return 0; + if (UNLIKELY(kr != KERN_SUCCESS)) { + return 0; } - return port; - } + // Insert a send right into the port since we also use this to send + kr = mach_port_insert_right(self, port, port, MACH_MSG_TYPE_MAKE_SEND); + if (UNLIKELY(kr != KERN_SUCCESS)) { + return 0; + } + + // Modify the port queue size to be 1 because we are only + // using it for notifications and not for any other purpose. + mach_port_limits_t limits = { .mpl_qlimit = 1 }; + kr = mach_port_set_attributes(self, port, MACH_PORT_LIMITS_INFO, + (mach_port_info_t)&limits, + MACH_PORT_LIMITS_INFO_COUNT); + + if (UNLIKELY(kr != KERN_SUCCESS)) { + return 0; + } + + // Configure the event to directly receive the Mach message as part of the + // kevent64() call. + kevent64_s event {}; + event.ident = port; + event.filter = EVFILT_MACHPORT; + event.flags = EV_ADD | EV_ENABLE; + event.fflags = MACH_RCV_MSG | MACH_RCV_OVERWRITE; + event.ext[0] = reinterpret_cast(wakeup_buffer_); + event.ext[1] = nbytes; + + while (true) { + int rv = kevent64(fd, &event, 1, NULL, 0, 0, NULL); + if (rv == -1) { + if (errno == EINTR) { + continue; + } + + return 0; + } + + return port; + } } extern "C" bool getaddrinfo_send_reply(mach_port_t port, - void (*sendReply)(void *)) { - mach_msg_empty_rcv_t msg; - mach_msg_return_t status; + void (*sendReply)(void*)) +{ + mach_msg_empty_rcv_t msg; + mach_msg_return_t status; - status = mach_msg(&msg.header, MACH_RCV_MSG, 0, sizeof(msg), port, - MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); - if (status != MACH_MSG_SUCCESS) { - return false; - } - sendReply(&msg); - return true; + status = mach_msg(&msg.header, MACH_RCV_MSG, 0, sizeof(msg), port, + MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); + if (status != MACH_MSG_SUCCESS) { + return false; + } + sendReply(&msg); + return true; } -extern "C" bool io_darwin_schedule_wakeup(mach_port_t waker) { - mach_msg_header_t msg = { - .msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0), - .msgh_size = sizeof(mach_msg_header_t), - .msgh_remote_port = waker, - .msgh_local_port = MACH_PORT_NULL, - .msgh_voucher_port = 0, - .msgh_id = 0, - }; +extern "C" bool io_darwin_schedule_wakeup(mach_port_t waker) +{ + mach_msg_header_t msg = { + .msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0), + .msgh_size = sizeof(mach_msg_header_t), + .msgh_remote_port = waker, + .msgh_local_port = MACH_PORT_NULL, + .msgh_voucher_port = 0, + .msgh_id = 0, + }; - mach_msg_return_t kr = mach_msg(&msg, MACH_SEND_MSG | MACH_SEND_TIMEOUT, - msg.msgh_size, 0, MACH_PORT_NULL, - 0, // Fail instantly if the port is full - MACH_PORT_NULL); + mach_msg_return_t kr = mach_msg(&msg, MACH_SEND_MSG | MACH_SEND_TIMEOUT, + msg.msgh_size, 0, MACH_PORT_NULL, + 0, // Fail instantly if the port is full + MACH_PORT_NULL); - switch (kr) { - case MACH_MSG_SUCCESS: { - return true; - } + switch (kr) { + case MACH_MSG_SUCCESS: { + return true; + } - // This means that the send would've blocked because the - // queue is full. We assume success because the port is full. - case MACH_SEND_TIMED_OUT: { - return true; - } + // This means that the send would've blocked because the + // queue is full. We assume success because the port is full. + case MACH_SEND_TIMED_OUT: { + return true; + } - // No space means it will wake up. - case MACH_SEND_NO_BUFFER: { - return true; - } + // No space means it will wake up. + case MACH_SEND_NO_BUFFER: { + return true; + } - default: { - ASSERT_NOT_REACHED_WITH_MESSAGE("mach_msg failed with %x", kr); - return false; - } - } + default: { + ASSERT_NOT_REACHED_WITH_MESSAGE("mach_msg failed with %x", kr); + return false; + } + } } #else // stub out these symbols extern "C" int io_darwin_create_machport(unsigned long long wakeup, int fd, - void *wakeup_buffer_, - unsigned long long nbytes) { - return 0; + void* wakeup_buffer_, + unsigned long long nbytes) +{ + return 0; } // stub out these symbols -extern "C" bool io_darwin_schedule_wakeup(void *waker) { return false; } +extern "C" bool io_darwin_schedule_wakeup(void* waker) { return false; } -#endif \ No newline at end of file +#endif