From 6142715c06d5eb3dbaa07901a6281ae1394483a9 Mon Sep 17 00:00:00 2001 From: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> Date: Thu, 3 Nov 2022 00:18:26 -0700 Subject: Introduce `import.meta.primordials` for builtin JS the `import.meta` object in Bun now has a `primordials` object which makes a handful of globals safe for access. Inside of bun: or node: modules, it is a special object (ownKeys is not implemented, so Object.keys() wont work on it) - Array - String - `isPromise` - `isCallable` - `isConstructable` - `tryGetById(foo, "bar')` which is like foo?.bar - `arrayPush` which is like `Array.prototype.push` - `Bun` - `isAbortSignal` cc @ThatOneBro @lawrencecchen --- src/bun.js/bindings/ImportMetaObject.cpp | 1 + src/bun.js/bindings/ImportMetaObject.h | 3 ++ src/bun.js/bindings/ZigGlobalObject.cpp | 87 ++++++++++++++++++++++++++++++-- src/bun.js/bindings/ZigGlobalObject.h | 3 ++ 4 files changed, 91 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/bun.js/bindings/ImportMetaObject.cpp b/src/bun.js/bindings/ImportMetaObject.cpp index 17338da5c..cdd00ced2 100644 --- a/src/bun.js/bindings/ImportMetaObject.cpp +++ b/src/bun.js/bindings/ImportMetaObject.cpp @@ -319,6 +319,7 @@ void ImportMetaObjectPrototype::finishCreation(VM& vm, JSGlobalObject* globalObj this->putDirect(vm, builtinNames.pathPublicName(), jsEmptyString(vm), 0); this->putDirect(vm, builtinNames.urlPublicName(), jsEmptyString(vm), 0); this->putDirect(vm, builtinNames.mainPublicName(), jsBoolean(false), 0); + this->putDirect(vm, Identifier::fromString(vm, "primordials"_s), jsUndefined(), JSC::PropertyAttribute::DontEnum | 0); String requireString = "[[require]]"_s; this->putDirect(vm, builtinNames.requirePublicName(), Zig::ImportMetaObject::createRequireFunction(vm, globalObject, requireString), PropertyAttribute::Builtin | PropertyAttribute::Function | 0); diff --git a/src/bun.js/bindings/ImportMetaObject.h b/src/bun.js/bindings/ImportMetaObject.h index ac50df12d..920d4f74f 100644 --- a/src/bun.js/bindings/ImportMetaObject.h +++ b/src/bun.js/bindings/ImportMetaObject.h @@ -67,6 +67,9 @@ public: 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(globalObject)->primordialsObject()); + } metaProperties->putDirect(vm, builtinNames.urlPublicName(), keyString); } diff --git a/src/bun.js/bindings/ZigGlobalObject.cpp b/src/bun.js/bindings/ZigGlobalObject.cpp index 637a06ed8..481fe8aeb 100644 --- a/src/bun.js/bindings/ZigGlobalObject.cpp +++ b/src/bun.js/bindings/ZigGlobalObject.cpp @@ -89,7 +89,6 @@ #include "JSStringDecoder.h" #include "JSReadableState.h" #include "JSReadableHelper.h" - #include "Process.h" #include "WebCoreJSBuiltinInternals.h" @@ -1940,6 +1939,81 @@ JSC_DEFINE_HOST_FUNCTION(functionReadableStreamToArrayBuffer, (JSGlobalObject * return ZigGlobalObject__readableStreamToArrayBufferBody(reinterpret_cast(globalObject), JSValue::encode(readableStreamValue)); } +class BunPrimordialsObject final : public JSNonFinalObject { +public: + using Base = JSC::JSNonFinalObject; + static constexpr unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot | GetOwnPropertySlotMayBeWrongAboutDontEnum; + static BunPrimordialsObject* create(JSC::VM& vm, JSDOMGlobalObject* globalObject, JSC::Structure* structure) + { + BunPrimordialsObject* ptr = new (NotNull, JSC::allocateCell(vm)) BunPrimordialsObject(vm, globalObject, structure); + ptr->finishCreation(vm); + return ptr; + } + + template + static JSC::GCClient::IsoSubspace* subspaceFor(JSC::VM& vm) + { + STATIC_ASSERT_ISO_SUBSPACE_SHARABLE(BunPrimordialsObject, Base); + return &vm.plainObjectSpace(); + } + + 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()); + } + + static bool getOwnPropertySlot(JSObject* object, JSGlobalObject* globalObject, PropertyName propertyName, PropertySlot& slot) + { + JSC::VM& vm = globalObject->vm(); + + auto str = String(propertyName.publicName()); + SymbolImpl* symbol = vm.propertyNames->builtinNames().lookUpPrivateName(str); + if (!symbol) { + return false; + } + + auto identifier = JSC::Identifier::fromUid(vm, symbol); + if (auto value = globalObject->getIfPropertyExists(globalObject, identifier)) { + slot.setValue(globalObject, PropertyAttribute::DontDelete | PropertyAttribute::ReadOnly, value); + return true; + } else if (auto value = vm.bytecodeIntrinsicRegistry().lookup(identifier)) { + auto name = identifier.string(); + String functionText; + bool isFunction = false; + // this is...terrible code + if (name.characters8()[0] >= 'A' && name.characters8()[0] <= 'Z') { + functionText = makeString("(function () { return @"_s, name, ";\n})\n"_s); + } else if (name.characters8()[0] == 'p' || name.characters8()[0] == 't' || name.characters8()[0] == 'g') { + isFunction = true; + functionText = makeString("(function (arg1, arg2) { return @"_s, name, "(arg1, arg2);\n})\n"_s); + } else { + isFunction = true; + functionText = makeString("(function (arg1) { return @"_s, name, "(arg1);\n})\n"_s); + } + + SourceCode source = makeSource(WTFMove(functionText), {}); + JSFunction* func = JSFunction::create(vm, createBuiltinExecutable(vm, source, Identifier::fromString(vm, name), ImplementationVisibility::Public, ConstructorKind::None, ConstructAbility::CannotConstruct)->link(vm, nullptr, source), globalObject); + + slot.setValue( + globalObject, + PropertyAttribute::ReadOnly | PropertyAttribute::DontDelete | 0, + isFunction ? JSValue(func) : JSC::call(globalObject, func, JSC::getCallData(func), globalObject, JSC::MarkedArgumentBuffer())); + + return true; + } + return false; + } + + DECLARE_INFO + + BunPrimordialsObject(JSC::VM& vm, JSC::JSGlobalObject*, JSC::Structure* structure) + : JSC::JSNonFinalObject(vm, structure) + { + } +}; + +const ClassInfo BunPrimordialsObject::s_info = { "Primordials"_s, &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(BunPrimordialsObject) }; + void GlobalObject::finishCreation(VM& vm) { Base::finishCreation(vm); @@ -1992,6 +2066,14 @@ void GlobalObject::finishCreation(VM& vm) toJSNewlyCreated>(*init.owner, global, WTFMove(crypto)).getObject()); }); + m_primordialsObject.initLater( + [](const JSC::LazyProperty::Initializer& init) { + auto& global = *reinterpret_cast(init.owner); + BunPrimordialsObject* object = BunPrimordialsObject::create(init.vm, reinterpret_cast(init.owner), + BunPrimordialsObject::createStructure(init.vm, init.owner, init.owner->objectPrototype())); + init.set(object); + }); + m_NapiClassStructure.initLater( [](LazyClassStructure::Initializer& init) { init.setStructure(Zig::NapiClass::createStructure(init.vm, init.global, init.global->functionPrototype())); @@ -2563,8 +2645,6 @@ void GlobalObject::addBuiltinGlobals(JSC::VM& vm) putDirectCustomAccessor(vm, JSC::Identifier::fromString(vm, "SubtleCrypto"_s), JSC::CustomGetterSetter::create(vm, getterSubtleCryptoConstructor, nullptr), JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly); putDirectCustomAccessor(vm, JSC::Identifier::fromString(vm, "CryptoKey"_s), JSC::CustomGetterSetter::create(vm, getterCryptoKeyConstructor, nullptr), JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly); - - // putDirect(vm, static_cast(vm.clientData)->builtinNames().nativeReadableStreamPrototypePrivateName(), jsUndefined(), JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::DontEnum | 0); } // We set it in here since it's a global @@ -2824,6 +2904,7 @@ void GlobalObject::visitChildrenImpl(JSCell* cell, Visitor& visitor) thisObject->m_performanceObject.visit(visitor); thisObject->m_navigatorObject.visit(visitor); thisObject->m_subtleCryptoObject.visit(visitor); + thisObject->m_primordialsObject.visit(visitor); thisObject->m_JSHTTPResponseSinkClassStructure.visit(visitor); thisObject->m_JSHTTPSResponseSinkClassStructure.visit(visitor); diff --git a/src/bun.js/bindings/ZigGlobalObject.h b/src/bun.js/bindings/ZigGlobalObject.h index e91cf86bf..6863f72af 100644 --- a/src/bun.js/bindings/ZigGlobalObject.h +++ b/src/bun.js/bindings/ZigGlobalObject.h @@ -219,6 +219,7 @@ public: JSC::JSObject* encodeIntoObjectPrototype() { return m_encodeIntoObjectPrototype.getInitializedOnMainThread(this); } JSC::JSObject* performanceObject() { return m_performanceObject.getInitializedOnMainThread(this); } + JSC::JSObject* primordialsObject() { return m_primordialsObject.getInitializedOnMainThread(this); } JSC::JSObject* processObject() { @@ -417,6 +418,8 @@ private: LazyClassStructure m_JSReadableStateClassStructure; LazyClassStructure m_OnigurumaRegExpClassStructure; + LazyProperty m_primordialsObject; + LazyProperty m_navigatorObject; LazyProperty m_JSArrayBufferControllerPrototype; -- cgit v1.2.3 dard-schema'>feat/standard-schema Unnamed repository; edit this file 'description' to name the repository.
aboutsummaryrefslogtreecommitdiff
AgeCommit message (Expand)AuthorFilesLines
2022-01-12[ci] collect statsGravatar FredKSchott 1-0/+1
2022-01-11[ci] yarn formatGravatar matthewp 1-4/+2
2022-01-11Fix: static-build with .md pages (#2363)Gravatar Matthew Phillips 6-3/+66
2022-01-11Restore accessibility check on docs site (#2362)Gravatar Jonathan Neal 2-14/+281
2022-01-11chore: remove www (#2361)Gravatar Nate Moore 87-3240/+11
2022-01-11Fix build output in static build mode (#2358)Gravatar Matthew Phillips 3-1/+16
2022-01-11Fix renderer-solid (fix #2336) (#2359)Gravatar toSayNothing 2-1/+6
2022-01-11[ci] collect statsGravatar FredKSchott 1-0/+1
2022-01-10Use smooth scrolling with reduced motion has no preference (#2355)Gravatar Jonathan Neal 1-3/+7
2022-01-10move changeset to run after build, no test required (#2341)Gravatar Fred K. Schott 1-2/+2
2022-01-10Note that Astro also supports `<Fragment>` syntax (#2354)Gravatar Zade Viggers 1-16/+18
2022-01-10smooth scroll behavior property added (#2256)Gravatar Divyamrit 1-1/+3
2022-01-10Add Astro Blog RSS feed (#2301)Gravatar Rafael Bardini 2-3/+20
2022-01-10Update Cloudflare Pages guide (#2345)Gravatar Jacob Rask 1-2/+2
2022-01-10[ci] update lockfile (#2351)Gravatar Fred K. Schott 1-116/+116
2022-01-10Update instructions for the monorepo (#2274)Gravatar Caleb Jasik 1-5/+12
2022-01-10Fix Astro Preview Pathing Issues (#2338)Gravatar Jonathan Neal 5-144/+150
2022-01-10[ci] collect statsGravatar FredKSchott 1-0/+1
2022-01-09[ci] collect statsGravatar FredKSchott 1-0/+1
2022-01-08[ci] update lockfile (#2344)Gravatar Fred K. Schott 1-33/+33
2022-01-08Fix sitemap.xml page urls (#2335)Gravatar Jonathan Neal 4-4/+8
2022-01-08[ci] collect statsGravatar FredKSchott 1-0/+1
2022-01-07Create .git-blame-ignore-revs (#2254)Gravatar Jonathan Neal 2-0/+8
2022-01-07Fix issue with plugins running twice in dev and build (#2323)Gravatar Jonathan Neal 2-2/+5
2022-01-07[ci] yarn formatGravatar matthewp 1-8/+8
2022-01-07[ci] release (#2339)astro@0.22.9Gravatar github-actions[bot] 28-39/+40
2022-01-07[ci] yarn formatGravatar matthewp 3-7/+8
2022-01-07Handle loading the Code package in the static build (#2337)Gravatar Matthew Phillips 8-4/+87
2022-01-07[ci] update lockfile (#2334)Gravatar Fred K. Schott 1-154/+154
2022-01-07[ci] yarn formatGravatar matthewp 1-8/+8
2022-01-07[ci] release (#2333)astro@0.22.8Gravatar github-actions[bot] 28-39/+40
2022-01-07[ci] collect statsGravatar FredKSchott 1-0/+1
2022-01-06[ci] yarn formatGravatar matthewp 4-54/+54
2022-01-06[ci] update lockfile (#2327)Gravatar Fred K. Schott 1-58/+64
2022-01-06Fix subpath support regressions (#2330)Gravatar Matthew Phillips 12-22/+566
2022-01-06[ci] yarn formatGravatar natemoo-re 1-2/+2
2022-01-06Added "IntelliSense for TypeScript" (#2326)astro@0.22.7Gravatar Morritz 1-0/+17
2022-01-06[ci] collect statsGravatar FredKSchott 1-0/+1
2022-01-06[ci] yarn formatGravatar FredKSchott 1-8/+8
2022-01-05[ci] release (#2320)Gravatar github-actions[bot] 31-54/+46
2022-01-05chore: update compiler (#2324)Gravatar Nate Moore 3-5/+10