aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/ImportMetaObject.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/bun.js/bindings/ImportMetaObject.h102
1 files changed, 31 insertions, 71 deletions
diff --git a/src/bun.js/bindings/ImportMetaObject.h b/src/bun.js/bindings/ImportMetaObject.h
index d0f8f0963..6b5661039 100644
--- a/src/bun.js/bindings/ImportMetaObject.h
+++ b/src/bun.js/bindings/ImportMetaObject.h
@@ -9,6 +9,7 @@
#include "JSDOMWrapperCache.h"
extern "C" JSC_DECLARE_HOST_FUNCTION(functionImportMeta__resolveSync);
+extern "C" JSC_DECLARE_HOST_FUNCTION(functionImportMeta__resolveSyncPrivate);
extern "C" JSC::EncodedJSValue Bun__resolve(JSC::JSGlobalObject* global, JSC::EncodedJSValue specifier, JSC::EncodedJSValue from, bool is_esm);
extern "C" JSC::EncodedJSValue Bun__resolveSync(JSC::JSGlobalObject* global, JSC::EncodedJSValue specifier, JSC::EncodedJSValue from, bool is_esm);
extern "C" JSC::EncodedJSValue Bun__resolveSyncWithSource(JSC::JSGlobalObject* global, JSC::EncodedJSValue specifier, BunString* from, bool is_esm);
@@ -18,97 +19,56 @@ namespace Zig {
using namespace JSC;
using namespace WebCore;
-class ImportMetaObject final : public JSC::JSDestructibleObject {
+JSC_DECLARE_CUSTOM_GETTER(jsRequireCacheGetter);
+JSC_DECLARE_CUSTOM_SETTER(jsRequireCacheSetter);
+
+class ImportMetaObject final : public JSC::JSNonFinalObject {
public:
- using Base = JSC::JSDestructibleObject;
+ using Base = JSC::JSNonFinalObject;
- static ImportMetaObject* create(JSC::VM& vm, JSGlobalObject* globalObject, JSC::Structure* structure)
- {
- ImportMetaObject* ptr = new (NotNull, JSC::allocateCell<ImportMetaObject>(vm)) ImportMetaObject(vm, globalObject, structure);
- ptr->finishCreation(vm);
- return ptr;
- }
+ static ImportMetaObject* create(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::Structure* structure, const WTF::String& url);
- static JSC::Structure* createResolveFunctionStructure(JSC::VM& vm, Zig::GlobalObject* globalObject);
- static JSValue createResolveFunctionPrototype(JSC::VM& vm, Zig::GlobalObject* globalObject);
+ static JSC::JSObject* createRequireFunctionUnbound(JSC::VM& vm, JSGlobalObject* globalObject);
+ static JSC::JSObject* createRequireResolveFunctionUnbound(JSC::VM& vm, JSGlobalObject* globalObject);
static JSObject* createRequireFunction(VM& vm, JSGlobalObject* lexicalGlobalObject, const WTF::String& pathString);
- static ImportMetaObject* create(JSC::JSGlobalObject* globalObject, JSC::JSValue key);
-
- static inline Zig::ImportMetaObject* create(JSC::JSGlobalObject* globalObject, JSC::JSString* keyString)
- {
- // TODO: optimize this by reusing the same JSC::Structure object and using putDirectOffset
- auto& vm = globalObject->vm();
- auto view = keyString->value(globalObject);
- JSC::Structure* structure = WebCore::getDOMStructure<Zig::ImportMetaObject>(vm, *reinterpret_cast<Zig::GlobalObject*>(globalObject));
- Zig::ImportMetaObject* metaProperties = Zig::ImportMetaObject::create(vm, globalObject, structure);
- if (UNLIKELY(!metaProperties)) {
- return nullptr;
- }
-
- auto clientData = WebCore::clientData(vm);
- auto& builtinNames = clientData->builtinNames();
-
- auto index = view.reverseFind('/', view.length());
- if (index != WTF::notFound) {
- metaProperties->putDirect(vm, builtinNames.dirPublicName(),
- JSC::jsSubstring(globalObject, keyString, 0, index));
- metaProperties->putDirect(
- vm, builtinNames.filePublicName(),
- JSC::jsSubstring(globalObject, keyString, index + 1, view.length() - index - 1));
- } else {
- metaProperties->putDirect(vm, builtinNames.filePublicName(), keyString);
- }
- metaProperties->putDirect(
- vm,
- builtinNames.pathPublicName(),
- keyString,
- 0);
-
- metaProperties->putDirect(
- vm,
- builtinNames.requirePublicName(),
- Zig::ImportMetaObject::createRequireFunction(vm, globalObject, view),
- PropertyAttribute::Builtin | PropertyAttribute::Function | 0);
-
- if (view.startsWith('/')) {
- metaProperties->putDirect(vm, builtinNames.urlPublicName(), JSC::JSValue(JSC::jsString(vm, WTF::URL::fileURLWithFileSystemPath(view).string())));
- } else {
- if (view.startsWith("node:"_s) || view.startsWith("bun:"_s)) {
- metaProperties->putDirect(globalObject->vm(), JSC::Identifier::fromString(globalObject->vm(), "primordials"_s), reinterpret_cast<Zig::GlobalObject*>(globalObject)->primordialsObject());
- }
- metaProperties->putDirect(vm, builtinNames.urlPublicName(), keyString);
- }
-
- return metaProperties;
- }
+ static ImportMetaObject* create(JSC::JSGlobalObject* globalObject, JSC::JSString* keyString);
+ static ImportMetaObject* create(JSC::JSGlobalObject* globalObject, JSValue keyString);
DECLARE_INFO;
+ DECLARE_VISIT_CHILDREN;
- static constexpr bool needsDestruction = true;
-
- template<typename CellType, SubspaceAccess>
- static CompleteSubspace* subspaceFor(VM& vm)
+ template<typename, JSC::SubspaceAccess mode> static JSC::GCClient::IsoSubspace* subspaceFor(JSC::VM& vm)
{
- return &vm.destructibleObjectSpace();
- }
+ if constexpr (mode == JSC::SubspaceAccess::Concurrently)
+ return nullptr;
- static JSC::Structure* createStructure(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype)
- {
- return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), info());
+ return WebCore::subspaceForImpl<ImportMetaObject, UseCustomHeapCellType::No>(
+ vm,
+ [](auto& spaces) { return spaces.m_clientSubspaceForImportMeta.get(); },
+ [](auto& spaces, auto&& space) { spaces.m_clientSubspaceForImportMeta = std::forward<decltype(space)>(space); },
+ [](auto& spaces) { return spaces.m_subspaceForImportMeta.get(); },
+ [](auto& spaces, auto&& space) { spaces.m_subspaceForImportMeta = std::forward<decltype(space)>(space); });
}
- static JSObject* createPrototype(VM& vm, JSDOMGlobalObject& globalObject);
+ static JSC::Structure* createStructure(JSC::VM& vm, JSC::JSGlobalObject* globalObject);
static void analyzeHeap(JSCell*, JSC::HeapAnalyzer&);
+ WTF::String url;
+ LazyProperty<JSObject, JSFunction> requireProperty;
+ LazyProperty<JSObject, JSString> dirProperty;
+ LazyProperty<JSObject, JSString> urlProperty;
+ LazyProperty<JSObject, JSString> fileProperty;
+ LazyProperty<JSObject, JSString> pathProperty;
+
private:
- ImportMetaObject(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::Structure* structure)
+ ImportMetaObject(JSC::VM& vm, JSC::Structure* structure, const WTF::String& url)
: Base(vm, structure)
+ , url(url)
{
}
void finishCreation(JSC::VM&);
};
-STATIC_ASSERT_ISO_SUBSPACE_SHARABLE(ImportMetaObject, ImportMetaObject::Base);
} \ No newline at end of file