• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)25 SymbolTableStackBuilder::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()56 SymbolTableStackBuilder::~SymbolTableStackBuilder() {
57     if (fStackToPop) {
58         fStackToPop->pop_back();
59     }
60 }
61 
62 }  // namespace Analysis
63 }  // namespace SkSL
64