Interpreter.cpp revision 2bde8e466a4451c7319e3a072d118917957d6554
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block * Copyright (C) 2008, 2009, 2010 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 Cameron Zwarich <cwzwarich@uwaterloo.ca>
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1.  Redistributions of source code must retain the above copyright
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer.
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2.  Redistributions in binary form must reproduce the above copyright
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer in the
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     documentation and/or other materials provided with the distribution.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     its contributors may be used to endorse or promote products derived
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     from this software without specific prior written permission.
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Interpreter.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Arguments.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "BatchedTransitionOptimizer.h"
355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "CallFrame.h"
365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "CallFrameClosure.h"
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CodeBlock.h"
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "Heap.h"
395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "Debugger.h"
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "DebuggerCallFrame.h"
416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "ErrorInstance.h"
42635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "EvalCodeCache.h"
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ExceptionHelpers.h"
44692e5dbf12901edacf14812a6fae25462920af42Steve Block#include "GetterSetter.h"
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSActivation.h"
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSArray.h"
47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "JSByteArray.h"
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSFunction.h"
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSNotAnObject.h"
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSPropertyNameIterator.h"
515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "LiteralParser.h"
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSStaticScopeObject.h"
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSString.h"
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "ObjectPrototype.h"
555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "Operations.h"
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Parser.h"
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Profiler.h"
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RegExpObject.h"
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "RegExpPrototype.h"
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Register.h"
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SamplingTool.h"
62a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#include "StrictEvalActivation.h"
636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "UStringConcatenate.h"
640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <limits.h>
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <stdio.h>
665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include <wtf/Threading.h>
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
68635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(JIT)
69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "JIT.h"
70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
71635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
72bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#define WTF_USE_GCC_COMPUTED_GOTO_WORKAROUND (ENABLE(COMPUTED_GOTO_INTERPRETER) && !defined(__llvm__))
73bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace std;
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC {
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Returns the depth of the scope chain within a given call frame.
7981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochstatic int depth(CodeBlock* codeBlock, ScopeChainNode* sc)
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
81635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!codeBlock->needsFullScopeChain())
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
8381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    return sc->localDepth();
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
86e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
87bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenstatic NEVER_INLINE JSValue concatenateStrings(ExecState* exec, Register* strings, unsigned count)
88bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
89bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return jsString(exec, strings, count);
90bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
91bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
925f1ab04193ad0130ca8204aadaceae083aca9881Feng QianNEVER_INLINE bool Interpreter::resolve(CallFrame* callFrame, Instruction* vPC, JSValue& exceptionValue)
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
94cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    int dst = vPC[1].u.operand;
95cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    int property = vPC[2].u.operand;
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ScopeChainNode* scopeChain = callFrame->scopeChain();
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ScopeChainIterator iter = scopeChain->begin();
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ScopeChainIterator end = scopeChain->end();
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(iter != end);
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CodeBlock* codeBlock = callFrame->codeBlock();
103635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Identifier& ident = codeBlock->identifier(property);
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    do {
1052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        JSObject* o = iter->get();
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PropertySlot slot(o);
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (o->getPropertySlot(callFrame, ident, slot)) {
1085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSValue result = slot.getValue(callFrame, ident);
1092bde8e466a4451c7319e3a072d118917957d6554Steve Block            exceptionValue = callFrame->globalData().exception;
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (exceptionValue)
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
1124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = JSValue(result);
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } while (++iter != end);
1166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    exceptionValue = createUndefinedVariableError(callFrame, ident);
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1205f1ab04193ad0130ca8204aadaceae083aca9881Feng QianNEVER_INLINE bool Interpreter::resolveSkip(CallFrame* callFrame, Instruction* vPC, JSValue& exceptionValue)
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CodeBlock* codeBlock = callFrame->codeBlock();
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
124cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    int dst = vPC[1].u.operand;
125cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    int property = vPC[2].u.operand;
126e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    int skip = vPC[3].u.operand;
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ScopeChainNode* scopeChain = callFrame->scopeChain();
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ScopeChainIterator iter = scopeChain->begin();
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ScopeChainIterator end = scopeChain->end();
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(iter != end);
132a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    bool checkTopLevel = codeBlock->codeType() == FunctionCode && codeBlock->needsFullScopeChain();
133a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ASSERT(skip || !checkTopLevel);
134a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (checkTopLevel && skip--) {
1354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (callFrame->uncheckedR(codeBlock->activationRegister()).jsValue())
136a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            ++iter;
137a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (skip--) {
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ++iter;
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(iter != end);
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
142635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Identifier& ident = codeBlock->identifier(property);
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    do {
1442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        JSObject* o = iter->get();
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PropertySlot slot(o);
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (o->getPropertySlot(callFrame, ident, slot)) {
1475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSValue result = slot.getValue(callFrame, ident);
1482bde8e466a4451c7319e3a072d118917957d6554Steve Block            exceptionValue = callFrame->globalData().exception;
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (exceptionValue)
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
151a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            ASSERT(result);
1524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = JSValue(result);
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } while (++iter != end);
1566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    exceptionValue = createUndefinedVariableError(callFrame, ident);
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1605f1ab04193ad0130ca8204aadaceae083aca9881Feng QianNEVER_INLINE bool Interpreter::resolveGlobal(CallFrame* callFrame, Instruction* vPC, JSValue& exceptionValue)
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
162cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    int dst = vPC[1].u.operand;
163dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    CodeBlock* codeBlock = callFrame->codeBlock();
164dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    JSGlobalObject* globalObject = codeBlock->globalObject();
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(globalObject->isGlobalObject());
166dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    int property = vPC[2].u.operand;
167dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    Structure* structure = vPC[3].u.structure;
168dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    int offset = vPC[4].u.operand;
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
170635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (structure == globalObject->structure()) {
1714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = JSValue(globalObject->getDirectOffset(offset));
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
175635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Identifier& ident = codeBlock->identifier(property);
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PropertySlot slot(globalObject);
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (globalObject->getPropertySlot(callFrame, ident, slot)) {
1785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue result = slot.getValue(callFrame, ident);
179692e5dbf12901edacf14812a6fae25462920af42Steve Block        if (slot.isCacheableValue() && !globalObject->structure()->isUncacheableDictionary() && slot.slotBase() == globalObject) {
180dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            if (vPC[3].u.structure)
181dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                vPC[3].u.structure->deref();
182635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            globalObject->structure()->ref();
183dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            vPC[3] = globalObject->structure();
184dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            vPC[4] = slot.cachedOffset();
1854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = JSValue(result);
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1892bde8e466a4451c7319e3a072d118917957d6554Steve Block        exceptionValue = callFrame->globalData().exception;
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (exceptionValue)
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
1924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = JSValue(result);
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1966b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    exceptionValue = createUndefinedVariableError(callFrame, ident);
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenNEVER_INLINE bool Interpreter::resolveGlobalDynamic(CallFrame* callFrame, Instruction* vPC, JSValue& exceptionValue)
2016c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
2026c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    int dst = vPC[1].u.operand;
2036c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    CodeBlock* codeBlock = callFrame->codeBlock();
204dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    JSGlobalObject* globalObject = codeBlock->globalObject();
205dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ASSERT(globalObject->isGlobalObject());
206dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    int property = vPC[2].u.operand;
207dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    Structure* structure = vPC[3].u.structure;
208dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    int offset = vPC[4].u.operand;
209dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    int skip = vPC[5].u.operand;
2106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
2116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    ScopeChainNode* scopeChain = callFrame->scopeChain();
2126c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    ScopeChainIterator iter = scopeChain->begin();
2136c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    ScopeChainIterator end = scopeChain->end();
2146c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    ASSERT(iter != end);
215a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    bool checkTopLevel = codeBlock->codeType() == FunctionCode && codeBlock->needsFullScopeChain();
216a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ASSERT(skip || !checkTopLevel);
217a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (checkTopLevel && skip--) {
2184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (callFrame->uncheckedR(codeBlock->activationRegister()).jsValue())
219a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            ++iter;
220a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
2216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    while (skip--) {
2222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        JSObject* o = iter->get();
2236c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        if (o->hasCustomProperties()) {
2246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            Identifier& ident = codeBlock->identifier(property);
2256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            do {
2266c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                PropertySlot slot(o);
2276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                if (o->getPropertySlot(callFrame, ident, slot)) {
2286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                    JSValue result = slot.getValue(callFrame, ident);
2292bde8e466a4451c7319e3a072d118917957d6554Steve Block                    exceptionValue = callFrame->globalData().exception;
2306c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                    if (exceptionValue)
2316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                        return false;
232a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                    ASSERT(result);
2334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                    callFrame->uncheckedR(dst) = JSValue(result);
2346c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                    return true;
2356c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                }
2366c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                if (iter == end)
2376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                    break;
2382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                o = iter->get();
2396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                ++iter;
2406c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            } while (true);
2416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            exceptionValue = createUndefinedVariableError(callFrame, ident);
2426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            return false;
2436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        }
2446c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        ++iter;
2456c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
2466c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
2476c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (structure == globalObject->structure()) {
2484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = JSValue(globalObject->getDirectOffset(offset));
2494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ASSERT(callFrame->uncheckedR(dst).jsValue());
2506c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return true;
2516c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
2526c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
2536c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    Identifier& ident = codeBlock->identifier(property);
2546c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    PropertySlot slot(globalObject);
2556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (globalObject->getPropertySlot(callFrame, ident, slot)) {
2566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        JSValue result = slot.getValue(callFrame, ident);
2576c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        if (slot.isCacheableValue() && !globalObject->structure()->isUncacheableDictionary() && slot.slotBase() == globalObject) {
258dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            if (vPC[3].u.structure)
259dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch                vPC[3].u.structure->deref();
2606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            globalObject->structure()->ref();
261dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            vPC[3] = globalObject->structure();
262dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            vPC[4] = slot.cachedOffset();
263a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            ASSERT(result);
2644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = JSValue(result);
2656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            return true;
2666c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        }
2676c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
2682bde8e466a4451c7319e3a072d118917957d6554Steve Block        exceptionValue = callFrame->globalData().exception;
2696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        if (exceptionValue)
2706c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            return false;
271a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT(result);
2724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = JSValue(result);
2736c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return true;
2746c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
2756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
2766b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    exceptionValue = createUndefinedVariableError(callFrame, ident);
2776c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    return false;
2786c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen}
2796c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
280635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectNEVER_INLINE void Interpreter::resolveBase(CallFrame* callFrame, Instruction* vPC)
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
282cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    int dst = vPC[1].u.operand;
283cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    int property = vPC[2].u.operand;
284a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    bool isStrictPut = vPC[3].u.operand;
285a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    Identifier ident = callFrame->codeBlock()->identifier(property);
286a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    JSValue result = JSC::resolveBase(callFrame, ident, callFrame->scopeChain(), isStrictPut);
287e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (result) {
2884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = result;
2894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ASSERT(callFrame->uncheckedR(dst).jsValue());
290a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    } else
291a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        callFrame->globalData().exception = createErrorForInvalidGlobalAssignment(callFrame, ident.ustring());
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2945f1ab04193ad0130ca8204aadaceae083aca9881Feng QianNEVER_INLINE bool Interpreter::resolveBaseAndProperty(CallFrame* callFrame, Instruction* vPC, JSValue& exceptionValue)
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
296cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    int baseDst = vPC[1].u.operand;
297cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    int propDst = vPC[2].u.operand;
298cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    int property = vPC[3].u.operand;
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ScopeChainNode* scopeChain = callFrame->scopeChain();
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ScopeChainIterator iter = scopeChain->begin();
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ScopeChainIterator end = scopeChain->end();
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: add scopeDepthIsZero optimization
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(iter != end);
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CodeBlock* codeBlock = callFrame->codeBlock();
309635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Identifier& ident = codeBlock->identifier(property);
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSObject* base;
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    do {
3122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        base = iter->get();
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PropertySlot slot(base);
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (base->getPropertySlot(callFrame, ident, slot)) {
3155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSValue result = slot.getValue(callFrame, ident);
3162bde8e466a4451c7319e3a072d118917957d6554Steve Block            exceptionValue = callFrame->globalData().exception;
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (exceptionValue)
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
3194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(propDst) = JSValue(result);
3204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(baseDst) = JSValue(base);
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ++iter;
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } while (iter != end);
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    exceptionValue = createUndefinedVariableError(callFrame, ident);
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
330e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif // ENABLE(INTERPRETER)
3315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
332635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectALWAYS_INLINE CallFrame* Interpreter::slideRegisterWindowForCall(CodeBlock* newCodeBlock, RegisterFile* registerFile, CallFrame* callFrame, size_t registerOffset, int argc)
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Register* r = callFrame->registers();
335635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Register* newEnd = r + registerOffset + newCodeBlock->m_numCalleeRegisters;
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
337635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (LIKELY(argc == newCodeBlock->m_numParameters)) { // correct number of arguments
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (UNLIKELY(!registerFile->grow(newEnd)))
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        r += registerOffset;
341635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    } else if (argc < newCodeBlock->m_numParameters) { // too few arguments -- fill in the blanks
342635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        size_t omittedArgCount = newCodeBlock->m_numParameters - argc;
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        registerOffset += omittedArgCount;
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        newEnd += omittedArgCount;
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!registerFile->grow(newEnd))
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        r += registerOffset;
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Register* argv = r - RegisterFile::CallFrameHeaderSize - omittedArgCount;
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (size_t i = 0; i < omittedArgCount; ++i)
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            argv[i] = jsUndefined();
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else { // too many arguments -- copy expected arguments, leaving the extra arguments behind
353635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        size_t numParameters = newCodeBlock->m_numParameters;
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        registerOffset += numParameters;
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        newEnd += numParameters;
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!registerFile->grow(newEnd))
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        r += registerOffset;
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Register* argv = r - RegisterFile::CallFrameHeaderSize - numParameters - argc;
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (size_t i = 0; i < numParameters; ++i)
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            argv[i + argc] = argv[i];
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return CallFrame::create(r);
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
369e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
3706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerstatic NEVER_INLINE bool isInvalidParamForIn(CallFrame* callFrame, JSValue value, JSValue& exceptionData)
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
372635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (value.isObject())
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
3746b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    exceptionData = createInvalidParamError(callFrame, "in" , value);
3755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return true;
3765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
3775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
3786b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerstatic NEVER_INLINE bool isInvalidParamForInstanceOf(CallFrame* callFrame, JSValue value, JSValue& exceptionData)
3795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
3805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (value.isObject() && asObject(value)->structure()->typeInfo().implementsHasInstance())
3815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return false;
3826b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    exceptionData = createInvalidParamError(callFrame, "instanceof" , value);
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
387e14391e94c850b8bd03680c23b38978db68687a8John ReckNEVER_INLINE JSValue Interpreter::callEval(CallFrame* callFrame, RegisterFile* registerFile, Register* argv, int argc, int registerOffset)
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (argc < 2)
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsUndefined();
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue program = argv[1].jsValue();
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
394635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!program.isString())
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return program;
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
397643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    UString programSource = asString(program)->value(callFrame);
398e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    if (callFrame->hadException())
399e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        return JSValue();
400a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
401a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    CodeBlock* codeBlock = callFrame->codeBlock();
402a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!codeBlock->isStrictMode()) {
403a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        // FIXME: We can use the preparser in strict mode, we just need additional logic
404a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        // to prevent duplicates.
405a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        LiteralParser preparser(callFrame, programSource, LiteralParser::NonStrictJSON);
406a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (JSValue parsedObject = preparser.tryLiteralParse())
407a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return parsedObject;
408a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
409231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
410635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ScopeChainNode* scopeChain = callFrame->scopeChain();
411e14391e94c850b8bd03680c23b38978db68687a8John Reck    JSValue exceptionValue;
4122bde8e466a4451c7319e3a072d118917957d6554Steve Block    EvalExecutable* eval = codeBlock->evalCodeCache().get(callFrame, codeBlock->ownerExecutable(), codeBlock->isStrictMode(), programSource, scopeChain, exceptionValue);
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
414e14391e94c850b8bd03680c23b38978db68687a8John Reck    ASSERT(!eval == exceptionValue);
415e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (UNLIKELY(!eval))
416e14391e94c850b8bd03680c23b38978db68687a8John Reck        return throwError(callFrame, exceptionValue);
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4182bde8e466a4451c7319e3a072d118917957d6554Steve Block    return callFrame->globalData().interpreter->execute(eval, callFrame, callFrame->uncheckedR(codeBlock->thisRegister()).jsValue().toThisObject(callFrame), callFrame->registers() - registerFile->start() + registerOffset, scopeChain);
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochInterpreter::Interpreter(JSGlobalData& globalData)
422231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    : m_sampleEntryDepth(0)
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_reentryDepth(0)
42481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_registerFile(globalData)
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
426e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(COMPUTED_GOTO_INTERPRETER)
427e14391e94c850b8bd03680c23b38978db68687a8John Reck    privateExecute(InitializeAndReturn, 0, 0);
428d0825bca7fe65beaee391d30da42e937db621564Steve Block
429d0825bca7fe65beaee391d30da42e937db621564Steve Block    for (int i = 0; i < numOpcodeIDs; ++i)
430d0825bca7fe65beaee391d30da42e937db621564Steve Block        m_opcodeIDTable.add(m_opcodeTable[i], static_cast<OpcodeID>(i));
431e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif // ENABLE(COMPUTED_GOTO_INTERPRETER)
432d0825bca7fe65beaee391d30da42e937db621564Steve Block
433231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(OPCODE_SAMPLING)
434231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    enableSampler();
435231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
436635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
438635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef NDEBUG
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
440635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Interpreter::dumpCallFrame(CallFrame* callFrame)
441635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
442635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    callFrame->codeBlock()->dump(callFrame);
443635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    dumpRegisters(callFrame);
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
446635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Interpreter::dumpRegisters(CallFrame* callFrame)
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    printf("Register frame: \n\n");
4490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("-----------------------------------------------------------------------------\n");
4500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("            use            |   address  |                value               \n");
4510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("-----------------------------------------------------------------------------\n");
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CodeBlock* codeBlock = callFrame->codeBlock();
454e14391e94c850b8bd03680c23b38978db68687a8John Reck    RegisterFile* registerFile = &callFrame->scopeChain()->globalObject->globalData().interpreter->registerFile();
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const Register* it;
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const Register* end;
4570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSValue v;
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
459635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (codeBlock->codeType() == GlobalCode) {
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        it = registerFile->lastGlobal();
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        end = it + registerFile->numGlobals();
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        while (it != end) {
4630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            v = (*it).jsValue();
4640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(JSVALUE32_64)
4650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            printf("[global var]               | %10p | %-16s 0x%llx \n", it, v.description(), JSValue::encode(v));
4660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
4670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            printf("[global var]               | %10p | %-16s %p \n", it, v.description(), JSValue::encode(v));
4680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ++it;
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        printf("-----------------------------------------------------------------------------\n");
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
474635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    it = callFrame->registers() - RegisterFile::CallFrameHeaderSize - codeBlock->m_numParameters;
4750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    v = (*it).jsValue();
4760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(JSVALUE32_64)
4770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("[this]                     | %10p | %-16s 0x%llx \n", it, v.description(), JSValue::encode(v)); ++it;
4780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
4790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("[this]                     | %10p | %-16s %p \n", it, v.description(), JSValue::encode(v)); ++it;
4800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
481635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    end = it + max(codeBlock->m_numParameters - 1, 0); // - 1 to skip "this"
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (it != end) {
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        do {
4840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            v = (*it).jsValue();
4850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(JSVALUE32_64)
4860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            printf("[param]                    | %10p | %-16s 0x%llx \n", it, v.description(), JSValue::encode(v));
4870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
4880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            printf("[param]                    | %10p | %-16s %p \n", it, v.description(), JSValue::encode(v));
4890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ++it;
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } while (it != end);
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("-----------------------------------------------------------------------------\n");
4940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("[CodeBlock]                | %10p | %p \n", it, (*it).codeBlock()); ++it;
4950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("[ScopeChain]               | %10p | %p \n", it, (*it).scopeChain()); ++it;
4960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("[CallerRegisters]          | %10p | %d \n", it, (*it).i()); ++it;
4970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("[ReturnPC]                 | %10p | %p \n", it, (*it).vPC()); ++it;
4980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("[ArgumentCount]            | %10p | %d \n", it, (*it).i()); ++it;
4990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("[Callee]                   | %10p | %p \n", it, (*it).function()); ++it;
5000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("-----------------------------------------------------------------------------\n");
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int registerCount = 0;
5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
504635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    end = it + codeBlock->m_numVars;
5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (it != end) {
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        do {
5070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            v = (*it).jsValue();
5080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(JSVALUE32_64)
5090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            printf("[r%2d]                      | %10p | %-16s 0x%llx \n", registerCount, it, v.description(), JSValue::encode(v));
5100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
5110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            printf("[r%2d]                      | %10p | %-16s %p \n", registerCount, it, v.description(), JSValue::encode(v));
5120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ++it;
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ++registerCount;
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } while (it != end);
5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("-----------------------------------------------------------------------------\n");
5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    end = it + codeBlock->m_numCalleeRegisters - codeBlock->m_numVars;
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (it != end) {
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        do {
5220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            v = (*it).jsValue();
5230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(JSVALUE32_64)
5240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            printf("[r%2d]                      | %10p | %-16s 0x%llx \n", registerCount, it, v.description(), JSValue::encode(v));
5250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
5260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            printf("[r%2d]                      | %10p | %-16s %p \n", registerCount, it, v.description(), JSValue::encode(v));
5270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ++it;
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ++registerCount;
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } while (it != end);
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("-----------------------------------------------------------------------------\n");
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
537635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool Interpreter::isOpcode(Opcode opcode)
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
539e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(COMPUTED_GOTO_INTERPRETER)
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return opcode != HashTraits<Opcode>::emptyValue()
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        && !HashTraits<Opcode>::isDeletedValue(opcode)
5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        && m_opcodeIDTable.contains(opcode);
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return opcode >= 0 && opcode <= op_end;
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5485f1ab04193ad0130ca8204aadaceae083aca9881Feng QianNEVER_INLINE bool Interpreter::unwindCallFrame(CallFrame*& callFrame, JSValue exceptionValue, unsigned& bytecodeOffset, CodeBlock*& codeBlock)
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CodeBlock* oldCodeBlock = codeBlock;
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ScopeChainNode* scopeChain = callFrame->scopeChain();
5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (Debugger* debugger = callFrame->dynamicGlobalObject()->debugger()) {
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DebuggerCallFrame debuggerCallFrame(callFrame, exceptionValue);
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (callFrame->callee())
556231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            debugger->returnEvent(debuggerCallFrame, codeBlock->ownerExecutable()->sourceID(), codeBlock->ownerExecutable()->lastLine());
5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
558231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            debugger->didExecuteProgram(debuggerCallFrame, codeBlock->ownerExecutable()->sourceID(), codeBlock->ownerExecutable()->lastLine());
5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If this call frame created an activation or an 'arguments' object, tear it off.
562635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (oldCodeBlock->codeType() == FunctionCode && oldCodeBlock->needsFullScopeChain()) {
5634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (!callFrame->uncheckedR(oldCodeBlock->activationRegister()).jsValue()) {
564a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            oldCodeBlock->createActivation(callFrame);
565a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            scopeChain = callFrame->scopeChain();
566a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
56781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        while (!scopeChain->object->inherits(&JSActivation::s_info))
5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            scopeChain = scopeChain->pop();
5692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        callFrame->setScopeChain(scopeChain);
5712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        JSActivation* activation = asActivation(scopeChain->object.get());
57281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        activation->copyRegisters(*scopeChain->globalData);
5734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (JSValue arguments = callFrame->uncheckedR(unmodifiedArgumentsRegister(oldCodeBlock->argumentsRegister())).jsValue()) {
574a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (!oldCodeBlock->isStrictMode())
5752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                asArguments(arguments)->setActivation(callFrame->globalData(), activation);
576a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
577a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    } else if (oldCodeBlock->usesArguments() && !oldCodeBlock->isStrictMode()) {
5784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (JSValue arguments = callFrame->uncheckedR(unmodifiedArgumentsRegister(oldCodeBlock->argumentsRegister())).jsValue())
57981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            asArguments(arguments)->copyRegisters(callFrame->globalData());
5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
582e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    CallFrame* callerFrame = callFrame->callerFrame();
583e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    if (callerFrame->hasHostCallFrameFlag())
5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
586e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    codeBlock = callerFrame->codeBlock();
587967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#if ENABLE(JIT) && ENABLE(INTERPRETER)
588e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (callerFrame->globalData().canUseJIT())
5894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        bytecodeOffset = codeBlock->bytecodeOffset(callFrame->returnPC());
590e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    else
5914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        bytecodeOffset = codeBlock->bytecodeOffset(callFrame->returnVPC());
592967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#elif ENABLE(JIT)
5934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    bytecodeOffset = codeBlock->bytecodeOffset(callFrame->returnPC());
594e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#else
5954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    bytecodeOffset = codeBlock->bytecodeOffset(callFrame->returnVPC());
596e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
597967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
598e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    callFrame = callerFrame;
5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6026b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerstatic void appendSourceToError(CallFrame* callFrame, ErrorInstance* exception, unsigned bytecodeOffset)
6036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
6046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    exception->clearAppendSourceToMessage();
6056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (!callFrame->codeBlock()->hasExpressionInfo())
6074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        return;
6084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
6096b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    int startOffset = 0;
6106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    int endOffset = 0;
6116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    int divotPoint = 0;
6126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    CodeBlock* codeBlock = callFrame->codeBlock();
6144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    codeBlock->expressionRangeForBytecodeOffset(bytecodeOffset, divotPoint, startOffset, endOffset);
6156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    int expressionStart = divotPoint - startOffset;
6176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    int expressionStop = divotPoint + endOffset;
6186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!expressionStop || expressionStart > codeBlock->source()->length())
6206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return;
6216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    JSGlobalData* globalData = &callFrame->globalData();
6236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    JSValue jsMessage = exception->getDirect(globalData->propertyNames->message);
6246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!jsMessage || !jsMessage.isString())
6256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return;
6266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    UString message = asString(jsMessage)->value(callFrame);
6286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (expressionStart < expressionStop)
6306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        message =  makeUString(message, " (evaluating '", codeBlock->source()->getRange(expressionStart, expressionStop), "')");
6316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    else {
6326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        // No range information, so give a few characters of context
6336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        const UChar* data = codeBlock->source()->data();
6346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        int dataLength = codeBlock->source()->length();
6356b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        int start = expressionStart;
6366b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        int stop = expressionStart;
6376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        // Get up to 20 characters of context to the left and right of the divot, clamping to the line.
6386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        // then strip whitespace.
6396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        while (start > 0 && (expressionStart - start < 20) && data[start - 1] != '\n')
6406b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            start--;
6416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        while (start < (expressionStart - 1) && isStrWhiteSpace(data[start]))
6426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            start++;
6436b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        while (stop < dataLength && (stop - expressionStart < 20) && data[stop] != '\n')
6446b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            stop++;
64581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        while (stop > expressionStart && isStrWhiteSpace(data[stop - 1]))
6466b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            stop--;
6476b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        message = makeUString(message, " (near '...", codeBlock->source()->getRange(start, stop), "...')");
6486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
6496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    exception->putDirect(*globalData, globalData->propertyNames->message, jsString(globalData, message));
6516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}
6526b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangNEVER_INLINE HandlerInfo* Interpreter::throwException(CallFrame*& callFrame, JSValue& exceptionValue, unsigned bytecodeOffset)
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CodeBlock* codeBlock = callFrame->codeBlock();
6564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    bool isInterrupt = false;
6574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
6584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    // Set up the exception object
659635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (exceptionValue.isObject()) {
6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JSObject* exception = asObject(exceptionValue);
6614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
6624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (exception->isErrorInstance() && static_cast<ErrorInstance*>(exception)->appendSourceToMessage())
6636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            appendSourceToError(callFrame, static_cast<ErrorInstance*>(exception), bytecodeOffset);
6646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        // Using hasExpressionInfo to imply we are interested in rich exception info.
6664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (codeBlock->hasExpressionInfo() && !hasErrorInfo(callFrame, exception)) {
6674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            ASSERT(codeBlock->hasLineInfo());
6686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            // FIXME: should only really be adding these properties to VM generated exceptions,
6704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            // but the inspector currently requires these for all thrown objects.
6714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            addErrorInfo(callFrame, exception, codeBlock->lineNumberForBytecodeOffset(bytecodeOffset), codeBlock->ownerExecutable()->source());
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
6734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
6744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ComplType exceptionType = exception->exceptionType();
6754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        isInterrupt = exceptionType == Interrupted || exceptionType == Terminated;
6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (Debugger* debugger = callFrame->dynamicGlobalObject()->debugger()) {
6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DebuggerCallFrame debuggerCallFrame(callFrame, exceptionValue);
680d0825bca7fe65beaee391d30da42e937db621564Steve Block        bool hasHandler = codeBlock->handlerForBytecodeOffset(bytecodeOffset);
6814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        debugger->exception(debuggerCallFrame, codeBlock->ownerExecutable()->sourceID(), codeBlock->lineNumberForBytecodeOffset(bytecodeOffset), hasHandler);
6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Calculate an exception handler vPC, unwinding call frames as necessary.
685635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    HandlerInfo* handler = 0;
6864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    while (isInterrupt || !(handler = codeBlock->handlerForBytecodeOffset(bytecodeOffset))) {
6874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (!unwindCallFrame(callFrame, exceptionValue, bytecodeOffset, codeBlock)) {
6884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            if (Profiler* profiler = *Profiler::enabledProfilerReference())
6894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                profiler->exceptionUnwind(callFrame);
6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
6914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        }
6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (Profiler* profiler = *Profiler::enabledProfilerReference())
6954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        profiler->exceptionUnwind(callFrame);
6964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
6975af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    // Shrink the JS stack, in case stack overflow made it huge.
698e14391e94c850b8bd03680c23b38978db68687a8John Reck    Register* highWaterMark = 0;
699e14391e94c850b8bd03680c23b38978db68687a8John Reck    for (CallFrame* callerFrame = callFrame; callerFrame; callerFrame = callerFrame->callerFrame()->removeHostCallFrameFlag()) {
700a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        CodeBlock* codeBlock = callerFrame->codeBlock();
701a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!codeBlock)
702a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            continue;
703a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        Register* callerHighWaterMark = callerFrame->registers() + codeBlock->m_numCalleeRegisters;
704a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        highWaterMark = max(highWaterMark, callerHighWaterMark);
705a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
706a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_registerFile.shrink(highWaterMark);
7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7085af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    // Unwind the scope chain within the exception handler's call frame.
709635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ScopeChainNode* scopeChain = callFrame->scopeChain();
710a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    int scopeDelta = 0;
711a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!codeBlock->needsFullScopeChain() || codeBlock->codeType() != FunctionCode
7124576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        || callFrame->uncheckedR(codeBlock->activationRegister()).jsValue())
71381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        scopeDelta = depth(codeBlock, scopeChain) - handler->scopeDepth;
7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(scopeDelta >= 0);
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (scopeDelta--)
716635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        scopeChain = scopeChain->pop();
717635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    callFrame->setScopeChain(scopeChain);
7188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
719635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return handler;
7208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
722e14391e94c850b8bd03680c23b38978db68687a8John Reckstatic inline JSValue checkedReturn(JSValue returnValue)
723e14391e94c850b8bd03680c23b38978db68687a8John Reck{
724e14391e94c850b8bd03680c23b38978db68687a8John Reck    ASSERT(returnValue);
725e14391e94c850b8bd03680c23b38978db68687a8John Reck    return returnValue;
726e14391e94c850b8bd03680c23b38978db68687a8John Reck}
727e14391e94c850b8bd03680c23b38978db68687a8John Reck
728e14391e94c850b8bd03680c23b38978db68687a8John Reckstatic inline JSObject* checkedReturn(JSObject* returnValue)
729e14391e94c850b8bd03680c23b38978db68687a8John Reck{
730e14391e94c850b8bd03680c23b38978db68687a8John Reck    ASSERT(returnValue);
731e14391e94c850b8bd03680c23b38978db68687a8John Reck    return returnValue;
732e14391e94c850b8bd03680c23b38978db68687a8John Reck}
733e14391e94c850b8bd03680c23b38978db68687a8John Reck
734e14391e94c850b8bd03680c23b38978db68687a8John ReckJSValue Interpreter::execute(ProgramExecutable* program, CallFrame* callFrame, ScopeChainNode* scopeChain, JSObject* thisObj)
7358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!scopeChain->globalData->exception);
7378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
738e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (m_reentryDepth >= MaxSmallThreadReentryDepth && m_reentryDepth >= callFrame->globalData().maxReentryDepth)
739e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(throwStackOverflowError(callFrame));
7408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7412bde8e466a4451c7319e3a072d118917957d6554Steve Block    DynamicGlobalObjectScope globalObjectScope(*scopeChain->globalData, scopeChain->globalObject.get());
7422bde8e466a4451c7319e3a072d118917957d6554Steve Block
743967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    JSObject* error = program->compile(callFrame, scopeChain);
744e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (error)
745e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(throwError(callFrame, error));
746967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    CodeBlock* codeBlock = &program->generatedBytecode();
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Register* oldEnd = m_registerFile.end();
749635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Register* newEnd = oldEnd + codeBlock->m_numParameters + RegisterFile::CallFrameHeaderSize + codeBlock->m_numCalleeRegisters;
750e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (!m_registerFile.grow(newEnd))
751e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(throwStackOverflowError(callFrame));
7528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSGlobalObject* lastGlobalObject = m_registerFile.globalObject();
7548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSGlobalObject* globalObject = callFrame->dynamicGlobalObject();
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    globalObject->copyGlobalsTo(m_registerFile);
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
757635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    CallFrame* newCallFrame = CallFrame::create(oldEnd + codeBlock->m_numParameters + RegisterFile::CallFrameHeaderSize);
7585af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    ASSERT(codeBlock->m_numParameters == 1); // 1 parameter for 'this'.
7595af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    newCallFrame->init(codeBlock, 0, scopeChain, CallFrame::noCaller(), codeBlock->m_numParameters, 0);
7604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    newCallFrame->uncheckedR(newCallFrame->hostThisRegister()) = JSValue(thisObj);
7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Profiler** profiler = Profiler::enabledProfilerReference();
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (*profiler)
7644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        (*profiler)->willExecute(callFrame, program->sourceURL(), program->lineNo());
7658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue result;
7678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
768231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        SamplingTool::CallRecord callRecord(m_sampler.get());
7698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
770e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        m_reentryDepth++;
771635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(JIT)
772e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (callFrame->globalData().canUseJIT())
773e14391e94c850b8bd03680c23b38978db68687a8John Reck            result = program->generatedJITCode().execute(&m_registerFile, newCallFrame, scopeChain->globalData);
774e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        else
775e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
776e14391e94c850b8bd03680c23b38978db68687a8John Reck            result = privateExecute(Normal, &m_registerFile, newCallFrame);
777e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_reentryDepth--;
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (*profiler)
782231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        (*profiler)->didExecute(callFrame, program->sourceURL(), program->lineNo());
7838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_reentryDepth && lastGlobalObject && globalObject != lastGlobalObject)
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        lastGlobalObject->copyGlobalsTo(m_registerFile);
7868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_registerFile.shrink(oldEnd);
7888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
789e14391e94c850b8bd03680c23b38978db68687a8John Reck    return checkedReturn(result);
7908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
792e14391e94c850b8bd03680c23b38978db68687a8John ReckJSValue Interpreter::executeCall(CallFrame* callFrame, JSObject* function, CallType callType, const CallData& callData, JSValue thisValue, const ArgList& args)
7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7945af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    ASSERT(!callFrame->hadException());
7958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
796e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (m_reentryDepth >= MaxSmallThreadReentryDepth && m_reentryDepth >= callFrame->globalData().maxReentryDepth)
797e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(throwStackOverflowError(callFrame));
7988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Register* oldEnd = m_registerFile.end();
8005af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    int argCount = 1 + args.size(); // implicit "this" parameter
8015af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    size_t registerOffset = argCount + RegisterFile::CallFrameHeaderSize;
8028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
803e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (!m_registerFile.grow(oldEnd + registerOffset))
804e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(throwStackOverflowError(callFrame));
8058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallFrame* newCallFrame = CallFrame::create(oldEnd);
8078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    size_t dst = 0;
8084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    newCallFrame->uncheckedR(0) = thisValue;
8098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ArgList::const_iterator end = args.end();
8108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (ArgList::const_iterator it = args.begin(); it != end; ++it)
8114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        newCallFrame->uncheckedR(++dst) = *it;
8128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8135af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (callType == CallTypeJS) {
8145af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        ScopeChainNode* callDataScopeChain = callData.js.scopeChain;
8155af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
8162bde8e466a4451c7319e3a072d118917957d6554Steve Block        DynamicGlobalObjectScope globalObjectScope(*callDataScopeChain->globalData, callDataScopeChain->globalObject.get());
8172bde8e466a4451c7319e3a072d118917957d6554Steve Block
818967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        JSObject* compileError = callData.js.functionExecutable->compileForCall(callFrame, callDataScopeChain);
819967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        if (UNLIKELY(!!compileError)) {
820967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            m_registerFile.shrink(oldEnd);
821e14391e94c850b8bd03680c23b38978db68687a8John Reck            return checkedReturn(throwError(callFrame, compileError));
822967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        }
823967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
824967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        CodeBlock* newCodeBlock = &callData.js.functionExecutable->generatedBytecodeForCall();
825967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        newCallFrame = slideRegisterWindowForCall(newCodeBlock, &m_registerFile, newCallFrame, registerOffset, argCount);
8265af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        if (UNLIKELY(!newCallFrame)) {
8275af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            m_registerFile.shrink(oldEnd);
828e14391e94c850b8bd03680c23b38978db68687a8John Reck            return checkedReturn(throwStackOverflowError(callFrame));
8295af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        }
8305af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
8315af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        newCallFrame->init(newCodeBlock, 0, callDataScopeChain, callFrame->addHostCallFrameFlag(), argCount, function);
8325af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
8335af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        Profiler** profiler = Profiler::enabledProfilerReference();
8345af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        if (*profiler)
8354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            (*profiler)->willExecute(callFrame, function);
8365af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
8375af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        JSValue result;
8385af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        {
8395af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            SamplingTool::CallRecord callRecord(m_sampler.get());
8405af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
841e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            m_reentryDepth++;
842e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(JIT)
843e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            if (callFrame->globalData().canUseJIT())
844e14391e94c850b8bd03680c23b38978db68687a8John Reck                result = callData.js.functionExecutable->generatedJITCodeForCall().execute(&m_registerFile, newCallFrame, callDataScopeChain->globalData);
845e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            else
846e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
847e14391e94c850b8bd03680c23b38978db68687a8John Reck                result = privateExecute(Normal, &m_registerFile, newCallFrame);
8485af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            m_reentryDepth--;
8495af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        }
8505af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
8515af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        if (*profiler)
8524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            (*profiler)->didExecute(callFrame, function);
8535af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
8548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_registerFile.shrink(oldEnd);
855e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(result);
8568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8575af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
8585af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    ASSERT(callType == CallTypeHost);
8595af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    ScopeChainNode* scopeChain = callFrame->scopeChain();
8605af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    newCallFrame = CallFrame::create(newCallFrame->registers() + registerOffset);
8615af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    newCallFrame->init(0, 0, scopeChain, callFrame->addHostCallFrameFlag(), argCount, function);
8625af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
8632bde8e466a4451c7319e3a072d118917957d6554Steve Block    DynamicGlobalObjectScope globalObjectScope(*scopeChain->globalData, scopeChain->globalObject.get());
8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Profiler** profiler = Profiler::enabledProfilerReference();
8668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (*profiler)
8674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        (*profiler)->willExecute(callFrame, function);
8688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue result;
8708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
8715af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        SamplingTool::HostCallRecord callRecord(m_sampler.get());
872545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        result = JSValue::decode(callData.native.function(newCallFrame));
8736c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
8746c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
8756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (*profiler)
8764576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        (*profiler)->didExecute(callFrame, function);
8776c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
8786c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    m_registerFile.shrink(oldEnd);
879e14391e94c850b8bd03680c23b38978db68687a8John Reck    return checkedReturn(result);
8806c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen}
8816c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
882e14391e94c850b8bd03680c23b38978db68687a8John ReckJSObject* Interpreter::executeConstruct(CallFrame* callFrame, JSObject* constructor, ConstructType constructType, const ConstructData& constructData, const ArgList& args)
8836c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
884545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    ASSERT(!callFrame->hadException());
8856c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
886e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (m_reentryDepth >= MaxSmallThreadReentryDepth && m_reentryDepth >= callFrame->globalData().maxReentryDepth)
887e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(throwStackOverflowError(callFrame));
8886c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
8896c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    Register* oldEnd = m_registerFile.end();
890545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    int argCount = 1 + args.size(); // implicit "this" parameter
891545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    size_t registerOffset = argCount + RegisterFile::CallFrameHeaderSize;
8926c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
893e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (!m_registerFile.grow(oldEnd + registerOffset))
894e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(throwStackOverflowError(callFrame));
8956c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
8966c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    CallFrame* newCallFrame = CallFrame::create(oldEnd);
8976c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    size_t dst = 0;
8986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    ArgList::const_iterator end = args.end();
8996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    for (ArgList::const_iterator it = args.begin(); it != end; ++it)
9004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        newCallFrame->uncheckedR(++dst) = *it;
9016c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
902545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (constructType == ConstructTypeJS) {
903545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        ScopeChainNode* constructDataScopeChain = constructData.js.scopeChain;
904545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
9052bde8e466a4451c7319e3a072d118917957d6554Steve Block        DynamicGlobalObjectScope globalObjectScope(*constructDataScopeChain->globalData, constructDataScopeChain->globalObject.get());
9062bde8e466a4451c7319e3a072d118917957d6554Steve Block
907967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        JSObject* compileError = constructData.js.functionExecutable->compileForConstruct(callFrame, constructDataScopeChain);
908967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        if (UNLIKELY(!!compileError)) {
909967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            m_registerFile.shrink(oldEnd);
910e14391e94c850b8bd03680c23b38978db68687a8John Reck            return checkedReturn(throwError(callFrame, compileError));
911967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        }
912967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
913967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        CodeBlock* newCodeBlock = &constructData.js.functionExecutable->generatedBytecodeForConstruct();
914967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        newCallFrame = slideRegisterWindowForCall(newCodeBlock, &m_registerFile, newCallFrame, registerOffset, argCount);
915545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (UNLIKELY(!newCallFrame)) {
916545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_registerFile.shrink(oldEnd);
917e14391e94c850b8bd03680c23b38978db68687a8John Reck            return checkedReturn(throwStackOverflowError(callFrame));
918545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        }
919545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
920545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        newCallFrame->init(newCodeBlock, 0, constructDataScopeChain, callFrame->addHostCallFrameFlag(), argCount, constructor);
921545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
922545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        Profiler** profiler = Profiler::enabledProfilerReference();
923545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (*profiler)
9244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            (*profiler)->willExecute(callFrame, constructor);
925545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
926545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        JSValue result;
927545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        {
928545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            SamplingTool::CallRecord callRecord(m_sampler.get());
929545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
930e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            m_reentryDepth++;
931e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(JIT)
932e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            if (callFrame->globalData().canUseJIT())
933e14391e94c850b8bd03680c23b38978db68687a8John Reck                result = constructData.js.functionExecutable->generatedJITCodeForConstruct().execute(&m_registerFile, newCallFrame, constructDataScopeChain->globalData);
934e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            else
935e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
936e14391e94c850b8bd03680c23b38978db68687a8John Reck                result = privateExecute(Normal, &m_registerFile, newCallFrame);
937545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_reentryDepth--;
938545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        }
939545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
940545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (*profiler)
9414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            (*profiler)->didExecute(callFrame, constructor);
942545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
9436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        m_registerFile.shrink(oldEnd);
944545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (callFrame->hadException())
945545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            return 0;
946545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        ASSERT(result.isObject());
947e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(asObject(result));
9486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
9495af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
950545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    ASSERT(constructType == ConstructTypeHost);
951545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    ScopeChainNode* scopeChain = callFrame->scopeChain();
952545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    newCallFrame = CallFrame::create(newCallFrame->registers() + registerOffset);
953545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    newCallFrame->init(0, 0, scopeChain, callFrame->addHostCallFrameFlag(), argCount, constructor);
954545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
9552bde8e466a4451c7319e3a072d118917957d6554Steve Block    DynamicGlobalObjectScope globalObjectScope(*scopeChain->globalData, scopeChain->globalObject.get());
9566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
9576c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    Profiler** profiler = Profiler::enabledProfilerReference();
9586c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (*profiler)
9594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        (*profiler)->willExecute(callFrame, constructor);
9606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
9616c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    JSValue result;
9626c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    {
963545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        SamplingTool::HostCallRecord callRecord(m_sampler.get());
964545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        result = JSValue::decode(constructData.native.function(newCallFrame));
9658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (*profiler)
9684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        (*profiler)->didExecute(callFrame, constructor);
9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_registerFile.shrink(oldEnd);
971545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (callFrame->hadException())
972545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return 0;
973545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    ASSERT(result.isObject());
974e14391e94c850b8bd03680c23b38978db68687a8John Reck    return checkedReturn(asObject(result));
9758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
977e14391e94c850b8bd03680c23b38978db68687a8John ReckCallFrameClosure Interpreter::prepareForRepeatCall(FunctionExecutable* FunctionExecutable, CallFrame* callFrame, JSFunction* function, int argCount, ScopeChainNode* scopeChain)
9785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
9795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    ASSERT(!scopeChain->globalData->exception);
9805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
981dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_reentryDepth >= MaxSmallThreadReentryDepth) {
982dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (m_reentryDepth >= callFrame->globalData().maxReentryDepth) {
983e14391e94c850b8bd03680c23b38978db68687a8John Reck            throwStackOverflowError(callFrame);
9845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            return CallFrameClosure();
9855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
9865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
9875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
9885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    Register* oldEnd = m_registerFile.end();
9895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    int argc = 1 + argCount; // implicit "this" parameter
9905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
9915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (!m_registerFile.grow(oldEnd + argc)) {
992e14391e94c850b8bd03680c23b38978db68687a8John Reck        throwStackOverflowError(callFrame);
9935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return CallFrameClosure();
9945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
9955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
9965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    CallFrame* newCallFrame = CallFrame::create(oldEnd);
9975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    size_t dst = 0;
9985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    for (int i = 0; i < argc; ++i)
9994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        newCallFrame->uncheckedR(++dst) = jsUndefined();
10005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1001967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    JSObject* error = FunctionExecutable->compileForCall(callFrame, scopeChain);
1002967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (error) {
1003e14391e94c850b8bd03680c23b38978db68687a8John Reck        throwError(callFrame, error);
1004967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        m_registerFile.shrink(oldEnd);
1005967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return CallFrameClosure();
1006967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    }
1007967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    CodeBlock* codeBlock = &FunctionExecutable->generatedBytecodeForCall();
1008967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
1009967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    newCallFrame = slideRegisterWindowForCall(codeBlock, &m_registerFile, newCallFrame, argc + RegisterFile::CallFrameHeaderSize, argc);
10105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (UNLIKELY(!newCallFrame)) {
1011e14391e94c850b8bd03680c23b38978db68687a8John Reck        throwStackOverflowError(callFrame);
10125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        m_registerFile.shrink(oldEnd);
10135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return CallFrameClosure();
10145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
1015e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    newCallFrame->init(codeBlock, 0, scopeChain, callFrame->addHostCallFrameFlag(), argc, function);
1016231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    CallFrameClosure result = { callFrame, newCallFrame, function, FunctionExecutable, scopeChain->globalData, oldEnd, scopeChain, codeBlock->m_numParameters, argc };
10175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return result;
10185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
10195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1020e14391e94c850b8bd03680c23b38978db68687a8John ReckJSValue Interpreter::execute(CallFrameClosure& closure)
10215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
10225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    closure.resetCallFrame();
10235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    Profiler** profiler = Profiler::enabledProfilerReference();
10245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (*profiler)
10255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        (*profiler)->willExecute(closure.oldCallFrame, closure.function);
10265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
10275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue result;
10285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    {
1029231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        SamplingTool::CallRecord callRecord(m_sampler.get());
10305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1031e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        m_reentryDepth++;
10325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(JIT)
1033e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
1034e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (closure.newCallFrame->globalData().canUseJIT())
1035e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
1036e14391e94c850b8bd03680c23b38978db68687a8John Reck            result = closure.functionExecutable->generatedJITCodeForCall().execute(&m_registerFile, closure.newCallFrame, closure.globalData);
1037e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
1038e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        else
1039e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
1040e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
1041e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
1042e14391e94c850b8bd03680c23b38978db68687a8John Reck            result = privateExecute(Normal, &m_registerFile, closure.newCallFrame);
10435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif
10445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        m_reentryDepth--;
10455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
10465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
10475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (*profiler)
10485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        (*profiler)->didExecute(closure.oldCallFrame, closure.function);
1049e14391e94c850b8bd03680c23b38978db68687a8John Reck    return checkedReturn(result);
10505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
10515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
10525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid Interpreter::endRepeatCall(CallFrameClosure& closure)
10535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
10545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    m_registerFile.shrink(closure.oldEnd);
10555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
10565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1057e14391e94c850b8bd03680c23b38978db68687a8John ReckJSValue Interpreter::execute(EvalExecutable* eval, CallFrame* callFrame, JSObject* thisObj, ScopeChainNode* scopeChain)
10588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1059967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    JSObject* compileError = eval->compile(callFrame, scopeChain);
1060e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (UNLIKELY(!!compileError))
1061e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(throwError(callFrame, compileError));
1062e14391e94c850b8bd03680c23b38978db68687a8John Reck    return execute(eval, callFrame, thisObj, m_registerFile.size() + eval->generatedBytecode().m_numParameters + RegisterFile::CallFrameHeaderSize, scopeChain);
10638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1065e14391e94c850b8bd03680c23b38978db68687a8John ReckJSValue Interpreter::execute(EvalExecutable* eval, CallFrame* callFrame, JSObject* thisObj, int globalRegisterOffset, ScopeChainNode* scopeChain)
10668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!scopeChain->globalData->exception);
10688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10692bde8e466a4451c7319e3a072d118917957d6554Steve Block    DynamicGlobalObjectScope globalObjectScope(*scopeChain->globalData, scopeChain->globalObject.get());
10702bde8e466a4451c7319e3a072d118917957d6554Steve Block
1071e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (m_reentryDepth >= MaxSmallThreadReentryDepth && m_reentryDepth >= callFrame->globalData().maxReentryDepth)
1072e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(throwStackOverflowError(callFrame));
10738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1074967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    JSObject* compileError = eval->compile(callFrame, scopeChain);
1075e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (UNLIKELY(!!compileError))
1076e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(throwError(callFrame, compileError));
1077967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    EvalCodeBlock* codeBlock = &eval->generatedBytecode();
10788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1079a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    JSObject* variableObject;
108081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    for (ScopeChainNode* node = scopeChain; ; node = node->next.get()) {
10818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(node);
10828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (node->object->isVariableObject()) {
10832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            variableObject = static_cast<JSVariableObject*>(node->object.get());
10848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
10858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
10868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10886c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    unsigned numVariables = codeBlock->numVariables();
10896c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    int numFunctions = codeBlock->numberOfFunctionDecls();
1090a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    bool pushedScope = false;
10916c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (numVariables || numFunctions) {
1092a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (codeBlock->isStrictMode()) {
1093a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            variableObject = new (callFrame) StrictEvalActivation(callFrame);
1094a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            scopeChain = scopeChain->push(variableObject);
1095a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            pushedScope = true;
1096a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
10976c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        // Scope for BatchedTransitionOptimizer
10982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        BatchedTransitionOptimizer optimizer(callFrame->globalData(), variableObject);
10998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1100231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        for (unsigned i = 0; i < numVariables; ++i) {
1101231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            const Identifier& ident = codeBlock->variable(i);
11028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!variableObject->hasProperty(callFrame, ident)) {
11038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                PutPropertySlot slot;
11048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                variableObject->put(callFrame, ident, jsUndefined(), slot);
11058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
11068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
11078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1108231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        for (int i = 0; i < numFunctions; ++i) {
1109231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            FunctionExecutable* function = codeBlock->functionDecl(i);
11108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PutPropertySlot slot;
1111231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            variableObject->put(callFrame, function->name(), function->make(callFrame, scopeChain), slot);
11128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
11138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Register* oldEnd = m_registerFile.end();
1116635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Register* newEnd = m_registerFile.start() + globalRegisterOffset + codeBlock->m_numCalleeRegisters;
11178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_registerFile.grow(newEnd)) {
1118a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (pushedScope)
1119a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            scopeChain->pop();
1120e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(throwStackOverflowError(callFrame));
11218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1123635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    CallFrame* newCallFrame = CallFrame::create(m_registerFile.start() + globalRegisterOffset);
11248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11255af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    ASSERT(codeBlock->m_numParameters == 1); // 1 parameter for 'this'.
11265af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    newCallFrame->init(codeBlock, 0, scopeChain, callFrame->addHostCallFrameFlag(), codeBlock->m_numParameters, 0);
11274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    newCallFrame->uncheckedR(newCallFrame->hostThisRegister()) = JSValue(thisObj);
11288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Profiler** profiler = Profiler::enabledProfilerReference();
11308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (*profiler)
11314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        (*profiler)->willExecute(callFrame, eval->sourceURL(), eval->lineNo());
11328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue result;
11348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1135231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        SamplingTool::CallRecord callRecord(m_sampler.get());
11368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_reentryDepth++;
1138e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1139635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(JIT)
1140e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
1141e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (callFrame->globalData().canUseJIT())
1142e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
1143e14391e94c850b8bd03680c23b38978db68687a8John Reck            result = eval->generatedJITCode().execute(&m_registerFile, newCallFrame, scopeChain->globalData);
1144e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
1145e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        else
1146e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
1147e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
1148e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
1149e14391e94c850b8bd03680c23b38978db68687a8John Reck            result = privateExecute(Normal, &m_registerFile, newCallFrame);
11508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
11518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_reentryDepth--;
11528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (*profiler)
1155231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        (*profiler)->didExecute(callFrame, eval->sourceURL(), eval->lineNo());
11568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_registerFile.shrink(oldEnd);
1158a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (pushedScope)
1159a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        scopeChain->pop();
1160e14391e94c850b8bd03680c23b38978db68687a8John Reck    return checkedReturn(result);
11618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1163635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectNEVER_INLINE void Interpreter::debug(CallFrame* callFrame, DebugHookID debugHookID, int firstLine, int lastLine)
11648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
11658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Debugger* debugger = callFrame->dynamicGlobalObject()->debugger();
11668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!debugger)
11678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
11688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (debugHookID) {
11708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case DidEnterCallFrame:
1171231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            debugger->callEvent(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), firstLine);
11728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
11738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WillLeaveCallFrame:
1174231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            debugger->returnEvent(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), lastLine);
11758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
11768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WillExecuteStatement:
1177231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            debugger->atStatement(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), firstLine);
11788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
11798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WillExecuteProgram:
1180231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            debugger->willExecuteProgram(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), firstLine);
11818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
11828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case DidExecuteProgram:
1183231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            debugger->didExecuteProgram(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), lastLine);
11848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
11858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case DidReachBreakpoint:
1186231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            debugger->didReachBreakpoint(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), lastLine);
11878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
11888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1191e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
1192635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectNEVER_INLINE ScopeChainNode* Interpreter::createExceptionScope(CallFrame* callFrame, const Instruction* vPC)
11938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1194cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    int dst = vPC[1].u.operand;
11958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CodeBlock* codeBlock = callFrame->codeBlock();
1196cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Identifier& property = codeBlock->identifier(vPC[2].u.operand);
1197cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    JSValue value = callFrame->r(vPC[3].u.operand).jsValue();
11988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSObject* scope = new (callFrame) JSStaticScopeObject(callFrame, property, value, DontDelete);
11994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    callFrame->uncheckedR(dst) = JSValue(scope);
12008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return callFrame->scopeChain()->push(scope);
12028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12045f1ab04193ad0130ca8204aadaceae083aca9881Feng QianNEVER_INLINE void Interpreter::tryCachePutByID(CallFrame* callFrame, CodeBlock* codeBlock, Instruction* vPC, JSValue baseValue, const PutPropertySlot& slot)
12058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Recursive invocation may already have specialized this instruction.
12078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (vPC[0].u.opcode != getOpcode(op_put_by_id))
12088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1210635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!baseValue.isCell())
12118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Uncacheable: give up.
12148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!slot.isCacheable()) {
12158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[0] = getOpcode(op_put_by_id_generic);
12168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1219e14391e94c850b8bd03680c23b38978db68687a8John Reck    JSCell* baseCell = baseValue.asCell();
1220635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Structure* structure = baseCell->structure();
12218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1222231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (structure->isUncacheableDictionary()) {
12238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[0] = getOpcode(op_put_by_id_generic);
12248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1227635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Cache miss: record Structure to compare against next time.
1228635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Structure* lastStructure = vPC[4].u.structure;
1229635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (structure != lastStructure) {
1230635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // First miss: record Structure to compare against next time.
1231635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (!lastStructure) {
1232635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            vPC[4] = structure;
12338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
12348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
12358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Second miss: give up.
12378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[0] = getOpcode(op_put_by_id_generic);
12388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1241635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Cache hit: Specialize instruction and ref Structures.
12428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If baseCell != slot.base(), then baseCell must be a proxy for another object.
12448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (baseCell != slot.base()) {
12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[0] = getOpcode(op_put_by_id_generic);
12468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1249635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Structure transition, cache transition info
12508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (slot.type() == PutPropertySlot::NewProperty) {
1251231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (structure->isDictionary()) {
1252231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            vPC[0] = getOpcode(op_put_by_id_generic);
1253231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            return;
1254231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
1255cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1256cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        // put_by_id_transition checks the prototype chain for setters.
1257cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        normalizePrototypeChain(callFrame, baseCell);
1258cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
12598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[0] = getOpcode(op_put_by_id_transition);
1260635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        vPC[4] = structure->previousID();
1261635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        vPC[5] = structure;
1262cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC[6] = structure->prototypeChain(callFrame);
12638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[7] = slot.cachedOffset();
1264635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        codeBlock->refStructures(vPC);
12658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    vPC[0] = getOpcode(op_put_by_id_replace);
12698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    vPC[5] = slot.cachedOffset();
1270635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    codeBlock->refStructures(vPC);
12718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1273635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectNEVER_INLINE void Interpreter::uncachePutByID(CodeBlock* codeBlock, Instruction* vPC)
12748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1275635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    codeBlock->derefStructures(vPC);
12768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    vPC[0] = getOpcode(op_put_by_id);
12778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    vPC[4] = 0;
12788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12805f1ab04193ad0130ca8204aadaceae083aca9881Feng QianNEVER_INLINE void Interpreter::tryCacheGetByID(CallFrame* callFrame, CodeBlock* codeBlock, Instruction* vPC, JSValue baseValue, const Identifier& propertyName, const PropertySlot& slot)
12818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Recursive invocation may already have specialized this instruction.
12838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (vPC[0].u.opcode != getOpcode(op_get_by_id))
12848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Cache property access for immediates.
1287635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!baseValue.isCell()) {
12888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[0] = getOpcode(op_get_by_id_generic);
12898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    JSGlobalData* globalData = &callFrame->globalData();
12938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (isJSArray(globalData, baseValue) && propertyName == callFrame->propertyNames().length) {
12948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[0] = getOpcode(op_get_array_length);
12958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (isJSString(globalData, baseValue) && propertyName == callFrame->propertyNames().length) {
12998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[0] = getOpcode(op_get_string_length);
13008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
13018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
13028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Uncacheable: give up.
13048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!slot.isCacheable()) {
13058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[0] = getOpcode(op_get_by_id_generic);
13068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
13078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
13088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1309e14391e94c850b8bd03680c23b38978db68687a8John Reck    Structure* structure = baseValue.asCell()->structure();
13108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1311231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (structure->isUncacheableDictionary()) {
13128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[0] = getOpcode(op_get_by_id_generic);
13138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
13148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
13158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Cache miss
1317635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Structure* lastStructure = vPC[4].u.structure;
1318635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (structure != lastStructure) {
1319635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // First miss: record Structure to compare against next time.
1320635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (!lastStructure) {
1321635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            vPC[4] = structure;
13228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
13238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
13248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Second miss: give up.
13268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[0] = getOpcode(op_get_by_id_generic);
13278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
13288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
13298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1330635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Cache hit: Specialize instruction and ref Structures.
13318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (slot.slotBase() == baseValue) {
1333dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        switch (slot.cachedPropertyType()) {
1334dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        case PropertySlot::Getter:
1335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[0] = getOpcode(op_get_by_id_getter_self);
1336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[5] = slot.cachedOffset();
1337dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            break;
1338dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        case PropertySlot::Custom:
1339dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[0] = getOpcode(op_get_by_id_custom_self);
1340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[5] = slot.customGetter();
1341dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            break;
1342dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        default:
1343dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[0] = getOpcode(op_get_by_id_self);
1344dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[5] = slot.cachedOffset();
1345dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            break;
1346dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
13478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1348635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        codeBlock->refStructures(vPC);
13498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
13508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
13518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1352643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (structure->isDictionary()) {
1353643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        vPC[0] = getOpcode(op_get_by_id_generic);
1354643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
1355643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
1356643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1357635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (slot.slotBase() == structure->prototypeForLookup(callFrame)) {
1358635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        ASSERT(slot.slotBase().isObject());
13598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JSObject* baseObject = asObject(slot.slotBase());
1361d0825bca7fe65beaee391d30da42e937db621564Steve Block        size_t offset = slot.cachedOffset();
13628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1363635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Since we're accessing a prototype in a loop, it's a good bet that it
1364635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // should not be treated as a dictionary.
1365d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (baseObject->structure()->isDictionary()) {
13662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            baseObject->flattenDictionaryObject(callFrame->globalData());
1367d0825bca7fe65beaee391d30da42e937db621564Steve Block            offset = baseObject->structure()->get(propertyName);
1368d0825bca7fe65beaee391d30da42e937db621564Steve Block        }
1369643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1370643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        ASSERT(!baseObject->structure()->isUncacheableDictionary());
1371dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1372dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        switch (slot.cachedPropertyType()) {
1373dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        case PropertySlot::Getter:
1374dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[0] = getOpcode(op_get_by_id_getter_proto);
1375dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[6] = offset;
1376dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            break;
1377dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        case PropertySlot::Custom:
1378dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[0] = getOpcode(op_get_by_id_custom_proto);
1379dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[6] = slot.customGetter();
1380dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            break;
1381dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        default:
1382dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[0] = getOpcode(op_get_by_id_proto);
1383dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[6] = offset;
1384dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            break;
1385dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
1386635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        vPC[5] = baseObject->structure();
13878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1388635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        codeBlock->refStructures(vPC);
13898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
13908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
13918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1392d0825bca7fe65beaee391d30da42e937db621564Steve Block    size_t offset = slot.cachedOffset();
1393d0825bca7fe65beaee391d30da42e937db621564Steve Block    size_t count = normalizePrototypeChain(callFrame, baseValue, slot.slotBase(), propertyName, offset);
1394635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!count) {
1395635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        vPC[0] = getOpcode(op_get_by_id_generic);
1396635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
13978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
13988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1399dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1400dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    switch (slot.cachedPropertyType()) {
1401dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PropertySlot::Getter:
1402dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        vPC[0] = getOpcode(op_get_by_id_getter_chain);
1403dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        vPC[7] = offset;
1404dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
1405dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PropertySlot::Custom:
1406dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        vPC[0] = getOpcode(op_get_by_id_custom_chain);
1407dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        vPC[7] = slot.customGetter();
1408dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
1409dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    default:
1410dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        vPC[0] = getOpcode(op_get_by_id_chain);
1411dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        vPC[7] = offset;
1412dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
1413dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
1414635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    vPC[4] = structure;
1415cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    vPC[5] = structure->prototypeChain(callFrame);
14168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    vPC[6] = count;
1417635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    codeBlock->refStructures(vPC);
14188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
14198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1420635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectNEVER_INLINE void Interpreter::uncacheGetByID(CodeBlock* codeBlock, Instruction* vPC)
14218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1422635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    codeBlock->derefStructures(vPC);
14238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    vPC[0] = getOpcode(op_get_by_id);
14248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    vPC[4] = 0;
14258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
14268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1427e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif // ENABLE(INTERPRETER)
14285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1429e14391e94c850b8bd03680c23b38978db68687a8John ReckJSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFile, CallFrame* callFrame)
14308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
14318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // One-time initialization of our address tables. We have to put this code
14328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // here because our labels are only in scope inside this function.
1433d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (UNLIKELY(flag == InitializeAndReturn)) {
1434e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        #if ENABLE(COMPUTED_GOTO_INTERPRETER)
1435d0825bca7fe65beaee391d30da42e937db621564Steve Block            #define LIST_OPCODE_LABEL(id, length) &&id,
1436d0825bca7fe65beaee391d30da42e937db621564Steve Block                static Opcode labels[] = { FOR_EACH_OPCODE_ID(LIST_OPCODE_LABEL) };
1437e14391e94c850b8bd03680c23b38978db68687a8John Reck                for (size_t i = 0; i < WTF_ARRAY_LENGTH(labels); ++i)
1438d0825bca7fe65beaee391d30da42e937db621564Steve Block                    m_opcodeTable[i] = labels[i];
1439d0825bca7fe65beaee391d30da42e937db621564Steve Block            #undef LIST_OPCODE_LABEL
1440e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        #endif // ENABLE(COMPUTED_GOTO_INTERPRETER)
14415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return JSValue();
14428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1443e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1444635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(JIT)
1445e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
14460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Mixing Interpreter + JIT is not supported.
1447e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (callFrame->globalData().canUseJIT())
1448e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
1449e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        ASSERT_NOT_REACHED();
14508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1451e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1452e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if !ENABLE(INTERPRETER)
14535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    UNUSED_PARAM(registerFile);
14545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    UNUSED_PARAM(callFrame);
14555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return JSValue();
14565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#else
14578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSGlobalData* globalData = &callFrame->globalData();
14595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue exceptionValue;
1460635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    HandlerInfo* handler = 0;
14618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1462e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    CodeBlock* codeBlock = callFrame->codeBlock();
1463e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    Instruction* vPC = codeBlock->instructions().begin();
14648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Profiler** enabledProfilerReference = Profiler::enabledProfilerReference();
14658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    unsigned tickCount = globalData->timeoutChecker.ticksUntilNextCheck();
1466e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    JSValue functionReturnValue;
14678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1468635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#define CHECK_FOR_EXCEPTION() \
14698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    do { \
14702bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (UNLIKELY(globalData->exception != JSValue())) { \
14712bde8e466a4451c7319e3a072d118917957d6554Steve Block            exceptionValue = globalData->exception; \
14728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            goto vm_throw; \
14738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } \
14748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } while (0)
14758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(OPCODE_STATS)
14778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    OpcodeStats::resetLastInstruction();
14788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
14798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define CHECK_FOR_TIMEOUT() \
14818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!--tickCount) { \
1482dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (globalData->terminator.shouldTerminate() || globalData->timeoutChecker.didTimeOut(callFrame)) { \
1483635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            exceptionValue = jsNull(); \
14848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            goto vm_throw; \
1485635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        } \
14868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        tickCount = globalData->timeoutChecker.ticksUntilNextCheck(); \
14878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
14888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(OPCODE_SAMPLING)
14908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    #define SAMPLE(codeBlock, vPC) m_sampler->sample(codeBlock, vPC)
14918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
14928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    #define SAMPLE(codeBlock, vPC)
14938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
14948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1495e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(COMPUTED_GOTO_INTERPRETER)
1496e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    #define NEXT_INSTRUCTION() SAMPLE(codeBlock, vPC); goto *vPC->u.opcode
14978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(OPCODE_STATS)
1498635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    #define DEFINE_OPCODE(opcode) opcode: OpcodeStats::recordInstruction(opcode);
14998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
1500635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    #define DEFINE_OPCODE(opcode) opcode:
15018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1502635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    NEXT_INSTRUCTION();
15038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
1504e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    #define NEXT_INSTRUCTION() SAMPLE(codeBlock, vPC); goto interpreterLoopStart
15058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(OPCODE_STATS)
1506635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    #define DEFINE_OPCODE(opcode) case opcode: OpcodeStats::recordInstruction(opcode);
15078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
1508635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    #define DEFINE_OPCODE(opcode) case opcode:
15098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
15108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (1) { // iterator loop begins
15118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    interpreterLoopStart:;
15128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (vPC->u.opcode)
15138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
15148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1515635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_new_object) {
15168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* new_object dst(r)
15178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Constructs a new empty Object instance using the original
15198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           constructor, and puts the result in register dst.
15208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1521cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
15224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = JSValue(constructEmptyObject(callFrame));
15238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1524cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_new_object);
1525635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
15268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1527635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_new_array) {
15288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* new_array dst(r) firstArg(r) argCount(n)
15298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Constructs a new Array instance using the original
15318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           constructor, and puts the result in register dst.
15328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           The array will contain argCount elements with values
15338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           taken from registers starting at register firstArg.
15348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1535cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1536cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int firstArg = vPC[2].u.operand;
1537cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int argCount = vPC[3].u.operand;
15388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ArgList args(callFrame->registers() + firstArg, argCount);
15394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = JSValue(constructArray(callFrame, args));
15408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1541cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_new_array);
1542635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
15438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
15446c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    DEFINE_OPCODE(op_new_regexp) {
15456c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        /* new_regexp dst(r) regExp(re)
15466c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
15476c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen           Constructs a new RegExp instance using the original
15486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen           constructor from regexp regExp, and puts the result in
15496c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen           register dst.
15506c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        */
15516c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        int dst = vPC[1].u.operand;
15522bde8e466a4451c7319e3a072d118917957d6554Steve Block        RegExp* regExp = codeBlock->regexp(vPC[2].u.operand);
15532bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!regExp->isValid()) {
15542bde8e466a4451c7319e3a072d118917957d6554Steve Block            exceptionValue = createSyntaxError(callFrame, "Invalid flags supplied to RegExp constructor.");
15552bde8e466a4451c7319e3a072d118917957d6554Steve Block            goto vm_throw;
15562bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
15572bde8e466a4451c7319e3a072d118917957d6554Steve Block        callFrame->uncheckedR(dst) = JSValue(new (globalData) RegExpObject(callFrame->lexicalGlobalObject(), callFrame->scopeChain()->globalObject->regExpStructure(), regExp));
15586c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
15596c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        vPC += OPCODE_LENGTH(op_new_regexp);
15606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        NEXT_INSTRUCTION();
15616c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
1562635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_mov) {
15638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* mov dst(r) src(r)
15648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Copies register src to register dst.
15668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1567cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1568cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
1569a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
15704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = callFrame->r(src);
15718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1572cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_mov);
1573635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
15748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1575635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_eq) {
15768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* eq dst(r) src1(r) src2(r)
15778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Checks whether register src1 and register src2 are equal,
15798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           as with the ECMAScript '==' operator, and puts the result
15808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           as a boolean in register dst.
15818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1582cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1583cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
1584cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
15850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (src1.isInt32() && src2.isInt32())
15864576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsBoolean(src1.asInt32() == src2.asInt32());
15878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
15885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSValue result = jsBoolean(JSValue::equalSlowCase(callFrame, src1, src2));
1589635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
15904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
15918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
15928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1593cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_eq);
1594635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
15958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1596635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_eq_null) {
15978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* eq_null dst(r) src(r)
15988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Checks whether register src is null, as with the ECMAScript '!='
16008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           operator, and puts the result as a boolean in register dst.
16018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1602cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1603cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src = callFrame->r(vPC[2].u.operand).jsValue();
16048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1605635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (src.isUndefinedOrNull()) {
16064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsBoolean(true);
1607cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            vPC += OPCODE_LENGTH(op_eq_null);
1608635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
16098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
16108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(src.isCell() && src.asCell()->structure()->typeInfo().masqueradesAsUndefined());
1612cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_eq_null);
1613635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
16148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1615635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_neq) {
16168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* neq dst(r) src1(r) src2(r)
16178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Checks whether register src1 and register src2 are not
16198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           equal, as with the ECMAScript '!=' operator, and puts the
16208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           result as a boolean in register dst.
16218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1622cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1623cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
1624cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
16250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (src1.isInt32() && src2.isInt32())
16264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsBoolean(src1.asInt32() != src2.asInt32());
16278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
16285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSValue result = jsBoolean(!JSValue::equalSlowCase(callFrame, src1, src2));
1629635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
16304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
16318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
16328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1633cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_neq);
1634635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
16358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1636635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_neq_null) {
16378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* neq_null dst(r) src(r)
16388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Checks whether register src is not null, as with the ECMAScript '!='
16408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           operator, and puts the result as a boolean in register dst.
16418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1642cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1643cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src = callFrame->r(vPC[2].u.operand).jsValue();
16448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1645635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (src.isUndefinedOrNull()) {
16464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsBoolean(false);
1647cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            vPC += OPCODE_LENGTH(op_neq_null);
1648635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
16498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
16508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(!src.isCell() || !src.asCell()->structure()->typeInfo().masqueradesAsUndefined());
1652cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_neq_null);
1653635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
16548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1655635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_stricteq) {
16568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* stricteq dst(r) src1(r) src2(r)
16578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Checks whether register src1 and register src2 are strictly
16598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           equal, as with the ECMAScript '===' operator, and puts the
16608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           result as a boolean in register dst.
16618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1662cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1663cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
1664cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
1665e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        bool result = JSValue::strictEqual(callFrame, src1, src2);
1666e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        CHECK_FOR_EXCEPTION();
16674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(result);
16688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1669cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_stricteq);
1670635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
16718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1672635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_nstricteq) {
16738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* nstricteq dst(r) src1(r) src2(r)
16748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Checks whether register src1 and register src2 are not
16768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           strictly equal, as with the ECMAScript '!==' operator, and
16778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           puts the result as a boolean in register dst.
16788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1679cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1680cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
1681cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
1682e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        bool result = !JSValue::strictEqual(callFrame, src1, src2);
1683e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        CHECK_FOR_EXCEPTION();
16844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(result);
16858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1686cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_nstricteq);
1687635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
16888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1689635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_less) {
16908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* less dst(r) src1(r) src2(r)
16918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Checks whether register src1 is less than register src2, as
16938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           with the ECMAScript '<' operator, and puts the result as
16948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           a boolean in register dst.
16958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1696cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1697cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
1698cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
16995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue result = jsBoolean(jsLess(callFrame, src1, src2));
1700635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
17014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = result;
17028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1703cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_less);
1704635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
17058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1706635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_lesseq) {
17078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* lesseq dst(r) src1(r) src2(r)
17088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Checks whether register src1 is less than or equal to
17108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           register src2, as with the ECMAScript '<=' operator, and
17118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           puts the result as a boolean in register dst.
17128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1713cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1714cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
1715cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
17165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue result = jsBoolean(jsLessEq(callFrame, src1, src2));
1717635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
17184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = result;
17198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1720cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_lesseq);
1721635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
17228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1723635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_pre_inc) {
17248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* pre_inc srcDst(r)
17258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Converts register srcDst to number, adds one, and puts the result
17278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           back in register srcDst.
17288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1729cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int srcDst = vPC[1].u.operand;
17300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue v = callFrame->r(srcDst).jsValue();
17310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (v.isInt32() && v.asInt32() < INT_MAX)
17324576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(srcDst) = jsNumber(v.asInt32() + 1);
17338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
1734e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber(v.toNumber(callFrame) + 1);
1735635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
17364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(srcDst) = result;
17378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
17388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1739cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_pre_inc);
1740635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
17418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1742635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_pre_dec) {
17438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* pre_dec srcDst(r)
17448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Converts register srcDst to number, subtracts one, and puts the result
17468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           back in register srcDst.
17478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1748cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int srcDst = vPC[1].u.operand;
17490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue v = callFrame->r(srcDst).jsValue();
17500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (v.isInt32() && v.asInt32() > INT_MIN)
17514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(srcDst) = jsNumber(v.asInt32() - 1);
17528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
1753e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber(v.toNumber(callFrame) - 1);
1754635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
17554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(srcDst) = result;
17568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
17578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1758cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_pre_dec);
1759635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
17608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1761635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_post_inc) {
17628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* post_inc dst(r) srcDst(r)
17638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Converts register srcDst to number. The number itself is
17658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           written to register dst, and the number plus one is written
17668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           back to register srcDst.
17678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1768cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1769cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int srcDst = vPC[2].u.operand;
17700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue v = callFrame->r(srcDst).jsValue();
17710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (v.isInt32() && v.asInt32() < INT_MAX) {
17724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(srcDst) = jsNumber(v.asInt32() + 1);
17734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = v;
17748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
17750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            JSValue number = callFrame->r(srcDst).jsValue().toJSNumber(callFrame);
1776635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
17774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(srcDst) = jsNumber(number.uncheckedGetNumber() + 1);
17784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = number;
17798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
17808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1781cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_post_inc);
1782635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
17838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1784635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_post_dec) {
17858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* post_dec dst(r) srcDst(r)
17868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Converts register srcDst to number. The number itself is
17888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           written to register dst, and the number minus one is written
17898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           back to register srcDst.
17908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1791cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1792cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int srcDst = vPC[2].u.operand;
17930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue v = callFrame->r(srcDst).jsValue();
17940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (v.isInt32() && v.asInt32() > INT_MIN) {
17954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(srcDst) = jsNumber(v.asInt32() - 1);
17964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = v;
17978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
17980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            JSValue number = callFrame->r(srcDst).jsValue().toJSNumber(callFrame);
1799635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
18004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(srcDst) = jsNumber(number.uncheckedGetNumber() - 1);
18014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = number;
18028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
18038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1804cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_post_dec);
1805635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
18068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1807635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_to_jsnumber) {
18088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* to_jsnumber dst(r) src(r)
18098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Converts register src to number, and puts the result
18118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst.
18128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1813cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1814cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
18158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue srcVal = callFrame->r(src).jsValue();
18178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1818635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (LIKELY(srcVal.isNumber()))
18194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = callFrame->r(src);
18208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
18215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSValue result = srcVal.toJSNumber(callFrame);
1822635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
18234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
18248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
18258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1826cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_to_jsnumber);
1827635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
18288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1829635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_negate) {
18308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* negate dst(r) src(r)
18318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Converts register src to number, negates it, and puts the
18338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           result in register dst.
18348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1835cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1836cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src = callFrame->r(vPC[2].u.operand).jsValue();
1837dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (src.isInt32() && (src.asInt32() & 0x7fffffff)) // non-zero and no overflow
18384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(-src.asInt32());
18398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
1840e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber(-src.toNumber(callFrame));
1841635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
18424576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
18438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
18448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1845cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_negate);
1846635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
18478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1848635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_add) {
18498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* add dst(r) src1(r) src2(r)
18508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Adds register src1 and register src2, and puts the result
18528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst. (JS add may be string concatenation or
18538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           numeric add, depending on the types of the operands.)
18548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1855cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1856cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
1857cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
1858643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (src1.isInt32() && src2.isInt32() && !(src1.asInt32() | (src2.asInt32() & 0xc0000000))) // no overflow
18594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(src1.asInt32() + src2.asInt32());
18608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
18615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSValue result = jsAdd(callFrame, src1, src2);
1862635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
18634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
18648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1865cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_add);
1866635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
18678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1868635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_mul) {
18698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* mul dst(r) src1(r) src2(r)
18708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Multiplies register src1 and register src2 (converted to
18728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           numbers), and puts the product in register dst.
18738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1874cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1875cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
1876cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
18770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (src1.isInt32() && src2.isInt32() && !(src1.asInt32() | src2.asInt32() >> 15)) // no overflow
18784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                callFrame->uncheckedR(dst) = jsNumber(src1.asInt32() * src2.asInt32());
18798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
1880e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber(src1.toNumber(callFrame) * src2.toNumber(callFrame));
1881635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
18824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
18838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
18848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1885cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_mul);
1886635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
18878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1888635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_div) {
18898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* div dst(r) dividend(r) divisor(r)
18908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Divides register dividend (converted to number) by the
18928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           register divisor (converted to number), and puts the
18938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           quotient in register dst.
18948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1895cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1896cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue dividend = callFrame->r(vPC[2].u.operand).jsValue();
1897cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue divisor = callFrame->r(vPC[3].u.operand).jsValue();
18980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1899e14391e94c850b8bd03680c23b38978db68687a8John Reck        JSValue result = jsNumber(dividend.toNumber(callFrame) / divisor.toNumber(callFrame));
19000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        CHECK_FOR_EXCEPTION();
19014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = result;
19020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1903cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_div);
1904635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
19058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1906635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_mod) {
19078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* mod dst(r) dividend(r) divisor(r)
19088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Divides register dividend (converted to number) by
19108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           register divisor (converted to number), and puts the
19118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           remainder in register dst.
19128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1913cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1914cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue dividend = callFrame->r(vPC[2].u.operand).jsValue();
1915cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue divisor = callFrame->r(vPC[3].u.operand).jsValue();
19168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (dividend.isInt32() && divisor.isInt32() && divisor.asInt32() != 0) {
1918e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber(dividend.asInt32() % divisor.asInt32());
1919635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            ASSERT(result);
19204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
1921cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            vPC += OPCODE_LENGTH(op_mod);
1922635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
19238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
19248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Conversion to double must happen outside the call to fmod since the
19260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // order of argument evaluation is not guaranteed.
19270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        double d1 = dividend.toNumber(callFrame);
19280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        double d2 = divisor.toNumber(callFrame);
1929e14391e94c850b8bd03680c23b38978db68687a8John Reck        JSValue result = jsNumber(fmod(d1, d2));
1930635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
19314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = result;
1932cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_mod);
1933635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
19348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1935635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_sub) {
19368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* sub dst(r) src1(r) src2(r)
19378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Subtracts register src2 (converted to number) from register
19398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           src1 (converted to number), and puts the difference in
19408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           register dst.
19418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1942cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1943cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
1944cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
1945643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (src1.isInt32() && src2.isInt32() && !(src1.asInt32() | (src2.asInt32() & 0xc0000000))) // no overflow
19464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(src1.asInt32() - src2.asInt32());
19478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
1948e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber(src1.toNumber(callFrame) - src2.toNumber(callFrame));
1949635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
19504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
19518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1952cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_sub);
1953635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
19548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1955635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_lshift) {
19568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* lshift dst(r) val(r) shift(r)
19578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Performs left shift of register val (converted to int32) by
19598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           register shift (converted to uint32), and puts the result
19608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst.
19618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1962cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1963cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue val = callFrame->r(vPC[2].u.operand).jsValue();
1964cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue shift = callFrame->r(vPC[3].u.operand).jsValue();
19650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
19660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (val.isInt32() && shift.isInt32())
19674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(val.asInt32() << (shift.asInt32() & 0x1f));
19688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
1969e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber((val.toInt32(callFrame)) << (shift.toUInt32(callFrame) & 0x1f));
1970635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
19714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
19728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
19738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1974cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_lshift);
1975635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
19768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1977635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_rshift) {
19788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* rshift dst(r) val(r) shift(r)
19798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Performs arithmetic right shift of register val (converted
19818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           to int32) by register shift (converted to
19828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           uint32), and puts the result in register dst.
19838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1984cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1985cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue val = callFrame->r(vPC[2].u.operand).jsValue();
1986cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue shift = callFrame->r(vPC[3].u.operand).jsValue();
19870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
19880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (val.isInt32() && shift.isInt32())
19894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(val.asInt32() >> (shift.asInt32() & 0x1f));
19908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
1991e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber((val.toInt32(callFrame)) >> (shift.toUInt32(callFrame) & 0x1f));
1992635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
19934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
19948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
19958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1996cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_rshift);
1997635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
19988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1999635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_urshift) {
20008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* rshift dst(r) val(r) shift(r)
20018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Performs logical right shift of register val (converted
20038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           to uint32) by register shift (converted to
20048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           uint32), and puts the result in register dst.
20058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2006cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2007cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue val = callFrame->r(vPC[2].u.operand).jsValue();
2008cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue shift = callFrame->r(vPC[3].u.operand).jsValue();
20090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (val.isUInt32() && shift.isInt32())
20104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(val.asInt32() >> (shift.asInt32() & 0x1f));
20118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
2012e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber((val.toUInt32(callFrame)) >> (shift.toUInt32(callFrame) & 0x1f));
2013635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
20144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
20158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
20168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2017cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_urshift);
2018635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
20198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2020635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_bitand) {
20218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* bitand dst(r) src1(r) src2(r)
20228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Computes bitwise AND of register src1 (converted to int32)
20248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           and register src2 (converted to int32), and puts the result
20258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst.
20268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2027cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2028cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
2029cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
20300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (src1.isInt32() && src2.isInt32())
20314576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(src1.asInt32() & src2.asInt32());
20328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
2033e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber(src1.toInt32(callFrame) & src2.toInt32(callFrame));
2034635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
20354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
20368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
20378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2038cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_bitand);
2039635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
20408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2041635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_bitxor) {
20428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* bitxor dst(r) src1(r) src2(r)
20438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Computes bitwise XOR of register src1 (converted to int32)
20458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           and register src2 (converted to int32), and puts the result
20468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst.
20478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2048cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2049cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
2050cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
20510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (src1.isInt32() && src2.isInt32())
20524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(src1.asInt32() ^ src2.asInt32());
20538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
2054e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber(src1.toInt32(callFrame) ^ src2.toInt32(callFrame));
2055635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
20564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
20578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
20588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2059cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_bitxor);
2060635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
20618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2062635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_bitor) {
20638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* bitor dst(r) src1(r) src2(r)
20648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Computes bitwise OR of register src1 (converted to int32)
20668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           and register src2 (converted to int32), and puts the
20678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           result in register dst.
20688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2069cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2070cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
2071cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
20720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (src1.isInt32() && src2.isInt32())
20734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(src1.asInt32() | src2.asInt32());
20748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
2075e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber(src1.toInt32(callFrame) | src2.toInt32(callFrame));
2076635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
20774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
20788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
20798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2080cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_bitor);
2081635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
20828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2083635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_bitnot) {
20848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* bitnot dst(r) src(r)
20858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Computes bitwise NOT of register src1 (converted to int32),
20878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           and puts the result in register dst.
20888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2089cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2090cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src = callFrame->r(vPC[2].u.operand).jsValue();
20910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (src.isInt32())
20924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(~src.asInt32());
20938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
2094e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber(~src.toInt32(callFrame));
2095635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
20964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
20978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2098cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_bitnot);
2099635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
21008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_not) {
21028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* not dst(r) src(r)
21038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Computes logical NOT of register src (converted to
21058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           boolean), and puts the result in register dst.
21068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2107cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2108cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
21090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue result = jsBoolean(!callFrame->r(src).jsValue().toBoolean(callFrame));
2110635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
21114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = result;
21128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2113cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_not);
2114635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
21158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
21166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    DEFINE_OPCODE(op_check_has_instance) {
21176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        /* check_has_instance constructor(r)
21186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
21196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner           Check 'constructor' is an object with the internal property
21206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner           [HasInstance] (i.e. is a function ... *shakes head sadly at
21216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner           JSC API*). Raises an exception if register constructor is not
21226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner           an valid parameter for instanceof.
21236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        */
21246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        int base = vPC[1].u.operand;
21256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        JSValue baseVal = callFrame->r(base).jsValue();
21266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
21276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (isInvalidParamForInstanceOf(callFrame, baseVal, exceptionValue))
21286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            goto vm_throw;
21296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
21306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        vPC += OPCODE_LENGTH(op_check_has_instance);
21316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        NEXT_INSTRUCTION();
21326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
2133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_instanceof) {
21348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* instanceof dst(r) value(r) constructor(r) constructorProto(r)
21358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Tests whether register value is an instance of register
21378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           constructor, and puts the boolean result in register
21388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           dst. Register constructorProto must contain the "prototype"
21398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           property (not the actual prototype) of the object in
21408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           register constructor. This lookup is separated so that
21418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           polymorphic inline caching can apply.
21428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Raises an exception if register constructor is not an
21448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           object.
21458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
21468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int dst = vPC[1].u.operand;
21478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int value = vPC[2].u.operand;
21488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[3].u.operand;
21498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int baseProto = vPC[4].u.operand;
21508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseVal = callFrame->r(base).jsValue();
21528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21536b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        ASSERT(!isInvalidParamForInstanceOf(callFrame, baseVal, exceptionValue));
21548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        bool result = asObject(baseVal)->hasInstance(callFrame, callFrame->r(value).jsValue(), callFrame->r(baseProto).jsValue());
21565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        CHECK_FOR_EXCEPTION();
21574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(result);
21588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2159cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_instanceof);
2160635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
21618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2162635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_typeof) {
21638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* typeof dst(r) src(r)
21648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Determines the type string for src according to ECMAScript
21668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           rules, and puts the result in register dst.
21678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2168cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2169cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
21704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = JSValue(jsTypeStringForValue(callFrame, callFrame->r(src).jsValue()));
21718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2172cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_typeof);
2173635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
21748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2175635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_is_undefined) {
21768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* is_undefined dst(r) src(r)
21778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Determines whether the type string for src according to
21798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the ECMAScript rules is "undefined", and puts the result
21808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst.
21818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2182cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2183cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
21840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue v = callFrame->r(src).jsValue();
21854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(v.isCell() ? v.asCell()->structure()->typeInfo().masqueradesAsUndefined() : v.isUndefined());
21868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2187cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_is_undefined);
2188635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
21898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2190635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_is_boolean) {
21918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* is_boolean dst(r) src(r)
21928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Determines whether the type string for src according to
21948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the ECMAScript rules is "boolean", and puts the result
21958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst.
21968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2197cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2198cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
21994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(callFrame->r(src).jsValue().isBoolean());
22008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2201cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_is_boolean);
2202635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
22038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2204635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_is_number) {
22058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* is_number dst(r) src(r)
22068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Determines whether the type string for src according to
22088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the ECMAScript rules is "number", and puts the result
22098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst.
22108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2211cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2212cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
22134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(callFrame->r(src).jsValue().isNumber());
22148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2215cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_is_number);
2216635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
22178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2218635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_is_string) {
22198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* is_string dst(r) src(r)
22208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Determines whether the type string for src according to
22228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the ECMAScript rules is "string", and puts the result
22238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst.
22248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2225cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2226cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
22274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(callFrame->r(src).jsValue().isString());
22288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2229cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_is_string);
2230635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
22318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2232635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_is_object) {
22338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* is_object dst(r) src(r)
22348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Determines whether the type string for src according to
22368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the ECMAScript rules is "object", and puts the result
22378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst.
22388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2239cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2240cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
22414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(jsIsObjectType(callFrame->r(src).jsValue()));
22428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2243cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_is_object);
2244635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
22458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2246635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_is_function) {
22478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* is_function dst(r) src(r)
22488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Determines whether the type string for src according to
22508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the ECMAScript rules is "function", and puts the result
22518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst.
22528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2253cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2254cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
22554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(jsIsFunctionType(callFrame->r(src).jsValue()));
22568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2257cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_is_function);
2258635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
22598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2260635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_in) {
22618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* in dst(r) property(r) base(r)
22628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Tests whether register base has a property named register
22648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           property, and puts the boolean result in register dst.
22658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Raises an exception if register constructor is not an
22678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           object.
22688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2269cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2270cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int property = vPC[2].u.operand;
2271cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int base = vPC[3].u.operand;
22728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseVal = callFrame->r(base).jsValue();
22746b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (isInvalidParamForIn(callFrame, baseVal, exceptionValue))
22758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            goto vm_throw;
22768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JSObject* baseObj = asObject(baseVal);
22788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue propName = callFrame->r(property).jsValue();
22808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        uint32_t i;
2282635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (propName.getUInt32(i))
22834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsBoolean(baseObj->hasProperty(callFrame, i));
22848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
2285635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            Identifier property(callFrame, propName.toString(callFrame));
2286635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
22874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsBoolean(baseObj->hasProperty(callFrame, property));
22888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
22898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2290cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_in);
2291635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
22928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2293635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_resolve) {
22948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* resolve dst(r) property(id)
22958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Looks up the property named by identifier property in the
22978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           scope chain, and writes the resulting value to register
22988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           dst. If the property is not found, raises an exception.
22998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
23008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (UNLIKELY(!resolve(callFrame, vPC, exceptionValue)))
23018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            goto vm_throw;
23028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2303cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_resolve);
2304635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
23058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2306635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_resolve_skip) {
23078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* resolve_skip dst(r) property(id) skip(n)
23088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         Looks up the property named by identifier property in the
23108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         scope chain skipping the top 'skip' levels, and writes the resulting
23118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         value to register dst. If the property is not found, raises an exception.
23128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
23138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (UNLIKELY(!resolveSkip(callFrame, vPC, exceptionValue)))
23148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            goto vm_throw;
23158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2316cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_resolve_skip);
23178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2318635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
23198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2320635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_resolve_global) {
2321635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        /* resolve_skip dst(r) globalObject(c) property(id) structure(sID) offset(n)
23228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Performs a dynamic property lookup for the given property, on the provided
2324635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           global object.  If structure matches the Structure of the global then perform
23258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           a fast lookup using the case offset, otherwise fall back to a full resolve and
2326635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           cache the new structure and offset
23278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
23288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (UNLIKELY(!resolveGlobal(callFrame, vPC, exceptionValue)))
23298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            goto vm_throw;
23308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2331cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_resolve_global);
23328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2333635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
23348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
23356c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    DEFINE_OPCODE(op_resolve_global_dynamic) {
23366c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        /* resolve_skip dst(r) globalObject(c) property(id) structure(sID) offset(n), depth(n)
23376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
23386c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen         Performs a dynamic property lookup for the given property, on the provided
23396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen         global object.  If structure matches the Structure of the global then perform
23406c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen         a fast lookup using the case offset, otherwise fall back to a full resolve and
23416c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen         cache the new structure and offset.
23426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
23436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen         This walks through n levels of the scope chain to verify that none of those levels
23446c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen         in the scope chain include dynamically added properties.
23456c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen         */
23466c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        if (UNLIKELY(!resolveGlobalDynamic(callFrame, vPC, exceptionValue)))
23476c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            goto vm_throw;
23486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
23496c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        vPC += OPCODE_LENGTH(op_resolve_global_dynamic);
23506c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
23516c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        NEXT_INSTRUCTION();
23526c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
2353635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_global_var) {
23548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* get_global_var dst(r) globalObject(c) index(n)
23558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Gets the global var at global slot index and places it in register dst.
23578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
2358cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2359dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        JSGlobalObject* scope = codeBlock->globalObject();
23608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(scope->isGlobalObject());
2361dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        int index = vPC[2].u.operand;
23628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
236381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        callFrame->uncheckedR(dst) = scope->registerAt(index).get();
2364cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_get_global_var);
2365635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
23668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2367635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_put_global_var) {
23688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* put_global_var globalObject(c) index(n) value(r)
23698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Puts value into global slot index.
23718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
2372dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        JSGlobalObject* scope = codeBlock->globalObject();
23738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(scope->isGlobalObject());
2374dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        int index = vPC[1].u.operand;
2375dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        int value = vPC[2].u.operand;
23768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
237781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        scope->registerAt(index).set(*globalData, scope, callFrame->r(value).jsValue());
2378cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_put_global_var);
2379635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
23806c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
2381635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_scoped_var) {
23828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* get_scoped_var dst(r) index(n) skip(n)
23838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         Loads the contents of the index-th local from the scope skip nodes from
2385e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block         the top of the scope chain, and places it in register dst.
23868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
2387cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2388cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int index = vPC[2].u.operand;
2389e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int skip = vPC[3].u.operand;
23908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ScopeChainNode* scopeChain = callFrame->scopeChain();
23928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ScopeChainIterator iter = scopeChain->begin();
23938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ScopeChainIterator end = scopeChain->end();
23948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(iter != end);
2395a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT(codeBlock == callFrame->codeBlock());
2396a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        bool checkTopLevel = codeBlock->codeType() == FunctionCode && codeBlock->needsFullScopeChain();
2397a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT(skip || !checkTopLevel);
2398a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (checkTopLevel && skip--) {
2399a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (callFrame->r(codeBlock->activationRegister()).jsValue())
2400a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                ++iter;
2401a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
24028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        while (skip--) {
24038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ++iter;
24048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT(iter != end);
24058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
24068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT((*iter)->isVariableObject());
24072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        JSVariableObject* scope = static_cast<JSVariableObject*>(iter->get());
240881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        callFrame->uncheckedR(dst) = scope->registerAt(index).get();
2409a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT(callFrame->r(dst).jsValue());
2410cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_get_scoped_var);
2411635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
24128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2413635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_put_scoped_var) {
24148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* put_scoped_var index(n) skip(n) value(r)
24158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
2417cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int index = vPC[1].u.operand;
2418e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int skip = vPC[2].u.operand;
2419cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int value = vPC[3].u.operand;
24208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ScopeChainNode* scopeChain = callFrame->scopeChain();
24228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ScopeChainIterator iter = scopeChain->begin();
24238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ScopeChainIterator end = scopeChain->end();
2424a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT(codeBlock == callFrame->codeBlock());
24258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(iter != end);
2426a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        bool checkTopLevel = codeBlock->codeType() == FunctionCode && codeBlock->needsFullScopeChain();
2427a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT(skip || !checkTopLevel);
2428a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (checkTopLevel && skip--) {
2429a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (callFrame->r(codeBlock->activationRegister()).jsValue())
2430a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                ++iter;
2431a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
24328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        while (skip--) {
24338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ++iter;
24348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT(iter != end);
24358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
24368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT((*iter)->isVariableObject());
24382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        JSVariableObject* scope = static_cast<JSVariableObject*>(iter->get());
2439a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT(callFrame->r(value).jsValue());
244081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        scope->registerAt(index).set(*globalData, scope, callFrame->r(value).jsValue());
2441cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_put_scoped_var);
2442635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
24438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2444635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_resolve_base) {
244581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        /* resolve_base dst(r) property(id) isStrict(bool)
24468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Searches the scope chain for an object containing
24488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           identifier property, and if one is found, writes it to
244981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch           register dst. If none is found and isStrict is false, the
245081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch           outermost scope (which will be the global object) is
245181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch           stored in register dst.
24528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
24538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        resolveBase(callFrame, vPC);
245481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        CHECK_FOR_EXCEPTION();
24558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2456cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_resolve_base);
2457635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
24588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2459a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    DEFINE_OPCODE(op_ensure_property_exists) {
2460a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        /* ensure_property_exists base(r) property(id)
2461a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
2462a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch           Throws an exception if property does not exist on base
2463a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch         */
2464a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        int base = vPC[1].u.operand;
2465a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        int property = vPC[2].u.operand;
2466a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        Identifier& ident = codeBlock->identifier(property);
2467a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
2468a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        JSValue baseVal = callFrame->r(base).jsValue();
2469a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        JSObject* baseObject = asObject(baseVal);
2470a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        PropertySlot slot(baseVal);
2471a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!baseObject->getPropertySlot(callFrame, ident, slot)) {
2472a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            exceptionValue = createErrorForInvalidGlobalAssignment(callFrame, ident.ustring());
2473a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            goto vm_throw;
2474a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
247581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
247681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        vPC += OPCODE_LENGTH(op_ensure_property_exists);
2477a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        NEXT_INSTRUCTION();
2478a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
2479635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_resolve_with_base) {
24808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* resolve_with_base baseDst(r) propDst(r) property(id)
24818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Searches the scope chain for an object containing
24838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           identifier property, and if one is found, writes it to
24848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           register srcDst, and the retrieved property value to register
24858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           propDst. If the property is not found, raises an exception.
24868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           This is more efficient than doing resolve_base followed by
24888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           resolve, or resolve_base followed by get_by_id, as it
24898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           avoids duplicate hash lookups.
24908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
24918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (UNLIKELY(!resolveBaseAndProperty(callFrame, vPC, exceptionValue)))
24928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            goto vm_throw;
24938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2494cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_resolve_with_base);
2495635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
24968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2497635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_by_id) {
2498635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        /* get_by_id dst(r) base(r) property(id) structure(sID) nop(n) nop(n) nop(n)
24998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
25008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Generic property access: Gets the property named by identifier
25018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           property from the value base, and puts the result in register dst.
25028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
25038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int dst = vPC[1].u.operand;
25048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[2].u.operand;
25058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int property = vPC[3].u.operand;
25068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2507635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Identifier& ident = codeBlock->identifier(property);
25080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
25098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PropertySlot slot(baseValue);
25105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue result = baseValue.get(callFrame, ident, slot);
2511635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
25128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
25138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        tryCacheGetByID(callFrame, codeBlock, vPC, baseValue, ident, slot);
25148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
25154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = result;
2516cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_get_by_id);
2517635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
25188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2519635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_by_id_self) {
2520635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        /* op_get_by_id_self dst(r) base(r) property(id) structure(sID) offset(n) nop(n) nop(n)
25218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
25228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Cached property access: Attempts to get a cached property from the
25238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           value base. If the cache misses, op_get_by_id_self reverts to
25248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           op_get_by_id.
25258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
25268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[2].u.operand;
25270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
25288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2529635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (LIKELY(baseValue.isCell())) {
2530e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSCell* baseCell = baseValue.asCell();
2531635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            Structure* structure = vPC[4].u.structure;
25328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2533635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (LIKELY(baseCell->structure() == structure)) {
25348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ASSERT(baseCell->isObject());
25358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                JSObject* baseObject = asObject(baseCell);
25368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                int dst = vPC[1].u.operand;
25378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                int offset = vPC[5].u.operand;
25388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2539e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                ASSERT(baseObject->get(callFrame, codeBlock->identifier(vPC[3].u.operand)) == baseObject->getDirectOffset(offset));
25404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                callFrame->uncheckedR(dst) = JSValue(baseObject->getDirectOffset(offset));
25418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2542cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                vPC += OPCODE_LENGTH(op_get_by_id_self);
2543635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                NEXT_INSTRUCTION();
25448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
25458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
25468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2547e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncacheGetByID(codeBlock, vPC);
2548635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
25498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2550635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_by_id_proto) {
2551635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        /* op_get_by_id_proto dst(r) base(r) property(id) structure(sID) prototypeStructure(sID) offset(n) nop(n)
25528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
25538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Cached property access: Attempts to get a cached property from the
25548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           value base's prototype. If the cache misses, op_get_by_id_proto
25558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           reverts to op_get_by_id.
25568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
25578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[2].u.operand;
25580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
25598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2560635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (LIKELY(baseValue.isCell())) {
2561e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSCell* baseCell = baseValue.asCell();
2562635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            Structure* structure = vPC[4].u.structure;
25638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2564635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (LIKELY(baseCell->structure() == structure)) {
2565635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                ASSERT(structure->prototypeForLookup(callFrame).isObject());
2566635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                JSObject* protoObject = asObject(structure->prototypeForLookup(callFrame));
2567635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                Structure* prototypeStructure = vPC[5].u.structure;
25688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2569635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (LIKELY(protoObject->structure() == prototypeStructure)) {
25708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    int dst = vPC[1].u.operand;
25718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    int offset = vPC[6].u.operand;
25728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2573e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                    ASSERT(protoObject->get(callFrame, codeBlock->identifier(vPC[3].u.operand)) == protoObject->getDirectOffset(offset));
2574e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                    ASSERT(baseValue.get(callFrame, codeBlock->identifier(vPC[3].u.operand)) == protoObject->getDirectOffset(offset));
25754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                    callFrame->uncheckedR(dst) = JSValue(protoObject->getDirectOffset(offset));
25768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2577cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                    vPC += OPCODE_LENGTH(op_get_by_id_proto);
2578635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    NEXT_INSTRUCTION();
25798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
25808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
25818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
25828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2583e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncacheGetByID(codeBlock, vPC);
2584635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
25858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2586bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2587692e5dbf12901edacf14812a6fae25462920af42Steve Block    goto *(&&skip_id_getter_proto);
2588692e5dbf12901edacf14812a6fae25462920af42Steve Block#endif
2589692e5dbf12901edacf14812a6fae25462920af42Steve Block    DEFINE_OPCODE(op_get_by_id_getter_proto) {
2590692e5dbf12901edacf14812a6fae25462920af42Steve Block        /* op_get_by_id_getter_proto dst(r) base(r) property(id) structure(sID) prototypeStructure(sID) offset(n) nop(n)
2591692e5dbf12901edacf14812a6fae25462920af42Steve Block
2592692e5dbf12901edacf14812a6fae25462920af42Steve Block         Cached property access: Attempts to get a cached getter property from the
2593692e5dbf12901edacf14812a6fae25462920af42Steve Block         value base's prototype. If the cache misses, op_get_by_id_getter_proto
2594692e5dbf12901edacf14812a6fae25462920af42Steve Block         reverts to op_get_by_id.
2595692e5dbf12901edacf14812a6fae25462920af42Steve Block         */
2596692e5dbf12901edacf14812a6fae25462920af42Steve Block        int base = vPC[2].u.operand;
2597692e5dbf12901edacf14812a6fae25462920af42Steve Block        JSValue baseValue = callFrame->r(base).jsValue();
2598692e5dbf12901edacf14812a6fae25462920af42Steve Block
2599692e5dbf12901edacf14812a6fae25462920af42Steve Block        if (LIKELY(baseValue.isCell())) {
2600e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSCell* baseCell = baseValue.asCell();
2601692e5dbf12901edacf14812a6fae25462920af42Steve Block            Structure* structure = vPC[4].u.structure;
2602692e5dbf12901edacf14812a6fae25462920af42Steve Block
2603692e5dbf12901edacf14812a6fae25462920af42Steve Block            if (LIKELY(baseCell->structure() == structure)) {
2604692e5dbf12901edacf14812a6fae25462920af42Steve Block                ASSERT(structure->prototypeForLookup(callFrame).isObject());
2605692e5dbf12901edacf14812a6fae25462920af42Steve Block                JSObject* protoObject = asObject(structure->prototypeForLookup(callFrame));
2606692e5dbf12901edacf14812a6fae25462920af42Steve Block                Structure* prototypeStructure = vPC[5].u.structure;
2607692e5dbf12901edacf14812a6fae25462920af42Steve Block
2608692e5dbf12901edacf14812a6fae25462920af42Steve Block                if (LIKELY(protoObject->structure() == prototypeStructure)) {
2609692e5dbf12901edacf14812a6fae25462920af42Steve Block                    int dst = vPC[1].u.operand;
2610692e5dbf12901edacf14812a6fae25462920af42Steve Block                    int offset = vPC[6].u.operand;
2611692e5dbf12901edacf14812a6fae25462920af42Steve Block                    if (GetterSetter* getterSetter = asGetterSetter(protoObject->getDirectOffset(offset).asCell())) {
2612692e5dbf12901edacf14812a6fae25462920af42Steve Block                        JSObject* getter = getterSetter->getter();
2613692e5dbf12901edacf14812a6fae25462920af42Steve Block                        CallData callData;
2614692e5dbf12901edacf14812a6fae25462920af42Steve Block                        CallType callType = getter->getCallData(callData);
2615692e5dbf12901edacf14812a6fae25462920af42Steve Block                        JSValue result = call(callFrame, getter, callType, callData, asObject(baseCell), ArgList());
2616692e5dbf12901edacf14812a6fae25462920af42Steve Block                        CHECK_FOR_EXCEPTION();
26174576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                        callFrame->uncheckedR(dst) = result;
2618692e5dbf12901edacf14812a6fae25462920af42Steve Block                    } else
26194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                        callFrame->uncheckedR(dst) = jsUndefined();
2620692e5dbf12901edacf14812a6fae25462920af42Steve Block                    vPC += OPCODE_LENGTH(op_get_by_id_getter_proto);
2621692e5dbf12901edacf14812a6fae25462920af42Steve Block                    NEXT_INSTRUCTION();
2622692e5dbf12901edacf14812a6fae25462920af42Steve Block                }
2623692e5dbf12901edacf14812a6fae25462920af42Steve Block            }
2624692e5dbf12901edacf14812a6fae25462920af42Steve Block        }
2625e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncacheGetByID(codeBlock, vPC);
2626692e5dbf12901edacf14812a6fae25462920af42Steve Block        NEXT_INSTRUCTION();
2627692e5dbf12901edacf14812a6fae25462920af42Steve Block    }
2628bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2629692e5dbf12901edacf14812a6fae25462920af42Steve Block    skip_id_getter_proto:
2630692e5dbf12901edacf14812a6fae25462920af42Steve Block#endif
2631bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2632dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    goto *(&&skip_id_custom_proto);
2633dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
2634dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DEFINE_OPCODE(op_get_by_id_custom_proto) {
2635dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        /* op_get_by_id_custom_proto dst(r) base(r) property(id) structure(sID) prototypeStructure(sID) offset(n) nop(n)
2636dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2637dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         Cached property access: Attempts to use a cached named property getter
2638dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         from the value base's prototype. If the cache misses, op_get_by_id_custom_proto
2639dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         reverts to op_get_by_id.
2640dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         */
2641dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        int base = vPC[2].u.operand;
2642dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        JSValue baseValue = callFrame->r(base).jsValue();
2643dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2644dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (LIKELY(baseValue.isCell())) {
2645e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSCell* baseCell = baseValue.asCell();
2646dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            Structure* structure = vPC[4].u.structure;
2647dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2648dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (LIKELY(baseCell->structure() == structure)) {
2649dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                ASSERT(structure->prototypeForLookup(callFrame).isObject());
2650dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                JSObject* protoObject = asObject(structure->prototypeForLookup(callFrame));
2651dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                Structure* prototypeStructure = vPC[5].u.structure;
2652dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2653dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (LIKELY(protoObject->structure() == prototypeStructure)) {
2654dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    int dst = vPC[1].u.operand;
2655dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    int property = vPC[3].u.operand;
2656e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                    Identifier& ident = codeBlock->identifier(property);
2657dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2658dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    PropertySlot::GetValueFunc getter = vPC[6].u.getterFunc;
2659dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    JSValue result = getter(callFrame, protoObject, ident);
2660dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    CHECK_FOR_EXCEPTION();
26614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                    callFrame->uncheckedR(dst) = result;
2662dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    vPC += OPCODE_LENGTH(op_get_by_id_custom_proto);
2663dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    NEXT_INSTRUCTION();
2664dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                }
2665dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            }
2666dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
2667e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncacheGetByID(codeBlock, vPC);
2668dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        NEXT_INSTRUCTION();
2669dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
2670bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2671dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    skip_id_custom_proto:
2672dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
2673635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_by_id_self_list) {
2674635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Polymorphic self access caching currently only supported when JITting.
2675635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        ASSERT_NOT_REACHED();
2676635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // This case of the switch must not be empty, else (op_get_by_id_self_list == op_get_by_id_chain)!
2677cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_get_by_id_self_list);
2678635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
2679635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
2680635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_by_id_proto_list) {
2681635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Polymorphic prototype access caching currently only supported when JITting.
2682635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        ASSERT_NOT_REACHED();
2683635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // This case of the switch must not be empty, else (op_get_by_id_proto_list == op_get_by_id_chain)!
2684cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_get_by_id_proto_list);
2685635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
2686635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
2687692e5dbf12901edacf14812a6fae25462920af42Steve Block    DEFINE_OPCODE(op_get_by_id_getter_self_list) {
2688692e5dbf12901edacf14812a6fae25462920af42Steve Block        // Polymorphic self access caching currently only supported when JITting.
2689692e5dbf12901edacf14812a6fae25462920af42Steve Block        ASSERT_NOT_REACHED();
2690692e5dbf12901edacf14812a6fae25462920af42Steve Block        // This case of the switch must not be empty, else (op_get_by_id_self_list == op_get_by_id_chain)!
2691692e5dbf12901edacf14812a6fae25462920af42Steve Block        vPC += OPCODE_LENGTH(op_get_by_id_self_list);
2692692e5dbf12901edacf14812a6fae25462920af42Steve Block        NEXT_INSTRUCTION();
2693692e5dbf12901edacf14812a6fae25462920af42Steve Block    }
2694692e5dbf12901edacf14812a6fae25462920af42Steve Block    DEFINE_OPCODE(op_get_by_id_getter_proto_list) {
2695692e5dbf12901edacf14812a6fae25462920af42Steve Block        // Polymorphic prototype access caching currently only supported when JITting.
2696692e5dbf12901edacf14812a6fae25462920af42Steve Block        ASSERT_NOT_REACHED();
2697692e5dbf12901edacf14812a6fae25462920af42Steve Block        // This case of the switch must not be empty, else (op_get_by_id_proto_list == op_get_by_id_chain)!
2698692e5dbf12901edacf14812a6fae25462920af42Steve Block        vPC += OPCODE_LENGTH(op_get_by_id_proto_list);
2699692e5dbf12901edacf14812a6fae25462920af42Steve Block        NEXT_INSTRUCTION();
2700692e5dbf12901edacf14812a6fae25462920af42Steve Block    }
2701dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DEFINE_OPCODE(op_get_by_id_custom_self_list) {
2702dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Polymorphic self access caching currently only supported when JITting.
2703dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ASSERT_NOT_REACHED();
2704dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // This case of the switch must not be empty, else (op_get_by_id_self_list == op_get_by_id_chain)!
2705dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        vPC += OPCODE_LENGTH(op_get_by_id_custom_self_list);
2706dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        NEXT_INSTRUCTION();
2707dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
2708dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DEFINE_OPCODE(op_get_by_id_custom_proto_list) {
2709dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Polymorphic prototype access caching currently only supported when JITting.
2710dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ASSERT_NOT_REACHED();
2711dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // This case of the switch must not be empty, else (op_get_by_id_proto_list == op_get_by_id_chain)!
2712dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        vPC += OPCODE_LENGTH(op_get_by_id_proto_list);
2713dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        NEXT_INSTRUCTION();
2714dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
2715635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_by_id_chain) {
2716635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        /* op_get_by_id_chain dst(r) base(r) property(id) structure(sID) structureChain(chain) count(n) offset(n)
27178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
27188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Cached property access: Attempts to get a cached property from the
27198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           value base's prototype chain. If the cache misses, op_get_by_id_chain
27208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           reverts to op_get_by_id.
27218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
27228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[2].u.operand;
27230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
27248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2725635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (LIKELY(baseValue.isCell())) {
2726e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSCell* baseCell = baseValue.asCell();
2727635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            Structure* structure = vPC[4].u.structure;
27288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2729635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (LIKELY(baseCell->structure() == structure)) {
2730635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                RefPtr<Structure>* it = vPC[5].u.structureChain->head();
27318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                size_t count = vPC[6].u.operand;
2732635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                RefPtr<Structure>* end = it + count;
27338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2734635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                while (true) {
2735635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    JSObject* baseObject = asObject(baseCell->structure()->prototypeForLookup(callFrame));
2736635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2737635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (UNLIKELY(baseObject->structure() != (*it).get()))
27388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
27398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
27408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (++it == end) {
27418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        int dst = vPC[1].u.operand;
27428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        int offset = vPC[7].u.operand;
27438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2744e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                        ASSERT(baseObject->get(callFrame, codeBlock->identifier(vPC[3].u.operand)) == baseObject->getDirectOffset(offset));
2745e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                        ASSERT(baseValue.get(callFrame, codeBlock->identifier(vPC[3].u.operand)) == baseObject->getDirectOffset(offset));
27464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                        callFrame->uncheckedR(dst) = JSValue(baseObject->getDirectOffset(offset));
27478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2748cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                        vPC += OPCODE_LENGTH(op_get_by_id_chain);
2749635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        NEXT_INSTRUCTION();
27508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
2751635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2752635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    // Update baseCell, so that next time around the loop we'll pick up the prototype's prototype.
2753635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    baseCell = baseObject;
27548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
27558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
27568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
27578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2758e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncacheGetByID(codeBlock, vPC);
2759635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
27608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2761bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2762692e5dbf12901edacf14812a6fae25462920af42Steve Block    goto *(&&skip_id_getter_self);
2763692e5dbf12901edacf14812a6fae25462920af42Steve Block#endif
2764692e5dbf12901edacf14812a6fae25462920af42Steve Block    DEFINE_OPCODE(op_get_by_id_getter_self) {
2765692e5dbf12901edacf14812a6fae25462920af42Steve Block        /* op_get_by_id_self dst(r) base(r) property(id) structure(sID) offset(n) nop(n) nop(n)
2766692e5dbf12901edacf14812a6fae25462920af42Steve Block
2767692e5dbf12901edacf14812a6fae25462920af42Steve Block         Cached property access: Attempts to get a cached property from the
2768692e5dbf12901edacf14812a6fae25462920af42Steve Block         value base. If the cache misses, op_get_by_id_getter_self reverts to
2769692e5dbf12901edacf14812a6fae25462920af42Steve Block         op_get_by_id.
2770692e5dbf12901edacf14812a6fae25462920af42Steve Block         */
2771692e5dbf12901edacf14812a6fae25462920af42Steve Block        int base = vPC[2].u.operand;
2772692e5dbf12901edacf14812a6fae25462920af42Steve Block        JSValue baseValue = callFrame->r(base).jsValue();
2773692e5dbf12901edacf14812a6fae25462920af42Steve Block
2774692e5dbf12901edacf14812a6fae25462920af42Steve Block        if (LIKELY(baseValue.isCell())) {
2775e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSCell* baseCell = baseValue.asCell();
2776692e5dbf12901edacf14812a6fae25462920af42Steve Block            Structure* structure = vPC[4].u.structure;
2777692e5dbf12901edacf14812a6fae25462920af42Steve Block
2778692e5dbf12901edacf14812a6fae25462920af42Steve Block            if (LIKELY(baseCell->structure() == structure)) {
2779692e5dbf12901edacf14812a6fae25462920af42Steve Block                ASSERT(baseCell->isObject());
2780692e5dbf12901edacf14812a6fae25462920af42Steve Block                JSObject* baseObject = asObject(baseCell);
2781692e5dbf12901edacf14812a6fae25462920af42Steve Block                int dst = vPC[1].u.operand;
2782692e5dbf12901edacf14812a6fae25462920af42Steve Block                int offset = vPC[5].u.operand;
2783692e5dbf12901edacf14812a6fae25462920af42Steve Block
2784692e5dbf12901edacf14812a6fae25462920af42Steve Block                if (GetterSetter* getterSetter = asGetterSetter(baseObject->getDirectOffset(offset).asCell())) {
2785692e5dbf12901edacf14812a6fae25462920af42Steve Block                    JSObject* getter = getterSetter->getter();
2786692e5dbf12901edacf14812a6fae25462920af42Steve Block                    CallData callData;
2787692e5dbf12901edacf14812a6fae25462920af42Steve Block                    CallType callType = getter->getCallData(callData);
2788692e5dbf12901edacf14812a6fae25462920af42Steve Block                    JSValue result = call(callFrame, getter, callType, callData, baseObject, ArgList());
2789692e5dbf12901edacf14812a6fae25462920af42Steve Block                    CHECK_FOR_EXCEPTION();
27904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                    callFrame->uncheckedR(dst) = result;
2791692e5dbf12901edacf14812a6fae25462920af42Steve Block                } else
27924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                    callFrame->uncheckedR(dst) = jsUndefined();
2793692e5dbf12901edacf14812a6fae25462920af42Steve Block
2794692e5dbf12901edacf14812a6fae25462920af42Steve Block                vPC += OPCODE_LENGTH(op_get_by_id_getter_self);
2795692e5dbf12901edacf14812a6fae25462920af42Steve Block                NEXT_INSTRUCTION();
2796692e5dbf12901edacf14812a6fae25462920af42Steve Block            }
2797692e5dbf12901edacf14812a6fae25462920af42Steve Block        }
2798e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncacheGetByID(codeBlock, vPC);
2799692e5dbf12901edacf14812a6fae25462920af42Steve Block        NEXT_INSTRUCTION();
2800692e5dbf12901edacf14812a6fae25462920af42Steve Block    }
2801bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2802692e5dbf12901edacf14812a6fae25462920af42Steve Block    skip_id_getter_self:
2803692e5dbf12901edacf14812a6fae25462920af42Steve Block#endif
2804bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2805dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    goto *(&&skip_id_custom_self);
2806dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
2807dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DEFINE_OPCODE(op_get_by_id_custom_self) {
2808dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        /* op_get_by_id_custom_self dst(r) base(r) property(id) structure(sID) offset(n) nop(n) nop(n)
2809dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2810dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         Cached property access: Attempts to use a cached named property getter
2811dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         from the value base. If the cache misses, op_get_by_id_custom_self reverts to
2812dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         op_get_by_id.
2813dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         */
2814dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        int base = vPC[2].u.operand;
2815dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        JSValue baseValue = callFrame->r(base).jsValue();
2816dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2817dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (LIKELY(baseValue.isCell())) {
2818e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSCell* baseCell = baseValue.asCell();
2819dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            Structure* structure = vPC[4].u.structure;
2820dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2821dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (LIKELY(baseCell->structure() == structure)) {
2822dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                ASSERT(baseCell->isObject());
2823dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                int dst = vPC[1].u.operand;
2824dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                int property = vPC[3].u.operand;
2825e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                Identifier& ident = codeBlock->identifier(property);
2826dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2827dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                PropertySlot::GetValueFunc getter = vPC[5].u.getterFunc;
2828dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                JSValue result = getter(callFrame, baseValue, ident);
2829dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                CHECK_FOR_EXCEPTION();
28304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                callFrame->uncheckedR(dst) = result;
2831dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                vPC += OPCODE_LENGTH(op_get_by_id_custom_self);
2832dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                NEXT_INSTRUCTION();
2833dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            }
2834dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
2835e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncacheGetByID(codeBlock, vPC);
2836dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        NEXT_INSTRUCTION();
2837dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
2838bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2839dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockskip_id_custom_self:
2840dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
2841635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_by_id_generic) {
28428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* op_get_by_id_generic dst(r) base(r) property(id) nop(sID) nop(n) nop(n) nop(n)
28438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
28448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Generic property access: Gets the property named by identifier
28458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           property from the value base, and puts the result in register dst.
28468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
28478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int dst = vPC[1].u.operand;
28488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[2].u.operand;
28498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int property = vPC[3].u.operand;
28508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2851e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        Identifier& ident = codeBlock->identifier(property);
28520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
28538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PropertySlot slot(baseValue);
28545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue result = baseValue.get(callFrame, ident, slot);
2855635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
28568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
28574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = result;
2858cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_get_by_id_generic);
2859635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
28608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2861bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2862692e5dbf12901edacf14812a6fae25462920af42Steve Block    goto *(&&skip_id_getter_chain);
2863692e5dbf12901edacf14812a6fae25462920af42Steve Block#endif
2864692e5dbf12901edacf14812a6fae25462920af42Steve Block    DEFINE_OPCODE(op_get_by_id_getter_chain) {
2865692e5dbf12901edacf14812a6fae25462920af42Steve Block        /* op_get_by_id_getter_chain dst(r) base(r) property(id) structure(sID) structureChain(chain) count(n) offset(n)
2866692e5dbf12901edacf14812a6fae25462920af42Steve Block
2867692e5dbf12901edacf14812a6fae25462920af42Steve Block         Cached property access: Attempts to get a cached property from the
2868692e5dbf12901edacf14812a6fae25462920af42Steve Block         value base's prototype chain. If the cache misses, op_get_by_id_getter_chain
2869692e5dbf12901edacf14812a6fae25462920af42Steve Block         reverts to op_get_by_id.
2870692e5dbf12901edacf14812a6fae25462920af42Steve Block         */
2871692e5dbf12901edacf14812a6fae25462920af42Steve Block        int base = vPC[2].u.operand;
2872692e5dbf12901edacf14812a6fae25462920af42Steve Block        JSValue baseValue = callFrame->r(base).jsValue();
2873692e5dbf12901edacf14812a6fae25462920af42Steve Block
2874692e5dbf12901edacf14812a6fae25462920af42Steve Block        if (LIKELY(baseValue.isCell())) {
2875e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSCell* baseCell = baseValue.asCell();
2876692e5dbf12901edacf14812a6fae25462920af42Steve Block            Structure* structure = vPC[4].u.structure;
2877692e5dbf12901edacf14812a6fae25462920af42Steve Block
2878692e5dbf12901edacf14812a6fae25462920af42Steve Block            if (LIKELY(baseCell->structure() == structure)) {
2879692e5dbf12901edacf14812a6fae25462920af42Steve Block                RefPtr<Structure>* it = vPC[5].u.structureChain->head();
2880692e5dbf12901edacf14812a6fae25462920af42Steve Block                size_t count = vPC[6].u.operand;
2881692e5dbf12901edacf14812a6fae25462920af42Steve Block                RefPtr<Structure>* end = it + count;
2882692e5dbf12901edacf14812a6fae25462920af42Steve Block
2883692e5dbf12901edacf14812a6fae25462920af42Steve Block                while (true) {
2884692e5dbf12901edacf14812a6fae25462920af42Steve Block                    JSObject* baseObject = asObject(baseCell->structure()->prototypeForLookup(callFrame));
2885692e5dbf12901edacf14812a6fae25462920af42Steve Block
2886692e5dbf12901edacf14812a6fae25462920af42Steve Block                    if (UNLIKELY(baseObject->structure() != (*it).get()))
2887692e5dbf12901edacf14812a6fae25462920af42Steve Block                        break;
2888692e5dbf12901edacf14812a6fae25462920af42Steve Block
2889692e5dbf12901edacf14812a6fae25462920af42Steve Block                    if (++it == end) {
2890692e5dbf12901edacf14812a6fae25462920af42Steve Block                        int dst = vPC[1].u.operand;
2891692e5dbf12901edacf14812a6fae25462920af42Steve Block                        int offset = vPC[7].u.operand;
2892692e5dbf12901edacf14812a6fae25462920af42Steve Block                        if (GetterSetter* getterSetter = asGetterSetter(baseObject->getDirectOffset(offset).asCell())) {
2893692e5dbf12901edacf14812a6fae25462920af42Steve Block                            JSObject* getter = getterSetter->getter();
2894692e5dbf12901edacf14812a6fae25462920af42Steve Block                            CallData callData;
2895692e5dbf12901edacf14812a6fae25462920af42Steve Block                            CallType callType = getter->getCallData(callData);
2896dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                            JSValue result = call(callFrame, getter, callType, callData, baseValue, ArgList());
2897692e5dbf12901edacf14812a6fae25462920af42Steve Block                            CHECK_FOR_EXCEPTION();
28984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                            callFrame->uncheckedR(dst) = result;
2899692e5dbf12901edacf14812a6fae25462920af42Steve Block                        } else
29004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                            callFrame->uncheckedR(dst) = jsUndefined();
2901692e5dbf12901edacf14812a6fae25462920af42Steve Block                        vPC += OPCODE_LENGTH(op_get_by_id_getter_chain);
2902692e5dbf12901edacf14812a6fae25462920af42Steve Block                        NEXT_INSTRUCTION();
2903692e5dbf12901edacf14812a6fae25462920af42Steve Block                    }
2904692e5dbf12901edacf14812a6fae25462920af42Steve Block
2905692e5dbf12901edacf14812a6fae25462920af42Steve Block                    // Update baseCell, so that next time around the loop we'll pick up the prototype's prototype.
2906692e5dbf12901edacf14812a6fae25462920af42Steve Block                    baseCell = baseObject;
2907692e5dbf12901edacf14812a6fae25462920af42Steve Block                }
2908692e5dbf12901edacf14812a6fae25462920af42Steve Block            }
2909692e5dbf12901edacf14812a6fae25462920af42Steve Block        }
2910e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncacheGetByID(codeBlock, vPC);
2911692e5dbf12901edacf14812a6fae25462920af42Steve Block        NEXT_INSTRUCTION();
2912692e5dbf12901edacf14812a6fae25462920af42Steve Block    }
2913bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2914692e5dbf12901edacf14812a6fae25462920af42Steve Block    skip_id_getter_chain:
2915692e5dbf12901edacf14812a6fae25462920af42Steve Block#endif
2916bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2917dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    goto *(&&skip_id_custom_chain);
2918dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
2919dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DEFINE_OPCODE(op_get_by_id_custom_chain) {
2920dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        /* op_get_by_id_custom_chain dst(r) base(r) property(id) structure(sID) structureChain(chain) count(n) offset(n)
2921dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2922dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         Cached property access: Attempts to use a cached named property getter on the
2923dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         value base's prototype chain. If the cache misses, op_get_by_id_custom_chain
2924dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         reverts to op_get_by_id.
2925dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         */
2926dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        int base = vPC[2].u.operand;
2927dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        JSValue baseValue = callFrame->r(base).jsValue();
2928dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2929dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (LIKELY(baseValue.isCell())) {
2930e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSCell* baseCell = baseValue.asCell();
2931dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            Structure* structure = vPC[4].u.structure;
2932dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2933dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (LIKELY(baseCell->structure() == structure)) {
2934dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                RefPtr<Structure>* it = vPC[5].u.structureChain->head();
2935dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                size_t count = vPC[6].u.operand;
2936dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                RefPtr<Structure>* end = it + count;
2937dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2938dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                while (true) {
2939dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    JSObject* baseObject = asObject(baseCell->structure()->prototypeForLookup(callFrame));
2940dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2941dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    if (UNLIKELY(baseObject->structure() != (*it).get()))
2942dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                        break;
2943dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2944dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    if (++it == end) {
2945dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                        int dst = vPC[1].u.operand;
2946dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                        int property = vPC[3].u.operand;
2947e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                        Identifier& ident = codeBlock->identifier(property);
2948dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2949dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                        PropertySlot::GetValueFunc getter = vPC[7].u.getterFunc;
2950dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                        JSValue result = getter(callFrame, baseObject, ident);
2951dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                        CHECK_FOR_EXCEPTION();
29524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                        callFrame->uncheckedR(dst) = result;
2953dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                        vPC += OPCODE_LENGTH(op_get_by_id_custom_chain);
2954dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                        NEXT_INSTRUCTION();
2955dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    }
2956dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2957dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    // Update baseCell, so that next time around the loop we'll pick up the prototype's prototype.
2958dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    baseCell = baseObject;
2959dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                }
2960dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            }
2961dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
2962e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncacheGetByID(codeBlock, vPC);
2963dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        NEXT_INSTRUCTION();
2964dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
2965bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2966dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    skip_id_custom_chain:
2967dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
2968635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_array_length) {
29698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* op_get_array_length dst(r) base(r) property(id) nop(sID) nop(n) nop(n) nop(n)
29708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Cached property access: Gets the length of the array in register base,
29728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           and puts the result in register dst. If register base does not hold
29738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           an array, op_get_array_length reverts to op_get_by_id.
29748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
29758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[2].u.operand;
29770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
29788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (LIKELY(isJSArray(globalData, baseValue))) {
29798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int dst = vPC[1].u.operand;
29804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(asArray(baseValue)->length());
2981cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            vPC += OPCODE_LENGTH(op_get_array_length);
2982635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
29838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
29848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2985e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncacheGetByID(codeBlock, vPC);
2986635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
29878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2988635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_string_length) {
29898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* op_get_string_length dst(r) base(r) property(id) nop(sID) nop(n) nop(n) nop(n)
29908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Cached property access: Gets the length of the string in register base,
29928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           and puts the result in register dst. If register base does not hold
29938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           a string, op_get_string_length reverts to op_get_by_id.
29948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
29958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[2].u.operand;
29970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
29988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (LIKELY(isJSString(globalData, baseValue))) {
29998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int dst = vPC[1].u.operand;
30004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(asString(baseValue)->length());
3001cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            vPC += OPCODE_LENGTH(op_get_string_length);
3002635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
30038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
30048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3005e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncacheGetByID(codeBlock, vPC);
3006635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
30078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3008635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_put_by_id) {
3009e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        /* put_by_id base(r) property(id) value(r) nop(n) nop(n) nop(n) nop(n) direct(b)
30108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Generic property access: Sets the property named by identifier
30128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           property, belonging to register base, to register value.
30138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Unlike many opcodes, this one does not write any output to
30158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the register file.
3016e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
3017e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke           The "direct" flag should only be set this put_by_id is to initialize
3018e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke           an object literal.
30198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
30208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[1].u.operand;
30228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int property = vPC[2].u.operand;
30238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int value = vPC[3].u.operand;
3024e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        int direct = vPC[8].u.operand;
30258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
3027635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Identifier& ident = codeBlock->identifier(property);
3028a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        PutPropertySlot slot(codeBlock->isStrictMode());
3029e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (direct) {
3030e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            baseValue.putDirect(callFrame, ident, callFrame->r(value).jsValue(), slot);
3031e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            ASSERT(slot.base() == baseValue);
3032e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        } else
3033e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            baseValue.put(callFrame, ident, callFrame->r(value).jsValue(), slot);
3034635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
30358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        tryCachePutByID(callFrame, codeBlock, vPC, baseValue, slot);
30378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3038cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_put_by_id);
3039635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
30408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3041635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_put_by_id_transition) {
3042e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        /* op_put_by_id_transition base(r) property(id) value(r) oldStructure(sID) newStructure(sID) structureChain(chain) offset(n) direct(b)
30438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Cached property access: Attempts to set a new property with a cached transition
30458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           property named by identifier property, belonging to register base,
30468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           to register value. If the cache misses, op_put_by_id_transition
30478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           reverts to op_put_by_id_generic.
30488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Unlike many opcodes, this one does not write any output to
30508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the register file.
30518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
30528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[1].u.operand;
30530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
30548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3055635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (LIKELY(baseValue.isCell())) {
3056e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSCell* baseCell = baseValue.asCell();
3057635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            Structure* oldStructure = vPC[4].u.structure;
3058635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            Structure* newStructure = vPC[5].u.structure;
30598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3060635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (LIKELY(baseCell->structure() == oldStructure)) {
30618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ASSERT(baseCell->isObject());
30628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                JSObject* baseObject = asObject(baseCell);
3063e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                int direct = vPC[8].u.operand;
3064e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
3065e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block                if (!direct) {
3066e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                    RefPtr<Structure>* it = vPC[6].u.structureChain->head();
3067e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
3068e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                    JSValue proto = baseObject->structure()->prototypeForLookup(callFrame);
3069e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                    while (!proto.isNull()) {
3070e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                        if (UNLIKELY(asObject(proto)->structure() != (*it).get())) {
3071e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                            uncachePutByID(codeBlock, vPC);
3072e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                            NEXT_INSTRUCTION();
3073e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                        }
3074e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                        ++it;
3075e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                        proto = asObject(proto)->structure()->prototypeForLookup(callFrame);
30768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
30778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
3078635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                baseObject->transitionTo(newStructure);
30798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                int value = vPC[3].u.operand;
30818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                unsigned offset = vPC[7].u.operand;
3082e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                ASSERT(baseObject->offsetForLocation(baseObject->getDirectLocation(codeBlock->identifier(vPC[2].u.operand))) == offset);
30832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                baseObject->putDirectOffset(callFrame->globalData(), offset, callFrame->r(value).jsValue());
30848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3085cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                vPC += OPCODE_LENGTH(op_put_by_id_transition);
3086635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                NEXT_INSTRUCTION();
30878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
30888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
30898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3090e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncachePutByID(codeBlock, vPC);
3091635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
30928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3093635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_put_by_id_replace) {
3094e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        /* op_put_by_id_replace base(r) property(id) value(r) structure(sID) offset(n) nop(n) nop(n) direct(b)
30958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Cached property access: Attempts to set a pre-existing, cached
30978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           property named by identifier property, belonging to register base,
30988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           to register value. If the cache misses, op_put_by_id_replace
30998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           reverts to op_put_by_id.
31008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Unlike many opcodes, this one does not write any output to
31028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the register file.
31038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
31048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[1].u.operand;
31050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
31068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3107635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (LIKELY(baseValue.isCell())) {
3108e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSCell* baseCell = baseValue.asCell();
3109635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            Structure* structure = vPC[4].u.structure;
31108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3111635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (LIKELY(baseCell->structure() == structure)) {
31128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ASSERT(baseCell->isObject());
31138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                JSObject* baseObject = asObject(baseCell);
31148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                int value = vPC[3].u.operand;
31158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                unsigned offset = vPC[5].u.operand;
31168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3117e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                ASSERT(baseObject->offsetForLocation(baseObject->getDirectLocation(codeBlock->identifier(vPC[2].u.operand))) == offset);
31182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                baseObject->putDirectOffset(callFrame->globalData(), offset, callFrame->r(value).jsValue());
31198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3120cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                vPC += OPCODE_LENGTH(op_put_by_id_replace);
3121635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                NEXT_INSTRUCTION();
31228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
31238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
31248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3125e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncachePutByID(codeBlock, vPC);
3126635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
31278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_put_by_id_generic) {
3129e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        /* op_put_by_id_generic base(r) property(id) value(r) nop(n) nop(n) nop(n) nop(n) direct(b)
31308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Generic property access: Sets the property named by identifier
31328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           property, belonging to register base, to register value.
31338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Unlike many opcodes, this one does not write any output to
31358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the register file.
31368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
31378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[1].u.operand;
31388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int property = vPC[2].u.operand;
31398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int value = vPC[3].u.operand;
3140e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        int direct = vPC[8].u.operand;
31418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
3143e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        Identifier& ident = codeBlock->identifier(property);
3144a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        PutPropertySlot slot(codeBlock->isStrictMode());
3145e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (direct) {
3146e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            baseValue.putDirect(callFrame, ident, callFrame->r(value).jsValue(), slot);
3147e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            ASSERT(slot.base() == baseValue);
3148e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        } else
3149e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            baseValue.put(callFrame, ident, callFrame->r(value).jsValue(), slot);
3150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
31518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3152cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_put_by_id_generic);
3153635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
31548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3155635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_del_by_id) {
31568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* del_by_id dst(r) base(r) property(id)
31578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Converts register base to Object, deletes the property
31598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           named by identifier property from the object, and writes a
31608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           boolean indicating success (if true) or failure (if false)
31618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           to register dst.
31628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3163cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
3164cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int base = vPC[2].u.operand;
3165cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int property = vPC[3].u.operand;
31668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSObject* baseObj = callFrame->r(base).jsValue().toObject(callFrame);
3168e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        Identifier& ident = codeBlock->identifier(property);
3169a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        bool result = baseObj->deleteProperty(callFrame, ident);
3170a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!result && codeBlock->isStrictMode()) {
3171a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            exceptionValue = createTypeError(callFrame, "Unable to delete property.");
3172a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            goto vm_throw;
3173a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
3174635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
31754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(result);
3176cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_del_by_id);
3177cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        NEXT_INSTRUCTION();
3178cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
3179cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    DEFINE_OPCODE(op_get_by_pname) {
3180cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
3181cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int base = vPC[2].u.operand;
3182cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int property = vPC[3].u.operand;
3183cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int expected = vPC[4].u.operand;
3184cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int iter = vPC[5].u.operand;
3185cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int i = vPC[6].u.operand;
3186cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
3187cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue baseValue = callFrame->r(base).jsValue();
3188cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSPropertyNameIterator* it = callFrame->r(iter).propertyNameIterator();
3189cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue subscript = callFrame->r(property).jsValue();
3190cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue expectedSubscript = callFrame->r(expected).jsValue();
3191cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int index = callFrame->r(i).i() - 1;
3192cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue result;
3193cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int offset = 0;
3194cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        if (subscript == expectedSubscript && baseValue.isCell() && (baseValue.asCell()->structure() == it->cachedStructure()) && it->getOffset(index, offset)) {
31954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = JSValue(asObject(baseValue)->getDirectOffset(offset));
3196cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            vPC += OPCODE_LENGTH(op_get_by_pname);
3197cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            NEXT_INSTRUCTION();
3198cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        }
3199f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        {
3200f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            Identifier propertyName(callFrame, subscript.toString(callFrame));
3201f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            result = baseValue.get(callFrame, propertyName);
3202f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        }
3203cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        CHECK_FOR_EXCEPTION();
32044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = result;
3205cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_get_by_pname);
3206635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
32078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3208bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    DEFINE_OPCODE(op_get_arguments_length) {
3209bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        int dst = vPC[1].u.operand;
3210bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        int argumentsRegister = vPC[2].u.operand;
3211bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        int property = vPC[3].u.operand;
3212bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        JSValue arguments = callFrame->r(argumentsRegister).jsValue();
3213bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (arguments) {
3214bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            Identifier& ident = codeBlock->identifier(property);
3215bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            PropertySlot slot(arguments);
3216bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            JSValue result = arguments.get(callFrame, ident, slot);
3217bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            CHECK_FOR_EXCEPTION();
32184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
3219bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        } else
32204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(callFrame->argumentCount());
3221bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
3222bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        vPC += OPCODE_LENGTH(op_get_arguments_length);
3223bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        NEXT_INSTRUCTION();
3224bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
3225bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    DEFINE_OPCODE(op_get_argument_by_val) {
3226bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        int dst = vPC[1].u.operand;
3227bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        int argumentsRegister = vPC[2].u.operand;
3228bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        int property = vPC[3].u.operand;
3229bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        JSValue arguments = callFrame->r(argumentsRegister).jsValue();
3230bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        JSValue subscript = callFrame->r(property).jsValue();
3231bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!arguments && subscript.isUInt32() && subscript.asUInt32() < callFrame->argumentCount()) {
3232bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            unsigned arg = subscript.asUInt32() + 1;
3233bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            unsigned numParameters = callFrame->codeBlock()->m_numParameters;
3234bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (arg < numParameters)
32354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                callFrame->uncheckedR(dst) = callFrame->r(arg - RegisterFile::CallFrameHeaderSize - numParameters);
3236bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            else
32374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                callFrame->uncheckedR(dst) = callFrame->r(arg - RegisterFile::CallFrameHeaderSize - numParameters - callFrame->argumentCount() - 1);
3238bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            vPC += OPCODE_LENGTH(op_get_argument_by_val);
3239bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            NEXT_INSTRUCTION();
3240bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
3241bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!arguments) {
3242bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            Arguments* arguments = new (globalData) Arguments(callFrame);
32434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(argumentsRegister) = JSValue(arguments);
32444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(unmodifiedArgumentsRegister(argumentsRegister)) = JSValue(arguments);
3245bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
3246bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // fallthrough
3247bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
3248635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_by_val) {
32498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* get_by_val dst(r) base(r) property(r)
32508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Converts register base to Object, gets the property named
32528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           by register property from the object, and puts the result
32538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst. property is nominally converted to string
32548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           but numbers are treated more efficiently.
32558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3256cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
3257cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int base = vPC[2].u.operand;
3258cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int property = vPC[3].u.operand;
32598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
32610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue subscript = callFrame->r(property).jsValue();
32628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue result;
32648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (LIKELY(subscript.isUInt32())) {
32660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            uint32_t i = subscript.asUInt32();
32678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (isJSArray(globalData, baseValue)) {
32688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                JSArray* jsArray = asArray(baseValue);
32698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (jsArray->canGetIndex(i))
32708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    result = jsArray->getIndex(i);
32718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else
32728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    result = jsArray->JSArray::get(callFrame, i);
32738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            } else if (isJSString(globalData, baseValue) && asString(baseValue)->canGetIndex(i))
3274643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                result = asString(baseValue)->getIndex(callFrame, i);
32758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            else if (isJSByteArray(globalData, baseValue) && asByteArray(baseValue)->canAccessIndex(i))
3276635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                result = asByteArray(baseValue)->getIndex(callFrame, i);
32778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
3278635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                result = baseValue.get(callFrame, i);
32798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
3280635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            Identifier property(callFrame, subscript.toString(callFrame));
3281635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            result = baseValue.get(callFrame, property);
32828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
32838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3284635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
32854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = result;
3286cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_get_by_val);
3287635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
32888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3289635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_put_by_val) {
32908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* put_by_val base(r) property(r) value(r)
32918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Sets register value on register base as the property named
32938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           by register property. Base is converted to object
32948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           first. register property is nominally converted to string
32958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           but numbers are treated more efficiently.
32968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Unlike many opcodes, this one does not write any output to
32988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the register file.
32998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3300cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int base = vPC[1].u.operand;
3301cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int property = vPC[2].u.operand;
3302cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int value = vPC[3].u.operand;
33038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
33050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue subscript = callFrame->r(property).jsValue();
33068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (LIKELY(subscript.isUInt32())) {
33080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            uint32_t i = subscript.asUInt32();
33098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (isJSArray(globalData, baseValue)) {
33108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                JSArray* jsArray = asArray(baseValue);
33118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (jsArray->canSetIndex(i))
33122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    jsArray->setIndex(*globalData, i, callFrame->r(value).jsValue());
33138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else
33140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    jsArray->JSArray::put(callFrame, i, callFrame->r(value).jsValue());
33158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            } else if (isJSByteArray(globalData, baseValue) && asByteArray(baseValue)->canAccessIndex(i)) {
3316635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                JSByteArray* jsByteArray = asByteArray(baseValue);
3317635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                double dValue = 0;
33180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                JSValue jsValue = callFrame->r(value).jsValue();
33190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                if (jsValue.isInt32())
33200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    jsByteArray->setIndex(i, jsValue.asInt32());
3321635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                else if (jsValue.getNumber(dValue))
3322635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    jsByteArray->setIndex(i, dValue);
3323635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                else
3324635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    baseValue.put(callFrame, i, jsValue);
33258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else
33260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                baseValue.put(callFrame, i, callFrame->r(value).jsValue());
33278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
3328635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            Identifier property(callFrame, subscript.toString(callFrame));
33298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!globalData->exception) { // Don't put to an object if toString threw an exception.
3330a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                PutPropertySlot slot(codeBlock->isStrictMode());
33310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                baseValue.put(callFrame, property, callFrame->r(value).jsValue(), slot);
33328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
33338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
33348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3335635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
3336cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_put_by_val);
3337635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
33388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3339635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_del_by_val) {
33408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* del_by_val dst(r) base(r) property(r)
33418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Converts register base to Object, deletes the property
33438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           named by register property from the object, and writes a
33448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           boolean indicating success (if true) or failure (if false)
33458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           to register dst.
33468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3347cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
3348cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int base = vPC[2].u.operand;
3349cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int property = vPC[3].u.operand;
33508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSObject* baseObj = callFrame->r(base).jsValue().toObject(callFrame); // may throw
33528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue subscript = callFrame->r(property).jsValue();
3354a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        bool result;
33558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        uint32_t i;
3356635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (subscript.getUInt32(i))
3357a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            result = baseObj->deleteProperty(callFrame, i);
33588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
3359635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
3360635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            Identifier property(callFrame, subscript.toString(callFrame));
3361635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
3362a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            result = baseObj->deleteProperty(callFrame, property);
3363a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
3364a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!result && codeBlock->isStrictMode()) {
3365a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            exceptionValue = createTypeError(callFrame, "Unable to delete property.");
3366a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            goto vm_throw;
33678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3368635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
33694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(result);
3370cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_del_by_val);
3371635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
33728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3373635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_put_by_index) {
33748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* put_by_index base(r) property(n) value(r)
33758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Sets register value on register base as the property named
33778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           by the immediate number property. Base is converted to
33788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           object first.
33798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Unlike many opcodes, this one does not write any output to
33818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the register file.
33828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           This opcode is mainly used to initialize array literals.
33848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3385cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int base = vPC[1].u.operand;
3386cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        unsigned property = vPC[2].u.operand;
3387cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int value = vPC[3].u.operand;
33888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        callFrame->r(base).jsValue().put(callFrame, property, callFrame->r(value).jsValue());
33908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3391cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_put_by_index);
3392635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
33938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3394635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_loop) {
33958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* loop target(offset)
33968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Jumps unconditionally to offset target from the current
33988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           instruction.
33998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Additionally this loop instruction may terminate JS execution is
34018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the JS timeout is reached.
34028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
34038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(OPCODE_STATS)
34048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        OpcodeStats::resetLastInstruction();
34058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3406cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[1].u.operand;
34078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CHECK_FOR_TIMEOUT();
34088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC += target;
3409635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
34108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3411635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_jmp) {
34128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* jmp target(offset)
34138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Jumps unconditionally to offset target from the current
34158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           instruction.
34168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
34178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(OPCODE_STATS)
34188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        OpcodeStats::resetLastInstruction();
34198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3420cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[1].u.operand;
34218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC += target;
3423635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
34248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3425635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_loop_if_true) {
34268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* loop_if_true cond(r) target(offset)
34278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Jumps to offset target from the current instruction, if and
34298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           only if register cond converts to boolean as true.
34308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Additionally this loop instruction may terminate JS execution is
34328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the JS timeout is reached.
34338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
3434cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int cond = vPC[1].u.operand;
3435cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[2].u.operand;
34360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (callFrame->r(cond).jsValue().toBoolean(callFrame)) {
34378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vPC += target;
34388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CHECK_FOR_TIMEOUT();
3439635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
34408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
34418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3442cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_loop_if_true);
3443635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
34448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3445643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    DEFINE_OPCODE(op_loop_if_false) {
3446643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        /* loop_if_true cond(r) target(offset)
3447643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
3448643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           Jumps to offset target from the current instruction, if and
3449643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           only if register cond converts to boolean as false.
3450643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
3451643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           Additionally this loop instruction may terminate JS execution is
3452643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           the JS timeout is reached.
3453643ca7872b450ea4efacab6188849e5aac2ba161Steve Block         */
3454643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        int cond = vPC[1].u.operand;
3455643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        int target = vPC[2].u.operand;
3456643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (!callFrame->r(cond).jsValue().toBoolean(callFrame)) {
3457643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            vPC += target;
3458643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            CHECK_FOR_TIMEOUT();
3459643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            NEXT_INSTRUCTION();
3460643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
3461643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
3462643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        vPC += OPCODE_LENGTH(op_loop_if_true);
3463643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        NEXT_INSTRUCTION();
3464643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
3465635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_jtrue) {
34668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* jtrue cond(r) target(offset)
34678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Jumps to offset target from the current instruction, if and
34698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           only if register cond converts to boolean as true.
34708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3471cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int cond = vPC[1].u.operand;
3472cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[2].u.operand;
34730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (callFrame->r(cond).jsValue().toBoolean(callFrame)) {
34748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vPC += target;
3475635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
34768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
34778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3478cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_jtrue);
3479635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
34808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3481635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_jfalse) {
34828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* jfalse cond(r) target(offset)
34838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Jumps to offset target from the current instruction, if and
34858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           only if register cond converts to boolean as false.
34868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3487cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int cond = vPC[1].u.operand;
3488cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[2].u.operand;
34890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!callFrame->r(cond).jsValue().toBoolean(callFrame)) {
34908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vPC += target;
3491635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
34928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
34938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3494cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_jfalse);
3495635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
34968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3497635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_jeq_null) {
34988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* jeq_null src(r) target(offset)
34998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Jumps to offset target from the current instruction, if and
35018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           only if register src is null.
35028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3503cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[1].u.operand;
3504cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[2].u.operand;
35050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue srcValue = callFrame->r(src).jsValue();
35068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3507635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (srcValue.isUndefinedOrNull() || (srcValue.isCell() && srcValue.asCell()->structure()->typeInfo().masqueradesAsUndefined())) {
35088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vPC += target;
3509635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
35108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
35118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3512cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_jeq_null);
3513635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
35148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3515635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_jneq_null) {
35168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* jneq_null src(r) target(offset)
35178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Jumps to offset target from the current instruction, if and
35198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           only if register src is not null.
35208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3521cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[1].u.operand;
3522cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[2].u.operand;
35230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue srcValue = callFrame->r(src).jsValue();
35248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3525643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (!srcValue.isUndefinedOrNull() && (!srcValue.isCell() || !srcValue.asCell()->structure()->typeInfo().masqueradesAsUndefined())) {
35268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vPC += target;
3527635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
35288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
35298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3530cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_jneq_null);
3531635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
35328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
35335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    DEFINE_OPCODE(op_jneq_ptr) {
35345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        /* jneq_ptr src(r) ptr(jsCell) target(offset)
35355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
35365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian           Jumps to offset target from the current instruction, if the value r is equal
35375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian           to ptr, using pointer equality.
35385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian         */
3539cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[1].u.operand;
3540cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[3].u.operand;
35410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue srcValue = callFrame->r(src).jsValue();
35422bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (srcValue != vPC[2].u.jsCell.get()) {
35435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            vPC += target;
35445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            NEXT_INSTRUCTION();
35455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
35465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
3547cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_jneq_ptr);
35485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        NEXT_INSTRUCTION();
35495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
3550635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_loop_if_less) {
35518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* loop_if_less src1(r) src2(r) target(offset)
35528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Checks whether register src1 is less than register src2, as
35548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           with the ECMAScript '<' operator, and then jumps to offset
35558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           target from the current instruction, if and only if the
35568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           result of the comparison is true.
35578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Additionally this loop instruction may terminate JS execution is
35598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the JS timeout is reached.
35608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
3561cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[1].u.operand).jsValue();
3562cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[2].u.operand).jsValue();
3563cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[3].u.operand;
35648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool result = jsLess(callFrame, src1, src2);
3566635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
35678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (result) {
35698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vPC += target;
35708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CHECK_FOR_TIMEOUT();
3571635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
35728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
35738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3574cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_loop_if_less);
3575635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
35768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3577635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_loop_if_lesseq) {
35788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* loop_if_lesseq src1(r) src2(r) target(offset)
35798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Checks whether register src1 is less than or equal to register
35818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           src2, as with the ECMAScript '<=' operator, and then jumps to
35828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           offset target from the current instruction, if and only if the
35838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           result of the comparison is true.
35848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Additionally this loop instruction may terminate JS execution is
35868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the JS timeout is reached.
35878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3588cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[1].u.operand).jsValue();
3589cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[2].u.operand).jsValue();
3590cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[3].u.operand;
35918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool result = jsLessEq(callFrame, src1, src2);
3593635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
35948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (result) {
35968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vPC += target;
35978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CHECK_FOR_TIMEOUT();
3598635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
35998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
36008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3601cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_loop_if_lesseq);
3602635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
36038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3604635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_jnless) {
36058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* jnless src1(r) src2(r) target(offset)
36068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Checks whether register src1 is less than register src2, as
36088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           with the ECMAScript '<' operator, and then jumps to offset
36098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           target from the current instruction, if and only if the
36108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           result of the comparison is false.
36118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3612cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[1].u.operand).jsValue();
3613cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[2].u.operand).jsValue();
3614cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[3].u.operand;
36158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool result = jsLess(callFrame, src1, src2);
3617635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
36188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!result) {
36208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vPC += target;
3621635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
36228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
36238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3624cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_jnless);
3625635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
36268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3627643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    DEFINE_OPCODE(op_jless) {
3628643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        /* jless src1(r) src2(r) target(offset)
3629643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
3630643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           Checks whether register src1 is less than register src2, as
3631643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           with the ECMAScript '<' operator, and then jumps to offset
3632643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           target from the current instruction, if and only if the
3633643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           result of the comparison is true.
3634643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        */
3635643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        JSValue src1 = callFrame->r(vPC[1].u.operand).jsValue();
3636643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        JSValue src2 = callFrame->r(vPC[2].u.operand).jsValue();
3637643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        int target = vPC[3].u.operand;
3638643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
3639643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        bool result = jsLess(callFrame, src1, src2);
3640643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        CHECK_FOR_EXCEPTION();
3641643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
3642643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (result) {
3643643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            vPC += target;
3644643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            NEXT_INSTRUCTION();
3645643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
3646643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
3647643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        vPC += OPCODE_LENGTH(op_jless);
3648643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        NEXT_INSTRUCTION();
3649643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
36505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    DEFINE_OPCODE(op_jnlesseq) {
36515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        /* jnlesseq src1(r) src2(r) target(offset)
36525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
36535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian           Checks whether register src1 is less than or equal to
36545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian           register src2, as with the ECMAScript '<=' operator,
36555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian           and then jumps to offset target from the current instruction,
36565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian           if and only if theresult of the comparison is false.
36575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        */
3658cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[1].u.operand).jsValue();
3659cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[2].u.operand).jsValue();
3660cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[3].u.operand;
36615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
36625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        bool result = jsLessEq(callFrame, src1, src2);
36635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        CHECK_FOR_EXCEPTION();
36645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
36655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (!result) {
36665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            vPC += target;
36675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            NEXT_INSTRUCTION();
36685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
36695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
3670cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_jnlesseq);
36715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        NEXT_INSTRUCTION();
36725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
367321939df44de1705786c545cd1bf519d47250322dBen Murdoch    DEFINE_OPCODE(op_jlesseq) {
367421939df44de1705786c545cd1bf519d47250322dBen Murdoch        /* jlesseq src1(r) src2(r) target(offset)
367521939df44de1705786c545cd1bf519d47250322dBen Murdoch
367621939df44de1705786c545cd1bf519d47250322dBen Murdoch         Checks whether register src1 is less than or equal to
367721939df44de1705786c545cd1bf519d47250322dBen Murdoch         register src2, as with the ECMAScript '<=' operator,
367821939df44de1705786c545cd1bf519d47250322dBen Murdoch         and then jumps to offset target from the current instruction,
367921939df44de1705786c545cd1bf519d47250322dBen Murdoch         if and only if the result of the comparison is true.
368021939df44de1705786c545cd1bf519d47250322dBen Murdoch         */
368121939df44de1705786c545cd1bf519d47250322dBen Murdoch        JSValue src1 = callFrame->r(vPC[1].u.operand).jsValue();
368221939df44de1705786c545cd1bf519d47250322dBen Murdoch        JSValue src2 = callFrame->r(vPC[2].u.operand).jsValue();
368321939df44de1705786c545cd1bf519d47250322dBen Murdoch        int target = vPC[3].u.operand;
368421939df44de1705786c545cd1bf519d47250322dBen Murdoch
368521939df44de1705786c545cd1bf519d47250322dBen Murdoch        bool result = jsLessEq(callFrame, src1, src2);
368621939df44de1705786c545cd1bf519d47250322dBen Murdoch        CHECK_FOR_EXCEPTION();
368721939df44de1705786c545cd1bf519d47250322dBen Murdoch
368821939df44de1705786c545cd1bf519d47250322dBen Murdoch        if (result) {
368921939df44de1705786c545cd1bf519d47250322dBen Murdoch            vPC += target;
369021939df44de1705786c545cd1bf519d47250322dBen Murdoch            NEXT_INSTRUCTION();
369121939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
369221939df44de1705786c545cd1bf519d47250322dBen Murdoch
369321939df44de1705786c545cd1bf519d47250322dBen Murdoch        vPC += OPCODE_LENGTH(op_jlesseq);
369421939df44de1705786c545cd1bf519d47250322dBen Murdoch        NEXT_INSTRUCTION();
369521939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
3696635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_switch_imm) {
36978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* switch_imm tableIndex(n) defaultOffset(offset) scrutinee(r)
36988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Performs a range checked switch on the scrutinee value, using
37008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the tableIndex-th immediate switch jump table.  If the scrutinee value
37018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           is an immediate number in the range covered by the referenced jump
37028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           table, and the value at jumpTable[scrutinee value] is non-zero, then
37038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           that value is used as the jump offset, otherwise defaultOffset is used.
37048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
3705cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int tableIndex = vPC[1].u.operand;
3706cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int defaultOffset = vPC[2].u.operand;
3707cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue scrutinee = callFrame->r(vPC[3].u.operand).jsValue();
37080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (scrutinee.isInt32())
3709e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            vPC += codeBlock->immediateSwitchJumpTable(tableIndex).offsetForValue(scrutinee.asInt32(), defaultOffset);
37108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
37118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            double value;
37128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            int32_t intValue;
37138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (scrutinee.getNumber(value) && ((intValue = static_cast<int32_t>(value)) == value))
3714e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                vPC += codeBlock->immediateSwitchJumpTable(tableIndex).offsetForValue(intValue, defaultOffset);
3715635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            else
3716635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                vPC += defaultOffset;
37178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3718635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
37198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3720635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_switch_char) {
37218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* switch_char tableIndex(n) defaultOffset(offset) scrutinee(r)
37228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Performs a range checked switch on the scrutinee value, using
37248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the tableIndex-th character switch jump table.  If the scrutinee value
37258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           is a single character string in the range covered by the referenced jump
37268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           table, and the value at jumpTable[scrutinee value] is non-zero, then
37278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           that value is used as the jump offset, otherwise defaultOffset is used.
37288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
3729cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int tableIndex = vPC[1].u.operand;
3730cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int defaultOffset = vPC[2].u.operand;
3731cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue scrutinee = callFrame->r(vPC[3].u.operand).jsValue();
3732635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (!scrutinee.isString())
37338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vPC += defaultOffset;
37348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
3735f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            StringImpl* value = asString(scrutinee)->value(callFrame).impl();
3736692e5dbf12901edacf14812a6fae25462920af42Steve Block            if (value->length() != 1)
37378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                vPC += defaultOffset;
37388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
3739e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                vPC += codeBlock->characterSwitchJumpTable(tableIndex).offsetForValue(value->characters()[0], defaultOffset);
37408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3741635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
37428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3743635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_switch_string) {
37448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* switch_string tableIndex(n) defaultOffset(offset) scrutinee(r)
37458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Performs a sparse hashmap based switch on the value in the scrutinee
37478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           register, using the tableIndex-th string switch jump table.  If the
37488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           scrutinee value is a string that exists as a key in the referenced
37498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           jump table, then the value associated with the string is used as the
37508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           jump offset, otherwise defaultOffset is used.
37518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
3752cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int tableIndex = vPC[1].u.operand;
3753cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int defaultOffset = vPC[2].u.operand;
3754cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue scrutinee = callFrame->r(vPC[3].u.operand).jsValue();
3755635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (!scrutinee.isString())
37568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vPC += defaultOffset;
37578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
3758f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            vPC += codeBlock->stringSwitchJumpTable(tableIndex).offsetForValue(asString(scrutinee)->value(callFrame).impl(), defaultOffset);
3759635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
37608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3761635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_new_func) {
37628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* new_func dst(r) func(f)
37638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Constructs a new Function instance from function func and
37658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the current scope chain using the original Function
37668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           constructor, using the rules for function declarations, and
37678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           puts the result in register dst.
37688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3769cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
3770cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int func = vPC[2].u.operand;
3771bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        int shouldCheck = vPC[3].u.operand;
3772a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT(codeBlock->codeType() != FunctionCode || !codeBlock->needsFullScopeChain() || callFrame->r(codeBlock->activationRegister()).jsValue());
3773bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!shouldCheck || !callFrame->r(dst).jsValue())
37744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = JSValue(codeBlock->functionDecl(func)->make(callFrame, callFrame->scopeChain()));
37758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3776cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_new_func);
3777635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
37788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3779635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_new_func_exp) {
37808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* new_func_exp dst(r) func(f)
37818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Constructs a new Function instance from function func and
37838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the current scope chain using the original Function
37848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           constructor, using the rules for function expressions, and
37858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           puts the result in register dst.
37868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3787cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
3788cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int funcIndex = vPC[2].u.operand;
3789a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
3790a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT(codeBlock->codeType() != FunctionCode || !codeBlock->needsFullScopeChain() || callFrame->r(codeBlock->activationRegister()).jsValue());
3791e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        FunctionExecutable* function = codeBlock->functionExpr(funcIndex);
3792231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        JSFunction* func = function->make(callFrame, callFrame->scopeChain());
3793231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
3794231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        /*
3795231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            The Identifier in a FunctionExpression can be referenced from inside
3796231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            the FunctionExpression's FunctionBody to allow the function to call
3797231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            itself recursively. However, unlike in a FunctionDeclaration, the
3798231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            Identifier in a FunctionExpression cannot be referenced from and
3799231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            does not affect the scope enclosing the FunctionExpression.
3800231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block         */
3801231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (!function->name().isNull()) {
3802231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            JSStaticScopeObject* functionScopeObject = new (callFrame) JSStaticScopeObject(callFrame, function->name(), func, ReadOnly | DontDelete);
380381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            func->setScope(*globalData, func->scope()->push(functionScopeObject));
3804231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
3805231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
38064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = JSValue(func);
38078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3808cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_new_func_exp);
3809635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
38108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3811635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_call_eval) {
3812e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        /* call_eval func(r) argCount(n) registerOffset(n)
38138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Call a function named "eval" with no explicit "this" value
38158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           (which may therefore be the eval operator). If register
38168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           thisVal is the global object, and register func contains
38178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           that global object's original global eval function, then
38188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           perform the eval operator in local scope (interpreting
38198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the argument registers as for the "call"
38208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           opcode). Otherwise, act exactly as the "call" opcode would.
38218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
38228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3823e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int func = vPC[1].u.operand;
3824e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int argCount = vPC[2].u.operand;
3825e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int registerOffset = vPC[3].u.operand;
3826a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
3827a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT(codeBlock->codeType() != FunctionCode || !codeBlock->needsFullScopeChain() || callFrame->r(codeBlock->activationRegister()).jsValue());
38280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue funcVal = callFrame->r(func).jsValue();
38298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3830635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Register* newCallFrame = callFrame->registers() + registerOffset;
3831635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Register* argv = newCallFrame - RegisterFile::CallFrameHeaderSize - argCount;
38325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue thisValue = argv[0].jsValue();
383381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        JSGlobalObject* globalObject = callFrame->scopeChain()->globalObject.get();
3834635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3835635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (thisValue == globalObject && funcVal == globalObject->evalFunction()) {
3836e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = callEval(callFrame, registerFile, argv, argCount, registerOffset);
38372bde8e466a4451c7319e3a072d118917957d6554Steve Block            if ((exceptionValue = globalData->exception))
38388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                goto vm_throw;
3839e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            functionReturnValue = result;
38408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3841cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            vPC += OPCODE_LENGTH(op_call_eval);
3842635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
38438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3845635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // We didn't find the blessed version of eval, so process this
3846635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // instruction as a normal function call.
38478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // fall through to op_call
38488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3849635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_call) {
3850e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        /* call func(r) argCount(n) registerOffset(n)
38518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3852635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           Perform a function call.
3853635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3854635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           registerOffset is the distance the callFrame pointer should move
3855635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           before the VM initializes the new call frame's header.
3856635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3857635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           dst is where op_ret should store its result.
38588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
38598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3860e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int func = vPC[1].u.operand;
3861e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int argCount = vPC[2].u.operand;
3862e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int registerOffset = vPC[3].u.operand;
38638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue v = callFrame->r(func).jsValue();
38658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CallData callData;
3867545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        CallType callType = getCallData(v, callData);
38688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (callType == CallTypeJS) {
38708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScopeChainNode* callDataScopeChain = callData.js.scopeChain;
3871967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
3872967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            JSObject* error = callData.js.functionExecutable->compileForCall(callFrame, callDataScopeChain);
3873967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            if (UNLIKELY(!!error)) {
3874967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch                exceptionValue = error;
3875967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch                goto vm_throw;
3876967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            }
38778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CallFrame* previousCallFrame = callFrame;
3879967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            CodeBlock* newCodeBlock = &callData.js.functionExecutable->generatedBytecodeForCall();
3880967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            callFrame = slideRegisterWindowForCall(newCodeBlock, registerFile, callFrame, registerOffset, argCount);
38818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (UNLIKELY(!callFrame)) {
38828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                callFrame = previousCallFrame;
38838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                exceptionValue = createStackOverflowError(callFrame);
38848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                goto vm_throw;
38858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
38868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38875af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            callFrame->init(newCodeBlock, vPC + OPCODE_LENGTH(op_call), callDataScopeChain, previousCallFrame, argCount, asFunction(v));
3888e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            codeBlock = newCodeBlock;
3889e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            ASSERT(codeBlock == callFrame->codeBlock());
3890635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            vPC = newCodeBlock->instructions().begin();
38918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(OPCODE_STATS)
38938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            OpcodeStats::resetLastInstruction();
38948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
38958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3896635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
38978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (callType == CallTypeHost) {
39008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScopeChainNode* scopeChain = callFrame->scopeChain();
39018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CallFrame* newCallFrame = CallFrame::create(callFrame->registers() + registerOffset);
390206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            if (!registerFile->grow(newCallFrame->registers())) {
390306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                exceptionValue = createStackOverflowError(callFrame);
390406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                goto vm_throw;
390506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            }
390606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
39075af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            newCallFrame->init(0, vPC + OPCODE_LENGTH(op_call), scopeChain, callFrame, argCount, asObject(v));
39088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSValue returnValue;
39108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            {
3911231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                SamplingTool::HostCallRecord callRecord(m_sampler.get());
3912545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                returnValue = JSValue::decode(callData.native.function(newCallFrame));
39138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3914635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
39158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3916e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            functionReturnValue = returnValue;
39178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3918cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            vPC += OPCODE_LENGTH(op_call);
3919635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
39208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
39218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(callType == CallTypeNone);
39238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        exceptionValue = createNotAFunctionError(callFrame, v);
39258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        goto vm_throw;
39268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
39275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    DEFINE_OPCODE(op_load_varargs) {
3928cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int argCountDst = vPC[1].u.operand;
3929cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int argsOffset = vPC[2].u.operand;
39305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
39310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue arguments = callFrame->r(argsOffset).jsValue();
3932ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        uint32_t argCount = 0;
39335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (!arguments) {
39345af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            argCount = (uint32_t)(callFrame->argumentCount());
3935ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            argCount = min<uint32_t>(argCount, Arguments::MaxArguments);
39365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            int32_t sizeDelta = argsOffset + argCount + RegisterFile::CallFrameHeaderSize;
39375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            Register* newEnd = callFrame->registers() + sizeDelta;
39385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            if (!registerFile->grow(newEnd) || ((newEnd - callFrame->registers()) != sizeDelta)) {
39395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                exceptionValue = createStackOverflowError(callFrame);
39405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                goto vm_throw;
39415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            }
39425af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            ASSERT(!asFunction(callFrame->callee())->isHostFunction());
3943e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            int32_t expectedParams = asFunction(callFrame->callee())->jsExecutable()->parameterCount();
3944e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            int32_t inplaceArgs = min(static_cast<int32_t>(argCount), expectedParams);
3945e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            int32_t i = 0;
39465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            Register* argStore = callFrame->registers() + argsOffset;
39475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
39485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            // First step is to copy the "expected" parameters from their normal location relative to the callframe
39495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            for (; i < inplaceArgs; i++)
39505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                argStore[i] = callFrame->registers()[i - RegisterFile::CallFrameHeaderSize - expectedParams];
39515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            // Then we copy any additional arguments that may be further up the stack ('-1' to account for 'this')
3952e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            for (; i < static_cast<int32_t>(argCount); i++)
3953e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                argStore[i] = callFrame->registers()[i - RegisterFile::CallFrameHeaderSize - expectedParams - static_cast<int32_t>(argCount) - 1];
39545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        } else if (!arguments.isUndefinedOrNull()) {
39555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            if (!arguments.isObject()) {
39566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                exceptionValue = createInvalidParamError(callFrame, "Function.prototype.apply", arguments);
39575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                goto vm_throw;
39585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            }
395981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (asObject(arguments)->classInfo() == &Arguments::s_info) {
39605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                Arguments* args = asArguments(arguments);
39615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                argCount = args->numProvidedArguments(callFrame);
3962ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                argCount = min<uint32_t>(argCount, Arguments::MaxArguments);
39635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                int32_t sizeDelta = argsOffset + argCount + RegisterFile::CallFrameHeaderSize;
39645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                Register* newEnd = callFrame->registers() + sizeDelta;
39655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                if (!registerFile->grow(newEnd) || ((newEnd - callFrame->registers()) != sizeDelta)) {
39665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    exceptionValue = createStackOverflowError(callFrame);
39675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    goto vm_throw;
39685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                }
39695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                args->copyToRegisters(callFrame, callFrame->registers() + argsOffset, argCount);
39705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            } else if (isJSArray(&callFrame->globalData(), arguments)) {
39715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                JSArray* array = asArray(arguments);
39725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                argCount = array->length();
3973ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                argCount = min<uint32_t>(argCount, Arguments::MaxArguments);
39745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                int32_t sizeDelta = argsOffset + argCount + RegisterFile::CallFrameHeaderSize;
39755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                Register* newEnd = callFrame->registers() + sizeDelta;
39765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                if (!registerFile->grow(newEnd) || ((newEnd - callFrame->registers()) != sizeDelta)) {
39775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    exceptionValue = createStackOverflowError(callFrame);
39785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    goto vm_throw;
39795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                }
39805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                array->copyToRegisters(callFrame, callFrame->registers() + argsOffset, argCount);
398181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            } else if (asObject(arguments)->inherits(&JSArray::s_info)) {
39825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                JSObject* argObject = asObject(arguments);
39835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                argCount = argObject->get(callFrame, callFrame->propertyNames().length).toUInt32(callFrame);
3984ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                argCount = min<uint32_t>(argCount, Arguments::MaxArguments);
39855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                int32_t sizeDelta = argsOffset + argCount + RegisterFile::CallFrameHeaderSize;
39865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                Register* newEnd = callFrame->registers() + sizeDelta;
39875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                if (!registerFile->grow(newEnd) || ((newEnd - callFrame->registers()) != sizeDelta)) {
39885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    exceptionValue = createStackOverflowError(callFrame);
39895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    goto vm_throw;
39905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                }
39915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                Register* argsBuffer = callFrame->registers() + argsOffset;
3992ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                for (uint32_t i = 0; i < argCount; ++i) {
39935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    argsBuffer[i] = asObject(arguments)->get(callFrame, i);
39945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    CHECK_FOR_EXCEPTION();
39955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                }
39965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            } else {
39976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                exceptionValue = createInvalidParamError(callFrame, "Function.prototype.apply", arguments);
3998bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                goto vm_throw;
39995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            }
40005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
40015f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        CHECK_FOR_EXCEPTION();
40024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(argCountDst) = Register::withInt(argCount + 1);
4003cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_load_varargs);
40045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        NEXT_INSTRUCTION();
40055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
40065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    DEFINE_OPCODE(op_call_varargs) {
4007e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        /* call_varargs func(r) argCountReg(r) baseRegisterOffset(n)
40085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
40095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian         Perform a function call with a dynamic set of arguments.
40105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
40115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian         registerOffset is the distance the callFrame pointer should move
40125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian         before the VM initializes the new call frame's header, excluding
40135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian         space for arguments.
40145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
40155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian         dst is where op_ret should store its result.
40165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian         */
40175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
4018e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int func = vPC[1].u.operand;
4019e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int argCountReg = vPC[2].u.operand;
4020e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int registerOffset = vPC[3].u.operand;
40215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
40220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue v = callFrame->r(func).jsValue();
40230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        int argCount = callFrame->r(argCountReg).i();
40245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        registerOffset += argCount;
40255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        CallData callData;
4026545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        CallType callType = getCallData(v, callData);
40275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
40285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (callType == CallTypeJS) {
40295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            ScopeChainNode* callDataScopeChain = callData.js.scopeChain;
4030967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
4031967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            JSObject* error = callData.js.functionExecutable->compileForCall(callFrame, callDataScopeChain);
4032967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            if (UNLIKELY(!!error)) {
4033967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch                exceptionValue = error;
4034967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch                goto vm_throw;
4035967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            }
4036967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
40375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            CallFrame* previousCallFrame = callFrame;
4038967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            CodeBlock* newCodeBlock = &callData.js.functionExecutable->generatedBytecodeForCall();
4039967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            callFrame = slideRegisterWindowForCall(newCodeBlock, registerFile, callFrame, registerOffset, argCount);
40405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            if (UNLIKELY(!callFrame)) {
40415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                callFrame = previousCallFrame;
40425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                exceptionValue = createStackOverflowError(callFrame);
40435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                goto vm_throw;
40445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            }
4045967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
40465af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            callFrame->init(newCodeBlock, vPC + OPCODE_LENGTH(op_call_varargs), callDataScopeChain, previousCallFrame, argCount, asFunction(v));
4047e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            codeBlock = newCodeBlock;
4048e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            ASSERT(codeBlock == callFrame->codeBlock());
40495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            vPC = newCodeBlock->instructions().begin();
40505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
40515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(OPCODE_STATS)
40525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            OpcodeStats::resetLastInstruction();
40535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif
40545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
40555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            NEXT_INSTRUCTION();
40565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
40575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
40585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (callType == CallTypeHost) {
40595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            ScopeChainNode* scopeChain = callFrame->scopeChain();
40605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            CallFrame* newCallFrame = CallFrame::create(callFrame->registers() + registerOffset);
406106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            if (!registerFile->grow(newCallFrame->registers())) {
406206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                exceptionValue = createStackOverflowError(callFrame);
406306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                goto vm_throw;
406406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            }
40655af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            newCallFrame->init(0, vPC + OPCODE_LENGTH(op_call_varargs), scopeChain, callFrame, argCount, asObject(v));
40665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
40675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSValue returnValue;
40685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            {
4069231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                SamplingTool::HostCallRecord callRecord(m_sampler.get());
4070545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                returnValue = JSValue::decode(callData.native.function(newCallFrame));
40715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            }
40725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            CHECK_FOR_EXCEPTION();
40735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
4074e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            functionReturnValue = returnValue;
40755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
4076cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            vPC += OPCODE_LENGTH(op_call_varargs);
40775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            NEXT_INSTRUCTION();
40785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
40795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
40805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        ASSERT(callType == CallTypeNone);
40815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
40826b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        exceptionValue = createNotAFunctionError(callFrame, v);
40835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        goto vm_throw;
40845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
4085635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_tear_off_activation) {
4086e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        /* tear_off_activation activation(r) arguments(r)
40878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4088e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           Copy locals and named parameters from the register file to the heap.
4089e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           Point the bindings in 'activation' and 'arguments' to this new backing
4090e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           store. (Note that 'arguments' may not have been created. If created,
4091e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           'arguments' already holds a copy of any extra / unnamed parameters.)
40928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4093e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           This opcode appears before op_ret in functions that require full scope chains.
40948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
40958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4096a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        int activation = vPC[1].u.operand;
4097a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        int arguments = vPC[2].u.operand;
4098e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        ASSERT(codeBlock->needsFullScopeChain());
4099a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        JSValue activationValue = callFrame->r(activation).jsValue();
4100a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (activationValue) {
410181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            asActivation(activationValue)->copyRegisters(*globalData);
4102a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
4103e14391e94c850b8bd03680c23b38978db68687a8John Reck            if (JSValue argumentsValue = callFrame->r(unmodifiedArgumentsRegister(arguments)).jsValue()) {
4104e14391e94c850b8bd03680c23b38978db68687a8John Reck                if (!codeBlock->isStrictMode())
41052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    asArguments(argumentsValue)->setActivation(*globalData, asActivation(activationValue));
4106e14391e94c850b8bd03680c23b38978db68687a8John Reck            }
4107e14391e94c850b8bd03680c23b38978db68687a8John Reck        } else if (JSValue argumentsValue = callFrame->r(unmodifiedArgumentsRegister(arguments)).jsValue()) {
4108a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (!codeBlock->isStrictMode())
410981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                asArguments(argumentsValue)->copyRegisters(*globalData);
4110a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
41118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4112cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_tear_off_activation);
4113635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
41148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4115635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_tear_off_arguments) {
4116e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        /* tear_off_arguments arguments(r)
41178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4118e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           Copy named parameters from the register file to the heap. Point the
4119e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           bindings in 'arguments' to this new backing store. (Note that
4120e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           'arguments' may not have been created. If created, 'arguments' already
4121e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           holds a copy of any extra / unnamed parameters.)
41228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4123e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           This opcode appears before op_ret in functions that don't require full
4124e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           scope chains, but do use 'arguments'.
41258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
41268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4127e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int src1 = vPC[1].u.operand;
4128e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        ASSERT(!codeBlock->needsFullScopeChain() && codeBlock->ownerExecutable()->usesArguments());
41290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4130e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        if (JSValue arguments = callFrame->r(unmodifiedArgumentsRegister(src1)).jsValue())
413181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            asArguments(arguments)->copyRegisters(*globalData);
41328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4133cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_tear_off_arguments);
4134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
41358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4136635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_ret) {
41378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* ret result(r)
41388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Return register result as the return value of the current
4140e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           function call, writing it into functionReturnValue.
4141e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           In addition, unwind one call frame and restore the scope
4142e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           chain, code block instruction pointer and register base
4143e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           to those of the calling function.
4144e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        */
4145e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4146e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int result = vPC[1].u.operand;
4147e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4148e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        JSValue returnValue = callFrame->r(result).jsValue();
4149e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4150e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        vPC = callFrame->returnVPC();
4151e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        callFrame = callFrame->callerFrame();
4152e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4153e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        if (callFrame->hasHostCallFrameFlag())
4154e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            return returnValue;
4155e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4156e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        functionReturnValue = returnValue;
4157e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        codeBlock = callFrame->codeBlock();
4158e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        ASSERT(codeBlock == callFrame->codeBlock());
4159e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4160e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        NEXT_INSTRUCTION();
4161e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    }
4162e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    DEFINE_OPCODE(op_call_put_result) {
4163e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        /* op_call_put_result result(r)
4164e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4165e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           Move call result from functionReturnValue to caller's
4166e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           expected return value register.
4167e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        */
4168e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
41694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(vPC[1].u.operand) = functionReturnValue;
4170e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4171e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        vPC += OPCODE_LENGTH(op_call_put_result);
4172e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        NEXT_INSTRUCTION();
4173e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    }
4174e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    DEFINE_OPCODE(op_ret_object_or_this) {
4175e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        /* ret result(r)
4176e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4177e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           Return register result as the return value of the current
41788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           function call, writing it into the caller's expected return
41798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           value register. In addition, unwind one call frame and
41808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           restore the scope chain, code block instruction pointer and
41818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           register base to those of the calling function.
41828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
41838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4184cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int result = vPC[1].u.operand;
41858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue returnValue = callFrame->r(result).jsValue();
41878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4188e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        if (UNLIKELY(!returnValue.isObject()))
4189e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            returnValue = callFrame->r(vPC[2].u.operand).jsValue();
4190e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4191e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        vPC = callFrame->returnVPC();
41928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        callFrame = callFrame->callerFrame();
41935af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
41948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (callFrame->hasHostCallFrameFlag())
41958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return returnValue;
41968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4197e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        functionReturnValue = returnValue;
4198e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        codeBlock = callFrame->codeBlock();
4199e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        ASSERT(codeBlock == callFrame->codeBlock());
42008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4201635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
42028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4203635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_enter) {
42048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* enter
42058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4206e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           Initializes local variables to undefined. If the code block requires
4207e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           an activation, enter_with_activation is used instead.
42088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4209e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           This opcode appears only at the beginning of a code block.
42108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
42118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        size_t i = 0;
4213635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        for (size_t count = codeBlock->m_numVars; i < count; ++i)
42144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(i) = jsUndefined();
42158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4216cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_enter);
4217635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
42188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4219a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    DEFINE_OPCODE(op_create_activation) {
4220a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        /* create_activation dst(r)
42218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4222a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch           If the activation object for this callframe has not yet been created,
4223a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch           this creates it and writes it back to dst.
42248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
42258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4226a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        int activationReg = vPC[1].u.operand;
4227a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!callFrame->r(activationReg).jsValue()) {
4228a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            JSActivation* activation = new (globalData) JSActivation(callFrame, static_cast<FunctionExecutable*>(codeBlock->ownerExecutable()));
4229a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            callFrame->r(activationReg) = JSValue(activation);
423081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            callFrame->setScopeChain(callFrame->scopeChain()->push(activation));
4231a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
4232a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        vPC += OPCODE_LENGTH(op_create_activation);
4233635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
42348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
42355af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    DEFINE_OPCODE(op_get_callee) {
42365af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        /* op_get_callee callee(r)
42375af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
42385af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke           Move callee into a register.
42395af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        */
42405af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
42414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(vPC[1].u.operand) = JSValue(callFrame->callee());
42425af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
42435af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        vPC += OPCODE_LENGTH(op_get_callee);
42445af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        NEXT_INSTRUCTION();
42455af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    }
42465af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    DEFINE_OPCODE(op_create_this) {
42475af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        /* op_create_this this(r) proto(r)
42485af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
42495af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke           Allocate an object as 'this', fr use in construction.
42505af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
42515af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke           This opcode should only be used at the beginning of a code
42525af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke           block.
42535af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        */
42545af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
42555af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        int thisRegister = vPC[1].u.operand;
42565af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        int protoRegister = vPC[2].u.operand;
42575af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
42585af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        JSFunction* constructor = asFunction(callFrame->callee());
42595af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#if !ASSERT_DISABLED
42605af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        ConstructData constructData;
42615af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        ASSERT(constructor->getConstructData(constructData) == ConstructTypeJS);
42625af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#endif
42635af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
42645af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        Structure* structure;
42655af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        JSValue proto = callFrame->r(protoRegister).jsValue();
42665af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        if (proto.isObject())
42672bde8e466a4451c7319e3a072d118917957d6554Steve Block            structure = asObject(proto)->inheritorID(callFrame->globalData());
42685af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        else
426981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            structure = constructor->scope()->globalObject->emptyObjectStructure();
427081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        callFrame->uncheckedR(thisRegister) = constructEmptyObject(callFrame, structure);
42715af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
42725af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        vPC += OPCODE_LENGTH(op_create_this);
42735af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        NEXT_INSTRUCTION();
42745af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    }
4275635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_convert_this) {
42768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* convert_this this(r)
42778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Takes the value in the 'this' register, converts it to a
42798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           value that is suitable for use as the 'this' value, and
42808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           stores it in the 'this' register. This opcode is emitted
42818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           to avoid doing the conversion in the caller unnecessarily.
42828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           This opcode should only be used at the beginning of a code
42848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           block.
42858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
42868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4287cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int thisRegister = vPC[1].u.operand;
42880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue thisVal = callFrame->r(thisRegister).jsValue();
4289635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (thisVal.needsThisConversion())
42904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(thisRegister) = JSValue(thisVal.toThisObject(callFrame));
42918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4292cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_convert_this);
4293635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
42948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4295a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    DEFINE_OPCODE(op_convert_this_strict) {
4296a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        /* convert_this_strict this(r)
4297a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
4298a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch         Takes the value in the 'this' register, and converts it to
4299a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch         its "this" form if (and only if) "this" is an object with a
4300a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch         custom this conversion
4301a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
4302a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch         This opcode should only be used at the beginning of a code
4303a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch         block.
4304a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch         */
4305a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
4306a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        int thisRegister = vPC[1].u.operand;
4307a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        JSValue thisVal = callFrame->r(thisRegister).jsValue();
4308a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (thisVal.isObject() && thisVal.needsThisConversion())
43094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(thisRegister) = JSValue(thisVal.toStrictThisObject(callFrame));
4310a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
4311a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        vPC += OPCODE_LENGTH(op_convert_this_strict);
4312a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        NEXT_INSTRUCTION();
4313a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
4314bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    DEFINE_OPCODE(op_init_lazy_reg) {
4315bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        /* init_lazy_reg dst(r)
43168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4317bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen           Initialises dst(r) to JSValue().
43188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4319e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           This opcode appears only at the beginning of a code block.
43205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian         */
4321e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int dst = vPC[1].u.operand;
4322e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
43234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = JSValue();
4324bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        vPC += OPCODE_LENGTH(op_init_lazy_reg);
43255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        NEXT_INSTRUCTION();
43265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
43275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    DEFINE_OPCODE(op_create_arguments) {
4328e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        /* create_arguments dst(r)
43298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian           Creates the 'arguments' object and places it in both the
43315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian           'arguments' call frame slot and the local 'arguments'
43325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian           register, if it has not already been initialised.
43335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian         */
43348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4335e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int dst = vPC[1].u.operand;
4336e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4337e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        if (!callFrame->r(dst).jsValue()) {
4338e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            Arguments* arguments = new (globalData) Arguments(callFrame);
43394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = JSValue(arguments);
43404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(unmodifiedArgumentsRegister(dst)) = JSValue(arguments);
4341e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
4342cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_create_arguments);
4343635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
43448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4345635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_construct) {
4346e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        /* construct func(r) argCount(n) registerOffset(n) proto(r) thisRegister(r)
43478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4348635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           Invoke register "func" as a constructor. For JS
43498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           functions, the calling convention is exactly as for the
43508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           "call" opcode, except that the "this" value is a newly
4351635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           created Object. For native constructors, no "this"
4352635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           value is passed. In either case, the argCount and registerOffset
43538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           registers are interpreted as for the "call" opcode.
43548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4355635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           Register proto must contain the prototype property of
4356635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           register func. This is to enable polymorphic inline
43578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           caching of this lookup.
43588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
43598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4360e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int func = vPC[1].u.operand;
4361e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int argCount = vPC[2].u.operand;
4362e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int registerOffset = vPC[3].u.operand;
43638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue v = callFrame->r(func).jsValue();
43658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ConstructData constructData;
4367545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        ConstructType constructType = getConstructData(v, constructData);
43688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (constructType == ConstructTypeJS) {
43708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScopeChainNode* callDataScopeChain = constructData.js.scopeChain;
43718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4372967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            JSObject* error = constructData.js.functionExecutable->compileForConstruct(callFrame, callDataScopeChain);
4373967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            if (UNLIKELY(!!error)) {
4374967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch                exceptionValue = error;
4375967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch                goto vm_throw;
4376967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            }
437706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
4378967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            CallFrame* previousCallFrame = callFrame;
4379967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            CodeBlock* newCodeBlock = &constructData.js.functionExecutable->generatedBytecodeForConstruct();
4380967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            callFrame = slideRegisterWindowForCall(newCodeBlock, registerFile, callFrame, registerOffset, argCount);
43818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (UNLIKELY(!callFrame)) {
43828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                callFrame = previousCallFrame;
43838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                exceptionValue = createStackOverflowError(callFrame);
43848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                goto vm_throw;
43858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
43868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43875af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            callFrame->init(newCodeBlock, vPC + OPCODE_LENGTH(op_construct), callDataScopeChain, previousCallFrame, argCount, asFunction(v));
4388e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            codeBlock = newCodeBlock;
4389635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            vPC = newCodeBlock->instructions().begin();
43908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(OPCODE_STATS)
43918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            OpcodeStats::resetLastInstruction();
43928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
43938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4394635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
43958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
43968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (constructType == ConstructTypeHost) {
43988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScopeChainNode* scopeChain = callFrame->scopeChain();
43998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CallFrame* newCallFrame = CallFrame::create(callFrame->registers() + registerOffset);
440006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            if (!registerFile->grow(newCallFrame->registers())) {
440106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                exceptionValue = createStackOverflowError(callFrame);
440206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                goto vm_throw;
440306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            }
4404545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            newCallFrame->init(0, vPC + OPCODE_LENGTH(op_construct), scopeChain, callFrame, argCount, asObject(v));
44058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSValue returnValue;
44078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            {
4408231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                SamplingTool::HostCallRecord callRecord(m_sampler.get());
4409545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                returnValue = JSValue::decode(constructData.native.function(newCallFrame));
44108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
4411635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
4412545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            functionReturnValue = returnValue;
44138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4414cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            vPC += OPCODE_LENGTH(op_construct);
4415635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
44168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
44178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(constructType == ConstructTypeNone);
44198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        exceptionValue = createNotAConstructorError(callFrame, v);
44218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        goto vm_throw;
44228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
44235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    DEFINE_OPCODE(op_strcat) {
4424bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        /* strcat dst(r) src(r) count(n)
4425bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
4426bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen           Construct a new String instance using the original
4427bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen           constructor, and puts the result in register dst.
4428bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen           The string will be the result of concatenating count
4429bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen           strings with values taken from registers starting at
4430bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen           register src.
4431bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        */
4432cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
4433cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
4434cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int count = vPC[3].u.operand;
44355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
44364576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = concatenateStrings(callFrame, &callFrame->registers()[src], count);
4437643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        CHECK_FOR_EXCEPTION();
4438cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_strcat);
44395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
44405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        NEXT_INSTRUCTION();
44415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
44425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    DEFINE_OPCODE(op_to_primitive) {
4443cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
4444cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
44455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
44464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = callFrame->r(src).jsValue().toPrimitive(callFrame);
4447cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_to_primitive);
44485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
44495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        NEXT_INSTRUCTION();
44505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
4451635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_push_scope) {
44528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* push_scope scope(r)
44538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Converts register scope to object, and pushes it onto the top
4455635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           of the current scope chain.  The contents of the register scope
4456635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           are replaced by the result of toObject conversion of the scope.
44578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
4458cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int scope = vPC[1].u.operand;
44590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue v = callFrame->r(scope).jsValue();
4460635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        JSObject* o = v.toObject(callFrame);
4461635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
44628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(scope) = JSValue(o);
44648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        callFrame->setScopeChain(callFrame->scopeChain()->push(o));
44658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4466cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_push_scope);
4467635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
44688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4469635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_pop_scope) {
44708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* pop_scope
44718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Removes the top item from the current scope chain.
44738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
44748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        callFrame->setScopeChain(callFrame->scopeChain()->pop());
44758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4476cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_pop_scope);
4477635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
44788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4479635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_pnames) {
4480cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        /* get_pnames dst(r) base(r) i(n) size(n) breakTarget(offset)
44818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Creates a property name list for register base and puts it
4483cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block           in register dst, initializing i and size for iteration. If
4484cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block           base is undefined or null, jumps to breakTarget.
44858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
4486cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
4487cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int base = vPC[2].u.operand;
4488cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int i = vPC[3].u.operand;
4489cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int size = vPC[4].u.operand;
4490cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int breakTarget = vPC[5].u.operand;
44918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4492cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue v = callFrame->r(base).jsValue();
4493cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        if (v.isUndefinedOrNull()) {
4494cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            vPC += breakTarget;
4495cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            NEXT_INSTRUCTION();
4496cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        }
4497cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
4498cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSObject* o = v.toObject(callFrame);
4499cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        Structure* structure = o->structure();
4500cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSPropertyNameIterator* jsPropertyNameIterator = structure->enumerationCache();
4501cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        if (!jsPropertyNameIterator || jsPropertyNameIterator->cachedPrototypeChain() != structure->prototypeChain(callFrame))
4502cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            jsPropertyNameIterator = JSPropertyNameIterator::create(callFrame, o);
4503cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
45044576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsPropertyNameIterator;
45054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(base) = JSValue(o);
45064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(i) = Register::withInt(0);
45074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(size) = Register::withInt(jsPropertyNameIterator->size());
4508cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_get_pnames);
4509635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
45108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4511635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_next_pname) {
4512cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        /* next_pname dst(r) base(r) i(n) size(n) iter(r) target(offset)
45138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4514cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block           Copies the next name from the property name list in
4515cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block           register iter to dst, then jumps to offset target. If there are no
4516cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block           names left, invalidates the iterator and continues to the next
45178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           instruction.
45188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
4519cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
4520cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int base = vPC[2].u.operand;
4521cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int i = vPC[3].u.operand;
4522cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int size = vPC[4].u.operand;
4523cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int iter = vPC[5].u.operand;
4524cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[6].u.operand;
45258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSPropertyNameIterator* it = callFrame->r(iter).propertyNameIterator();
4527cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        while (callFrame->r(i).i() != callFrame->r(size).i()) {
4528cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            JSValue key = it->get(callFrame, asObject(callFrame->r(base).jsValue()), callFrame->r(i).i());
4529e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            CHECK_FOR_EXCEPTION();
45304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(i) = Register::withInt(callFrame->r(i).i() + 1);
4531cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            if (key) {
4532cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                CHECK_FOR_TIMEOUT();
45334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                callFrame->uncheckedR(dst) = key;
4534cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                vPC += target;
4535cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                NEXT_INSTRUCTION();
4536cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            }
45378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
45388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4539cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_next_pname);
4540635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
45418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4542635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_jmp_scopes) {
45438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* jmp_scopes count(n) target(offset)
45448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Removes the a number of items from the current scope chain
45468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           specified by immediate number count, then jumps to offset
45478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           target.
45488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
4549cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int count = vPC[1].u.operand;
4550cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[2].u.operand;
45518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ScopeChainNode* tmp = callFrame->scopeChain();
45538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        while (count--)
45548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            tmp = tmp->pop();
45558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        callFrame->setScopeChain(tmp);
45568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC += target;
4558635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
45598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4560e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(COMPUTED_GOTO_INTERPRETER)
45618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Appease GCC
45628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    goto *(&&skip_new_scope);
45638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
4564635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_push_new_scope) {
45658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* new_scope dst(r) property(id) value(r)
45668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Constructs a new StaticScopeObject with property set to value.  That scope
45688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           object is then pushed onto the ScopeChain.  The scope object is then stored
45698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in dst for GC.
45708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
45718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        callFrame->setScopeChain(createExceptionScope(callFrame, vPC));
45728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4573cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_push_new_scope);
4574635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
45758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4576e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(COMPUTED_GOTO_INTERPRETER)
45778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    skip_new_scope:
45788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
4579635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_catch) {
45808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* catch ex(r)
45818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian           Retrieves the VM's current exception and puts it in register
45838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           ex. This is only valid after an exception has been raised,
45848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           and usually forms the beginning of an exception handler.
45858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
45868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(exceptionValue);
45878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(!globalData->exception);
4588cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int ex = vPC[1].u.operand;
45894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(ex) = exceptionValue;
45905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        exceptionValue = JSValue();
45918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4592cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_catch);
4593635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
45948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4595635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_throw) {
45968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* throw ex(r)
45978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Throws register ex as an exception. This involves three
45998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           steps: first, it is set as the current exception in the
46008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           VM's internal state, then the stack is unwound until an
46018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           exception handler or a native code boundary is found, and
46028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           then control resumes at the exception handler if any or
46038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           else the script returns control to the nearest native caller.
46048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
46058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4606cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int ex = vPC[1].u.operand;
46070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        exceptionValue = callFrame->r(ex).jsValue();
46088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        handler = throwException(callFrame, exceptionValue, vPC - codeBlock->instructions().begin());
4610e14391e94c850b8bd03680c23b38978db68687a8John Reck        if (!handler)
4611e14391e94c850b8bd03680c23b38978db68687a8John Reck            return throwError(callFrame, exceptionValue);
46128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4613e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        codeBlock = callFrame->codeBlock();
4614e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        vPC = codeBlock->instructions().begin() + handler->target;
4615635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
46168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
46176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    DEFINE_OPCODE(op_throw_reference_error) {
46186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        /* op_throw_reference_error message(k)
46198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner           Constructs a new reference Error instance using the
46216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner           original constructor, using constant message as the
46226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner           message string. The result is thrown.
46238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
46246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        UString message = callFrame->r(vPC[1].u.operand).jsValue().toString(callFrame);
46256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        exceptionValue = JSValue(createReferenceError(callFrame, message));
46266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        goto vm_throw;
46276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
4628635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_end) {
46298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* end result(r)
46308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Return register result as the value of a global or eval
46328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           program. Return control to the calling native code.
46338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
46348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4635cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int result = vPC[1].u.operand;
46360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return callFrame->r(result).jsValue();
46378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4638635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_put_getter) {
46398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* put_getter base(r) property(id) function(r)
46408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Sets register function on register base as the getter named
46428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           by identifier property. Base and function are assumed to be
46438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           objects as this op should only be used for getters defined
46448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in object literal form.
46458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Unlike many opcodes, this one does not write any output to
46478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the register file.
46488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
4649cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int base = vPC[1].u.operand;
4650cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int property = vPC[2].u.operand;
4651cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int function = vPC[3].u.operand;
46528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ASSERT(callFrame->r(base).jsValue().isObject());
46540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSObject* baseObj = asObject(callFrame->r(base).jsValue());
4655e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        Identifier& ident = codeBlock->identifier(property);
46560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ASSERT(callFrame->r(function).jsValue().isObject());
46570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        baseObj->defineGetter(callFrame, ident, asObject(callFrame->r(function).jsValue()));
46588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4659cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_put_getter);
4660635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
46618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4662635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_put_setter) {
46638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* put_setter base(r) property(id) function(r)
46648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Sets register function on register base as the setter named
46668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           by identifier property. Base and function are assumed to be
46678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           objects as this op should only be used for setters defined
46688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in object literal form.
46698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Unlike many opcodes, this one does not write any output to
46718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the register file.
46728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
4673cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int base = vPC[1].u.operand;
4674cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int property = vPC[2].u.operand;
4675cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int function = vPC[3].u.operand;
46768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ASSERT(callFrame->r(base).jsValue().isObject());
46780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSObject* baseObj = asObject(callFrame->r(base).jsValue());
4679e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        Identifier& ident = codeBlock->identifier(property);
46800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ASSERT(callFrame->r(function).jsValue().isObject());
4681231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        baseObj->defineSetter(callFrame, ident, asObject(callFrame->r(function).jsValue()), 0);
46828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4683cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_put_setter);
4684635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
46858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
46865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    DEFINE_OPCODE(op_method_check) {
46875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        vPC++;
46885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        NEXT_INSTRUCTION();
46895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
4690635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_jsr) {
46918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* jsr retAddrDst(r) target(offset)
46928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Places the address of the next instruction into the retAddrDst
46948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           register and jumps to offset target from the current instruction.
46958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
4696cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int retAddrDst = vPC[1].u.operand;
4697cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[2].u.operand;
4698cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        callFrame->r(retAddrDst) = vPC + OPCODE_LENGTH(op_jsr);
46998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC += target;
4701635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
47028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4703635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_sret) {
47048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* sret retAddrSrc(r)
47058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         Jumps to the address stored in the retAddrSrc register. This
47078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         differs from op_jmp because the target address is stored in a
47088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         register, not as an immediate.
47098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
4710cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int retAddrSrc = vPC[1].u.operand;
47110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        vPC = callFrame->r(retAddrSrc).vPC();
4712635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
47138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4714635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_debug) {
47158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* debug debugHookID(n) firstLine(n) lastLine(n)
47168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         Notifies the debugger of the current state of execution. This opcode
47188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         is only generated while the debugger is attached.
47198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
4720cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int debugHookID = vPC[1].u.operand;
4721cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int firstLine = vPC[2].u.operand;
4722cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int lastLine = vPC[3].u.operand;
47238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        debug(callFrame, static_cast<DebugHookID>(debugHookID), firstLine, lastLine);
47258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4726cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_debug);
4727635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
47288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4729635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_profile_will_call) {
47308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* op_profile_will_call function(r)
47318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         Notifies the profiler of the beginning of a function call. This opcode
47338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         is only generated if developer tools are enabled.
47348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
47358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int function = vPC[1].u.operand;
47368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (*enabledProfilerReference)
47380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            (*enabledProfilerReference)->willExecute(callFrame, callFrame->r(function).jsValue());
47398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4740cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_profile_will_call);
4741635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
47428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4743635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_profile_did_call) {
47448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* op_profile_did_call function(r)
47458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         Notifies the profiler of the end of a function call. This opcode
47478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         is only generated if developer tools are enabled.
47488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
47498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int function = vPC[1].u.operand;
47508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (*enabledProfilerReference)
47520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            (*enabledProfilerReference)->didExecute(callFrame, callFrame->r(function).jsValue());
47538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4754cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_profile_did_call);
4755635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
47568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
47578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    vm_throw: {
47585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        globalData->exception = JSValue();
47598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!tickCount) {
47608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // The exceptionValue is a lie! (GCC produces bad code for reasons I
47618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // cannot fathom if we don't assign to the exceptionValue before branching)
47628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            exceptionValue = createInterruptedExecutionException(globalData);
47638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
476481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        JSGlobalObject* globalObject = callFrame->lexicalGlobalObject();
47654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        handler = throwException(callFrame, exceptionValue, vPC - codeBlock->instructions().begin());
476681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (!handler) {
476781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // Can't use the callframe at this point as the scopechain, etc have
476881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // been released.
476981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return throwError(globalObject->globalExec(), exceptionValue);
477081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
4771635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
4772e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        codeBlock = callFrame->codeBlock();
4773e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        vPC = codeBlock->instructions().begin() + handler->target;
4774635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
47758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
47768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4777e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if !ENABLE(COMPUTED_GOTO_INTERPRETER)
47788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } // iterator loop ends
47798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
4780635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    #undef NEXT_INSTRUCTION
4781635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    #undef DEFINE_OPCODE
4782635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    #undef CHECK_FOR_EXCEPTION
47838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    #undef CHECK_FOR_TIMEOUT
4784e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif // ENABLE(INTERPRETER)
47858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
47868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47875f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue Interpreter::retrieveArguments(CallFrame* callFrame, JSFunction* function) const
47888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
47898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallFrame* functionCallFrame = findFunctionCallFrame(callFrame, function);
47908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!functionCallFrame)
47918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsNull();
47928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CodeBlock* codeBlock = functionCallFrame->codeBlock();
4794635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (codeBlock->usesArguments()) {
4795635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        ASSERT(codeBlock->codeType() == FunctionCode);
4796e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int argumentsRegister = codeBlock->argumentsRegister();
4797ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        int realArgumentsRegister = unmodifiedArgumentsRegister(argumentsRegister);
4798ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (JSValue arguments = functionCallFrame->uncheckedR(argumentsRegister).jsValue())
4799ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            return arguments;
4800ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        JSValue arguments = JSValue(new (callFrame) Arguments(functionCallFrame));
4801ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        functionCallFrame->r(argumentsRegister) = arguments;
4802ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        functionCallFrame->r(realArgumentsRegister) = arguments;
4803ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return arguments;
48048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
48058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4806e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    Arguments* arguments = new (functionCallFrame) Arguments(functionCallFrame);
480781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    arguments->copyRegisters(functionCallFrame->globalData());
48088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return arguments;
48098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
48108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4811e78cbe89e6f337f2f1fe40315be88f742b547151Steve BlockJSValue Interpreter::retrieveCaller(CallFrame* callFrame, JSFunction* function) const
48128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
48138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallFrame* functionCallFrame = findFunctionCallFrame(callFrame, function);
48148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!functionCallFrame)
48158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsNull();
48168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallFrame* callerFrame = functionCallFrame->callerFrame();
48188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (callerFrame->hasHostCallFrameFlag())
48198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsNull();
48208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue caller = callerFrame->callee();
48228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!caller)
48238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsNull();
48248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return caller;
48268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
48278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid Interpreter::retrieveLastCaller(CallFrame* callFrame, int& lineNumber, intptr_t& sourceID, UString& sourceURL, JSValue& function) const
48298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
48305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    function = JSValue();
48318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lineNumber = -1;
48328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sourceURL = UString();
48338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallFrame* callerFrame = callFrame->callerFrame();
48358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (callerFrame->hasHostCallFrameFlag())
48368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CodeBlock* callerCodeBlock = callerFrame->codeBlock();
48398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!callerCodeBlock)
48408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4841e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    unsigned bytecodeOffset = 0;
4842e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
4843e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (!callerFrame->globalData().canUseJIT())
48444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        bytecodeOffset = callerCodeBlock->bytecodeOffset(callFrame->returnVPC());
4845e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(JIT)
4846e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    else
48474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        bytecodeOffset = callerCodeBlock->bytecodeOffset(callFrame->returnPC());
4848e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
4849e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#else
48504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    bytecodeOffset = callerCodeBlock->bytecodeOffset(callFrame->returnPC());
4851e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
48524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    lineNumber = callerCodeBlock->lineNumberForBytecodeOffset(bytecodeOffset - 1);
4853231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    sourceID = callerCodeBlock->ownerExecutable()->sourceID();
4854231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    sourceURL = callerCodeBlock->ownerExecutable()->sourceURL();
48558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    function = callerFrame->callee();
48568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
48578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4858e78cbe89e6f337f2f1fe40315be88f742b547151Steve BlockCallFrame* Interpreter::findFunctionCallFrame(CallFrame* callFrame, JSFunction* function)
48598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
48608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (CallFrame* candidate = callFrame; candidate; candidate = candidate->callerFrame()->removeHostCallFrameFlag()) {
48618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (candidate->callee() == function)
48628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return candidate;
48638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
48648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
48658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
48668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4867231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid Interpreter::enableSampler()
4868231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
4869231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(OPCODE_SAMPLING)
4870231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!m_sampler) {
4871231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_sampler.set(new SamplingTool(this));
4872231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_sampler->setup();
4873231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
4874231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
4875231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
4876231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid Interpreter::dumpSampleData(ExecState* exec)
4877231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
4878231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(OPCODE_SAMPLING)
4879231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (m_sampler)
4880231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_sampler->dump(exec);
4881231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#else
4882231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    UNUSED_PARAM(exec);
4883231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
4884231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
4885231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid Interpreter::startSampling()
4886231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
4887231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(SAMPLING_THREAD)
4888231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!m_sampleEntryDepth)
4889231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        SamplingThread::start();
4890231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
4891231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_sampleEntryDepth++;
4892231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
4893231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
4894231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid Interpreter::stopSampling()
4895231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
4896231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(SAMPLING_THREAD)
4897231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_sampleEntryDepth--;
4898231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!m_sampleEntryDepth)
4899231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        SamplingThread::stop();
4900231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
4901231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
4902231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
49038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace JSC
4904