1 /* 2 * Copyright 2021 Google LLC 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "include/private/SkSLIRNode.h" 9 #include "include/private/SkSLStatement.h" 10 #include "src/sksl/SkSLAnalysis.h" 11 #include "src/sksl/ir/SkSLBlock.h" 12 #include "src/sksl/ir/SkSLForStatement.h" 13 #include "src/sksl/ir/SkSLSwitchStatement.h" 14 15 #include <memory> 16 #include <utility> 17 #include <vector> 18 19 namespace SkSL { 20 21 class SymbolTable; 22 23 namespace Analysis { 24 SymbolTableStackBuilder(const Statement * stmt,std::vector<std::shared_ptr<SymbolTable>> * stack)25SymbolTableStackBuilder::SymbolTableStackBuilder(const Statement* stmt, 26 std::vector<std::shared_ptr<SymbolTable>>* stack) { 27 if (stmt) { 28 switch (stmt->kind()) { 29 case Statement::Kind::kBlock: 30 if (std::shared_ptr<SymbolTable> symbols = stmt->as<Block>().symbolTable()) { 31 stack->push_back(std::move(symbols)); 32 fStackToPop = stack; 33 } 34 break; 35 36 case Statement::Kind::kFor: 37 if (std::shared_ptr<SymbolTable> symbols = stmt->as<ForStatement>().symbols()) { 38 stack->push_back(std::move(symbols)); 39 fStackToPop = stack; 40 } 41 break; 42 43 case Statement::Kind::kSwitch: 44 if (std::shared_ptr<SymbolTable> symbols = stmt->as<SwitchStatement>().symbols()) { 45 stack->push_back(std::move(symbols)); 46 fStackToPop = stack; 47 } 48 break; 49 50 default: 51 break; 52 } 53 } 54 } 55 ~SymbolTableStackBuilder()56SymbolTableStackBuilder::~SymbolTableStackBuilder() { 57 if (fStackToPop) { 58 fStackToPop->pop_back(); 59 } 60 } 61 62 } // namespace Analysis 63 } // namespace SkSL 64