| /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- |
| * vim: set ts=8 sts=4 et sw=4 tw=99: |
| * This Source Code Form is subject to the terms of the Mozilla Public |
| * License, v. 2.0. If a copy of the MPL was not distributed with this |
| * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| |
| #ifndef jit_PcScriptCache_h |
| #define jit_PcScriptCache_h |
| |
| // Defines a fixed-size hash table solely for the purpose of caching jit::GetPcScript(). |
| // One cache is attached to each JSRuntime; it functions as if cleared on GC. |
| |
| struct JSRuntime; |
| |
| namespace js { |
| namespace jit { |
| |
| struct PcScriptCacheEntry |
| { |
| uint8_t *returnAddress; // Key into the hash table. |
| jsbytecode *pc; // Cached PC. |
| JSScript *script; // Cached script. |
| }; |
| |
| struct PcScriptCache |
| { |
| static const uint32_t Length = 73; |
| |
| // GC number at the time the cache was filled or created. |
| // Storing and checking against this number allows us to not bother |
| // clearing this cache on every GC -- only when actually necessary. |
| uint64_t gcNumber; |
| |
| // List of cache entries. |
| PcScriptCacheEntry entries[Length]; |
| |
| void clear(uint64_t gcNumber) { |
| for (uint32_t i = 0; i < Length; i++) |
| entries[i].returnAddress = NULL; |
| this->gcNumber = gcNumber; |
| } |
| |
| // Get a value from the cache. May perform lazy allocation. |
| // Defined in PcScriptCache-inl.h. |
| bool get(JSRuntime *rt, uint32_t hash, uint8_t *addr, |
| JSScript **scriptRes, jsbytecode **pcRes); |
| |
| void add(uint32_t hash, uint8_t *addr, jsbytecode *pc, JSScript *script) { |
| entries[hash].returnAddress = addr; |
| entries[hash].pc = pc; |
| entries[hash].script = script; |
| } |
| |
| static uint32_t Hash(uint8_t *addr) { |
| uint32_t key = (uint32_t)((uintptr_t)addr); |
| return ((key >> 3) * 2654435761u) % Length; |
| } |
| }; |
| |
| } // namespace jit |
| } // namespace js |
| |
| #endif /* jit_PcScriptCache_h */ |