/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the QtScript module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage ** This file contains pre-release code and may not be distributed. ** You may use this file in accordance with the terms and conditions ** contained in the either Technology Preview License Agreement or the ** Beta Release License Agreement. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain ** additional rights. These rights are described in the Nokia Qt LGPL ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this ** package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you are unsure which license is appropriate for your use, please ** contact the sales department at http://www.qtsoftware.com/contact. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QSCRIPTQOBJECT_P_H #define QSCRIPTQOBJECT_P_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include "qscriptobject_p.h" #include "qscriptengine.h" #include #include "InternalFunction.h" QT_BEGIN_NAMESPACE namespace QScript { enum AttributeExtension { // ### Make sure there's no conflict with JSC::Attribute QObjectMemberAttribute = 1 << 12 }; class QObjectDelegate : public QScriptObjectDelegate { public: struct Data { QPointer value; QScriptEngine::ValueOwnership ownership; QScriptEngine::QObjectWrapOptions options; QHash cachedMembers; Data(QObject *o, QScriptEngine::ValueOwnership own, QScriptEngine::QObjectWrapOptions opt) : value(o), ownership(own), options(opt) {} }; QObjectDelegate( QObject *object, QScriptEngine::ValueOwnership ownership, const QScriptEngine::QObjectWrapOptions &options); ~QObjectDelegate(); virtual Type type() const; virtual bool getOwnPropertySlot(QScriptObject*, JSC::ExecState*, const JSC::Identifier& propertyName, JSC::PropertySlot&); virtual void put(QScriptObject*, JSC::ExecState* exec, const JSC::Identifier& propertyName, JSC::JSValue, JSC::PutPropertySlot&); virtual bool deleteProperty(QScriptObject*, JSC::ExecState*, const JSC::Identifier& propertyName, bool checkDontDelete = true); virtual bool getPropertyAttributes(const QScriptObject*, JSC::ExecState*, const JSC::Identifier&, unsigned&) const; virtual void getPropertyNames(QScriptObject*, JSC::ExecState*, JSC::PropertyNameArray&, unsigned listedAttributes = JSC::Structure::Prototype); virtual void mark(QScriptObject*); inline QObject *value() const { return data->value; } inline void setValue(QObject* value) { data->value = value; } inline QScriptEngine::ValueOwnership ownership() const { return data->ownership; } inline void setOwnership(QScriptEngine::ValueOwnership ownership) { data->ownership = ownership; } inline QScriptEngine::QObjectWrapOptions options() const { return data->options; } inline void setOptions(QScriptEngine::QObjectWrapOptions options) { data->options = options; } protected: Data *data; }; class QObjectPrototypeObject : public QObject { Q_OBJECT public: QObjectPrototypeObject(QObject *parent = 0) : QObject(parent) { } ~QObjectPrototypeObject() { } }; class QObjectPrototype : public QScriptObject { public: QObjectPrototype(JSC::ExecState*, WTF::PassRefPtr, JSC::Structure* prototypeFunctionStructure); }; class QObjectConnectionManager; struct QObjectWrapperInfo { QObjectWrapperInfo(QScriptObject *obj, QScriptEngine::ValueOwnership own, const QScriptEngine::QObjectWrapOptions &opt) : object(obj), ownership(own), options(opt) {} QScriptObject *object; QScriptEngine::ValueOwnership ownership; QScriptEngine::QObjectWrapOptions options; }; class QObjectData // : public QObjectUserData { public: QObjectData(QScriptEnginePrivate *engine); ~QObjectData(); bool addSignalHandler(QObject *sender, int signalIndex, JSC::JSValue receiver, JSC::JSValue slot, JSC::JSValue senderWrapper, Qt::ConnectionType type); bool removeSignalHandler(QObject *sender, int signalIndex, JSC::JSValue receiver, JSC::JSValue slot); QScriptObject *findWrapper(QScriptEngine::ValueOwnership ownership, const QScriptEngine::QObjectWrapOptions &options) const; void registerWrapper(QScriptObject *wrapper, QScriptEngine::ValueOwnership ownership, const QScriptEngine::QObjectWrapOptions &options); void mark(); private: QScriptEnginePrivate *engine; QScript::QObjectConnectionManager *connectionManager; QList wrappers; }; class QtFunction: public JSC::InternalFunction { public: // work around CELL_SIZE limitation struct Data { JSC::JSValue object; int initialIndex; bool maybeOverloaded; Data(JSC::JSValue o, int ii, bool mo) : object(o), initialIndex(ii), maybeOverloaded(mo) {} }; QtFunction(JSC::JSValue object, int initialIndex, bool maybeOverloaded, JSC::JSGlobalData*, WTF::PassRefPtr, const JSC::Identifier&); virtual ~QtFunction(); virtual JSC::CallType getCallData(JSC::CallData&); virtual void mark(); virtual const JSC::ClassInfo* classInfo() const { return &info; } static const JSC::ClassInfo info; static JSC::JSValue JSC_HOST_CALL call(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&); JSC::JSValue execute(JSC::ExecState *exec, JSC::JSValue thisValue, const JSC::ArgList &args); QScriptObject *wrapperObject() const; QObject *qobject() const; const QMetaObject *metaObject() const; int initialIndex() const; bool maybeOverloaded() const; int mostGeneralMethod(QMetaMethod *out = 0) const; QList overloadedIndexes() const; QString functionName() const; private: Data *data; }; class QtPropertyFunction: public JSC::InternalFunction { public: // work around CELL_SIZE limitation struct Data { const QMetaObject *meta; int index; Data(const QMetaObject *m, int i) : meta(m), index(i) {} }; QtPropertyFunction(const QMetaObject *meta, int index, JSC::JSGlobalData*, WTF::PassRefPtr, const JSC::Identifier&); virtual ~QtPropertyFunction(); virtual JSC::CallType getCallData(JSC::CallData&); virtual const JSC::ClassInfo* classInfo() const { return &info; } static const JSC::ClassInfo info; static JSC::JSValue JSC_HOST_CALL call(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&); JSC::JSValue execute(JSC::ExecState *exec, JSC::JSValue thisValue, const JSC::ArgList &args); const QMetaObject *metaObject() const; int propertyIndex() const; private: Data *data; }; class QMetaObjectWrapperObject : public JSC::JSObject { public: // work around CELL_SIZE limitation struct Data { const QMetaObject *value; JSC::JSValue ctor; JSC::JSValue prototype; Data(const QMetaObject *mo, JSC::JSValue c) : value(mo), ctor(c) {} }; explicit QMetaObjectWrapperObject( JSC::ExecState *, const QMetaObject *metaobject, JSC::JSValue ctor, WTF::PassRefPtr sid); ~QMetaObjectWrapperObject(); virtual bool getOwnPropertySlot(JSC::ExecState*, const JSC::Identifier& propertyName, JSC::PropertySlot&); virtual void put(JSC::ExecState* exec, const JSC::Identifier& propertyName, JSC::JSValue, JSC::PutPropertySlot&); virtual bool deleteProperty(JSC::ExecState*, const JSC::Identifier& propertyName, bool checkDontDelete = true); virtual bool getPropertyAttributes(JSC::ExecState*, const JSC::Identifier&, unsigned&) const; virtual void getPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&, unsigned listedAttributes = JSC::Structure::Prototype); virtual void mark(); virtual JSC::CallType getCallData(JSC::CallData&); virtual JSC::ConstructType getConstructData(JSC::ConstructData&); virtual const JSC::ClassInfo* classInfo() const { return &info; } static const JSC::ClassInfo info; static JSC::JSValue JSC_HOST_CALL call(JSC::ExecState*, JSC::JSObject*, JSC::JSValue, const JSC::ArgList&); static JSC::JSObject* construct(JSC::ExecState *, JSC::JSObject *, const JSC::ArgList &); JSC::JSValue execute(JSC::ExecState *exec, const JSC::ArgList &args, bool calledAsConstructor); inline const QMetaObject *value() const { return data->value; } inline void setValue(const QMetaObject* value) { data->value = value; } static WTF::PassRefPtr createStructure(JSC::JSValue prototype) { return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType)); } protected: Data *data; }; class QMetaObjectPrototype : public QMetaObjectWrapperObject { public: QMetaObjectPrototype(JSC::ExecState*, WTF::PassRefPtr, JSC::Structure* prototypeFunctionStructure); }; } // namespace QScript QT_END_NAMESPACE #endif