| /* -*- 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_BytecodeAnalysis_h |
| #define jit_BytecodeAnalysis_h |
| |
| #include "jsscript.h" |
| #include "jit/JitAllocPolicy.h" |
| #include "js/Vector.h" |
| |
| namespace js { |
| namespace jit { |
| |
| // Basic information about bytecodes in the script. Used to help baseline compilation. |
| struct BytecodeInfo |
| { |
| static const uint16_t MAX_STACK_DEPTH = 0xffffU; |
| uint16_t stackDepth; |
| bool initialized : 1; |
| bool jumpTarget : 1; |
| |
| // If true, this is a JSOP_LOOPENTRY op inside a catch or finally block. |
| bool loopEntryInCatchOrFinally : 1; |
| |
| void init(unsigned depth) { |
| MOZ_ASSERT(depth <= MAX_STACK_DEPTH); |
| MOZ_ASSERT_IF(initialized, stackDepth == depth); |
| initialized = true; |
| stackDepth = depth; |
| } |
| }; |
| |
| class BytecodeAnalysis |
| { |
| JSScript* script_; |
| Vector<BytecodeInfo, 0, JitAllocPolicy> infos_; |
| |
| bool usesScopeChain_; |
| bool hasTryFinally_; |
| bool hasSetArg_; |
| |
| public: |
| explicit BytecodeAnalysis(TempAllocator& alloc, JSScript* script); |
| |
| bool init(TempAllocator& alloc, GSNCache& gsn); |
| |
| BytecodeInfo& info(jsbytecode* pc) { |
| MOZ_ASSERT(infos_[script_->pcToOffset(pc)].initialized); |
| return infos_[script_->pcToOffset(pc)]; |
| } |
| |
| BytecodeInfo* maybeInfo(jsbytecode* pc) { |
| if (infos_[script_->pcToOffset(pc)].initialized) |
| return &infos_[script_->pcToOffset(pc)]; |
| return nullptr; |
| } |
| |
| bool usesScopeChain() const { |
| return usesScopeChain_; |
| } |
| |
| bool hasTryFinally() const { |
| return hasTryFinally_; |
| } |
| |
| bool hasSetArg() const { |
| return hasSetArg_; |
| } |
| }; |
| |
| |
| } // namespace jit |
| } // namespace js |
| |
| #endif /* jit_BytecodeAnalysis_h */ |