skia2/include/private/SkSLStatement.h
John Stiles 59c906795c Remove InlineMarker IR node.
This node was only used to detect recursion while inlining. We no longer
need to do this, because we disallow recursion in all programs.

The removal of one IRNode per inlined function actually allows for
slightly more aggressive inlining, since we restrict inlining based on
IRNode consumption. This allows the "ExponentialGrowth" tests to inline
a bit more deeply than before.

Change-Id: I894dbb1ca3096bb785b67facb01cc9c630f694c4
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/534780
Reviewed-by: Arman Uguray <armansito@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
2022-04-29 17:40:58 +00:00

87 lines
1.7 KiB
C++

/*
* Copyright 2016 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SKSL_STATEMENT
#define SKSL_STATEMENT
#include "include/private/SkSLIRNode.h"
#include "include/private/SkSLSymbol.h"
namespace SkSL {
/**
* Abstract supertype of all statements.
*/
class Statement : public IRNode {
public:
enum Kind {
kBlock = (int) Symbol::Kind::kLast + 1,
kBreak,
kContinue,
kDiscard,
kDo,
kExpression,
kFor,
kIf,
kNop,
kReturn,
kSwitch,
kSwitchCase,
kVarDeclaration,
kFirst = kBlock,
kLast = kVarDeclaration,
};
Statement(Position pos, Kind kind)
: INHERITED(pos, (int) kind) {
SkASSERT(kind >= Kind::kFirst && kind <= Kind::kLast);
}
Kind kind() const {
return (Kind) fKind;
}
/**
* Use is<T> to check the type of a statement.
* e.g. replace `s.kind() == Statement::Kind::kReturn` with `s.is<ReturnStatement>()`.
*/
template <typename T>
bool is() const {
return this->fKind == T::kStatementKind;
}
/**
* Use as<T> to downcast statements.
* e.g. replace `(ReturnStatement&) s` with `s.as<ReturnStatement>()`.
*/
template <typename T>
const T& as() const {
SkASSERT(this->is<T>());
return static_cast<const T&>(*this);
}
template <typename T>
T& as() {
SkASSERT(this->is<T>());
return static_cast<T&>(*this);
}
virtual bool isEmpty() const {
return false;
}
virtual std::unique_ptr<Statement> clone() const = 0;
private:
using INHERITED = IRNode;
};
} // namespace SkSL
#endif