// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. #ifndef RUNTIME_VM_CLOSURE_FUNCTIONS_CACHE_H_ #define RUNTIME_VM_CLOSURE_FUNCTIONS_CACHE_H_ #include #include "vm/allocation.h" #include "vm/token_position.h" namespace dart { class Class; class Function; class FunctionPtr; // Implementation of cache for inner closure functions. // // This cache is populated lazily by the compiler: When compiling a function, // the flow graph builder will recursively traverse the kernel AST for the // function and any inner functions. This will cause the lazy-creation of inner // closure functions. // // The cache is currently implemented as a 2-level // Map>. // // The function is also added to the growable list in order to // satisfy the following requirements: // * closure functions list can grow while iterating // * the index of closure function must be stable // class ClosureFunctionsCache : public AllStatic { public: static constexpr int kInvalidLocalFunctionId = -1; static FunctionPtr LookupClosureFunction(const Function& member_function, intptr_t local_function_id); static FunctionPtr LookupClosureFunctionLocked( const Function& member_function, intptr_t local_function_id); // Normally implicit closure functions are not added to this cache, however // during AOT compilation we might add those implicit closure functions // that have their original functions shaken to allow ProgramWalker to // discover them. static void AddClosureFunctionLocked( const Function& function, intptr_t local_function_id, bool allow_implicit_closure_functions = false); static intptr_t FindClosureIndex(const Function& needle); static FunctionPtr ClosureFunctionFromIndex(intptr_t idx); // Visits all closure functions registered in the object store. // // Iterates in-order, thereby allowing new closures being added during the // iteration. // // The iteration continues until either [callback] returns `false` or all // closure functions have been visited. static void ForAllClosureFunctions( std::function callback); }; } // namespace dart #endif // RUNTIME_VM_CLOSURE_FUNCTIONS_CACHE_H_