aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/ZigGlobalObject.cpp
diff options
context:
space:
mode:
authorGravatar Silver <14016168+silversquirl@users.noreply.github.com> 2023-05-19 00:45:18 +0100
committerGravatar GitHub <noreply@github.com> 2023-05-18 16:45:18 -0700
commitac64eb420d6ce29ecca97100b7c64afd63afb26d (patch)
tree96b0d7cd328c037a4d6a9314aafca7bdd64b1466 /src/bun.js/bindings/ZigGlobalObject.cpp
parentb76974a2a8a794db41b72e174b86d8536793f8e6 (diff)
downloadbun-ac64eb420d6ce29ecca97100b7c64afd63afb26d.tar.gz
bun-ac64eb420d6ce29ecca97100b7c64afd63afb26d.tar.zst
bun-ac64eb420d6ce29ecca97100b7c64afd63afb26d.zip
Implement `node:vm` (#2785)
* feat: begin implementing node:vm Script object * refactor: clean up and address review comments * refactor: rename Script to VMModuleScript * fix: expose VMModuleScript.prototype also oops I forgot to commit the new files last time * feat(vm): Implement contexts and scripts * feat(vm): implement globalThis * feat(vm): expose node:vm module with global helper functions * refactor(vm): rename VMModuleScript to NodeVMScript * feat: implement script options * doc: add TODOs for runIn*Context options
Diffstat (limited to 'src/bun.js/bindings/ZigGlobalObject.cpp')
-rw-r--r--src/bun.js/bindings/ZigGlobalObject.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/bun.js/bindings/ZigGlobalObject.cpp b/src/bun.js/bindings/ZigGlobalObject.cpp
index eeccb6650..84cef9452 100644
--- a/src/bun.js/bindings/ZigGlobalObject.cpp
+++ b/src/bun.js/bindings/ZigGlobalObject.cpp
@@ -46,6 +46,7 @@
#include "JavaScriptCore/JSString.h"
#include "JavaScriptCore/JSValueInternal.h"
#include "JavaScriptCore/JSVirtualMachineInternal.h"
+#include "JavaScriptCore/JSWeakMap.h"
#include "JavaScriptCore/ObjectConstructor.h"
#include "JavaScriptCore/OptionsList.h"
#include "JavaScriptCore/ParserError.h"
@@ -105,6 +106,7 @@
#include "ReadableStreamBuiltins.h"
#include "BunJSCModule.h"
#include "ModuleLoader.h"
+#include "NodeVMScript.h"
#include "ZigGeneratedClasses.h"
#include "JavaScriptCore/DateInstance.h"
@@ -1209,6 +1211,7 @@ JSC:
static NeverDestroyed<const String> noopString(MAKE_STATIC_STRING_IMPL("noop"));
static NeverDestroyed<const String> createImportMeta(MAKE_STATIC_STRING_IMPL("createImportMeta"));
static NeverDestroyed<const String> masqueradesAsUndefined(MAKE_STATIC_STRING_IMPL("masqueradesAsUndefined"));
+ static NeverDestroyed<const String> vmString(MAKE_STATIC_STRING_IMPL("vm"));
JSC::JSValue moduleName = callFrame->argument(0);
if (moduleName.isNumber()) {
@@ -1292,6 +1295,20 @@ JSC:
return JSValue::encode(InternalFunction::createFunctionThatMasqueradesAsUndefined(vm, globalObject, 0, String(), functionCallNotImplemented));
}
+ if (string == vmString) {
+ auto* obj = constructEmptyObject(globalObject);
+ obj->putDirect(
+ vm, JSC::PropertyName(JSC::Identifier::fromString(vm, "Script"_s)),
+ reinterpret_cast<Zig::GlobalObject*>(globalObject)->NodeVMScript(), 0);
+ obj->putDirect(
+ vm, JSC::PropertyName(JSC::Identifier::fromString(vm, "createContext"_s)),
+ JSC::JSFunction::create(vm, globalObject, 0, "createContext"_s, vmModule_createContext, ImplementationVisibility::Public), 0);
+ obj->putDirect(
+ vm, JSC::PropertyName(JSC::Identifier::fromString(vm, "isContext"_s)),
+ JSC::JSFunction::create(vm, globalObject, 0, "isContext"_s, vmModule_isContext, ImplementationVisibility::Public), 0);
+ return JSValue::encode(obj);
+ }
+
if (UNLIKELY(string == noopString)) {
auto* obj = constructEmptyObject(globalObject);
obj->putDirectCustomAccessor(vm, JSC::PropertyName(JSC::Identifier::fromString(vm, "getterSetter"_s)), JSC::CustomGetterSetter::create(vm, noop_getter, noop_setter), 0);
@@ -2579,6 +2596,11 @@ void GlobalObject::finishCreation(VM& vm)
init.set(dnsObject);
});
+ m_vmModuleContextMap.initLater(
+ [](const Initializer<JSWeakMap>& init) {
+ init.set(JSWeakMap::create(init.vm, init.owner->weakMapStructure()));
+ });
+
m_JSBufferSubclassStructure.initLater(
[](const Initializer<Structure>& init) {
auto* globalObject = reinterpret_cast<Zig::GlobalObject*>(init.owner);
@@ -2849,6 +2871,19 @@ void GlobalObject::finishCreation(VM& vm)
init.setStructure(Zig::JSFFIFunction::createStructure(init.vm, init.global, init.global->functionPrototype()));
});
+ m_NodeVMScriptClassStructure.initLater(
+ [](LazyClassStructure::Initializer& init) {
+ auto prototype = NodeVMScript::createPrototype(init.vm, init.global);
+ auto* structure = NodeVMScript::createStructure(init.vm, init.global, prototype);
+ auto* constructorStructure = NodeVMScriptConstructor::createStructure(
+ init.vm, init.global, init.global->m_functionPrototype.get());
+ auto* constructor = NodeVMScriptConstructor::create(
+ init.vm, init.global, constructorStructure, prototype);
+ init.setPrototype(prototype);
+ init.setStructure(structure);
+ init.setConstructor(constructor);
+ });
+
addBuiltinGlobals(vm);
#if ENABLE(REMOTE_INSPECTOR)
@@ -3672,6 +3707,7 @@ void GlobalObject::visitChildrenImpl(JSCell* cell, Visitor& visitor)
thisObject->m_JSStringDecoderClassStructure.visit(visitor);
thisObject->m_NapiClassStructure.visit(visitor);
thisObject->m_JSBufferClassStructure.visit(visitor);
+ thisObject->m_NodeVMScriptClassStructure.visit(visitor);
thisObject->m_pendingVirtualModuleResultStructure.visit(visitor);
thisObject->m_performMicrotaskFunction.visit(visitor);
@@ -3696,6 +3732,7 @@ void GlobalObject::visitChildrenImpl(JSCell* cell, Visitor& visitor)
thisObject->m_requireResolveFunctionStructure.visit(visitor);
thisObject->m_resolveFunctionPrototype.visit(visitor);
thisObject->m_dnsObject.visit(visitor);
+ thisObject->m_vmModuleContextMap.visit(visitor);
thisObject->m_bunSleepThenCallback.visit(visitor);
for (auto& barrier : thisObject->m_thenables) {