@@ -162,32 +162,44 @@ bool isLikelyStreamRead(bool cpp, const Token *op);
162162
163163class FwdAnalysis {
164164public:
165- FwdAnalysis (bool cpp, const Library &library) : mCpp (cpp), mLibrary (library) {}
165+ FwdAnalysis (bool cpp, const Library &library) : mCpp (cpp), mLibrary (library), mReassign ( false ) {}
166166
167- /* * Result of forward analysis */
168- struct Result {
169- enum class Type { NONE, READ, WRITE, BREAK, RETURN, BAILOUT } type;
170- Result (Type type) : type(type), token(nullptr ) {}
171- Result (Type type, const Token *token) : type(type), token(token) {}
172- const Token *token;
173- };
167+ bool hasOperand (const Token *tok, const Token *lhs) const ;
174168
175169 /* *
176- * General purpose forward analysis for "expr". The "expr" can be a tree (x.y[12]) or something like that .
170+ * Check if "expr" is reassigned . The "expr" can be a tree (x.y[12]).
177171 * @param expr Symbolic expression to perform forward analysis for
178172 * @param startToken First token in forward analysis
179173 * @param endToken Last token in forward analysis
180- * @return A Result struct .
174+ * @return Token where expr is reassigned. If it's not reassigned then nullptr is returned .
181175 */
182- struct Result check (const Token *expr, const Token *startToken, const Token *endToken);
176+ const Token * reassign (const Token *expr, const Token *startToken, const Token *endToken);
183177
184- bool hasOperand (const Token *tok, const Token *lhs) const ;
178+ /* *
179+ * Get tokens where "expr" is read. The "expr" can be a tree (x.y[12]).
180+ * @param expr Symbolic expression to perform forward analysis for
181+ * @param startToken First token in forward analysis
182+ * @param endToken Last token in forward analysis
183+ * @return vector of read tokens
184+ */
185+ std::vector<const Token *> reads (const Token *expr, const Token *startToken, const Token *endToken);
185186
186187private:
188+ /* * Result of forward analysis */
189+ struct Result {
190+ enum class Type { NONE, READ, WRITE, BREAK, RETURN, BAILOUT } type;
191+ Result (Type type) : type(type), token(nullptr ) {}
192+ Result (Type type, const Token *token) : type(type), token(token) {}
193+ const Token *token;
194+ };
195+
196+ struct Result check (const Token *expr, const Token *startToken, const Token *endToken);
187197 struct Result checkRecursive (const Token *expr, const Token *startToken, const Token *endToken, const std::set<unsigned int > &exprVarIds, bool local);
188198
189199 const bool mCpp ;
190200 const Library &mLibrary ;
201+ bool mReassign ;
202+ std::vector<const Token *> mReads ;
191203};
192204
193205#endif // astutilsH
0 commit comments