diff options
author | 2023-09-20 00:25:59 -0700 | |
---|---|---|
committer | 2023-09-20 00:25:59 -0700 | |
commit | baa89345459006a96bd597a5ed229b45b7369055 (patch) | |
tree | efe7751e772d4ebbdcef9ca7ccee22e85ac57fe5 /src/bun.js/bindings/ZigGlobalObject.cpp | |
parent | 4a0eb19038fc1ae7debf6f4e67a08d53ea67a7de (diff) | |
download | bun-fix-prepare-stack-trace.tar.gz bun-fix-prepare-stack-trace.tar.zst bun-fix-prepare-stack-trace.zip |
some of itfix-prepare-stack-trace
Diffstat (limited to 'src/bun.js/bindings/ZigGlobalObject.cpp')
-rw-r--r-- | src/bun.js/bindings/ZigGlobalObject.cpp | 53 |
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 |