From 5dde8c1c4ade389cf94a51741de80b64885a38ec Mon Sep 17 00:00:00 2001 From: win7-7 Date: Tue, 30 Dec 2025 02:14:06 +0200 Subject: [PATCH] 1342497 - Baldr: store current frame, not previous frame, in wasm::FrameIterator 1342497 - Baldr: store current frame, not previous frame, in wasm::FrameIterator. --- js/src/wasm/WasmFrameIterator.cpp | 48 ++++++++++++++----------------- js/src/wasm/WasmFrameIterator.h | 1 - 2 files changed, 21 insertions(+), 28 deletions(-) diff --git a/js/src/wasm/WasmFrameIterator.cpp b/js/src/wasm/WasmFrameIterator.cpp index 2da5d69a24..f6ca11fa85 100644 --- a/js/src/wasm/WasmFrameIterator.cpp +++ b/js/src/wasm/WasmFrameIterator.cpp @@ -57,7 +57,6 @@ FrameIterator::FrameIterator() callsite_(nullptr), codeRange_(nullptr), fp_(nullptr), - pc_(nullptr), unwind_(Unwind::False), missingFrameMessage_(false) { @@ -70,7 +69,6 @@ FrameIterator::FrameIterator(WasmActivation* activation, Unwind unwind) callsite_(nullptr), codeRange_(nullptr), fp_(activation->fp()), - pc_(nullptr), unwind_(unwind), missingFrameMessage_(false) { @@ -84,7 +82,6 @@ FrameIterator::FrameIterator(WasmActivation* activation, Unwind unwind) MOZ_ASSERT(done()); return; } - pc_ = (uint8_t*)pc; code_ = activation_->compartment()->wasm.lookupCode(pc); MOZ_ASSERT(code_); @@ -111,12 +108,8 @@ FrameIterator::operator++() { MOZ_ASSERT(!done()); if (fp_) { - DebugOnly oldfp = fp_; - fp_ += callsite_->stackDepth(); - MOZ_ASSERT_IF(code_->profilingEnabled(), fp_ == CallerFPFromFP(oldfp)); settle(); } else if (codeRange_) { - MOZ_ASSERT(codeRange_); codeRange_ = nullptr; missingFrameMessage_ = true; } else { @@ -128,6 +121,9 @@ FrameIterator::operator++() void FrameIterator::settle() { + if (unwind_ == Unwind::True) + activation_->unwindFP(fp_); + void* returnAddress = ReturnAddressFromFP(fp_); code_ = activation_->compartment()->wasm.lookupCode(returnAddress); @@ -136,30 +132,28 @@ FrameIterator::settle() codeRange_ = code_->lookupRange(returnAddress); MOZ_ASSERT(codeRange_); - switch (codeRange_->kind()) { - case CodeRange::Function: - pc_ = (uint8_t*)returnAddress; - callsite_ = code_->lookupCallSite(returnAddress); - MOZ_ASSERT(callsite_); - break; - case CodeRange::Entry: + if (codeRange_->kind() == CodeRange::Entry) { fp_ = nullptr; - pc_ = nullptr; code_ = nullptr; codeRange_ = nullptr; + callsite_ = nullptr; + + if (unwind_ == Unwind::True) + activation_->unwindFP(nullptr); MOZ_ASSERT(done()); - break; - case CodeRange::ImportJitExit: - case CodeRange::ImportInterpExit: - case CodeRange::TrapExit: - case CodeRange::DebugTrap: - case CodeRange::Inline: - case CodeRange::FarJumpIsland: - MOZ_CRASH("Should not encounter an exit during iteration"); + return; } - if (unwind_ == Unwind::True) - activation_->unwindFP(fp_); + MOZ_RELEASE_ASSERT(codeRange_->kind() == CodeRange::Function); + + callsite_ = code_->lookupCallSite(returnAddress); + MOZ_ASSERT(callsite_); + + DebugOnly oldfp = fp_; + fp_ += callsite_->stackDepth(); + MOZ_ASSERT_IF(code_->profilingEnabled(), fp_ == CallerFPFromFP(oldfp)); + + MOZ_ASSERT(!done()); } const char* @@ -225,7 +219,7 @@ Instance* FrameIterator::instance() const { MOZ_ASSERT(!done() && debugEnabled()); - return TlsDataFromFP(fp_ + callsite_->stackDepth())->instance; + return TlsDataFromFP(fp_)->instance; } bool @@ -243,7 +237,7 @@ FrameIterator::debugFrame() const { MOZ_ASSERT(!done() && debugEnabled()); // The fp() points to wasm::Frame. - void* buf = static_cast(fp_ + callsite_->stackDepth()) - DebugFrame::offsetOfFrame(); + void* buf = static_cast(fp_) - DebugFrame::offsetOfFrame(); return static_cast(buf); } diff --git a/js/src/wasm/WasmFrameIterator.h b/js/src/wasm/WasmFrameIterator.h index 3e3a5de000..69fccda6b9 100644 --- a/js/src/wasm/WasmFrameIterator.h +++ b/js/src/wasm/WasmFrameIterator.h @@ -59,7 +59,6 @@ class FrameIterator const CallSite* callsite_; const CodeRange* codeRange_; uint8_t* fp_; - uint8_t* pc_; Unwind unwind_; bool missingFrameMessage_;