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