/**************************************************************************** | |
** | |
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). | |
** All rights reserved. | |
** Contact: Nokia Corporation (qt-info@nokia.com) | |
** | |
** This file is part of the QtScript module of the Qt Toolkit. | |
** | |
** $QT_BEGIN_LICENSE:LGPL-ONLY$ | |
** GNU Lesser General Public License Usage | |
** 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. | |
** | |
** If you have questions regarding the use of this file, please contact | |
** Nokia at qt-info@nokia.com. | |
** $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 <QtCore/qpointer.h> | |
#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<QObject> value; | |
QScriptEngine::ValueOwnership ownership; | |
QScriptEngine::QObjectWrapOptions options; | |
QHash<QByteArray, JSC::JSValue> 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 bool getOwnPropertyDescriptor(QScriptObject*, JSC::ExecState*, | |
const JSC::Identifier& propertyName, | |
JSC::PropertyDescriptor&); | |
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); | |
virtual void getOwnPropertyNames(QScriptObject*, JSC::ExecState*, | |
JSC::PropertyNameArray&, | |
JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties); | |
virtual void markChildren(QScriptObject*, JSC::MarkStack& markStack); | |
virtual bool compareToObject(QScriptObject*, JSC::ExecState*, JSC::JSObject*); | |
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>, | |
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(JSC::MarkStack&); | |
private: | |
QScriptEnginePrivate *engine; | |
QScript::QObjectConnectionManager *connectionManager; | |
QList<QScript::QObjectWrapperInfo> 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<JSC::Structure>, const JSC::Identifier&); | |
virtual ~QtFunction(); | |
virtual JSC::CallType getCallData(JSC::CallData&); | |
virtual void markChildren(JSC::MarkStack&); | |
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<int> overloadedIndexes() 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<JSC::Structure>, | |
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<JSC::Structure> sid); | |
~QMetaObjectWrapperObject(); | |
virtual bool getOwnPropertySlot(JSC::ExecState*, | |
const JSC::Identifier& propertyName, | |
JSC::PropertySlot&); | |
virtual bool getOwnPropertyDescriptor(JSC::ExecState*, | |
const JSC::Identifier& propertyName, | |
JSC::PropertyDescriptor&); | |
virtual void put(JSC::ExecState* exec, const JSC::Identifier& propertyName, | |
JSC::JSValue, JSC::PutPropertySlot&); | |
virtual bool deleteProperty(JSC::ExecState*, | |
const JSC::Identifier& propertyName); | |
virtual void getOwnPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&, | |
JSC::EnumerationMode mode = JSC::ExcludeDontEnumProperties); | |
virtual void markChildren(JSC::MarkStack& markStack); | |
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); | |
inline const QMetaObject *value() const { return data->value; } | |
inline void setValue(const QMetaObject* value) { data->value = value; } | |
static WTF::PassRefPtr<JSC::Structure> createStructure(JSC::JSValue prototype) | |
{ | |
return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags)); | |
} | |
protected: | |
static const unsigned StructureFlags = JSC::OverridesGetOwnPropertySlot | JSC::OverridesMarkChildren | JSC::OverridesGetPropertyNames | JSC::ImplementsHasInstance | JSObject::StructureFlags; | |
Data *data; | |
}; | |
class QMetaObjectPrototype : public QMetaObjectWrapperObject | |
{ | |
public: | |
QMetaObjectPrototype(JSC::ExecState*, WTF::PassRefPtr<JSC::Structure>, | |
JSC::Structure* prototypeFunctionStructure); | |
}; | |
} // namespace QScript | |
QT_END_NAMESPACE | |
#endif |