aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/bun.js')
-rw-r--r--src/bun.js/api/bun/socket.zig6
-rw-r--r--src/bun.js/bindings/BunJSCModule.cpp8
-rw-r--r--src/bun.js/bindings/ModuleLoader.cpp2
-rw-r--r--src/bun.js/bindings/glibc-versions-hack.cpp124
-rw-r--r--src/bun.js/node/node_fs.zig17
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;
+}