tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

LabelEmitter.h (1615B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
      2 * vim: set ts=8 sts=2 et sw=2 tw=80:
      3 * This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #ifndef frontend_LabelEmitter_h
      8 #define frontend_LabelEmitter_h
      9 
     10 #include "mozilla/Attributes.h"  // MOZ_STACK_CLASS
     11 #include "mozilla/Maybe.h"       // Maybe
     12 
     13 #include "frontend/BytecodeControlStructures.h"  // LabelControl
     14 
     15 namespace js {
     16 namespace frontend {
     17 
     18 struct BytecodeEmitter;
     19 class TaggedParserAtomIndex;
     20 
     21 // Class for emitting labeled statement.
     22 //
     23 // Usage: (check for the return value is omitted for simplicity)
     24 //
     25 //   `label: expr;`
     26 //     LabelEmitter le(this);
     27 //     le.emitLabel(name_of_label);
     28 //     emit(expr);
     29 //     le.emitEnd();
     30 //
     31 class MOZ_STACK_CLASS LabelEmitter {
     32  BytecodeEmitter* bce_;
     33 
     34  mozilla::Maybe<LabelControl> controlInfo_;
     35 
     36 #ifdef DEBUG
     37  // The state of this emitter.
     38  //
     39  // +-------+ emitLabel +-------+ emitEnd +-----+
     40  // | Start |---------->| Label |-------->| End |
     41  // +-------+           +-------+         +-----+
     42  enum class State {
     43    // The initial state.
     44    Start,
     45 
     46    // After calling emitLabel.
     47    Label,
     48 
     49    // After calling emitEnd.
     50    End
     51  };
     52  State state_ = State::Start;
     53 #endif
     54 
     55 public:
     56  explicit LabelEmitter(BytecodeEmitter* bce) : bce_(bce) {}
     57 
     58  void emitLabel(TaggedParserAtomIndex name);
     59  [[nodiscard]] bool emitEnd();
     60 };
     61 
     62 } /* namespace frontend */
     63 } /* namespace js */
     64 
     65 #endif /* frontend_LabelEmitter_h */