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