1/** 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#ifndef ES2PANDA_COMPILER_CORE_LABEL_TARGET_H 17#define ES2PANDA_COMPILER_CORE_LABEL_TARGET_H 18 19#include <ir/irnode.h> 20#include <compiler/core/labelPair.h> 21 22#include <unordered_map> 23 24namespace panda::es2panda::ir { 25class AstNode; 26class Identifier; 27} // namespace panda::es2panda::ir 28 29namespace panda::es2panda::compiler { 30 31class LabelTarget; 32class PandaGen; 33 34enum class ControlFlowChange { 35 CONTINUE, 36 BREAK, 37}; 38 39class LabelTarget : public LabelPair { 40public: 41 explicit LabelTarget(PandaGen *pg); 42 explicit LabelTarget(const util::StringView &label) : LabelTarget(nullptr, label) {} 43 explicit LabelTarget(Label *target, const util::StringView &label) 44 : LabelPair(target, nullptr), breakLabel_(label), continueLabel_(label) 45 { 46 } 47 LabelTarget() : LabelPair(nullptr, nullptr) {}; 48 49 ~LabelTarget() = default; 50 DEFAULT_COPY_SEMANTIC(LabelTarget); 51 DEFAULT_MOVE_SEMANTIC(LabelTarget); 52 53 const util::StringView &BreakLabel() const 54 { 55 return breakLabel_; 56 } 57 58 Label *BreakTarget() const 59 { 60 return begin_; 61 } 62 63 void SetBreakTarget(Label *label) 64 { 65 begin_ = label; 66 } 67 68 const util::StringView &ContinueLabel() const 69 { 70 return continueLabel_; 71 } 72 73 Label *ContinueTarget() const 74 { 75 return end_; 76 } 77 78 static constexpr std::string_view BREAK_LABEL = "#b"; 79 static constexpr std::string_view CONTINUE_LABEL = "#c"; 80 static constexpr std::string_view RETURN_LABEL = "#r"; 81 82private: 83 util::StringView breakLabel_ {}; 84 util::StringView continueLabel_ {}; 85}; 86 87} // namespace panda::es2panda::compiler 88 89#endif 90