59c906795c
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>
87 lines
1.7 KiB
C++
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
|