diff --git a/src/bun.js/bindings/BunCommonStrings.cpp b/src/bun.js/bindings/BunCommonStrings.cpp new file mode 100644 index 0000000000..0d93179cf6 --- /dev/null +++ b/src/bun.js/bindings/BunCommonStrings.cpp @@ -0,0 +1,39 @@ +#include "root.h" +#include "BunBuiltinNames.h" +#include "BunCommonStrings.h" +#include +#include +#include +#include +#include "ZigGlobalObject.h" +#include +#include + +namespace Bun { +using namespace JSC; + +#define BUN_COMMON_STRINGS_LAZY_PROPERTY_DEFINITION(jsName) \ + this->m_commonString_##jsName.initLater( \ + [](const JSC::LazyProperty::Initializer& init) { \ + auto& names = WebCore::builtinNames(init.vm); \ + auto name = names.jsName##PublicName(); \ + init.set(jsOwnedString(init.vm, name.string())); \ + }); + +#define BUN_COMMON_STRINGS_LAZY_PROPERTY_VISITOR(name) this->m_commonString_##name.visit(visitor); + +void CommonStrings::initialize() +{ + BUN_COMMON_STRINGS_EACH_NAME(BUN_COMMON_STRINGS_LAZY_PROPERTY_DEFINITION) +} + +template +void CommonStrings::visit(Visitor& visitor) +{ + BUN_COMMON_STRINGS_EACH_NAME(BUN_COMMON_STRINGS_LAZY_PROPERTY_VISITOR) +} + +template void CommonStrings::visit(JSC::AbstractSlotVisitor&); +template void CommonStrings::visit(JSC::SlotVisitor&); + +} // namespace Bun \ No newline at end of file diff --git a/src/bun.js/bindings/BunCommonStrings.h b/src/bun.js/bindings/BunCommonStrings.h new file mode 100644 index 0000000000..218838906f --- /dev/null +++ b/src/bun.js/bindings/BunCommonStrings.h @@ -0,0 +1,36 @@ +#pragma once + +// clang-format off +#define BUN_COMMON_STRINGS_EACH_NAME(macro) \ + macro(require) \ + macro(resolve) +// clang-format on + +#define BUN_COMMON_STRINGS_ACCESSOR_DEFINITION(name) \ + JSC::JSString* name##String(JSC::JSGlobalObject* globalObject) \ + { \ + return m_commonString_##name.getInitializedOnMainThread(globalObject); \ + } + +#define BUN_COMMON_STRINGS_LAZY_PROPERTY_DECLARATION(name) \ + JSC::LazyProperty m_commonString_##name; + +namespace Bun { + +class CommonStrings { +public: + BUN_COMMON_STRINGS_EACH_NAME(BUN_COMMON_STRINGS_ACCESSOR_DEFINITION) + + void initialize(); + + template + void visit(Visitor& visitor); + +private: + BUN_COMMON_STRINGS_EACH_NAME(BUN_COMMON_STRINGS_LAZY_PROPERTY_DECLARATION) +}; + +} // namespace Bun + +#undef BUN_COMMON_STRINGS_ACCESSOR_DEFINITION +#undef BUN_COMMON_STRINGS_LAZY_PROPERTY_DECLARATION diff --git a/src/bun.js/bindings/BunObject.cpp b/src/bun.js/bindings/BunObject.cpp index 2ee0f5f53e..e8caf3100a 100644 --- a/src/bun.js/bindings/BunObject.cpp +++ b/src/bun.js/bindings/BunObject.cpp @@ -223,7 +223,7 @@ static JSValue constructDNSObject(VM& vm, JSObject* bunObject) JSC::JSObject* dnsObject = JSC::constructEmptyObject(globalObject); dnsObject->putDirectNativeFunction(vm, globalObject, JSC::Identifier::fromString(vm, "lookup"_s), 2, Bun__DNSResolver__lookup, ImplementationVisibility::Public, NoIntrinsic, JSC::PropertyAttribute::DontDelete | 0); - dnsObject->putDirectNativeFunction(vm, globalObject, JSC::Identifier::fromString(vm, "resolve"_s), 2, Bun__DNSResolver__resolve, ImplementationVisibility::Public, NoIntrinsic, + dnsObject->putDirectNativeFunction(vm, globalObject, builtinNames(vm).resolvePublicName(), 2, Bun__DNSResolver__resolve, ImplementationVisibility::Public, NoIntrinsic, JSC::PropertyAttribute::DontDelete | 0); dnsObject->putDirectNativeFunction(vm, globalObject, JSC::Identifier::fromString(vm, "resolveSrv"_s), 2, Bun__DNSResolver__resolveSrv, ImplementationVisibility::Public, NoIntrinsic, JSC::PropertyAttribute::DontDelete | 0); diff --git a/src/bun.js/bindings/CommonJSModuleRecord.cpp b/src/bun.js/bindings/CommonJSModuleRecord.cpp index bd6d0c704f..7dee6de12a 100644 --- a/src/bun.js/bindings/CommonJSModuleRecord.cpp +++ b/src/bun.js/bindings/CommonJSModuleRecord.cpp @@ -108,12 +108,12 @@ static bool evaluateCommonJSModuleOnce(JSC::VM& vm, Zig::GlobalObject* globalObj globalObject, globalObject->requireResolveFunctionUnbound(), moduleObject->id(), - ArgList(), 1, jsString(vm, String("resolve"_s))); + ArgList(), 1, globalObject->commonStrings().resolveString(globalObject)); JSFunction* requireFunction = JSC::JSBoundFunction::create(vm, globalObject, globalObject->requireFunctionUnbound(), moduleObject, - ArgList(), 1, jsString(vm, String("require"_s))); + ArgList(), 1, globalObject->commonStrings().requireString(globalObject)); requireFunction->putDirect(vm, vm.propertyNames->resolve, resolveFunction, 0); moduleObject->putDirect(vm, WebCore::clientData(vm)->builtinNames().requirePublicName(), requireFunction, 0); @@ -238,7 +238,7 @@ RequireFunctionPrototype* RequireFunctionPrototype::create( RequireFunctionPrototype* prototype = new (NotNull, JSC::allocateCell(vm)) RequireFunctionPrototype(vm, structure); prototype->finishCreation(vm); - prototype->putDirect(vm, JSC::Identifier::fromString(vm, "resolve"_s), jsCast(globalObject)->requireResolveFunctionUnbound(), 0); + prototype->putDirect(vm, builtinNames(vm).resolvePublicName(), jsCast(globalObject)->requireResolveFunctionUnbound(), 0); return prototype; } @@ -1059,13 +1059,13 @@ JSObject* JSCommonJSModule::createBoundRequireFunction(VM& vm, JSGlobalObject* l globalObject, globalObject->requireFunctionUnbound(), moduleObject, - ArgList(), 1, jsString(vm, String("require"_s))); + ArgList(), 1, globalObject->commonStrings().requireString(globalObject)); JSFunction* resolveFunction = JSC::JSBoundFunction::create(vm, globalObject, globalObject->requireResolveFunctionUnbound(), moduleObject, - ArgList(), 1, jsString(vm, String("resolve"_s))); + ArgList(), 1, globalObject->commonStrings().resolveString(globalObject)); requireFunction->putDirect(vm, vm.propertyNames->resolve, resolveFunction, 0); diff --git a/src/bun.js/bindings/ZigGlobalObject.cpp b/src/bun.js/bindings/ZigGlobalObject.cpp index 6e2e09f7ab..f2c23bf286 100644 --- a/src/bun.js/bindings/ZigGlobalObject.cpp +++ b/src/bun.js/bindings/ZigGlobalObject.cpp @@ -320,6 +320,7 @@ static bool skipNextComputeErrorInfo = false; // error.stack calls this function static String computeErrorInfoWithoutPrepareStackTrace(JSC::VM& vm, Vector& stackTrace, unsigned& line, unsigned& column, String& sourceURL, JSObject* errorInstance) { + GCDeferralContext context(vm); auto* lexicalGlobalObject = errorInstance->globalObject(); Zig::GlobalObject* globalObject = jsDynamicCast(lexicalGlobalObject); @@ -2773,6 +2774,8 @@ void GlobalObject::finishCreation(VM& vm) Base::finishCreation(vm); ASSERT(inherits(info())); + m_commonStrings.initialize(); + m_JSDOMFileConstructor.initLater( [](const Initializer& init) { JSObject* fileConstructor = Bun::createJSDOMFileConstructor(init.vm, init.owner); @@ -2853,6 +2856,8 @@ void GlobalObject::finishCreation(VM& vm) auto& vm = globalObject->vm(); + auto& builtinNames = WebCore::builtinNames(vm); + structure = structure->addPropertyTransition( vm, structure, @@ -2863,14 +2868,14 @@ void GlobalObject::finishCreation(VM& vm) structure = structure->addPropertyTransition( vm, structure, - JSC::Identifier::fromString(vm, "require"_s), + builtinNames.requirePublicName(), 0, offset); structure = structure->addPropertyTransition( vm, structure, - JSC::Identifier::fromString(vm, "resolve"_s), + builtinNames.resolvePublicName(), 0, offset); @@ -3834,7 +3839,7 @@ void GlobalObject::visitChildrenImpl(JSCell* cell, Visitor& visitor) visitor.append(constructor); thisObject->m_builtinInternalFunctions.visit(visitor); - + thisObject->m_commonStrings.visit(visitor); visitor.append(thisObject->m_assignToStream); visitor.append(thisObject->m_readableStreamToArrayBuffer); visitor.append(thisObject->m_readableStreamToArrayBufferResolve); diff --git a/src/bun.js/bindings/ZigGlobalObject.h b/src/bun.js/bindings/ZigGlobalObject.h index 162c402499..2962a134e6 100644 --- a/src/bun.js/bindings/ZigGlobalObject.h +++ b/src/bun.js/bindings/ZigGlobalObject.h @@ -43,6 +43,7 @@ class InternalModuleRegistry; #include "ProcessBindingConstants.h" #include "WebCoreJSBuiltins.h" #include "headers-handwritten.h" +#include "BunCommonStrings.h" namespace WebCore { class GlobalScope; @@ -424,6 +425,7 @@ public: JSObject* cryptoObject() { return m_cryptoObject.getInitializedOnMainThread(this); } JSObject* JSDOMFileConstructor() { return m_JSDOMFileConstructor.getInitializedOnMainThread(this); } + Bun::CommonStrings& commonStrings() { return m_commonStrings; } #include "ZigGeneratedClasses+lazyStructureHeader.h" @@ -441,6 +443,7 @@ private: Lock m_gcLock; WebCore::ScriptExecutionContext* m_scriptExecutionContext; Ref m_world; + Bun::CommonStrings m_commonStrings; // JSC's hashtable code-generator tries to access these properties, so we make them public. // However, we'd like it better if they could be protected. diff --git a/src/bun.js/modules/NodeModuleModule.h b/src/bun.js/modules/NodeModuleModule.h index cf399ab1cb..00872c64a5 100644 --- a/src/bun.js/modules/NodeModuleModule.h +++ b/src/bun.js/modules/NodeModuleModule.h @@ -2,10 +2,10 @@ #include "CommonJSModuleRecord.h" #include "ImportMetaObject.h" -#include -#include #include "_NativeModule.h" #include "isBuiltinModule.h" +#include +#include using namespace Zig; using namespace JSC; @@ -189,7 +189,7 @@ JSC_DEFINE_HOST_FUNCTION(jsFunctionNodeModuleCreateRequire, vm, globalObject, val))); } extern "C" JSC::EncodedJSValue Resolver__nodeModulePathsForJS(JSGlobalObject *, - CallFrame *); + CallFrame *); JSC_DEFINE_HOST_FUNCTION(jsFunctionFindSourceMap, (JSGlobalObject * globalObject,