Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Firefox/gfx/skia/skia/src/sksl/ir/   (Browser von der Mozilla Stiftung Version 136.0.1©)  Datei vom 10.2.2025 mit Größe 5 kB image not shown  

Quelle  SkSLFunctionDeclaration.h   Sprache: 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_FUNCTIONDECLARATION
#define SKSL_FUNCTIONDECLARATION

#include "include/core/SkSpan.h"
#include "include/core/SkTypes.h"
#include "include/private/base/SkTArray.h"
#include "src/sksl/SkSLIntrinsicList.h"
#include "src/sksl/SkSLModule.h"
#include "src/sksl/ir/SkSLIRNode.h"
#include "src/sksl/ir/SkSLModifierFlags.h"
#include "src/sksl/ir/SkSLSymbol.h"

#include <memory>
#include <string>
#include <string_view>

namespace SkSL {

class Context;
class ExpressionArray;
class FunctionDefinition;
struct Modifiers;
class Position;
class Type;
class Variable;

/**
 * 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(const Context& context,
                        Position pos,
                        ModifierFlags modifierFlags,
                        std::string_view name,
                        skia_private::TArray<Variable*> parameters,
                        const Type* returnType,
                        IntrinsicKind intrinsicKind);

    static FunctionDeclaration* Convert(const Context& context,
                                        Position pos,
                                        const Modifiers& modifiers,
                                        std::string_view name,
                                        skia_private::TArray<std::unique_ptr<Variable>> parameters,
                                        Position returnTypePos,
                                        const Type* returnType);

    ModifierFlags modifierFlags() const {
        return fModifierFlags;
    }

    void setModifierFlags(ModifierFlags m) {
        fModifierFlags = 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;
    }

    SkSpan<Variable* const> parameters() const {
        return fParameters;
    }

    const Type& returnType() const {
        return *fReturnType;
    }

    ModuleType moduleType() const {
        return fModuleType;
    }

    bool isBuiltin() const {
        return this->moduleType() != ModuleType::program;
    }

    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;

    /**
     * If this function is main(), and it has the requested parameter, returns that parameter.
     * For instance, only a runtime-blend program will have a dest-color parameter, in parameter 1;
     * `getMainDestColorParameter` will return that parameter if this is a runtime-blend main()
     * function. Otherwise, null is returned.
     */

    const Variable* getMainCoordsParameter() const {
        return fHasMainCoordsParameter ? fParameters[0] : nullptr;
    }
    const Variable* getMainInputColorParameter() const {
        return fHasMainInputColorParameter ? fParameters[0] : nullptr;
    }
    const Variable* getMainDestColorParameter() const {
        return fHasMainDestColorParameter ? fParameters[1] : nullptr;
    }

    /**
     * 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 = skia_private::STArray<8, const Type*>;
    bool determineFinalTypes(const ExpressionArray& arguments,
                             ParamTypes* outParameterTypes,
                             const Type** outReturnType) const;

private:
    const FunctionDefinition* fDefinition;
    FunctionDeclaration* fNextOverload = nullptr;
    skia_private::TArray<Variable*> fParameters;
    const Type* fReturnType = nullptr;
    ModifierFlags fModifierFlags;
    mutable IntrinsicKind fIntrinsicKind = kNotIntrinsic;
    ModuleType fModuleType = ModuleType::unknown;
    bool fIsMain = false;
    bool fHasMainCoordsParameter = false;
    bool fHasMainInputColorParameter = false;
    bool fHasMainDestColorParameter = false;

    using INHERITED = Symbol;
};

}  // namespace SkSL

#endif

Messung V0.5
C=97 H=97 G=96

¤ Dauer der Verarbeitung: 0.26 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.