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