diff options
author | 2022-12-03 08:25:15 -0800 | |
---|---|---|
committer | 2022-12-03 08:26:53 -0800 | |
commit | bdc43c1696f0d759d28cfb63a2eb1aed5273d55f (patch) | |
tree | 604b87032f77ae1902c76a149b98ad7d40b1a2b1 /src/bun.js/bindings/Process.cpp | |
parent | bc028168a815977830460983f28aefa4f7605c5e (diff) | |
download | bun-bdc43c1696f0d759d28cfb63a2eb1aed5273d55f.tar.gz bun-bdc43c1696f0d759d28cfb63a2eb1aed5273d55f.tar.zst bun-bdc43c1696f0d759d28cfb63a2eb1aed5273d55f.zip |
`process.stdout` and `process.stderr`
Diffstat (limited to 'src/bun.js/bindings/Process.cpp')
-rw-r--r-- | src/bun.js/bindings/Process.cpp | 83 |
1 files changed, 79 insertions, 4 deletions
diff --git a/src/bun.js/bindings/Process.cpp b/src/bun.js/bindings/Process.cpp index 07aabf343..baac2c587 100644 --- a/src/bun.js/bindings/Process.cpp +++ b/src/bun.js/bindings/Process.cpp @@ -6,7 +6,7 @@ #include "ZigGlobalObject.h" #include "headers.h" #include "JSEnvironmentVariableMap.h" - +#include "ImportMetaObject.h" #pragma mark - Node.js Process namespace Zig { @@ -39,6 +39,78 @@ static JSC_DECLARE_CUSTOM_GETTER(Process_getPPID); static JSC_DECLARE_HOST_FUNCTION(Process_functionCwd); +static JSValue constructStdioWriteStream(JSC::JSGlobalObject* globalObject, int fd) +{ + auto& vm = globalObject->vm(); + auto scope = DECLARE_THROW_SCOPE(vm); + auto* thisObject = reinterpret_cast<Zig::GlobalObject*>(globalObject); + JSC::JSFunction* getStdioWriteStream = JSC::JSFunction::create(vm, processObjectInternalsGetStdioWriteStreamCodeGenerator(vm), globalObject); + JSC::MarkedArgumentBuffer args; + WTF::String process = WTF::String("node:process"_s); + JSC::JSValue requireFunction = Zig::ImportMetaObject::createRequireFunction( + vm, + globalObject, + process); + + args.append(JSC::jsNumber(fd)); + args.append(requireFunction); + + auto clientData = WebCore::clientData(vm); + JSC::CallData callData = JSC::getCallData(getStdioWriteStream); + + NakedPtr<JSC::Exception> returnedException = nullptr; + auto result = JSC::call(globalObject, getStdioWriteStream, callData, globalObject->globalThis(), args, returnedException); + RETURN_IF_EXCEPTION(scope, {}); + + if (returnedException) { + throwException(globalObject, scope, returnedException.get()); + return {}; + } + + return result; +} + +JSC_DEFINE_CUSTOM_GETTER( + Process_lazyStdinGetter, + (JSGlobalObject * globalObject, EncodedJSValue thisValue, PropertyName property)) +{ +} + +JSC_DEFINE_CUSTOM_GETTER( + Process_lazyStdoutGetter, + (JSGlobalObject * globalObject, EncodedJSValue thisValue, PropertyName property)) +{ + JSValue value = JSValue::decode(thisValue); + auto& vm = globalObject->vm(); + JSC::JSObject* thisObject = value.toObject(globalObject); + JSC::JSValue stream = constructStdioWriteStream(globalObject, 1); + thisObject->putDirect(vm, property, stream, 0); + return JSValue::encode(stream); +} + +JSC_DEFINE_CUSTOM_GETTER( + Process_lazyStderrGetter, (JSGlobalObject * globalObject, EncodedJSValue thisValue, PropertyName property)) +{ + JSValue value = JSValue::decode(thisValue); + auto& vm = globalObject->vm(); + JSC::JSObject* thisObject = value.toObject(globalObject); + JSC::JSValue stream = constructStdioWriteStream(globalObject, 2); + thisObject->putDirect(vm, property, stream, 0); + return JSValue::encode(stream); +} + +JSC_DEFINE_CUSTOM_SETTER(Process_defaultSetter, + (JSC::JSGlobalObject * globalObject, JSC::EncodedJSValue thisValue, + JSC::EncodedJSValue value, JSC::PropertyName propertyName)) +{ + JSC::VM& vm = globalObject->vm(); + + JSC::JSObject* thisObject = JSC::jsDynamicCast<JSC::JSObject*>(JSValue::decode(thisValue)); + thisObject->putDirect(vm, propertyName, JSValue::decode(value), 0); + + return true; +} + JSC_DECLARE_HOST_FUNCTION(Process_functionNextTick); JSC_DEFINE_HOST_FUNCTION(Process_functionNextTick, (JSC::JSGlobalObject * globalObject, JSC::CallFrame* callFrame)) @@ -241,7 +313,6 @@ static JSC_DECLARE_HOST_FUNCTION(Process_functionChdir); static JSC_DEFINE_HOST_FUNCTION(Process_functionChdir, (JSC::JSGlobalObject * globalObject, JSC::CallFrame* callFrame)) { - auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); ZigString str = ZigString { nullptr, 0 }; @@ -389,6 +460,12 @@ void Process::finishCreation(JSC::VM& vm) this->putDirectCustomAccessor(vm, JSC::PropertyName(JSC::Identifier::fromString(vm, "release"_s)), JSC::CustomGetterSetter::create(vm, Process_getterRelease, Process_setterRelease), 0); + + this->putDirectCustomAccessor(vm, JSC::PropertyName(JSC::Identifier::fromString(vm, "stdout"_s)), + JSC::CustomGetterSetter::create(vm, Process_lazyStdoutGetter, Process_defaultSetter), 0); + + this->putDirectCustomAccessor(vm, JSC::PropertyName(JSC::Identifier::fromString(vm, "stderr"_s)), + JSC::CustomGetterSetter::create(vm, Process_lazyStderrGetter, Process_defaultSetter), 0); } const JSC::ClassInfo Process::s_info = { "Process"_s, &Base::s_info, nullptr, nullptr, @@ -522,7 +599,6 @@ JSC_DEFINE_CUSTOM_SETTER(Process_setVersionsLazy, (JSC::JSGlobalObject * globalObject, JSC::EncodedJSValue thisValue, JSC::EncodedJSValue value, JSC::PropertyName)) { - JSC::VM& vm = globalObject->vm(); auto clientData = WebCore::clientData(vm); @@ -540,7 +616,6 @@ JSC_DEFINE_CUSTOM_SETTER(Process_setVersionsLazy, static JSC_DEFINE_HOST_FUNCTION(Process_functionCwd, (JSC::JSGlobalObject * globalObject, JSC::CallFrame* callFrame)) { - auto scope = DECLARE_THROW_SCOPE(globalObject->vm()); JSC::JSValue result = JSC::JSValue::decode(Bun__Process__getCwd(globalObject)); JSC::JSObject* obj = result.getObject(); |