aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/ZigGlobalObject.cpp
diff options
context:
space:
mode:
authorGravatar Dylan Conway <dylan.conway567@gmail.com> 2023-09-20 00:25:59 -0700
committerGravatar Dylan Conway <dylan.conway567@gmail.com> 2023-09-20 00:25:59 -0700
commitbaa89345459006a96bd597a5ed229b45b7369055 (patch)
treeefe7751e772d4ebbdcef9ca7ccee22e85ac57fe5 /src/bun.js/bindings/ZigGlobalObject.cpp
parent4a0eb19038fc1ae7debf6f4e67a08d53ea67a7de (diff)
downloadbun-fix-prepare-stack-trace.tar.gz
bun-fix-prepare-stack-trace.tar.zst
bun-fix-prepare-stack-trace.zip
Diffstat (limited to 'src/bun.js/bindings/ZigGlobalObject.cpp')
-rw-r--r--src/bun.js/bindings/ZigGlobalObject.cpp53
1 files changed, 51 insertions, 2 deletions
diff --git a/src/bun.js/bindings/ZigGlobalObject.cpp b/src/bun.js/bindings/ZigGlobalObject.cpp
index 9b36157fe..aca1663b5 100644
--- a/src/bun.js/bindings/ZigGlobalObject.cpp
+++ b/src/bun.js/bindings/ZigGlobalObject.cpp
@@ -438,8 +438,57 @@ static String computeErrorInfoWithoutPrepareStackTrace(JSC::VM& vm, Vector<Stack
return sb.toString();
}
+void createCallSitesFromFrames(JSGlobalObject* lexicalGlobalObject, Vector<StackFrame>& stackTrace, JSArray* callSites)
+{
+ bool encounteredStrictFrame = false;
+ GlobalObject* globalObject = reinterpret_cast<GlobalObject*>(lexicalGlobalObject);
+
+ JSC::Structure* callSiteStructure = globalObject->callSiteStructure();
+ size_t framesCount = stackTrace.size();
+ for (size_t i = 0; i < framesCount; i++) {
+ CallSite* callSite = CallSite::createWithFrame(lexicalGlobalObject, callSiteStructure, stackTrace.at(i), encounteredStrictFrame);
+ callSites->putDirectIndex(lexicalGlobalObject, i, callSite);
+
+ if (!encounteredStrictFrame) {
+ encounteredStrictFrame = callSite->isStrict();
+ }
+ }
+}
+
static String computeErrorInfo(JSC::VM& vm, Vector<StackFrame>& stackTrace, unsigned& line, unsigned& column, String& sourceURL, JSObject* errorInstance)
{
+ Zig::GlobalObject* globalObject = jsDynamicCast<Zig::GlobalObject*>(errorInstance->globalObject());
+ JSGlobalObject* lexicalGlobalObject = jsDynamicCast<JSGlobalObject*>(globalObject);
+ auto errorConstructor = globalObject->errorConstructor();
+ auto scope = DECLARE_THROW_SCOPE(vm);
+
+ JSValue prepareStackTrace = errorConstructor->getIfPropertyExists(globalObject, Identifier::fromString(vm, "prepareStackTrace"_s));
+ if (prepareStackTrace && prepareStackTrace.isCallable()) {
+ CallData prepareStackTraceCallData = JSC::getCallData(prepareStackTrace);
+ if (prepareStackTraceCallData.type != CallData::Type::None) {
+ // create the call site from the Vector<StackFrame>
+ JSArray* callSites = JSArray::create(vm, globalObject->arrayStructureForIndexingTypeDuringAllocation(ArrayWithContiguous), stackTrace.size());
+
+ createCallSitesFromFrames(lexicalGlobalObject, stackTrace, callSites);
+
+ MarkedArgumentBuffer args;
+ args.append(errorInstance);
+ args.append(callSites);
+ ASSERT(!args.hasOverflowed());
+
+ JSValue result = profiledCall(
+ lexicalGlobalObject,
+ ProfilingReason::Other,
+ prepareStackTrace,
+ prepareStackTraceCallData,
+ errorConstructor,
+ args);
+ RETURN_IF_EXCEPTION(scope, String());
+
+ errorInstance->putDirect(vm, vm.propertyNames->stack, result, 0);
+ return String();
+ }
+ }
return computeErrorInfoWithoutPrepareStackTrace(vm, stackTrace, line, column, sourceURL, errorInstance);
}
@@ -2441,7 +2490,7 @@ JSC_DEFINE_HOST_FUNCTION(jsFunctionPerformMicrotaskVariadic, (JSGlobalObject * g
return JSValue::encode(jsUndefined());
}
-void GlobalObject::createCallSitesFromFrames(JSC::JSGlobalObject* lexicalGlobalObject, JSCStackTrace& stackTrace, JSC::JSArray* callSites)
+void createCallSitesFromStackTrace(JSC::JSGlobalObject* lexicalGlobalObject, JSCStackTrace& stackTrace, JSC::JSArray* callSites)
{
/* From v8's "Stack Trace API" (https://github.com/v8/v8/wiki/Stack-Trace-API):
* "To maintain restrictions imposed on strict mode functions, frames that have a
@@ -2581,7 +2630,7 @@ JSC_DEFINE_HOST_FUNCTION(errorConstructorFuncCaptureStackTrace, (JSC::JSGlobalOb
stackTrace.size());
// Create the call sites (one per frame)
- GlobalObject::createCallSitesFromFrames(lexicalGlobalObject, stackTrace, callSites);
+ createCallSitesFromStackTrace(lexicalGlobalObject, stackTrace, callSites);
/* Format the stack trace.
* Note that v8 won't actually format the stack trace here, but will create a "stack" accessor