diff options
Diffstat (limited to 'src/bun.js')
-rw-r--r-- | src/bun.js/api/bun/socket.zig | 6 | ||||
-rw-r--r-- | src/bun.js/bindings/BunJSCModule.cpp | 8 | ||||
-rw-r--r-- | src/bun.js/bindings/ModuleLoader.cpp | 2 | ||||
-rw-r--r-- | src/bun.js/bindings/glibc-versions-hack.cpp | 124 | ||||
-rw-r--r-- | src/bun.js/node/node_fs.zig | 17 |
5 files changed, 151 insertions, 6 deletions
diff --git a/src/bun.js/api/bun/socket.zig b/src/bun.js/api/bun/socket.zig index fa4411cc0..8fd6621f2 100644 --- a/src/bun.js/api/bun/socket.zig +++ b/src/bun.js/api/bun/socket.zig @@ -885,8 +885,10 @@ fn NewSocket(comptime ssl: bool) type { .syscall = ZigString.init("connect"), }; _ = handlers.rejectPromise(err.toErrorInstance(handlers.globalObject)); - this.reffer.unref(handlers.vm); - handlers.markInactive(ssl, socket.context()); + if (this.reffer.has) { + this.reffer.unref(handlers.vm); + handlers.markInactive(ssl, socket.context()); + } } pub fn markActive(this: *This) void { diff --git a/src/bun.js/bindings/BunJSCModule.cpp b/src/bun.js/bindings/BunJSCModule.cpp index 92eefd106..a89bba52a 100644 --- a/src/bun.js/bindings/BunJSCModule.cpp +++ b/src/bun.js/bindings/BunJSCModule.cpp @@ -252,6 +252,8 @@ JSC_DEFINE_HOST_FUNCTION(functionNeverInlineFunction, (JSGlobalObject * globalOb return JSValue::encode(setNeverInline(globalObject, callFrame)); } +extern "C" bool Bun__mkdirp(JSC::JSGlobalObject*, const char*); + JSC_DECLARE_HOST_FUNCTION(functionStartSamplingProfiler); JSC_DEFINE_HOST_FUNCTION(functionStartSamplingProfiler, (JSC::JSGlobalObject * globalObject, JSC::CallFrame* callFrame)) { @@ -267,11 +269,13 @@ JSC_DEFINE_HOST_FUNCTION(functionStartSamplingProfiler, (JSC::JSGlobalObject * g auto path = directoryValue.toWTFString(globalObject); if (!path.isEmpty()) { StringPrintStream pathOut; - if (!WTF::FileSystemImpl::makeAllDirectories(path)) { + const char* optionCString = toCString(String(optionString + path)).data(); + + if (!Bun__mkdirp(globalObject, optionCString)) { throwVMError(globalObject, scope, createTypeError(globalObject, "directory couldn't be created"_s)); return JSC::JSValue::encode(jsUndefined()); } - const char* optionCString = toCString(String(optionString + path)).data(); + Options::setOption(optionCString); samplingProfiler.registerForReportAtExit(); } diff --git a/src/bun.js/bindings/ModuleLoader.cpp b/src/bun.js/bindings/ModuleLoader.cpp index 45f3cc46b..c35627f25 100644 --- a/src/bun.js/bindings/ModuleLoader.cpp +++ b/src/bun.js/bindings/ModuleLoader.cpp @@ -475,7 +475,7 @@ static JSValue fetchSourceCode( } auto provider = Zig::SourceProvider::create(res->result.value); - return rejectOrResolve(JSC::JSSourceCode::create(vm, JSC::SourceCode(provider))); + return rejectOrResolve(JSC::JSSourceCode::create(vm, JSC::SourceCode(WTFMove(provider)))); } extern "C" JSC::EncodedJSValue jsFunctionOnLoadObjectResultResolve(JSC::JSGlobalObject* globalObject, JSC::CallFrame* callFrame) diff --git a/src/bun.js/bindings/glibc-versions-hack.cpp b/src/bun.js/bindings/glibc-versions-hack.cpp new file mode 100644 index 000000000..5da0b41fb --- /dev/null +++ b/src/bun.js/bindings/glibc-versions-hack.cpp @@ -0,0 +1,124 @@ +// if linux +#if defined(__linux__) + +#include <fcntl.h> +//#include <sys/stat.h> +#include <stdarg.h> +#include <math.h> +#include <errno.h> + +#ifndef _STAT_VER +#if defined(__aarch64__) +#define _STAT_VER 0 +#elif defined(__x86_64__) +#define _STAT_VER 1 +#else +#define _STAT_VER 3 +#endif +#endif + +extern "C" int __real_fcntl(int fd, int cmd, ...); +extern "C" double __real_pow(double x, double y); +extern "C" double __real_exp(double x); +extern "C" double __real_log(double x); + +extern "C" int __wrap_fcntl(int fd, int cmd, ...) +{ + va_list va; + va_start(va, cmd); + return __real_fcntl(fd, cmd, va_arg(va, void*)); + va_end(va); +} + +extern "C" int __wrap_fcntl64(int fd, int cmd, ...) +{ + va_list va; + va_start(va, cmd); + return __real_fcntl(fd, cmd, va_arg(va, void*)); + va_end(va); +} + +// I couldn't figure out what has changed in pow, exp, log in glibc 2.29. +// Interestingly despite compiling with -fno-omit-frame-pointer, GCC +// optimises the following to a jmp anyway. + +extern "C" double __wrap_pow(double x, double y) +{ + return __real_pow(x, y); +} + +extern "C" double __wrap_exp(double x) +{ + return __real_exp(x); +} + +extern "C" double __wrap_log(double x) +{ + return __real_log(x); +} + +#ifndef _MKNOD_VER +#define _MKNOD_VER 1 +#endif + +extern "C" int __lxstat(int ver, const char* filename, struct stat* stat); +extern "C" int __wrap_lstat(const char* filename, struct stat* stat) +{ + return __lxstat(_STAT_VER, filename, stat); +} + +extern "C" int __xstat(int ver, const char* filename, struct stat* stat); +extern "C" int __wrap_stat(const char* filename, struct stat* stat) +{ + return __xstat(_STAT_VER, filename, stat); +} + +extern "C" int __fxstat(int ver, int fd, struct stat* stat); +extern "C" int __wrap_fstat(int fd, struct stat* stat) +{ + return __fxstat(_STAT_VER, fd, stat); +} + +extern "C" int __fxstatat(int ver, int dirfd, const char* path, struct stat* stat, int flags); +extern "C" int __wrap_fstatat(int dirfd, const char* path, struct stat* stat, int flags) +{ + return __fxstatat(_STAT_VER, dirfd, path, stat, flags); +} + +extern "C" int __lxstat64(int ver, const char* filename, struct stat64* stat); +extern "C" int __wrap_lstat64(const char* filename, struct stat64* stat) +{ + return __lxstat64(_STAT_VER, filename, stat); +} + +extern "C" int __xstat64(int ver, const char* filename, struct stat64* stat); +extern "C" int __wrap_stat64(const char* filename, struct stat64* stat) +{ + return __xstat64(_STAT_VER, filename, stat); +} + +extern "C" int __fxstat64(int ver, int fd, struct stat64* stat); +extern "C" int __wrap_fstat64(int fd, struct stat64* stat) +{ + return __fxstat64(_STAT_VER, fd, stat); +} + +extern "C" int __fxstatat64(int ver, int dirfd, const char* path, struct stat64* stat, int flags); +extern "C" int __wrap_fstatat64(int dirfd, const char* path, struct stat64* stat, int flags) +{ + return __fxstatat64(_STAT_VER, dirfd, path, stat, flags); +} + +extern "C" int __xmknod(int ver, const char* path, __mode_t mode, __dev_t dev); +extern "C" int __wrap_mknod(const char* path, __mode_t mode, __dev_t dev) +{ + return __xmknod(_MKNOD_VER, path, mode, dev); +} + +extern "C" int __xmknodat(int ver, int dirfd, const char* path, __mode_t mode, __dev_t dev); +extern "C" int __wrap_mknodat(int dirfd, const char* path, __mode_t mode, __dev_t dev) +{ + return __xmknodat(_MKNOD_VER, dirfd, path, mode, dev); +} + +#endif
\ No newline at end of file diff --git a/src/bun.js/node/node_fs.zig b/src/bun.js/node/node_fs.zig index dd11d40bf..75b50efed 100644 --- a/src/bun.js/node/node_fs.zig +++ b/src/bun.js/node/node_fs.zig @@ -2915,7 +2915,7 @@ pub const NodeFS = struct { // TODO: windows // TODO: verify this works correctly with unicode codepoints - fn mkdirRecursive(this: *NodeFS, args: Arguments.Mkdir, comptime flavor: Flavor) Maybe(Return.Mkdir) { + pub fn mkdirRecursive(this: *NodeFS, args: Arguments.Mkdir, comptime flavor: Flavor) Maybe(Return.Mkdir) { const Option = Maybe(Return.Mkdir); if (comptime Environment.isWindows) @compileError("This needs to be implemented on Windows."); @@ -3976,3 +3976,18 @@ pub const NodeFS = struct { return Maybe(Return.CreateWriteStream).todo; } }; + +pub export fn Bun__mkdirp(globalThis: *JSC.JSGlobalObject, path: [*:0]const u8) bool { + return globalThis.bunVM().nodeFS().mkdirRecursive( + Arguments.Mkdir{ + .path = PathLike{ .string = PathString.init(bun.span(path)) }, + .recursive = true, + }, + .sync, + ) != .err; +} + +comptime { + if (!JSC.is_bindgen) + _ = Bun__mkdirp; +} |