summaryrefslogtreecommitdiffstats
path: root/gfx/skia/skia/src/sksl/ir/SkSLFunctionDeclaration.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/skia/skia/src/sksl/ir/SkSLFunctionDeclaration.h')
-rw-r--r--gfx/skia/skia/src/sksl/ir/SkSLFunctionDeclaration.h153
1 files changed, 153 insertions, 0 deletions
diff --git a/gfx/skia/skia/src/sksl/ir/SkSLFunctionDeclaration.h b/gfx/skia/skia/src/sksl/ir/SkSLFunctionDeclaration.h
new file mode 100644
index 0000000000..462456c1ea
--- /dev/null
+++ b/gfx/skia/skia/src/sksl/ir/SkSLFunctionDeclaration.h
@@ -0,0 +1,153 @@
+/*
+ * 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_FUNCTIONDECLARATION
+#define SKSL_FUNCTIONDECLARATION
+
+#include "include/core/SkTypes.h"
+#include "include/private/SkSLIRNode.h"
+#include "include/private/SkSLSymbol.h"
+#include "include/private/base/SkTArray.h"
+#include "src/sksl/SkSLIntrinsicList.h"
+
+#include <memory>
+#include <string>
+#include <string_view>
+#include <vector>
+
+namespace SkSL {
+
+class Context;
+class ExpressionArray;
+class FunctionDefinition;
+class Position;
+class SymbolTable;
+class Type;
+class Variable;
+
+struct Modifiers;
+
+/**
+ * A function declaration (not a definition -- does not contain a body).
+ */
+class FunctionDeclaration final : public Symbol {
+public:
+ inline static constexpr Kind kIRNodeKind = Kind::kFunctionDeclaration;
+
+ FunctionDeclaration(Position pos,
+ const Modifiers* modifiers,
+ std::string_view name,
+ std::vector<Variable*> parameters,
+ const Type* returnType,
+ bool builtin);
+
+ static FunctionDeclaration* Convert(const Context& context,
+ SymbolTable& symbols,
+ Position pos,
+ Position modifiersPos,
+ const Modifiers* modifiers,
+ std::string_view name,
+ std::vector<std::unique_ptr<Variable>> parameters,
+ Position returnTypePos,
+ const Type* returnType);
+
+ const Modifiers& modifiers() const {
+ return *fModifiers;
+ }
+
+ void setModifiers(const Modifiers* m) {
+ fModifiers = m;
+ }
+
+ const FunctionDefinition* definition() const {
+ return fDefinition;
+ }
+
+ void setDefinition(const FunctionDefinition* definition) {
+ fDefinition = definition;
+ fIntrinsicKind = kNotIntrinsic;
+ }
+
+ void setNextOverload(FunctionDeclaration* overload) {
+ SkASSERT(!overload || overload->name() == this->name());
+ fNextOverload = overload;
+ }
+
+ const std::vector<Variable*>& parameters() const {
+ return fParameters;
+ }
+
+ const Type& returnType() const {
+ return *fReturnType;
+ }
+
+ bool isBuiltin() const {
+ return fBuiltin;
+ }
+
+ bool isMain() const {
+ return fIsMain;
+ }
+
+ IntrinsicKind intrinsicKind() const {
+ return fIntrinsicKind;
+ }
+
+ bool isIntrinsic() const {
+ return this->intrinsicKind() != kNotIntrinsic;
+ }
+
+ const FunctionDeclaration* nextOverload() const {
+ return fNextOverload;
+ }
+
+ FunctionDeclaration* mutableNextOverload() const {
+ return fNextOverload;
+ }
+
+ std::string mangledName() const;
+
+ std::string description() const override;
+
+ bool matches(const FunctionDeclaration& f) const;
+
+ /**
+ * Determine the effective types of this function's parameters and return value when called with
+ * the given arguments. This is relevant for functions with generic parameter types, where this
+ * will collapse the generic types down into specific concrete types.
+ *
+ * Returns true if it was able to select a concrete set of types for the generic function, false
+ * if there is no possible way this can match the argument types. Note that even a true return
+ * does not guarantee that the function can be successfully called with those arguments, merely
+ * indicates that an attempt should be made. If false is returned, the state of
+ * outParameterTypes and outReturnType are undefined.
+ *
+ * This always assumes narrowing conversions are *allowed*. The calling code needs to verify
+ * that each argument can actually be coerced to the final parameter type, respecting the
+ * narrowing-conversions flag. This is handled in callCost(), or in convertCall() (via coerce).
+ */
+ using ParamTypes = SkSTArray<8, const Type*>;
+ bool determineFinalTypes(const ExpressionArray& arguments,
+ ParamTypes* outParameterTypes,
+ const Type** outReturnType) const;
+
+private:
+ const FunctionDefinition* fDefinition;
+ FunctionDeclaration* fNextOverload = nullptr;
+ const Modifiers* fModifiers;
+ std::vector<Variable*> fParameters;
+ const Type* fReturnType;
+ bool fBuiltin;
+ bool fIsMain;
+ mutable IntrinsicKind fIntrinsicKind = kNotIntrinsic;
+
+ using INHERITED = Symbol;
+};
+
+} // namespace SkSL
+
+#endif