| /* |
| * Copyright 2021 Google LLC. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "include/sksl/DSLBlock.h" |
| |
| #include "include/sksl/DSLStatement.h" |
| #include "src/sksl/ir/SkSLBlock.h" |
| |
| namespace SkSL { |
| |
| namespace dsl { |
| |
| DSLBlock::DSLBlock(SkSL::StatementArray statements, std::shared_ptr<SymbolTable> symbols) |
| : fStatements(std::move(statements)) |
| , fSymbols(std::move(symbols)) {} |
| |
| DSLBlock::DSLBlock(SkTArray<DSLStatement> statements, std::shared_ptr<SymbolTable> symbols) |
| : fSymbols(std::move(symbols)) { |
| fStatements.reserve_back(statements.count()); |
| for (DSLStatement& s : statements) { |
| fStatements.push_back(s.release()); |
| } |
| } |
| |
| DSLBlock::~DSLBlock() { |
| if (!fStatements.empty()) { |
| // This will convert our Block into a DSLStatement, which is then immediately freed. |
| // If an FP is being generated, this will naturally incorporate the Block's Statement into |
| // our FP. If not, this will assert that unused code wasn't incorporated into the program. |
| DSLStatement(std::move(*this)); |
| } |
| } |
| |
| std::unique_ptr<SkSL::Block> DSLBlock::release() { |
| return std::make_unique<SkSL::Block>(/*offset=*/-1, std::move(fStatements), |
| std::move(fSymbols)); |
| } |
| |
| void DSLBlock::append(DSLStatement stmt) { |
| fStatements.push_back(stmt.release()); |
| } |
| |
| } // namespace dsl |
| |
| } // namespace SkSL |