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