summaryrefslogtreecommitdiff
path: root/js/src/frontend/BytecodeEmitter.cpp
diff options
context:
space:
mode:
authorMartok <martok@martoks-place.de>2023-03-24 00:47:36 +0100
committerMartok <martok@martoks-place.de>2023-03-26 20:20:15 +0200
commit0a2eb24435f3114aa70c253710dd6a4ebe863ff5 (patch)
tree5134f3f30cd63d18e11af4eec6be396afab6e47b /js/src/frontend/BytecodeEmitter.cpp
parent2e2855cf042cbce4ff6d50d048eef996e1d9b1a1 (diff)
downloaduxp-0a2eb24435f3114aa70c253710dd6a4ebe863ff5.tar.gz
Issue #2155 - Move NestableControl classes except ForOfLoopControl to BytecodeControlStructures.{cpp.h}
Based-on: m-c 1460489/3
Diffstat (limited to 'js/src/frontend/BytecodeEmitter.cpp')
-rw-r--r--js/src/frontend/BytecodeEmitter.cpp248
1 files changed, 16 insertions, 232 deletions
diff --git a/js/src/frontend/BytecodeEmitter.cpp b/js/src/frontend/BytecodeEmitter.cpp
index d309b4d6b2..85e123b7c4 100644
--- a/js/src/frontend/BytecodeEmitter.cpp
+++ b/js/src/frontend/BytecodeEmitter.cpp
@@ -28,6 +28,7 @@
#include "jsutil.h"
#include "ds/Nestable.h"
+#include "frontend/BytecodeControlStructures.h"
#include "frontend/CallOrNewEmitter.h"
#include "frontend/ElemOpEmitter.h"
#include "frontend/EmitterScope.h"
@@ -62,11 +63,6 @@ using mozilla::NumberIsInt32;
using mozilla::PodCopy;
using mozilla::Some;
-class BreakableControl;
-class LabelControl;
-class LoopControl;
-class ForOfLoopControl;
-class TryFinallyControl;
class OptionalEmitter;
static bool
@@ -89,222 +85,6 @@ GetCallArgsAndCount(ParseNode* callNode, ParseNode** argumentNode)
return callNode->pn_count - 1;
}
-class BytecodeEmitter::NestableControl : public Nestable<BytecodeEmitter::NestableControl>
-{
- StatementKind kind_;
-
- // The innermost scope when this was pushed.
- EmitterScope* emitterScope_;
-
- protected:
- NestableControl(BytecodeEmitter* bce, StatementKind kind)
- : Nestable<NestableControl>(&bce->innermostNestableControl),
- kind_(kind),
- emitterScope_(bce->innermostEmitterScopeNoCheck())
- { }
-
- public:
- using Nestable<NestableControl>::enclosing;
- using Nestable<NestableControl>::findNearest;
-
- StatementKind kind() const {
- return kind_;
- }
-
- EmitterScope* emitterScope() const {
- return emitterScope_;
- }
-
- template <typename T>
- bool is() const;
-
- template <typename T>
- T& as() {
- MOZ_ASSERT(this->is<T>());
- return static_cast<T&>(*this);
- }
-};
-
-// Template specializations are disallowed in different namespaces; specialize
-// all the NestableControl subtypes up front.
-namespace js {
-namespace frontend {
-
-template <>
-bool
-BytecodeEmitter::NestableControl::is<BreakableControl>() const
-{
- return StatementKindIsUnlabeledBreakTarget(kind_) || kind_ == StatementKind::Label;
-}
-
-template <>
-bool
-BytecodeEmitter::NestableControl::is<LabelControl>() const
-{
- return kind_ == StatementKind::Label;
-}
-
-template <>
-bool
-BytecodeEmitter::NestableControl::is<LoopControl>() const
-{
- return StatementKindIsLoop(kind_);
-}
-
-template <>
-bool
-BytecodeEmitter::NestableControl::is<ForOfLoopControl>() const
-{
- return kind_ == StatementKind::ForOfLoop;
-}
-
-template <>
-bool
-BytecodeEmitter::NestableControl::is<TryFinallyControl>() const
-{
- return kind_ == StatementKind::Try || kind_ == StatementKind::Finally;
-}
-
-} // namespace frontend
-} // namespace js
-
-class BreakableControl : public BytecodeEmitter::NestableControl
-{
- public:
- // Offset of the last break.
- JumpList breaks;
-
- BreakableControl(BytecodeEmitter* bce, StatementKind kind)
- : NestableControl(bce, kind)
- {
- MOZ_ASSERT(is<BreakableControl>());
- }
-
- MOZ_MUST_USE bool patchBreaks(BytecodeEmitter* bce) {
- return bce->emitJumpTargetAndPatch(breaks);
- }
-};
-
-class LabelControl : public BreakableControl
-{
- RootedAtom label_;
-
- // The code offset when this was pushed. Used for effectfulness checking.
- ptrdiff_t startOffset_;
-
- public:
- LabelControl(BytecodeEmitter* bce, JSAtom* label, ptrdiff_t startOffset)
- : BreakableControl(bce, StatementKind::Label),
- label_(bce->cx, label),
- startOffset_(startOffset)
- { }
-
- HandleAtom label() const {
- return label_;
- }
-
- ptrdiff_t startOffset() const {
- return startOffset_;
- }
-};
-
-class LoopControl : public BreakableControl
-{
- // Loops' children are emitted in dominance order, so they can always
- // have a TDZCheckCache.
- TDZCheckCache tdzCache_;
-
- // Stack depth when this loop was pushed on the control stack.
- int32_t stackDepth_;
-
- // The loop nesting depth. Used as a hint to Ion.
- uint32_t loopDepth_;
-
- // Can we OSR into Ion from here? True unless there is non-loop state on the stack.
- bool canIonOsr_;
-
- public:
- // The target of continue statement jumps, e.g., the update portion of a
- // for(;;) loop.
- JumpTarget continueTarget;
-
- // Offset of the last continue in the loop.
- JumpList continues;
-
- LoopControl(BytecodeEmitter* bce, StatementKind loopKind)
- : BreakableControl(bce, loopKind),
- tdzCache_(bce),
- continueTarget({ -1 })
- {
- MOZ_ASSERT(is<LoopControl>());
-
- LoopControl* enclosingLoop = findNearest<LoopControl>(enclosing());
-
- stackDepth_ = bce->stackDepth;
- loopDepth_ = enclosingLoop ? enclosingLoop->loopDepth_ + 1 : 1;
-
- int loopSlots;
- if (loopKind == StatementKind::Spread || loopKind == StatementKind::ForOfLoop)
- loopSlots = 3;
- else if (loopKind == StatementKind::ForInLoop)
- loopSlots = 2;
- else
- loopSlots = 0;
-
- MOZ_ASSERT(loopSlots <= stackDepth_);
-
- if (enclosingLoop) {
- canIonOsr_ = (enclosingLoop->canIonOsr_ &&
- stackDepth_ == enclosingLoop->stackDepth_ + loopSlots);
- } else {
- canIonOsr_ = stackDepth_ == loopSlots;
- }
- }
-
- uint32_t loopDepth() const {
- return loopDepth_;
- }
-
- bool canIonOsr() const {
- return canIonOsr_;
- }
-
- MOZ_MUST_USE bool patchBreaksAndContinues(BytecodeEmitter* bce) {
- MOZ_ASSERT(continueTarget.offset != -1);
- if (!patchBreaks(bce))
- return false;
- bce->patchJumpsToTarget(continues, continueTarget);
- return true;
- }
-};
-
-class TryFinallyControl : public BytecodeEmitter::NestableControl
-{
- bool emittingSubroutine_;
-
- public:
- // The subroutine when emitting a finally block.
- JumpList gosubs;
-
- // Offset of the last catch guard, if any.
- JumpList guardJump;
-
- TryFinallyControl(BytecodeEmitter* bce, StatementKind kind)
- : NestableControl(bce, kind),
- emittingSubroutine_(false)
- {
- MOZ_ASSERT(is<TryFinallyControl>());
- }
-
- void setEmittingSubroutine() {
- emittingSubroutine_ = true;
- }
-
- bool emittingSubroutine() const {
- return emittingSubroutine_;
- }
-};
-
class MOZ_STACK_CLASS TryEmitter
{
public:
@@ -898,6 +678,19 @@ class ForOfLoopControl : public LoopControl
}
};
+namespace js {
+namespace frontend {
+
+template <>
+bool
+NestableControl::is<ForOfLoopControl>() const
+{
+ return kind_ == StatementKind::ForOfLoop;
+}
+
+} // namespace frontend
+} // namespace js
+
BytecodeEmitter::BytecodeEmitter(BytecodeEmitter* parent,
Parser<FullParseHandler>* parser, SharedContext* sc,
HandleScript script, Handle<LazyScript*> lazyScript,
@@ -958,13 +751,6 @@ BytecodeEmitter::init()
return atomIndices.acquire(cx);
}
-template <typename Predicate /* (NestableControl*) -> bool */>
-BytecodeEmitter::NestableControl*
-BytecodeEmitter::findInnermostNestableControl(Predicate predicate) const
-{
- return NestableControl::findNearest(innermostNestableControl, predicate);
-}
-
template <typename T>
T*
BytecodeEmitter::findInnermostNestableControl() const
@@ -1463,7 +1249,7 @@ class NonLocalExitControl
bce_->stackDepth = savedDepth_;
}
- MOZ_MUST_USE bool prepareForNonLocalJump(BytecodeEmitter::NestableControl* target);
+ MOZ_MUST_USE bool prepareForNonLocalJump(NestableControl* target);
MOZ_MUST_USE bool prepareForNonLocalJumpToOutermost() {
return prepareForNonLocalJump(nullptr);
@@ -1494,10 +1280,8 @@ NonLocalExitControl::leaveScope(EmitterScope* es)
* Emit additional bytecode(s) for non-local jumps.
*/
bool
-NonLocalExitControl::prepareForNonLocalJump(BytecodeEmitter::NestableControl* target)
+NonLocalExitControl::prepareForNonLocalJump(NestableControl* target)
{
- using NestableControl = BytecodeEmitter::NestableControl;
-
EmitterScope* es = bce_->innermostEmitterScope();
int npops = 0;