1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/* 2e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke * Copyright (C) 2008, 2009, 2010 Apple Inc. All rights reserved. 3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2008 Cameron Zwarich <cwzwarich@uwaterloo.ca> 4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Redistribution and use in source and binary forms, with or without 6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modification, are permitted provided that the following conditions 7635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * are met: 8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * notice, this list of conditions and the following disclaimer. 11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * documentation and/or other materials provided with the distribution. 14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * its contributors may be used to endorse or promote products derived 16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * from this software without specific prior written permission. 17635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */ 29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "config.h" 31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "CodeBlock.h" 32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 33f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include "BytecodeGenerator.h" 34f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include "Debugger.h" 35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Interpreter.h" 36f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include "JIT.h" 37a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "JSActivation.h" 38231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "JSFunction.h" 39231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "JSStaticScopeObject.h" 40f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include "JSValue.h" 41a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "UStringConcatenate.h" 42635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <stdio.h> 43635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/StringExtras.h> 44635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#define DUMP_CODE_BLOCK_STATISTICS 0 46635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace JSC { 48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if !defined(NDEBUG) || ENABLE(OPCODE_SAMPLING) 50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 51635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic UString escapeQuotes(const UString& str) 52635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 53635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project UString result = str; 54f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick size_t pos = 0; 55f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick while ((pos = result.find('\"', pos)) != notFound) { 56a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch result = makeUString(result.substringSharingImpl(0, pos), "\"\\\"\"", result.substringSharingImpl(pos + 1)); 57635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project pos += 4; 58635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 59635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return result; 60635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 61635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic UString valueToSourceString(ExecState* exec, JSValue val) 63635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!val) 650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return "0"; 660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 67d0825bca7fe65beaee391d30da42e937db621564Steve Block if (val.isString()) 68a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return makeUString("\"", escapeQuotes(val.toString(exec)), "\""); 69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return val.toString(exec); 71635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic CString constantName(ExecState* exec, int k, JSValue value) 74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 75a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return makeUString(valueToSourceString(exec, value), "(@k", UString::number(k - FirstConstantRegisterIndex), ")").utf8(); 76635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 77635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 78635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic CString idName(int id0, const Identifier& ident) 79635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 80a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return makeUString(ident.ustring(), "(@id", UString::number(id0), ")").utf8(); 81635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 82635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 83643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockCString CodeBlock::registerName(ExecState* exec, int r) const 84643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{ 85643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (r == missingThisObjectMarker()) 86643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return "<null>"; 87643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 88643ca7872b450ea4efacab6188849e5aac2ba161Steve Block if (isConstantRegisterIndex(r)) 89643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return constantName(exec, r, getConstant(r)); 90643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 91a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return makeUString("r", UString::number(r)).utf8(); 92643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} 93643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 946c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenstatic UString regexpToSourceString(RegExp* regExp) 956c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen char postfix[5] = { '/', 0, 0, 0, 0 }; 976c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen int index = 1; 986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (regExp->global()) 996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen postfix[index++] = 'g'; 1006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (regExp->ignoreCase()) 1016c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen postfix[index++] = 'i'; 1026c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (regExp->multiline()) 1036c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen postfix[index] = 'm'; 1046c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 105a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return makeUString("/", regExp->pattern(), postfix); 1066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 1076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 1086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenstatic CString regexpName(int re, RegExp* regexp) 1096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{ 110a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return makeUString(regexpToSourceString(regexp), "(@re", UString::number(re), ")").utf8(); 1116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen} 1126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 113635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic UString pointerToSourceString(void* p) 114635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 115635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project char buffer[2 + 2 * sizeof(void*) + 1]; // 0x [two characters per byte] \0 116635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project snprintf(buffer, sizeof(buffer), "%p", p); 117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return buffer; 118635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 119635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 120635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectNEVER_INLINE static const char* debugHookName(int debugHookID) 121635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 122635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project switch (static_cast<DebugHookID>(debugHookID)) { 123635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case DidEnterCallFrame: 124635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return "didEnterCallFrame"; 125635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case WillLeaveCallFrame: 126635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return "willLeaveCallFrame"; 127635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case WillExecuteStatement: 128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return "willExecuteStatement"; 129635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case WillExecuteProgram: 130635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return "willExecuteProgram"; 131635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case DidExecuteProgram: 132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return "didExecuteProgram"; 133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case DidReachBreakpoint: 134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return "didReachBreakpoint"; 135635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 136635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 137635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT_NOT_REACHED(); 138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return ""; 139635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 140635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 141643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid CodeBlock::printUnaryOp(ExecState* exec, int location, Vector<Instruction>::const_iterator& it, const char* op) const 142635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 143635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 144635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r1 = (++it)->u.operand; 145635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 146dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] %s\t\t %s, %s\n", location, op, registerName(exec, r0).data(), registerName(exec, r1).data()); 147635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 148635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 149643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid CodeBlock::printBinaryOp(ExecState* exec, int location, Vector<Instruction>::const_iterator& it, const char* op) const 150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r1 = (++it)->u.operand; 153635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r2 = (++it)->u.operand; 154dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] %s\t\t %s, %s, %s\n", location, op, registerName(exec, r0).data(), registerName(exec, r1).data(), registerName(exec, r2).data()); 155635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 156635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 157643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid CodeBlock::printConditionalJump(ExecState* exec, const Vector<Instruction>::const_iterator&, Vector<Instruction>::const_iterator& it, int location, const char* op) const 158635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 159635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 160635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int offset = (++it)->u.operand; 161dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] %s\t\t %s, %d(->%d)\n", location, op, registerName(exec, r0).data(), offset, location + offset); 162635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 163635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 164643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid CodeBlock::printGetByIdOp(ExecState* exec, int location, Vector<Instruction>::const_iterator& it, const char* op) const 165635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 166635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 167635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r1 = (++it)->u.operand; 168635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int id0 = (++it)->u.operand; 169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] %s\t %s, %s, %s\n", location, op, registerName(exec, r0).data(), registerName(exec, r1).data(), idName(id0, m_identifiers[id0]).data()); 170635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project it += 4; 171635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 172635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 173643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid CodeBlock::printPutByIdOp(ExecState* exec, int location, Vector<Instruction>::const_iterator& it, const char* op) const 174635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 175635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 176635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int id0 = (++it)->u.operand; 177635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r1 = (++it)->u.operand; 178dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] %s\t %s, %s, %s\n", location, op, registerName(exec, r0).data(), idName(id0, m_identifiers[id0]).data(), registerName(exec, r1).data()); 179967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch it += 5; 180635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 181635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 182635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(JIT) 183635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic bool isGlobalResolve(OpcodeID opcodeID) 184635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1856c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return opcodeID == op_resolve_global || opcodeID == op_resolve_global_dynamic; 186635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 187635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 188635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic bool isPropertyAccess(OpcodeID opcodeID) 189635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 190635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project switch (opcodeID) { 191635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_get_by_id_self: 192635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_get_by_id_proto: 193635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_get_by_id_chain: 194635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_get_by_id_self_list: 195635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_get_by_id_proto_list: 196635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_put_by_id_transition: 197635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_put_by_id_replace: 198635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_get_by_id: 199635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_put_by_id: 200635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_get_by_id_generic: 201635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_put_by_id_generic: 202635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_get_array_length: 203635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_get_string_length: 204635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return true; 205635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project default: 206635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return false; 207635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 208635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 209635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 210635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic unsigned instructionOffsetForNth(ExecState* exec, const Vector<Instruction>& instructions, int nth, bool (*predicate)(OpcodeID)) 211635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 212635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t i = 0; 213635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project while (i < instructions.size()) { 214635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project OpcodeID currentOpcode = exec->interpreter()->getOpcodeID(instructions[i].u.opcode); 215635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (predicate(currentOpcode)) { 216635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!--nth) 217635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return i; 218635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 219635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project i += opcodeLengths[currentOpcode]; 220635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 221635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 222635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT_NOT_REACHED(); 223635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return 0; 224635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 225635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 226635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic void printGlobalResolveInfo(const GlobalResolveInfo& resolveInfo, unsigned instructionOffset) 227635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 228f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick printf(" [%4d] %s: %s\n", instructionOffset, "resolve_global", pointerToSourceString(resolveInfo.structure).utf8().data()); 229635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 230635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 231635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic void printStructureStubInfo(const StructureStubInfo& stubInfo, unsigned instructionOffset) 232635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 2330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch switch (stubInfo.accessType) { 2340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case access_get_by_id_self: 235f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick printf(" [%4d] %s: %s\n", instructionOffset, "get_by_id_self", pointerToSourceString(stubInfo.u.getByIdSelf.baseObjectStructure).utf8().data()); 236635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 2370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case access_get_by_id_proto: 238f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick printf(" [%4d] %s: %s, %s\n", instructionOffset, "get_by_id_proto", pointerToSourceString(stubInfo.u.getByIdProto.baseObjectStructure).utf8().data(), pointerToSourceString(stubInfo.u.getByIdProto.prototypeStructure).utf8().data()); 239635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 2400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case access_get_by_id_chain: 241f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick printf(" [%4d] %s: %s, %s\n", instructionOffset, "get_by_id_chain", pointerToSourceString(stubInfo.u.getByIdChain.baseObjectStructure).utf8().data(), pointerToSourceString(stubInfo.u.getByIdChain.chain).utf8().data()); 242635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 2430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case access_get_by_id_self_list: 244f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick printf(" [%4d] %s: %s (%d)\n", instructionOffset, "op_get_by_id_self_list", pointerToSourceString(stubInfo.u.getByIdSelfList.structureList).utf8().data(), stubInfo.u.getByIdSelfList.listSize); 245635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 2460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case access_get_by_id_proto_list: 247f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick printf(" [%4d] %s: %s (%d)\n", instructionOffset, "op_get_by_id_proto_list", pointerToSourceString(stubInfo.u.getByIdProtoList.structureList).utf8().data(), stubInfo.u.getByIdProtoList.listSize); 248635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 2490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case access_put_by_id_transition: 250f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick printf(" [%4d] %s: %s, %s, %s\n", instructionOffset, "put_by_id_transition", pointerToSourceString(stubInfo.u.putByIdTransition.previousStructure).utf8().data(), pointerToSourceString(stubInfo.u.putByIdTransition.structure).utf8().data(), pointerToSourceString(stubInfo.u.putByIdTransition.chain).utf8().data()); 251635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 2520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case access_put_by_id_replace: 253f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick printf(" [%4d] %s: %s\n", instructionOffset, "put_by_id_replace", pointerToSourceString(stubInfo.u.putByIdReplace.baseObjectStructure).utf8().data()); 254635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 2550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case access_get_by_id: 256635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" [%4d] %s\n", instructionOffset, "get_by_id"); 257635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 2580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case access_put_by_id: 259635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" [%4d] %s\n", instructionOffset, "put_by_id"); 260635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 2610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case access_get_by_id_generic: 262635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" [%4d] %s\n", instructionOffset, "op_get_by_id_generic"); 263635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 2640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case access_put_by_id_generic: 265635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" [%4d] %s\n", instructionOffset, "op_put_by_id_generic"); 266635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 2670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case access_get_array_length: 268635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" [%4d] %s\n", instructionOffset, "op_get_array_length"); 269635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 2700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch case access_get_string_length: 271635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" [%4d] %s\n", instructionOffset, "op_get_string_length"); 272635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 273635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project default: 274635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT_NOT_REACHED(); 275635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 276635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 277635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 278635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 279635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid CodeBlock::printStructure(const char* name, const Instruction* vPC, int operand) const 280635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 281635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project unsigned instructionOffset = vPC - m_instructions.begin(); 282f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick printf(" [%4d] %s: %s\n", instructionOffset, name, pointerToSourceString(vPC[operand].u.structure).utf8().data()); 283635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 284635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 285635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid CodeBlock::printStructures(const Instruction* vPC) const 286635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 287635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Interpreter* interpreter = m_globalData->interpreter; 288635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project unsigned instructionOffset = vPC - m_instructions.begin(); 289635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 290635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id)) { 291635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printStructure("get_by_id", vPC, 4); 292635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 293635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 294635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_self)) { 295635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printStructure("get_by_id_self", vPC, 4); 296635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 297635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 298635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_proto)) { 299f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick printf(" [%4d] %s: %s, %s\n", instructionOffset, "get_by_id_proto", pointerToSourceString(vPC[4].u.structure).utf8().data(), pointerToSourceString(vPC[5].u.structure).utf8().data()); 300635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 301635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 302635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (vPC[0].u.opcode == interpreter->getOpcode(op_put_by_id_transition)) { 303f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick printf(" [%4d] %s: %s, %s, %s\n", instructionOffset, "put_by_id_transition", pointerToSourceString(vPC[4].u.structure).utf8().data(), pointerToSourceString(vPC[5].u.structure).utf8().data(), pointerToSourceString(vPC[6].u.structureChain).utf8().data()); 304635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 305635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 306635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_chain)) { 307f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick printf(" [%4d] %s: %s, %s\n", instructionOffset, "get_by_id_chain", pointerToSourceString(vPC[4].u.structure).utf8().data(), pointerToSourceString(vPC[5].u.structureChain).utf8().data()); 308635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 309635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 310635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (vPC[0].u.opcode == interpreter->getOpcode(op_put_by_id)) { 311635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printStructure("put_by_id", vPC, 4); 312635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 313635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 314635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (vPC[0].u.opcode == interpreter->getOpcode(op_put_by_id_replace)) { 315635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printStructure("put_by_id_replace", vPC, 4); 316635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 317635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 318635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (vPC[0].u.opcode == interpreter->getOpcode(op_resolve_global)) { 319635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printStructure("resolve_global", vPC, 4); 320635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 321635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 3226c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (vPC[0].u.opcode == interpreter->getOpcode(op_resolve_global_dynamic)) { 3236c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen printStructure("resolve_global_dynamic", vPC, 4); 3246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return; 3256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 326635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 327635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // These m_instructions doesn't ref Structures. 328635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_generic) || vPC[0].u.opcode == interpreter->getOpcode(op_put_by_id_generic) || vPC[0].u.opcode == interpreter->getOpcode(op_call) || vPC[0].u.opcode == interpreter->getOpcode(op_call_eval) || vPC[0].u.opcode == interpreter->getOpcode(op_construct)); 329635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 330635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 331635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid CodeBlock::dump(ExecState* exec) const 332635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 333635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_instructions.isEmpty()) { 334635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("No instructions available.\n"); 335635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 336635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 337635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 338635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t instructionCount = 0; 339635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 340635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (size_t i = 0; i < m_instructions.size(); i += opcodeLengths[exec->interpreter()->getOpcodeID(m_instructions[i].u.opcode)]) 341635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++instructionCount; 342635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 343635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("%lu m_instructions; %lu bytes at %p; %d parameter(s); %d callee register(s)\n\n", 344635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project static_cast<unsigned long>(instructionCount), 345635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project static_cast<unsigned long>(m_instructions.size() * sizeof(Instruction)), 346635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project this, m_numParameters, m_numCalleeRegisters); 347635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 348635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Vector<Instruction>::const_iterator begin = m_instructions.begin(); 349635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Vector<Instruction>::const_iterator end = m_instructions.end(); 350635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (Vector<Instruction>::const_iterator it = begin; it != end; ++it) 351635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project dump(exec, begin, it); 352635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 353635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_identifiers.isEmpty()) { 354635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("\nIdentifiers:\n"); 355635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t i = 0; 356635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project do { 357f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick printf(" id%u = %s\n", static_cast<unsigned>(i), m_identifiers[i].ustring().utf8().data()); 358635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++i; 359635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } while (i != m_identifiers.size()); 360635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 361635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 362635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_constantRegisters.isEmpty()) { 363635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("\nConstants:\n"); 364635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project unsigned registerIndex = m_numVars; 365635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t i = 0; 366635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project do { 3672bde8e466a4451c7319e3a072d118917957d6554Steve Block printf(" k%u = %s\n", registerIndex, valueToSourceString(exec, m_constantRegisters[i].get()).utf8().data()); 368635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++i; 369635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++registerIndex; 370635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } while (i < m_constantRegisters.size()); 371635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 372635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3736c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (m_rareData && !m_rareData->m_regexps.isEmpty()) { 3746c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen printf("\nm_regexps:\n"); 3756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen size_t i = 0; 3766c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen do { 377f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick printf(" re%u = %s\n", static_cast<unsigned>(i), regexpToSourceString(m_rareData->m_regexps[i].get()).utf8().data()); 3786c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen ++i; 3796c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } while (i < m_rareData->m_regexps.size()); 3806c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 3816c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen 382635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(JIT) 383635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_globalResolveInfos.isEmpty() || !m_structureStubInfos.isEmpty()) 384635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("\nStructures:\n"); 385635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 386635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_globalResolveInfos.isEmpty()) { 387635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t i = 0; 388635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project do { 389635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printGlobalResolveInfo(m_globalResolveInfos[i], instructionOffsetForNth(exec, m_instructions, i + 1, isGlobalResolve)); 390635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++i; 391635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } while (i < m_globalResolveInfos.size()); 392635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 393635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_structureStubInfos.isEmpty()) { 394635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t i = 0; 395635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project do { 396635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printStructureStubInfo(m_structureStubInfos[i], instructionOffsetForNth(exec, m_instructions, i + 1, isPropertyAccess)); 397635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++i; 398635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } while (i < m_structureStubInfos.size()); 399635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 400635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#else 401635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_globalResolveInstructions.isEmpty() || !m_propertyAccessInstructions.isEmpty()) 402635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("\nStructures:\n"); 403635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 404635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_globalResolveInstructions.isEmpty()) { 405635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t i = 0; 406635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project do { 407635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printStructures(&m_instructions[m_globalResolveInstructions[i]]); 408635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++i; 409635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } while (i < m_globalResolveInstructions.size()); 410635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 411635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_propertyAccessInstructions.isEmpty()) { 412635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t i = 0; 413635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project do { 414635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printStructures(&m_instructions[m_propertyAccessInstructions[i]]); 415635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++i; 416635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } while (i < m_propertyAccessInstructions.size()); 417635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 418635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 419635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 420635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_rareData && !m_rareData->m_exceptionHandlers.isEmpty()) { 421635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("\nException Handlers:\n"); 422635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project unsigned i = 0; 423635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project do { 424635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("\t %d: { start: [%4d] end: [%4d] target: [%4d] }\n", i + 1, m_rareData->m_exceptionHandlers[i].start, m_rareData->m_exceptionHandlers[i].end, m_rareData->m_exceptionHandlers[i].target); 425635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++i; 426635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } while (i < m_rareData->m_exceptionHandlers.size()); 427635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 428635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 429635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_rareData && !m_rareData->m_immediateSwitchJumpTables.isEmpty()) { 430635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("Immediate Switch Jump Tables:\n"); 431635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project unsigned i = 0; 432635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project do { 433635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" %1d = {\n", i); 434635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int entry = 0; 435635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Vector<int32_t>::const_iterator end = m_rareData->m_immediateSwitchJumpTables[i].branchOffsets.end(); 436635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (Vector<int32_t>::const_iterator iter = m_rareData->m_immediateSwitchJumpTables[i].branchOffsets.begin(); iter != end; ++iter, ++entry) { 437635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!*iter) 438635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project continue; 439635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("\t\t%4d => %04d\n", entry + m_rareData->m_immediateSwitchJumpTables[i].min, *iter); 440635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 441635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" }\n"); 442635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++i; 443635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } while (i < m_rareData->m_immediateSwitchJumpTables.size()); 444635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 445635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 446635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_rareData && !m_rareData->m_characterSwitchJumpTables.isEmpty()) { 447635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("\nCharacter Switch Jump Tables:\n"); 448635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project unsigned i = 0; 449635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project do { 450635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" %1d = {\n", i); 451635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int entry = 0; 452635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Vector<int32_t>::const_iterator end = m_rareData->m_characterSwitchJumpTables[i].branchOffsets.end(); 453635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (Vector<int32_t>::const_iterator iter = m_rareData->m_characterSwitchJumpTables[i].branchOffsets.begin(); iter != end; ++iter, ++entry) { 454635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!*iter) 455635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project continue; 456635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(!((i + m_rareData->m_characterSwitchJumpTables[i].min) & ~0xFFFF)); 457635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project UChar ch = static_cast<UChar>(entry + m_rareData->m_characterSwitchJumpTables[i].min); 458f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick printf("\t\t\"%s\" => %04d\n", UString(&ch, 1).utf8().data(), *iter); 459635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 460635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" }\n"); 461635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++i; 462635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } while (i < m_rareData->m_characterSwitchJumpTables.size()); 463635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 464635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 465635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_rareData && !m_rareData->m_stringSwitchJumpTables.isEmpty()) { 466635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("\nString Switch Jump Tables:\n"); 467635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project unsigned i = 0; 468635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project do { 469635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" %1d = {\n", i); 470635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project StringJumpTable::StringOffsetTable::const_iterator end = m_rareData->m_stringSwitchJumpTables[i].offsetTable.end(); 471635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (StringJumpTable::StringOffsetTable::const_iterator iter = m_rareData->m_stringSwitchJumpTables[i].offsetTable.begin(); iter != end; ++iter) 472f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick printf("\t\t\"%s\" => %04d\n", UString(iter->first).utf8().data(), iter->second.branchOffset); 473635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf(" }\n"); 474635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++i; 475635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } while (i < m_rareData->m_stringSwitchJumpTables.size()); 476635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 477635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 478635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("\n"); 479635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 480635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 481635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid CodeBlock::dump(ExecState* exec, const Vector<Instruction>::const_iterator& begin, Vector<Instruction>::const_iterator& it) const 482635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 483635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int location = it - begin; 484635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project switch (exec->interpreter()->getOpcodeID(it->u.opcode)) { 485635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_enter: { 486635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("[%4d] enter\n", location); 487635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 488635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 489a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch case op_create_activation: { 490635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 491a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch printf("[%4d] create_activation %s\n", location, registerName(exec, r0).data()); 492635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 493635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 494635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_create_arguments: { 495e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block int r0 = (++it)->u.operand; 496e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block printf("[%4d] create_arguments\t %s\n", location, registerName(exec, r0).data()); 497635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 498635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 499bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen case op_init_lazy_reg: { 500e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block int r0 = (++it)->u.operand; 501bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen printf("[%4d] init_lazy_reg\t %s\n", location, registerName(exec, r0).data()); 5025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian break; 5035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 5045af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke case op_get_callee: { 5055af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke int r0 = (++it)->u.operand; 5065af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke printf("[%4d] op_get_callee %s\n", location, registerName(exec, r0).data()); 5075af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke break; 5085af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } 5095af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke case op_create_this: { 5105af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke int r0 = (++it)->u.operand; 5115af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke int r1 = (++it)->u.operand; 5125af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke printf("[%4d] create_this %s %s\n", location, registerName(exec, r0).data(), registerName(exec, r1).data()); 5135af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke break; 5145af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke } 515635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_convert_this: { 516635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 517dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] convert_this %s\n", location, registerName(exec, r0).data()); 518635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 519635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 520a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch case op_convert_this_strict: { 521a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch int r0 = (++it)->u.operand; 522a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch printf("[%4d] convert_this_strict %s\n", location, registerName(exec, r0).data()); 523a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch break; 524a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch } 525635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_new_object: { 526635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 527dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] new_object\t %s\n", location, registerName(exec, r0).data()); 528635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 529635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 530635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_new_array: { 531635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int dst = (++it)->u.operand; 532635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int argv = (++it)->u.operand; 533635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int argc = (++it)->u.operand; 534dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] new_array\t %s, %s, %d\n", location, registerName(exec, dst).data(), registerName(exec, argv).data(), argc); 535635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 536635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 5376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen case op_new_regexp: { 5386c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen int r0 = (++it)->u.operand; 5396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen int re0 = (++it)->u.operand; 5406c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen printf("[%4d] new_regexp\t %s, %s\n", location, registerName(exec, r0).data(), regexpName(re0, regexp(re0)).data()); 5416c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen break; 5426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 543635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_mov: { 544635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 545635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r1 = (++it)->u.operand; 546dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] mov\t\t %s, %s\n", location, registerName(exec, r0).data(), registerName(exec, r1).data()); 547635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 548635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 549635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_not: { 550643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printUnaryOp(exec, location, it, "not"); 551635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 552635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 553635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_eq: { 554643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printBinaryOp(exec, location, it, "eq"); 555635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 556635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 557635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_eq_null: { 558643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printUnaryOp(exec, location, it, "eq_null"); 559635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 560635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 561635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_neq: { 562643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printBinaryOp(exec, location, it, "neq"); 563635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 564635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 565635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_neq_null: { 566643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printUnaryOp(exec, location, it, "neq_null"); 567635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 568635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 569635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_stricteq: { 570643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printBinaryOp(exec, location, it, "stricteq"); 571635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 572635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 573635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_nstricteq: { 574643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printBinaryOp(exec, location, it, "nstricteq"); 575635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 576635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 577635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_less: { 578643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printBinaryOp(exec, location, it, "less"); 579635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 580635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 581635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_lesseq: { 582643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printBinaryOp(exec, location, it, "lesseq"); 583635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 584635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 585635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_pre_inc: { 586635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 587dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] pre_inc\t\t %s\n", location, registerName(exec, r0).data()); 588635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 589635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 590635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_pre_dec: { 591635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 592dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] pre_dec\t\t %s\n", location, registerName(exec, r0).data()); 593635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 594635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 595635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_post_inc: { 596643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printUnaryOp(exec, location, it, "post_inc"); 597635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 598635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 599635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_post_dec: { 600643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printUnaryOp(exec, location, it, "post_dec"); 601635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 602635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 603635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_to_jsnumber: { 604643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printUnaryOp(exec, location, it, "to_jsnumber"); 605635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 606635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 607635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_negate: { 608643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printUnaryOp(exec, location, it, "negate"); 609635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 610635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 611635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_add: { 612643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printBinaryOp(exec, location, it, "add"); 613635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++it; 614635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 615635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 616635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_mul: { 617643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printBinaryOp(exec, location, it, "mul"); 618635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++it; 619635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 620635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 621635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_div: { 622643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printBinaryOp(exec, location, it, "div"); 6230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch ++it; 624635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 625635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 626635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_mod: { 627643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printBinaryOp(exec, location, it, "mod"); 628635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 629635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 630635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_sub: { 631643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printBinaryOp(exec, location, it, "sub"); 632635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++it; 633635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 634635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 635635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_lshift: { 636643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printBinaryOp(exec, location, it, "lshift"); 637635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 638635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 639635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_rshift: { 640643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printBinaryOp(exec, location, it, "rshift"); 641635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 642635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 643635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_urshift: { 644643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printBinaryOp(exec, location, it, "urshift"); 645635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 646635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 647635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_bitand: { 648643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printBinaryOp(exec, location, it, "bitand"); 649635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++it; 650635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 651635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 652635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_bitxor: { 653643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printBinaryOp(exec, location, it, "bitxor"); 654635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++it; 655635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 656635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 657635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_bitor: { 658643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printBinaryOp(exec, location, it, "bitor"); 659635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++it; 660635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 661635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 662635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_bitnot: { 663643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printUnaryOp(exec, location, it, "bitnot"); 664635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 665635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 6666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner case op_check_has_instance: { 6676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner int base = (++it)->u.operand; 6686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner printf("[%4d] check_has_instance\t\t %s\n", location, registerName(exec, base).data()); 6696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner break; 6706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner } 671635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_instanceof: { 672635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 673635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r1 = (++it)->u.operand; 674635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r2 = (++it)->u.operand; 675635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r3 = (++it)->u.operand; 676dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] instanceof\t\t %s, %s, %s, %s\n", location, registerName(exec, r0).data(), registerName(exec, r1).data(), registerName(exec, r2).data(), registerName(exec, r3).data()); 677635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 678635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 679635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_typeof: { 680643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printUnaryOp(exec, location, it, "typeof"); 681635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 682635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 683635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_is_undefined: { 684643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printUnaryOp(exec, location, it, "is_undefined"); 685635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 686635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 687635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_is_boolean: { 688643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printUnaryOp(exec, location, it, "is_boolean"); 689635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 690635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 691635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_is_number: { 692643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printUnaryOp(exec, location, it, "is_number"); 693635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 694635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 695635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_is_string: { 696643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printUnaryOp(exec, location, it, "is_string"); 697635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 698635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 699635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_is_object: { 700643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printUnaryOp(exec, location, it, "is_object"); 701635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 702635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 703635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_is_function: { 704643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printUnaryOp(exec, location, it, "is_function"); 705635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 706635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 707635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_in: { 708643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printBinaryOp(exec, location, it, "in"); 709635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 710635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 711635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_resolve: { 712635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 713635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int id0 = (++it)->u.operand; 714dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] resolve\t\t %s, %s\n", location, registerName(exec, r0).data(), idName(id0, m_identifiers[id0]).data()); 715635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 716635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 717635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_resolve_skip: { 718635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 719635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int id0 = (++it)->u.operand; 720635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int skipLevels = (++it)->u.operand; 721dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] resolve_skip\t %s, %s, %d\n", location, registerName(exec, r0).data(), idName(id0, m_identifiers[id0]).data(), skipLevels); 722635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 723635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 724635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_resolve_global: { 725635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 726635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int id0 = (++it)->u.operand; 727bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen printf("[%4d] resolve_global\t %s, %s\n", location, registerName(exec, r0).data(), idName(id0, m_identifiers[id0]).data()); 728635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project it += 2; 729635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 730635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 7316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen case op_resolve_global_dynamic: { 7326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen int r0 = (++it)->u.operand; 7336c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen int id0 = (++it)->u.operand; 7342bde8e466a4451c7319e3a072d118917957d6554Steve Block JSValue scope = JSValue((++it)->u.jsCell.get()); 735bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen ++it; 736a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch int depth = (++it)->u.operand; 737f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick printf("[%4d] resolve_global_dynamic\t %s, %s, %s, %d\n", location, registerName(exec, r0).data(), valueToSourceString(exec, scope).utf8().data(), idName(id0, m_identifiers[id0]).data(), depth); 7386c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen break; 7396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen } 740635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_get_scoped_var: { 741635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 742635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int index = (++it)->u.operand; 743635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int skipLevels = (++it)->u.operand; 744dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] get_scoped_var\t %s, %d, %d\n", location, registerName(exec, r0).data(), index, skipLevels); 745635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 746635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 747635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_put_scoped_var: { 748635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int index = (++it)->u.operand; 749635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int skipLevels = (++it)->u.operand; 750635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 751dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] put_scoped_var\t %d, %d, %s\n", location, index, skipLevels, registerName(exec, r0).data()); 752635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 753635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 754635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_get_global_var: { 755635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 756635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int index = (++it)->u.operand; 757bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen printf("[%4d] get_global_var\t %s, %d\n", location, registerName(exec, r0).data(), index); 758635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 759635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 760635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_put_global_var: { 761635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int index = (++it)->u.operand; 762635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 763bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen printf("[%4d] put_global_var\t %d, %s\n", location, index, registerName(exec, r0).data()); 764635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 765635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 766635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_resolve_base: { 767635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 768635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int id0 = (++it)->u.operand; 769a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch int isStrict = (++it)->u.operand; 770a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch printf("[%4d] resolve_base%s\t %s, %s\n", location, isStrict ? "_strict" : "", registerName(exec, r0).data(), idName(id0, m_identifiers[id0]).data()); 771a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch break; 772a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch } 773a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch case op_ensure_property_exists: { 774a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch int r0 = (++it)->u.operand; 775a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch int id0 = (++it)->u.operand; 776a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch printf("[%4d] ensure_property_exists\t %s, %s\n", location, registerName(exec, r0).data(), idName(id0, m_identifiers[id0]).data()); 777635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 778635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 779635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_resolve_with_base: { 780635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 781635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r1 = (++it)->u.operand; 782635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int id0 = (++it)->u.operand; 783dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] resolve_with_base %s, %s, %s\n", location, registerName(exec, r0).data(), registerName(exec, r1).data(), idName(id0, m_identifiers[id0]).data()); 784635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 785635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 786635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_get_by_id: { 787643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printGetByIdOp(exec, location, it, "get_by_id"); 788635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 789635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 790635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_get_by_id_self: { 791643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printGetByIdOp(exec, location, it, "get_by_id_self"); 792635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 793635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 794635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_get_by_id_self_list: { 795643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printGetByIdOp(exec, location, it, "get_by_id_self_list"); 796635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 797635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 798635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_get_by_id_proto: { 799643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printGetByIdOp(exec, location, it, "get_by_id_proto"); 800635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 801635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 802635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_get_by_id_proto_list: { 803643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printGetByIdOp(exec, location, it, "op_get_by_id_proto_list"); 804635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 805635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 806635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_get_by_id_chain: { 807643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printGetByIdOp(exec, location, it, "get_by_id_chain"); 808635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 809635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 810692e5dbf12901edacf14812a6fae25462920af42Steve Block case op_get_by_id_getter_self: { 811692e5dbf12901edacf14812a6fae25462920af42Steve Block printGetByIdOp(exec, location, it, "get_by_id_getter_self"); 812692e5dbf12901edacf14812a6fae25462920af42Steve Block break; 813692e5dbf12901edacf14812a6fae25462920af42Steve Block } 814692e5dbf12901edacf14812a6fae25462920af42Steve Block case op_get_by_id_getter_self_list: { 815692e5dbf12901edacf14812a6fae25462920af42Steve Block printGetByIdOp(exec, location, it, "get_by_id_getter_self_list"); 816692e5dbf12901edacf14812a6fae25462920af42Steve Block break; 817692e5dbf12901edacf14812a6fae25462920af42Steve Block } 818692e5dbf12901edacf14812a6fae25462920af42Steve Block case op_get_by_id_getter_proto: { 819692e5dbf12901edacf14812a6fae25462920af42Steve Block printGetByIdOp(exec, location, it, "get_by_id_getter_proto"); 820692e5dbf12901edacf14812a6fae25462920af42Steve Block break; 821692e5dbf12901edacf14812a6fae25462920af42Steve Block } 822692e5dbf12901edacf14812a6fae25462920af42Steve Block case op_get_by_id_getter_proto_list: { 823692e5dbf12901edacf14812a6fae25462920af42Steve Block printGetByIdOp(exec, location, it, "get_by_id_getter_proto_list"); 824692e5dbf12901edacf14812a6fae25462920af42Steve Block break; 825692e5dbf12901edacf14812a6fae25462920af42Steve Block } 826692e5dbf12901edacf14812a6fae25462920af42Steve Block case op_get_by_id_getter_chain: { 827692e5dbf12901edacf14812a6fae25462920af42Steve Block printGetByIdOp(exec, location, it, "get_by_id_getter_chain"); 828692e5dbf12901edacf14812a6fae25462920af42Steve Block break; 829692e5dbf12901edacf14812a6fae25462920af42Steve Block } 830dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block case op_get_by_id_custom_self: { 831dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printGetByIdOp(exec, location, it, "get_by_id_custom_self"); 832dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block break; 833dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 834dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block case op_get_by_id_custom_self_list: { 835dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printGetByIdOp(exec, location, it, "get_by_id_custom_self_list"); 836dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block break; 837dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 838dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block case op_get_by_id_custom_proto: { 839dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printGetByIdOp(exec, location, it, "get_by_id_custom_proto"); 840dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block break; 841dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 842dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block case op_get_by_id_custom_proto_list: { 843dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printGetByIdOp(exec, location, it, "get_by_id_custom_proto_list"); 844dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block break; 845dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 846dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block case op_get_by_id_custom_chain: { 847dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printGetByIdOp(exec, location, it, "get_by_id_custom_chain"); 848dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block break; 849dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 850635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_get_by_id_generic: { 851643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printGetByIdOp(exec, location, it, "get_by_id_generic"); 852635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 853635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 854635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_get_array_length: { 855643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printGetByIdOp(exec, location, it, "get_array_length"); 856635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 857635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 858635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_get_string_length: { 859643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printGetByIdOp(exec, location, it, "get_string_length"); 860635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 861635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 862bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen case op_get_arguments_length: { 863bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen printUnaryOp(exec, location, it, "get_arguments_length"); 864bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen it++; 865bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen break; 866bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen } 867635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_put_by_id: { 868643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printPutByIdOp(exec, location, it, "put_by_id"); 869635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 870635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 871635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_put_by_id_replace: { 872643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printPutByIdOp(exec, location, it, "put_by_id_replace"); 873635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 874635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 875635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_put_by_id_transition: { 876643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printPutByIdOp(exec, location, it, "put_by_id_transition"); 877635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 878635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 879635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_put_by_id_generic: { 880643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printPutByIdOp(exec, location, it, "put_by_id_generic"); 881635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 882635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 883635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_put_getter: { 884635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 885635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int id0 = (++it)->u.operand; 886635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r1 = (++it)->u.operand; 887dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] put_getter\t %s, %s, %s\n", location, registerName(exec, r0).data(), idName(id0, m_identifiers[id0]).data(), registerName(exec, r1).data()); 888635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 889635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 890635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_put_setter: { 891635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 892635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int id0 = (++it)->u.operand; 893635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r1 = (++it)->u.operand; 894dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] put_setter\t %s, %s, %s\n", location, registerName(exec, r0).data(), idName(id0, m_identifiers[id0]).data(), registerName(exec, r1).data()); 895635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 896635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 8975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian case op_method_check: { 898643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printf("[%4d] method_check\n", location); 8995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian break; 9005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 901635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_del_by_id: { 902635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 903635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r1 = (++it)->u.operand; 904635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int id0 = (++it)->u.operand; 905dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] del_by_id\t %s, %s, %s\n", location, registerName(exec, r0).data(), registerName(exec, r1).data(), idName(id0, m_identifiers[id0]).data()); 906635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 907635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 908635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_get_by_val: { 909635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 910635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r1 = (++it)->u.operand; 911635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r2 = (++it)->u.operand; 912dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] get_by_val\t %s, %s, %s\n", location, registerName(exec, r0).data(), registerName(exec, r1).data(), registerName(exec, r2).data()); 913635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 914635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 915bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen case op_get_argument_by_val: { 916bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen int r0 = (++it)->u.operand; 917bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen int r1 = (++it)->u.operand; 918bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen int r2 = (++it)->u.operand; 919bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen printf("[%4d] get_argument_by_val\t %s, %s, %s\n", location, registerName(exec, r0).data(), registerName(exec, r1).data(), registerName(exec, r2).data()); 920bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen break; 921bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen } 922cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block case op_get_by_pname: { 923cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block int r0 = (++it)->u.operand; 924cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block int r1 = (++it)->u.operand; 925cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block int r2 = (++it)->u.operand; 926cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block int r3 = (++it)->u.operand; 927cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block int r4 = (++it)->u.operand; 928cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block int r5 = (++it)->u.operand; 929dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] get_by_pname\t %s, %s, %s, %s, %s, %s\n", location, registerName(exec, r0).data(), registerName(exec, r1).data(), registerName(exec, r2).data(), registerName(exec, r3).data(), registerName(exec, r4).data(), registerName(exec, r5).data()); 930cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block break; 931cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } 932635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_put_by_val: { 933635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 934635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r1 = (++it)->u.operand; 935635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r2 = (++it)->u.operand; 936dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] put_by_val\t %s, %s, %s\n", location, registerName(exec, r0).data(), registerName(exec, r1).data(), registerName(exec, r2).data()); 937635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 938635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 939635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_del_by_val: { 940635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 941635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r1 = (++it)->u.operand; 942635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r2 = (++it)->u.operand; 943dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] del_by_val\t %s, %s, %s\n", location, registerName(exec, r0).data(), registerName(exec, r1).data(), registerName(exec, r2).data()); 944635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 945635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 946635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_put_by_index: { 947635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 948635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project unsigned n0 = (++it)->u.operand; 949635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r1 = (++it)->u.operand; 950dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] put_by_index\t %s, %u, %s\n", location, registerName(exec, r0).data(), n0, registerName(exec, r1).data()); 951635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 952635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 953635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_jmp: { 954635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int offset = (++it)->u.operand; 955cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block printf("[%4d] jmp\t\t %d(->%d)\n", location, offset, location + offset); 956635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 957635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 958635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_loop: { 959635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int offset = (++it)->u.operand; 960cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block printf("[%4d] loop\t\t %d(->%d)\n", location, offset, location + offset); 961635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 962635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 963635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_jtrue: { 964643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printConditionalJump(exec, begin, it, location, "jtrue"); 965635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 966635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 967635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_loop_if_true: { 968643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printConditionalJump(exec, begin, it, location, "loop_if_true"); 969643ca7872b450ea4efacab6188849e5aac2ba161Steve Block break; 970643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 971643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case op_loop_if_false: { 972643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printConditionalJump(exec, begin, it, location, "loop_if_false"); 973635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 974635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 975635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_jfalse: { 976643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printConditionalJump(exec, begin, it, location, "jfalse"); 977635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 978635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 979635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_jeq_null: { 980643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printConditionalJump(exec, begin, it, location, "jeq_null"); 981635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 982635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 983635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_jneq_null: { 984643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printConditionalJump(exec, begin, it, location, "jneq_null"); 985635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 986635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 9875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian case op_jneq_ptr: { 9885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian int r0 = (++it)->u.operand; 9895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian int r1 = (++it)->u.operand; 9905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian int offset = (++it)->u.operand; 991dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] jneq_ptr\t\t %s, %s, %d(->%d)\n", location, registerName(exec, r0).data(), registerName(exec, r1).data(), offset, location + offset); 9925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian break; 9935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 994635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_jnless: { 995635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 996635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r1 = (++it)->u.operand; 997635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int offset = (++it)->u.operand; 998dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] jnless\t\t %s, %s, %d(->%d)\n", location, registerName(exec, r0).data(), registerName(exec, r1).data(), offset, location + offset); 999635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1000635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 10015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian case op_jnlesseq: { 10025f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian int r0 = (++it)->u.operand; 10035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian int r1 = (++it)->u.operand; 10045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian int offset = (++it)->u.operand; 1005dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] jnlesseq\t\t %s, %s, %d(->%d)\n", location, registerName(exec, r0).data(), registerName(exec, r1).data(), offset, location + offset); 10065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian break; 10075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 1008635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_loop_if_less: { 1009635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 1010635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r1 = (++it)->u.operand; 1011635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int offset = (++it)->u.operand; 1012dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] loop_if_less\t %s, %s, %d(->%d)\n", location, registerName(exec, r0).data(), registerName(exec, r1).data(), offset, location + offset); 1013643ca7872b450ea4efacab6188849e5aac2ba161Steve Block break; 1014643ca7872b450ea4efacab6188849e5aac2ba161Steve Block } 1015643ca7872b450ea4efacab6188849e5aac2ba161Steve Block case op_jless: { 1016643ca7872b450ea4efacab6188849e5aac2ba161Steve Block int r0 = (++it)->u.operand; 1017643ca7872b450ea4efacab6188849e5aac2ba161Steve Block int r1 = (++it)->u.operand; 1018643ca7872b450ea4efacab6188849e5aac2ba161Steve Block int offset = (++it)->u.operand; 1019dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] jless\t\t %s, %s, %d(->%d)\n", location, registerName(exec, r0).data(), registerName(exec, r1).data(), offset, location + offset); 1020635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1021635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 102221939df44de1705786c545cd1bf519d47250322dBen Murdoch case op_jlesseq: { 102321939df44de1705786c545cd1bf519d47250322dBen Murdoch int r0 = (++it)->u.operand; 102421939df44de1705786c545cd1bf519d47250322dBen Murdoch int r1 = (++it)->u.operand; 102521939df44de1705786c545cd1bf519d47250322dBen Murdoch int offset = (++it)->u.operand; 102621939df44de1705786c545cd1bf519d47250322dBen Murdoch printf("[%4d] jlesseq\t\t %s, %s, %d(->%d)\n", location, registerName(exec, r0).data(), registerName(exec, r1).data(), offset, location + offset); 102721939df44de1705786c545cd1bf519d47250322dBen Murdoch break; 102821939df44de1705786c545cd1bf519d47250322dBen Murdoch } 1029635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_loop_if_lesseq: { 1030635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 1031635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r1 = (++it)->u.operand; 1032635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int offset = (++it)->u.operand; 1033dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] loop_if_lesseq\t %s, %s, %d(->%d)\n", location, registerName(exec, r0).data(), registerName(exec, r1).data(), offset, location + offset); 1034635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1035635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1036635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_switch_imm: { 1037635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int tableIndex = (++it)->u.operand; 1038635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int defaultTarget = (++it)->u.operand; 1039635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int scrutineeRegister = (++it)->u.operand; 1040dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] switch_imm\t %d, %d(->%d), %s\n", location, tableIndex, defaultTarget, location + defaultTarget, registerName(exec, scrutineeRegister).data()); 1041635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1042635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1043635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_switch_char: { 1044635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int tableIndex = (++it)->u.operand; 1045635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int defaultTarget = (++it)->u.operand; 1046635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int scrutineeRegister = (++it)->u.operand; 1047dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] switch_char\t %d, %d(->%d), %s\n", location, tableIndex, defaultTarget, location + defaultTarget, registerName(exec, scrutineeRegister).data()); 1048635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1049635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1050635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_switch_string: { 1051635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int tableIndex = (++it)->u.operand; 1052635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int defaultTarget = (++it)->u.operand; 1053635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int scrutineeRegister = (++it)->u.operand; 1054dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] switch_string\t %d, %d(->%d), %s\n", location, tableIndex, defaultTarget, location + defaultTarget, registerName(exec, scrutineeRegister).data()); 1055635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1056635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1057635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_new_func: { 1058635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 1059635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int f0 = (++it)->u.operand; 1060bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen int shouldCheck = (++it)->u.operand; 1061bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen printf("[%4d] new_func\t\t %s, f%d, %s\n", location, registerName(exec, r0).data(), f0, shouldCheck ? "<Checked>" : "<Unchecked>"); 1062635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1063635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1064635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_new_func_exp: { 1065635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 1066635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int f0 = (++it)->u.operand; 1067dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] new_func_exp\t %s, f%d\n", location, registerName(exec, r0).data(), f0); 1068635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1069635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1070635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_call: { 1071635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int func = (++it)->u.operand; 1072635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int argCount = (++it)->u.operand; 1073635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int registerOffset = (++it)->u.operand; 1074e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block printf("[%4d] call\t\t %s, %d, %d\n", location, registerName(exec, func).data(), argCount, registerOffset); 1075635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1076635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1077635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_call_eval: { 1078635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int func = (++it)->u.operand; 1079635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int argCount = (++it)->u.operand; 1080635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int registerOffset = (++it)->u.operand; 1081e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block printf("[%4d] call_eval\t %s, %d, %d\n", location, registerName(exec, func).data(), argCount, registerOffset); 1082635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1083635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 10845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian case op_call_varargs: { 10855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian int func = (++it)->u.operand; 10865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian int argCount = (++it)->u.operand; 10875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian int registerOffset = (++it)->u.operand; 1088e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block printf("[%4d] call_varargs\t %s, %s, %d\n", location, registerName(exec, func).data(), registerName(exec, argCount).data(), registerOffset); 10895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian break; 10905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 10915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian case op_load_varargs: { 1092643ca7872b450ea4efacab6188849e5aac2ba161Steve Block printUnaryOp(exec, location, it, "load_varargs"); 10935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian break; 10945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 1095635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_tear_off_activation: { 1096635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 1097e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block int r1 = (++it)->u.operand; 1098e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block printf("[%4d] tear_off_activation\t %s, %s\n", location, registerName(exec, r0).data(), registerName(exec, r1).data()); 1099635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1100635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_tear_off_arguments: { 1102e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block int r0 = (++it)->u.operand; 1103e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block printf("[%4d] tear_off_arguments\t %s\n", location, registerName(exec, r0).data()); 1104635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1105635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1106635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_ret: { 1107635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 1108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] ret\t\t %s\n", location, registerName(exec, r0).data()); 1109635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1110635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1111e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block case op_call_put_result: { 1112e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block int r0 = (++it)->u.operand; 1113e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block printf("[%4d] op_call_put_result\t\t %s\n", location, registerName(exec, r0).data()); 1114e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block break; 1115e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block } 1116e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block case op_ret_object_or_this: { 1117e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block int r0 = (++it)->u.operand; 1118e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block int r1 = (++it)->u.operand; 1119e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block printf("[%4d] constructor_ret\t\t %s %s\n", location, registerName(exec, r0).data(), registerName(exec, r1).data()); 1120e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block break; 1121e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block } 1122635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_construct: { 1123635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int func = (++it)->u.operand; 1124635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int argCount = (++it)->u.operand; 1125635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int registerOffset = (++it)->u.operand; 11265af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke printf("[%4d] construct\t %s, %d, %d\n", location, registerName(exec, func).data(), argCount, registerOffset); 1127635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 11295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian case op_strcat: { 11305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian int r0 = (++it)->u.operand; 11315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian int r1 = (++it)->u.operand; 11325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian int count = (++it)->u.operand; 1133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] strcat\t\t %s, %s, %d\n", location, registerName(exec, r0).data(), registerName(exec, r1).data(), count); 11345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian break; 11355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 11365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian case op_to_primitive: { 11375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian int r0 = (++it)->u.operand; 11385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian int r1 = (++it)->u.operand; 1139dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] to_primitive\t %s, %s\n", location, registerName(exec, r0).data(), registerName(exec, r1).data()); 11405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian break; 11415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 1142635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_get_pnames: { 1143cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block int r0 = it[1].u.operand; 1144cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block int r1 = it[2].u.operand; 1145cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block int r2 = it[3].u.operand; 1146cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block int r3 = it[4].u.operand; 1147cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block int offset = it[5].u.operand; 1148dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] get_pnames\t %s, %s, %s, %s, %d(->%d)\n", location, registerName(exec, r0).data(), registerName(exec, r1).data(), registerName(exec, r2).data(), registerName(exec, r3).data(), offset, location + offset); 1149cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block it += OPCODE_LENGTH(op_get_pnames) - 1; 1150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_next_pname: { 1153cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block int dest = it[1].u.operand; 1154a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch int base = it[2].u.operand; 1155a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch int i = it[3].u.operand; 1156a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch int size = it[4].u.operand; 1157a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch int iter = it[5].u.operand; 1158a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch int offset = it[6].u.operand; 1159a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch printf("[%4d] next_pname\t %s, %s, %s, %s, %s, %d(->%d)\n", location, registerName(exec, dest).data(), registerName(exec, base).data(), registerName(exec, i).data(), registerName(exec, size).data(), registerName(exec, iter).data(), offset, location + offset); 1160cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block it += OPCODE_LENGTH(op_next_pname) - 1; 1161635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1162635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1163635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_push_scope: { 1164635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 1165dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] push_scope\t %s\n", location, registerName(exec, r0).data()); 1166635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1167635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1168635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_pop_scope: { 1169635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("[%4d] pop_scope\n", location); 1170635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1171635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1172635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_push_new_scope: { 1173635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 1174635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int id0 = (++it)->u.operand; 1175635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r1 = (++it)->u.operand; 1176dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] push_new_scope \t%s, %s, %s\n", location, registerName(exec, r0).data(), idName(id0, m_identifiers[id0]).data(), registerName(exec, r1).data()); 1177635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1178635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1179635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_jmp_scopes: { 1180635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int scopeDelta = (++it)->u.operand; 1181635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int offset = (++it)->u.operand; 1182cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block printf("[%4d] jmp_scopes\t^%d, %d(->%d)\n", location, scopeDelta, offset, location + offset); 1183635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1184635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1185635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_catch: { 1186635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 1187dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] catch\t\t %s\n", location, registerName(exec, r0).data()); 1188635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1189635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1190635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_throw: { 1191635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 1192dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] throw\t\t %s\n", location, registerName(exec, r0).data()); 1193635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1194635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 11956b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner case op_throw_reference_error: { 1196635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int k0 = (++it)->u.operand; 11976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner printf("[%4d] throw_reference_error\t %s\n", location, constantName(exec, k0, getConstant(k0)).data()); 11986b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner break; 11996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner } 1200635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_jsr: { 1201635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int retAddrDst = (++it)->u.operand; 1202635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int offset = (++it)->u.operand; 1203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] jsr\t\t %s, %d(->%d)\n", location, registerName(exec, retAddrDst).data(), offset, location + offset); 1204635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1205635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1206635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_sret: { 1207635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int retAddrSrc = (++it)->u.operand; 1208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] sret\t\t %s\n", location, registerName(exec, retAddrSrc).data()); 1209635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1210635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1211635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_debug: { 1212635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int debugHookID = (++it)->u.operand; 1213635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int firstLine = (++it)->u.operand; 1214635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int lastLine = (++it)->u.operand; 1215635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("[%4d] debug\t\t %s, %d, %d\n", location, debugHookName(debugHookID), firstLine, lastLine); 1216635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1217635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1218635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_profile_will_call: { 1219635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int function = (++it)->u.operand; 1220dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] profile_will_call %s\n", location, registerName(exec, function).data()); 1221635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1222635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1223635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_profile_did_call: { 1224635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int function = (++it)->u.operand; 1225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] profile_did_call\t %s\n", location, registerName(exec, function).data()); 1226635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1227635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1228635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case op_end: { 1229635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int r0 = (++it)->u.operand; 1230dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block printf("[%4d] end\t\t %s\n", location, registerName(exec, r0).data()); 1231635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1232635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1233635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1234635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1235635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1236635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif // !defined(NDEBUG) || ENABLE(OPCODE_SAMPLING) 1237635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1238635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if DUMP_CODE_BLOCK_STATISTICS 1239635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic HashSet<CodeBlock*> liveCodeBlockSet; 1240635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 1241635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1242635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#define FOR_EACH_MEMBER_VECTOR(macro) \ 1243635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project macro(instructions) \ 1244635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project macro(globalResolveInfos) \ 1245635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project macro(structureStubInfos) \ 1246635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project macro(callLinkInfos) \ 1247635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project macro(linkedCallerList) \ 1248635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project macro(identifiers) \ 1249635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project macro(functionExpressions) \ 1250635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project macro(constantRegisters) 1251635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1252635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#define FOR_EACH_MEMBER_VECTOR_RARE_DATA(macro) \ 1253635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project macro(regexps) \ 1254635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project macro(functions) \ 1255635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project macro(exceptionHandlers) \ 1256635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project macro(immediateSwitchJumpTables) \ 1257635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project macro(characterSwitchJumpTables) \ 1258635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project macro(stringSwitchJumpTables) \ 12594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang macro(evalCodeCache) \ 1260635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project macro(expressionInfo) \ 1261635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project macro(lineInfo) \ 12624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang macro(callReturnIndexVector) 1263635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1264635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projecttemplate<typename T> 1265635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic size_t sizeInBytes(const Vector<T>& vector) 1266635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1267635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return vector.capacity() * sizeof(T); 1268635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1269635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1270635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid CodeBlock::dumpStatistics() 1271635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1272635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if DUMP_CODE_BLOCK_STATISTICS 1273635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project #define DEFINE_VARS(name) size_t name##IsNotEmpty = 0; size_t name##TotalSize = 0; 1274635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project FOR_EACH_MEMBER_VECTOR(DEFINE_VARS) 1275635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project FOR_EACH_MEMBER_VECTOR_RARE_DATA(DEFINE_VARS) 1276635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project #undef DEFINE_VARS 1277635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1278635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Non-vector data members 1279635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t evalCodeCacheIsNotEmpty = 0; 1280635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1281635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t symbolTableIsNotEmpty = 0; 1282635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t symbolTableTotalSize = 0; 1283635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1284635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t hasRareData = 0; 1285635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1286635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t isFunctionCode = 0; 1287635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t isGlobalCode = 0; 1288635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t isEvalCode = 0; 1289635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1290635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project HashSet<CodeBlock*>::const_iterator end = liveCodeBlockSet.end(); 1291635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (HashSet<CodeBlock*>::const_iterator it = liveCodeBlockSet.begin(); it != end; ++it) { 1292635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project CodeBlock* codeBlock = *it; 1293635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1294635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project #define GET_STATS(name) if (!codeBlock->m_##name.isEmpty()) { name##IsNotEmpty++; name##TotalSize += sizeInBytes(codeBlock->m_##name); } 1295635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project FOR_EACH_MEMBER_VECTOR(GET_STATS) 1296635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project #undef GET_STATS 1297635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1298635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!codeBlock->m_symbolTable.isEmpty()) { 1299635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project symbolTableIsNotEmpty++; 1300635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project symbolTableTotalSize += (codeBlock->m_symbolTable.capacity() * (sizeof(SymbolTable::KeyType) + sizeof(SymbolTable::MappedType))); 1301635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1302635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1303635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (codeBlock->m_rareData) { 1304635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project hasRareData++; 1305635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project #define GET_STATS(name) if (!codeBlock->m_rareData->m_##name.isEmpty()) { name##IsNotEmpty++; name##TotalSize += sizeInBytes(codeBlock->m_rareData->m_##name); } 1306635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project FOR_EACH_MEMBER_VECTOR_RARE_DATA(GET_STATS) 1307635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project #undef GET_STATS 1308635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1309635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!codeBlock->m_rareData->m_evalCodeCache.isEmpty()) 1310635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project evalCodeCacheIsNotEmpty++; 1311635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1312635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1313635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project switch (codeBlock->codeType()) { 1314635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case FunctionCode: 1315635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++isFunctionCode; 1316635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1317635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case GlobalCode: 1318635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++isGlobalCode; 1319635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1320635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project case EvalCode: 1321635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++isEvalCode; 1322635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project break; 1323635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1324635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1325635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1326635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project size_t totalSize = 0; 1327635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1328635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project #define GET_TOTAL_SIZE(name) totalSize += name##TotalSize; 1329635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project FOR_EACH_MEMBER_VECTOR(GET_TOTAL_SIZE) 1330635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project FOR_EACH_MEMBER_VECTOR_RARE_DATA(GET_TOTAL_SIZE) 1331635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project #undef GET_TOTAL_SIZE 1332635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1333635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project totalSize += symbolTableTotalSize; 1334635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project totalSize += (liveCodeBlockSet.size() * sizeof(CodeBlock)); 1335635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1336635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("Number of live CodeBlocks: %d\n", liveCodeBlockSet.size()); 1337635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("Size of a single CodeBlock [sizeof(CodeBlock)]: %zu\n", sizeof(CodeBlock)); 1338635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("Size of all CodeBlocks: %zu\n", totalSize); 1339635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("Average size of a CodeBlock: %zu\n", totalSize / liveCodeBlockSet.size()); 1340635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1341635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("Number of FunctionCode CodeBlocks: %zu (%.3f%%)\n", isFunctionCode, static_cast<double>(isFunctionCode) * 100.0 / liveCodeBlockSet.size()); 1342635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("Number of GlobalCode CodeBlocks: %zu (%.3f%%)\n", isGlobalCode, static_cast<double>(isGlobalCode) * 100.0 / liveCodeBlockSet.size()); 1343635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("Number of EvalCode CodeBlocks: %zu (%.3f%%)\n", isEvalCode, static_cast<double>(isEvalCode) * 100.0 / liveCodeBlockSet.size()); 1344635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1345635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("Number of CodeBlocks with rare data: %zu (%.3f%%)\n", hasRareData, static_cast<double>(hasRareData) * 100.0 / liveCodeBlockSet.size()); 1346635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1347635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project #define PRINT_STATS(name) printf("Number of CodeBlocks with " #name ": %zu\n", name##IsNotEmpty); printf("Size of all " #name ": %zu\n", name##TotalSize); 1348635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project FOR_EACH_MEMBER_VECTOR(PRINT_STATS) 1349635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project FOR_EACH_MEMBER_VECTOR_RARE_DATA(PRINT_STATS) 1350635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project #undef PRINT_STATS 1351635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1352635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("Number of CodeBlocks with evalCodeCache: %zu\n", evalCodeCacheIsNotEmpty); 1353635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("Number of CodeBlocks with symbolTable: %zu\n", symbolTableIsNotEmpty); 1354635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1355635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("Size of all symbolTables: %zu\n", symbolTableTotalSize); 1356635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1357635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#else 1358635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project printf("Dumping CodeBlock statistics is not enabled.\n"); 1359635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 1360635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1361635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1362dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochCodeBlock::CodeBlock(ScriptExecutable* ownerExecutable, CodeType codeType, JSGlobalObject *globalObject, PassRefPtr<SourceProvider> sourceProvider, unsigned sourceOffset, SymbolTable* symTab, bool isConstructor) 13632bde8e466a4451c7319e3a072d118917957d6554Steve Block : m_globalObject(globalObject->globalData(), ownerExecutable, globalObject) 13642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block , m_heap(&m_globalObject->globalData().heap) 1365dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch , m_numCalleeRegisters(0) 13660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch , m_numVars(0) 13670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch , m_numParameters(0) 13686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen , m_isConstructor(isConstructor) 13692bde8e466a4451c7319e3a072d118917957d6554Steve Block , m_ownerExecutable(globalObject->globalData(), ownerExecutable, ownerExecutable) 13700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch , m_globalData(0) 13710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#ifndef NDEBUG 13720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch , m_instructionCount(0) 13730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 1374e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block , m_argumentsRegister(-1) 1375231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_needsFullScopeChain(ownerExecutable->needsActivation()) 1376231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_usesEval(ownerExecutable->usesEval()) 1377635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_isNumericCompareFunction(false) 1378a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch , m_isStrictMode(ownerExecutable->isStrictMode()) 1379635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_codeType(codeType) 1380635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_source(sourceProvider) 1381635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_sourceOffset(sourceOffset) 1382231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_symbolTable(symTab) 1383635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1384635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(m_source); 1385635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1386635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if DUMP_CODE_BLOCK_STATISTICS 1387635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project liveCodeBlockSet.add(this); 1388635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 1389635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1390635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1391635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectCodeBlock::~CodeBlock() 1392635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1393e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(JIT) 1394635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (size_t size = m_structureStubInfos.size(), i = 0; i < size; ++i) 1395635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_structureStubInfos[i].deref(); 1396e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif // ENABLE(JIT) 13970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1398635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if DUMP_CODE_BLOCK_STATISTICS 1399635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project liveCodeBlockSet.remove(this); 1400635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 1401635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1402635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 14032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid CodeBlock::markStructures(MarkStack& markStack, Instruction* vPC) const 1404635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1405635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Interpreter* interpreter = m_globalData->interpreter; 1406635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1407dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_self) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_getter_self) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_custom_self)) { 14082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch markStack.append(&vPC[4].u.structure); 1409635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 1410635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 141121939df44de1705786c545cd1bf519d47250322dBen Murdoch if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_proto) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_getter_proto) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_custom_proto)) { 14122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch markStack.append(&vPC[4].u.structure); 14132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch markStack.append(&vPC[5].u.structure); 1414635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 1415635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 141621939df44de1705786c545cd1bf519d47250322dBen Murdoch if (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_chain) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_getter_chain) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_custom_chain)) { 14172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch markStack.append(&vPC[4].u.structure); 14182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch markStack.append(&vPC[5].u.structureChain); 1419635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 1420635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1421635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (vPC[0].u.opcode == interpreter->getOpcode(op_put_by_id_transition)) { 14222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch markStack.append(&vPC[4].u.structure); 14232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch markStack.append(&vPC[5].u.structure); 14242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch markStack.append(&vPC[6].u.structureChain); 1425635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 1426635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1427635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (vPC[0].u.opcode == interpreter->getOpcode(op_put_by_id_replace)) { 14282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch markStack.append(&vPC[4].u.structure); 1429635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 1430635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 14316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen if (vPC[0].u.opcode == interpreter->getOpcode(op_resolve_global) || vPC[0].u.opcode == interpreter->getOpcode(op_resolve_global_dynamic)) { 1432dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch if (vPC[3].u.structure) 14332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch markStack.append(&vPC[3].u.structure); 1434635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 1435635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1436635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if ((vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_proto_list)) 1437692e5dbf12901edacf14812a6fae25462920af42Steve Block || (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_self_list)) 1438692e5dbf12901edacf14812a6fae25462920af42Steve Block || (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_getter_proto_list)) 143921939df44de1705786c545cd1bf519d47250322dBen Murdoch || (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_getter_self_list)) 144021939df44de1705786c545cd1bf519d47250322dBen Murdoch || (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_custom_proto_list)) 144121939df44de1705786c545cd1bf519d47250322dBen Murdoch || (vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_custom_self_list))) { 1442635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project PolymorphicAccessStructureList* polymorphicStructures = vPC[4].u.polymorphicStructures; 14432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch polymorphicStructures->markAggregate(markStack, vPC[5].u.operand); 1444635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project delete polymorphicStructures; 1445635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 1446635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1447635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1448635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // These instructions don't ref their Structures. 1449635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id) || vPC[0].u.opcode == interpreter->getOpcode(op_put_by_id) || vPC[0].u.opcode == interpreter->getOpcode(op_get_by_id_generic) || vPC[0].u.opcode == interpreter->getOpcode(op_put_by_id_generic) || vPC[0].u.opcode == interpreter->getOpcode(op_get_array_length) || vPC[0].u.opcode == interpreter->getOpcode(op_get_string_length)); 1450635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1451635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 14522bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid EvalCodeCache::markAggregate(MarkStack& markStack) 14532bde8e466a4451c7319e3a072d118917957d6554Steve Block{ 14542bde8e466a4451c7319e3a072d118917957d6554Steve Block EvalCacheMap::iterator end = m_cacheMap.end(); 14552bde8e466a4451c7319e3a072d118917957d6554Steve Block for (EvalCacheMap::iterator ptr = m_cacheMap.begin(); ptr != end; ++ptr) 14562bde8e466a4451c7319e3a072d118917957d6554Steve Block markStack.append(&ptr->second); 14572bde8e466a4451c7319e3a072d118917957d6554Steve Block} 14582bde8e466a4451c7319e3a072d118917957d6554Steve Block 14590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid CodeBlock::markAggregate(MarkStack& markStack) 1460635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 14612bde8e466a4451c7319e3a072d118917957d6554Steve Block markStack.append(&m_globalObject); 14622bde8e466a4451c7319e3a072d118917957d6554Steve Block markStack.append(&m_ownerExecutable); 14632bde8e466a4451c7319e3a072d118917957d6554Steve Block if (m_rareData) 14642bde8e466a4451c7319e3a072d118917957d6554Steve Block m_rareData->m_evalCodeCache.markAggregate(markStack); 14652bde8e466a4451c7319e3a072d118917957d6554Steve Block markStack.appendValues(m_constantRegisters.data(), m_constantRegisters.size()); 1466231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block for (size_t i = 0; i < m_functionExprs.size(); ++i) 14672bde8e466a4451c7319e3a072d118917957d6554Steve Block markStack.append(&m_functionExprs[i]); 1468231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block for (size_t i = 0; i < m_functionDecls.size(); ++i) 14692bde8e466a4451c7319e3a072d118917957d6554Steve Block markStack.append(&m_functionDecls[i]); 14702bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(JIT_OPTIMIZE_CALL) 14712bde8e466a4451c7319e3a072d118917957d6554Steve Block for (unsigned i = 0; i < numberOfCallLinkInfos(); ++i) 14722bde8e466a4451c7319e3a072d118917957d6554Steve Block if (callLinkInfo(i).isLinked()) 14732bde8e466a4451c7319e3a072d118917957d6554Steve Block markStack.append(&callLinkInfo(i).callee); 14742bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif 14752bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(INTERPRETER) 14762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for (size_t size = m_propertyAccessInstructions.size(), i = 0; i < size; ++i) 14772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch markStructures(markStack, &m_instructions[m_propertyAccessInstructions[i]]); 14782bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif 14792bde8e466a4451c7319e3a072d118917957d6554Steve Block#if ENABLE(JIT) 14802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for (size_t size = m_globalResolveInfos.size(), i = 0; i < size; ++i) { 14812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (m_globalResolveInfos[i].structure) 14822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch markStack.append(&m_globalResolveInfos[i].structure); 14832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 14842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 14852bde8e466a4451c7319e3a072d118917957d6554Steve Block for (size_t size = m_structureStubInfos.size(), i = 0; i < size; ++i) 14862bde8e466a4451c7319e3a072d118917957d6554Steve Block m_structureStubInfos[i].markAggregate(markStack); 14872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 14882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for (size_t size = m_methodCallLinkInfos.size(), i = 0; i < size; ++i) { 14892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (m_methodCallLinkInfos[i].cachedStructure) { 14902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // Both members must be filled at the same time 14912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch markStack.append(&m_methodCallLinkInfos[i].cachedStructure); 14922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ASSERT(!!m_methodCallLinkInfos[i].cachedPrototypeStructure); 14932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch markStack.append(&m_methodCallLinkInfos[i].cachedPrototypeStructure); 14942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 14952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 14962bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif 1497635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1498635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1499635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectHandlerInfo* CodeBlock::handlerForBytecodeOffset(unsigned bytecodeOffset) 1500635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1501635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(bytecodeOffset < m_instructionCount); 1502635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1503635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_rareData) 1504635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return 0; 1505635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1506635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Vector<HandlerInfo>& exceptionHandlers = m_rareData->m_exceptionHandlers; 1507635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (size_t i = 0; i < exceptionHandlers.size(); ++i) { 1508635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Handlers are ordered innermost first, so the first handler we encounter 1509635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // that contains the source address is the correct handler to use. 1510635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (exceptionHandlers[i].start <= bytecodeOffset && exceptionHandlers[i].end >= bytecodeOffset) 1511635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return &exceptionHandlers[i]; 1512635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1513635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1514635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return 0; 1515635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1516635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 15174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangint CodeBlock::lineNumberForBytecodeOffset(unsigned bytecodeOffset) 1518635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1519635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(bytecodeOffset < m_instructionCount); 1520635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 15214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!m_rareData) 15224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return m_ownerExecutable->source().firstLine(); 15234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 15244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Vector<LineInfo>& lineInfo = m_rareData->m_lineInfo; 1525635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1526635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int low = 0; 15274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang int high = lineInfo.size(); 1528635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project while (low < high) { 1529635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int mid = low + (high - low) / 2; 15304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (lineInfo[mid].instructionOffset <= bytecodeOffset) 1531635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project low = mid + 1; 1532635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project else 1533635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project high = mid; 1534635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 15354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1536635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!low) 1537231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return m_ownerExecutable->source().firstLine(); 15384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return lineInfo[low - 1].lineNumber; 1539635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1540635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 15414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wangvoid CodeBlock::expressionRangeForBytecodeOffset(unsigned bytecodeOffset, int& divot, int& startOffset, int& endOffset) 1542635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1543635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(bytecodeOffset < m_instructionCount); 1544635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 15454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (!m_rareData) { 1546635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project startOffset = 0; 1547635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project endOffset = 0; 1548635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project divot = 0; 15496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return; 1550635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1551635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 15524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang Vector<ExpressionRangeInfo>& expressionInfo = m_rareData->m_expressionInfo; 15534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang 1554635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int low = 0; 15554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang int high = expressionInfo.size(); 1556635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project while (low < high) { 1557635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int mid = low + (high - low) / 2; 15584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (expressionInfo[mid].instructionOffset <= bytecodeOffset) 1559635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project low = mid + 1; 1560635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project else 1561635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project high = mid; 1562635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 15636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 1564635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(low); 1565635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!low) { 1566635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project startOffset = 0; 1567635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project endOffset = 0; 1568635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project divot = 0; 15696b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return; 1570635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1571635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 15724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang startOffset = expressionInfo[low - 1].startOffset; 15734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang endOffset = expressionInfo[low - 1].endOffset; 15744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang divot = expressionInfo[low - 1].divotPoint + m_sourceOffset; 15756b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner return; 1576635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1577635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1578e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER) 1579635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool CodeBlock::hasGlobalResolveInstructionAtBytecodeOffset(unsigned bytecodeOffset) 1580635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1581635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_globalResolveInstructions.isEmpty()) 1582635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return false; 1583635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1584635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int low = 0; 1585635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int high = m_globalResolveInstructions.size(); 1586635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project while (low < high) { 1587635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int mid = low + (high - low) / 2; 1588635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_globalResolveInstructions[mid] <= bytecodeOffset) 1589635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project low = mid + 1; 1590635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project else 1591635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project high = mid; 1592635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1593635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1594635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!low || m_globalResolveInstructions[low - 1] != bytecodeOffset) 1595635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return false; 1596635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return true; 1597635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1598e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif 1599e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(JIT) 1600635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool CodeBlock::hasGlobalResolveInfoAtBytecodeOffset(unsigned bytecodeOffset) 1601635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1602635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_globalResolveInfos.isEmpty()) 1603635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return false; 1604635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1605635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int low = 0; 1606635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int high = m_globalResolveInfos.size(); 1607635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project while (low < high) { 1608635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int mid = low + (high - low) / 2; 1609635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_globalResolveInfos[mid].bytecodeOffset <= bytecodeOffset) 1610635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project low = mid + 1; 1611635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project else 1612635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project high = mid; 1613635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1614635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1615635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!low || m_globalResolveInfos[low - 1].bytecodeOffset != bytecodeOffset) 1616635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return false; 1617635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return true; 1618635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1619635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 1620635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1621635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid CodeBlock::shrinkToFit() 1622635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1623635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_instructions.shrinkToFit(); 1624635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1625e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER) 1626635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_propertyAccessInstructions.shrinkToFit(); 1627635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_globalResolveInstructions.shrinkToFit(); 1628e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif 1629e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(JIT) 1630635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_structureStubInfos.shrinkToFit(); 1631635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_globalResolveInfos.shrinkToFit(); 1632635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_callLinkInfos.shrinkToFit(); 1633635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 1634635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1635635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_identifiers.shrinkToFit(); 1636231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_functionDecls.shrinkToFit(); 1637231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block m_functionExprs.shrinkToFit(); 1638635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_constantRegisters.shrinkToFit(); 1639635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1640635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_rareData) { 1641635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_rareData->m_exceptionHandlers.shrinkToFit(); 16426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen m_rareData->m_regexps.shrinkToFit(); 1643635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_rareData->m_immediateSwitchJumpTables.shrinkToFit(); 1644635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_rareData->m_characterSwitchJumpTables.shrinkToFit(); 1645635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_rareData->m_stringSwitchJumpTables.shrinkToFit(); 16464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang m_rareData->m_expressionInfo.shrinkToFit(); 16474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang m_rareData->m_lineInfo.shrinkToFit(); 1648635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 1649635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 1650635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1651a94275402997c11dd2e778633dacf4b7e630a35dBen Murdochvoid CodeBlock::createActivation(CallFrame* callFrame) 1652a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{ 1653a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch ASSERT(codeType() == FunctionCode); 1654a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch ASSERT(needsFullScopeChain()); 16554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang ASSERT(!callFrame->uncheckedR(activationRegister()).jsValue()); 1656a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch JSActivation* activation = new (callFrame) JSActivation(callFrame, static_cast<FunctionExecutable*>(ownerExecutable())); 16574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang callFrame->uncheckedR(activationRegister()) = JSValue(activation); 165881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch callFrame->setScopeChain(callFrame->scopeChain()->push(activation)); 1659a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch} 1660a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 1661635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} // namespace JSC 1662