18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2008, 2009 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSActivation.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Arguments.h" 33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Interpreter.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSFunction.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC { 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectASSERT_CLASS_FITS_IN_CELL(JSActivation); 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochconst ClassInfo JSActivation::s_info = { "JSActivation", &Base::s_info, 0, 0 }; 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 422bde8e466a4451c7319e3a072d118917957d6554Steve BlockJSActivation::JSActivation(CallFrame* callFrame, FunctionExecutable* functionExecutable) 432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch : Base(callFrame->globalData(), callFrame->globalData().activationStructure.get(), functionExecutable->symbolTable(), callFrame->registers()) 442bde8e466a4451c7319e3a072d118917957d6554Steve Block , m_numParametersMinusThis(static_cast<int>(functionExecutable->parameterCount())) 452bde8e466a4451c7319e3a072d118917957d6554Steve Block , m_numCapturedVars(functionExecutable->capturedVariableCount()) 462bde8e466a4451c7319e3a072d118917957d6554Steve Block , m_requiresDynamicChecks(functionExecutable->usesEval()) 472bde8e466a4451c7319e3a072d118917957d6554Steve Block , m_argumentsRegister(functionExecutable->generatedBytecode().argumentsRegister()) 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(inherits(&s_info)); 502bde8e466a4451c7319e3a072d118917957d6554Steve Block 512bde8e466a4451c7319e3a072d118917957d6554Steve Block // We have to manually ref and deref the symbol table as JSVariableObject 522bde8e466a4451c7319e3a072d118917957d6554Steve Block // doesn't know about SharedSymbolTable 532bde8e466a4451c7319e3a072d118917957d6554Steve Block static_cast<SharedSymbolTable*>(m_symbolTable)->ref(); 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectJSActivation::~JSActivation() 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 582bde8e466a4451c7319e3a072d118917957d6554Steve Block static_cast<SharedSymbolTable*>(m_symbolTable)->deref(); 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid JSActivation::markChildren(MarkStack& markStack) 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Base::markChildren(markStack); 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 65ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch // No need to mark our registers if they're still in the RegisterFile. 662bde8e466a4451c7319e3a072d118917957d6554Steve Block WriteBarrier<Unknown>* registerArray = m_registerArray.get(); 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!registerArray) 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 702bde8e466a4451c7319e3a072d118917957d6554Steve Block markStack.appendValues(registerArray, m_numParametersMinusThis); 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Skip the call frame, which sits between the parameters and vars. 732bde8e466a4451c7319e3a072d118917957d6554Steve Block markStack.appendValues(registerArray + m_numParametersMinusThis + RegisterFile::CallFrameHeaderSize, m_numCapturedVars, MayContainNullValues); 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 76bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monseninline bool JSActivation::symbolTableGet(const Identifier& propertyName, PropertySlot& slot) 77bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{ 78bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen SymbolTableEntry entry = symbolTable().inlineGet(propertyName.impl()); 792bde8e466a4451c7319e3a072d118917957d6554Steve Block if (entry.isNull()) 802bde8e466a4451c7319e3a072d118917957d6554Steve Block return false; 812bde8e466a4451c7319e3a072d118917957d6554Steve Block if (entry.getIndex() >= m_numCapturedVars) 822bde8e466a4451c7319e3a072d118917957d6554Steve Block return false; 832bde8e466a4451c7319e3a072d118917957d6554Steve Block 842bde8e466a4451c7319e3a072d118917957d6554Steve Block slot.setValue(registerAt(entry.getIndex()).get()); 852bde8e466a4451c7319e3a072d118917957d6554Steve Block return true; 86bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen} 87bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 8881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochinline bool JSActivation::symbolTablePut(JSGlobalData& globalData, const Identifier& propertyName, JSValue value) 89bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{ 90bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this)); 91bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 92bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen SymbolTableEntry entry = symbolTable().inlineGet(propertyName.impl()); 93bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (entry.isNull()) 94bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return false; 95bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (entry.isReadOnly()) 96bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return true; 972bde8e466a4451c7319e3a072d118917957d6554Steve Block if (entry.getIndex() >= m_numCapturedVars) 982bde8e466a4451c7319e3a072d118917957d6554Steve Block return false; 992bde8e466a4451c7319e3a072d118917957d6554Steve Block 10081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch registerAt(entry.getIndex()).set(globalData, this, value); 101bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return true; 102bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen} 103bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 104bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid JSActivation::getOwnPropertyNames(ExecState* exec, PropertyNameArray& propertyNames, EnumerationMode mode) 105bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{ 106bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen SymbolTable::const_iterator end = symbolTable().end(); 107bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen for (SymbolTable::const_iterator it = symbolTable().begin(); it != end; ++it) { 1082bde8e466a4451c7319e3a072d118917957d6554Steve Block if (it->second.getAttributes() & DontEnum && mode != IncludeDontEnumProperties) 1092bde8e466a4451c7319e3a072d118917957d6554Steve Block continue; 1102bde8e466a4451c7319e3a072d118917957d6554Steve Block if (it->second.getIndex() >= m_numCapturedVars) 1112bde8e466a4451c7319e3a072d118917957d6554Steve Block continue; 1122bde8e466a4451c7319e3a072d118917957d6554Steve Block propertyNames.add(Identifier(exec, it->first.get())); 113bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen } 114bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen // Skip the JSVariableObject implementation of getOwnPropertyNames 115bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen JSObject::getOwnPropertyNames(exec, propertyNames, mode); 116bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen} 117bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 11881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochinline bool JSActivation::symbolTablePutWithAttributes(JSGlobalData& globalData, const Identifier& propertyName, JSValue value, unsigned attributes) 119bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{ 120bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this)); 121bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 122bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen SymbolTable::iterator iter = symbolTable().find(propertyName.impl()); 123bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (iter == symbolTable().end()) 124bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return false; 125bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen SymbolTableEntry& entry = iter->second; 126bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen ASSERT(!entry.isNull()); 1272bde8e466a4451c7319e3a072d118917957d6554Steve Block if (entry.getIndex() >= m_numCapturedVars) 128bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return false; 1292bde8e466a4451c7319e3a072d118917957d6554Steve Block 130bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen entry.setAttributes(attributes); 13181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch registerAt(entry.getIndex()).set(globalData, this, value); 132bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return true; 133bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen} 134bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool JSActivation::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot) 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 137e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block if (propertyName == exec->propertyNames().arguments) { 138e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block slot.setCustom(this, getArgumentsGetter()); 139e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block return true; 140e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block } 141e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (symbolTableGet(propertyName, slot)) 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (WriteBarrierBase<Unknown>* location = getDirectLocation(exec->globalData(), propertyName)) { 1462fc2651226baac27029e38c9d6ef883fa32084dbSteve Block slot.setValue(location->get()); 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We don't call through to JSObject because there's no way to give an 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // activation object getter properties or a prototype. 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!hasGetterSetterProperties()); 153635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(prototype().isNull()); 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1572fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid JSActivation::put(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot) 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this)); 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (symbolTablePut(exec->globalData(), propertyName, value)) 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We don't call through to JSObject because __proto__ and getter/setter 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // properties are non-standard extensions that other implementations do not 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // expose in the activation object. 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!hasGetterSetterProperties()); 1682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block putDirect(exec->globalData(), propertyName, value, 0, true, slot); 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// FIXME: Make this function honor ReadOnly (const) and DontEnum 1725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid JSActivation::putWithAttributes(ExecState* exec, const Identifier& propertyName, JSValue value, unsigned attributes) 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this)); 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 17681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (symbolTablePutWithAttributes(exec->globalData(), propertyName, value, attributes)) 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We don't call through to JSObject because __proto__ and getter/setter 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // properties are non-standard extensions that other implementations do not 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // expose in the activation object. 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!hasGetterSetterProperties()); 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project PutPropertySlot slot; 1845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSObject::putWithAttributes(exec, propertyName, value, attributes, true, slot); 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool JSActivation::deleteProperty(ExecState* exec, const Identifier& propertyName) 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (propertyName == exec->propertyNames().arguments) 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return Base::deleteProperty(exec, propertyName); 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectJSObject* JSActivation::toThisObject(ExecState* exec) const 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return exec->globalThisValue(); 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 200a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochJSValue JSActivation::toStrictThisObject(ExecState*) const 201a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch{ 202a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch return jsNull(); 203a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch} 204a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch 2056c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsenbool JSActivation::isDynamicScope(bool& requiresDynamicChecks) const 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2072bde8e466a4451c7319e3a072d118917957d6554Steve Block requiresDynamicChecks = m_requiresDynamicChecks; 2086c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen return false; 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 211e78cbe89e6f337f2f1fe40315be88f742b547151Steve BlockJSValue JSActivation::argumentsGetter(ExecState*, JSValue slotBase, const Identifier&) 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 213dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block JSActivation* activation = asActivation(slotBase); 2142bde8e466a4451c7319e3a072d118917957d6554Steve Block CallFrame* callFrame = CallFrame::create(reinterpret_cast<Register*>(activation->m_registers)); 2152bde8e466a4451c7319e3a072d118917957d6554Steve Block int argumentsRegister = activation->m_argumentsRegister; 216ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch if (JSValue arguments = callFrame->uncheckedR(argumentsRegister).jsValue()) 217ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return arguments; 218ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch int realArgumentsRegister = unmodifiedArgumentsRegister(argumentsRegister); 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 220ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch JSValue arguments = JSValue(new (callFrame) Arguments(callFrame)); 221ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch callFrame->uncheckedR(argumentsRegister) = arguments; 222ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch callFrame->uncheckedR(realArgumentsRegister) = arguments; 223ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 22481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(callFrame->uncheckedR(realArgumentsRegister).jsValue().inherits(&Arguments::s_info)); 225ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return callFrame->uncheckedR(realArgumentsRegister).jsValue(); 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// These two functions serve the purpose of isolating the common case from a 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// PIC branch. 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectPropertySlot::GetValueFunc JSActivation::getArgumentsGetter() 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return argumentsGetter; 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace JSC 237