1 /* 2 * Copyright 2016 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SKSL_VARIABLEREFERENCE 9 #define SKSL_VARIABLEREFERENCE 10 11 #include "src/sksl/ir/SkSLExpression.h" 12 13 namespace SkSL { 14 15 class IRGenerator; 16 17 /** 18 * A reference to a variable, through which it can be read or written. In the statement: 19 * 20 * x = x + 1; 21 * 22 * there is only one Variable 'x', but two VariableReferences to it. 23 */ 24 struct VariableReference : public Expression { 25 enum RefKind { 26 kRead_RefKind, 27 kWrite_RefKind, 28 kReadWrite_RefKind, 29 // taking the address of a variable - we consider this a read & write but don't complain if 30 // the variable was not previously assigned 31 kPointer_RefKind 32 }; 33 34 VariableReference(int offset, const Variable& variable, RefKind refKind = kRead_RefKind); 35 36 ~VariableReference() override; 37 refKindVariableReference38 RefKind refKind() const { 39 return fRefKind; 40 } 41 42 void setRefKind(RefKind refKind); 43 hasSideEffectsVariableReference44 bool hasSideEffects() const override { 45 return false; 46 } 47 isConstantVariableReference48 bool isConstant() const override { 49 return 0 != (fVariable.fModifiers.fFlags & Modifiers::kConst_Flag); 50 } 51 cloneVariableReference52 std::unique_ptr<Expression> clone() const override { 53 return std::unique_ptr<Expression>(new VariableReference(fOffset, fVariable, fRefKind)); 54 } 55 descriptionVariableReference56 String description() const override { 57 return fVariable.fName; 58 } 59 60 static std::unique_ptr<Expression> copy_constant(const IRGenerator& irGenerator, 61 const Expression* expr); 62 63 std::unique_ptr<Expression> constantPropagate(const IRGenerator& irGenerator, 64 const DefinitionMap& definitions) override; 65 66 const Variable& fVariable; 67 RefKind fRefKind; 68 69 private: 70 typedef Expression INHERITED; 71 }; 72 73 } // namespace 74 75 #endif 76