/* * Copyright 2017 WebAssembly Community Group participants * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef wasm_ir_find_all_h #define wasm_ir_find_all_h #include namespace wasm { // Find all instances of a certain node type template struct FindAll { std::vector list; FindAll(Expression* ast) { struct Finder : public PostWalker> { std::vector* list; void visitExpression(Expression* curr) { if (curr->is()) { (*list).push_back(curr->cast()); } } }; Finder finder; finder.list = &list; finder.walk(ast); } }; // Find all pointers to instances of a certain node type struct PointerFinder : public PostWalker> { Expression::Id id; std::vector* list; void visitExpression(Expression* curr) { if (curr->_id == id) { (*list).push_back(getCurrentPointer()); } } }; template struct FindAllPointers { std::vector list; // Note that a pointer may be to the function->body itself, so we must // take \ast by reference. FindAllPointers(Expression*& ast) { PointerFinder finder; finder.id = (Expression::Id)T::SpecificId; finder.list = &list; finder.walk(ast); } }; } // namespace wasm #endif // wasm_ir_find_all_h