1/*
2 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
3 *
4 *  This library is free software; you can redistribute it and/or
5 *  modify it under the terms of the GNU Lesser General Public
6 *  License as published by the Free Software Foundation; either
7 *  version 2 of the License, or (at your option) any later version.
8 *
9 *  This library is distributed in the hope that it will be useful,
10 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 *  Lesser General Public License for more details.
13 *
14 *  You should have received a copy of the GNU Lesser General Public
15 *  License along with this library; if not, write to the Free Software
16 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17 *
18 */
19
20#ifndef qt_instance_h
21#define qt_instance_h
22
23#include "BridgeJSC.h"
24#include "runtime_root.h"
25#include <QtScript/qscriptengine.h>
26#include <qhash.h>
27#include <qpointer.h>
28#include <qset.h>
29
30namespace JSC {
31
32namespace Bindings {
33
34class QtClass;
35class QtField;
36class QtRuntimeMetaMethod;
37
38class QtInstance : public Instance {
39public:
40    ~QtInstance();
41
42    virtual Class* getClass() const;
43    virtual RuntimeObject* newRuntimeObject(ExecState*);
44
45    virtual void begin();
46    virtual void end();
47
48    virtual JSValue valueOf(ExecState*) const;
49    virtual JSValue defaultValue(ExecState*, PreferredPrimitiveType) const;
50
51    void markAggregate(MarkStack&);
52
53    virtual JSValue getMethod(ExecState* exec, const Identifier& propertyName);
54    virtual JSValue invokeMethod(ExecState*, RuntimeMethod*);
55
56    virtual void getPropertyNames(ExecState*, PropertyNameArray&);
57
58    JSValue stringValue(ExecState* exec) const;
59    JSValue numberValue(ExecState* exec) const;
60    JSValue booleanValue() const;
61
62    QObject* getObject() const { return m_object; }
63    QObject* hashKey() const { return m_hashkey; }
64
65    static PassRefPtr<QtInstance> getQtInstance(QObject*, PassRefPtr<RootObject>, QScriptEngine::ValueOwnership ownership);
66
67    virtual bool getOwnPropertySlot(JSObject*, ExecState*, const Identifier&, PropertySlot&);
68    virtual void put(JSObject*, ExecState*, const Identifier&, JSValue, PutPropertySlot&);
69
70    void removeCachedMethod(JSObject*);
71
72    static QtInstance* getInstance(JSObject*);
73
74private:
75    static PassRefPtr<QtInstance> create(QObject *instance, PassRefPtr<RootObject> rootObject, QScriptEngine::ValueOwnership ownership)
76    {
77        return adoptRef(new QtInstance(instance, rootObject, ownership));
78    }
79
80    friend class QtClass;
81    friend class QtField;
82    QtInstance(QObject*, PassRefPtr<RootObject>, QScriptEngine::ValueOwnership ownership); // Factory produced only..
83    mutable QtClass* m_class;
84    QPointer<QObject> m_object;
85    QObject* m_hashkey;
86    mutable QHash<QByteArray, WriteBarrier<JSObject> > m_methods;
87    mutable QHash<QString, QtField*> m_fields;
88    mutable WriteBarrier<QtRuntimeMetaMethod> m_defaultMethod;
89    QScriptEngine::ValueOwnership m_ownership;
90};
91
92} // namespace Bindings
93
94} // namespace JSC
95
96#endif
97