mirror of
https://github.com/oven-sh/bun
synced 2026-02-09 10:28:47 +00:00
Add native process module (#1095)
This commit is contained in:
@@ -153,6 +153,7 @@ using JSBuffer = WebCore::JSBuffer;
|
||||
#include <JavaScriptCore/DFGAbstractHeap.h>
|
||||
|
||||
#include "../modules/BufferModule.h"
|
||||
#include "../modules/ProcessModule.h"
|
||||
|
||||
// #include <iostream>
|
||||
static bool has_loaded_jsc = false;
|
||||
@@ -2527,7 +2528,8 @@ static JSC_DEFINE_HOST_FUNCTION(functionFulfillModuleSync,
|
||||
return JSValue::encode(JSC::jsUndefined());
|
||||
}
|
||||
|
||||
if (res.result.value.tag == SyntheticModuleType::Buffer) {
|
||||
switch (res.result.value.tag) {
|
||||
case SyntheticModuleType::Buffer: {
|
||||
auto source = JSC::SourceCode(
|
||||
JSC::SyntheticSourceProvider::create(
|
||||
generateBufferSourceCode,
|
||||
@@ -2537,11 +2539,23 @@ static JSC_DEFINE_HOST_FUNCTION(functionFulfillModuleSync,
|
||||
RETURN_IF_EXCEPTION(scope, JSC::JSValue::encode(JSC::jsUndefined()));
|
||||
RELEASE_AND_RETURN(scope, JSValue::encode(JSC::jsUndefined()));
|
||||
}
|
||||
case SyntheticModuleType::Process: {
|
||||
auto source = JSC::SourceCode(
|
||||
JSC::SyntheticSourceProvider::create(
|
||||
generateProcessSourceCode,
|
||||
JSC::SourceOrigin(WTF::URL::fileURLWithFileSystemPath("node:process"_s)), WTFMove(moduleKey)));
|
||||
|
||||
auto provider = Zig::SourceProvider::create(res.result.value);
|
||||
globalObject->moduleLoader()->provideFetch(globalObject, key, JSC::SourceCode(provider));
|
||||
RETURN_IF_EXCEPTION(scope, JSC::JSValue::encode(JSC::jsUndefined()));
|
||||
RELEASE_AND_RETURN(scope, JSValue::encode(JSC::jsUndefined()));
|
||||
globalObject->moduleLoader()->provideFetch(globalObject, key, WTFMove(source));
|
||||
RETURN_IF_EXCEPTION(scope, JSC::JSValue::encode(JSC::jsUndefined()));
|
||||
RELEASE_AND_RETURN(scope, JSValue::encode(JSC::jsUndefined()));
|
||||
}
|
||||
default: {
|
||||
auto provider = Zig::SourceProvider::create(res.result.value);
|
||||
globalObject->moduleLoader()->provideFetch(globalObject, key, JSC::SourceCode(provider));
|
||||
RETURN_IF_EXCEPTION(scope, JSC::JSValue::encode(JSC::jsUndefined()));
|
||||
RELEASE_AND_RETURN(scope, JSValue::encode(JSC::jsUndefined()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
JSC::JSInternalPromise* GlobalObject::moduleLoaderFetch(JSGlobalObject* globalObject,
|
||||
@@ -2579,7 +2593,8 @@ JSC::JSInternalPromise* GlobalObject::moduleLoaderFetch(JSGlobalObject* globalOb
|
||||
RETURN_IF_EXCEPTION(scope, promise->rejectWithCaughtException(globalObject, scope));
|
||||
}
|
||||
|
||||
if (res.result.value.tag == 1) {
|
||||
switch (res.result.value.tag) {
|
||||
case 1: {
|
||||
auto buffer = Vector<uint8_t>(res.result.value.source_code.ptr, res.result.value.source_code.len);
|
||||
auto source = JSC::SourceCode(
|
||||
JSC::WebAssemblySourceProvider::create(WTFMove(buffer),
|
||||
@@ -2594,7 +2609,8 @@ JSC::JSInternalPromise* GlobalObject::moduleLoaderFetch(JSGlobalObject* globalOb
|
||||
|
||||
globalObject->vm().drainMicrotasks();
|
||||
return promise;
|
||||
} else if (res.result.value.tag == SyntheticModuleType::Buffer) {
|
||||
}
|
||||
case SyntheticModuleType::Buffer: {
|
||||
auto source = JSC::SourceCode(
|
||||
JSC::SyntheticSourceProvider::create(generateBufferSourceCode,
|
||||
JSC::SourceOrigin(), WTFMove(moduleKey)));
|
||||
@@ -2605,11 +2621,25 @@ JSC::JSInternalPromise* GlobalObject::moduleLoaderFetch(JSGlobalObject* globalOb
|
||||
promise->resolve(globalObject, sourceCode);
|
||||
scope.release();
|
||||
return promise;
|
||||
} else {
|
||||
}
|
||||
case SyntheticModuleType::Process: {
|
||||
auto source = JSC::SourceCode(
|
||||
JSC::SyntheticSourceProvider::create(generateProcessSourceCode,
|
||||
JSC::SourceOrigin(), WTFMove(moduleKey)));
|
||||
|
||||
auto sourceCode = JSSourceCode::create(vm, WTFMove(source));
|
||||
RETURN_IF_EXCEPTION(scope, promise->rejectWithCaughtException(globalObject, scope));
|
||||
|
||||
promise->resolve(globalObject, sourceCode);
|
||||
scope.release();
|
||||
return promise;
|
||||
}
|
||||
default: {
|
||||
auto provider = Zig::SourceProvider::create(res.result.value);
|
||||
auto jsSourceCode = JSC::JSSourceCode::create(vm, JSC::SourceCode(provider));
|
||||
promise->resolve(globalObject, jsSourceCode);
|
||||
}
|
||||
}
|
||||
|
||||
// if (provider.ptr()->isBytecodeCacheEnabled()) {
|
||||
// provider.ptr()->readOrGenerateByteCodeCache(vm, jsSourceCode->sourceCode());
|
||||
|
||||
@@ -245,6 +245,7 @@ pub const ResolvedSource = extern struct {
|
||||
wasm = 1,
|
||||
|
||||
@"node:buffer" = 1024,
|
||||
@"node:process" = 1025,
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -832,6 +832,16 @@ pub const VirtualMachine = struct {
|
||||
.hash = 0,
|
||||
};
|
||||
},
|
||||
.@"node:process" => {
|
||||
return ResolvedSource{
|
||||
.allocator = null,
|
||||
.source_code = ZigString.init(""),
|
||||
.specifier = ZigString.init("node:process"),
|
||||
.source_url = ZigString.init("node:process"),
|
||||
.hash = 0,
|
||||
.tag = ResolvedSource.Tag.@"node:process",
|
||||
};
|
||||
},
|
||||
.@"bun:ffi" => {
|
||||
return ResolvedSource{
|
||||
.allocator = null,
|
||||
@@ -2745,6 +2755,7 @@ pub const HardcodedModule = enum {
|
||||
@"node:module",
|
||||
@"node:path",
|
||||
@"node:perf_hooks",
|
||||
@"node:process",
|
||||
@"node:streams/consumer",
|
||||
@"node:streams/web",
|
||||
@"node:timers",
|
||||
@@ -2776,12 +2787,14 @@ pub const HardcodedModule = enum {
|
||||
.{ "node:path/posix", HardcodedModule.@"node:path" },
|
||||
.{ "node:path/win32", HardcodedModule.@"node:path" },
|
||||
.{ "node:perf_hooks", HardcodedModule.@"node:perf_hooks" },
|
||||
.{ "node:process", HardcodedModule.@"node:process" },
|
||||
.{ "node:streams/consumer", HardcodedModule.@"node:streams/consumer" },
|
||||
.{ "node:streams/web", HardcodedModule.@"node:streams/web" },
|
||||
.{ "node:timers", HardcodedModule.@"node:timers" },
|
||||
.{ "node:timers/promises", HardcodedModule.@"node:timers/promises" },
|
||||
.{ "node:url", HardcodedModule.@"node:url" },
|
||||
.{ "path", HardcodedModule.@"node:path" },
|
||||
.{ "process", HardcodedModule.@"node:process" },
|
||||
.{ "undici", HardcodedModule.@"undici" },
|
||||
.{ "ws", HardcodedModule.@"ws" },
|
||||
},
|
||||
@@ -2813,6 +2826,7 @@ pub const HardcodedModule = enum {
|
||||
.{ "node:path/posix", "node:path" },
|
||||
.{ "node:path/win32", "node:path" },
|
||||
.{ "node:perf_hooks", "node:perf_hooks" },
|
||||
.{ "node:process", "node:process" },
|
||||
.{ "node:streams/consumer", "node:streams/consumer" },
|
||||
.{ "node:streams/web", "node:streams/web" },
|
||||
.{ "node:timers", "node:timers" },
|
||||
@@ -2822,6 +2836,7 @@ pub const HardcodedModule = enum {
|
||||
.{ "path/posix", "node:path" },
|
||||
.{ "path/win32", "node:path" },
|
||||
.{ "perf_hooks", "node:perf_hooks" },
|
||||
.{ "process", "node:process" },
|
||||
.{ "streams/consumer", "node:streams/consumer" },
|
||||
.{ "streams/web", "node:streams/web" },
|
||||
.{ "timers", "node:timers" },
|
||||
|
||||
39
src/bun.js/modules/ProcessModule.h
Normal file
39
src/bun.js/modules/ProcessModule.h
Normal file
@@ -0,0 +1,39 @@
|
||||
#include "../bindings/ZigGlobalObject.h"
|
||||
#include "JavaScriptCore/JSGlobalObject.h"
|
||||
|
||||
namespace Zig {
|
||||
|
||||
inline void generateProcessSourceCode(JSC::JSGlobalObject* lexicalGlobalObject, JSC::Identifier moduleKey, Vector<JSC::Identifier, 4>& exportNames, JSC::MarkedArgumentBuffer& exportValues) {
|
||||
JSC::VM& vm = lexicalGlobalObject->vm();
|
||||
GlobalObject* globalObject = reinterpret_cast<GlobalObject*>(lexicalGlobalObject);
|
||||
|
||||
JSC::JSObject* process = globalObject->processObject();
|
||||
|
||||
auto exportFromProcess = [&] (const String& string) {
|
||||
auto identifier = JSC::Identifier::fromString(vm, string);
|
||||
exportNames.append(identifier);
|
||||
exportValues.append(process->getDirect(vm, identifier));
|
||||
};
|
||||
|
||||
exportFromProcess("arch"_s);
|
||||
exportFromProcess("argv"_s);
|
||||
exportFromProcess("browser"_s);
|
||||
exportFromProcess("chdir"_s);
|
||||
exportFromProcess("cwd"_s);
|
||||
exportFromProcess("dlopen"_s);
|
||||
exportFromProcess("exitCode"_s);
|
||||
exportFromProcess("exit"_s);
|
||||
exportFromProcess("hrtime"_s);
|
||||
exportFromProcess("pid"_s);
|
||||
exportFromProcess("ppid"_s);
|
||||
exportFromProcess("nextTick"_s);
|
||||
exportFromProcess("revision"_s);
|
||||
exportFromProcess("title"_s);
|
||||
exportFromProcess("version"_s);
|
||||
exportFromProcess("versions"_s);
|
||||
exportFromProcess("platform"_s);
|
||||
|
||||
exportFromProcess("isBun"_s);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
export const chdir = process.chdir.bind(process);
|
||||
export const cwd = process.cwd.bind(process);
|
||||
export const nextTick = process.nextTick.bind(process);
|
||||
export const browser = false;
|
||||
export var exitCode = process.exitCode;
|
||||
export const exit = process.exit.bind(process);
|
||||
export const pid = process.pid;
|
||||
export const ppid = process.ppid;
|
||||
export const release = process.release;
|
||||
export const version = process.version;
|
||||
export const versions = process.versions;
|
||||
export const arch = process.arch;
|
||||
export const platform = process.platform;
|
||||
Reference in New Issue
Block a user