18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999-2000 Harri Porten (porten@kde.org) 30bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2003, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Cameron Zwarich (cwzwarich@uwaterloo.ca) 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Maks Orlovich 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version. 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful, 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB. If not, write to 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA. 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef Arguments_h 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define Arguments_h 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSActivation.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSFunction.h" 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSGlobalObject.h" 30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Interpreter.h" 31231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "ObjectConstructor.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace JSC { 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 35ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch struct ArgumentsData { 36ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch WTF_MAKE_NONCOPYABLE(ArgumentsData); WTF_MAKE_FAST_ALLOCATED; 37ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch public: 38ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch ArgumentsData() { } 392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block WriteBarrier<JSActivation> activation; 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned numParameters; 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ptrdiff_t firstParameterIndex; 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned numArguments; 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WriteBarrier<Unknown>* registers; 4681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch OwnArrayPtr<WriteBarrier<Unknown> > registerArray; 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WriteBarrier<Unknown>* extraArguments; 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OwnArrayPtr<bool> deletedArguments; 5081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WriteBarrier<Unknown> extraArgumentsFixedBuffer[4]; 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block WriteBarrier<JSFunction> callee; 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool overrodeLength : 1; 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool overrodeCallee : 1; 55a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch bool overrodeCaller : 1; 56a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch bool isStrictMode : 1; 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch class Arguments : public JSNonFinalObject { 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project public: 62ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // Use an enum because otherwise gcc insists on doing a memory 63ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block // read. 64ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block enum { MaxArguments = 0x10000 }; 65ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project enum NoParametersType { NoParameters }; 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Arguments(CallFrame*); 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Arguments(CallFrame*, NoParametersType); 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual ~Arguments(); 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch static const ClassInfo s_info; 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch virtual void markChildren(MarkStack&); 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void fillArgList(ExecState*, MarkedArgumentBuffer&); 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian uint32_t numProvidedArguments(ExecState* exec) const 795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (UNLIKELY(d->overrodeLength)) 815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return get(exec, exec->propertyNames().length).toUInt32(exec); 825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian return d->numArguments; 835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void copyToRegisters(ExecState* exec, Register* buffer, uint32_t maxSize); 8681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch void copyRegisters(JSGlobalData&); 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool isTornOff() const { return d->registerArray; } 882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block void setActivation(JSGlobalData& globalData, JSActivation* activation) 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 9081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(!d->registerArray); 912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block d->activation.set(globalData, this, activation); 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project d->registers = &activation->registerAt(0); 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static Structure* createStructure(JSGlobalData& globalData, JSValue prototype) 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 972bde8e466a4451c7319e3a072d118917957d6554Steve Block return Structure::create(globalData, prototype, TypeInfo(ObjectType, StructureFlags), AnonymousSlotCount, &s_info); 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 100cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block protected: 101cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesMarkChildren | OverridesGetPropertyNames | JSObject::StructureFlags; 102cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project private: 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void getArgumentsData(CallFrame*, JSFunction*&, ptrdiff_t& firstParameterIndex, Register*& argv, int& argc); 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool getOwnPropertySlot(ExecState*, const Identifier& propertyName, PropertySlot&); 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool getOwnPropertySlot(ExecState*, unsigned propertyName, PropertySlot&); 107231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block virtual bool getOwnPropertyDescriptor(ExecState*, const Identifier&, PropertyDescriptor&); 108d0825bca7fe65beaee391d30da42e937db621564Steve Block virtual void getOwnPropertyNames(ExecState*, PropertyNameArray&, EnumerationMode mode = ExcludeDontEnumProperties); 1095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian virtual void put(ExecState*, const Identifier& propertyName, JSValue, PutPropertySlot&); 1102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block virtual void put(ExecState*, unsigned propertyName, JSValue); 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool deleteProperty(ExecState*, const Identifier& propertyName); 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual bool deleteProperty(ExecState*, unsigned propertyName); 113a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch void createStrictModeCallerIfNecessary(ExecState*); 114a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch void createStrictModeCalleeIfNecessary(ExecState*); 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void init(CallFrame*); 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OwnPtr<ArgumentsData> d; 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian Arguments* asArguments(JSValue); 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian inline Arguments* asArguments(JSValue value) 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 12581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(asObject(value)->inherits(&Arguments::s_info)); 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return static_cast<Arguments*>(asObject(value)); 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ALWAYS_INLINE void Arguments::getArgumentsData(CallFrame* callFrame, JSFunction*& function, ptrdiff_t& firstParameterIndex, Register*& argv, int& argc) 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1315af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke function = asFunction(callFrame->callee()); 132231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 133231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block int numParameters = function->jsExecutable()->parameterCount(); 1345af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke argc = callFrame->argumentCountIncludingThis(); 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (argc <= numParameters) 137231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block argv = callFrame->registers() - RegisterFile::CallFrameHeaderSize - numParameters; 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 139231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block argv = callFrame->registers() - RegisterFile::CallFrameHeaderSize - numParameters - argc; 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project argc -= 1; // - 1 to skip "this" 142231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block firstParameterIndex = -RegisterFile::CallFrameHeaderSize - numParameters; 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project inline Arguments::Arguments(CallFrame* callFrame) 1462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch : JSNonFinalObject(callFrame->globalData(), callFrame->lexicalGlobalObject()->argumentsStructure()) 147e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke , d(adoptPtr(new ArgumentsData)) 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 14981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(inherits(&s_info)); 15081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSFunction* callee; 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ptrdiff_t firstParameterIndex; 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Register* argv; 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int numArguments; 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getArgumentsData(callFrame, callee, firstParameterIndex, argv, numArguments); 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 157231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block d->numParameters = callee->jsExecutable()->parameterCount(); 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project d->firstParameterIndex = firstParameterIndex; 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project d->numArguments = numArguments; 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch d->registers = reinterpret_cast<WriteBarrier<Unknown>*>(callFrame->registers()); 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WriteBarrier<Unknown>* extraArguments; 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (d->numArguments <= d->numParameters) 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project extraArguments = 0; 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else { 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned numExtraArguments = d->numArguments - d->numParameters; 16881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (numExtraArguments > sizeof(d->extraArgumentsFixedBuffer) / sizeof(WriteBarrier<Unknown>)) 16981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch extraArguments = new WriteBarrier<Unknown>[numExtraArguments]; 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project extraArguments = d->extraArgumentsFixedBuffer; 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned i = 0; i < numExtraArguments; ++i) 17381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch extraArguments[i].set(callFrame->globalData(), this, argv[d->numParameters + i].jsValue()); 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project d->extraArguments = extraArguments; 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block d->callee.set(callFrame->globalData(), this, callee); 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project d->overrodeLength = false; 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project d->overrodeCallee = false; 181a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch d->overrodeCaller = false; 182a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch d->isStrictMode = callFrame->codeBlock()->isStrictMode(); 183a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (d->isStrictMode) 18481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch copyRegisters(callFrame->globalData()); 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project inline Arguments::Arguments(CallFrame* callFrame, NoParametersType) 1882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch : JSNonFinalObject(callFrame->globalData(), callFrame->lexicalGlobalObject()->argumentsStructure()) 189e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke , d(adoptPtr(new ArgumentsData)) 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 19181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch ASSERT(inherits(&s_info)); 1925af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke ASSERT(!asFunction(callFrame->callee())->jsExecutable()->parameterCount()); 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1945af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke unsigned numArguments = callFrame->argumentCount(); 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project d->numParameters = 0; 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project d->numArguments = numArguments; 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 19981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WriteBarrier<Unknown>* extraArguments; 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (numArguments > sizeof(d->extraArgumentsFixedBuffer) / sizeof(Register)) 20181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch extraArguments = new WriteBarrier<Unknown>[numArguments]; 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project extraArguments = d->extraArgumentsFixedBuffer; 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Register* argv = callFrame->registers() - RegisterFile::CallFrameHeaderSize - numArguments - 1; 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned i = 0; i < numArguments; ++i) 20781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch extraArguments[i].set(callFrame->globalData(), this, argv[i].jsValue()); 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project d->extraArguments = extraArguments; 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block d->callee.set(callFrame->globalData(), this, asFunction(callFrame->callee())); 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project d->overrodeLength = false; 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project d->overrodeCallee = false; 214a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch d->overrodeCaller = false; 215a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch d->isStrictMode = callFrame->codeBlock()->isStrictMode(); 216a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch if (d->isStrictMode) 21781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch copyRegisters(callFrame->globalData()); 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 22081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch inline void Arguments::copyRegisters(JSGlobalData& globalData) 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!isTornOff()); 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!d->numParameters) 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int registerOffset = d->numParameters + RegisterFile::CallFrameHeaderSize; 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project size_t registerArraySize = d->numParameters; 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 23081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch OwnArrayPtr<WriteBarrier<Unknown> > registerArray = adoptArrayPtr(new WriteBarrier<Unknown>[registerArraySize]); 23181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch for (size_t i = 0; i < registerArraySize; i++) 23281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch registerArray[i].set(globalData, this, d->registers[i - registerOffset].get()); 2332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block d->registers = registerArray.get() + registerOffset; 2342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block d->registerArray = registerArray.release(); 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This JSActivation function is defined here so it can get at Arguments::setRegisters. 23881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch inline void JSActivation::copyRegisters(JSGlobalData& globalData) 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2402bde8e466a4451c7319e3a072d118917957d6554Steve Block ASSERT(!m_registerArray); 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2422bde8e466a4451c7319e3a072d118917957d6554Steve Block size_t numLocals = m_numCapturedVars + m_numParametersMinusThis; 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!numLocals) 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2472bde8e466a4451c7319e3a072d118917957d6554Steve Block int registerOffset = m_numParametersMinusThis + RegisterFile::CallFrameHeaderSize; 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project size_t registerArraySize = numLocals + RegisterFile::CallFrameHeaderSize; 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch OwnArrayPtr<WriteBarrier<Unknown> > registerArray = copyRegisterArray(globalData, m_registers - registerOffset, registerArraySize, m_numParametersMinusThis + 1); 25181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch WriteBarrier<Unknown>* registers = registerArray.get() + registerOffset; 2522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block setRegisters(registers, registerArray.release()); 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace JSC 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // Arguments_h 258