| // Copyright (c) 2022, 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. | 
 |  | 
 | #include "vm/instructions.h" | 
 |  | 
 | #include "vm/object.h" | 
 | #if defined(DART_PRECOMPILER) | 
 | #include "vm/compiler/aot/precompiler.h" | 
 | #endif | 
 |  | 
 | namespace dart { | 
 |  | 
 | bool ObjectAtPoolIndex(const Code& code, intptr_t index, Object* obj) { | 
 | #if defined(DART_PRECOMPILER) | 
 |   if (FLAG_precompiled_mode) { | 
 |     Precompiler* precompiler = Precompiler::Instance(); | 
 |     if (precompiler != nullptr) { | 
 |       compiler::ObjectPoolBuilder* pool = | 
 |           precompiler->global_object_pool_builder(); | 
 |       if (index < pool->CurrentLength()) { | 
 |         compiler::ObjectPoolBuilderEntry& entry = pool->EntryAt(index); | 
 |         if (entry.type() == compiler::ObjectPoolBuilderEntry::kTaggedObject) { | 
 |           *obj = entry.obj_->ptr(); | 
 |           return true; | 
 |         } | 
 |       } | 
 |     } | 
 |     return false; | 
 |   } | 
 | #endif | 
 |   const ObjectPool& pool = ObjectPool::Handle(code.GetObjectPool()); | 
 |   if (!pool.IsNull() && (index < pool.Length()) && | 
 |       (pool.TypeAt(index) == ObjectPool::EntryType::kTaggedObject)) { | 
 |     *obj = pool.ObjectAt(index); | 
 |     return true; | 
 |   } | 
 |   return false; | 
 | } | 
 |  | 
 | }  // namespace dart |