1/*
2 *  Copyright (C) 1999-2001 Harri Porten (porten@kde.org)
3 *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
4 *  Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
5 *
6 *  This library is free software; you can redistribute it and/or
7 *  modify it under the terms of the GNU Library General Public
8 *  License as published by the Free Software Foundation; either
9 *  version 2 of the License, or (at your option) any later version.
10 *
11 *  This library is distributed in the hope that it will be useful,
12 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 *  Library General Public License for more details.
15 *
16 *  You should have received a copy of the GNU Library General Public License
17 *  along with this library; see the file COPYING.LIB.  If not, write to
18 *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 *  Boston, MA 02110-1301, USA.
20 *
21 */
22
23#ifndef GetterSetter_h
24#define GetterSetter_h
25
26#include "JSCell.h"
27
28#include "CallFrame.h"
29#include "Structure.h"
30
31namespace JSC {
32
33    class JSObject;
34
35    // This is an internal value object which stores getter and setter functions
36    // for a property.
37    class GetterSetter : public JSCell {
38        friend class JIT;
39
40    private:
41        GetterSetter(VM& vm)
42            : JSCell(vm, vm.getterSetterStructure.get())
43        {
44        }
45
46    public:
47        typedef JSCell Base;
48
49        static GetterSetter* create(VM& vm)
50        {
51            GetterSetter* getterSetter = new (NotNull, allocateCell<GetterSetter>(vm.heap)) GetterSetter(vm);
52            getterSetter->finishCreation(vm);
53            return getterSetter;
54        }
55
56        static void visitChildren(JSCell*, SlotVisitor&);
57
58        JSObject* getter() const { return m_getter.get(); }
59        void setGetter(VM& vm, JSObject* getter) { m_getter.setMayBeNull(vm, this, getter); }
60        JSObject* setter() const { return m_setter.get(); }
61        void setSetter(VM& vm, JSObject* setter) { m_setter.setMayBeNull(vm, this, setter); }
62        static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)
63        {
64            return Structure::create(vm, globalObject, prototype, TypeInfo(GetterSetterType, OverridesVisitChildren), info());
65        }
66
67        static ptrdiff_t offsetOfGetter()
68        {
69            return OBJECT_OFFSETOF(GetterSetter, m_getter);
70        }
71
72        static ptrdiff_t offsetOfSetter()
73        {
74            return OBJECT_OFFSETOF(GetterSetter, m_setter);
75        }
76
77        DECLARE_INFO;
78
79    private:
80        WriteBarrier<JSObject> m_getter;
81        WriteBarrier<JSObject> m_setter;
82    };
83
84    GetterSetter* asGetterSetter(JSValue);
85
86    inline GetterSetter* asGetterSetter(JSValue value)
87    {
88        ASSERT_WITH_SECURITY_IMPLICATION(value.asCell()->isGetterSetter());
89        return static_cast<GetterSetter*>(value.asCell());
90    }
91
92    JSValue callGetter(ExecState*, JSValue base, JSValue getterSetter);
93    void callSetter(ExecState*, JSValue base, JSValue getterSetter, JSValue value, ECMAMode);
94
95} // namespace JSC
96
97#endif // GetterSetter_h
98