aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/bun.js')
-rw-r--r--src/bun.js/bindings/exports.zig2
-rw-r--r--src/bun.js/bindings/wtf-bindings.cpp34
-rw-r--r--src/bun.js/module_loader.zig1
3 files changed, 36 insertions, 1 deletions
diff --git a/src/bun.js/bindings/exports.zig b/src/bun.js/bindings/exports.zig
index e6ccc039e..2e2c5e556 100644
--- a/src/bun.js/bindings/exports.zig
+++ b/src/bun.js/bindings/exports.zig
@@ -26,7 +26,7 @@ const JSModuleLoader = JSC.JSModuleLoader;
const JSModuleRecord = JSC.JSModuleRecord;
const Microtask = JSC.Microtask;
const JSPrivateDataPtr = @import("../base.zig").JSPrivateDataPtr;
-const Backtrace = @import("../../deps/backtrace.zig");
+const Backtrace = @import("../../crash_reporter.zig");
const JSPrinter = @import("../../js_printer.zig");
const JSLexer = @import("../../js_lexer.zig");
const typeBaseName = @import("../../meta.zig").typeBaseName;
diff --git a/src/bun.js/bindings/wtf-bindings.cpp b/src/bun.js/bindings/wtf-bindings.cpp
index 561c83ffa..d1d73a891 100644
--- a/src/bun.js/bindings/wtf-bindings.cpp
+++ b/src/bun.js/bindings/wtf-bindings.cpp
@@ -1,6 +1,8 @@
#include "wtf-bindings.h"
#include "wtf/text/Base64.h"
+#include "wtf/StackTrace.h"
+
extern "C" void WTF__copyLCharsFromUCharSource(LChar* destination, const UChar* source, size_t length)
{
WTF::StringImpl::copyCharacters(destination, source, length);
@@ -11,4 +13,36 @@ extern "C" JSC::EncodedJSValue WTF__toBase64URLStringValue(const uint8_t* bytes,
WTF::String string = WTF::base64URLEncodeToString(reinterpret_cast<const LChar*>(bytes), static_cast<unsigned int>(length));
string.impl()->ref();
return JSC::JSValue::encode(JSC::jsString(globalObject->vm(), string));
+}
+
+extern "C" void Bun__crashReportWrite(void* ctx, const char* message, size_t length);
+extern "C" void Bun__crashReportDumpStackTrace(void* ctx)
+{
+ static constexpr int framesToShow = 32;
+ static constexpr int framesToSkip = 4;
+ void* stack[framesToShow + framesToSkip];
+ int frames = framesToShow + framesToSkip;
+ WTFGetBacktrace(stack, &frames);
+ bool isFirst = true;
+ WTF::StackTraceSymbolResolver { { stack, static_cast<size_t>(frames) } }.forEach([&](int frameNumber, void* stackFrame, const char* name) {
+ if (frameNumber < framesToSkip)
+ return;
+
+ StringPrintStream out;
+ if (isFirst) {
+ isFirst = false;
+ if (name)
+ out.printf("\n%-3d %p %s", frameNumber, stackFrame, name);
+ else
+ out.printf("\n%-3d %p", frameNumber, stackFrame);
+ } else {
+ if (name)
+ out.printf("%-3d %p %s", frameNumber, stackFrame, name);
+ else
+ out.printf("%-3d %p", frameNumber, stackFrame);
+ }
+
+ auto str = out.toCString();
+ Bun__crashReportWrite(ctx, str.data(), str.length());
+ });
} \ No newline at end of file
diff --git a/src/bun.js/module_loader.zig b/src/bun.js/module_loader.zig
index 82e96c8ed..59a4288fb 100644
--- a/src/bun.js/module_loader.zig
+++ b/src/bun.js/module_loader.zig
@@ -1357,6 +1357,7 @@ pub const ModuleLoader = struct {
if (err == error.AsyncModule) {
unreachable;
}
+
VirtualMachine.processFetchLog(globalObject, specifier.*, referrer.*, &log, ret, err);
return true;
}) |builtin| {