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;
1672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    Structure* structure = vPC[3].u.structure.get();
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) {
1802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            vPC[3].u.structure.set(callFrame->globalData(), codeBlock->ownerExecutable(), globalObject->structure());
181dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            vPC[4] = slot.cachedOffset();
1824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = JSValue(result);
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1862bde8e466a4451c7319e3a072d118917957d6554Steve Block        exceptionValue = callFrame->globalData().exception;
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (exceptionValue)
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return false;
1894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = JSValue(result);
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return true;
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1936b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    exceptionValue = createUndefinedVariableError(callFrame, ident);
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1976c2af9490927c3c5959b5cb07461b646f8b32f6cKristian MonsenNEVER_INLINE bool Interpreter::resolveGlobalDynamic(CallFrame* callFrame, Instruction* vPC, JSValue& exceptionValue)
1986c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
1996c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    int dst = vPC[1].u.operand;
2006c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    CodeBlock* codeBlock = callFrame->codeBlock();
201dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    JSGlobalObject* globalObject = codeBlock->globalObject();
202dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ASSERT(globalObject->isGlobalObject());
203dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    int property = vPC[2].u.operand;
2042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    Structure* structure = vPC[3].u.structure.get();
205dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    int offset = vPC[4].u.operand;
206dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    int skip = vPC[5].u.operand;
2076c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
2086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    ScopeChainNode* scopeChain = callFrame->scopeChain();
2096c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    ScopeChainIterator iter = scopeChain->begin();
2106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    ScopeChainIterator end = scopeChain->end();
2116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    ASSERT(iter != end);
212a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    bool checkTopLevel = codeBlock->codeType() == FunctionCode && codeBlock->needsFullScopeChain();
213a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ASSERT(skip || !checkTopLevel);
214a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (checkTopLevel && skip--) {
2154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (callFrame->uncheckedR(codeBlock->activationRegister()).jsValue())
216a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            ++iter;
217a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
2186c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    while (skip--) {
2192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        JSObject* o = iter->get();
2206c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        if (o->hasCustomProperties()) {
2216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            Identifier& ident = codeBlock->identifier(property);
2226c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            do {
2236c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                PropertySlot slot(o);
2246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                if (o->getPropertySlot(callFrame, ident, slot)) {
2256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                    JSValue result = slot.getValue(callFrame, ident);
2262bde8e466a4451c7319e3a072d118917957d6554Steve Block                    exceptionValue = callFrame->globalData().exception;
2276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                    if (exceptionValue)
2286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                        return false;
229a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                    ASSERT(result);
2304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                    callFrame->uncheckedR(dst) = JSValue(result);
2316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                    return true;
2326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                }
2336c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                if (iter == end)
2346c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                    break;
2352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                o = iter->get();
2366c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen                ++iter;
2376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            } while (true);
2386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            exceptionValue = createUndefinedVariableError(callFrame, ident);
2396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            return false;
2406c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        }
2416c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        ++iter;
2426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
2436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
2446c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (structure == globalObject->structure()) {
2454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = JSValue(globalObject->getDirectOffset(offset));
2464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ASSERT(callFrame->uncheckedR(dst).jsValue());
2476c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return true;
2486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
2496c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
2506c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    Identifier& ident = codeBlock->identifier(property);
2516c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    PropertySlot slot(globalObject);
2526c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (globalObject->getPropertySlot(callFrame, ident, slot)) {
2536c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        JSValue result = slot.getValue(callFrame, ident);
2546c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        if (slot.isCacheableValue() && !globalObject->structure()->isUncacheableDictionary() && slot.slotBase() == globalObject) {
2552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            vPC[3].u.structure.set(callFrame->globalData(), codeBlock->ownerExecutable(), globalObject->structure());
256dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            vPC[4] = slot.cachedOffset();
257a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            ASSERT(result);
2584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = JSValue(result);
2596c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            return true;
2606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        }
2616c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
2622bde8e466a4451c7319e3a072d118917957d6554Steve Block        exceptionValue = callFrame->globalData().exception;
2636c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        if (exceptionValue)
2646c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            return false;
265a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT(result);
2664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = JSValue(result);
2676c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return true;
2686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
2696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
2706b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    exceptionValue = createUndefinedVariableError(callFrame, ident);
2716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    return false;
2726c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen}
2736c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
274635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectNEVER_INLINE void Interpreter::resolveBase(CallFrame* callFrame, Instruction* vPC)
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
276cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    int dst = vPC[1].u.operand;
277cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    int property = vPC[2].u.operand;
278a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    bool isStrictPut = vPC[3].u.operand;
279a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    Identifier ident = callFrame->codeBlock()->identifier(property);
280a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    JSValue result = JSC::resolveBase(callFrame, ident, callFrame->scopeChain(), isStrictPut);
281e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (result) {
2824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = result;
2834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ASSERT(callFrame->uncheckedR(dst).jsValue());
284a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    } else
285a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        callFrame->globalData().exception = createErrorForInvalidGlobalAssignment(callFrame, ident.ustring());
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2885f1ab04193ad0130ca8204aadaceae083aca9881Feng QianNEVER_INLINE bool Interpreter::resolveBaseAndProperty(CallFrame* callFrame, Instruction* vPC, JSValue& exceptionValue)
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
290cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    int baseDst = vPC[1].u.operand;
291cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    int propDst = vPC[2].u.operand;
292cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    int property = vPC[3].u.operand;
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ScopeChainNode* scopeChain = callFrame->scopeChain();
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ScopeChainIterator iter = scopeChain->begin();
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ScopeChainIterator end = scopeChain->end();
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: add scopeDepthIsZero optimization
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(iter != end);
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CodeBlock* codeBlock = callFrame->codeBlock();
303635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Identifier& ident = codeBlock->identifier(property);
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSObject* base;
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    do {
3062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        base = iter->get();
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PropertySlot slot(base);
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (base->getPropertySlot(callFrame, ident, slot)) {
3095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSValue result = slot.getValue(callFrame, ident);
3102bde8e466a4451c7319e3a072d118917957d6554Steve Block            exceptionValue = callFrame->globalData().exception;
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (exceptionValue)
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                return false;
3134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(propDst) = JSValue(result);
3144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(baseDst) = JSValue(base);
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return true;
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ++iter;
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } while (iter != end);
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    exceptionValue = createUndefinedVariableError(callFrame, ident);
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return false;
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
324e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif // ENABLE(INTERPRETER)
3255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
326635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectALWAYS_INLINE CallFrame* Interpreter::slideRegisterWindowForCall(CodeBlock* newCodeBlock, RegisterFile* registerFile, CallFrame* callFrame, size_t registerOffset, int argc)
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Register* r = callFrame->registers();
329635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Register* newEnd = r + registerOffset + newCodeBlock->m_numCalleeRegisters;
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
331635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (LIKELY(argc == newCodeBlock->m_numParameters)) { // correct number of arguments
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (UNLIKELY(!registerFile->grow(newEnd)))
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        r += registerOffset;
335635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    } else if (argc < newCodeBlock->m_numParameters) { // too few arguments -- fill in the blanks
336635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        size_t omittedArgCount = newCodeBlock->m_numParameters - argc;
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        registerOffset += omittedArgCount;
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        newEnd += omittedArgCount;
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!registerFile->grow(newEnd))
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        r += registerOffset;
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Register* argv = r - RegisterFile::CallFrameHeaderSize - omittedArgCount;
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (size_t i = 0; i < omittedArgCount; ++i)
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            argv[i] = jsUndefined();
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } else { // too many arguments -- copy expected arguments, leaving the extra arguments behind
347635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        size_t numParameters = newCodeBlock->m_numParameters;
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        registerOffset += numParameters;
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        newEnd += numParameters;
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!registerFile->grow(newEnd))
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        r += registerOffset;
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Register* argv = r - RegisterFile::CallFrameHeaderSize - numParameters - argc;
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (size_t i = 0; i < numParameters; ++i)
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            argv[i + argc] = argv[i];
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return CallFrame::create(r);
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
363e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
3646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerstatic NEVER_INLINE bool isInvalidParamForIn(CallFrame* callFrame, JSValue value, JSValue& exceptionData)
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
366635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (value.isObject())
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
3686b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    exceptionData = createInvalidParamError(callFrame, "in" , value);
3695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return true;
3705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
3715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
3726b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerstatic NEVER_INLINE bool isInvalidParamForInstanceOf(CallFrame* callFrame, JSValue value, JSValue& exceptionData)
3735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
3745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (value.isObject() && asObject(value)->structure()->typeInfo().implementsHasInstance())
3755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return false;
3766b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    exceptionData = createInvalidParamError(callFrame, "instanceof" , value);
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
381e14391e94c850b8bd03680c23b38978db68687a8John ReckNEVER_INLINE JSValue Interpreter::callEval(CallFrame* callFrame, RegisterFile* registerFile, Register* argv, int argc, int registerOffset)
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (argc < 2)
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsUndefined();
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue program = argv[1].jsValue();
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
388635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!program.isString())
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return program;
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
391643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    UString programSource = asString(program)->value(callFrame);
392e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    if (callFrame->hadException())
393e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        return JSValue();
394a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
395a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    CodeBlock* codeBlock = callFrame->codeBlock();
396a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!codeBlock->isStrictMode()) {
397a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        // FIXME: We can use the preparser in strict mode, we just need additional logic
398a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        // to prevent duplicates.
399a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        LiteralParser preparser(callFrame, programSource, LiteralParser::NonStrictJSON);
400a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (JSValue parsedObject = preparser.tryLiteralParse())
401a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            return parsedObject;
402a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
403231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
404635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ScopeChainNode* scopeChain = callFrame->scopeChain();
405e14391e94c850b8bd03680c23b38978db68687a8John Reck    JSValue exceptionValue;
4062bde8e466a4451c7319e3a072d118917957d6554Steve Block    EvalExecutable* eval = codeBlock->evalCodeCache().get(callFrame, codeBlock->ownerExecutable(), codeBlock->isStrictMode(), programSource, scopeChain, exceptionValue);
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
408e14391e94c850b8bd03680c23b38978db68687a8John Reck    ASSERT(!eval == exceptionValue);
409e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (UNLIKELY(!eval))
410e14391e94c850b8bd03680c23b38978db68687a8John Reck        return throwError(callFrame, exceptionValue);
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4122bde8e466a4451c7319e3a072d118917957d6554Steve Block    return callFrame->globalData().interpreter->execute(eval, callFrame, callFrame->uncheckedR(codeBlock->thisRegister()).jsValue().toThisObject(callFrame), callFrame->registers() - registerFile->start() + registerOffset, scopeChain);
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochInterpreter::Interpreter(JSGlobalData& globalData)
416231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    : m_sampleEntryDepth(0)
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_reentryDepth(0)
41881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    , m_registerFile(globalData)
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
420e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(COMPUTED_GOTO_INTERPRETER)
421e14391e94c850b8bd03680c23b38978db68687a8John Reck    privateExecute(InitializeAndReturn, 0, 0);
422d0825bca7fe65beaee391d30da42e937db621564Steve Block
423d0825bca7fe65beaee391d30da42e937db621564Steve Block    for (int i = 0; i < numOpcodeIDs; ++i)
424d0825bca7fe65beaee391d30da42e937db621564Steve Block        m_opcodeIDTable.add(m_opcodeTable[i], static_cast<OpcodeID>(i));
425e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif // ENABLE(COMPUTED_GOTO_INTERPRETER)
426d0825bca7fe65beaee391d30da42e937db621564Steve Block
427231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(OPCODE_SAMPLING)
428231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    enableSampler();
429231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
430635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
432635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef NDEBUG
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
434635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Interpreter::dumpCallFrame(CallFrame* callFrame)
435635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
436635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    callFrame->codeBlock()->dump(callFrame);
437635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    dumpRegisters(callFrame);
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
440635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid Interpreter::dumpRegisters(CallFrame* callFrame)
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    printf("Register frame: \n\n");
4430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("-----------------------------------------------------------------------------\n");
4440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("            use            |   address  |                value               \n");
4450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("-----------------------------------------------------------------------------\n");
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CodeBlock* codeBlock = callFrame->codeBlock();
448e14391e94c850b8bd03680c23b38978db68687a8John Reck    RegisterFile* registerFile = &callFrame->scopeChain()->globalObject->globalData().interpreter->registerFile();
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const Register* it;
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const Register* end;
4510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    JSValue v;
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
453635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (codeBlock->codeType() == GlobalCode) {
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        it = registerFile->lastGlobal();
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        end = it + registerFile->numGlobals();
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        while (it != end) {
4570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            v = (*it).jsValue();
4580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(JSVALUE32_64)
4590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            printf("[global var]               | %10p | %-16s 0x%llx \n", it, v.description(), JSValue::encode(v));
4600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
4610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            printf("[global var]               | %10p | %-16s %p \n", it, v.description(), JSValue::encode(v));
4620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ++it;
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
4650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        printf("-----------------------------------------------------------------------------\n");
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
468635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    it = callFrame->registers() - RegisterFile::CallFrameHeaderSize - codeBlock->m_numParameters;
4690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    v = (*it).jsValue();
4700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(JSVALUE32_64)
4710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("[this]                     | %10p | %-16s 0x%llx \n", it, v.description(), JSValue::encode(v)); ++it;
4720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
4730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("[this]                     | %10p | %-16s %p \n", it, v.description(), JSValue::encode(v)); ++it;
4740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
475635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    end = it + max(codeBlock->m_numParameters - 1, 0); // - 1 to skip "this"
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (it != end) {
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        do {
4780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            v = (*it).jsValue();
4790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(JSVALUE32_64)
4800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            printf("[param]                    | %10p | %-16s 0x%llx \n", it, v.description(), JSValue::encode(v));
4810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
4820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            printf("[param]                    | %10p | %-16s %p \n", it, v.description(), JSValue::encode(v));
4830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ++it;
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } while (it != end);
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("-----------------------------------------------------------------------------\n");
4880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("[CodeBlock]                | %10p | %p \n", it, (*it).codeBlock()); ++it;
4890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("[ScopeChain]               | %10p | %p \n", it, (*it).scopeChain()); ++it;
4900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("[CallerRegisters]          | %10p | %d \n", it, (*it).i()); ++it;
4910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("[ReturnPC]                 | %10p | %p \n", it, (*it).vPC()); ++it;
4920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("[ArgumentCount]            | %10p | %d \n", it, (*it).i()); ++it;
4930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("[Callee]                   | %10p | %p \n", it, (*it).function()); ++it;
4940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("-----------------------------------------------------------------------------\n");
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int registerCount = 0;
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
498635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    end = it + codeBlock->m_numVars;
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (it != end) {
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        do {
5010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            v = (*it).jsValue();
5020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(JSVALUE32_64)
5030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            printf("[r%2d]                      | %10p | %-16s 0x%llx \n", registerCount, it, v.description(), JSValue::encode(v));
5040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
5050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            printf("[r%2d]                      | %10p | %-16s %p \n", registerCount, it, v.description(), JSValue::encode(v));
5060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ++it;
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ++registerCount;
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } while (it != end);
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("-----------------------------------------------------------------------------\n");
5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    end = it + codeBlock->m_numCalleeRegisters - codeBlock->m_numVars;
5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (it != end) {
5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        do {
5160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            v = (*it).jsValue();
5170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(JSVALUE32_64)
5180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            printf("[r%2d]                      | %10p | %-16s 0x%llx \n", registerCount, it, v.description(), JSValue::encode(v));
5190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
5200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            printf("[r%2d]                      | %10p | %-16s %p \n", registerCount, it, v.description(), JSValue::encode(v));
5210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ++it;
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ++registerCount;
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } while (it != end);
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    printf("-----------------------------------------------------------------------------\n");
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
531635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool Interpreter::isOpcode(Opcode opcode)
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
533e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(COMPUTED_GOTO_INTERPRETER)
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return opcode != HashTraits<Opcode>::emptyValue()
5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        && !HashTraits<Opcode>::isDeletedValue(opcode)
5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        && m_opcodeIDTable.contains(opcode);
5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return opcode >= 0 && opcode <= op_end;
5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5425f1ab04193ad0130ca8204aadaceae083aca9881Feng QianNEVER_INLINE bool Interpreter::unwindCallFrame(CallFrame*& callFrame, JSValue exceptionValue, unsigned& bytecodeOffset, CodeBlock*& codeBlock)
5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CodeBlock* oldCodeBlock = codeBlock;
5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ScopeChainNode* scopeChain = callFrame->scopeChain();
5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (Debugger* debugger = callFrame->dynamicGlobalObject()->debugger()) {
5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DebuggerCallFrame debuggerCallFrame(callFrame, exceptionValue);
5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (callFrame->callee())
550231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            debugger->returnEvent(debuggerCallFrame, codeBlock->ownerExecutable()->sourceID(), codeBlock->ownerExecutable()->lastLine());
5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
552231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            debugger->didExecuteProgram(debuggerCallFrame, codeBlock->ownerExecutable()->sourceID(), codeBlock->ownerExecutable()->lastLine());
5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If this call frame created an activation or an 'arguments' object, tear it off.
556635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (oldCodeBlock->codeType() == FunctionCode && oldCodeBlock->needsFullScopeChain()) {
5574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (!callFrame->uncheckedR(oldCodeBlock->activationRegister()).jsValue()) {
558a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            oldCodeBlock->createActivation(callFrame);
559a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            scopeChain = callFrame->scopeChain();
560a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
56181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        while (!scopeChain->object->inherits(&JSActivation::s_info))
5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            scopeChain = scopeChain->pop();
5632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
5642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        callFrame->setScopeChain(scopeChain);
5652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        JSActivation* activation = asActivation(scopeChain->object.get());
56681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        activation->copyRegisters(*scopeChain->globalData);
5674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (JSValue arguments = callFrame->uncheckedR(unmodifiedArgumentsRegister(oldCodeBlock->argumentsRegister())).jsValue()) {
568a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (!oldCodeBlock->isStrictMode())
5692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                asArguments(arguments)->setActivation(callFrame->globalData(), activation);
570a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
571a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    } else if (oldCodeBlock->usesArguments() && !oldCodeBlock->isStrictMode()) {
5724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (JSValue arguments = callFrame->uncheckedR(unmodifiedArgumentsRegister(oldCodeBlock->argumentsRegister())).jsValue())
57381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            asArguments(arguments)->copyRegisters(callFrame->globalData());
5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
576e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    CallFrame* callerFrame = callFrame->callerFrame();
577e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    if (callerFrame->hasHostCallFrameFlag())
5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return false;
5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
580e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    codeBlock = callerFrame->codeBlock();
581967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#if ENABLE(JIT) && ENABLE(INTERPRETER)
582e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (callerFrame->globalData().canUseJIT())
5834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        bytecodeOffset = codeBlock->bytecodeOffset(callFrame->returnPC());
584e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    else
5854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        bytecodeOffset = codeBlock->bytecodeOffset(callFrame->returnVPC());
586967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#elif ENABLE(JIT)
5874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    bytecodeOffset = codeBlock->bytecodeOffset(callFrame->returnPC());
588e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#else
5894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    bytecodeOffset = codeBlock->bytecodeOffset(callFrame->returnVPC());
590e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
591967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
592e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    callFrame = callerFrame;
5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5966b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerstatic void appendSourceToError(CallFrame* callFrame, ErrorInstance* exception, unsigned bytecodeOffset)
5976b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
5986b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    exception->clearAppendSourceToMessage();
5996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6004576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (!callFrame->codeBlock()->hasExpressionInfo())
6014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        return;
6024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
6036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    int startOffset = 0;
6046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    int endOffset = 0;
6056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    int divotPoint = 0;
6066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    CodeBlock* codeBlock = callFrame->codeBlock();
6084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    codeBlock->expressionRangeForBytecodeOffset(bytecodeOffset, divotPoint, startOffset, endOffset);
6096b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    int expressionStart = divotPoint - startOffset;
6116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    int expressionStop = divotPoint + endOffset;
6126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!expressionStop || expressionStart > codeBlock->source()->length())
6146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return;
6156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    JSGlobalData* globalData = &callFrame->globalData();
6172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    JSValue jsMessage = exception->getDirect(*globalData, globalData->propertyNames->message);
6186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!jsMessage || !jsMessage.isString())
6196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return;
6206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    UString message = asString(jsMessage)->value(callFrame);
6226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (expressionStart < expressionStop)
6246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        message =  makeUString(message, " (evaluating '", codeBlock->source()->getRange(expressionStart, expressionStop), "')");
6256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    else {
6266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        // No range information, so give a few characters of context
6276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        const UChar* data = codeBlock->source()->data();
6286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        int dataLength = codeBlock->source()->length();
6296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        int start = expressionStart;
6306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        int stop = expressionStart;
6316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        // Get up to 20 characters of context to the left and right of the divot, clamping to the line.
6326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        // then strip whitespace.
6336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        while (start > 0 && (expressionStart - start < 20) && data[start - 1] != '\n')
6346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            start--;
6356b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        while (start < (expressionStart - 1) && isStrWhiteSpace(data[start]))
6366b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            start++;
6376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        while (stop < dataLength && (stop - expressionStart < 20) && data[stop] != '\n')
6386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            stop++;
63981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        while (stop > expressionStart && isStrWhiteSpace(data[stop - 1]))
6406b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            stop--;
6416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        message = makeUString(message, " (near '...", codeBlock->source()->getRange(start, stop), "...')");
6426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
6436b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    exception->putDirect(*globalData, globalData->propertyNames->message, jsString(globalData, message));
6456b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}
6466b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangNEVER_INLINE HandlerInfo* Interpreter::throwException(CallFrame*& callFrame, JSValue& exceptionValue, unsigned bytecodeOffset)
6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CodeBlock* codeBlock = callFrame->codeBlock();
6504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    bool isInterrupt = false;
6514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
6524576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    // Set up the exception object
653635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (exceptionValue.isObject()) {
6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JSObject* exception = asObject(exceptionValue);
6554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
6564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (exception->isErrorInstance() && static_cast<ErrorInstance*>(exception)->appendSourceToMessage())
6576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            appendSourceToError(callFrame, static_cast<ErrorInstance*>(exception), bytecodeOffset);
6586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        // Using hasExpressionInfo to imply we are interested in rich exception info.
6604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (codeBlock->hasExpressionInfo() && !hasErrorInfo(callFrame, exception)) {
6614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            ASSERT(codeBlock->hasLineInfo());
6626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
6634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            // FIXME: should only really be adding these properties to VM generated exceptions,
6644576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            // but the inspector currently requires these for all thrown objects.
6654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            addErrorInfo(callFrame, exception, codeBlock->lineNumberForBytecodeOffset(bytecodeOffset), codeBlock->ownerExecutable()->source());
6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
6674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
6684576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        ComplType exceptionType = exception->exceptionType();
6694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        isInterrupt = exceptionType == Interrupted || exceptionType == Terminated;
6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (Debugger* debugger = callFrame->dynamicGlobalObject()->debugger()) {
6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DebuggerCallFrame debuggerCallFrame(callFrame, exceptionValue);
674d0825bca7fe65beaee391d30da42e937db621564Steve Block        bool hasHandler = codeBlock->handlerForBytecodeOffset(bytecodeOffset);
6754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        debugger->exception(debuggerCallFrame, codeBlock->ownerExecutable()->sourceID(), codeBlock->lineNumberForBytecodeOffset(bytecodeOffset), hasHandler);
6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Calculate an exception handler vPC, unwinding call frames as necessary.
679635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    HandlerInfo* handler = 0;
6804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    while (isInterrupt || !(handler = codeBlock->handlerForBytecodeOffset(bytecodeOffset))) {
6814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        if (!unwindCallFrame(callFrame, exceptionValue, bytecodeOffset, codeBlock)) {
6824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            if (Profiler* profiler = *Profiler::enabledProfilerReference())
6834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                profiler->exceptionUnwind(callFrame);
6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return 0;
6854576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        }
6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (Profiler* profiler = *Profiler::enabledProfilerReference())
6894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        profiler->exceptionUnwind(callFrame);
6904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
6915af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    // Shrink the JS stack, in case stack overflow made it huge.
692e14391e94c850b8bd03680c23b38978db68687a8John Reck    Register* highWaterMark = 0;
693e14391e94c850b8bd03680c23b38978db68687a8John Reck    for (CallFrame* callerFrame = callFrame; callerFrame; callerFrame = callerFrame->callerFrame()->removeHostCallFrameFlag()) {
694a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        CodeBlock* codeBlock = callerFrame->codeBlock();
695a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!codeBlock)
696a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            continue;
697a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        Register* callerHighWaterMark = callerFrame->registers() + codeBlock->m_numCalleeRegisters;
698a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        highWaterMark = max(highWaterMark, callerHighWaterMark);
699a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
700a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    m_registerFile.shrink(highWaterMark);
7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7025af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    // Unwind the scope chain within the exception handler's call frame.
703635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ScopeChainNode* scopeChain = callFrame->scopeChain();
704a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    int scopeDelta = 0;
705a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (!codeBlock->needsFullScopeChain() || codeBlock->codeType() != FunctionCode
7064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        || callFrame->uncheckedR(codeBlock->activationRegister()).jsValue())
70781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        scopeDelta = depth(codeBlock, scopeChain) - handler->scopeDepth;
7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(scopeDelta >= 0);
7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (scopeDelta--)
710635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        scopeChain = scopeChain->pop();
711635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    callFrame->setScopeChain(scopeChain);
7128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
713635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return handler;
7148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
716e14391e94c850b8bd03680c23b38978db68687a8John Reckstatic inline JSValue checkedReturn(JSValue returnValue)
717e14391e94c850b8bd03680c23b38978db68687a8John Reck{
718e14391e94c850b8bd03680c23b38978db68687a8John Reck    ASSERT(returnValue);
719e14391e94c850b8bd03680c23b38978db68687a8John Reck    return returnValue;
720e14391e94c850b8bd03680c23b38978db68687a8John Reck}
721e14391e94c850b8bd03680c23b38978db68687a8John Reck
722e14391e94c850b8bd03680c23b38978db68687a8John Reckstatic inline JSObject* checkedReturn(JSObject* returnValue)
723e14391e94c850b8bd03680c23b38978db68687a8John Reck{
724e14391e94c850b8bd03680c23b38978db68687a8John Reck    ASSERT(returnValue);
725e14391e94c850b8bd03680c23b38978db68687a8John Reck    return returnValue;
726e14391e94c850b8bd03680c23b38978db68687a8John Reck}
727e14391e94c850b8bd03680c23b38978db68687a8John Reck
728e14391e94c850b8bd03680c23b38978db68687a8John ReckJSValue Interpreter::execute(ProgramExecutable* program, CallFrame* callFrame, ScopeChainNode* scopeChain, JSObject* thisObj)
7298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!scopeChain->globalData->exception);
7318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
732e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (m_reentryDepth >= MaxSmallThreadReentryDepth && m_reentryDepth >= callFrame->globalData().maxReentryDepth)
733e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(throwStackOverflowError(callFrame));
7348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7352bde8e466a4451c7319e3a072d118917957d6554Steve Block    DynamicGlobalObjectScope globalObjectScope(*scopeChain->globalData, scopeChain->globalObject.get());
7362bde8e466a4451c7319e3a072d118917957d6554Steve Block
737967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    JSObject* error = program->compile(callFrame, scopeChain);
738e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (error)
739e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(throwError(callFrame, error));
740967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    CodeBlock* codeBlock = &program->generatedBytecode();
7418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Register* oldEnd = m_registerFile.end();
743635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Register* newEnd = oldEnd + codeBlock->m_numParameters + RegisterFile::CallFrameHeaderSize + codeBlock->m_numCalleeRegisters;
744e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (!m_registerFile.grow(newEnd))
745e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(throwStackOverflowError(callFrame));
7468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSGlobalObject* lastGlobalObject = m_registerFile.globalObject();
7488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSGlobalObject* globalObject = callFrame->dynamicGlobalObject();
7498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    globalObject->copyGlobalsTo(m_registerFile);
7508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
751635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    CallFrame* newCallFrame = CallFrame::create(oldEnd + codeBlock->m_numParameters + RegisterFile::CallFrameHeaderSize);
7525af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    ASSERT(codeBlock->m_numParameters == 1); // 1 parameter for 'this'.
7535af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    newCallFrame->init(codeBlock, 0, scopeChain, CallFrame::noCaller(), codeBlock->m_numParameters, 0);
7544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    newCallFrame->uncheckedR(newCallFrame->hostThisRegister()) = JSValue(thisObj);
7558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Profiler** profiler = Profiler::enabledProfilerReference();
7578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (*profiler)
7584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        (*profiler)->willExecute(callFrame, program->sourceURL(), program->lineNo());
7598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue result;
7618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
762231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        SamplingTool::CallRecord callRecord(m_sampler.get());
7638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
764e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        m_reentryDepth++;
765635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(JIT)
766e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (callFrame->globalData().canUseJIT())
767e14391e94c850b8bd03680c23b38978db68687a8John Reck            result = program->generatedJITCode().execute(&m_registerFile, newCallFrame, scopeChain->globalData);
768e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        else
769e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
770e14391e94c850b8bd03680c23b38978db68687a8John Reck            result = privateExecute(Normal, &m_registerFile, newCallFrame);
771e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
7728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_reentryDepth--;
7738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
7748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (*profiler)
776231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        (*profiler)->didExecute(callFrame, program->sourceURL(), program->lineNo());
7778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_reentryDepth && lastGlobalObject && globalObject != lastGlobalObject)
7798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        lastGlobalObject->copyGlobalsTo(m_registerFile);
7808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_registerFile.shrink(oldEnd);
7828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
783e14391e94c850b8bd03680c23b38978db68687a8John Reck    return checkedReturn(result);
7848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
7858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
786e14391e94c850b8bd03680c23b38978db68687a8John ReckJSValue Interpreter::executeCall(CallFrame* callFrame, JSObject* function, CallType callType, const CallData& callData, JSValue thisValue, const ArgList& args)
7878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
7885af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    ASSERT(!callFrame->hadException());
7898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
790e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (m_reentryDepth >= MaxSmallThreadReentryDepth && m_reentryDepth >= callFrame->globalData().maxReentryDepth)
791e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(throwStackOverflowError(callFrame));
7928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
7938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Register* oldEnd = m_registerFile.end();
7945af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    int argCount = 1 + args.size(); // implicit "this" parameter
7955af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    size_t registerOffset = argCount + RegisterFile::CallFrameHeaderSize;
7968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
797e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (!m_registerFile.grow(oldEnd + registerOffset))
798e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(throwStackOverflowError(callFrame));
7998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallFrame* newCallFrame = CallFrame::create(oldEnd);
8018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    size_t dst = 0;
8024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    newCallFrame->uncheckedR(0) = thisValue;
8038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ArgList::const_iterator end = args.end();
8048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (ArgList::const_iterator it = args.begin(); it != end; ++it)
8054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        newCallFrame->uncheckedR(++dst) = *it;
8068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8075af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (callType == CallTypeJS) {
8085af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        ScopeChainNode* callDataScopeChain = callData.js.scopeChain;
8095af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
8102bde8e466a4451c7319e3a072d118917957d6554Steve Block        DynamicGlobalObjectScope globalObjectScope(*callDataScopeChain->globalData, callDataScopeChain->globalObject.get());
8112bde8e466a4451c7319e3a072d118917957d6554Steve Block
812967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        JSObject* compileError = callData.js.functionExecutable->compileForCall(callFrame, callDataScopeChain);
813967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        if (UNLIKELY(!!compileError)) {
814967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            m_registerFile.shrink(oldEnd);
815e14391e94c850b8bd03680c23b38978db68687a8John Reck            return checkedReturn(throwError(callFrame, compileError));
816967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        }
817967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
818967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        CodeBlock* newCodeBlock = &callData.js.functionExecutable->generatedBytecodeForCall();
819967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        newCallFrame = slideRegisterWindowForCall(newCodeBlock, &m_registerFile, newCallFrame, registerOffset, argCount);
8205af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        if (UNLIKELY(!newCallFrame)) {
8215af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            m_registerFile.shrink(oldEnd);
822e14391e94c850b8bd03680c23b38978db68687a8John Reck            return checkedReturn(throwStackOverflowError(callFrame));
8235af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        }
8245af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
8255af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        newCallFrame->init(newCodeBlock, 0, callDataScopeChain, callFrame->addHostCallFrameFlag(), argCount, function);
8265af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
8275af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        Profiler** profiler = Profiler::enabledProfilerReference();
8285af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        if (*profiler)
8294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            (*profiler)->willExecute(callFrame, function);
8305af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
8315af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        JSValue result;
8325af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        {
8335af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            SamplingTool::CallRecord callRecord(m_sampler.get());
8345af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
835e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            m_reentryDepth++;
836e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(JIT)
837e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            if (callFrame->globalData().canUseJIT())
838e14391e94c850b8bd03680c23b38978db68687a8John Reck                result = callData.js.functionExecutable->generatedJITCodeForCall().execute(&m_registerFile, newCallFrame, callDataScopeChain->globalData);
839e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            else
840e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
841e14391e94c850b8bd03680c23b38978db68687a8John Reck                result = privateExecute(Normal, &m_registerFile, newCallFrame);
8425af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            m_reentryDepth--;
8435af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        }
8445af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
8455af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        if (*profiler)
8464576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            (*profiler)->didExecute(callFrame, function);
8475af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
8488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_registerFile.shrink(oldEnd);
849e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(result);
8508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
8515af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
8525af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    ASSERT(callType == CallTypeHost);
8535af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    ScopeChainNode* scopeChain = callFrame->scopeChain();
8545af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    newCallFrame = CallFrame::create(newCallFrame->registers() + registerOffset);
8555af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    newCallFrame->init(0, 0, scopeChain, callFrame->addHostCallFrameFlag(), argCount, function);
8565af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
8572bde8e466a4451c7319e3a072d118917957d6554Steve Block    DynamicGlobalObjectScope globalObjectScope(*scopeChain->globalData, scopeChain->globalObject.get());
8588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Profiler** profiler = Profiler::enabledProfilerReference();
8608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (*profiler)
8614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        (*profiler)->willExecute(callFrame, function);
8628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue result;
8648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
8655af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        SamplingTool::HostCallRecord callRecord(m_sampler.get());
866545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        result = JSValue::decode(callData.native.function(newCallFrame));
8676c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
8686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
8696c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (*profiler)
8704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        (*profiler)->didExecute(callFrame, function);
8716c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
8726c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    m_registerFile.shrink(oldEnd);
873e14391e94c850b8bd03680c23b38978db68687a8John Reck    return checkedReturn(result);
8746c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen}
8756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
876e14391e94c850b8bd03680c23b38978db68687a8John ReckJSObject* Interpreter::executeConstruct(CallFrame* callFrame, JSObject* constructor, ConstructType constructType, const ConstructData& constructData, const ArgList& args)
8776c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen{
878545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    ASSERT(!callFrame->hadException());
8796c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
880e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (m_reentryDepth >= MaxSmallThreadReentryDepth && m_reentryDepth >= callFrame->globalData().maxReentryDepth)
881e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(throwStackOverflowError(callFrame));
8826c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
8836c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    Register* oldEnd = m_registerFile.end();
884545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    int argCount = 1 + args.size(); // implicit "this" parameter
885545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    size_t registerOffset = argCount + RegisterFile::CallFrameHeaderSize;
8866c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
887e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (!m_registerFile.grow(oldEnd + registerOffset))
888e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(throwStackOverflowError(callFrame));
8896c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
8906c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    CallFrame* newCallFrame = CallFrame::create(oldEnd);
8916c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    size_t dst = 0;
8926c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    ArgList::const_iterator end = args.end();
8936c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    for (ArgList::const_iterator it = args.begin(); it != end; ++it)
8944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        newCallFrame->uncheckedR(++dst) = *it;
8956c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
896545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (constructType == ConstructTypeJS) {
897545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        ScopeChainNode* constructDataScopeChain = constructData.js.scopeChain;
898545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
8992bde8e466a4451c7319e3a072d118917957d6554Steve Block        DynamicGlobalObjectScope globalObjectScope(*constructDataScopeChain->globalData, constructDataScopeChain->globalObject.get());
9002bde8e466a4451c7319e3a072d118917957d6554Steve Block
901967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        JSObject* compileError = constructData.js.functionExecutable->compileForConstruct(callFrame, constructDataScopeChain);
902967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        if (UNLIKELY(!!compileError)) {
903967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            m_registerFile.shrink(oldEnd);
904e14391e94c850b8bd03680c23b38978db68687a8John Reck            return checkedReturn(throwError(callFrame, compileError));
905967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        }
906967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
907967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        CodeBlock* newCodeBlock = &constructData.js.functionExecutable->generatedBytecodeForConstruct();
908967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        newCallFrame = slideRegisterWindowForCall(newCodeBlock, &m_registerFile, newCallFrame, registerOffset, argCount);
909545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (UNLIKELY(!newCallFrame)) {
910545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_registerFile.shrink(oldEnd);
911e14391e94c850b8bd03680c23b38978db68687a8John Reck            return checkedReturn(throwStackOverflowError(callFrame));
912545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        }
913545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
914545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        newCallFrame->init(newCodeBlock, 0, constructDataScopeChain, callFrame->addHostCallFrameFlag(), argCount, constructor);
915545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
916545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        Profiler** profiler = Profiler::enabledProfilerReference();
917545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (*profiler)
9184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            (*profiler)->willExecute(callFrame, constructor);
919545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
920545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        JSValue result;
921545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        {
922545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            SamplingTool::CallRecord callRecord(m_sampler.get());
923545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
924e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            m_reentryDepth++;
925e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(JIT)
926e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            if (callFrame->globalData().canUseJIT())
927e14391e94c850b8bd03680c23b38978db68687a8John Reck                result = constructData.js.functionExecutable->generatedJITCodeForConstruct().execute(&m_registerFile, newCallFrame, constructDataScopeChain->globalData);
928e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            else
929e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
930e14391e94c850b8bd03680c23b38978db68687a8John Reck                result = privateExecute(Normal, &m_registerFile, newCallFrame);
931545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            m_reentryDepth--;
932545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        }
933545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
934545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (*profiler)
9354576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            (*profiler)->didExecute(callFrame, constructor);
936545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
9376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        m_registerFile.shrink(oldEnd);
938545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (callFrame->hadException())
939545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            return 0;
940545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        ASSERT(result.isObject());
941e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(asObject(result));
9426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
9435af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
944545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    ASSERT(constructType == ConstructTypeHost);
945545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    ScopeChainNode* scopeChain = callFrame->scopeChain();
946545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    newCallFrame = CallFrame::create(newCallFrame->registers() + registerOffset);
947545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    newCallFrame->init(0, 0, scopeChain, callFrame->addHostCallFrameFlag(), argCount, constructor);
948545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
9492bde8e466a4451c7319e3a072d118917957d6554Steve Block    DynamicGlobalObjectScope globalObjectScope(*scopeChain->globalData, scopeChain->globalObject.get());
9506c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
9516c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    Profiler** profiler = Profiler::enabledProfilerReference();
9526c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (*profiler)
9534576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        (*profiler)->willExecute(callFrame, constructor);
9546c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
9556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    JSValue result;
9566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    {
957545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        SamplingTool::HostCallRecord callRecord(m_sampler.get());
958545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        result = JSValue::decode(constructData.native.function(newCallFrame));
9598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
9608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (*profiler)
9624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        (*profiler)->didExecute(callFrame, constructor);
9638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
9648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_registerFile.shrink(oldEnd);
965545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    if (callFrame->hadException())
966545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        return 0;
967545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    ASSERT(result.isObject());
968e14391e94c850b8bd03680c23b38978db68687a8John Reck    return checkedReturn(asObject(result));
9698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
9708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
971e14391e94c850b8bd03680c23b38978db68687a8John ReckCallFrameClosure Interpreter::prepareForRepeatCall(FunctionExecutable* FunctionExecutable, CallFrame* callFrame, JSFunction* function, int argCount, ScopeChainNode* scopeChain)
9725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
9735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    ASSERT(!scopeChain->globalData->exception);
9745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
975dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (m_reentryDepth >= MaxSmallThreadReentryDepth) {
976dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (m_reentryDepth >= callFrame->globalData().maxReentryDepth) {
977e14391e94c850b8bd03680c23b38978db68687a8John Reck            throwStackOverflowError(callFrame);
9785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            return CallFrameClosure();
9795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
9805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
9815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
9825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    Register* oldEnd = m_registerFile.end();
9835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    int argc = 1 + argCount; // implicit "this" parameter
9845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
9855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (!m_registerFile.grow(oldEnd + argc)) {
986e14391e94c850b8bd03680c23b38978db68687a8John Reck        throwStackOverflowError(callFrame);
9875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return CallFrameClosure();
9885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
9895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
9905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    CallFrame* newCallFrame = CallFrame::create(oldEnd);
9912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // We initialise |this| unnecessarily here for the sake of code clarity
9925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    size_t dst = 0;
9935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    for (int i = 0; i < argc; ++i)
9942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        newCallFrame->uncheckedR(dst++) = jsUndefined();
9955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
996967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    JSObject* error = FunctionExecutable->compileForCall(callFrame, scopeChain);
997967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (error) {
998e14391e94c850b8bd03680c23b38978db68687a8John Reck        throwError(callFrame, error);
999967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        m_registerFile.shrink(oldEnd);
1000967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return CallFrameClosure();
1001967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    }
1002967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    CodeBlock* codeBlock = &FunctionExecutable->generatedBytecodeForCall();
1003967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
1004967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    newCallFrame = slideRegisterWindowForCall(codeBlock, &m_registerFile, newCallFrame, argc + RegisterFile::CallFrameHeaderSize, argc);
10055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (UNLIKELY(!newCallFrame)) {
1006e14391e94c850b8bd03680c23b38978db68687a8John Reck        throwStackOverflowError(callFrame);
10075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        m_registerFile.shrink(oldEnd);
10085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return CallFrameClosure();
10095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
1010e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    newCallFrame->init(codeBlock, 0, scopeChain, callFrame->addHostCallFrameFlag(), argc, function);
1011231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    CallFrameClosure result = { callFrame, newCallFrame, function, FunctionExecutable, scopeChain->globalData, oldEnd, scopeChain, codeBlock->m_numParameters, argc };
10125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return result;
10135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
10145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1015e14391e94c850b8bd03680c23b38978db68687a8John ReckJSValue Interpreter::execute(CallFrameClosure& closure)
10165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
10175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    closure.resetCallFrame();
10185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    Profiler** profiler = Profiler::enabledProfilerReference();
10195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (*profiler)
10205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        (*profiler)->willExecute(closure.oldCallFrame, closure.function);
10215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
10225f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue result;
10235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    {
1024231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        SamplingTool::CallRecord callRecord(m_sampler.get());
10255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1026e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        m_reentryDepth++;
10275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(JIT)
1028e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
1029e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (closure.newCallFrame->globalData().canUseJIT())
1030e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
1031e14391e94c850b8bd03680c23b38978db68687a8John Reck            result = closure.functionExecutable->generatedJITCodeForCall().execute(&m_registerFile, closure.newCallFrame, closure.globalData);
1032e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
1033e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        else
1034e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
1035e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
1036e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
1037e14391e94c850b8bd03680c23b38978db68687a8John Reck            result = privateExecute(Normal, &m_registerFile, closure.newCallFrame);
10385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif
10395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        m_reentryDepth--;
10405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
10415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
10425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (*profiler)
10435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        (*profiler)->didExecute(closure.oldCallFrame, closure.function);
1044e14391e94c850b8bd03680c23b38978db68687a8John Reck    return checkedReturn(result);
10455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
10465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
10475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid Interpreter::endRepeatCall(CallFrameClosure& closure)
10485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
10495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    m_registerFile.shrink(closure.oldEnd);
10505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
10515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1052e14391e94c850b8bd03680c23b38978db68687a8John ReckJSValue Interpreter::execute(EvalExecutable* eval, CallFrame* callFrame, JSObject* thisObj, ScopeChainNode* scopeChain)
10538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1054967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    JSObject* compileError = eval->compile(callFrame, scopeChain);
1055e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (UNLIKELY(!!compileError))
1056e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(throwError(callFrame, compileError));
1057e14391e94c850b8bd03680c23b38978db68687a8John Reck    return execute(eval, callFrame, thisObj, m_registerFile.size() + eval->generatedBytecode().m_numParameters + RegisterFile::CallFrameHeaderSize, scopeChain);
10588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
10598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1060e14391e94c850b8bd03680c23b38978db68687a8John ReckJSValue Interpreter::execute(EvalExecutable* eval, CallFrame* callFrame, JSObject* thisObj, int globalRegisterOffset, ScopeChainNode* scopeChain)
10618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
10628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(!scopeChain->globalData->exception);
10638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10642bde8e466a4451c7319e3a072d118917957d6554Steve Block    DynamicGlobalObjectScope globalObjectScope(*scopeChain->globalData, scopeChain->globalObject.get());
10652bde8e466a4451c7319e3a072d118917957d6554Steve Block
1066e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (m_reentryDepth >= MaxSmallThreadReentryDepth && m_reentryDepth >= callFrame->globalData().maxReentryDepth)
1067e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(throwStackOverflowError(callFrame));
10688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1069967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    JSObject* compileError = eval->compile(callFrame, scopeChain);
1070e14391e94c850b8bd03680c23b38978db68687a8John Reck    if (UNLIKELY(!!compileError))
1071e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(throwError(callFrame, compileError));
1072967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    EvalCodeBlock* codeBlock = &eval->generatedBytecode();
10738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1074a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    JSObject* variableObject;
107581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    for (ScopeChainNode* node = scopeChain; ; node = node->next.get()) {
10768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(node);
10778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (node->object->isVariableObject()) {
10782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            variableObject = static_cast<JSVariableObject*>(node->object.get());
10798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            break;
10808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
10818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
10828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
10836c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    unsigned numVariables = codeBlock->numVariables();
10846c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    int numFunctions = codeBlock->numberOfFunctionDecls();
1085a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    bool pushedScope = false;
10866c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (numVariables || numFunctions) {
1087a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (codeBlock->isStrictMode()) {
1088a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            variableObject = new (callFrame) StrictEvalActivation(callFrame);
1089a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            scopeChain = scopeChain->push(variableObject);
1090a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            pushedScope = true;
1091a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
10926c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        // Scope for BatchedTransitionOptimizer
10932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        BatchedTransitionOptimizer optimizer(callFrame->globalData(), variableObject);
10948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1095231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        for (unsigned i = 0; i < numVariables; ++i) {
1096231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            const Identifier& ident = codeBlock->variable(i);
10978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!variableObject->hasProperty(callFrame, ident)) {
10988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                PutPropertySlot slot;
10998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                variableObject->put(callFrame, ident, jsUndefined(), slot);
11008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
11018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
11028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1103231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        for (int i = 0; i < numFunctions; ++i) {
1104231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            FunctionExecutable* function = codeBlock->functionDecl(i);
11058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            PutPropertySlot slot;
1106231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            variableObject->put(callFrame, function->name(), function->make(callFrame, scopeChain), slot);
11078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
11088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Register* oldEnd = m_registerFile.end();
1111635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Register* newEnd = m_registerFile.start() + globalRegisterOffset + codeBlock->m_numCalleeRegisters;
11128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_registerFile.grow(newEnd)) {
1113a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (pushedScope)
1114a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            scopeChain->pop();
1115e14391e94c850b8bd03680c23b38978db68687a8John Reck        return checkedReturn(throwStackOverflowError(callFrame));
11168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1118635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    CallFrame* newCallFrame = CallFrame::create(m_registerFile.start() + globalRegisterOffset);
11198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11205af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    ASSERT(codeBlock->m_numParameters == 1); // 1 parameter for 'this'.
11215af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    newCallFrame->init(codeBlock, 0, scopeChain, callFrame->addHostCallFrameFlag(), codeBlock->m_numParameters, 0);
11224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    newCallFrame->uncheckedR(newCallFrame->hostThisRegister()) = JSValue(thisObj);
11238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Profiler** profiler = Profiler::enabledProfilerReference();
11258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (*profiler)
11264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        (*profiler)->willExecute(callFrame, eval->sourceURL(), eval->lineNo());
11278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue result;
11298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1130231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        SamplingTool::CallRecord callRecord(m_sampler.get());
11318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_reentryDepth++;
1133e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(JIT)
1135e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
1136e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (callFrame->globalData().canUseJIT())
1137e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
1138e14391e94c850b8bd03680c23b38978db68687a8John Reck            result = eval->generatedJITCode().execute(&m_registerFile, newCallFrame, scopeChain->globalData);
1139e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
1140e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        else
1141e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
1142e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
1143e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
1144e14391e94c850b8bd03680c23b38978db68687a8John Reck            result = privateExecute(Normal, &m_registerFile, newCallFrame);
11458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
11468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_reentryDepth--;
11478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (*profiler)
1150231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        (*profiler)->didExecute(callFrame, eval->sourceURL(), eval->lineNo());
11518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_registerFile.shrink(oldEnd);
1153a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (pushedScope)
1154a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        scopeChain->pop();
1155e14391e94c850b8bd03680c23b38978db68687a8John Reck    return checkedReturn(result);
11568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1158635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectNEVER_INLINE void Interpreter::debug(CallFrame* callFrame, DebugHookID debugHookID, int firstLine, int lastLine)
11598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
11608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Debugger* debugger = callFrame->dynamicGlobalObject()->debugger();
11618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!debugger)
11628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
11638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (debugHookID) {
11658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case DidEnterCallFrame:
1166231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            debugger->callEvent(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), firstLine);
11678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
11688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WillLeaveCallFrame:
1169231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            debugger->returnEvent(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), lastLine);
11708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
11718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WillExecuteStatement:
1172231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            debugger->atStatement(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), firstLine);
11738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
11748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case WillExecuteProgram:
1175231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            debugger->willExecuteProgram(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), firstLine);
11768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
11778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case DidExecuteProgram:
1178231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            debugger->didExecuteProgram(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), lastLine);
11798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
11808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        case DidReachBreakpoint:
1181231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            debugger->didReachBreakpoint(callFrame, callFrame->codeBlock()->ownerExecutable()->sourceID(), lastLine);
11828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
11838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
11848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1186e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
1187635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectNEVER_INLINE ScopeChainNode* Interpreter::createExceptionScope(CallFrame* callFrame, const Instruction* vPC)
11888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1189cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    int dst = vPC[1].u.operand;
11908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CodeBlock* codeBlock = callFrame->codeBlock();
1191cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Identifier& property = codeBlock->identifier(vPC[2].u.operand);
1192cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    JSValue value = callFrame->r(vPC[3].u.operand).jsValue();
11938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSObject* scope = new (callFrame) JSStaticScopeObject(callFrame, property, value, DontDelete);
11944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    callFrame->uncheckedR(dst) = JSValue(scope);
11958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return callFrame->scopeChain()->push(scope);
11978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
11988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11995f1ab04193ad0130ca8204aadaceae083aca9881Feng QianNEVER_INLINE void Interpreter::tryCachePutByID(CallFrame* callFrame, CodeBlock* codeBlock, Instruction* vPC, JSValue baseValue, const PutPropertySlot& slot)
12008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Recursive invocation may already have specialized this instruction.
12028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (vPC[0].u.opcode != getOpcode(op_put_by_id))
12038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1205635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!baseValue.isCell())
12068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Uncacheable: give up.
12098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!slot.isCacheable()) {
12108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[0] = getOpcode(op_put_by_id_generic);
12118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1214e14391e94c850b8bd03680c23b38978db68687a8John Reck    JSCell* baseCell = baseValue.asCell();
1215635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Structure* structure = baseCell->structure();
12168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1217231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (structure->isUncacheableDictionary()) {
12188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[0] = getOpcode(op_put_by_id_generic);
12198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1222635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Cache miss: record Structure to compare against next time.
12232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    Structure* lastStructure = vPC[4].u.structure.get();
1224635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (structure != lastStructure) {
1225635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // First miss: record Structure to compare against next time.
1226635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (!lastStructure) {
12272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            vPC[4].u.structure.set(callFrame->globalData(), codeBlock->ownerExecutable(), structure);
12288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
12298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
12308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Second miss: give up.
12328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[0] = getOpcode(op_put_by_id_generic);
12338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1236635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Cache hit: Specialize instruction and ref Structures.
12378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If baseCell != slot.base(), then baseCell must be a proxy for another object.
12398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (baseCell != slot.base()) {
12408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[0] = getOpcode(op_put_by_id_generic);
12418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1244635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Structure transition, cache transition info
12458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (slot.type() == PutPropertySlot::NewProperty) {
1246231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (structure->isDictionary()) {
1247231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            vPC[0] = getOpcode(op_put_by_id_generic);
1248231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            return;
1249231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
1250cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1251cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        // put_by_id_transition checks the prototype chain for setters.
1252cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        normalizePrototypeChain(callFrame, baseCell);
12532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        JSCell* owner = codeBlock->ownerExecutable();
12542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        JSGlobalData& globalData = callFrame->globalData();
12558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[0] = getOpcode(op_put_by_id_transition);
12562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        vPC[4].u.structure.set(globalData, owner, structure->previousID());
12572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        vPC[5].u.structure.set(globalData, owner, structure);
12582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        vPC[6].u.structureChain.set(callFrame->globalData(), codeBlock->ownerExecutable(), structure->prototypeChain(callFrame));
12592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        ASSERT(vPC[6].u.structureChain);
12608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[7] = slot.cachedOffset();
12618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    vPC[0] = getOpcode(op_put_by_id_replace);
12658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    vPC[5] = slot.cachedOffset();
12668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochNEVER_INLINE void Interpreter::uncachePutByID(CodeBlock*, Instruction* vPC)
12698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    vPC[0] = getOpcode(op_put_by_id);
12718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    vPC[4] = 0;
12728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
12738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12745f1ab04193ad0130ca8204aadaceae083aca9881Feng QianNEVER_INLINE void Interpreter::tryCacheGetByID(CallFrame* callFrame, CodeBlock* codeBlock, Instruction* vPC, JSValue baseValue, const Identifier& propertyName, const PropertySlot& slot)
12758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
12768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Recursive invocation may already have specialized this instruction.
12778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (vPC[0].u.opcode != getOpcode(op_get_by_id))
12788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: Cache property access for immediates.
1281635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!baseValue.isCell()) {
12828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[0] = getOpcode(op_get_by_id_generic);
12838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    JSGlobalData* globalData = &callFrame->globalData();
12878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (isJSArray(globalData, baseValue) && propertyName == callFrame->propertyNames().length) {
12888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[0] = getOpcode(op_get_array_length);
12898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    if (isJSString(globalData, baseValue) && propertyName == callFrame->propertyNames().length) {
12938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[0] = getOpcode(op_get_string_length);
12948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
12958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
12968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
12978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Uncacheable: give up.
12988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!slot.isCacheable()) {
12998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[0] = getOpcode(op_get_by_id_generic);
13008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
13018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
13028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1303e14391e94c850b8bd03680c23b38978db68687a8John Reck    Structure* structure = baseValue.asCell()->structure();
13048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1305231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (structure->isUncacheableDictionary()) {
13068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[0] = getOpcode(op_get_by_id_generic);
13078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
13088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
13098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Cache miss
13112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    Structure* lastStructure = vPC[4].u.structure.get();
1312635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (structure != lastStructure) {
1313635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // First miss: record Structure to compare against next time.
1314635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (!lastStructure) {
13152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            vPC[4].u.structure.set(callFrame->globalData(), codeBlock->ownerExecutable(), structure);
13168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return;
13178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
13188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Second miss: give up.
13208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC[0] = getOpcode(op_get_by_id_generic);
13218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
13228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
13238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1324635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Cache hit: Specialize instruction and ref Structures.
13258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (slot.slotBase() == baseValue) {
1327dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        switch (slot.cachedPropertyType()) {
1328dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        case PropertySlot::Getter:
1329dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[0] = getOpcode(op_get_by_id_getter_self);
1330dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[5] = slot.cachedOffset();
1331dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            break;
1332dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        case PropertySlot::Custom:
1333dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[0] = getOpcode(op_get_by_id_custom_self);
1334dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[5] = slot.customGetter();
1335dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            break;
1336dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        default:
1337dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[0] = getOpcode(op_get_by_id_self);
1338dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[5] = slot.cachedOffset();
1339dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            break;
1340dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
13418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
13428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
13438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1344643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (structure->isDictionary()) {
1345643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        vPC[0] = getOpcode(op_get_by_id_generic);
1346643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
1347643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
1348643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1349635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (slot.slotBase() == structure->prototypeForLookup(callFrame)) {
1350635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        ASSERT(slot.slotBase().isObject());
13518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
13528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JSObject* baseObject = asObject(slot.slotBase());
1353d0825bca7fe65beaee391d30da42e937db621564Steve Block        size_t offset = slot.cachedOffset();
13548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1355635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Since we're accessing a prototype in a loop, it's a good bet that it
1356635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // should not be treated as a dictionary.
1357d0825bca7fe65beaee391d30da42e937db621564Steve Block        if (baseObject->structure()->isDictionary()) {
13582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            baseObject->flattenDictionaryObject(callFrame->globalData());
13592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            offset = baseObject->structure()->get(callFrame->globalData(), propertyName);
1360d0825bca7fe65beaee391d30da42e937db621564Steve Block        }
1361643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1362643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        ASSERT(!baseObject->structure()->isUncacheableDictionary());
1363dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1364dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        switch (slot.cachedPropertyType()) {
1365dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        case PropertySlot::Getter:
1366dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[0] = getOpcode(op_get_by_id_getter_proto);
1367dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[6] = offset;
1368dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            break;
1369dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        case PropertySlot::Custom:
1370dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[0] = getOpcode(op_get_by_id_custom_proto);
1371dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[6] = slot.customGetter();
1372dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            break;
1373dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        default:
1374dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[0] = getOpcode(op_get_by_id_proto);
1375dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            vPC[6] = offset;
1376dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            break;
1377dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
13782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        vPC[5].u.structure.set(callFrame->globalData(), codeBlock->ownerExecutable(), baseObject->structure());
13798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
13808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
13818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1382d0825bca7fe65beaee391d30da42e937db621564Steve Block    size_t offset = slot.cachedOffset();
1383d0825bca7fe65beaee391d30da42e937db621564Steve Block    size_t count = normalizePrototypeChain(callFrame, baseValue, slot.slotBase(), propertyName, offset);
1384635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!count) {
1385635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        vPC[0] = getOpcode(op_get_by_id_generic);
1386635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
13878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
13888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1389dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1390dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    switch (slot.cachedPropertyType()) {
1391dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PropertySlot::Getter:
1392dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        vPC[0] = getOpcode(op_get_by_id_getter_chain);
1393dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        vPC[7] = offset;
1394dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
1395dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    case PropertySlot::Custom:
1396dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        vPC[0] = getOpcode(op_get_by_id_custom_chain);
1397dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        vPC[7] = slot.customGetter();
1398dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
1399dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    default:
1400dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        vPC[0] = getOpcode(op_get_by_id_chain);
1401dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        vPC[7] = offset;
1402dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        break;
1403dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
14042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    vPC[4].u.structure.set(callFrame->globalData(), codeBlock->ownerExecutable(), structure);
14052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    vPC[5].u.structureChain.set(callFrame->globalData(), codeBlock->ownerExecutable(), structure->prototypeChain(callFrame));
14068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    vPC[6] = count;
14078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
14088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochNEVER_INLINE void Interpreter::uncacheGetByID(CodeBlock*, Instruction* vPC)
14108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
14118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    vPC[0] = getOpcode(op_get_by_id);
14128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    vPC[4] = 0;
14138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
14148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1415e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif // ENABLE(INTERPRETER)
14165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1417e14391e94c850b8bd03680c23b38978db68687a8John ReckJSValue Interpreter::privateExecute(ExecutionFlag flag, RegisterFile* registerFile, CallFrame* callFrame)
14188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
14198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // One-time initialization of our address tables. We have to put this code
14208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // here because our labels are only in scope inside this function.
1421d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (UNLIKELY(flag == InitializeAndReturn)) {
1422e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        #if ENABLE(COMPUTED_GOTO_INTERPRETER)
1423d0825bca7fe65beaee391d30da42e937db621564Steve Block            #define LIST_OPCODE_LABEL(id, length) &&id,
1424d0825bca7fe65beaee391d30da42e937db621564Steve Block                static Opcode labels[] = { FOR_EACH_OPCODE_ID(LIST_OPCODE_LABEL) };
1425e14391e94c850b8bd03680c23b38978db68687a8John Reck                for (size_t i = 0; i < WTF_ARRAY_LENGTH(labels); ++i)
1426d0825bca7fe65beaee391d30da42e937db621564Steve Block                    m_opcodeTable[i] = labels[i];
1427d0825bca7fe65beaee391d30da42e937db621564Steve Block            #undef LIST_OPCODE_LABEL
1428e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        #endif // ENABLE(COMPUTED_GOTO_INTERPRETER)
14295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return JSValue();
14308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1431e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1432635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(JIT)
1433e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
14340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // Mixing Interpreter + JIT is not supported.
1435e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (callFrame->globalData().canUseJIT())
1436e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
1437e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        ASSERT_NOT_REACHED();
14388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1439e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
1440e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if !ENABLE(INTERPRETER)
14415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    UNUSED_PARAM(registerFile);
14425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    UNUSED_PARAM(callFrame);
14435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return JSValue();
14445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#else
14458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSGlobalData* globalData = &callFrame->globalData();
14475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue exceptionValue;
1448635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    HandlerInfo* handler = 0;
14498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1450e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    CodeBlock* codeBlock = callFrame->codeBlock();
1451e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    Instruction* vPC = codeBlock->instructions().begin();
14528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Profiler** enabledProfilerReference = Profiler::enabledProfilerReference();
14538f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    unsigned tickCount = globalData->timeoutChecker.ticksUntilNextCheck();
1454e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    JSValue functionReturnValue;
14558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1456635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#define CHECK_FOR_EXCEPTION() \
14578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    do { \
14582bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (UNLIKELY(globalData->exception != JSValue())) { \
14592bde8e466a4451c7319e3a072d118917957d6554Steve Block            exceptionValue = globalData->exception; \
14608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            goto vm_throw; \
14618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } \
14628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } while (0)
14638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(OPCODE_STATS)
14658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    OpcodeStats::resetLastInstruction();
14668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
14678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define CHECK_FOR_TIMEOUT() \
14698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!--tickCount) { \
1470dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (globalData->terminator.shouldTerminate() || globalData->timeoutChecker.didTimeOut(callFrame)) { \
1471635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            exceptionValue = jsNull(); \
14728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            goto vm_throw; \
1473635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        } \
14748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        tickCount = globalData->timeoutChecker.ticksUntilNextCheck(); \
14758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
14768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
14778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(OPCODE_SAMPLING)
14788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    #define SAMPLE(codeBlock, vPC) m_sampler->sample(codeBlock, vPC)
14798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
14808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    #define SAMPLE(codeBlock, vPC)
14818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
14828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1483e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(COMPUTED_GOTO_INTERPRETER)
1484e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    #define NEXT_INSTRUCTION() SAMPLE(codeBlock, vPC); goto *vPC->u.opcode
14858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(OPCODE_STATS)
1486635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    #define DEFINE_OPCODE(opcode) opcode: OpcodeStats::recordInstruction(opcode);
14878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
1488635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    #define DEFINE_OPCODE(opcode) opcode:
14898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1490635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    NEXT_INSTRUCTION();
14918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
1492e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    #define NEXT_INSTRUCTION() SAMPLE(codeBlock, vPC); goto interpreterLoopStart
14938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(OPCODE_STATS)
1494635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    #define DEFINE_OPCODE(opcode) case opcode: OpcodeStats::recordInstruction(opcode);
14958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
1496635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    #define DEFINE_OPCODE(opcode) case opcode:
14978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
14988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (1) { // iterator loop begins
14998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    interpreterLoopStart:;
15008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    switch (vPC->u.opcode)
15018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
15028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1503635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_new_object) {
15048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* new_object dst(r)
15058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Constructs a new empty Object instance using the original
15078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           constructor, and puts the result in register dst.
15088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1509cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
15104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = JSValue(constructEmptyObject(callFrame));
15118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1512cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_new_object);
1513635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
15148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1515635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_new_array) {
15168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* new_array dst(r) firstArg(r) argCount(n)
15178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Constructs a new Array instance using the original
15198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           constructor, and puts the result in register dst.
15208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           The array will contain argCount elements with values
15218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           taken from registers starting at register firstArg.
15228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1523cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1524cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int firstArg = vPC[2].u.operand;
1525cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int argCount = vPC[3].u.operand;
15268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ArgList args(callFrame->registers() + firstArg, argCount);
15274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = JSValue(constructArray(callFrame, args));
15288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1529cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_new_array);
1530635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
15318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
15326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    DEFINE_OPCODE(op_new_regexp) {
15336c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        /* new_regexp dst(r) regExp(re)
15346c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
15356c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen           Constructs a new RegExp instance using the original
15366c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen           constructor from regexp regExp, and puts the result in
15376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen           register dst.
15386c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        */
15396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        int dst = vPC[1].u.operand;
15402bde8e466a4451c7319e3a072d118917957d6554Steve Block        RegExp* regExp = codeBlock->regexp(vPC[2].u.operand);
15412bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!regExp->isValid()) {
15422bde8e466a4451c7319e3a072d118917957d6554Steve Block            exceptionValue = createSyntaxError(callFrame, "Invalid flags supplied to RegExp constructor.");
15432bde8e466a4451c7319e3a072d118917957d6554Steve Block            goto vm_throw;
15442bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
15452bde8e466a4451c7319e3a072d118917957d6554Steve Block        callFrame->uncheckedR(dst) = JSValue(new (globalData) RegExpObject(callFrame->lexicalGlobalObject(), callFrame->scopeChain()->globalObject->regExpStructure(), regExp));
15466c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
15476c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        vPC += OPCODE_LENGTH(op_new_regexp);
15486c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        NEXT_INSTRUCTION();
15496c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
1550635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_mov) {
15518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* mov dst(r) src(r)
15528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Copies register src to register dst.
15548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1555cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1556cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
1557a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
15584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = callFrame->r(src);
15598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1560cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_mov);
1561635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
15628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1563635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_eq) {
15648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* eq dst(r) src1(r) src2(r)
15658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Checks whether register src1 and register src2 are equal,
15678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           as with the ECMAScript '==' operator, and puts the result
15688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           as a boolean in register dst.
15698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1570cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1571cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
1572cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
15730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (src1.isInt32() && src2.isInt32())
15744576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsBoolean(src1.asInt32() == src2.asInt32());
15758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
15765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSValue result = jsBoolean(JSValue::equalSlowCase(callFrame, src1, src2));
1577635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
15784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
15798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
15808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1581cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_eq);
1582635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
15838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1584635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_eq_null) {
15858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* eq_null dst(r) src(r)
15868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Checks whether register src is null, as with the ECMAScript '!='
15888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           operator, and puts the result as a boolean in register dst.
15898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1590cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1591cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src = callFrame->r(vPC[2].u.operand).jsValue();
15928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1593635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (src.isUndefinedOrNull()) {
15944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsBoolean(true);
1595cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            vPC += OPCODE_LENGTH(op_eq_null);
1596635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
15978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
15988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
15994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(src.isCell() && src.asCell()->structure()->typeInfo().masqueradesAsUndefined());
1600cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_eq_null);
1601635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
16028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1603635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_neq) {
16048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* neq dst(r) src1(r) src2(r)
16058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Checks whether register src1 and register src2 are not
16078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           equal, as with the ECMAScript '!=' operator, and puts the
16088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           result as a boolean in register dst.
16098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1610cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1611cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
1612cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
16130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (src1.isInt32() && src2.isInt32())
16144576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsBoolean(src1.asInt32() != src2.asInt32());
16158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
16165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSValue result = jsBoolean(!JSValue::equalSlowCase(callFrame, src1, src2));
1617635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
16184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
16198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
16208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1621cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_neq);
1622635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
16238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1624635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_neq_null) {
16258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* neq_null dst(r) src(r)
16268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Checks whether register src is not null, as with the ECMAScript '!='
16288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           operator, and puts the result as a boolean in register dst.
16298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1630cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1631cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src = callFrame->r(vPC[2].u.operand).jsValue();
16328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1633635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (src.isUndefinedOrNull()) {
16344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsBoolean(false);
1635cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            vPC += OPCODE_LENGTH(op_neq_null);
1636635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
16378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
16388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(!src.isCell() || !src.asCell()->structure()->typeInfo().masqueradesAsUndefined());
1640cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_neq_null);
1641635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
16428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1643635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_stricteq) {
16448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* stricteq dst(r) src1(r) src2(r)
16458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Checks whether register src1 and register src2 are strictly
16478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           equal, as with the ECMAScript '===' operator, and puts the
16488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           result as a boolean in register dst.
16498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1650cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1651cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
1652cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
1653e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        bool result = JSValue::strictEqual(callFrame, src1, src2);
1654e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        CHECK_FOR_EXCEPTION();
16554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(result);
16568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1657cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_stricteq);
1658635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
16598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1660635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_nstricteq) {
16618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* nstricteq dst(r) src1(r) src2(r)
16628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Checks whether register src1 and register src2 are not
16648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           strictly equal, as with the ECMAScript '!==' operator, and
16658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           puts the result as a boolean in register dst.
16668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1667cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1668cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
1669cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
1670e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        bool result = !JSValue::strictEqual(callFrame, src1, src2);
1671e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        CHECK_FOR_EXCEPTION();
16724576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(result);
16738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1674cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_nstricteq);
1675635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
16768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1677635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_less) {
16788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* less dst(r) src1(r) src2(r)
16798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Checks whether register src1 is less than register src2, as
16818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           with the ECMAScript '<' operator, and puts the result as
16828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           a boolean in register dst.
16838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1684cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1685cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
1686cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
16875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue result = jsBoolean(jsLess(callFrame, src1, src2));
1688635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
16894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = result;
16908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1691cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_less);
1692635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
16938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1694635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_lesseq) {
16958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* lesseq dst(r) src1(r) src2(r)
16968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
16978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Checks whether register src1 is less than or equal to
16988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           register src2, as with the ECMAScript '<=' operator, and
16998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           puts the result as a boolean in register dst.
17008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1701cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1702cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
1703cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
17045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue result = jsBoolean(jsLessEq(callFrame, src1, src2));
1705635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
17064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = result;
17078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1708cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_lesseq);
1709635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
17108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1711635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_pre_inc) {
17128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* pre_inc srcDst(r)
17138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Converts register srcDst to number, adds one, and puts the result
17158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           back in register srcDst.
17168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1717cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int srcDst = vPC[1].u.operand;
17180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue v = callFrame->r(srcDst).jsValue();
17190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (v.isInt32() && v.asInt32() < INT_MAX)
17204576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(srcDst) = jsNumber(v.asInt32() + 1);
17218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
1722e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber(v.toNumber(callFrame) + 1);
1723635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
17244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(srcDst) = result;
17258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
17268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1727cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_pre_inc);
1728635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
17298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1730635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_pre_dec) {
17318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* pre_dec srcDst(r)
17328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Converts register srcDst to number, subtracts one, and puts the result
17348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           back in register srcDst.
17358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1736cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int srcDst = vPC[1].u.operand;
17370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue v = callFrame->r(srcDst).jsValue();
17380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (v.isInt32() && v.asInt32() > INT_MIN)
17394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(srcDst) = jsNumber(v.asInt32() - 1);
17408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
1741e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber(v.toNumber(callFrame) - 1);
1742635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
17434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(srcDst) = result;
17448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
17458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1746cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_pre_dec);
1747635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
17488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1749635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_post_inc) {
17508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* post_inc dst(r) srcDst(r)
17518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Converts register srcDst to number. The number itself is
17538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           written to register dst, and the number plus one is written
17548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           back to register srcDst.
17558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1756cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1757cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int srcDst = vPC[2].u.operand;
17580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue v = callFrame->r(srcDst).jsValue();
17590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (v.isInt32() && v.asInt32() < INT_MAX) {
17604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(srcDst) = jsNumber(v.asInt32() + 1);
17614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = v;
17628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
17630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            JSValue number = callFrame->r(srcDst).jsValue().toJSNumber(callFrame);
1764635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
17654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(srcDst) = jsNumber(number.uncheckedGetNumber() + 1);
17664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = number;
17678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
17688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1769cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_post_inc);
1770635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
17718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1772635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_post_dec) {
17738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* post_dec dst(r) srcDst(r)
17748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Converts register srcDst to number. The number itself is
17768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           written to register dst, and the number minus one is written
17778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           back to register srcDst.
17788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1779cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1780cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int srcDst = vPC[2].u.operand;
17810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue v = callFrame->r(srcDst).jsValue();
17820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (v.isInt32() && v.asInt32() > INT_MIN) {
17834576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(srcDst) = jsNumber(v.asInt32() - 1);
17844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = v;
17858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
17860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            JSValue number = callFrame->r(srcDst).jsValue().toJSNumber(callFrame);
1787635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
17884576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(srcDst) = jsNumber(number.uncheckedGetNumber() - 1);
17894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = number;
17908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
17918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1792cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_post_dec);
1793635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
17948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1795635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_to_jsnumber) {
17968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* to_jsnumber dst(r) src(r)
17978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
17988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Converts register src to number, and puts the result
17998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst.
18008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1801cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1802cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
18038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue srcVal = callFrame->r(src).jsValue();
18058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1806635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (LIKELY(srcVal.isNumber()))
18074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = callFrame->r(src);
18088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
18095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSValue result = srcVal.toJSNumber(callFrame);
1810635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
18114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
18128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
18138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1814cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_to_jsnumber);
1815635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
18168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1817635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_negate) {
18188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* negate dst(r) src(r)
18198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Converts register src to number, negates it, and puts the
18218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           result in register dst.
18228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1823cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1824cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src = callFrame->r(vPC[2].u.operand).jsValue();
1825dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (src.isInt32() && (src.asInt32() & 0x7fffffff)) // non-zero and no overflow
18264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(-src.asInt32());
18278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
1828e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber(-src.toNumber(callFrame));
1829635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
18304576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
18318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
18328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1833cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_negate);
1834635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
18358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1836635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_add) {
18378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* add dst(r) src1(r) src2(r)
18388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Adds register src1 and register src2, and puts the result
18408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst. (JS add may be string concatenation or
18418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           numeric add, depending on the types of the operands.)
18428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1843cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1844cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
1845cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
1846643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (src1.isInt32() && src2.isInt32() && !(src1.asInt32() | (src2.asInt32() & 0xc0000000))) // no overflow
18474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(src1.asInt32() + src2.asInt32());
18488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
18495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSValue result = jsAdd(callFrame, src1, src2);
1850635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
18514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
18528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1853cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_add);
1854635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
18558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1856635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_mul) {
18578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* mul dst(r) src1(r) src2(r)
18588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Multiplies register src1 and register src2 (converted to
18608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           numbers), and puts the product in register dst.
18618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1862cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1863cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
1864cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
18650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (src1.isInt32() && src2.isInt32() && !(src1.asInt32() | src2.asInt32() >> 15)) // no overflow
18664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                callFrame->uncheckedR(dst) = jsNumber(src1.asInt32() * src2.asInt32());
18678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
1868e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber(src1.toNumber(callFrame) * src2.toNumber(callFrame));
1869635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
18704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
18718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
18728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1873cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_mul);
1874635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
18758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1876635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_div) {
18778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* div dst(r) dividend(r) divisor(r)
18788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Divides register dividend (converted to number) by the
18808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           register divisor (converted to number), and puts the
18818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           quotient in register dst.
18828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1883cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1884cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue dividend = callFrame->r(vPC[2].u.operand).jsValue();
1885cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue divisor = callFrame->r(vPC[3].u.operand).jsValue();
18860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1887e14391e94c850b8bd03680c23b38978db68687a8John Reck        JSValue result = jsNumber(dividend.toNumber(callFrame) / divisor.toNumber(callFrame));
18880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        CHECK_FOR_EXCEPTION();
18894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = result;
18900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1891cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_div);
1892635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
18938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1894635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_mod) {
18958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* mod dst(r) dividend(r) divisor(r)
18968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
18978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Divides register dividend (converted to number) by
18988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           register divisor (converted to number), and puts the
18998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           remainder in register dst.
19008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1901cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1902cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue dividend = callFrame->r(vPC[2].u.operand).jsValue();
1903cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue divisor = callFrame->r(vPC[3].u.operand).jsValue();
19048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (dividend.isInt32() && divisor.isInt32() && divisor.asInt32() != 0) {
1906e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber(dividend.asInt32() % divisor.asInt32());
1907635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            ASSERT(result);
19084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
1909cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            vPC += OPCODE_LENGTH(op_mod);
1910635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
19118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
19128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Conversion to double must happen outside the call to fmod since the
19140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // order of argument evaluation is not guaranteed.
19150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        double d1 = dividend.toNumber(callFrame);
19160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        double d2 = divisor.toNumber(callFrame);
1917e14391e94c850b8bd03680c23b38978db68687a8John Reck        JSValue result = jsNumber(fmod(d1, d2));
1918635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
19194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = result;
1920cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_mod);
1921635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
19228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1923635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_sub) {
19248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* sub dst(r) src1(r) src2(r)
19258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Subtracts register src2 (converted to number) from register
19278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           src1 (converted to number), and puts the difference in
19288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           register dst.
19298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1930cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1931cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
1932cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
1933643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (src1.isInt32() && src2.isInt32() && !(src1.asInt32() | (src2.asInt32() & 0xc0000000))) // no overflow
19344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(src1.asInt32() - src2.asInt32());
19358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
1936e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber(src1.toNumber(callFrame) - src2.toNumber(callFrame));
1937635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
19384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
19398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
1940cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_sub);
1941635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
19428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1943635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_lshift) {
19448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* lshift dst(r) val(r) shift(r)
19458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Performs left shift of register val (converted to int32) by
19478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           register shift (converted to uint32), and puts the result
19488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst.
19498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1950cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1951cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue val = callFrame->r(vPC[2].u.operand).jsValue();
1952cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue shift = callFrame->r(vPC[3].u.operand).jsValue();
19530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
19540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (val.isInt32() && shift.isInt32())
19554576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(val.asInt32() << (shift.asInt32() & 0x1f));
19568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
1957e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber((val.toInt32(callFrame)) << (shift.toUInt32(callFrame) & 0x1f));
1958635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
19594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
19608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
19618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1962cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_lshift);
1963635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
19648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1965635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_rshift) {
19668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* rshift dst(r) val(r) shift(r)
19678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Performs arithmetic right shift of register val (converted
19698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           to int32) by register shift (converted to
19708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           uint32), and puts the result in register dst.
19718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1972cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1973cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue val = callFrame->r(vPC[2].u.operand).jsValue();
1974cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue shift = callFrame->r(vPC[3].u.operand).jsValue();
19750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
19760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (val.isInt32() && shift.isInt32())
19774576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(val.asInt32() >> (shift.asInt32() & 0x1f));
19788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
1979e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber((val.toInt32(callFrame)) >> (shift.toUInt32(callFrame) & 0x1f));
1980635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
19814576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
19828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
19838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1984cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_rshift);
1985635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
19868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1987635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_urshift) {
19888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* rshift dst(r) val(r) shift(r)
19898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
19908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Performs logical right shift of register val (converted
19918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           to uint32) by register shift (converted to
19928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           uint32), and puts the result in register dst.
19938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
1994cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
1995cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue val = callFrame->r(vPC[2].u.operand).jsValue();
1996cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue shift = callFrame->r(vPC[3].u.operand).jsValue();
19970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (val.isUInt32() && shift.isInt32())
19984576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(val.asInt32() >> (shift.asInt32() & 0x1f));
19998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
2000e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber((val.toUInt32(callFrame)) >> (shift.toUInt32(callFrame) & 0x1f));
2001635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
20024576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
20038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
20048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2005cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_urshift);
2006635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
20078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2008635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_bitand) {
20098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* bitand dst(r) src1(r) src2(r)
20108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Computes bitwise AND of register src1 (converted to int32)
20128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           and register src2 (converted to int32), and puts the result
20138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst.
20148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2015cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2016cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
2017cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
20180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (src1.isInt32() && src2.isInt32())
20194576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(src1.asInt32() & src2.asInt32());
20208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
2021e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber(src1.toInt32(callFrame) & src2.toInt32(callFrame));
2022635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
20234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
20248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
20258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2026cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_bitand);
2027635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
20288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2029635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_bitxor) {
20308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* bitxor dst(r) src1(r) src2(r)
20318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Computes bitwise XOR of register src1 (converted to int32)
20338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           and register src2 (converted to int32), and puts the result
20348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst.
20358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2036cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2037cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
2038cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
20390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (src1.isInt32() && src2.isInt32())
20404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(src1.asInt32() ^ src2.asInt32());
20418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
2042e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber(src1.toInt32(callFrame) ^ src2.toInt32(callFrame));
2043635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
20444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
20458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
20468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2047cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_bitxor);
2048635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
20498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2050635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_bitor) {
20518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* bitor dst(r) src1(r) src2(r)
20528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Computes bitwise OR of register src1 (converted to int32)
20548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           and register src2 (converted to int32), and puts the
20558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           result in register dst.
20568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2057cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2058cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[2].u.operand).jsValue();
2059cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[3].u.operand).jsValue();
20600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (src1.isInt32() && src2.isInt32())
20614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(src1.asInt32() | src2.asInt32());
20628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
2063e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber(src1.toInt32(callFrame) | src2.toInt32(callFrame));
2064635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
20654576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
20668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
20678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2068cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_bitor);
2069635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
20708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2071635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_bitnot) {
20728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* bitnot dst(r) src(r)
20738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Computes bitwise NOT of register src1 (converted to int32),
20758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           and puts the result in register dst.
20768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2077cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2078cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src = callFrame->r(vPC[2].u.operand).jsValue();
20790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (src.isInt32())
20804576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(~src.asInt32());
20818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
2082e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = jsNumber(~src.toInt32(callFrame));
2083635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
20844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
20858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
2086cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_bitnot);
2087635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
20888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2089635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_not) {
20908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* not dst(r) src(r)
20918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
20928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Computes logical NOT of register src (converted to
20938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           boolean), and puts the result in register dst.
20948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2095cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2096cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
20970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue result = jsBoolean(!callFrame->r(src).jsValue().toBoolean(callFrame));
2098635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
20994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = result;
21008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2101cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_not);
2102635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
21038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
21046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    DEFINE_OPCODE(op_check_has_instance) {
21056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        /* check_has_instance constructor(r)
21066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
21076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner           Check 'constructor' is an object with the internal property
21086b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner           [HasInstance] (i.e. is a function ... *shakes head sadly at
21096b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner           JSC API*). Raises an exception if register constructor is not
21106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner           an valid parameter for instanceof.
21116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        */
21126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        int base = vPC[1].u.operand;
21136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        JSValue baseVal = callFrame->r(base).jsValue();
21146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
21156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (isInvalidParamForInstanceOf(callFrame, baseVal, exceptionValue))
21166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            goto vm_throw;
21176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
21186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        vPC += OPCODE_LENGTH(op_check_has_instance);
21196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        NEXT_INSTRUCTION();
21206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
2121635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_instanceof) {
21228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* instanceof dst(r) value(r) constructor(r) constructorProto(r)
21238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Tests whether register value is an instance of register
21258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           constructor, and puts the boolean result in register
21268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           dst. Register constructorProto must contain the "prototype"
21278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           property (not the actual prototype) of the object in
21288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           register constructor. This lookup is separated so that
21298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           polymorphic inline caching can apply.
21308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Raises an exception if register constructor is not an
21328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           object.
21338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
21348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int dst = vPC[1].u.operand;
21358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int value = vPC[2].u.operand;
21368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[3].u.operand;
21378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int baseProto = vPC[4].u.operand;
21388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseVal = callFrame->r(base).jsValue();
21408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        ASSERT(!isInvalidParamForInstanceOf(callFrame, baseVal, exceptionValue));
21428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        bool result = asObject(baseVal)->hasInstance(callFrame, callFrame->r(value).jsValue(), callFrame->r(baseProto).jsValue());
21445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        CHECK_FOR_EXCEPTION();
21454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(result);
21468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2147cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_instanceof);
2148635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
21498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_typeof) {
21518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* typeof dst(r) src(r)
21528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Determines the type string for src according to ECMAScript
21548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           rules, and puts the result in register dst.
21558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2156cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2157cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
21584576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = JSValue(jsTypeStringForValue(callFrame, callFrame->r(src).jsValue()));
21598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2160cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_typeof);
2161635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
21628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2163635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_is_undefined) {
21648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* is_undefined dst(r) src(r)
21658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Determines whether the type string for src according to
21678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the ECMAScript rules is "undefined", and puts the result
21688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst.
21698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2170cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2171cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
21720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue v = callFrame->r(src).jsValue();
21734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(v.isCell() ? v.asCell()->structure()->typeInfo().masqueradesAsUndefined() : v.isUndefined());
21748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2175cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_is_undefined);
2176635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
21778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2178635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_is_boolean) {
21798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* is_boolean dst(r) src(r)
21808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Determines whether the type string for src according to
21828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the ECMAScript rules is "boolean", and puts the result
21838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst.
21848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2185cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2186cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
21874576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(callFrame->r(src).jsValue().isBoolean());
21888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2189cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_is_boolean);
2190635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
21918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2192635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_is_number) {
21938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* is_number dst(r) src(r)
21948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Determines whether the type string for src according to
21968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the ECMAScript rules is "number", and puts the result
21978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst.
21988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2199cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2200cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
22014576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(callFrame->r(src).jsValue().isNumber());
22028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2203cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_is_number);
2204635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
22058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2206635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_is_string) {
22078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* is_string dst(r) src(r)
22088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Determines whether the type string for src according to
22108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the ECMAScript rules is "string", and puts the result
22118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst.
22128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2213cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2214cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
22154576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(callFrame->r(src).jsValue().isString());
22168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2217cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_is_string);
2218635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
22198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2220635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_is_object) {
22218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* is_object dst(r) src(r)
22228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Determines whether the type string for src according to
22248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the ECMAScript rules is "object", and puts the result
22258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst.
22268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2227cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2228cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
22294576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(jsIsObjectType(callFrame->r(src).jsValue()));
22308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2231cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_is_object);
2232635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
22338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2234635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_is_function) {
22358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* is_function dst(r) src(r)
22368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Determines whether the type string for src according to
22388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the ECMAScript rules is "function", and puts the result
22398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst.
22408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2241cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2242cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
22434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(jsIsFunctionType(callFrame->r(src).jsValue()));
22448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2245cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_is_function);
2246635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
22478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2248635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_in) {
22498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* in dst(r) property(r) base(r)
22508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Tests whether register base has a property named register
22528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           property, and puts the boolean result in register dst.
22538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Raises an exception if register constructor is not an
22558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           object.
22568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
2257cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2258cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int property = vPC[2].u.operand;
2259cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int base = vPC[3].u.operand;
22608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseVal = callFrame->r(base).jsValue();
22626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        if (isInvalidParamForIn(callFrame, baseVal, exceptionValue))
22638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            goto vm_throw;
22648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JSObject* baseObj = asObject(baseVal);
22668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue propName = callFrame->r(property).jsValue();
22688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        uint32_t i;
2270635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (propName.getUInt32(i))
22714576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsBoolean(baseObj->hasProperty(callFrame, i));
22728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
2273635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            Identifier property(callFrame, propName.toString(callFrame));
2274635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
22754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsBoolean(baseObj->hasProperty(callFrame, property));
22768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
22778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2278cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_in);
2279635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
22808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2281635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_resolve) {
22828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* resolve dst(r) property(id)
22838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Looks up the property named by identifier property in the
22858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           scope chain, and writes the resulting value to register
22868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           dst. If the property is not found, raises an exception.
22878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
22888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (UNLIKELY(!resolve(callFrame, vPC, exceptionValue)))
22898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            goto vm_throw;
22908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2291cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_resolve);
2292635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
22938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2294635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_resolve_skip) {
22958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* resolve_skip dst(r) property(id) skip(n)
22968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
22978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         Looks up the property named by identifier property in the
22988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         scope chain skipping the top 'skip' levels, and writes the resulting
22998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         value to register dst. If the property is not found, raises an exception.
23008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
23018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (UNLIKELY(!resolveSkip(callFrame, vPC, exceptionValue)))
23028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            goto vm_throw;
23038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2304cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_resolve_skip);
23058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2306635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
23078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2308635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_resolve_global) {
2309635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        /* resolve_skip dst(r) globalObject(c) property(id) structure(sID) offset(n)
23108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Performs a dynamic property lookup for the given property, on the provided
2312635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           global object.  If structure matches the Structure of the global then perform
23138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           a fast lookup using the case offset, otherwise fall back to a full resolve and
2314635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           cache the new structure and offset
23158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
23168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (UNLIKELY(!resolveGlobal(callFrame, vPC, exceptionValue)))
23178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            goto vm_throw;
23188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2319cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_resolve_global);
23208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2321635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
23228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
23236c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    DEFINE_OPCODE(op_resolve_global_dynamic) {
23246c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        /* resolve_skip dst(r) globalObject(c) property(id) structure(sID) offset(n), depth(n)
23256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
23266c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen         Performs a dynamic property lookup for the given property, on the provided
23276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen         global object.  If structure matches the Structure of the global then perform
23286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen         a fast lookup using the case offset, otherwise fall back to a full resolve and
23296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen         cache the new structure and offset.
23306c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
23316c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen         This walks through n levels of the scope chain to verify that none of those levels
23326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen         in the scope chain include dynamically added properties.
23336c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen         */
23346c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        if (UNLIKELY(!resolveGlobalDynamic(callFrame, vPC, exceptionValue)))
23356c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen            goto vm_throw;
23366c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
23376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        vPC += OPCODE_LENGTH(op_resolve_global_dynamic);
23386c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
23396c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        NEXT_INSTRUCTION();
23406c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
2341635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_global_var) {
23428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* get_global_var dst(r) globalObject(c) index(n)
23438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Gets the global var at global slot index and places it in register dst.
23458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
2346cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2347dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        JSGlobalObject* scope = codeBlock->globalObject();
23488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(scope->isGlobalObject());
2349dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        int index = vPC[2].u.operand;
23508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
235181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        callFrame->uncheckedR(dst) = scope->registerAt(index).get();
2352cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_get_global_var);
2353635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
23548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2355635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_put_global_var) {
23568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* put_global_var globalObject(c) index(n) value(r)
23578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Puts value into global slot index.
23598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
2360dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        JSGlobalObject* scope = codeBlock->globalObject();
23618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(scope->isGlobalObject());
2362dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        int index = vPC[1].u.operand;
2363dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        int value = vPC[2].u.operand;
23648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
236581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        scope->registerAt(index).set(*globalData, scope, callFrame->r(value).jsValue());
2366cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_put_global_var);
2367635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
23686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
2369635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_scoped_var) {
23708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* get_scoped_var dst(r) index(n) skip(n)
23718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         Loads the contents of the index-th local from the scope skip nodes from
2373e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block         the top of the scope chain, and places it in register dst.
23748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
2375cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
2376cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int index = vPC[2].u.operand;
2377e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int skip = vPC[3].u.operand;
23788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
23798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ScopeChainNode* scopeChain = callFrame->scopeChain();
23808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ScopeChainIterator iter = scopeChain->begin();
23818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ScopeChainIterator end = scopeChain->end();
23828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(iter != end);
2383a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT(codeBlock == callFrame->codeBlock());
2384a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        bool checkTopLevel = codeBlock->codeType() == FunctionCode && codeBlock->needsFullScopeChain();
2385a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT(skip || !checkTopLevel);
2386a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (checkTopLevel && skip--) {
2387a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (callFrame->r(codeBlock->activationRegister()).jsValue())
2388a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                ++iter;
2389a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
23908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        while (skip--) {
23918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ++iter;
23928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT(iter != end);
23938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
23948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT((*iter)->isVariableObject());
23952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        JSVariableObject* scope = static_cast<JSVariableObject*>(iter->get());
239681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        callFrame->uncheckedR(dst) = scope->registerAt(index).get();
2397a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT(callFrame->r(dst).jsValue());
2398cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_get_scoped_var);
2399635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
24008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2401635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_put_scoped_var) {
24028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* put_scoped_var index(n) skip(n) value(r)
24038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
2405cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int index = vPC[1].u.operand;
2406e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int skip = vPC[2].u.operand;
2407cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int value = vPC[3].u.operand;
24088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ScopeChainNode* scopeChain = callFrame->scopeChain();
24108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ScopeChainIterator iter = scopeChain->begin();
24118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ScopeChainIterator end = scopeChain->end();
2412a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT(codeBlock == callFrame->codeBlock());
24138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(iter != end);
2414a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        bool checkTopLevel = codeBlock->codeType() == FunctionCode && codeBlock->needsFullScopeChain();
2415a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT(skip || !checkTopLevel);
2416a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    if (checkTopLevel && skip--) {
2417a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (callFrame->r(codeBlock->activationRegister()).jsValue())
2418a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                ++iter;
2419a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
24208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        while (skip--) {
24218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ++iter;
24228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ASSERT(iter != end);
24238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
24248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT((*iter)->isVariableObject());
24262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        JSVariableObject* scope = static_cast<JSVariableObject*>(iter->get());
2427a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT(callFrame->r(value).jsValue());
242881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        scope->registerAt(index).set(*globalData, scope, callFrame->r(value).jsValue());
2429cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_put_scoped_var);
2430635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
24318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2432635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_resolve_base) {
243381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        /* resolve_base dst(r) property(id) isStrict(bool)
24348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Searches the scope chain for an object containing
24368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           identifier property, and if one is found, writes it to
243781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch           register dst. If none is found and isStrict is false, the
243881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch           outermost scope (which will be the global object) is
243981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch           stored in register dst.
24408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
24418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        resolveBase(callFrame, vPC);
244281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        CHECK_FOR_EXCEPTION();
24438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2444cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_resolve_base);
2445635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
24468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2447a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    DEFINE_OPCODE(op_ensure_property_exists) {
2448a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        /* ensure_property_exists base(r) property(id)
2449a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
2450a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch           Throws an exception if property does not exist on base
2451a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch         */
2452a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        int base = vPC[1].u.operand;
2453a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        int property = vPC[2].u.operand;
2454a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        Identifier& ident = codeBlock->identifier(property);
2455a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
2456a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        JSValue baseVal = callFrame->r(base).jsValue();
2457a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        JSObject* baseObject = asObject(baseVal);
2458a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        PropertySlot slot(baseVal);
2459a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!baseObject->getPropertySlot(callFrame, ident, slot)) {
2460a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            exceptionValue = createErrorForInvalidGlobalAssignment(callFrame, ident.ustring());
2461a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            goto vm_throw;
2462a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
246381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
246481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        vPC += OPCODE_LENGTH(op_ensure_property_exists);
2465a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        NEXT_INSTRUCTION();
2466a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
2467635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_resolve_with_base) {
24688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* resolve_with_base baseDst(r) propDst(r) property(id)
24698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Searches the scope chain for an object containing
24718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           identifier property, and if one is found, writes it to
24728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           register srcDst, and the retrieved property value to register
24738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           propDst. If the property is not found, raises an exception.
24748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           This is more efficient than doing resolve_base followed by
24768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           resolve, or resolve_base followed by get_by_id, as it
24778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           avoids duplicate hash lookups.
24788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
24798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (UNLIKELY(!resolveBaseAndProperty(callFrame, vPC, exceptionValue)))
24808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            goto vm_throw;
24818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2482cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_resolve_with_base);
2483635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
24848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2485635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_by_id) {
2486635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        /* get_by_id dst(r) base(r) property(id) structure(sID) nop(n) nop(n) nop(n)
24878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Generic property access: Gets the property named by identifier
24898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           property from the value base, and puts the result in register dst.
24908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
24918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int dst = vPC[1].u.operand;
24928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[2].u.operand;
24938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int property = vPC[3].u.operand;
24948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2495635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Identifier& ident = codeBlock->identifier(property);
24960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
24978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PropertySlot slot(baseValue);
24985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue result = baseValue.get(callFrame, ident, slot);
2499635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
25008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
25018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        tryCacheGetByID(callFrame, codeBlock, vPC, baseValue, ident, slot);
25028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
25034576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = result;
2504cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_get_by_id);
2505635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
25068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2507635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_by_id_self) {
2508635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        /* op_get_by_id_self dst(r) base(r) property(id) structure(sID) offset(n) nop(n) nop(n)
25098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
25108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Cached property access: Attempts to get a cached property from the
25118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           value base. If the cache misses, op_get_by_id_self reverts to
25128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           op_get_by_id.
25138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
25148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[2].u.operand;
25150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
25168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2517635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (LIKELY(baseValue.isCell())) {
2518e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSCell* baseCell = baseValue.asCell();
25192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            Structure* structure = vPC[4].u.structure.get();
25208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2521635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (LIKELY(baseCell->structure() == structure)) {
25228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ASSERT(baseCell->isObject());
25238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                JSObject* baseObject = asObject(baseCell);
25248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                int dst = vPC[1].u.operand;
25258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                int offset = vPC[5].u.operand;
25268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2527e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                ASSERT(baseObject->get(callFrame, codeBlock->identifier(vPC[3].u.operand)) == baseObject->getDirectOffset(offset));
25284576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                callFrame->uncheckedR(dst) = JSValue(baseObject->getDirectOffset(offset));
25298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2530cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                vPC += OPCODE_LENGTH(op_get_by_id_self);
2531635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                NEXT_INSTRUCTION();
25328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
25338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
25348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2535e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncacheGetByID(codeBlock, vPC);
2536635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
25378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2538635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_by_id_proto) {
2539635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        /* op_get_by_id_proto dst(r) base(r) property(id) structure(sID) prototypeStructure(sID) offset(n) nop(n)
25408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
25418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Cached property access: Attempts to get a cached property from the
25428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           value base's prototype. If the cache misses, op_get_by_id_proto
25438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           reverts to op_get_by_id.
25448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
25458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[2].u.operand;
25460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
25478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2548635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (LIKELY(baseValue.isCell())) {
2549e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSCell* baseCell = baseValue.asCell();
25502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            Structure* structure = vPC[4].u.structure.get();
25518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2552635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (LIKELY(baseCell->structure() == structure)) {
2553635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                ASSERT(structure->prototypeForLookup(callFrame).isObject());
2554635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                JSObject* protoObject = asObject(structure->prototypeForLookup(callFrame));
25552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                Structure* prototypeStructure = vPC[5].u.structure.get();
25568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2557635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                if (LIKELY(protoObject->structure() == prototypeStructure)) {
25588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    int dst = vPC[1].u.operand;
25598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    int offset = vPC[6].u.operand;
25608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2561e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                    ASSERT(protoObject->get(callFrame, codeBlock->identifier(vPC[3].u.operand)) == protoObject->getDirectOffset(offset));
2562e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                    ASSERT(baseValue.get(callFrame, codeBlock->identifier(vPC[3].u.operand)) == protoObject->getDirectOffset(offset));
25634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                    callFrame->uncheckedR(dst) = JSValue(protoObject->getDirectOffset(offset));
25648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2565cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                    vPC += OPCODE_LENGTH(op_get_by_id_proto);
2566635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    NEXT_INSTRUCTION();
25678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
25688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
25698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
25708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2571e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncacheGetByID(codeBlock, vPC);
2572635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
25738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2574bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2575692e5dbf12901edacf14812a6fae25462920af42Steve Block    goto *(&&skip_id_getter_proto);
2576692e5dbf12901edacf14812a6fae25462920af42Steve Block#endif
2577692e5dbf12901edacf14812a6fae25462920af42Steve Block    DEFINE_OPCODE(op_get_by_id_getter_proto) {
2578692e5dbf12901edacf14812a6fae25462920af42Steve Block        /* op_get_by_id_getter_proto dst(r) base(r) property(id) structure(sID) prototypeStructure(sID) offset(n) nop(n)
2579692e5dbf12901edacf14812a6fae25462920af42Steve Block
2580692e5dbf12901edacf14812a6fae25462920af42Steve Block         Cached property access: Attempts to get a cached getter property from the
2581692e5dbf12901edacf14812a6fae25462920af42Steve Block         value base's prototype. If the cache misses, op_get_by_id_getter_proto
2582692e5dbf12901edacf14812a6fae25462920af42Steve Block         reverts to op_get_by_id.
2583692e5dbf12901edacf14812a6fae25462920af42Steve Block         */
2584692e5dbf12901edacf14812a6fae25462920af42Steve Block        int base = vPC[2].u.operand;
2585692e5dbf12901edacf14812a6fae25462920af42Steve Block        JSValue baseValue = callFrame->r(base).jsValue();
2586692e5dbf12901edacf14812a6fae25462920af42Steve Block
2587692e5dbf12901edacf14812a6fae25462920af42Steve Block        if (LIKELY(baseValue.isCell())) {
2588e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSCell* baseCell = baseValue.asCell();
25892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            Structure* structure = vPC[4].u.structure.get();
2590692e5dbf12901edacf14812a6fae25462920af42Steve Block
2591692e5dbf12901edacf14812a6fae25462920af42Steve Block            if (LIKELY(baseCell->structure() == structure)) {
2592692e5dbf12901edacf14812a6fae25462920af42Steve Block                ASSERT(structure->prototypeForLookup(callFrame).isObject());
2593692e5dbf12901edacf14812a6fae25462920af42Steve Block                JSObject* protoObject = asObject(structure->prototypeForLookup(callFrame));
25942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                Structure* prototypeStructure = vPC[5].u.structure.get();
2595692e5dbf12901edacf14812a6fae25462920af42Steve Block
2596692e5dbf12901edacf14812a6fae25462920af42Steve Block                if (LIKELY(protoObject->structure() == prototypeStructure)) {
2597692e5dbf12901edacf14812a6fae25462920af42Steve Block                    int dst = vPC[1].u.operand;
2598692e5dbf12901edacf14812a6fae25462920af42Steve Block                    int offset = vPC[6].u.operand;
2599692e5dbf12901edacf14812a6fae25462920af42Steve Block                    if (GetterSetter* getterSetter = asGetterSetter(protoObject->getDirectOffset(offset).asCell())) {
2600692e5dbf12901edacf14812a6fae25462920af42Steve Block                        JSObject* getter = getterSetter->getter();
2601692e5dbf12901edacf14812a6fae25462920af42Steve Block                        CallData callData;
2602692e5dbf12901edacf14812a6fae25462920af42Steve Block                        CallType callType = getter->getCallData(callData);
2603692e5dbf12901edacf14812a6fae25462920af42Steve Block                        JSValue result = call(callFrame, getter, callType, callData, asObject(baseCell), ArgList());
2604692e5dbf12901edacf14812a6fae25462920af42Steve Block                        CHECK_FOR_EXCEPTION();
26054576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                        callFrame->uncheckedR(dst) = result;
2606692e5dbf12901edacf14812a6fae25462920af42Steve Block                    } else
26074576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                        callFrame->uncheckedR(dst) = jsUndefined();
2608692e5dbf12901edacf14812a6fae25462920af42Steve Block                    vPC += OPCODE_LENGTH(op_get_by_id_getter_proto);
2609692e5dbf12901edacf14812a6fae25462920af42Steve Block                    NEXT_INSTRUCTION();
2610692e5dbf12901edacf14812a6fae25462920af42Steve Block                }
2611692e5dbf12901edacf14812a6fae25462920af42Steve Block            }
2612692e5dbf12901edacf14812a6fae25462920af42Steve Block        }
2613e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncacheGetByID(codeBlock, vPC);
2614692e5dbf12901edacf14812a6fae25462920af42Steve Block        NEXT_INSTRUCTION();
2615692e5dbf12901edacf14812a6fae25462920af42Steve Block    }
2616bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2617692e5dbf12901edacf14812a6fae25462920af42Steve Block    skip_id_getter_proto:
2618692e5dbf12901edacf14812a6fae25462920af42Steve Block#endif
2619bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2620dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    goto *(&&skip_id_custom_proto);
2621dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
2622dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DEFINE_OPCODE(op_get_by_id_custom_proto) {
2623dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        /* op_get_by_id_custom_proto dst(r) base(r) property(id) structure(sID) prototypeStructure(sID) offset(n) nop(n)
2624dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2625dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         Cached property access: Attempts to use a cached named property getter
2626dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         from the value base's prototype. If the cache misses, op_get_by_id_custom_proto
2627dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         reverts to op_get_by_id.
2628dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         */
2629dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        int base = vPC[2].u.operand;
2630dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        JSValue baseValue = callFrame->r(base).jsValue();
2631dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2632dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (LIKELY(baseValue.isCell())) {
2633e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSCell* baseCell = baseValue.asCell();
26342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            Structure* structure = vPC[4].u.structure.get();
2635dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2636dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (LIKELY(baseCell->structure() == structure)) {
2637dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                ASSERT(structure->prototypeForLookup(callFrame).isObject());
2638dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                JSObject* protoObject = asObject(structure->prototypeForLookup(callFrame));
26392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                Structure* prototypeStructure = vPC[5].u.structure.get();
2640dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2641dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                if (LIKELY(protoObject->structure() == prototypeStructure)) {
2642dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    int dst = vPC[1].u.operand;
2643dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    int property = vPC[3].u.operand;
2644e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                    Identifier& ident = codeBlock->identifier(property);
2645dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2646dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    PropertySlot::GetValueFunc getter = vPC[6].u.getterFunc;
2647dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    JSValue result = getter(callFrame, protoObject, ident);
2648dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    CHECK_FOR_EXCEPTION();
26494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                    callFrame->uncheckedR(dst) = result;
2650dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    vPC += OPCODE_LENGTH(op_get_by_id_custom_proto);
2651dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    NEXT_INSTRUCTION();
2652dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                }
2653dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            }
2654dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
2655e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncacheGetByID(codeBlock, vPC);
2656dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        NEXT_INSTRUCTION();
2657dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
2658bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2659dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    skip_id_custom_proto:
2660dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
2661635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_by_id_self_list) {
2662635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Polymorphic self access caching currently only supported when JITting.
2663635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        ASSERT_NOT_REACHED();
2664635860845790a19bf50bbc51ba8fb66a96dde068The 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)!
2665cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_get_by_id_self_list);
2666635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
2667635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
2668635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_by_id_proto_list) {
2669635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Polymorphic prototype access caching currently only supported when JITting.
2670635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        ASSERT_NOT_REACHED();
2671635860845790a19bf50bbc51ba8fb66a96dde068The 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)!
2672cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_get_by_id_proto_list);
2673635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
2674635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
2675692e5dbf12901edacf14812a6fae25462920af42Steve Block    DEFINE_OPCODE(op_get_by_id_getter_self_list) {
2676692e5dbf12901edacf14812a6fae25462920af42Steve Block        // Polymorphic self access caching currently only supported when JITting.
2677692e5dbf12901edacf14812a6fae25462920af42Steve Block        ASSERT_NOT_REACHED();
2678692e5dbf12901edacf14812a6fae25462920af42Steve Block        // This case of the switch must not be empty, else (op_get_by_id_self_list == op_get_by_id_chain)!
2679692e5dbf12901edacf14812a6fae25462920af42Steve Block        vPC += OPCODE_LENGTH(op_get_by_id_self_list);
2680692e5dbf12901edacf14812a6fae25462920af42Steve Block        NEXT_INSTRUCTION();
2681692e5dbf12901edacf14812a6fae25462920af42Steve Block    }
2682692e5dbf12901edacf14812a6fae25462920af42Steve Block    DEFINE_OPCODE(op_get_by_id_getter_proto_list) {
2683692e5dbf12901edacf14812a6fae25462920af42Steve Block        // Polymorphic prototype access caching currently only supported when JITting.
2684692e5dbf12901edacf14812a6fae25462920af42Steve Block        ASSERT_NOT_REACHED();
2685692e5dbf12901edacf14812a6fae25462920af42Steve Block        // This case of the switch must not be empty, else (op_get_by_id_proto_list == op_get_by_id_chain)!
2686692e5dbf12901edacf14812a6fae25462920af42Steve Block        vPC += OPCODE_LENGTH(op_get_by_id_proto_list);
2687692e5dbf12901edacf14812a6fae25462920af42Steve Block        NEXT_INSTRUCTION();
2688692e5dbf12901edacf14812a6fae25462920af42Steve Block    }
2689dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DEFINE_OPCODE(op_get_by_id_custom_self_list) {
2690dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Polymorphic self access caching currently only supported when JITting.
2691dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ASSERT_NOT_REACHED();
2692dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // This case of the switch must not be empty, else (op_get_by_id_self_list == op_get_by_id_chain)!
2693dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        vPC += OPCODE_LENGTH(op_get_by_id_custom_self_list);
2694dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        NEXT_INSTRUCTION();
2695dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
2696dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DEFINE_OPCODE(op_get_by_id_custom_proto_list) {
2697dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Polymorphic prototype access caching currently only supported when JITting.
2698dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ASSERT_NOT_REACHED();
2699dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // This case of the switch must not be empty, else (op_get_by_id_proto_list == op_get_by_id_chain)!
2700dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        vPC += OPCODE_LENGTH(op_get_by_id_proto_list);
2701dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        NEXT_INSTRUCTION();
2702dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
27032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
27042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    goto *(&&skip_get_by_id_chain);
27052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
2706635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_by_id_chain) {
2707635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        /* op_get_by_id_chain dst(r) base(r) property(id) structure(sID) structureChain(chain) count(n) offset(n)
27088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
27098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Cached property access: Attempts to get a cached property from the
27108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           value base's prototype chain. If the cache misses, op_get_by_id_chain
27118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           reverts to op_get_by_id.
27128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
27138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[2].u.operand;
27140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
27158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2716635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (LIKELY(baseValue.isCell())) {
2717e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSCell* baseCell = baseValue.asCell();
27182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            Structure* structure = vPC[4].u.structure.get();
27198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2720635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (LIKELY(baseCell->structure() == structure)) {
27212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                WriteBarrier<Structure>* it = vPC[5].u.structureChain->head();
27228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                size_t count = vPC[6].u.operand;
27232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                WriteBarrier<Structure>* end = it + count;
27248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2725635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                while (true) {
2726635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    JSObject* baseObject = asObject(baseCell->structure()->prototypeForLookup(callFrame));
2727635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2728635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    if (UNLIKELY(baseObject->structure() != (*it).get()))
27298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        break;
27308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
27318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    if (++it == end) {
27328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        int dst = vPC[1].u.operand;
27338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                        int offset = vPC[7].u.operand;
27348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2735e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                        ASSERT(baseObject->get(callFrame, codeBlock->identifier(vPC[3].u.operand)) == baseObject->getDirectOffset(offset));
2736e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                        ASSERT(baseValue.get(callFrame, codeBlock->identifier(vPC[3].u.operand)) == baseObject->getDirectOffset(offset));
27374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                        callFrame->uncheckedR(dst) = JSValue(baseObject->getDirectOffset(offset));
27388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2739cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                        vPC += OPCODE_LENGTH(op_get_by_id_chain);
2740635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                        NEXT_INSTRUCTION();
27418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
2742635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2743635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    // Update baseCell, so that next time around the loop we'll pick up the prototype's prototype.
2744635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    baseCell = baseObject;
27458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
27468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
27478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
27488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2749e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncacheGetByID(codeBlock, vPC);
2750635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
27518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2752bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
27532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    skip_get_by_id_chain:
2754692e5dbf12901edacf14812a6fae25462920af42Steve Block    goto *(&&skip_id_getter_self);
2755692e5dbf12901edacf14812a6fae25462920af42Steve Block#endif
2756692e5dbf12901edacf14812a6fae25462920af42Steve Block    DEFINE_OPCODE(op_get_by_id_getter_self) {
2757692e5dbf12901edacf14812a6fae25462920af42Steve Block        /* op_get_by_id_self dst(r) base(r) property(id) structure(sID) offset(n) nop(n) nop(n)
2758692e5dbf12901edacf14812a6fae25462920af42Steve Block
2759692e5dbf12901edacf14812a6fae25462920af42Steve Block         Cached property access: Attempts to get a cached property from the
2760692e5dbf12901edacf14812a6fae25462920af42Steve Block         value base. If the cache misses, op_get_by_id_getter_self reverts to
2761692e5dbf12901edacf14812a6fae25462920af42Steve Block         op_get_by_id.
2762692e5dbf12901edacf14812a6fae25462920af42Steve Block         */
2763692e5dbf12901edacf14812a6fae25462920af42Steve Block        int base = vPC[2].u.operand;
2764692e5dbf12901edacf14812a6fae25462920af42Steve Block        JSValue baseValue = callFrame->r(base).jsValue();
2765692e5dbf12901edacf14812a6fae25462920af42Steve Block
2766692e5dbf12901edacf14812a6fae25462920af42Steve Block        if (LIKELY(baseValue.isCell())) {
2767e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSCell* baseCell = baseValue.asCell();
27682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            Structure* structure = vPC[4].u.structure.get();
2769692e5dbf12901edacf14812a6fae25462920af42Steve Block
2770692e5dbf12901edacf14812a6fae25462920af42Steve Block            if (LIKELY(baseCell->structure() == structure)) {
2771692e5dbf12901edacf14812a6fae25462920af42Steve Block                ASSERT(baseCell->isObject());
2772692e5dbf12901edacf14812a6fae25462920af42Steve Block                JSObject* baseObject = asObject(baseCell);
2773692e5dbf12901edacf14812a6fae25462920af42Steve Block                int dst = vPC[1].u.operand;
2774692e5dbf12901edacf14812a6fae25462920af42Steve Block                int offset = vPC[5].u.operand;
2775692e5dbf12901edacf14812a6fae25462920af42Steve Block
2776692e5dbf12901edacf14812a6fae25462920af42Steve Block                if (GetterSetter* getterSetter = asGetterSetter(baseObject->getDirectOffset(offset).asCell())) {
2777692e5dbf12901edacf14812a6fae25462920af42Steve Block                    JSObject* getter = getterSetter->getter();
2778692e5dbf12901edacf14812a6fae25462920af42Steve Block                    CallData callData;
2779692e5dbf12901edacf14812a6fae25462920af42Steve Block                    CallType callType = getter->getCallData(callData);
2780692e5dbf12901edacf14812a6fae25462920af42Steve Block                    JSValue result = call(callFrame, getter, callType, callData, baseObject, ArgList());
2781692e5dbf12901edacf14812a6fae25462920af42Steve Block                    CHECK_FOR_EXCEPTION();
27824576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                    callFrame->uncheckedR(dst) = result;
2783692e5dbf12901edacf14812a6fae25462920af42Steve Block                } else
27844576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                    callFrame->uncheckedR(dst) = jsUndefined();
2785692e5dbf12901edacf14812a6fae25462920af42Steve Block
2786692e5dbf12901edacf14812a6fae25462920af42Steve Block                vPC += OPCODE_LENGTH(op_get_by_id_getter_self);
2787692e5dbf12901edacf14812a6fae25462920af42Steve Block                NEXT_INSTRUCTION();
2788692e5dbf12901edacf14812a6fae25462920af42Steve Block            }
2789692e5dbf12901edacf14812a6fae25462920af42Steve Block        }
2790e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncacheGetByID(codeBlock, vPC);
2791692e5dbf12901edacf14812a6fae25462920af42Steve Block        NEXT_INSTRUCTION();
2792692e5dbf12901edacf14812a6fae25462920af42Steve Block    }
2793bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2794692e5dbf12901edacf14812a6fae25462920af42Steve Block    skip_id_getter_self:
2795692e5dbf12901edacf14812a6fae25462920af42Steve Block#endif
2796bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2797dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    goto *(&&skip_id_custom_self);
2798dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
2799dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DEFINE_OPCODE(op_get_by_id_custom_self) {
2800dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        /* op_get_by_id_custom_self dst(r) base(r) property(id) structure(sID) offset(n) nop(n) nop(n)
2801dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2802dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         Cached property access: Attempts to use a cached named property getter
2803dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         from the value base. If the cache misses, op_get_by_id_custom_self reverts to
2804dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         op_get_by_id.
2805dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         */
2806dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        int base = vPC[2].u.operand;
2807dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        JSValue baseValue = callFrame->r(base).jsValue();
2808dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2809dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (LIKELY(baseValue.isCell())) {
2810e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSCell* baseCell = baseValue.asCell();
28112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            Structure* structure = vPC[4].u.structure.get();
2812dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2813dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (LIKELY(baseCell->structure() == structure)) {
2814dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                ASSERT(baseCell->isObject());
2815dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                int dst = vPC[1].u.operand;
2816dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                int property = vPC[3].u.operand;
2817e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                Identifier& ident = codeBlock->identifier(property);
2818dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2819dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                PropertySlot::GetValueFunc getter = vPC[5].u.getterFunc;
2820dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                JSValue result = getter(callFrame, baseValue, ident);
2821dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                CHECK_FOR_EXCEPTION();
28224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                callFrame->uncheckedR(dst) = result;
2823dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                vPC += OPCODE_LENGTH(op_get_by_id_custom_self);
2824dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                NEXT_INSTRUCTION();
2825dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            }
2826dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
2827e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncacheGetByID(codeBlock, vPC);
2828dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        NEXT_INSTRUCTION();
2829dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
2830bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2831dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockskip_id_custom_self:
2832dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
2833635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_by_id_generic) {
28348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* op_get_by_id_generic dst(r) base(r) property(id) nop(sID) nop(n) nop(n) nop(n)
28358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
28368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Generic property access: Gets the property named by identifier
28378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           property from the value base, and puts the result in register dst.
28388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
28398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int dst = vPC[1].u.operand;
28408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[2].u.operand;
28418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int property = vPC[3].u.operand;
28428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2843e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        Identifier& ident = codeBlock->identifier(property);
28440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
28458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        PropertySlot slot(baseValue);
28465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue result = baseValue.get(callFrame, ident, slot);
2847635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
28488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
28494576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = result;
2850cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_get_by_id_generic);
2851635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
28528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2853bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2854692e5dbf12901edacf14812a6fae25462920af42Steve Block    goto *(&&skip_id_getter_chain);
2855692e5dbf12901edacf14812a6fae25462920af42Steve Block#endif
2856692e5dbf12901edacf14812a6fae25462920af42Steve Block    DEFINE_OPCODE(op_get_by_id_getter_chain) {
2857692e5dbf12901edacf14812a6fae25462920af42Steve Block        /* op_get_by_id_getter_chain dst(r) base(r) property(id) structure(sID) structureChain(chain) count(n) offset(n)
2858692e5dbf12901edacf14812a6fae25462920af42Steve Block
2859692e5dbf12901edacf14812a6fae25462920af42Steve Block         Cached property access: Attempts to get a cached property from the
2860692e5dbf12901edacf14812a6fae25462920af42Steve Block         value base's prototype chain. If the cache misses, op_get_by_id_getter_chain
2861692e5dbf12901edacf14812a6fae25462920af42Steve Block         reverts to op_get_by_id.
2862692e5dbf12901edacf14812a6fae25462920af42Steve Block         */
2863692e5dbf12901edacf14812a6fae25462920af42Steve Block        int base = vPC[2].u.operand;
2864692e5dbf12901edacf14812a6fae25462920af42Steve Block        JSValue baseValue = callFrame->r(base).jsValue();
2865692e5dbf12901edacf14812a6fae25462920af42Steve Block
2866692e5dbf12901edacf14812a6fae25462920af42Steve Block        if (LIKELY(baseValue.isCell())) {
2867e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSCell* baseCell = baseValue.asCell();
28682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            Structure* structure = vPC[4].u.structure.get();
2869692e5dbf12901edacf14812a6fae25462920af42Steve Block
2870692e5dbf12901edacf14812a6fae25462920af42Steve Block            if (LIKELY(baseCell->structure() == structure)) {
28712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                WriteBarrier<Structure>* it = vPC[5].u.structureChain->head();
2872692e5dbf12901edacf14812a6fae25462920af42Steve Block                size_t count = vPC[6].u.operand;
28732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                WriteBarrier<Structure>* end = it + count;
2874692e5dbf12901edacf14812a6fae25462920af42Steve Block
2875692e5dbf12901edacf14812a6fae25462920af42Steve Block                while (true) {
2876692e5dbf12901edacf14812a6fae25462920af42Steve Block                    JSObject* baseObject = asObject(baseCell->structure()->prototypeForLookup(callFrame));
2877692e5dbf12901edacf14812a6fae25462920af42Steve Block
2878692e5dbf12901edacf14812a6fae25462920af42Steve Block                    if (UNLIKELY(baseObject->structure() != (*it).get()))
2879692e5dbf12901edacf14812a6fae25462920af42Steve Block                        break;
2880692e5dbf12901edacf14812a6fae25462920af42Steve Block
2881692e5dbf12901edacf14812a6fae25462920af42Steve Block                    if (++it == end) {
2882692e5dbf12901edacf14812a6fae25462920af42Steve Block                        int dst = vPC[1].u.operand;
2883692e5dbf12901edacf14812a6fae25462920af42Steve Block                        int offset = vPC[7].u.operand;
2884692e5dbf12901edacf14812a6fae25462920af42Steve Block                        if (GetterSetter* getterSetter = asGetterSetter(baseObject->getDirectOffset(offset).asCell())) {
2885692e5dbf12901edacf14812a6fae25462920af42Steve Block                            JSObject* getter = getterSetter->getter();
2886692e5dbf12901edacf14812a6fae25462920af42Steve Block                            CallData callData;
2887692e5dbf12901edacf14812a6fae25462920af42Steve Block                            CallType callType = getter->getCallData(callData);
2888dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                            JSValue result = call(callFrame, getter, callType, callData, baseValue, ArgList());
2889692e5dbf12901edacf14812a6fae25462920af42Steve Block                            CHECK_FOR_EXCEPTION();
28904576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                            callFrame->uncheckedR(dst) = result;
2891692e5dbf12901edacf14812a6fae25462920af42Steve Block                        } else
28924576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                            callFrame->uncheckedR(dst) = jsUndefined();
2893692e5dbf12901edacf14812a6fae25462920af42Steve Block                        vPC += OPCODE_LENGTH(op_get_by_id_getter_chain);
2894692e5dbf12901edacf14812a6fae25462920af42Steve Block                        NEXT_INSTRUCTION();
2895692e5dbf12901edacf14812a6fae25462920af42Steve Block                    }
2896692e5dbf12901edacf14812a6fae25462920af42Steve Block
2897692e5dbf12901edacf14812a6fae25462920af42Steve Block                    // Update baseCell, so that next time around the loop we'll pick up the prototype's prototype.
2898692e5dbf12901edacf14812a6fae25462920af42Steve Block                    baseCell = baseObject;
2899692e5dbf12901edacf14812a6fae25462920af42Steve Block                }
2900692e5dbf12901edacf14812a6fae25462920af42Steve Block            }
2901692e5dbf12901edacf14812a6fae25462920af42Steve Block        }
2902e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncacheGetByID(codeBlock, vPC);
2903692e5dbf12901edacf14812a6fae25462920af42Steve Block        NEXT_INSTRUCTION();
2904692e5dbf12901edacf14812a6fae25462920af42Steve Block    }
2905bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2906692e5dbf12901edacf14812a6fae25462920af42Steve Block    skip_id_getter_chain:
2907692e5dbf12901edacf14812a6fae25462920af42Steve Block#endif
2908bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2909dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    goto *(&&skip_id_custom_chain);
2910dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
2911dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    DEFINE_OPCODE(op_get_by_id_custom_chain) {
2912dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        /* op_get_by_id_custom_chain dst(r) base(r) property(id) structure(sID) structureChain(chain) count(n) offset(n)
2913dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2914dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         Cached property access: Attempts to use a cached named property getter on the
2915dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         value base's prototype chain. If the cache misses, op_get_by_id_custom_chain
2916dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         reverts to op_get_by_id.
2917dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block         */
2918dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        int base = vPC[2].u.operand;
2919dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        JSValue baseValue = callFrame->r(base).jsValue();
2920dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2921dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (LIKELY(baseValue.isCell())) {
2922e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSCell* baseCell = baseValue.asCell();
29232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            Structure* structure = vPC[4].u.structure.get();
2924dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2925dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            if (LIKELY(baseCell->structure() == structure)) {
29262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                WriteBarrier<Structure>* it = vPC[5].u.structureChain->head();
2927dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                size_t count = vPC[6].u.operand;
29282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                WriteBarrier<Structure>* end = it + count;
2929dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2930dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                while (true) {
2931dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    JSObject* baseObject = asObject(baseCell->structure()->prototypeForLookup(callFrame));
2932dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2933dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    if (UNLIKELY(baseObject->structure() != (*it).get()))
2934dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                        break;
2935dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2936dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    if (++it == end) {
2937dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                        int dst = vPC[1].u.operand;
2938dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                        int property = vPC[3].u.operand;
2939e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                        Identifier& ident = codeBlock->identifier(property);
2940dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2941dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                        PropertySlot::GetValueFunc getter = vPC[7].u.getterFunc;
2942dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                        JSValue result = getter(callFrame, baseObject, ident);
2943dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                        CHECK_FOR_EXCEPTION();
29444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                        callFrame->uncheckedR(dst) = result;
2945dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                        vPC += OPCODE_LENGTH(op_get_by_id_custom_chain);
2946dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                        NEXT_INSTRUCTION();
2947dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    }
2948dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
2949dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    // Update baseCell, so that next time around the loop we'll pick up the prototype's prototype.
2950dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                    baseCell = baseObject;
2951dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block                }
2952dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            }
2953dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
2954e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncacheGetByID(codeBlock, vPC);
2955dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        NEXT_INSTRUCTION();
2956dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
2957bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
2958dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    skip_id_custom_chain:
29592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    goto *(&&skip_get_array_length);
2960dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
2961635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_array_length) {
29628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* op_get_array_length dst(r) base(r) property(id) nop(sID) nop(n) nop(n) nop(n)
29638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Cached property access: Gets the length of the array in register base,
29658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           and puts the result in register dst. If register base does not hold
29668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           an array, op_get_array_length reverts to op_get_by_id.
29678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
29688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[2].u.operand;
29700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
29718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (LIKELY(isJSArray(globalData, baseValue))) {
29728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int dst = vPC[1].u.operand;
29734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(asArray(baseValue)->length());
2974cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            vPC += OPCODE_LENGTH(op_get_array_length);
2975635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
29768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
29778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2978e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncacheGetByID(codeBlock, vPC);
2979635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
29808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
29812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
29822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    skip_get_array_length:
29832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    goto *(&&skip_get_string_length);
29842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
2985635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_string_length) {
29868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* op_get_string_length dst(r) base(r) property(id) nop(sID) nop(n) nop(n) nop(n)
29878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Cached property access: Gets the length of the string in register base,
29898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           and puts the result in register dst. If register base does not hold
29908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           a string, op_get_string_length reverts to op_get_by_id.
29918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
29928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
29938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[2].u.operand;
29940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
29958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        if (LIKELY(isJSString(globalData, baseValue))) {
29968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            int dst = vPC[1].u.operand;
29974576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(asString(baseValue)->length());
2998cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            vPC += OPCODE_LENGTH(op_get_string_length);
2999635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
30008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
30018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3002e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncacheGetByID(codeBlock, vPC);
3003635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
30048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
30052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
30062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    skip_get_string_length:
30072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    goto *(&&skip_put_by_id);
30082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
3009635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_put_by_id) {
3010e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        /* put_by_id base(r) property(id) value(r) nop(n) nop(n) nop(n) nop(n) direct(b)
30118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Generic property access: Sets the property named by identifier
30138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           property, belonging to register base, to register value.
30148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Unlike many opcodes, this one does not write any output to
30168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the register file.
3017e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
3018e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke           The "direct" flag should only be set this put_by_id is to initialize
3019e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke           an object literal.
30208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
30218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[1].u.operand;
30238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int property = vPC[2].u.operand;
30248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int value = vPC[3].u.operand;
3025e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        int direct = vPC[8].u.operand;
30268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
3028635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Identifier& ident = codeBlock->identifier(property);
3029a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        PutPropertySlot slot(codeBlock->isStrictMode());
3030e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (direct) {
3031e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            baseValue.putDirect(callFrame, ident, callFrame->r(value).jsValue(), slot);
3032e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            ASSERT(slot.base() == baseValue);
3033e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        } else
3034e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            baseValue.put(callFrame, ident, callFrame->r(value).jsValue(), slot);
3035635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
30368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        tryCachePutByID(callFrame, codeBlock, vPC, baseValue, slot);
30388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3039cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_put_by_id);
3040635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
30418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
30422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(GCC_COMPUTED_GOTO_WORKAROUND)
30432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch      skip_put_by_id:
30442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
3045635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_put_by_id_transition) {
3046e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        /* op_put_by_id_transition base(r) property(id) value(r) oldStructure(sID) newStructure(sID) structureChain(chain) offset(n) direct(b)
30478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Cached property access: Attempts to set a new property with a cached transition
30498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           property named by identifier property, belonging to register base,
30508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           to register value. If the cache misses, op_put_by_id_transition
30518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           reverts to op_put_by_id_generic.
30528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Unlike many opcodes, this one does not write any output to
30548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the register file.
30558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
30568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[1].u.operand;
30570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
30588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3059635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (LIKELY(baseValue.isCell())) {
3060e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSCell* baseCell = baseValue.asCell();
30612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            Structure* oldStructure = vPC[4].u.structure.get();
30622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            Structure* newStructure = vPC[5].u.structure.get();
30638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3064635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (LIKELY(baseCell->structure() == oldStructure)) {
30658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ASSERT(baseCell->isObject());
30668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                JSObject* baseObject = asObject(baseCell);
3067e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                int direct = vPC[8].u.operand;
3068e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
3069e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block                if (!direct) {
30702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                    WriteBarrier<Structure>* it = vPC[6].u.structureChain->head();
3071e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
3072e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                    JSValue proto = baseObject->structure()->prototypeForLookup(callFrame);
3073e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                    while (!proto.isNull()) {
3074e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                        if (UNLIKELY(asObject(proto)->structure() != (*it).get())) {
3075e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                            uncachePutByID(codeBlock, vPC);
3076e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                            NEXT_INSTRUCTION();
3077e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                        }
3078e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                        ++it;
3079e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                        proto = asObject(proto)->structure()->prototypeForLookup(callFrame);
30808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    }
30818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
30822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                baseObject->transitionTo(*globalData, newStructure);
30838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
30848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                int value = vPC[3].u.operand;
30858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                unsigned offset = vPC[7].u.operand;
30862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                ASSERT(baseObject->offsetForLocation(baseObject->getDirectLocation(*globalData, codeBlock->identifier(vPC[2].u.operand))) == offset);
30872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                baseObject->putDirectOffset(callFrame->globalData(), offset, callFrame->r(value).jsValue());
30888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3089cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                vPC += OPCODE_LENGTH(op_put_by_id_transition);
3090635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                NEXT_INSTRUCTION();
30918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
30928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
30938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3094e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncachePutByID(codeBlock, vPC);
3095635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
30968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3097635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_put_by_id_replace) {
3098e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        /* op_put_by_id_replace base(r) property(id) value(r) structure(sID) offset(n) nop(n) nop(n) direct(b)
30998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Cached property access: Attempts to set a pre-existing, cached
31018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           property named by identifier property, belonging to register base,
31028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           to register value. If the cache misses, op_put_by_id_replace
31038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           reverts to op_put_by_id.
31048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Unlike many opcodes, this one does not write any output to
31068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the register file.
31078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
31088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[1].u.operand;
31090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
31108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3111635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (LIKELY(baseValue.isCell())) {
3112e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSCell* baseCell = baseValue.asCell();
31132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            Structure* structure = vPC[4].u.structure.get();
31148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3115635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (LIKELY(baseCell->structure() == structure)) {
31168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                ASSERT(baseCell->isObject());
31178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                JSObject* baseObject = asObject(baseCell);
31188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                int value = vPC[3].u.operand;
31198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                unsigned offset = vPC[5].u.operand;
31208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                ASSERT(baseObject->offsetForLocation(baseObject->getDirectLocation(*globalData, codeBlock->identifier(vPC[2].u.operand))) == offset);
31222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                baseObject->putDirectOffset(callFrame->globalData(), offset, callFrame->r(value).jsValue());
31238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3124cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                vPC += OPCODE_LENGTH(op_put_by_id_replace);
3125635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                NEXT_INSTRUCTION();
31268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
31278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
31288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3129e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        uncachePutByID(codeBlock, vPC);
3130635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
31318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_put_by_id_generic) {
3133e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        /* op_put_by_id_generic base(r) property(id) value(r) nop(n) nop(n) nop(n) nop(n) direct(b)
31348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Generic property access: Sets the property named by identifier
31368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           property, belonging to register base, to register value.
31378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Unlike many opcodes, this one does not write any output to
31398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the register file.
31408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
31418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int base = vPC[1].u.operand;
31428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int property = vPC[2].u.operand;
31438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int value = vPC[3].u.operand;
3144e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        int direct = vPC[8].u.operand;
31458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
3147e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        Identifier& ident = codeBlock->identifier(property);
3148a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        PutPropertySlot slot(codeBlock->isStrictMode());
3149e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        if (direct) {
3150e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            baseValue.putDirect(callFrame, ident, callFrame->r(value).jsValue(), slot);
3151e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            ASSERT(slot.base() == baseValue);
3152e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        } else
3153e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            baseValue.put(callFrame, ident, callFrame->r(value).jsValue(), slot);
3154635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
31558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3156cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_put_by_id_generic);
3157635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
31588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3159635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_del_by_id) {
31608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* del_by_id dst(r) base(r) property(id)
31618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Converts register base to Object, deletes the property
31638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           named by identifier property from the object, and writes a
31648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           boolean indicating success (if true) or failure (if false)
31658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           to register dst.
31668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3167cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
3168cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int base = vPC[2].u.operand;
3169cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int property = vPC[3].u.operand;
31708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
31710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSObject* baseObj = callFrame->r(base).jsValue().toObject(callFrame);
3172e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        Identifier& ident = codeBlock->identifier(property);
3173a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        bool result = baseObj->deleteProperty(callFrame, ident);
3174a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!result && codeBlock->isStrictMode()) {
3175a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            exceptionValue = createTypeError(callFrame, "Unable to delete property.");
3176a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            goto vm_throw;
3177a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
3178635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
31794576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(result);
3180cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_del_by_id);
3181cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        NEXT_INSTRUCTION();
3182cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
3183cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    DEFINE_OPCODE(op_get_by_pname) {
3184cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
3185cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int base = vPC[2].u.operand;
3186cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int property = vPC[3].u.operand;
3187cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int expected = vPC[4].u.operand;
3188cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int iter = vPC[5].u.operand;
3189cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int i = vPC[6].u.operand;
3190cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
3191cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue baseValue = callFrame->r(base).jsValue();
3192cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSPropertyNameIterator* it = callFrame->r(iter).propertyNameIterator();
3193cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue subscript = callFrame->r(property).jsValue();
3194cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue expectedSubscript = callFrame->r(expected).jsValue();
3195cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int index = callFrame->r(i).i() - 1;
3196cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue result;
3197cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int offset = 0;
3198cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        if (subscript == expectedSubscript && baseValue.isCell() && (baseValue.asCell()->structure() == it->cachedStructure()) && it->getOffset(index, offset)) {
31994576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = JSValue(asObject(baseValue)->getDirectOffset(offset));
3200cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            vPC += OPCODE_LENGTH(op_get_by_pname);
3201cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            NEXT_INSTRUCTION();
3202cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        }
3203f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        {
3204f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            Identifier propertyName(callFrame, subscript.toString(callFrame));
3205f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch            result = baseValue.get(callFrame, propertyName);
3206f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        }
3207cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        CHECK_FOR_EXCEPTION();
32084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = result;
3209cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_get_by_pname);
3210635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
32118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3212bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    DEFINE_OPCODE(op_get_arguments_length) {
3213bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        int dst = vPC[1].u.operand;
3214bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        int argumentsRegister = vPC[2].u.operand;
3215bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        int property = vPC[3].u.operand;
3216bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        JSValue arguments = callFrame->r(argumentsRegister).jsValue();
3217bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (arguments) {
3218bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            Identifier& ident = codeBlock->identifier(property);
3219bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            PropertySlot slot(arguments);
3220bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            JSValue result = arguments.get(callFrame, ident, slot);
3221bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            CHECK_FOR_EXCEPTION();
32224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = result;
3223bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        } else
32244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = jsNumber(callFrame->argumentCount());
3225bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
3226bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        vPC += OPCODE_LENGTH(op_get_arguments_length);
3227bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        NEXT_INSTRUCTION();
3228bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
3229bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    DEFINE_OPCODE(op_get_argument_by_val) {
3230bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        int dst = vPC[1].u.operand;
3231bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        int argumentsRegister = vPC[2].u.operand;
3232bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        int property = vPC[3].u.operand;
3233bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        JSValue arguments = callFrame->r(argumentsRegister).jsValue();
3234bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        JSValue subscript = callFrame->r(property).jsValue();
3235bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!arguments && subscript.isUInt32() && subscript.asUInt32() < callFrame->argumentCount()) {
3236bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            unsigned arg = subscript.asUInt32() + 1;
3237bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            unsigned numParameters = callFrame->codeBlock()->m_numParameters;
3238bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            if (arg < numParameters)
32394576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                callFrame->uncheckedR(dst) = callFrame->r(arg - RegisterFile::CallFrameHeaderSize - numParameters);
3240bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            else
32414576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                callFrame->uncheckedR(dst) = callFrame->r(arg - RegisterFile::CallFrameHeaderSize - numParameters - callFrame->argumentCount() - 1);
3242bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            vPC += OPCODE_LENGTH(op_get_argument_by_val);
3243bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            NEXT_INSTRUCTION();
3244bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
3245bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!arguments) {
3246bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen            Arguments* arguments = new (globalData) Arguments(callFrame);
32474576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(argumentsRegister) = JSValue(arguments);
32484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(unmodifiedArgumentsRegister(argumentsRegister)) = JSValue(arguments);
3249bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        }
3250bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        // fallthrough
3251bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    }
3252635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_by_val) {
32538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* get_by_val dst(r) base(r) property(r)
32548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Converts register base to Object, gets the property named
32568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           by register property from the object, and puts the result
32578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in register dst. property is nominally converted to string
32588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           but numbers are treated more efficiently.
32598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3260cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
3261cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int base = vPC[2].u.operand;
3262cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int property = vPC[3].u.operand;
32638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
32650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue subscript = callFrame->r(property).jsValue();
32668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue result;
32688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (LIKELY(subscript.isUInt32())) {
32700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            uint32_t i = subscript.asUInt32();
32718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (isJSArray(globalData, baseValue)) {
32728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                JSArray* jsArray = asArray(baseValue);
32738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (jsArray->canGetIndex(i))
32748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    result = jsArray->getIndex(i);
32758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else
32768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    result = jsArray->JSArray::get(callFrame, i);
32778f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            } else if (isJSString(globalData, baseValue) && asString(baseValue)->canGetIndex(i))
3278643ca7872b450ea4efacab6188849e5aac2ba161Steve Block                result = asString(baseValue)->getIndex(callFrame, i);
32798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            else if (isJSByteArray(globalData, baseValue) && asByteArray(baseValue)->canAccessIndex(i))
3280635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                result = asByteArray(baseValue)->getIndex(callFrame, i);
32818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
3282635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                result = baseValue.get(callFrame, i);
32838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
3284635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            Identifier property(callFrame, subscript.toString(callFrame));
3285635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            result = baseValue.get(callFrame, property);
32868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
32878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3288635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
32894576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = result;
3290cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_get_by_val);
3291635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
32928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3293635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_put_by_val) {
32948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* put_by_val base(r) property(r) value(r)
32958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Sets register value on register base as the property named
32978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           by register property. Base is converted to object
32988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           first. register property is nominally converted to string
32998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           but numbers are treated more efficiently.
33008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Unlike many opcodes, this one does not write any output to
33028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the register file.
33038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3304cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int base = vPC[1].u.operand;
3305cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int property = vPC[2].u.operand;
3306cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int value = vPC[3].u.operand;
33078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue baseValue = callFrame->r(base).jsValue();
33090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue subscript = callFrame->r(property).jsValue();
33108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (LIKELY(subscript.isUInt32())) {
33120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            uint32_t i = subscript.asUInt32();
33138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (isJSArray(globalData, baseValue)) {
33148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                JSArray* jsArray = asArray(baseValue);
33158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (jsArray->canSetIndex(i))
33162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    jsArray->setIndex(*globalData, i, callFrame->r(value).jsValue());
33178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                else
33180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    jsArray->JSArray::put(callFrame, i, callFrame->r(value).jsValue());
33198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            } else if (isJSByteArray(globalData, baseValue) && asByteArray(baseValue)->canAccessIndex(i)) {
3320635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                JSByteArray* jsByteArray = asByteArray(baseValue);
3321635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                double dValue = 0;
33220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                JSValue jsValue = callFrame->r(value).jsValue();
33230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                if (jsValue.isInt32())
33240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                    jsByteArray->setIndex(i, jsValue.asInt32());
3325635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                else if (jsValue.getNumber(dValue))
3326635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    jsByteArray->setIndex(i, dValue);
3327635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                else
3328635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                    baseValue.put(callFrame, i, jsValue);
33298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            } else
33300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                baseValue.put(callFrame, i, callFrame->r(value).jsValue());
33318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else {
3332635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            Identifier property(callFrame, subscript.toString(callFrame));
33338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (!globalData->exception) { // Don't put to an object if toString threw an exception.
3334a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch                PutPropertySlot slot(codeBlock->isStrictMode());
33350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                baseValue.put(callFrame, property, callFrame->r(value).jsValue(), slot);
33368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
33378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
33388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3339635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
3340cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_put_by_val);
3341635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
33428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3343635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_del_by_val) {
33448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* del_by_val dst(r) base(r) property(r)
33458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Converts register base to Object, deletes the property
33478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           named by register property from the object, and writes a
33488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           boolean indicating success (if true) or failure (if false)
33498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           to register dst.
33508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3351cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
3352cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int base = vPC[2].u.operand;
3353cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int property = vPC[3].u.operand;
33548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSObject* baseObj = callFrame->r(base).jsValue().toObject(callFrame); // may throw
33568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue subscript = callFrame->r(property).jsValue();
3358a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        bool result;
33598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        uint32_t i;
3360635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (subscript.getUInt32(i))
3361a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            result = baseObj->deleteProperty(callFrame, i);
33628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
3363635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
3364635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            Identifier property(callFrame, subscript.toString(callFrame));
3365635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
3366a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            result = baseObj->deleteProperty(callFrame, property);
3367a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
3368a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!result && codeBlock->isStrictMode()) {
3369a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            exceptionValue = createTypeError(callFrame, "Unable to delete property.");
3370a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            goto vm_throw;
33718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3372635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
33734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsBoolean(result);
3374cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_del_by_val);
3375635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
33768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3377635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_put_by_index) {
33788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* put_by_index base(r) property(n) value(r)
33798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Sets register value on register base as the property named
33818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           by the immediate number property. Base is converted to
33828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           object first.
33838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Unlike many opcodes, this one does not write any output to
33858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the register file.
33868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           This opcode is mainly used to initialize array literals.
33888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3389cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int base = vPC[1].u.operand;
3390cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        unsigned property = vPC[2].u.operand;
3391cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int value = vPC[3].u.operand;
33928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
33930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        callFrame->r(base).jsValue().put(callFrame, property, callFrame->r(value).jsValue());
33948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3395cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_put_by_index);
3396635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
33978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3398635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_loop) {
33998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* loop target(offset)
34008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Jumps unconditionally to offset target from the current
34028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           instruction.
34038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Additionally this loop instruction may terminate JS execution is
34058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the JS timeout is reached.
34068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
34078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(OPCODE_STATS)
34088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        OpcodeStats::resetLastInstruction();
34098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3410cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[1].u.operand;
34118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CHECK_FOR_TIMEOUT();
34128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC += target;
3413635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
34148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3415635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_jmp) {
34168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* jmp target(offset)
34178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Jumps unconditionally to offset target from the current
34198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           instruction.
34208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
34218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(OPCODE_STATS)
34228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        OpcodeStats::resetLastInstruction();
34238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3424cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[1].u.operand;
34258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC += target;
3427635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
34288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3429635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_loop_if_true) {
34308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* loop_if_true cond(r) target(offset)
34318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Jumps to offset target from the current instruction, if and
34338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           only if register cond converts to boolean as true.
34348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Additionally this loop instruction may terminate JS execution is
34368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the JS timeout is reached.
34378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
3438cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int cond = vPC[1].u.operand;
3439cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[2].u.operand;
34400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (callFrame->r(cond).jsValue().toBoolean(callFrame)) {
34418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vPC += target;
34428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CHECK_FOR_TIMEOUT();
3443635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
34448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
34458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3446cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_loop_if_true);
3447635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
34488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3449643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    DEFINE_OPCODE(op_loop_if_false) {
3450643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        /* loop_if_true cond(r) target(offset)
3451643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
3452643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           Jumps to offset target from the current instruction, if and
3453643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           only if register cond converts to boolean as false.
3454643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
3455643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           Additionally this loop instruction may terminate JS execution is
3456643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           the JS timeout is reached.
3457643ca7872b450ea4efacab6188849e5aac2ba161Steve Block         */
3458643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        int cond = vPC[1].u.operand;
3459643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        int target = vPC[2].u.operand;
3460643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (!callFrame->r(cond).jsValue().toBoolean(callFrame)) {
3461643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            vPC += target;
3462643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            CHECK_FOR_TIMEOUT();
3463643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            NEXT_INSTRUCTION();
3464643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
3465643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
3466643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        vPC += OPCODE_LENGTH(op_loop_if_true);
3467643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        NEXT_INSTRUCTION();
3468643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
3469635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_jtrue) {
34708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* jtrue cond(r) target(offset)
34718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Jumps to offset target from the current instruction, if and
34738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           only if register cond converts to boolean as true.
34748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3475cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int cond = vPC[1].u.operand;
3476cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[2].u.operand;
34770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (callFrame->r(cond).jsValue().toBoolean(callFrame)) {
34788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vPC += target;
3479635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
34808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
34818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3482cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_jtrue);
3483635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
34848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3485635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_jfalse) {
34868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* jfalse cond(r) target(offset)
34878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
34888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Jumps to offset target from the current instruction, if and
34898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           only if register cond converts to boolean as false.
34908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3491cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int cond = vPC[1].u.operand;
3492cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[2].u.operand;
34930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (!callFrame->r(cond).jsValue().toBoolean(callFrame)) {
34948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vPC += target;
3495635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
34968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
34978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3498cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_jfalse);
3499635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
35008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3501635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_jeq_null) {
35028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* jeq_null src(r) target(offset)
35038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Jumps to offset target from the current instruction, if and
35058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           only if register src is null.
35068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3507cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[1].u.operand;
3508cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[2].u.operand;
35090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue srcValue = callFrame->r(src).jsValue();
35108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3511635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (srcValue.isUndefinedOrNull() || (srcValue.isCell() && srcValue.asCell()->structure()->typeInfo().masqueradesAsUndefined())) {
35128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vPC += target;
3513635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
35148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
35158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3516cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_jeq_null);
3517635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
35188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3519635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_jneq_null) {
35208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* jneq_null src(r) target(offset)
35218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Jumps to offset target from the current instruction, if and
35238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           only if register src is not null.
35248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3525cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[1].u.operand;
3526cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[2].u.operand;
35270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue srcValue = callFrame->r(src).jsValue();
35288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3529643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (!srcValue.isUndefinedOrNull() && (!srcValue.isCell() || !srcValue.asCell()->structure()->typeInfo().masqueradesAsUndefined())) {
35308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vPC += target;
3531635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
35328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
35338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3534cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_jneq_null);
3535635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
35368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
35375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    DEFINE_OPCODE(op_jneq_ptr) {
35385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        /* jneq_ptr src(r) ptr(jsCell) target(offset)
35395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
35405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian           Jumps to offset target from the current instruction, if the value r is equal
35415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian           to ptr, using pointer equality.
35425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian         */
3543cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[1].u.operand;
3544cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[3].u.operand;
35450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue srcValue = callFrame->r(src).jsValue();
35462bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (srcValue != vPC[2].u.jsCell.get()) {
35475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            vPC += target;
35485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            NEXT_INSTRUCTION();
35495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
35505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
3551cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_jneq_ptr);
35525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        NEXT_INSTRUCTION();
35535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
3554635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_loop_if_less) {
35558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* loop_if_less src1(r) src2(r) target(offset)
35568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Checks whether register src1 is less than register src2, as
35588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           with the ECMAScript '<' operator, and then jumps to offset
35598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           target from the current instruction, if and only if the
35608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           result of the comparison is true.
35618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Additionally this loop instruction may terminate JS execution is
35638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the JS timeout is reached.
35648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
3565cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[1].u.operand).jsValue();
3566cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[2].u.operand).jsValue();
3567cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[3].u.operand;
35688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool result = jsLess(callFrame, src1, src2);
3570635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
35718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (result) {
35738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vPC += target;
35748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CHECK_FOR_TIMEOUT();
3575635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
35768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
35778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3578cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_loop_if_less);
3579635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
35808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3581635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_loop_if_lesseq) {
35828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* loop_if_lesseq src1(r) src2(r) target(offset)
35838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Checks whether register src1 is less than or equal to register
35858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           src2, as with the ECMAScript '<=' operator, and then jumps to
35868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           offset target from the current instruction, if and only if the
35878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           result of the comparison is true.
35888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Additionally this loop instruction may terminate JS execution is
35908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the JS timeout is reached.
35918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3592cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[1].u.operand).jsValue();
3593cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[2].u.operand).jsValue();
3594cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[3].u.operand;
35958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool result = jsLessEq(callFrame, src1, src2);
3597635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
35988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
35998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (result) {
36008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vPC += target;
36018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CHECK_FOR_TIMEOUT();
3602635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
36038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
36048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3605cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_loop_if_lesseq);
3606635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
36078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3608635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_jnless) {
36098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* jnless src1(r) src2(r) target(offset)
36108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Checks whether register src1 is less than register src2, as
36128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           with the ECMAScript '<' operator, and then jumps to offset
36138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           target from the current instruction, if and only if the
36148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           result of the comparison is false.
36158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3616cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[1].u.operand).jsValue();
3617cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[2].u.operand).jsValue();
3618cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[3].u.operand;
36198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool result = jsLess(callFrame, src1, src2);
3621635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
36228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
36238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!result) {
36248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vPC += target;
3625635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
36268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
36278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3628cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_jnless);
3629635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
36308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3631643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    DEFINE_OPCODE(op_jless) {
3632643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        /* jless src1(r) src2(r) target(offset)
3633643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
3634643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           Checks whether register src1 is less than register src2, as
3635643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           with the ECMAScript '<' operator, and then jumps to offset
3636643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           target from the current instruction, if and only if the
3637643ca7872b450ea4efacab6188849e5aac2ba161Steve Block           result of the comparison is true.
3638643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        */
3639643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        JSValue src1 = callFrame->r(vPC[1].u.operand).jsValue();
3640643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        JSValue src2 = callFrame->r(vPC[2].u.operand).jsValue();
3641643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        int target = vPC[3].u.operand;
3642643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
3643643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        bool result = jsLess(callFrame, src1, src2);
3644643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        CHECK_FOR_EXCEPTION();
3645643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
3646643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (result) {
3647643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            vPC += target;
3648643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            NEXT_INSTRUCTION();
3649643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
3650643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
3651643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        vPC += OPCODE_LENGTH(op_jless);
3652643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        NEXT_INSTRUCTION();
3653643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
36545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    DEFINE_OPCODE(op_jnlesseq) {
36555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        /* jnlesseq src1(r) src2(r) target(offset)
36565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
36575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian           Checks whether register src1 is less than or equal to
36585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian           register src2, as with the ECMAScript '<=' operator,
36595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian           and then jumps to offset target from the current instruction,
36605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian           if and only if theresult of the comparison is false.
36615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        */
3662cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src1 = callFrame->r(vPC[1].u.operand).jsValue();
3663cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue src2 = callFrame->r(vPC[2].u.operand).jsValue();
3664cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[3].u.operand;
36655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
36665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        bool result = jsLessEq(callFrame, src1, src2);
36675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        CHECK_FOR_EXCEPTION();
36685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
36695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (!result) {
36705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            vPC += target;
36715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            NEXT_INSTRUCTION();
36725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
36735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
3674cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_jnlesseq);
36755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        NEXT_INSTRUCTION();
36765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
367721939df44de1705786c545cd1bf519d47250322dBen Murdoch    DEFINE_OPCODE(op_jlesseq) {
367821939df44de1705786c545cd1bf519d47250322dBen Murdoch        /* jlesseq src1(r) src2(r) target(offset)
367921939df44de1705786c545cd1bf519d47250322dBen Murdoch
368021939df44de1705786c545cd1bf519d47250322dBen Murdoch         Checks whether register src1 is less than or equal to
368121939df44de1705786c545cd1bf519d47250322dBen Murdoch         register src2, as with the ECMAScript '<=' operator,
368221939df44de1705786c545cd1bf519d47250322dBen Murdoch         and then jumps to offset target from the current instruction,
368321939df44de1705786c545cd1bf519d47250322dBen Murdoch         if and only if the result of the comparison is true.
368421939df44de1705786c545cd1bf519d47250322dBen Murdoch         */
368521939df44de1705786c545cd1bf519d47250322dBen Murdoch        JSValue src1 = callFrame->r(vPC[1].u.operand).jsValue();
368621939df44de1705786c545cd1bf519d47250322dBen Murdoch        JSValue src2 = callFrame->r(vPC[2].u.operand).jsValue();
368721939df44de1705786c545cd1bf519d47250322dBen Murdoch        int target = vPC[3].u.operand;
368821939df44de1705786c545cd1bf519d47250322dBen Murdoch
368921939df44de1705786c545cd1bf519d47250322dBen Murdoch        bool result = jsLessEq(callFrame, src1, src2);
369021939df44de1705786c545cd1bf519d47250322dBen Murdoch        CHECK_FOR_EXCEPTION();
369121939df44de1705786c545cd1bf519d47250322dBen Murdoch
369221939df44de1705786c545cd1bf519d47250322dBen Murdoch        if (result) {
369321939df44de1705786c545cd1bf519d47250322dBen Murdoch            vPC += target;
369421939df44de1705786c545cd1bf519d47250322dBen Murdoch            NEXT_INSTRUCTION();
369521939df44de1705786c545cd1bf519d47250322dBen Murdoch        }
369621939df44de1705786c545cd1bf519d47250322dBen Murdoch
369721939df44de1705786c545cd1bf519d47250322dBen Murdoch        vPC += OPCODE_LENGTH(op_jlesseq);
369821939df44de1705786c545cd1bf519d47250322dBen Murdoch        NEXT_INSTRUCTION();
369921939df44de1705786c545cd1bf519d47250322dBen Murdoch    }
3700635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_switch_imm) {
37018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* switch_imm tableIndex(n) defaultOffset(offset) scrutinee(r)
37028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Performs a range checked switch on the scrutinee value, using
37048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the tableIndex-th immediate switch jump table.  If the scrutinee value
37058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           is an immediate number in the range covered by the referenced jump
37068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           table, and the value at jumpTable[scrutinee value] is non-zero, then
37078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           that value is used as the jump offset, otherwise defaultOffset is used.
37088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
3709cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int tableIndex = vPC[1].u.operand;
3710cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int defaultOffset = vPC[2].u.operand;
3711cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue scrutinee = callFrame->r(vPC[3].u.operand).jsValue();
37120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        if (scrutinee.isInt32())
3713e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            vPC += codeBlock->immediateSwitchJumpTable(tableIndex).offsetForValue(scrutinee.asInt32(), defaultOffset);
37148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
37158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            double value;
37168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            int32_t intValue;
37178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian            if (scrutinee.getNumber(value) && ((intValue = static_cast<int32_t>(value)) == value))
3718e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                vPC += codeBlock->immediateSwitchJumpTable(tableIndex).offsetForValue(intValue, defaultOffset);
3719635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            else
3720635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                vPC += defaultOffset;
37218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3722635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
37238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3724635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_switch_char) {
37258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* switch_char tableIndex(n) defaultOffset(offset) scrutinee(r)
37268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Performs a range checked switch on the scrutinee value, using
37288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the tableIndex-th character switch jump table.  If the scrutinee value
37298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           is a single character string in the range covered by the referenced jump
37308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           table, and the value at jumpTable[scrutinee value] is non-zero, then
37318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           that value is used as the jump offset, otherwise defaultOffset is used.
37328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
3733cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int tableIndex = vPC[1].u.operand;
3734cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int defaultOffset = vPC[2].u.operand;
3735cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue scrutinee = callFrame->r(vPC[3].u.operand).jsValue();
3736635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (!scrutinee.isString())
37378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vPC += defaultOffset;
37388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
3739f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            StringImpl* value = asString(scrutinee)->value(callFrame).impl();
3740692e5dbf12901edacf14812a6fae25462920af42Steve Block            if (value->length() != 1)
37418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                vPC += defaultOffset;
37428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
3743e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block                vPC += codeBlock->characterSwitchJumpTable(tableIndex).offsetForValue(value->characters()[0], defaultOffset);
37448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3745635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
37468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3747635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_switch_string) {
37488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* switch_string tableIndex(n) defaultOffset(offset) scrutinee(r)
37498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Performs a sparse hashmap based switch on the value in the scrutinee
37518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           register, using the tableIndex-th string switch jump table.  If the
37528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           scrutinee value is a string that exists as a key in the referenced
37538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           jump table, then the value associated with the string is used as the
37548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           jump offset, otherwise defaultOffset is used.
37558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
3756cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int tableIndex = vPC[1].u.operand;
3757cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int defaultOffset = vPC[2].u.operand;
3758cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue scrutinee = callFrame->r(vPC[3].u.operand).jsValue();
3759635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (!scrutinee.isString())
37608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vPC += defaultOffset;
37618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else
3762f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick            vPC += codeBlock->stringSwitchJumpTable(tableIndex).offsetForValue(asString(scrutinee)->value(callFrame).impl(), defaultOffset);
3763635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
37648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3765635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_new_func) {
37668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* new_func dst(r) func(f)
37678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Constructs a new Function instance from function func and
37698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the current scope chain using the original Function
37708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           constructor, using the rules for function declarations, and
37718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           puts the result in register dst.
37728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3773cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
3774cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int func = vPC[2].u.operand;
3775bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        int shouldCheck = vPC[3].u.operand;
3776a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT(codeBlock->codeType() != FunctionCode || !codeBlock->needsFullScopeChain() || callFrame->r(codeBlock->activationRegister()).jsValue());
3777bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        if (!shouldCheck || !callFrame->r(dst).jsValue())
37784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = JSValue(codeBlock->functionDecl(func)->make(callFrame, callFrame->scopeChain()));
37798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3780cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_new_func);
3781635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
37828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3783635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_new_func_exp) {
37848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* new_func_exp dst(r) func(f)
37858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Constructs a new Function instance from function func and
37878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the current scope chain using the original Function
37888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           constructor, using the rules for function expressions, and
37898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           puts the result in register dst.
37908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
3791cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
3792cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int funcIndex = vPC[2].u.operand;
3793a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
3794a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT(codeBlock->codeType() != FunctionCode || !codeBlock->needsFullScopeChain() || callFrame->r(codeBlock->activationRegister()).jsValue());
3795e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        FunctionExecutable* function = codeBlock->functionExpr(funcIndex);
3796231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        JSFunction* func = function->make(callFrame, callFrame->scopeChain());
3797231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
3798231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        /*
3799231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            The Identifier in a FunctionExpression can be referenced from inside
3800231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            the FunctionExpression's FunctionBody to allow the function to call
3801231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            itself recursively. However, unlike in a FunctionDeclaration, the
3802231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            Identifier in a FunctionExpression cannot be referenced from and
3803231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            does not affect the scope enclosing the FunctionExpression.
3804231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block         */
3805231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (!function->name().isNull()) {
3806231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            JSStaticScopeObject* functionScopeObject = new (callFrame) JSStaticScopeObject(callFrame, function->name(), func, ReadOnly | DontDelete);
380781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            func->setScope(*globalData, func->scope()->push(functionScopeObject));
3808231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        }
3809231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
38104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = JSValue(func);
38118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3812cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_new_func_exp);
3813635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
38148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3815635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_call_eval) {
3816e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        /* call_eval func(r) argCount(n) registerOffset(n)
38178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Call a function named "eval" with no explicit "this" value
38198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           (which may therefore be the eval operator). If register
38208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           thisVal is the global object, and register func contains
38218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           that global object's original global eval function, then
38228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           perform the eval operator in local scope (interpreting
38238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the argument registers as for the "call"
38248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           opcode). Otherwise, act exactly as the "call" opcode would.
38258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
38268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3827e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int func = vPC[1].u.operand;
3828e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int argCount = vPC[2].u.operand;
3829e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int registerOffset = vPC[3].u.operand;
3830a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
3831a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        ASSERT(codeBlock->codeType() != FunctionCode || !codeBlock->needsFullScopeChain() || callFrame->r(codeBlock->activationRegister()).jsValue());
38320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue funcVal = callFrame->r(func).jsValue();
38338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3834635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Register* newCallFrame = callFrame->registers() + registerOffset;
3835635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Register* argv = newCallFrame - RegisterFile::CallFrameHeaderSize - argCount;
38365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue thisValue = argv[0].jsValue();
383781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        JSGlobalObject* globalObject = callFrame->scopeChain()->globalObject.get();
3838635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3839635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (thisValue == globalObject && funcVal == globalObject->evalFunction()) {
3840e14391e94c850b8bd03680c23b38978db68687a8John Reck            JSValue result = callEval(callFrame, registerFile, argv, argCount, registerOffset);
38412bde8e466a4451c7319e3a072d118917957d6554Steve Block            if ((exceptionValue = globalData->exception))
38428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                goto vm_throw;
3843e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            functionReturnValue = result;
38448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3845cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            vPC += OPCODE_LENGTH(op_call_eval);
3846635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
38478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
38488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3849635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // We didn't find the blessed version of eval, so process this
3850635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // instruction as a normal function call.
38518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // fall through to op_call
38528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3853635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_call) {
3854e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        /* call func(r) argCount(n) registerOffset(n)
38558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3856635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           Perform a function call.
3857635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3858635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           registerOffset is the distance the callFrame pointer should move
3859635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           before the VM initializes the new call frame's header.
3860635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3861635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           dst is where op_ret should store its result.
38628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
38638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3864e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int func = vPC[1].u.operand;
3865e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int argCount = vPC[2].u.operand;
3866e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int registerOffset = vPC[3].u.operand;
38678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue v = callFrame->r(func).jsValue();
38698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CallData callData;
3871545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        CallType callType = getCallData(v, callData);
38728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (callType == CallTypeJS) {
38748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScopeChainNode* callDataScopeChain = callData.js.scopeChain;
3875967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
3876967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            JSObject* error = callData.js.functionExecutable->compileForCall(callFrame, callDataScopeChain);
3877967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            if (UNLIKELY(!!error)) {
3878967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch                exceptionValue = error;
3879967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch                goto vm_throw;
3880967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            }
38818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CallFrame* previousCallFrame = callFrame;
3883967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            CodeBlock* newCodeBlock = &callData.js.functionExecutable->generatedBytecodeForCall();
3884967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            callFrame = slideRegisterWindowForCall(newCodeBlock, registerFile, callFrame, registerOffset, argCount);
38858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (UNLIKELY(!callFrame)) {
38868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                callFrame = previousCallFrame;
38878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                exceptionValue = createStackOverflowError(callFrame);
38888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                goto vm_throw;
38898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
38908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38915af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            callFrame->init(newCodeBlock, vPC + OPCODE_LENGTH(op_call), callDataScopeChain, previousCallFrame, argCount, asFunction(v));
3892e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            codeBlock = newCodeBlock;
3893e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            ASSERT(codeBlock == callFrame->codeBlock());
3894635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            vPC = newCodeBlock->instructions().begin();
38958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
38968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(OPCODE_STATS)
38978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            OpcodeStats::resetLastInstruction();
38988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
38998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3900635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
39018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
39028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (callType == CallTypeHost) {
39048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScopeChainNode* scopeChain = callFrame->scopeChain();
39058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CallFrame* newCallFrame = CallFrame::create(callFrame->registers() + registerOffset);
390606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            if (!registerFile->grow(newCallFrame->registers())) {
390706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                exceptionValue = createStackOverflowError(callFrame);
390806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                goto vm_throw;
390906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            }
391006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
39115af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            newCallFrame->init(0, vPC + OPCODE_LENGTH(op_call), scopeChain, callFrame, argCount, asObject(v));
39128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSValue returnValue;
39148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            {
3915231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                SamplingTool::HostCallRecord callRecord(m_sampler.get());
3916545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                returnValue = JSValue::decode(callData.native.function(newCallFrame));
39178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3918635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
39198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3920e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            functionReturnValue = returnValue;
39218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3922cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            vPC += OPCODE_LENGTH(op_call);
3923635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
39248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
39258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(callType == CallTypeNone);
39278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
39286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        exceptionValue = createNotAFunctionError(callFrame, v);
39298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        goto vm_throw;
39308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
39315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    DEFINE_OPCODE(op_load_varargs) {
3932cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int argCountDst = vPC[1].u.operand;
3933cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int argsOffset = vPC[2].u.operand;
39345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
39350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue arguments = callFrame->r(argsOffset).jsValue();
3936ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        uint32_t argCount = 0;
39375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (!arguments) {
39385af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            argCount = (uint32_t)(callFrame->argumentCount());
3939ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            argCount = min<uint32_t>(argCount, Arguments::MaxArguments);
39405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            int32_t sizeDelta = argsOffset + argCount + RegisterFile::CallFrameHeaderSize;
39415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            Register* newEnd = callFrame->registers() + sizeDelta;
39425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            if (!registerFile->grow(newEnd) || ((newEnd - callFrame->registers()) != sizeDelta)) {
39435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                exceptionValue = createStackOverflowError(callFrame);
39445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                goto vm_throw;
39455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            }
39465af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            ASSERT(!asFunction(callFrame->callee())->isHostFunction());
3947e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            int32_t expectedParams = asFunction(callFrame->callee())->jsExecutable()->parameterCount();
3948e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            int32_t inplaceArgs = min(static_cast<int32_t>(argCount), expectedParams);
3949e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            int32_t i = 0;
39505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            Register* argStore = callFrame->registers() + argsOffset;
39515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
39525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            // First step is to copy the "expected" parameters from their normal location relative to the callframe
39535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            for (; i < inplaceArgs; i++)
39545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                argStore[i] = callFrame->registers()[i - RegisterFile::CallFrameHeaderSize - expectedParams];
39555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            // Then we copy any additional arguments that may be further up the stack ('-1' to account for 'this')
3956e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke            for (; i < static_cast<int32_t>(argCount); i++)
3957e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke                argStore[i] = callFrame->registers()[i - RegisterFile::CallFrameHeaderSize - expectedParams - static_cast<int32_t>(argCount) - 1];
39585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        } else if (!arguments.isUndefinedOrNull()) {
39595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            if (!arguments.isObject()) {
39606b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                exceptionValue = createInvalidParamError(callFrame, "Function.prototype.apply", arguments);
39615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                goto vm_throw;
39625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            }
396381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            if (asObject(arguments)->classInfo() == &Arguments::s_info) {
39645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                Arguments* args = asArguments(arguments);
39655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                argCount = args->numProvidedArguments(callFrame);
3966ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                argCount = min<uint32_t>(argCount, Arguments::MaxArguments);
39675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                int32_t sizeDelta = argsOffset + argCount + RegisterFile::CallFrameHeaderSize;
39685f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                Register* newEnd = callFrame->registers() + sizeDelta;
39695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                if (!registerFile->grow(newEnd) || ((newEnd - callFrame->registers()) != sizeDelta)) {
39705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    exceptionValue = createStackOverflowError(callFrame);
39715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    goto vm_throw;
39725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                }
39735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                args->copyToRegisters(callFrame, callFrame->registers() + argsOffset, argCount);
39745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            } else if (isJSArray(&callFrame->globalData(), arguments)) {
39755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                JSArray* array = asArray(arguments);
39765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                argCount = array->length();
3977ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                argCount = min<uint32_t>(argCount, Arguments::MaxArguments);
39785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                int32_t sizeDelta = argsOffset + argCount + RegisterFile::CallFrameHeaderSize;
39795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                Register* newEnd = callFrame->registers() + sizeDelta;
39805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                if (!registerFile->grow(newEnd) || ((newEnd - callFrame->registers()) != sizeDelta)) {
39815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    exceptionValue = createStackOverflowError(callFrame);
39825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    goto vm_throw;
39835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                }
39845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                array->copyToRegisters(callFrame, callFrame->registers() + argsOffset, argCount);
398581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            } else if (asObject(arguments)->inherits(&JSArray::s_info)) {
39865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                JSObject* argObject = asObject(arguments);
39875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                argCount = argObject->get(callFrame, callFrame->propertyNames().length).toUInt32(callFrame);
3988ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                argCount = min<uint32_t>(argCount, Arguments::MaxArguments);
39895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                int32_t sizeDelta = argsOffset + argCount + RegisterFile::CallFrameHeaderSize;
39905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                Register* newEnd = callFrame->registers() + sizeDelta;
39915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                if (!registerFile->grow(newEnd) || ((newEnd - callFrame->registers()) != sizeDelta)) {
39925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    exceptionValue = createStackOverflowError(callFrame);
39935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    goto vm_throw;
39945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                }
39955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                Register* argsBuffer = callFrame->registers() + argsOffset;
3996ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block                for (uint32_t i = 0; i < argCount; ++i) {
39975f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    argsBuffer[i] = asObject(arguments)->get(callFrame, i);
39985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                    CHECK_FOR_EXCEPTION();
39995f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                }
40005f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            } else {
40016b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner                exceptionValue = createInvalidParamError(callFrame, "Function.prototype.apply", arguments);
4002bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen                goto vm_throw;
40035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            }
40045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
40055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        CHECK_FOR_EXCEPTION();
40064576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(argCountDst) = Register::withInt(argCount + 1);
4007cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_load_varargs);
40085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        NEXT_INSTRUCTION();
40095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
40105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    DEFINE_OPCODE(op_call_varargs) {
4011e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        /* call_varargs func(r) argCountReg(r) baseRegisterOffset(n)
40125f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
40135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian         Perform a function call with a dynamic set of arguments.
40145f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
40155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian         registerOffset is the distance the callFrame pointer should move
40165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian         before the VM initializes the new call frame's header, excluding
40175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian         space for arguments.
40185f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
40195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian         dst is where op_ret should store its result.
40205f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian         */
40215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
4022e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int func = vPC[1].u.operand;
4023e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int argCountReg = vPC[2].u.operand;
4024e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int registerOffset = vPC[3].u.operand;
40255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
40260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue v = callFrame->r(func).jsValue();
40270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        int argCount = callFrame->r(argCountReg).i();
40285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        registerOffset += argCount;
40295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        CallData callData;
4030545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        CallType callType = getCallData(v, callData);
40315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
40325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (callType == CallTypeJS) {
40335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            ScopeChainNode* callDataScopeChain = callData.js.scopeChain;
4034967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
4035967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            JSObject* error = callData.js.functionExecutable->compileForCall(callFrame, callDataScopeChain);
4036967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            if (UNLIKELY(!!error)) {
4037967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch                exceptionValue = error;
4038967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch                goto vm_throw;
4039967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            }
4040967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
40415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            CallFrame* previousCallFrame = callFrame;
4042967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            CodeBlock* newCodeBlock = &callData.js.functionExecutable->generatedBytecodeForCall();
4043967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            callFrame = slideRegisterWindowForCall(newCodeBlock, registerFile, callFrame, registerOffset, argCount);
40445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            if (UNLIKELY(!callFrame)) {
40455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                callFrame = previousCallFrame;
40465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                exceptionValue = createStackOverflowError(callFrame);
40475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                goto vm_throw;
40485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            }
4049967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
40505af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            callFrame->init(newCodeBlock, vPC + OPCODE_LENGTH(op_call_varargs), callDataScopeChain, previousCallFrame, argCount, asFunction(v));
4051e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            codeBlock = newCodeBlock;
4052e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            ASSERT(codeBlock == callFrame->codeBlock());
40535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            vPC = newCodeBlock->instructions().begin();
40545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
40555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(OPCODE_STATS)
40565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            OpcodeStats::resetLastInstruction();
40575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif
40585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
40595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            NEXT_INSTRUCTION();
40605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
40615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
40625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (callType == CallTypeHost) {
40635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            ScopeChainNode* scopeChain = callFrame->scopeChain();
40645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            CallFrame* newCallFrame = CallFrame::create(callFrame->registers() + registerOffset);
406506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            if (!registerFile->grow(newCallFrame->registers())) {
406606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                exceptionValue = createStackOverflowError(callFrame);
406706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                goto vm_throw;
406806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            }
40695af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            newCallFrame->init(0, vPC + OPCODE_LENGTH(op_call_varargs), scopeChain, callFrame, argCount, asObject(v));
40705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
40715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSValue returnValue;
40725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            {
4073231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                SamplingTool::HostCallRecord callRecord(m_sampler.get());
4074545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                returnValue = JSValue::decode(callData.native.function(newCallFrame));
40755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            }
40765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            CHECK_FOR_EXCEPTION();
40775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
4078e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            functionReturnValue = returnValue;
40795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
4080cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            vPC += OPCODE_LENGTH(op_call_varargs);
40815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            NEXT_INSTRUCTION();
40825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
40835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
40845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        ASSERT(callType == CallTypeNone);
40855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
40866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        exceptionValue = createNotAFunctionError(callFrame, v);
40875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        goto vm_throw;
40885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
4089635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_tear_off_activation) {
4090e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        /* tear_off_activation activation(r) arguments(r)
40918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4092e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           Copy locals and named parameters from the register file to the heap.
4093e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           Point the bindings in 'activation' and 'arguments' to this new backing
4094e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           store. (Note that 'arguments' may not have been created. If created,
4095e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           'arguments' already holds a copy of any extra / unnamed parameters.)
40968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4097e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           This opcode appears before op_ret in functions that require full scope chains.
40988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
40998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4100a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        int activation = vPC[1].u.operand;
4101a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        int arguments = vPC[2].u.operand;
4102e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        ASSERT(codeBlock->needsFullScopeChain());
4103a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        JSValue activationValue = callFrame->r(activation).jsValue();
4104a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (activationValue) {
410581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            asActivation(activationValue)->copyRegisters(*globalData);
4106a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
4107e14391e94c850b8bd03680c23b38978db68687a8John Reck            if (JSValue argumentsValue = callFrame->r(unmodifiedArgumentsRegister(arguments)).jsValue()) {
4108e14391e94c850b8bd03680c23b38978db68687a8John Reck                if (!codeBlock->isStrictMode())
41092fc2651226baac27029e38c9d6ef883fa32084dbSteve Block                    asArguments(argumentsValue)->setActivation(*globalData, asActivation(activationValue));
4110e14391e94c850b8bd03680c23b38978db68687a8John Reck            }
4111e14391e94c850b8bd03680c23b38978db68687a8John Reck        } else if (JSValue argumentsValue = callFrame->r(unmodifiedArgumentsRegister(arguments)).jsValue()) {
4112a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            if (!codeBlock->isStrictMode())
411381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                asArguments(argumentsValue)->copyRegisters(*globalData);
4114a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
41158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4116cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_tear_off_activation);
4117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
41188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4119635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_tear_off_arguments) {
4120e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        /* tear_off_arguments arguments(r)
41218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4122e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           Copy named parameters from the register file to the heap. Point the
4123e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           bindings in 'arguments' to this new backing store. (Note that
4124e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           'arguments' may not have been created. If created, 'arguments' already
4125e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           holds a copy of any extra / unnamed parameters.)
41268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4127e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           This opcode appears before op_ret in functions that don't require full
4128e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           scope chains, but do use 'arguments'.
41298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
41308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4131e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int src1 = vPC[1].u.operand;
4132e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        ASSERT(!codeBlock->needsFullScopeChain() && codeBlock->ownerExecutable()->usesArguments());
41330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
4134e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        if (JSValue arguments = callFrame->r(unmodifiedArgumentsRegister(src1)).jsValue())
413581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            asArguments(arguments)->copyRegisters(*globalData);
41368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4137cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_tear_off_arguments);
4138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
41398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4140635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_ret) {
41418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* ret result(r)
41428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Return register result as the return value of the current
4144e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           function call, writing it into functionReturnValue.
4145e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           In addition, unwind one call frame and restore the scope
4146e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           chain, code block instruction pointer and register base
4147e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           to those of the calling function.
4148e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        */
4149e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4150e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int result = vPC[1].u.operand;
4151e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4152e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        JSValue returnValue = callFrame->r(result).jsValue();
4153e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4154e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        vPC = callFrame->returnVPC();
4155e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        callFrame = callFrame->callerFrame();
4156e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4157e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        if (callFrame->hasHostCallFrameFlag())
4158e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            return returnValue;
4159e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4160e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        functionReturnValue = returnValue;
4161e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        codeBlock = callFrame->codeBlock();
4162e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        ASSERT(codeBlock == callFrame->codeBlock());
4163e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4164e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        NEXT_INSTRUCTION();
4165e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    }
4166e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    DEFINE_OPCODE(op_call_put_result) {
4167e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        /* op_call_put_result result(r)
4168e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4169e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           Move call result from functionReturnValue to caller's
4170e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           expected return value register.
4171e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        */
4172e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
41734576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(vPC[1].u.operand) = functionReturnValue;
4174e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4175e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        vPC += OPCODE_LENGTH(op_call_put_result);
4176e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        NEXT_INSTRUCTION();
4177e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    }
4178e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    DEFINE_OPCODE(op_ret_object_or_this) {
4179e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        /* ret result(r)
4180e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4181e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           Return register result as the return value of the current
41828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           function call, writing it into the caller's expected return
41838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           value register. In addition, unwind one call frame and
41848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           restore the scope chain, code block instruction pointer and
41858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           register base to those of the calling function.
41868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
41878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4188cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int result = vPC[1].u.operand;
41898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
41900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue returnValue = callFrame->r(result).jsValue();
41918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4192e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        if (UNLIKELY(!returnValue.isObject()))
4193e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            returnValue = callFrame->r(vPC[2].u.operand).jsValue();
4194e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4195e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        vPC = callFrame->returnVPC();
41968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        callFrame = callFrame->callerFrame();
41975af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
41988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (callFrame->hasHostCallFrameFlag())
41998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return returnValue;
42008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4201e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        functionReturnValue = returnValue;
4202e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        codeBlock = callFrame->codeBlock();
4203e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        ASSERT(codeBlock == callFrame->codeBlock());
42048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4205635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
42068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4207635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_enter) {
42088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* enter
42098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4210e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           Initializes local variables to undefined. If the code block requires
4211e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           an activation, enter_with_activation is used instead.
42128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4213e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           This opcode appears only at the beginning of a code block.
42148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
42158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        size_t i = 0;
4217635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        for (size_t count = codeBlock->m_numVars; i < count; ++i)
42184576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(i) = jsUndefined();
42198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4220cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_enter);
4221635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
42228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4223a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    DEFINE_OPCODE(op_create_activation) {
4224a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        /* create_activation dst(r)
42258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4226a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch           If the activation object for this callframe has not yet been created,
4227a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch           this creates it and writes it back to dst.
42288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
42298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4230a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        int activationReg = vPC[1].u.operand;
4231a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (!callFrame->r(activationReg).jsValue()) {
4232a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            JSActivation* activation = new (globalData) JSActivation(callFrame, static_cast<FunctionExecutable*>(codeBlock->ownerExecutable()));
4233a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch            callFrame->r(activationReg) = JSValue(activation);
423481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            callFrame->setScopeChain(callFrame->scopeChain()->push(activation));
4235a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        }
4236a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        vPC += OPCODE_LENGTH(op_create_activation);
4237635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
42388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
42395af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    DEFINE_OPCODE(op_get_callee) {
42405af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        /* op_get_callee callee(r)
42415af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
42425af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke           Move callee into a register.
42435af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        */
42445af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
42454576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(vPC[1].u.operand) = JSValue(callFrame->callee());
42465af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
42475af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        vPC += OPCODE_LENGTH(op_get_callee);
42485af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        NEXT_INSTRUCTION();
42495af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    }
42505af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    DEFINE_OPCODE(op_create_this) {
42515af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        /* op_create_this this(r) proto(r)
42525af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
42535af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke           Allocate an object as 'this', fr use in construction.
42545af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
42555af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke           This opcode should only be used at the beginning of a code
42565af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke           block.
42575af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        */
42585af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
42595af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        int thisRegister = vPC[1].u.operand;
42605af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        int protoRegister = vPC[2].u.operand;
42615af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
42625af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        JSFunction* constructor = asFunction(callFrame->callee());
42635af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#if !ASSERT_DISABLED
42645af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        ConstructData constructData;
42655af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        ASSERT(constructor->getConstructData(constructData) == ConstructTypeJS);
42665af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#endif
42675af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
42685af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        Structure* structure;
42695af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        JSValue proto = callFrame->r(protoRegister).jsValue();
42705af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        if (proto.isObject())
42712bde8e466a4451c7319e3a072d118917957d6554Steve Block            structure = asObject(proto)->inheritorID(callFrame->globalData());
42725af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        else
427381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            structure = constructor->scope()->globalObject->emptyObjectStructure();
427481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        callFrame->uncheckedR(thisRegister) = constructEmptyObject(callFrame, structure);
42755af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke
42765af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        vPC += OPCODE_LENGTH(op_create_this);
42775af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        NEXT_INSTRUCTION();
42785af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    }
4279635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_convert_this) {
42808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* convert_this this(r)
42818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Takes the value in the 'this' register, converts it to a
42838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           value that is suitable for use as the 'this' value, and
42848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           stores it in the 'this' register. This opcode is emitted
42858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           to avoid doing the conversion in the caller unnecessarily.
42868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
42878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           This opcode should only be used at the beginning of a code
42888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           block.
42898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
42908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4291cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int thisRegister = vPC[1].u.operand;
42920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue thisVal = callFrame->r(thisRegister).jsValue();
4293635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (thisVal.needsThisConversion())
42944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(thisRegister) = JSValue(thisVal.toThisObject(callFrame));
42958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4296cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_convert_this);
4297635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
42988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4299a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    DEFINE_OPCODE(op_convert_this_strict) {
4300a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        /* convert_this_strict this(r)
4301a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
4302a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch         Takes the value in the 'this' register, and converts it to
4303a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch         its "this" form if (and only if) "this" is an object with a
4304a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch         custom this conversion
4305a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
4306a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch         This opcode should only be used at the beginning of a code
4307a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch         block.
4308a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch         */
4309a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
4310a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        int thisRegister = vPC[1].u.operand;
4311a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        JSValue thisVal = callFrame->r(thisRegister).jsValue();
4312a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        if (thisVal.isObject() && thisVal.needsThisConversion())
43134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(thisRegister) = JSValue(thisVal.toStrictThisObject(callFrame));
4314a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
4315a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        vPC += OPCODE_LENGTH(op_convert_this_strict);
4316a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        NEXT_INSTRUCTION();
4317a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    }
4318bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    DEFINE_OPCODE(op_init_lazy_reg) {
4319bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        /* init_lazy_reg dst(r)
43208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4321bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen           Initialises dst(r) to JSValue().
43228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4323e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block           This opcode appears only at the beginning of a code block.
43245f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian         */
4325e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int dst = vPC[1].u.operand;
4326e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
43274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = JSValue();
4328bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        vPC += OPCODE_LENGTH(op_init_lazy_reg);
43295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        NEXT_INSTRUCTION();
43305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
43315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    DEFINE_OPCODE(op_create_arguments) {
4332e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        /* create_arguments dst(r)
43338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian           Creates the 'arguments' object and places it in both the
43355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian           'arguments' call frame slot and the local 'arguments'
43365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian           register, if it has not already been initialised.
43375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian         */
43388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4339e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int dst = vPC[1].u.operand;
4340e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
4341e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        if (!callFrame->r(dst).jsValue()) {
4342e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            Arguments* arguments = new (globalData) Arguments(callFrame);
43434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(dst) = JSValue(arguments);
43444576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(unmodifiedArgumentsRegister(dst)) = JSValue(arguments);
4345e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
4346cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_create_arguments);
4347635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
43488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4349635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_construct) {
4350e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        /* construct func(r) argCount(n) registerOffset(n) proto(r) thisRegister(r)
43518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4352635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           Invoke register "func" as a constructor. For JS
43538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           functions, the calling convention is exactly as for the
43548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           "call" opcode, except that the "this" value is a newly
4355635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           created Object. For native constructors, no "this"
4356635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           value is passed. In either case, the argCount and registerOffset
43578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           registers are interpreted as for the "call" opcode.
43588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4359635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           Register proto must contain the prototype property of
4360635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           register func. This is to enable polymorphic inline
43618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           caching of this lookup.
43628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
43638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4364e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int func = vPC[1].u.operand;
4365e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int argCount = vPC[2].u.operand;
4366e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int registerOffset = vPC[3].u.operand;
43678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue v = callFrame->r(func).jsValue();
43698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ConstructData constructData;
4371545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        ConstructType constructType = getConstructData(v, constructData);
43728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (constructType == ConstructTypeJS) {
43748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScopeChainNode* callDataScopeChain = constructData.js.scopeChain;
43758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4376967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            JSObject* error = constructData.js.functionExecutable->compileForConstruct(callFrame, callDataScopeChain);
4377967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            if (UNLIKELY(!!error)) {
4378967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch                exceptionValue = error;
4379967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch                goto vm_throw;
4380967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            }
438106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
4382967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            CallFrame* previousCallFrame = callFrame;
4383967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            CodeBlock* newCodeBlock = &constructData.js.functionExecutable->generatedBytecodeForConstruct();
4384967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            callFrame = slideRegisterWindowForCall(newCodeBlock, registerFile, callFrame, registerOffset, argCount);
43858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (UNLIKELY(!callFrame)) {
43868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                callFrame = previousCallFrame;
43878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                exceptionValue = createStackOverflowError(callFrame);
43888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                goto vm_throw;
43898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
43908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
43915af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            callFrame->init(newCodeBlock, vPC + OPCODE_LENGTH(op_construct), callDataScopeChain, previousCallFrame, argCount, asFunction(v));
4392e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            codeBlock = newCodeBlock;
4393635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            vPC = newCodeBlock->instructions().begin();
43948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(OPCODE_STATS)
43958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            OpcodeStats::resetLastInstruction();
43968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
43978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4398635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
43998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
44008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (constructType == ConstructTypeHost) {
44028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ScopeChainNode* scopeChain = callFrame->scopeChain();
44038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CallFrame* newCallFrame = CallFrame::create(callFrame->registers() + registerOffset);
440406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            if (!registerFile->grow(newCallFrame->registers())) {
440506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                exceptionValue = createStackOverflowError(callFrame);
440606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen                goto vm_throw;
440706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen            }
4408545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            newCallFrame->init(0, vPC + OPCODE_LENGTH(op_construct), scopeChain, callFrame, argCount, asObject(v));
44098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSValue returnValue;
44118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            {
4412231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block                SamplingTool::HostCallRecord callRecord(m_sampler.get());
4413545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch                returnValue = JSValue::decode(constructData.native.function(newCallFrame));
44148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
4415635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            CHECK_FOR_EXCEPTION();
4416545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            functionReturnValue = returnValue;
44178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4418cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            vPC += OPCODE_LENGTH(op_construct);
4419635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            NEXT_INSTRUCTION();
44208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
44218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(constructType == ConstructTypeNone);
44238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        exceptionValue = createNotAConstructorError(callFrame, v);
44258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        goto vm_throw;
44268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
44275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    DEFINE_OPCODE(op_strcat) {
4428bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        /* strcat dst(r) src(r) count(n)
4429bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
4430bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen           Construct a new String instance using the original
4431bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen           constructor, and puts the result in register dst.
4432bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen           The string will be the result of concatenating count
4433bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen           strings with values taken from registers starting at
4434bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen           register src.
4435bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        */
4436cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
4437cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
4438cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int count = vPC[3].u.operand;
44395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
44404576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = concatenateStrings(callFrame, &callFrame->registers()[src], count);
4441643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        CHECK_FOR_EXCEPTION();
4442cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_strcat);
44435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
44445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        NEXT_INSTRUCTION();
44455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
44465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    DEFINE_OPCODE(op_to_primitive) {
4447cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
4448cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int src = vPC[2].u.operand;
44495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
44504576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = callFrame->r(src).jsValue().toPrimitive(callFrame);
4451cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_to_primitive);
44525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
44535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        NEXT_INSTRUCTION();
44545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
4455635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_push_scope) {
44568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* push_scope scope(r)
44578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Converts register scope to object, and pushes it onto the top
4459635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           of the current scope chain.  The contents of the register scope
4460635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project           are replaced by the result of toObject conversion of the scope.
44618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
4462cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int scope = vPC[1].u.operand;
44630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSValue v = callFrame->r(scope).jsValue();
4464635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        JSObject* o = v.toObject(callFrame);
4465635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CHECK_FOR_EXCEPTION();
44668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44674576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(scope) = JSValue(o);
44688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        callFrame->setScopeChain(callFrame->scopeChain()->push(o));
44698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4470cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_push_scope);
4471635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
44728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4473635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_pop_scope) {
44748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* pop_scope
44758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Removes the top item from the current scope chain.
44778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
44788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        callFrame->setScopeChain(callFrame->scopeChain()->pop());
44798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4480cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_pop_scope);
4481635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
44828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4483635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_get_pnames) {
4484cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        /* get_pnames dst(r) base(r) i(n) size(n) breakTarget(offset)
44858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Creates a property name list for register base and puts it
4487cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block           in register dst, initializing i and size for iteration. If
4488cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block           base is undefined or null, jumps to breakTarget.
44898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
4490cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
4491cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int base = vPC[2].u.operand;
4492cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int i = vPC[3].u.operand;
4493cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int size = vPC[4].u.operand;
4494cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int breakTarget = vPC[5].u.operand;
44958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4496cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSValue v = callFrame->r(base).jsValue();
4497cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        if (v.isUndefinedOrNull()) {
4498cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            vPC += breakTarget;
4499cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            NEXT_INSTRUCTION();
4500cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        }
4501cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
4502cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSObject* o = v.toObject(callFrame);
4503cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        Structure* structure = o->structure();
4504cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        JSPropertyNameIterator* jsPropertyNameIterator = structure->enumerationCache();
4505cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        if (!jsPropertyNameIterator || jsPropertyNameIterator->cachedPrototypeChain() != structure->prototypeChain(callFrame))
4506cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            jsPropertyNameIterator = JSPropertyNameIterator::create(callFrame, o);
4507cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
45084576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(dst) = jsPropertyNameIterator;
45094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(base) = JSValue(o);
45104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(i) = Register::withInt(0);
45114576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(size) = Register::withInt(jsPropertyNameIterator->size());
4512cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_get_pnames);
4513635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
45148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4515635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_next_pname) {
4516cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        /* next_pname dst(r) base(r) i(n) size(n) iter(r) target(offset)
45178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4518cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block           Copies the next name from the property name list in
4519cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block           register iter to dst, then jumps to offset target. If there are no
4520cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block           names left, invalidates the iterator and continues to the next
45218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           instruction.
45228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
4523cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int dst = vPC[1].u.operand;
4524cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int base = vPC[2].u.operand;
4525cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int i = vPC[3].u.operand;
4526cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int size = vPC[4].u.operand;
4527cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int iter = vPC[5].u.operand;
4528cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[6].u.operand;
45298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSPropertyNameIterator* it = callFrame->r(iter).propertyNameIterator();
4531cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        while (callFrame->r(i).i() != callFrame->r(size).i()) {
4532cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            JSValue key = it->get(callFrame, asObject(callFrame->r(base).jsValue()), callFrame->r(i).i());
4533e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            CHECK_FOR_EXCEPTION();
45344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang            callFrame->uncheckedR(i) = Register::withInt(callFrame->r(i).i() + 1);
4535cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            if (key) {
4536cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                CHECK_FOR_TIMEOUT();
45374576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang                callFrame->uncheckedR(dst) = key;
4538cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                vPC += target;
4539cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block                NEXT_INSTRUCTION();
4540cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block            }
45418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
45428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4543cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_next_pname);
4544635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
45458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4546635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_jmp_scopes) {
45478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* jmp_scopes count(n) target(offset)
45488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Removes the a number of items from the current scope chain
45508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           specified by immediate number count, then jumps to offset
45518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           target.
45528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
4553cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int count = vPC[1].u.operand;
4554cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[2].u.operand;
45558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ScopeChainNode* tmp = callFrame->scopeChain();
45578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        while (count--)
45588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            tmp = tmp->pop();
45598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        callFrame->setScopeChain(tmp);
45608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC += target;
4562635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
45638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4564e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(COMPUTED_GOTO_INTERPRETER)
45658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Appease GCC
45668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    goto *(&&skip_new_scope);
45678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
4568635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_push_new_scope) {
45698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* new_scope dst(r) property(id) value(r)
45708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Constructs a new StaticScopeObject with property set to value.  That scope
45728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           object is then pushed onto the ScopeChain.  The scope object is then stored
45738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in dst for GC.
45748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         */
45758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        callFrame->setScopeChain(createExceptionScope(callFrame, vPC));
45768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4577cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_push_new_scope);
4578635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
45798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4580e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(COMPUTED_GOTO_INTERPRETER)
45818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    skip_new_scope:
45828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
4583635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_catch) {
45848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* catch ex(r)
45858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
45868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian           Retrieves the VM's current exception and puts it in register
45878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           ex. This is only valid after an exception has been raised,
45888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           and usually forms the beginning of an exception handler.
45898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
45908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(exceptionValue);
45918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ASSERT(!globalData->exception);
4592cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int ex = vPC[1].u.operand;
45934576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        callFrame->uncheckedR(ex) = exceptionValue;
45945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        exceptionValue = JSValue();
45958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4596cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_catch);
4597635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
45988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4599635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_throw) {
46008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* throw ex(r)
46018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Throws register ex as an exception. This involves three
46038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           steps: first, it is set as the current exception in the
46048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           VM's internal state, then the stack is unwound until an
46058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           exception handler or a native code boundary is found, and
46068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           then control resumes at the exception handler if any or
46078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           else the script returns control to the nearest native caller.
46088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
46098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4610cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int ex = vPC[1].u.operand;
46110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        exceptionValue = callFrame->r(ex).jsValue();
46128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46134576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        handler = throwException(callFrame, exceptionValue, vPC - codeBlock->instructions().begin());
4614e14391e94c850b8bd03680c23b38978db68687a8John Reck        if (!handler)
4615e14391e94c850b8bd03680c23b38978db68687a8John Reck            return throwError(callFrame, exceptionValue);
46168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4617e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        codeBlock = callFrame->codeBlock();
4618e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        vPC = codeBlock->instructions().begin() + handler->target;
4619635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
46208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
46216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    DEFINE_OPCODE(op_throw_reference_error) {
46226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        /* op_throw_reference_error message(k)
46238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner           Constructs a new reference Error instance using the
46256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner           original constructor, using constant message as the
46266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner           message string. The result is thrown.
46278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
46286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        UString message = callFrame->r(vPC[1].u.operand).jsValue().toString(callFrame);
46296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        exceptionValue = JSValue(createReferenceError(callFrame, message));
46306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        goto vm_throw;
46316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
4632635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_end) {
46338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* end result(r)
46348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Return register result as the value of a global or eval
46368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           program. Return control to the calling native code.
46378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
46388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4639cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int result = vPC[1].u.operand;
46400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return callFrame->r(result).jsValue();
46418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4642635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_put_getter) {
46438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* put_getter base(r) property(id) function(r)
46448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Sets register function on register base as the getter named
46468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           by identifier property. Base and function are assumed to be
46478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           objects as this op should only be used for getters defined
46488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in object literal form.
46498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Unlike many opcodes, this one does not write any output to
46518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the register file.
46528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
4653cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int base = vPC[1].u.operand;
4654cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int property = vPC[2].u.operand;
4655cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int function = vPC[3].u.operand;
46568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ASSERT(callFrame->r(base).jsValue().isObject());
46580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSObject* baseObj = asObject(callFrame->r(base).jsValue());
4659e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        Identifier& ident = codeBlock->identifier(property);
46600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ASSERT(callFrame->r(function).jsValue().isObject());
46610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        baseObj->defineGetter(callFrame, ident, asObject(callFrame->r(function).jsValue()));
46628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4663cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_put_getter);
4664635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
46658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4666635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_put_setter) {
46678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* put_setter base(r) property(id) function(r)
46688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Sets register function on register base as the setter named
46708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           by identifier property. Base and function are assumed to be
46718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           objects as this op should only be used for setters defined
46728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           in object literal form.
46738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Unlike many opcodes, this one does not write any output to
46758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           the register file.
46768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
4677cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int base = vPC[1].u.operand;
4678cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int property = vPC[2].u.operand;
4679cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int function = vPC[3].u.operand;
46808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ASSERT(callFrame->r(base).jsValue().isObject());
46820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSObject* baseObj = asObject(callFrame->r(base).jsValue());
4683e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        Identifier& ident = codeBlock->identifier(property);
46840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        ASSERT(callFrame->r(function).jsValue().isObject());
4685231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        baseObj->defineSetter(callFrame, ident, asObject(callFrame->r(function).jsValue()), 0);
46868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4687cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_put_setter);
4688635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
46898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
46905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    DEFINE_OPCODE(op_method_check) {
46915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        vPC++;
46925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        NEXT_INSTRUCTION();
46935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
4694635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_jsr) {
46958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* jsr retAddrDst(r) target(offset)
46968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           Places the address of the next instruction into the retAddrDst
46988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           register and jumps to offset target from the current instruction.
46998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
4700cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int retAddrDst = vPC[1].u.operand;
4701cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int target = vPC[2].u.operand;
4702cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        callFrame->r(retAddrDst) = vPC + OPCODE_LENGTH(op_jsr);
47038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vPC += target;
4705635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
47068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4707635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_sret) {
47088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* sret retAddrSrc(r)
47098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         Jumps to the address stored in the retAddrSrc register. This
47118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         differs from op_jmp because the target address is stored in a
47128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         register, not as an immediate.
47138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
4714cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int retAddrSrc = vPC[1].u.operand;
47150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        vPC = callFrame->r(retAddrSrc).vPC();
4716635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
47178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4718635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_debug) {
47198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* debug debugHookID(n) firstLine(n) lastLine(n)
47208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         Notifies the debugger of the current state of execution. This opcode
47228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         is only generated while the debugger is attached.
47238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
4724cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int debugHookID = vPC[1].u.operand;
4725cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int firstLine = vPC[2].u.operand;
4726cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        int lastLine = vPC[3].u.operand;
47278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        debug(callFrame, static_cast<DebugHookID>(debugHookID), firstLine, lastLine);
47298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4730cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_debug);
4731635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
47328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4733635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_profile_will_call) {
47348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* op_profile_will_call function(r)
47358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         Notifies the profiler of the beginning of a function call. This opcode
47378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         is only generated if developer tools are enabled.
47388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
47398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int function = vPC[1].u.operand;
47408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (*enabledProfilerReference)
47420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            (*enabledProfilerReference)->willExecute(callFrame, callFrame->r(function).jsValue());
47438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4744cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_profile_will_call);
4745635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
47468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4747635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_OPCODE(op_profile_did_call) {
47488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        /* op_profile_did_call function(r)
47498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         Notifies the profiler of the end of a function call. This opcode
47518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         is only generated if developer tools are enabled.
47528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        */
47538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int function = vPC[1].u.operand;
47548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (*enabledProfilerReference)
47560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            (*enabledProfilerReference)->didExecute(callFrame, callFrame->r(function).jsValue());
47578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4758cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        vPC += OPCODE_LENGTH(op_profile_did_call);
4759635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
47608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
47618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    vm_throw: {
47625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        globalData->exception = JSValue();
47638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!tickCount) {
47648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // The exceptionValue is a lie! (GCC produces bad code for reasons I
47658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // cannot fathom if we don't assign to the exceptionValue before branching)
47668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            exceptionValue = createInterruptedExecutionException(globalData);
47678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
476881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        JSGlobalObject* globalObject = callFrame->lexicalGlobalObject();
47694576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        handler = throwException(callFrame, exceptionValue, vPC - codeBlock->instructions().begin());
477081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        if (!handler) {
477181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // Can't use the callframe at this point as the scopechain, etc have
477281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            // been released.
477381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch            return throwError(globalObject->globalExec(), exceptionValue);
477481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
4775635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
4776e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        codeBlock = callFrame->codeBlock();
4777e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        vPC = codeBlock->instructions().begin() + handler->target;
4778635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        NEXT_INSTRUCTION();
47798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
47808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
4781e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if !ENABLE(COMPUTED_GOTO_INTERPRETER)
47828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } // iterator loop ends
47838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
4784635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    #undef NEXT_INSTRUCTION
4785635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    #undef DEFINE_OPCODE
4786635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    #undef CHECK_FOR_EXCEPTION
47878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    #undef CHECK_FOR_TIMEOUT
4788e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif // ENABLE(INTERPRETER)
47898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
47908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47915f1ab04193ad0130ca8204aadaceae083aca9881Feng QianJSValue Interpreter::retrieveArguments(CallFrame* callFrame, JSFunction* function) const
47928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
47938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallFrame* functionCallFrame = findFunctionCallFrame(callFrame, function);
47948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!functionCallFrame)
47958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsNull();
47968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
47978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CodeBlock* codeBlock = functionCallFrame->codeBlock();
4798635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (codeBlock->usesArguments()) {
4799635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        ASSERT(codeBlock->codeType() == FunctionCode);
4800e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        int argumentsRegister = codeBlock->argumentsRegister();
4801ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        int realArgumentsRegister = unmodifiedArgumentsRegister(argumentsRegister);
4802ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        if (JSValue arguments = functionCallFrame->uncheckedR(argumentsRegister).jsValue())
4803ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch            return arguments;
4804ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        JSValue arguments = JSValue(new (callFrame) Arguments(functionCallFrame));
4805ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        functionCallFrame->r(argumentsRegister) = arguments;
4806ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        functionCallFrame->r(realArgumentsRegister) = arguments;
4807ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return arguments;
48088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
48098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4810e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    Arguments* arguments = new (functionCallFrame) Arguments(functionCallFrame);
481181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    arguments->copyRegisters(functionCallFrame->globalData());
48128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return arguments;
48138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
48148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4815e78cbe89e6f337f2f1fe40315be88f742b547151Steve BlockJSValue Interpreter::retrieveCaller(CallFrame* callFrame, JSFunction* function) const
48168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
48178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallFrame* functionCallFrame = findFunctionCallFrame(callFrame, function);
48188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!functionCallFrame)
48198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsNull();
48208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallFrame* callerFrame = functionCallFrame->callerFrame();
48228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (callerFrame->hasHostCallFrameFlag())
48238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsNull();
48248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48255f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    JSValue caller = callerFrame->callee();
48268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!caller)
48278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return jsNull();
48288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return caller;
48308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
48318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid Interpreter::retrieveLastCaller(CallFrame* callFrame, int& lineNumber, intptr_t& sourceID, UString& sourceURL, JSValue& function) const
48338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
48345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    function = JSValue();
48358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    lineNumber = -1;
48368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    sourceURL = UString();
48378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CallFrame* callerFrame = callFrame->callerFrame();
48398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (callerFrame->hasHostCallFrameFlag())
48408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
48418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
48428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CodeBlock* callerCodeBlock = callerFrame->codeBlock();
48438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!callerCodeBlock)
48448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
4845e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    unsigned bytecodeOffset = 0;
4846e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(INTERPRETER)
4847e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    if (!callerFrame->globalData().canUseJIT())
48484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        bytecodeOffset = callerCodeBlock->bytecodeOffset(callFrame->returnVPC());
4849e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(JIT)
4850e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    else
48514576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        bytecodeOffset = callerCodeBlock->bytecodeOffset(callFrame->returnPC());
4852e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
4853e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#else
48544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    bytecodeOffset = callerCodeBlock->bytecodeOffset(callFrame->returnPC());
4855e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
48564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    lineNumber = callerCodeBlock->lineNumberForBytecodeOffset(bytecodeOffset - 1);
4857231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    sourceID = callerCodeBlock->ownerExecutable()->sourceID();
4858231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    sourceURL = callerCodeBlock->ownerExecutable()->sourceURL();
48598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    function = callerFrame->callee();
48608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
48618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4862e78cbe89e6f337f2f1fe40315be88f742b547151Steve BlockCallFrame* Interpreter::findFunctionCallFrame(CallFrame* callFrame, JSFunction* function)
48638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
48648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (CallFrame* candidate = callFrame; candidate; candidate = candidate->callerFrame()->removeHostCallFrameFlag()) {
48658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (candidate->callee() == function)
48668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return candidate;
48678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
48688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
48698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
48708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4871231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid Interpreter::enableSampler()
4872231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
4873231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(OPCODE_SAMPLING)
4874231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!m_sampler) {
4875231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_sampler.set(new SamplingTool(this));
4876231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_sampler->setup();
4877231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
4878231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
4879231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
4880231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid Interpreter::dumpSampleData(ExecState* exec)
4881231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
4882231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(OPCODE_SAMPLING)
4883231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (m_sampler)
4884231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_sampler->dump(exec);
4885231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#else
4886231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    UNUSED_PARAM(exec);
4887231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
4888231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
4889231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid Interpreter::startSampling()
4890231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
4891231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(SAMPLING_THREAD)
4892231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!m_sampleEntryDepth)
4893231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        SamplingThread::start();
4894231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
4895231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_sampleEntryDepth++;
4896231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
4897231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
4898231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid Interpreter::stopSampling()
4899231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
4900231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(SAMPLING_THREAD)
4901231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_sampleEntryDepth--;
4902231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (!m_sampleEntryDepth)
4903231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        SamplingThread::stop();
4904231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
4905231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
4906231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
49078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace JSC
4908