1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2022 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLAnalysis.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLOperator.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/analysis/SkSLProgramVisitor.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLBinaryExpression.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLExpression.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLFunctionCall.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLFunctionDeclaration.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLIRNode.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLModifierFlags.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLPrefixExpression.h" 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker namespace SkSL { 21*c8dee2aaSAndroid Build Coastguard Worker HasSideEffects(const Expression & expr)22*c8dee2aaSAndroid Build Coastguard Workerbool Analysis::HasSideEffects(const Expression& expr) { 23*c8dee2aaSAndroid Build Coastguard Worker class HasSideEffectsVisitor : public ProgramVisitor { 24*c8dee2aaSAndroid Build Coastguard Worker public: 25*c8dee2aaSAndroid Build Coastguard Worker bool visitExpression(const Expression& expr) override { 26*c8dee2aaSAndroid Build Coastguard Worker switch (expr.kind()) { 27*c8dee2aaSAndroid Build Coastguard Worker case Expression::Kind::kFunctionCall: { 28*c8dee2aaSAndroid Build Coastguard Worker const FunctionCall& call = expr.as<FunctionCall>(); 29*c8dee2aaSAndroid Build Coastguard Worker if (!call.function().modifierFlags().isPure()) { 30*c8dee2aaSAndroid Build Coastguard Worker return true; 31*c8dee2aaSAndroid Build Coastguard Worker } 32*c8dee2aaSAndroid Build Coastguard Worker break; 33*c8dee2aaSAndroid Build Coastguard Worker } 34*c8dee2aaSAndroid Build Coastguard Worker case Expression::Kind::kPrefix: { 35*c8dee2aaSAndroid Build Coastguard Worker const PrefixExpression& prefix = expr.as<PrefixExpression>(); 36*c8dee2aaSAndroid Build Coastguard Worker if (prefix.getOperator().kind() == Operator::Kind::PLUSPLUS || 37*c8dee2aaSAndroid Build Coastguard Worker prefix.getOperator().kind() == Operator::Kind::MINUSMINUS) { 38*c8dee2aaSAndroid Build Coastguard Worker return true; 39*c8dee2aaSAndroid Build Coastguard Worker } 40*c8dee2aaSAndroid Build Coastguard Worker break; 41*c8dee2aaSAndroid Build Coastguard Worker } 42*c8dee2aaSAndroid Build Coastguard Worker case Expression::Kind::kBinary: { 43*c8dee2aaSAndroid Build Coastguard Worker const BinaryExpression& binary = expr.as<BinaryExpression>(); 44*c8dee2aaSAndroid Build Coastguard Worker if (binary.getOperator().isAssignment()) { 45*c8dee2aaSAndroid Build Coastguard Worker return true; 46*c8dee2aaSAndroid Build Coastguard Worker } 47*c8dee2aaSAndroid Build Coastguard Worker break; 48*c8dee2aaSAndroid Build Coastguard Worker } 49*c8dee2aaSAndroid Build Coastguard Worker case Expression::Kind::kPostfix: 50*c8dee2aaSAndroid Build Coastguard Worker return true; 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker default: 53*c8dee2aaSAndroid Build Coastguard Worker break; 54*c8dee2aaSAndroid Build Coastguard Worker } 55*c8dee2aaSAndroid Build Coastguard Worker return INHERITED::visitExpression(expr); 56*c8dee2aaSAndroid Build Coastguard Worker } 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = ProgramVisitor; 59*c8dee2aaSAndroid Build Coastguard Worker }; 60*c8dee2aaSAndroid Build Coastguard Worker 61*c8dee2aaSAndroid Build Coastguard Worker HasSideEffectsVisitor visitor; 62*c8dee2aaSAndroid Build Coastguard Worker return visitor.visitExpression(expr); 63*c8dee2aaSAndroid Build Coastguard Worker } 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker } // namespace SkSL 66