10bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*
20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *  Copyright (C) 1999-2001 Harri Porten (porten@kde.org)
30bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *  Copyright (C) 2003, 2004, 2005, 2007, 2008 Apple Inc. All rights reserved.
50bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *
60bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *  This library is free software; you can redistribute it and/or
70bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *  modify it under the terms of the GNU Library General Public
80bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *  License as published by the Free Software Foundation; either
90bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *  version 2 of the License, or (at your option) any later version.
100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *
110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *  This library is distributed in the hope that it will be useful,
120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *  but WITHOUT ANY WARRANTY; without even the implied warranty of
130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *  Library General Public License for more details.
150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *
160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *  You should have received a copy of the GNU Library General Public License
170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *  along with this library; see the file COPYING.LIB.  If not, write to
180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *  Boston, MA 02110-1301, USA.
200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *
210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch */
220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#ifndef JSAPIValueWrapper_h
240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#define JSAPIValueWrapper_h
250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "JSCell.h"
270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "CallFrame.h"
282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "Structure.h"
290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochnamespace JSC {
310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    class JSAPIValueWrapper : public JSCell {
330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        friend JSValue jsAPIValueWrapper(ExecState*, JSValue);
340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    public:
352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        JSValue value() const { return m_value.get(); }
360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        virtual bool isAPIValueWrapper() const { return true; }
380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static Structure* createStructure(JSGlobalData& globalData, JSValue prototype)
400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        {
412bde8e466a4451c7319e3a072d118917957d6554Steve Block            return Structure::create(globalData, prototype, TypeInfo(CompoundType, OverridesMarkChildren | OverridesGetPropertyNames), AnonymousSlotCount, 0);
420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    private:
460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JSAPIValueWrapper(ExecState* exec, JSValue value)
472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            : JSCell(exec->globalData(), exec->globalData().apiWrapperStructure.get())
480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        {
492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block            m_value.set(exec->globalData(), this, value);
50231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            ASSERT(!value.isCell());
510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        WriteBarrier<Unknown> m_value;
540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    };
550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    inline JSValue jsAPIValueWrapper(ExecState* exec, JSValue value)
570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    {
580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return new (exec) JSAPIValueWrapper(exec, value);
590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} // namespace JSC
620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif // JSAPIValueWrapper_h
64