diff options
Diffstat (limited to 'src/script')
142 files changed, 5798 insertions, 29887 deletions
diff --git a/src/script/api/api.pri b/src/script/api/api.pri new file mode 100644 index 0000000..17ec9b6 --- /dev/null +++ b/src/script/api/api.pri @@ -0,0 +1,32 @@ +SOURCES += \ + $$PWD/qscriptclass.cpp \ + $$PWD/qscriptclasspropertyiterator.cpp \ + $$PWD/qscriptcontext.cpp \ + $$PWD/qscriptcontextinfo.cpp \ + $$PWD/qscriptengine.cpp \ + $$PWD/qscriptengineagent.cpp \ + $$PWD/qscriptextensionplugin.cpp \ + $$PWD/qscriptstring.cpp \ + $$PWD/qscriptvalue.cpp \ + $$PWD/qscriptvalueiterator.cpp \ + $$PWD/qscriptable.cpp + +HEADERS += \ + $$PWD/qscriptclass.h \ + $$PWD/qscriptclasspropertyiterator.h \ + $$PWD/qscriptcontext.h \ + $$PWD/qscriptcontext_p.h \ + $$PWD/qscriptcontextinfo.h \ + $$PWD/qscriptengine.h \ + $$PWD/qscriptengine_p.h \ + $$PWD/qscriptengineagent.h \ + $$PWD/qscriptengineagent_p.h \ + $$PWD/qscriptextensioninterface.h \ + $$PWD/qscriptextensionplugin.h \ + $$PWD/qscriptstring.h \ + $$PWD/qscriptstring_p.h \ + $$PWD/qscriptvalue.h \ + $$PWD/qscriptvalue_p.h \ + $$PWD/qscriptvalueiterator.h \ + $$PWD/qscriptable.h \ + $$PWD/qscriptable_p.h diff --git a/src/script/qscriptable.cpp b/src/script/api/qscriptable.cpp index a6401d6..c2aa6b3 100644 --- a/src/script/qscriptable.cpp +++ b/src/script/api/qscriptable.cpp @@ -1,55 +1,21 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ #ifndef QT_NO_QOBJECT #include "qscriptable.h" - -#ifndef QT_NO_SCRIPT - #include "qscriptable_p.h" - #include "qscriptengine.h" -#include "qscriptcontext.h" -#include "qscriptvalue.h" + +#ifndef QT_NO_SCRIPT QT_BEGIN_NAMESPACE diff --git a/src/script/api/qscriptable.h b/src/script/api/qscriptable.h new file mode 100644 index 0000000..f7ccb7b --- /dev/null +++ b/src/script/api/qscriptable.h @@ -0,0 +1,59 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +****************************************************************************/ + +#ifndef QSCRIPTABLE_H +#define QSCRIPTABLE_H + +#include <QtCore/qobjectdefs.h> + +#ifndef QT_NO_SCRIPT + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(Script) + +#ifndef QT_NO_QOBJECT + +class QScriptEngine; +class QScriptContext; +class QScriptValue; + +class QScriptablePrivate; + +class Q_SCRIPT_EXPORT QScriptable +{ +public: + QScriptable(); + ~QScriptable(); + + QScriptEngine *engine() const; + QScriptContext *context() const; + QScriptValue thisObject() const; + int argumentCount() const; + QScriptValue argument(int index) const; + +private: + QScriptablePrivate *d_ptr; + + Q_DISABLE_COPY(QScriptable) + Q_DECLARE_PRIVATE(QScriptable) +}; + +#endif // QT_NO_QOBJECT + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif // QT_NO_SCRIPT +#endif // QSCRIPTABLE_H diff --git a/src/script/api/qscriptable_p.h b/src/script/api/qscriptable_p.h new file mode 100644 index 0000000..68958d0 --- /dev/null +++ b/src/script/api/qscriptable_p.h @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +****************************************************************************/ + +#ifndef QSCRIPTABLE_P_H +#define QSCRIPTABLE_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 <QtCore/qobjectdefs.h> + +#ifndef QT_NO_SCRIPT + +QT_BEGIN_NAMESPACE + +class QScriptable; +class QScriptablePrivate +{ + Q_DECLARE_PUBLIC(QScriptable) +public: + inline QScriptablePrivate() + : engine(0) + { } + + static inline QScriptablePrivate *get(QScriptable *q) + { return q->d_func(); } + + QScriptEngine *engine; + + QScriptable *q_ptr; +}; + +QT_END_NAMESPACE + +#endif // QT_NO_SCRIPT + +#endif diff --git a/src/script/qscriptclass.cpp b/src/script/api/qscriptclass.cpp index 14b8add..98cc834 100644 --- a/src/script/qscriptclass.cpp +++ b/src/script/api/qscriptclass.cpp @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ @@ -43,21 +13,7 @@ #ifndef QT_NO_SCRIPT -#include <QtCore/qstringlist.h> - -#include "qscriptclasspropertyiterator.h" -#include "qscriptstring.h" -#include "qscriptstring_p.h" -#include "qscriptclass_p.h" -#include "qscriptclassinfo_p.h" -#include "qscriptengine_p.h" -#include "qscriptcontext_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" -#include "qscriptfunction_p.h" - -Q_DECLARE_METATYPE(QScriptContext*) +// ### Q_DECLARE_METATYPE(QScriptContext*) Q_DECLARE_METATYPE(QScriptValueList) QT_BEGIN_NAMESPACE @@ -149,292 +105,27 @@ QT_BEGIN_NAMESPACE \sa queryProperty() */ -class QScriptCustomClassData : public QScriptClassData +class QScriptClassPrivate { + Q_DECLARE_PUBLIC(QScriptClass) public: - QScriptCustomClassData(QScriptClass *klass); - ~QScriptCustomClassData(); - - virtual void mark(const QScriptValueImpl &object, int generation); - virtual bool resolve(const QScriptValueImpl &object, QScriptNameIdImpl *nameId, - QScript::Member *member, QScriptValueImpl *base, - QScript::AccessMode access); - virtual bool get(const QScriptValueImpl &obj, const QScript::Member &m, - QScriptValueImpl *result); - virtual bool put(QScriptValueImpl *object, const QScript::Member &member, - const QScriptValueImpl &value); - virtual bool removeMember(const QScriptValueImpl &object, - const QScript::Member &member); - virtual bool implementsHasInstance(const QScriptValueImpl &object); - virtual bool hasInstance(const QScriptValueImpl &object, - const QScriptValueImpl &value); - virtual QScriptClassDataIterator *newIterator(const QScriptValueImpl &object); - - QScriptClass *scriptClass() const; - -private: - QScriptClass *m_class; -}; + QScriptClassPrivate() {} + virtual ~QScriptClassPrivate() {} -class QScriptCustomClassDataIterator : public QScriptClassDataIterator -{ -public: - QScriptCustomClassDataIterator(const QScriptValueImpl &object, - QScriptClass *klass); - virtual ~QScriptCustomClassDataIterator(); + QScriptEngine *engine; - virtual bool hasNext() const; - virtual void next(QScript::Member *member); - - virtual bool hasPrevious() const; - virtual void previous(QScript::Member *member); - - virtual void toFront(); - virtual void toBack(); - -private: - void iteratorToMember(QScript::Member *member); - - QScriptClassPropertyIterator *m_it; + QScriptClass *q_ptr; }; -QScriptCustomClassData::QScriptCustomClassData(QScriptClass *klass) - : m_class(klass) -{ -} - -QScriptCustomClassData::~QScriptCustomClassData() -{ -} - -void QScriptCustomClassData::mark(const QScriptValueImpl &, int) -{ -} - -bool QScriptCustomClassData::resolve(const QScriptValueImpl &object, QScriptNameIdImpl *nameId, - QScript::Member *member, QScriptValueImpl *base, - QScript::AccessMode access) -{ - uint id = 0; - QScriptClass::QueryFlags queryIn = 0; - if (access & QScript::Read) - queryIn |= QScriptClass::HandlesReadAccess; - if (access & QScript::Write) - queryIn |= QScriptClass::HandlesWriteAccess; - QScriptEnginePrivate *eng = object.engine(); - QScriptString str = eng->internedString(nameId); - QScriptClass::QueryFlags queryOut; - queryOut = m_class->queryProperty(eng->toPublic(object), str, queryIn, &id); - if (queryOut & queryIn) { - if (base) - *base = object; - QScriptValue::PropertyFlags flags = m_class->propertyFlags(eng->toPublic(object), str, id); - member->native(nameId, id, flags); - return true; - } - return false; -} - -bool QScriptCustomClassData::get(const QScriptValueImpl &object, const QScript::Member &member, - QScriptValueImpl *result) -{ - QScriptEnginePrivate *eng = object.engine(); - QScriptString str = eng->internedString(member.nameId()); - *result = eng->toImpl(m_class->property(eng->toPublic(object), str, member.id())); - if (!result->isValid()) - *result = eng->undefinedValue(); - return true; -} - -bool QScriptCustomClassData::put(QScriptValueImpl *object, const QScript::Member &member, - const QScriptValueImpl &value) -{ - QScriptEnginePrivate *eng = object->engine(); - QScriptString str = eng->internedString(member.nameId()); - QScriptValue publicObject = eng->toPublic(*object); - m_class->setProperty(publicObject, str, member.id(), eng->toPublic(value)); - return true; -} - -bool QScriptCustomClassData::removeMember(const QScriptValueImpl &object, - const QScript::Member &member) -{ - QScriptEnginePrivate *eng = object.engine(); - QScriptString str = eng->internedString(member.nameId()); - QScriptValue publicObject = eng->toPublic(object); - m_class->setProperty(publicObject, str, member.id(), QScriptValue()); - return true; -} - -bool QScriptCustomClassData::implementsHasInstance(const QScriptValueImpl &object) -{ - if (object.classInfo() != QScriptClassPrivate::get(m_class)->classInfo()) - return false; - return m_class->supportsExtension(QScriptClass::HasInstance); -} - -bool QScriptCustomClassData::hasInstance(const QScriptValueImpl &object, - const QScriptValueImpl &value) -{ - QScriptEnginePrivate *eng = object.engine(); - QScriptValueList arguments; - arguments << eng->toPublic(object) << eng->toPublic(value); - QVariant ret = m_class->extension(QScriptClass::HasInstance, qVariantFromValue(arguments)); - return ret.toBool(); -} - -QScriptClassDataIterator *QScriptCustomClassData::newIterator(const QScriptValueImpl &object) -{ - return new QScriptCustomClassDataIterator(object, m_class); -} - -QScriptClass *QScriptCustomClassData::scriptClass() const -{ - return m_class; -} - - - -QScriptCustomClassDataIterator::QScriptCustomClassDataIterator(const QScriptValueImpl &object, - QScriptClass *klass) -{ - QScriptEnginePrivate *eng = object.engine(); - m_it = klass->newIterator(eng->toPublic(object)); -} - -QScriptCustomClassDataIterator::~QScriptCustomClassDataIterator() -{ - if (m_it) { - delete m_it; - m_it = 0; - } -} - -bool QScriptCustomClassDataIterator::hasNext() const -{ - return m_it && m_it->hasNext(); -} - -void QScriptCustomClassDataIterator::next(QScript::Member *member) -{ - if (m_it) { - m_it->next(); - iteratorToMember(member); - } -} - -bool QScriptCustomClassDataIterator::hasPrevious() const -{ - return m_it && m_it->hasPrevious(); -} - -void QScriptCustomClassDataIterator::previous(QScript::Member *member) -{ - if (m_it) { - m_it->previous(); - iteratorToMember(member); - } -} - -void QScriptCustomClassDataIterator::toFront() -{ - if (m_it) - m_it->toFront(); -} - -void QScriptCustomClassDataIterator::toBack() -{ - if (m_it) - m_it->toBack(); -} - -void QScriptCustomClassDataIterator::iteratorToMember(QScript::Member *member) -{ - QScriptString str = m_it->name(); - QScriptNameIdImpl *nameId = 0; - if (str.isValid()) - nameId = QScriptStringPrivate::get(str)->nameId; - member->native(nameId, m_it->id(), m_it->flags()); -} - - - -QScriptClassPrivate::QScriptClassPrivate(QScriptClass *q) - : engine(0), m_classInfo(0), q_ptr(q) -{ -} - -QScriptClassPrivate::~QScriptClassPrivate() -{ - if (m_classInfo) { - // classInfo is owned by engine - // set the data to the normal Object class data - delete m_classInfo->data(); - QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine); - m_classInfo->setData(eng_p->m_class_object->data()); - } -} - -QScriptClassPrivate *QScriptClassPrivate::get(QScriptClass *klass) -{ - return klass->d_func(); -} - -QScriptClassInfo *QScriptClassPrivate::classInfo() -{ - Q_Q(QScriptClass); - if (m_classInfo) - return m_classInfo; - QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine); - int classType = eng_p->registerCustomClassType(); - if (q->supportsExtension(QScriptClass::Callable)) - classType |= QScriptClassInfo::FunctionBased; - QString name = q->name(); - if (name.isEmpty()) - name = QLatin1String("Object"); - m_classInfo = eng_p->registerClass(name, classType); - m_classInfo->setData(new QScriptCustomClassData(q_func())); - return m_classInfo; -} - -QScriptClass *QScriptClassPrivate::classFromInfo(QScriptClassInfo *info) -{ - QScriptCustomClassData *data = static_cast<QScriptCustomClassData*>(info->data()); - Q_ASSERT(data != 0); - return data->scriptClass(); -} - -static QScriptValueImpl callScriptClassFunction(QScriptContextPrivate *ctx, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo) -{ - qMetaTypeId<QScriptContext*>(); - if (QScriptClassData *data = classInfo->data()) { - QScriptCustomClassData *customData = static_cast<QScriptCustomClassData*>(data); - QScriptClass *klass = customData->scriptClass(); - QVariant arg = qVariantFromValue(QScriptContextPrivate::get(ctx)); - QVariant ret = klass->extension(QScriptClass::Callable, arg); - QScriptValueImpl val = eng->valueFromVariant(ret); - if (val.isValid()) - return val; - } - return eng->undefinedValue(); -} - -QScriptFunction *QScriptClassPrivate::newFunction() -{ - return new QScript::C2Function(callScriptClassFunction, /*length=*/0, - classInfo(), /*name=*/QString()); -} - /*! Constructs a QScriptClass object to be used in the given \a engine. The engine does not take ownership of the QScriptClass object. */ QScriptClass::QScriptClass(QScriptEngine *engine) - : d_ptr(new QScriptClassPrivate(this)) + : d_ptr(new QScriptClassPrivate) { + d_ptr->q_ptr = this; d_ptr->engine = engine; } diff --git a/src/script/qscriptclass.h b/src/script/api/qscriptclass.h index 9c06ea2..5999500 100644 --- a/src/script/qscriptclass.h +++ b/src/script/api/qscriptclass.h @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ diff --git a/src/script/qscriptclasspropertyiterator.cpp b/src/script/api/qscriptclasspropertyiterator.cpp index 96f34d5..a0ce34d 100644 --- a/src/script/qscriptclasspropertyiterator.cpp +++ b/src/script/api/qscriptclasspropertyiterator.cpp @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ @@ -43,7 +13,6 @@ #ifndef QT_NO_SCRIPT -#include "qscriptclasspropertyiterator_p.h" #include "qscriptstring.h" QT_BEGIN_NAMESPACE @@ -74,14 +43,17 @@ QT_BEGIN_NAMESPACE \sa QScriptClass::newIterator(), QScriptValueIterator */ -QScriptClassPropertyIteratorPrivate::QScriptClassPropertyIteratorPrivate(QScriptClassPropertyIterator *q) - : q_ptr(q) +class QScriptClassPropertyIteratorPrivate { -} + Q_DECLARE_PUBLIC(QScriptClassPropertyIterator) +public: + QScriptClassPropertyIteratorPrivate() {} + virtual ~QScriptClassPropertyIteratorPrivate() {} -QScriptClassPropertyIteratorPrivate::~QScriptClassPropertyIteratorPrivate() -{ -} + QScriptValue object; + + QScriptClassPropertyIterator *q_ptr; +}; /*! Constructs an iterator for traversing \a object. @@ -90,8 +62,9 @@ QScriptClassPropertyIteratorPrivate::~QScriptClassPropertyIteratorPrivate() sequence of properties (before the first property). */ QScriptClassPropertyIterator::QScriptClassPropertyIterator(const QScriptValue &object) - : d_ptr(new QScriptClassPropertyIteratorPrivate(this)) + : d_ptr(new QScriptClassPropertyIteratorPrivate) { + d_ptr->q_ptr = this; d_ptr->object = object; } diff --git a/src/script/api/qscriptclasspropertyiterator.h b/src/script/api/qscriptclasspropertyiterator.h new file mode 100644 index 0000000..a7d2e45 --- /dev/null +++ b/src/script/api/qscriptclasspropertyiterator.h @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +****************************************************************************/ + +#ifndef QSCRIPTCLASSPROPERTYITERATOR_H +#define QSCRIPTCLASSPROPERTYITERATOR_H + +#include <QtCore/qstring.h> + +#ifndef QT_NO_SCRIPT + +#include <QtScript/qscriptvalue.h> + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(Script) + +class QScriptClassPropertyIteratorPrivate; +class Q_SCRIPT_EXPORT QScriptClassPropertyIterator +{ +protected: + QScriptClassPropertyIterator(const QScriptValue &object); + +public: + virtual ~QScriptClassPropertyIterator(); + + QScriptValue object() const; + + virtual bool hasNext() const = 0; + virtual void next() = 0; + + virtual bool hasPrevious() const = 0; + virtual void previous() = 0; + + virtual void toFront() = 0; + virtual void toBack() = 0; + + virtual QScriptString name() const = 0; + virtual uint id() const; + virtual QScriptValue::PropertyFlags flags() const; + +protected: + QScriptClassPropertyIterator(const QScriptValue &object, QScriptClassPropertyIteratorPrivate &dd); + QScriptClassPropertyIteratorPrivate *d_ptr; + +private: + Q_DECLARE_PRIVATE(QScriptClassPropertyIterator) + Q_DISABLE_COPY(QScriptClassPropertyIterator) +}; + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif // QT_NO_SCRIPT + +#endif diff --git a/src/script/qscriptcontext.cpp b/src/script/api/qscriptcontext.cpp index ff519c7..ccfe6ec 100644 --- a/src/script/qscriptcontext.cpp +++ b/src/script/api/qscriptcontext.cpp @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ @@ -43,12 +13,15 @@ #ifndef QT_NO_SCRIPT -#include "qscriptcontextinfo.h" -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" #include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" +#include "qscriptengine.h" +#include "qscriptengine_p.h" + +#include "Error.h" +#include "JSObject.h" +#include "JSGlobalObject.h" + +#include <QtCore/qstringlist.h> QT_BEGIN_NAMESPACE @@ -154,6 +127,40 @@ QT_BEGIN_NAMESPACE \value UnknownError An unknown error. */ +namespace QScript +{ +JSC::UString qtStringToJSCUString(const QString &); +} + +QScriptContextPrivate::QScriptContextPrivate(JSC::JSObject *callee_, + JSC::JSValue thisObject_, + const JSC::ArgList &args_, + bool calledAsConstructor_, + QScriptEnginePrivate *engine_) + : callee(callee_), thisObject(thisObject_), args(args_), + calledAsConstructor(calledAsConstructor_), engine(engine_) +{ +} + +QScriptContextPrivate::~QScriptContextPrivate() +{ +} + +QScriptContext *QScriptContextPrivate::create(QScriptContextPrivate &dd) +{ + QScriptContext *q = new QScriptContext(); + q->d_ptr = ⅆ + return q; +} + +/*! + \internal +*/ +QScriptContext::QScriptContext() + : d_ptr(0) +{ +} + /*! Throws an exception with the given \a value. Returns the value thrown (the same as the argument). @@ -163,11 +170,9 @@ QT_BEGIN_NAMESPACE QScriptValue QScriptContext::throwValue(const QScriptValue &value) { Q_D(QScriptContext); - d->m_result = d->engine()->toImpl(value); - d->m_state = QScriptContext::ExceptionState; -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - d->engine()->notifyException(d); -#endif + JSC::ExecState *exec = d->engine->globalObject->globalExec(); + JSC::JSValue jscValue = d->engine->scriptValueToJSCValue(value); + exec->setException(jscValue); return value; } @@ -188,7 +193,29 @@ QScriptValue QScriptContext::throwValue(const QScriptValue &value) QScriptValue QScriptContext::throwError(Error error, const QString &text) { Q_D(QScriptContext); - return d->engine()->toPublic(d->throwError(error, text)); + JSC::ErrorType jscError = JSC::GeneralError; + switch (error) { + case UnknownError: + break; + case ReferenceError: + jscError = JSC::ReferenceError; + break; + case SyntaxError: + jscError = JSC::SyntaxError; + break; + case TypeError: + jscError = JSC::TypeError; + break; + case RangeError: + jscError = JSC::RangeError; + break; + case URIError: + jscError = JSC::URIError; + break; + } + JSC::ExecState *exec = d->engine->globalObject->globalExec(); + JSC::JSObject *result = JSC::throwError(exec, jscError, QScript::qtStringToJSCUString(text)); + return d->engine->scriptValueFromJSCValue(result); } /*! @@ -202,16 +229,9 @@ QScriptValue QScriptContext::throwError(Error error, const QString &text) QScriptValue QScriptContext::throwError(const QString &text) { Q_D(QScriptContext); - return d->engine()->toPublic(d->throwError(text)); -} - -/*! - \internal -*/ -QScriptContext::QScriptContext(): - d_ptr(new QScriptContextPrivate()) -{ - d_ptr->q_ptr = this; + JSC::ExecState *exec = d->engine->globalObject->globalExec(); + JSC::JSObject *result = JSC::throwError(exec, JSC::GeneralError, QScript::qtStringToJSCUString(text)); + return d->engine->scriptValueFromJSCValue(result); } /*! @@ -219,7 +239,7 @@ QScriptContext::QScriptContext(): */ QScriptContext::~QScriptContext() { - delete d_ptr; + // d_ptr is stack-allocated d_ptr = 0; } @@ -229,7 +249,7 @@ QScriptContext::~QScriptContext() QScriptEngine *QScriptContext::engine() const { Q_D(const QScriptContext); - return QScriptEnginePrivate::get(d->engine()); + return QScriptEnginePrivate::get(d->engine); } /*! @@ -243,9 +263,9 @@ QScriptEngine *QScriptContext::engine() const QScriptValue QScriptContext::argument(int index) const { Q_D(const QScriptContext); - if (index < 0) - return QScriptValue(); - return d->engine()->toPublic(d->argument(index)); + if ((index < 0) || (index >= (int)d->args.size())) + return QScriptValue(QScriptValue::UndefinedValue); + return d->engine->scriptValueFromJSCValue(d->args.at(index)); } /*! @@ -255,7 +275,7 @@ QScriptValue QScriptContext::argument(int index) const QScriptValue QScriptContext::callee() const { Q_D(const QScriptContext); - return d->engine()->toPublic(d->m_callee); + return d->engine->scriptValueFromJSCValue(d->callee); } /*! @@ -275,8 +295,11 @@ QScriptValue QScriptContext::callee() const */ QScriptValue QScriptContext::argumentsObject() const { - Q_D(const QScriptContext); - return d->engine()->toPublic(d->argumentsObject()); + // ### for now we cheat extremely + QScriptValue array = engine()->newArray(argumentCount()); + for (int i = 0; i < argumentCount(); ++i) + array.setProperty(i, argument(i)); + return array; } /*! @@ -289,7 +312,7 @@ QScriptValue QScriptContext::argumentsObject() const bool QScriptContext::isCalledAsConstructor() const { Q_D(const QScriptContext); - return d->m_calledAsConstructor; + return d->calledAsConstructor; } /*! @@ -297,8 +320,8 @@ bool QScriptContext::isCalledAsConstructor() const */ QScriptContext *QScriptContext::parentContext() const { - Q_D(const QScriptContext); - return QScriptContextPrivate::get(d->previous); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return 0; } /*! @@ -314,7 +337,7 @@ QScriptContext *QScriptContext::parentContext() const int QScriptContext::argumentCount() const { Q_D(const QScriptContext); - return d->argc; + return d->args.size(); } /*! @@ -322,8 +345,8 @@ int QScriptContext::argumentCount() const */ QScriptValue QScriptContext::returnValue() const { - Q_D(const QScriptContext); - return d->engine()->toPublic(d->m_result); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return QScriptValue(); } /*! @@ -331,8 +354,8 @@ QScriptValue QScriptContext::returnValue() const */ void QScriptContext::setReturnValue(const QScriptValue &result) { - Q_D(QScriptContext); - d->m_result = d->engine()->toImpl(result); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + Q_UNUSED(result); } /*! @@ -344,8 +367,8 @@ void QScriptContext::setReturnValue(const QScriptValue &result) */ QScriptValue QScriptContext::activationObject() const { - Q_D(const QScriptContext); - return d->engine()->toPublic(d->activationObject()); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return QScriptValue(); } /*! @@ -356,16 +379,8 @@ QScriptValue QScriptContext::activationObject() const */ void QScriptContext::setActivationObject(const QScriptValue &activation) { - Q_D(QScriptContext); - if (!activation.isObject()) { - return; - } else if (activation.engine() != engine()) { - qWarning("QScriptContext::setActivationObject() failed: " - "cannot set an object created in " - "a different engine"); - } else { - d->m_activation = d->engine()->toImpl(activation); - } + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + Q_UNUSED(activation); } /*! @@ -374,7 +389,7 @@ void QScriptContext::setActivationObject(const QScriptValue &activation) QScriptValue QScriptContext::thisObject() const { Q_D(const QScriptContext); - return d->engine()->toPublic(d->m_thisObject); + return d->engine->scriptValueFromJSCValue(d->thisObject); } /*! @@ -386,14 +401,9 @@ QScriptValue QScriptContext::thisObject() const void QScriptContext::setThisObject(const QScriptValue &thisObject) { Q_D(QScriptContext); - if (!thisObject.isObject()) { - } else if (thisObject.engine() != engine()) { - qWarning("QScriptContext::setThisObject() failed: " - "cannot set an object created in " - "a different engine"); - } else { - d->m_thisObject = d->engine()->toImpl(thisObject); - } + if (!thisObject.isObject()) + return; + d->thisObject = d->engine->scriptValueToJSCValue(thisObject); } /*! @@ -402,7 +412,9 @@ void QScriptContext::setThisObject(const QScriptValue &thisObject) QScriptContext::ExecutionState QScriptContext::state() const { Q_D(const QScriptContext); - return d->m_state; + if (d->engine->globalObject->globalExec()->hadException()) + return QScriptContext::ExceptionState; + return QScriptContext::NormalState; } /*! @@ -418,16 +430,8 @@ QScriptContext::ExecutionState QScriptContext::state() const */ QStringList QScriptContext::backtrace() const { - Q_D(const QScriptContext); - return d->backtrace(); -} - -static QString safeValueToString(const QScriptValue &value) -{ - if (value.isObject()) - return QLatin1String("[object Object]"); - else - return value.toString(); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return QStringList(); } /*! @@ -440,46 +444,9 @@ static QString safeValueToString(const QScriptValue &value) */ QString QScriptContext::toString() const { - QScriptContextInfo info(this); - QString result; - - QString functionName = info.functionName(); - if (functionName.isEmpty()) { - if (parentContext()) { - if (info.functionType() == QScriptContextInfo::ScriptFunction) - result.append(QLatin1String("<anonymous>")); - else - result.append(QLatin1String("<native>")); - } else { - result.append(QLatin1String("<global>")); - } - } else { - result.append(functionName); - } - QStringList parameterNames = info.functionParameterNames(); - result.append(QLatin1String(" (")); - for (int i = 0; i < argumentCount(); ++i) { - if (i > 0) - result.append(QLatin1String(", ")); - if (i < parameterNames.count()) { - result.append(parameterNames.at(i)); - result.append(QLatin1Char('=')); - } - QScriptValue arg = argument(i); - result.append(safeValueToString(arg)); - } - result.append(QLatin1Char(')')); - - QString fileName = info.fileName(); - int lineNumber = info.lineNumber(); - result.append(QLatin1String(" at ")); - if (!fileName.isEmpty()) { - result.append(fileName); - result.append(QLatin1Char(':')); - } - result.append(QString::number(lineNumber)); - return result; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return QString(); } /*! @@ -490,24 +457,8 @@ QString QScriptContext::toString() const */ QScriptValueList QScriptContext::scopeChain() const { - Q_D(const QScriptContext); - // make sure arguments properties are initialized - const QScriptContextPrivate *ctx = d; - while (ctx) { - (void)ctx->activationObject(); - ctx = ctx->previous; - } - QScriptValueList result; - QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine()); - QScriptValueImpl scope = d->m_scopeChain; - while (scope.isObject()) { - if (scope.classInfo() == eng_p->m_class_with) - result.append(eng_p->toPublic(scope.prototype())); - else - result.append(eng_p->toPublic(scope)); - scope = scope.scope(); - } - return result; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return QScriptValueList(); } /*! @@ -520,25 +471,8 @@ QScriptValueList QScriptContext::scopeChain() const */ void QScriptContext::pushScope(const QScriptValue &object) { - Q_D(QScriptContext); - if (!object.isObject()) { - return; - } else if (object.engine() != engine()) { - qWarning("QScriptContext::pushScope() failed: " - "cannot push an object created in " - "a different engine"); - return; - } - QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine()); - if (!d->m_scopeChain.isValid()) { - d->m_scopeChain = eng_p->toImpl(object); - } else { - QScriptValueImpl withObject; - eng_p->newObject(&withObject, eng_p->toImpl(object), eng_p->m_class_with); - withObject.m_object_value->m_scope = d->m_scopeChain; - withObject.setInternalValue(1); // to differentiate from with-statement objects - d->m_scopeChain = withObject; - } + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + Q_UNUSED(object); } /*! @@ -553,17 +487,8 @@ void QScriptContext::pushScope(const QScriptValue &object) */ QScriptValue QScriptContext::popScope() { - Q_D(QScriptContext); - if (!d->m_scopeChain.isObject()) - return QScriptValue(); - QScriptValueImpl result; - QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine()); - if (d->m_scopeChain.classInfo() != eng_p->m_class_with) - result = d->m_scopeChain; - else - result = d->m_scopeChain.prototype(); - d->m_scopeChain = d->m_scopeChain.m_object_value->m_scope; - return eng_p->toPublic(result); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return QScriptValue(); } QT_END_NAMESPACE diff --git a/src/script/qscriptcontext.h b/src/script/api/qscriptcontext.h index 1e1f987..4941d40 100644 --- a/src/script/qscriptcontext.h +++ b/src/script/api/qscriptcontext.h @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ diff --git a/src/script/api/qscriptcontext_p.h b/src/script/api/qscriptcontext_p.h new file mode 100644 index 0000000..5041845 --- /dev/null +++ b/src/script/api/qscriptcontext_p.h @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +****************************************************************************/ + +#ifndef QSCRIPTCONTEXT_P_H +#define QSCRIPTCONTEXT_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 <QtCore/qobjectdefs.h> + +#ifndef QT_NO_SCRIPT + +QT_BEGIN_NAMESPACE + +namespace JSC +{ + class JSObject; + class ArgList; +} + +#include "wtf/Platform.h" +#include "JSValue.h" + +class QScriptEnginePrivate; + +class QScriptContext; +class QScriptContextPrivate +{ +public: + QScriptContextPrivate(JSC::JSObject *callee, + JSC::JSValue thisObject, + const JSC::ArgList &args, + bool calledAsConstructor, + QScriptEnginePrivate *engine); + ~QScriptContextPrivate(); + + static QScriptContext *create(QScriptContextPrivate &dd); + + JSC::JSObject *callee; + JSC::JSValue thisObject; + const JSC::ArgList &args; + bool calledAsConstructor; + QScriptEnginePrivate *engine; +}; + +QT_END_NAMESPACE + +#endif // QT_NO_SCRIPT + +#endif diff --git a/src/script/qscriptcontextinfo.cpp b/src/script/api/qscriptcontextinfo.cpp index 260d19f..e6a7ed8 100644 --- a/src/script/qscriptcontextinfo.cpp +++ b/src/script/api/qscriptcontextinfo.cpp @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ @@ -43,12 +13,6 @@ #ifndef QT_NO_SCRIPT -#include "qscriptcontextinfo_p.h" -#include "qscriptengine_p.h" -#include "qscriptcontext_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" #include <QtCore/qdatastream.h> QT_BEGIN_NAMESPACE @@ -97,95 +61,36 @@ QT_BEGIN_NAMESPACE \value NativeFunction The function is a built-in Qt Script function, or it was defined through a call to QScriptEngine::newFunction(). */ +class QScriptContextInfoPrivate +{ + Q_DECLARE_PUBLIC(QScriptContextInfo) +public: + QScriptContextInfoPrivate(); + QScriptContextInfoPrivate(const QScriptContext *context); + ~QScriptContextInfoPrivate(); + + QBasicAtomicInt ref; + + QScriptContextInfo *q_ptr; +}; + /*! \internal */ QScriptContextInfoPrivate::QScriptContextInfoPrivate() - : q_ptr(0) { ref = 0; - functionType = QScriptContextInfo::NativeFunction; - functionMetaIndex = -1; - functionStartLineNumber = -1; - functionEndLineNumber = -1; - scriptId = -1; - lineNumber = -1; - columnNumber = -1; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); } /*! \internal */ QScriptContextInfoPrivate::QScriptContextInfoPrivate(const QScriptContext *context) - : q_ptr(0) { Q_ASSERT(context); ref = 0; - functionType = QScriptContextInfo::NativeFunction; - functionMetaIndex = -1; - functionStartLineNumber = -1; - functionEndLineNumber = -1; - - const QScriptContextPrivate *ctx_p = QScriptContextPrivate::get(context); -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - scriptId = ctx_p->scriptId(); -#endif - fileName = ctx_p->fileName(); - lineNumber = ctx_p->currentLine; - columnNumber = ctx_p->currentColumn; - - QScriptValueImpl callee = ctx_p->engine()->toImpl(context->callee()); - QScriptFunction *fun = callee.toFunction(); - if (fun) { - functionName = fun->functionName(); - functionStartLineNumber = fun->startLineNumber(); - functionEndLineNumber = fun->endLineNumber(); - - switch (fun->type()) { - case QScriptFunction::Unknown: - functionType = QScriptContextInfo::NativeFunction; - break; - - case QScriptFunction::Script: - functionType = QScriptContextInfo::ScriptFunction; - for (int i = 0; i < fun->formals.count(); ++i) - parameterNames.append(fun->formals.at(i)->s); - break; - - case QScriptFunction::C: - functionType = QScriptContextInfo::NativeFunction; - break; - - case QScriptFunction::C2: - functionType = QScriptContextInfo::NativeFunction; - break; - - case QScriptFunction::C3: - functionType = QScriptContextInfo::NativeFunction; - break; - - case QScriptFunction::Qt: { - functionType = QScriptContextInfo::QtFunction; - functionMetaIndex = ctx_p->calleeMetaIndex; - -#ifndef QT_NO_QOBJECT - const QMetaObject *meta; - meta = static_cast<QScript::QtFunction*>(fun)->metaObject(); - if (meta) { - QMetaMethod method = meta->method(functionMetaIndex); - QList<QByteArray> formals = method.parameterNames(); - for (int i = 0; i < formals.count(); ++i) - parameterNames.append(QLatin1String(formals.at(i))); - } -#endif - } break; - - case QScriptFunction::QtProperty: - functionType = QScriptContextInfo::QtPropertyFunction; - functionMetaIndex = ctx_p->calleeMetaIndex; - break; - } - } + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); } /*! @@ -272,10 +177,8 @@ QScriptContextInfo &QScriptContextInfo::operator=(const QScriptContextInfo &othe */ qint64 QScriptContextInfo::scriptId() const { - Q_D(const QScriptContextInfo); - if (!d) - return -1; - return d->scriptId; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return -1; } /*! @@ -289,10 +192,8 @@ qint64 QScriptContextInfo::scriptId() const */ QString QScriptContextInfo::fileName() const { - Q_D(const QScriptContextInfo); - if (!d) - return QString(); - return d->fileName; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return QString(); } /*! @@ -306,10 +207,8 @@ QString QScriptContextInfo::fileName() const */ int QScriptContextInfo::lineNumber() const { - Q_D(const QScriptContextInfo); - if (!d) - return -1; - return d->lineNumber; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return -1; } /*! @@ -323,10 +222,8 @@ int QScriptContextInfo::lineNumber() const */ int QScriptContextInfo::columnNumber() const { - Q_D(const QScriptContextInfo); - if (!d) - return -1; - return d->columnNumber; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return -1; } /*! @@ -342,10 +239,7 @@ int QScriptContextInfo::columnNumber() const */ QString QScriptContextInfo::functionName() const { - Q_D(const QScriptContextInfo); - if (!d) - return QString(); - return d->functionName; + return QString(); } /*! @@ -355,10 +249,8 @@ QString QScriptContextInfo::functionName() const */ QScriptContextInfo::FunctionType QScriptContextInfo::functionType() const { - Q_D(const QScriptContextInfo); - if (!d) - return NativeFunction; - return d->functionType; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return ScriptFunction; } /*! @@ -372,10 +264,8 @@ QScriptContextInfo::FunctionType QScriptContextInfo::functionType() const */ int QScriptContextInfo::functionStartLineNumber() const { - Q_D(const QScriptContextInfo); - if (!d) - return -1; - return d->functionStartLineNumber; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return -1; } /*! @@ -389,10 +279,8 @@ int QScriptContextInfo::functionStartLineNumber() const */ int QScriptContextInfo::functionEndLineNumber() const { - Q_D(const QScriptContextInfo); - if (!d) - return -1; - return d->functionEndLineNumber; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return -1; } /*! @@ -403,10 +291,8 @@ int QScriptContextInfo::functionEndLineNumber() const */ QStringList QScriptContextInfo::functionParameterNames() const { - Q_D(const QScriptContextInfo); - if (!d) - return QStringList(); - return d->parameterNames; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return QStringList(); } /*! @@ -424,10 +310,8 @@ QStringList QScriptContextInfo::functionParameterNames() const */ int QScriptContextInfo::functionMetaIndex() const { - Q_D(const QScriptContextInfo); - if (!d) - return -1; - return d->functionMetaIndex; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return -1; } /*! @@ -436,8 +320,8 @@ int QScriptContextInfo::functionMetaIndex() const */ bool QScriptContextInfo::isNull() const { - Q_D(const QScriptContextInfo); - return (d == 0); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return false; } /*! @@ -452,16 +336,8 @@ bool QScriptContextInfo::operator==(const QScriptContextInfo &other) const return true; if (!d || !od) return false; - return ((d->scriptId == od->scriptId) - && (d->lineNumber == od->lineNumber) - && (d->columnNumber == od->columnNumber) - && (d->fileName == od->fileName) - && (d->functionName == od->functionName) - && (d->functionType == od->functionType) - && (d->functionStartLineNumber == od->functionStartLineNumber) - && (d->functionEndLineNumber == od->functionEndLineNumber) - && (d->functionMetaIndex == od->functionMetaIndex) - && (d->parameterNames == od->parameterNames)); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return false; } /*! @@ -514,36 +390,7 @@ Q_SCRIPT_EXPORT QDataStream &operator>>(QDataStream &in, QScriptContextInfo &inf info.d_ptr->ref.ref(); } - in >> info.d_ptr->scriptId; - - qint32 line; - in >> line; - info.d_ptr->lineNumber = line; - - qint32 column; - in >> column; - info.d_ptr->columnNumber = column; - - quint32 ftype; - in >> ftype; - info.d_ptr->functionType = QScriptContextInfo::FunctionType(ftype); - - qint32 startLine; - in >> startLine; - info.d_ptr->functionStartLineNumber = startLine; - - qint32 endLine; - in >> endLine; - info.d_ptr->functionEndLineNumber = endLine; - - qint32 metaIndex; - in >> metaIndex; - info.d_ptr->functionMetaIndex = metaIndex; - - in >> info.d_ptr->fileName; - in >> info.d_ptr->functionName; - in >> info.d_ptr->parameterNames; - + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); return in; } #endif diff --git a/src/script/qscriptcontextinfo.h b/src/script/api/qscriptcontextinfo.h index a683733..19323bb 100644 --- a/src/script/qscriptcontextinfo.h +++ b/src/script/api/qscriptcontextinfo.h @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ diff --git a/src/script/qscriptengine.cpp b/src/script/api/qscriptengine.cpp index 97021fc..873091b 100644 --- a/src/script/qscriptengine.cpp +++ b/src/script/api/qscriptengine.cpp @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ @@ -44,11 +14,37 @@ #ifndef QT_NO_SCRIPT #include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" -#include "qscriptsyntaxcheckresult_p.h" +#include "../bridge/qscriptqobject_p.h" +#include "qscriptstring_p.h" +#include "qscriptvalue_p.h" +#include "qscriptvalueiterator.h" + +#include <QtCore/qstringlist.h> + +#include "Error.h" +#include "JSArray.h" +#include "JSImmediate.h" +#include "JSLock.h" +#include "Interpreter.h" +#include "DateConstructor.h" +#include "RegExpConstructor.h" +#include "Completion.h" +#include "PrototypeFunction.h" +#include "InitializeThreading.h" +#include "ObjectPrototype.h" +#include "SourceCode.h" + +#include "utils/qscriptdate_p.h" +#include "bridge/qscriptfunction_p.h" +#include "bridge/qscriptvariant_p.h" +#include "bridge/qscriptqobject_p.h" + +Q_DECLARE_METATYPE(QScriptValue) +Q_DECLARE_METATYPE(QVariant) +#ifndef QT_NO_QOBJECT +Q_DECLARE_METATYPE(QObjectList) +#endif +Q_DECLARE_METATYPE(QList<int>) QT_BEGIN_NAMESPACE @@ -266,13 +262,419 @@ QT_BEGIN_NAMESPACE \value SkipMethodsInEnumeration Don't include methods (signals and slots) when enumerating the object's properties. */ +class QScriptTypeInfo +{ +public: + QScriptTypeInfo() : signature(0, '\0'), marshal(0), demarshal(0) + { } + + QByteArray signature; + QScriptEngine::MarshalFunction marshal; + QScriptEngine::DemarshalFunction demarshal; + QScriptValue prototype; +}; + +namespace JSC { + +static JSValue JSC_HOST_CALL functionPrint(ExecState*, JSObject*, JSValue, const ArgList&); +static JSValue JSC_HOST_CALL functionGC(ExecState*, JSObject*, JSValue, const ArgList&); +static JSValue JSC_HOST_CALL functionVersion(ExecState*, JSObject*, JSValue, const ArgList&); +static JSValue JSC_HOST_CALL functionLoad(ExecState*, JSObject*, JSValue, const ArgList&); + +JSValue functionPrint(ExecState* exec, JSObject*, JSValue, const ArgList& args) +{ + for (unsigned i = 0; i < args.size(); ++i) { + if (i != 0) + putchar(' '); + + printf("%s", args.at(i).toString(exec).UTF8String().c_str()); + } + + putchar('\n'); + fflush(stdout); + return jsUndefined(); +} + +JSValue functionGC(ExecState* exec, JSObject*, JSValue, const ArgList&) +{ + JSLock lock(false); + exec->heap()->collect(); + return jsUndefined(); +} + +JSValue functionVersion(ExecState *exec, JSObject*, JSValue, const ArgList&) +{ + return JSC::JSValue(exec, 1); +} + +static bool fillBufferWithContentsOfFile(const UString& fileName, Vector<char>& buffer) +{ + FILE* f = fopen(fileName.UTF8String().c_str(), "r"); + if (!f) { + fprintf(stderr, "Could not open file: %s\n", fileName.UTF8String().c_str()); + return false; + } + + size_t buffer_size = 0; + size_t buffer_capacity = 1024; + + buffer.resize(buffer_capacity); + + while (!feof(f) && !ferror(f)) { + buffer_size += fread(buffer.data() + buffer_size, 1, buffer_capacity - buffer_size, f); + if (buffer_size == buffer_capacity) { // guarantees space for trailing '\0' + buffer_capacity *= 2; + buffer.resize(buffer_capacity); + } + } + fclose(f); + buffer[buffer_size] = '\0'; + + return true; +} + +JSValue functionLoad(ExecState* exec, JSObject*, JSValue, const ArgList& args) +{ + UString fileName = args.at(0).toString(exec); + Vector<char> script; + if (!fillBufferWithContentsOfFile(fileName, script)) + return throwError(exec, GeneralError, "Could not open file."); + + JSGlobalObject* globalObject = exec->dynamicGlobalObject(); + JSC::evaluate(globalObject->globalExec(), globalObject->globalScopeChain(), makeSource(script.data(), fileName)); + + return jsUndefined(); +} + +} // namespace JSC + +namespace QScript +{ + +JSC::UString qtStringToJSCUString(const QString &str) +{ + return JSC::UString(reinterpret_cast<const UChar*>(str.constData()), str.length()); +} + +QString qtStringFromJSCUString(const JSC::UString &str) +{ + return QString(reinterpret_cast<const QChar*>(str.data()), str.size()); +} + +GlobalObject::GlobalObject(QScriptEnginePrivate *eng) + : JSC::JSGlobalObject(), engine(eng) +{ +} + +GlobalObject::~GlobalObject() +{ +} + +void GlobalObject::mark() +{ + JSC::JSGlobalObject::mark(); + + if (engine->qobjectPrototype) + engine->qobjectPrototype->mark(); + if (engine->variantPrototype) + engine->variantPrototype->mark(); + + { + QHash<JSC::JSValue,QBasicAtomicInt>::const_iterator it; + for (it = engine->keepAliveValues.constBegin(); it != engine->keepAliveValues.constEnd(); ++it) { + Q_ASSERT_X(false, Q_FUNC_INFO, "implement me"); +// it.key().mark(); + } + } + +#ifndef QT_NO_QOBJECT + { + QHash<QObject*, QScript::QObjectData*>::const_iterator it; + for (it = engine->m_qobjectData.constBegin(); it != engine->m_qobjectData.constEnd(); ++it) { + QScript::QObjectData *qdata = it.value(); + qdata->mark(); + } + } +#endif +} + +} // namespace QScript + +namespace JSC +{ +ASSERT_CLASS_FITS_IN_CELL(QScript::GlobalObject); +} + +QScriptEnginePrivate::QScriptEnginePrivate() +{ + JSC::initializeThreading(); // ### hmmm + + JSC::JSGlobalData *data = JSC::JSGlobalData::create().releaseRef(); + globalObject = new (data)QScript::GlobalObject(this); + + JSC::ExecState* exec = globalObject->globalExec(); + + qobjectPrototype = new (exec) QScript::QObjectPrototype(exec, QScript::QObjectPrototype::createStructure(globalObject->objectPrototype()), globalObject->prototypeFunctionStructure()); + qobjectWrapperObjectStructure = QScript::QObjectWrapperObject::createStructure(qobjectPrototype); + variantPrototype = new (exec) QScript::QVariantPrototype(exec, QScript::QVariantPrototype::createStructure(globalObject->objectPrototype()), globalObject->prototypeFunctionStructure()); + variantWrapperObjectStructure = QScript::QVariantWrapperObject::createStructure(variantPrototype); + + globalObject->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, globalObject->prototypeFunctionStructure(), 1, JSC::Identifier(exec, "print"), JSC::functionPrint)); + globalObject->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, globalObject->prototypeFunctionStructure(), 0, JSC::Identifier(exec, "gc"), JSC::functionGC)); + globalObject->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, globalObject->prototypeFunctionStructure(), 0, JSC::Identifier(exec, "version"), JSC::functionVersion)); + globalObject->putDirectFunction(exec, new (exec)JSC::NativeFunctionWrapper(exec, globalObject->prototypeFunctionStructure(), 1, JSC::Identifier(exec, "load"), JSC::functionLoad)); + + agent = 0; + processEventsInterval = -1; +} + +QScriptEnginePrivate::~QScriptEnginePrivate() +{ + qDeleteAll(m_qobjectData); + qDeleteAll(m_typeInfos); +} + +QScriptValue QScriptEnginePrivate::scriptValueFromJSCValue(JSC::JSValue value) +{ + Q_Q(QScriptEngine); + if (!value) + return QScriptValue(); + QScriptValue result; + QScriptValuePrivate::initFromJSCValue(result, q, value); + return result; +} + +JSC::JSValue QScriptEnginePrivate::scriptValueToJSCValue(const QScriptValue &value) +{ + QScriptValuePrivate *vv = QScriptValuePrivate::get(value); + if (!vv) + return JSC::JSValue(); + switch (vv->type) { + case QScriptValuePrivate::JSC: + return vv->jscValue; + case QScriptValuePrivate::Number: + return JSC::jsNumber(globalObject->globalExec(), vv->numberValue); + case QScriptValuePrivate::String: + return JSC::jsString(globalObject->globalExec(), QScript::qtStringToJSCUString(*vv->stringValue)); + } + return JSC::JSValue(); +} + +void QScriptEnginePrivate::releaseJSCValue(JSC::JSValue value) +{ +// ### Q_ASSERT(!JSC::JSImmediate::isImmediate(value)); + Q_ASSERT(keepAliveValues.contains(value)); + if (!keepAliveValues[value].deref()) + keepAliveValues.remove(value); +} + +QScriptValue QScriptEnginePrivate::scriptValueFromVariant(const QVariant &v) +{ + Q_Q(QScriptEngine); + QScriptValue result = q->create(v.userType(), v.data()); + Q_ASSERT(result.isValid()); + return result; +} + +QVariant QScriptEnginePrivate::scriptValueToVariant(const QScriptValue &value, int targetType) +{ + QVariant v(targetType, (void *)0); + if (QScriptEnginePrivate::convert(value, targetType, v.data(), this)) + return v; + if (uint(targetType) == QVariant::LastType) + return value.toVariant(); + if (value.isVariant()) { + v = value.toVariant(); + if (v.canConvert(QVariant::Type(targetType))) { + v.convert(QVariant::Type(targetType)); + return v; + } + QByteArray typeName = v.typeName(); + if (typeName.endsWith('*') + && (QMetaType::type(typeName.left(typeName.size()-1)) == targetType)) { + return QVariant(targetType, *reinterpret_cast<void* *>(v.data())); + } + } + + return QVariant(); +} + +JSC::JSValue QScriptEnginePrivate::jscValueFromVariant(const QVariant &v) +{ + // ### it's inefficient to convert to QScriptValue and then to JSValue + QScriptValue vv = scriptValueFromVariant(v); + QScriptValuePrivate *p = QScriptValuePrivate::get(vv); + switch (p->type) { + case QScriptValuePrivate::JSC: + return p->jscValue; + case QScriptValuePrivate::Number: + return JSC::jsNumber(globalObject->globalExec(), p->numberValue); + case QScriptValuePrivate::String: { + JSC::UString str = QScript::qtStringToJSCUString(*p->stringValue); + return JSC::jsString(globalObject->globalExec(), str); + } + } + return JSC::JSValue(); +} + +QVariant QScriptEnginePrivate::jscValueToVariant(JSC::JSValue value, int targetType) +{ + // ### it's inefficient to convert to QScriptValue and then to QVariant + return scriptValueToVariant(scriptValueFromJSCValue(value), targetType); +} + +QScriptValue QScriptEnginePrivate::arrayFromStringList(const QStringList &lst) +{ + Q_Q(QScriptEngine); + QScriptValue arr = q->newArray(lst.size()); + for (int i = 0; i < lst.size(); ++i) + arr.setProperty(i, QScriptValue(q, lst.at(i))); + return arr; +} + +QStringList QScriptEnginePrivate::stringListFromArray(const QScriptValue &arr) +{ + QStringList lst; + uint len = arr.property(QLatin1String("length")).toUInt32(); + for (uint i = 0; i < len; ++i) + lst.append(arr.property(i).toString()); + return lst; +} + +QScriptValue QScriptEnginePrivate::arrayFromVariantList(const QVariantList &lst) +{ + Q_Q(QScriptEngine); + QScriptValue arr = q->newArray(lst.size()); + for (int i = 0; i < lst.size(); ++i) + arr.setProperty(i, scriptValueFromVariant(lst.at(i))); + return arr; +} + +QVariantList QScriptEnginePrivate::variantListFromArray(const QScriptValue &arr) +{ + QVariantList lst; + uint len = arr.property(QLatin1String("length")).toUInt32(); + for (uint i = 0; i < len; ++i) + lst.append(arr.property(i).toVariant()); + return lst; +} + +QScriptValue QScriptEnginePrivate::objectFromVariantMap(const QVariantMap &vmap) +{ + Q_Q(QScriptEngine); + QScriptValue obj = q->newObject(); + QVariantMap::const_iterator it; + for (it = vmap.constBegin(); it != vmap.constEnd(); ++it) + obj.setProperty(it.key(), scriptValueFromVariant(it.value())); + return obj; +} + +QVariantMap QScriptEnginePrivate::variantMapFromObject(const QScriptValue &obj) +{ + QVariantMap vmap; + QScriptValueIterator it(obj); + while (it.hasNext()) { + it.next(); + vmap.insert(it.name(), it.value().toVariant()); + } + return vmap; +} + +#ifndef QT_NO_QOBJECT + +JSC::JSValue QScriptEnginePrivate::newQObject( + QObject *object, QScriptEngine::ValueOwnership ownership, + const QScriptEngine::QObjectWrapOptions &options) +{ + if (!object) + return JSC::jsNull(); + JSC::ExecState* exec = globalObject->globalExec(); + QScript::QObjectWrapperObject *result = new (exec) QScript::QObjectWrapperObject(object, ownership, options, qobjectWrapperObjectStructure); + return result; +} + +bool QScriptEnginePrivate::convertToNativeQObject(const QScriptValue &value, + const QByteArray &targetType, + void **result) +{ + if (!targetType.endsWith('*')) + return false; + if (QObject *qobject = value.toQObject()) { + int start = targetType.startsWith("const ") ? 6 : 0; + QByteArray className = targetType.mid(start, targetType.size()-start-1); + if (void *instance = qobject->qt_metacast(className)) { + *result = instance; + return true; + } + } + return false; +} + +QScript::QObjectData *QScriptEnginePrivate::qobjectData(QObject *object) +{ + QHash<QObject*, QScript::QObjectData*>::const_iterator it; + it = m_qobjectData.constFind(object); + if (it != m_qobjectData.constEnd()) + return it.value(); + + QScript::QObjectData *data = new QScript::QObjectData(this); + m_qobjectData.insert(object, data); + QObject::connect(object, SIGNAL(destroyed(QObject*)), + q_func(), SLOT(_q_objectDestroyed(QObject *))); + return data; +} + +void QScriptEnginePrivate::_q_objectDestroyed(QObject *object) +{ + QHash<QObject*, QScript::QObjectData*>::iterator it; + it = m_qobjectData.find(object); + Q_ASSERT(it != m_qobjectData.end()); + QScript::QObjectData *data = it.value(); + m_qobjectData.erase(it); + delete data; +} + +void QScriptEnginePrivate::disposeQObject(QObject *object) +{ + // TODO +/* if (isCollecting()) { + // wait until we're done with GC before deleting it + int index = m_qobjectsToBeDeleted.indexOf(object); + if (index == -1) + m_qobjectsToBeDeleted.append(object); + } else*/ { + delete object; + } +} + +void QScriptEnginePrivate::emitSignalHandlerException() +{ + Q_Q(QScriptEngine); + emit q->signalHandlerException(q->uncaughtException()); +} + +#endif + +QScriptEnginePrivate *QScriptEnginePrivate::get(QScriptEngine *q) +{ + if (!q) + return 0; + return q->d_func(); +} + +QScriptEngine *QScriptEnginePrivate::get(QScriptEnginePrivate *d) +{ + if (!d) + return 0; + return d->q_func(); +} + #ifdef QT_NO_QOBJECT QScriptEngine::QScriptEngine() : d_ptr(new QScriptEnginePrivate) { d_ptr->q_ptr = this; - d_ptr->init(); } /*! \internal @@ -281,7 +683,6 @@ QScriptEngine::QScriptEngine(QScriptEnginePrivate &dd) : d_ptr(&dd) { d_ptr->q_ptr = this; - d_ptr->init(); } #else @@ -294,8 +695,6 @@ QScriptEngine::QScriptEngine(QScriptEnginePrivate &dd) QScriptEngine::QScriptEngine() : QObject(*new QScriptEnginePrivate, 0) { - Q_D(QScriptEngine); - d->init(); } /*! @@ -308,8 +707,6 @@ QScriptEngine::QScriptEngine() QScriptEngine::QScriptEngine(QObject *parent) : QObject(*new QScriptEnginePrivate, parent) { - Q_D(QScriptEngine); - d->init(); } /*! \internal @@ -317,8 +714,6 @@ QScriptEngine::QScriptEngine(QObject *parent) QScriptEngine::QScriptEngine(QScriptEnginePrivate &dd, QObject *parent) : QObject(dd, parent) { - Q_D(QScriptEngine); - d->init(); } #endif @@ -327,9 +722,6 @@ QScriptEngine::QScriptEngine(QScriptEnginePrivate &dd, QObject *parent) */ QScriptEngine::~QScriptEngine() { - Q_D(QScriptEngine); - d->m_frameRepository.release(currentContext()); - d->objectAllocator.destruct(); #ifdef QT_NO_QOBJECT delete d_ptr; d_ptr = 0; @@ -349,7 +741,7 @@ QScriptEngine::~QScriptEngine() QScriptValue QScriptEngine::globalObject() const { Q_D(const QScriptEngine); - return const_cast<QScriptEnginePrivate*>(d)->toPublic(d->m_globalObject); + return const_cast<QScriptEnginePrivate*>(d)->scriptValueFromJSCValue(d->globalObject); } /*! @@ -366,24 +758,9 @@ QScriptValue QScriptEngine::globalObject() const */ void QScriptEngine::setGlobalObject(const QScriptValue &object) { - Q_D(QScriptEngine); - if (!object.isObject()) - return; - QScriptValueImpl objectImpl = d->toImpl(object); - - // update properties of the global context - QScriptValueImpl old = d->m_globalObject; - QScriptContextPrivate *ctx = d->currentContext(); - while (ctx->parentContext() != 0) - ctx = ctx->parentContext(); - if (QScriptEnginePrivate::strictlyEquals(ctx->m_thisObject, old)) - ctx->m_thisObject = objectImpl; - if (QScriptEnginePrivate::strictlyEquals(ctx->m_activation, old)) - ctx->m_activation = objectImpl; - if (QScriptEnginePrivate::strictlyEquals(ctx->m_scopeChain, old)) - ctx->m_scopeChain = objectImpl; - - d->m_globalObject = objectImpl; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + // not possible with JSC? + Q_UNUSED(object); } /*! @@ -394,7 +771,7 @@ void QScriptEngine::setGlobalObject(const QScriptValue &object) QScriptValue QScriptEngine::nullValue() { Q_D(QScriptEngine); - return d->toPublic(d->nullValue()); + return d->scriptValueFromJSCValue(JSC::jsNull()); } /*! @@ -405,7 +782,7 @@ QScriptValue QScriptEngine::nullValue() QScriptValue QScriptEngine::undefinedValue() { Q_D(QScriptEngine); - return d->toPublic(d->undefinedValue()); + return d->scriptValueFromJSCValue(JSC::jsUndefined()); } /*! @@ -438,14 +815,13 @@ QScriptValue QScriptEngine::newFunction(QScriptEngine::FunctionSignature fun, int length) { Q_D(QScriptEngine); - QScriptValueImpl v = d->createFunction(new QScript::CFunction(fun, length)); - QScriptValueImpl proto = d->toImpl(prototype); - v.setProperty(d->idTable()->id_prototype, proto, - QScriptValue::Undeletable); - proto.setProperty(d->idTable()->id_constructor, v, - QScriptValue::Undeletable - | QScriptValue::SkipInEnumeration); - return d->toPublic(v); + JSC::ExecState* exec = d->globalObject->globalExec(); + JSC::JSValue function = new (exec)QScript::FunctionWrapper(this, length, JSC::Identifier(exec, ""), fun); + QScriptValue result = d->scriptValueFromJSCValue(function); + result.setProperty(QLatin1String("prototype"), prototype); + const_cast<QScriptValue&>(prototype) + .setProperty(QLatin1String("constructor"), result, QScriptValue::SkipInEnumeration); + return result; } #ifndef QT_NO_REGEXP @@ -458,9 +834,18 @@ QScriptValue QScriptEngine::newFunction(QScriptEngine::FunctionSignature fun, QScriptValue QScriptEngine::newRegExp(const QRegExp ®exp) { Q_D(QScriptEngine); - QScriptValueImpl v; - d->regexpConstructor->newRegExp(&v, regexp); - return d->toPublic(v); + JSC::ExecState* exec = d->globalObject->globalExec(); + JSC::JSValue buf[2]; + JSC::ArgList args(buf, sizeof(buf)); + JSC::UString jscPattern = QScript::qtStringToJSCUString(regexp.pattern()); + QString flags; + if (regexp.caseSensitivity() == Qt::CaseInsensitive) + flags.append(QLatin1Char('i')); + JSC::UString jscFlags = QScript::qtStringToJSCUString(flags); + buf[0] = JSC::jsNontrivialString(exec, jscPattern); + buf[1] = JSC::jsNontrivialString(exec, jscFlags); + JSC::JSObject* result = JSC::constructRegExp(exec, args); + return d->scriptValueFromJSCValue(result); } #endif // QT_NO_REGEXP @@ -478,9 +863,14 @@ QScriptValue QScriptEngine::newRegExp(const QRegExp ®exp) QScriptValue QScriptEngine::newVariant(const QVariant &value) { Q_D(QScriptEngine); - QScriptValueImpl result; - d->newVariant(&result, value); - return d->toPublic(result); + JSC::ExecState* exec = d->globalObject->globalExec(); + QScript::QVariantWrapperObject *obj = new (exec) QScript::QVariantWrapperObject(d->variantWrapperObjectStructure); + obj->setValue(value); + QScriptValue result = d->scriptValueFromJSCValue(obj); + QScriptValue proto = defaultPrototype(value.userType()); + if (proto.isValid()) + result.setPrototype(proto); + return result; } /*! @@ -510,15 +900,10 @@ QScriptValue QScriptEngine::newVariant(const QVariant &value) QScriptValue QScriptEngine::newVariant(const QScriptValue &object, const QVariant &value) { - Q_D(QScriptEngine); - QScriptValuePrivate *p = QScriptValuePrivate::get(object); - if (!p || !p->value.isObject()) - return newVariant(value); - if (p->value.isVariant()) - p->value.setVariantValue(value); - else - d->newVariant(&p->value, value, /*setDefaultPrototype=*/false); - return object; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + Q_UNUSED(object); + Q_UNUSED(value); + return QScriptValue(); } #ifndef QT_NO_QOBJECT @@ -548,9 +933,8 @@ QScriptValue QScriptEngine::newQObject(QObject *object, ValueOwnership ownership const QObjectWrapOptions &options) { Q_D(QScriptEngine); - QScriptValueImpl result; - d->newQObject(&result, object, ownership, options); - return d->toPublic(result); + JSC::JSValue jscQObject = d->newQObject(object, ownership, options); + return d->scriptValueFromJSCValue(jscQObject); } /*! @@ -583,22 +967,12 @@ QScriptValue QScriptEngine::newQObject(const QScriptValue &scriptObject, ValueOwnership ownership, const QObjectWrapOptions &options) { - Q_D(QScriptEngine); - QScriptValuePrivate *p = QScriptValuePrivate::get(scriptObject); - if (!p || !p->value.isObject()) - return newQObject(qtObject, ownership, options); - if (p->value.isQObject()) { - QScript::ExtQObject::Instance *data; - data = d->qobjectConstructor->get(p->value); - Q_ASSERT(data != 0); - data->value = qtObject; - data->ownership = ownership; - data->options = options; - } else { - d->newQObject(&p->value, qtObject, ownership, options, - /*setDefaultPrototype=*/false); - } - return scriptObject; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + Q_UNUSED(scriptObject); + Q_UNUSED(qtObject); + Q_UNUSED(ownership); + Q_UNUSED(options); + return QScriptValue(); } #endif // QT_NO_QOBJECT @@ -614,9 +988,9 @@ QScriptValue QScriptEngine::newQObject(const QScriptValue &scriptObject, QScriptValue QScriptEngine::newObject() { Q_D(QScriptEngine); - QScriptValueImpl v; - d->newObject(&v, d->objectConstructor->publicPrototype); - return d->toPublic(v); + JSC::ExecState* exec = d->globalObject->globalExec(); + JSC::JSObject *result = JSC::constructEmptyObject(exec); + return d->scriptValueFromJSCValue(result); } /*! @@ -636,8 +1010,11 @@ QScriptValue QScriptEngine::newObject() QScriptValue QScriptEngine::newObject(QScriptClass *scriptClass, const QScriptValue &data) { - Q_D(QScriptEngine); - return d->toPublic(d->newObject(scriptClass, d->toImpl(data))); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + // use an internal map from JSObject -> data + Q_UNUSED(scriptClass); + Q_UNUSED(data); + return QScriptValue(); } /*! @@ -645,10 +1022,9 @@ QScriptValue QScriptEngine::newObject(QScriptClass *scriptClass, */ QScriptValue QScriptEngine::newActivationObject() { - Q_D(QScriptEngine); - QScriptValueImpl v; - d->newActivation(&v); - return d->toPublic(v); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + // ### JSActivation or JSVariableObject? + return QScriptValue(); } /*! @@ -697,12 +1073,14 @@ QScriptValue QScriptEngine::newActivationObject() QScriptValue QScriptEngine::newFunction(QScriptEngine::FunctionSignature fun, int length) { Q_D(QScriptEngine); - QScriptValueImpl v = d->createFunction(new QScript::CFunction(fun, length)); - QScriptValueImpl prototype = d->newObject(); - v.setProperty(d->idTable()->id_prototype, prototype, QScriptValue::Undeletable); - prototype.setProperty(d->idTable()->id_constructor, v, - QScriptValue::Undeletable | QScriptValue::SkipInEnumeration); - return d->toPublic(v); + JSC::ExecState* exec = d->globalObject->globalExec(); + JSC::JSValue function = new (exec)QScript::FunctionWrapper(this, length, JSC::Identifier(exec, ""), fun); + QScriptValue result = d->scriptValueFromJSCValue(function); + QScriptValue proto = newObject(); + result.setProperty(QLatin1String("prototype"), proto, QScriptValue::Undeletable); + proto.setProperty(QLatin1String("constructor"), result, + QScriptValue::Undeletable | QScriptValue::SkipInEnumeration); + return result; } /*! @@ -712,12 +1090,14 @@ QScriptValue QScriptEngine::newFunction(QScriptEngine::FunctionSignature fun, in QScriptValue QScriptEngine::newFunction(QScriptEngine::FunctionWithArgSignature fun, void *arg) { Q_D(QScriptEngine); - QScriptValueImpl v = d->createFunction(new QScript::C3Function(fun, arg, /*length=*/0)); - QScriptValueImpl prototype = d->newObject(); - v.setProperty(d->idTable()->id_prototype, prototype, QScriptValue::Undeletable); - prototype.setProperty(d->idTable()->id_constructor, v, - QScriptValue::Undeletable | QScriptValue::SkipInEnumeration); - return d->toPublic(v); + JSC::ExecState* exec = d->globalObject->globalExec(); + JSC::JSValue function = new (exec)QScript::FunctionWithArgWrapper(this, /*length=*/0, JSC::Identifier(exec, ""), fun, arg); + QScriptValue result = d->scriptValueFromJSCValue(function); + QScriptValue proto = newObject(); + result.setProperty(QLatin1String("prototype"), proto, QScriptValue::Undeletable); + proto.setProperty(QLatin1String("constructor"), result, + QScriptValue::Undeletable | QScriptValue::SkipInEnumeration); + return result; } /*! @@ -728,11 +1108,9 @@ QScriptValue QScriptEngine::newFunction(QScriptEngine::FunctionWithArgSignature QScriptValue QScriptEngine::newArray(uint length) { Q_D(QScriptEngine); - QScriptValueImpl v; - QScript::Array a(d); - a.resize(length); - d->newArray(&v, a); - return d->toPublic(v); + JSC::ExecState* exec = d->globalObject->globalExec(); + JSC::JSArray* result = JSC::constructEmptyArray(exec, length); + return d->scriptValueFromJSCValue(result); } /*! @@ -745,12 +1123,15 @@ QScriptValue QScriptEngine::newArray(uint length) QScriptValue QScriptEngine::newRegExp(const QString &pattern, const QString &flags) { Q_D(QScriptEngine); - int bitflags = 0; - for (int i = 0; i < flags.size(); ++i) - bitflags |= QScript::Ecma::RegExp::flagFromChar(flags.at(i)); - QScriptValueImpl v; - d->regexpConstructor->newRegExp(&v, pattern, bitflags); - return d->toPublic(v); + JSC::ExecState* exec = d->globalObject->globalExec(); + JSC::JSValue buf[2]; + JSC::ArgList args(buf, sizeof(buf)); + JSC::UString jscPattern = QScript::qtStringToJSCUString(pattern); + JSC::UString jscFlags = QScript::qtStringToJSCUString(flags); + buf[0] = JSC::jsNontrivialString(exec, jscPattern); + buf[1] = JSC::jsNontrivialString(exec, jscFlags); + JSC::JSObject* result = JSC::constructRegExp(exec, args); + return d->scriptValueFromJSCValue(result); } /*! @@ -761,9 +1142,11 @@ QScriptValue QScriptEngine::newRegExp(const QString &pattern, const QString &fla QScriptValue QScriptEngine::newDate(qsreal value) { Q_D(QScriptEngine); - QScriptValueImpl v; - d->dateConstructor->newDate(&v, value); - return d->toPublic(v); + JSC::ExecState* exec = d->globalObject->globalExec(); + JSC::JSValue val = JSC::jsNumber(exec, value); + JSC::ArgList args(&val, 1); + JSC::JSObject *result = JSC::constructDate(exec, args); + return d->scriptValueFromJSCValue(result); } /*! @@ -773,10 +1156,7 @@ QScriptValue QScriptEngine::newDate(qsreal value) */ QScriptValue QScriptEngine::newDate(const QDateTime &value) { - Q_D(QScriptEngine); - QScriptValueImpl v; - d->dateConstructor->newDate(&v, value); - return d->toPublic(v); + return newDate(QScript::FromDateTime(value)); } #ifndef QT_NO_QOBJECT @@ -798,10 +1178,10 @@ QScriptValue QScriptEngine::newDate(const QDateTime &value) QScriptValue QScriptEngine::newQMetaObject( const QMetaObject *metaObject, const QScriptValue &ctor) { - Q_D(QScriptEngine); - QScriptValueImpl v; - d->qmetaObjectConstructor->newQMetaObject(&v, metaObject, d->toImpl(ctor)); - return d->toPublic(v); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + Q_UNUSED(metaObject); + Q_UNUSED(ctor); + return QScriptValue(); } /*! @@ -896,7 +1276,10 @@ QScriptValue QScriptEngine::newQMetaObject( */ bool QScriptEngine::canEvaluate(const QString &program) const { - return QScriptEnginePrivate::canEvaluate(program); +// Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + // ### use our own parser or JSC::Interpreter::checkSyntax() + Q_UNUSED(program); + return true; } /*! @@ -907,7 +1290,9 @@ bool QScriptEngine::canEvaluate(const QString &program) const */ QScriptSyntaxCheckResult QScriptEngine::checkSyntax(const QString &program) { - return QScriptEnginePrivate::checkSyntax(program); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + // use our own parser or JSC::Interpreter::checkSyntax() + Q_UNUSED(program); } /*! @@ -940,9 +1325,24 @@ QScriptSyntaxCheckResult QScriptEngine::checkSyntax(const QString &program) QScriptValue QScriptEngine::evaluate(const QString &program, const QString &fileName, int lineNumber) { Q_D(QScriptEngine); - QScriptContextPrivate *ctx_p = d->currentContext(); - d->evaluate(ctx_p, program, lineNumber, fileName); - return d->toPublic(ctx_p->m_result); + + JSC::JSLock lock(false); // ### hmmm + + JSC::UString jscProgram = QScript::qtStringToJSCUString(program); + JSC::UString jscFileName = QScript::qtStringToJSCUString(fileName); + + JSC::ExecState* exec = d->globalObject->globalExec(); + JSC::Completion comp = JSC::evaluate(exec, exec->dynamicGlobalObject()->globalScopeChain(), + JSC::makeSource(jscProgram, jscFileName, lineNumber)); + if ((comp.complType() == JSC::Normal) || (comp.complType() == JSC::ReturnValue)) { + return d->scriptValueFromJSCValue(comp.value()); + } + + if (comp.complType() == JSC::Throw) { + return d->scriptValueFromJSCValue(comp.value()); + } + + return QScriptValue(); } /*! @@ -954,8 +1354,8 @@ QScriptValue QScriptEngine::evaluate(const QString &program, const QString &file */ QScriptContext *QScriptEngine::currentContext() const { - Q_D(const QScriptEngine); - return QScriptContextPrivate::get(d->currentContext()); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return 0; } /*! @@ -983,14 +1383,8 @@ QScriptContext *QScriptEngine::currentContext() const */ QScriptContext *QScriptEngine::pushContext() { - Q_D(QScriptEngine); - QScriptContextPrivate *ctx_p = d->pushContext(); - ctx_p->setThisObject(d->globalObject()); - QScriptValueImpl activation; - d->newActivation(&activation); - activation.setScope(d->globalObject()); - ctx_p->setActivationObject(activation); - return QScriptContextPrivate::get(ctx_p); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return 0; } /*! @@ -1001,9 +1395,7 @@ QScriptContext *QScriptEngine::pushContext() */ void QScriptEngine::popContext() { - Q_D(QScriptEngine); - if (d->currentContext() && d->currentContext()->parentContext()) - d->popContext(); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); } /*! @@ -1018,7 +1410,8 @@ void QScriptEngine::popContext() bool QScriptEngine::hasUncaughtException() const { Q_D(const QScriptEngine); - return d->hasUncaughtException(); + JSC::ExecState* exec = d->globalObject->globalExec(); + return exec->hadException(); } /*! @@ -1035,7 +1428,8 @@ bool QScriptEngine::hasUncaughtException() const QScriptValue QScriptEngine::uncaughtException() const { Q_D(const QScriptEngine); - return const_cast<QScriptEnginePrivate*>(d)->toPublic(d->uncaughtException()); + JSC::ExecState* exec = d->globalObject->globalExec(); + return const_cast<QScriptEnginePrivate*>(d)->scriptValueFromJSCValue(exec->exception()); } /*! @@ -1048,7 +1442,9 @@ QScriptValue QScriptEngine::uncaughtException() const */ int QScriptEngine::uncaughtExceptionLineNumber() const { - return QScriptContextPrivate::get(currentContext())->errorLineNumber; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + // use lineNumber property of exec->exception()? + return -1; } /*! @@ -1060,8 +1456,9 @@ int QScriptEngine::uncaughtExceptionLineNumber() const */ QStringList QScriptEngine::uncaughtExceptionBacktrace() const { - Q_D(const QScriptEngine); - return d->uncaughtExceptionBacktrace(); +// ### implement me + // how do we get a bt with JSC? + return QStringList() << QLatin1String("<backtrace should go here>"); } /*! @@ -1073,8 +1470,9 @@ QStringList QScriptEngine::uncaughtExceptionBacktrace() const */ void QScriptEngine::clearExceptions() { - Q_D(QScriptEngine); - d->clearExceptions(); + Q_D(const QScriptEngine); + JSC::ExecState* exec = d->globalObject->globalExec(); + exec->clearException(); } /*! @@ -1086,7 +1484,10 @@ void QScriptEngine::clearExceptions() QScriptValue QScriptEngine::defaultPrototype(int metaTypeId) const { Q_D(const QScriptEngine); - return const_cast<QScriptEnginePrivate*>(d)->toPublic(d->defaultPrototype(metaTypeId)); + QScriptTypeInfo *info = d->m_typeInfos.value(metaTypeId); + if (!info) + return QScriptValue(); + return info->prototype; } /*! @@ -1112,7 +1513,12 @@ QScriptValue QScriptEngine::defaultPrototype(int metaTypeId) const void QScriptEngine::setDefaultPrototype(int metaTypeId, const QScriptValue &prototype) { Q_D(QScriptEngine); - d->setDefaultPrototype(metaTypeId, d->toImpl(prototype)); + QScriptTypeInfo *info = d->m_typeInfos.value(metaTypeId); + if (!info) { + info = new QScriptTypeInfo(); + d->m_typeInfos.insert(metaTypeId, info); + } + info->prototype = prototype; } /*! @@ -1151,7 +1557,317 @@ void QScriptEngine::setDefaultPrototype(int metaTypeId, const QScriptValue &prot QScriptValue QScriptEngine::create(int type, const void *ptr) { Q_D(QScriptEngine); - return d->toPublic(d->create(type, ptr)); + return d->create(type, ptr); +} + +QScriptValue QScriptEnginePrivate::create(int type, const void *ptr) +{ + Q_ASSERT(ptr != 0); + QScriptValue result; + QScriptTypeInfo *info = m_typeInfos.value(type); + if (info && info->marshal) { + result = info->marshal(q_func(), ptr); + } else { + // check if it's one of the types we know + switch (QMetaType::Type(type)) { + case QMetaType::Void: + result = QScriptValue(QScriptValue::UndefinedValue); + break; + case QMetaType::Bool: + result = QScriptValue(*reinterpret_cast<const bool*>(ptr)); + break; + case QMetaType::Int: + result = QScriptValue(*reinterpret_cast<const int*>(ptr)); + break; + case QMetaType::UInt: + result = QScriptValue(*reinterpret_cast<const uint*>(ptr)); + break; + case QMetaType::LongLong: + result = QScriptValue(qsreal(*reinterpret_cast<const qlonglong*>(ptr))); + break; + case QMetaType::ULongLong: +#if defined(Q_OS_WIN) && defined(_MSC_FULL_VER) && _MSC_FULL_VER <= 12008804 +#pragma message("** NOTE: You need the Visual Studio Processor Pack to compile support for 64bit unsigned integers.") + result = QScriptValue(qsreal((qlonglong)*reinterpret_cast<const qulonglong*>(ptr))); +#elif defined(Q_CC_MSVC) && !defined(Q_CC_MSVC_NET) + result = QScriptValue(qsreal((qlonglong)*reinterpret_cast<const qulonglong*>(ptr))); +#else + result = QScriptValue(qsreal(*reinterpret_cast<const qulonglong*>(ptr))); +#endif + break; + case QMetaType::Double: + result = QScriptValue(*reinterpret_cast<const double*>(ptr)); + break; + case QMetaType::QString: + result = QScriptValue(q_func(), *reinterpret_cast<const QString*>(ptr)); + break; + case QMetaType::Float: + result = QScriptValue(*reinterpret_cast<const float*>(ptr)); + break; + case QMetaType::Short: + result = QScriptValue(*reinterpret_cast<const short*>(ptr)); + break; + case QMetaType::UShort: + result = QScriptValue(*reinterpret_cast<const unsigned short*>(ptr)); + break; + case QMetaType::Char: + result = QScriptValue(*reinterpret_cast<const char*>(ptr)); + break; + case QMetaType::UChar: + result = QScriptValue(*reinterpret_cast<const unsigned char*>(ptr)); + break; + case QMetaType::QChar: + result = QScriptValue((*reinterpret_cast<const QChar*>(ptr)).unicode()); + break; + case QMetaType::QStringList: + result = arrayFromStringList(*reinterpret_cast<const QStringList *>(ptr)); + break; + case QMetaType::QVariantList: + result = arrayFromVariantList(*reinterpret_cast<const QVariantList *>(ptr)); + break; + case QMetaType::QVariantMap: + result = objectFromVariantMap(*reinterpret_cast<const QVariantMap *>(ptr)); + break; + case QMetaType::QDateTime: + result = q_func()->newDate(*reinterpret_cast<const QDateTime *>(ptr)); + break; + case QMetaType::QDate: + result = q_func()->newDate(QDateTime(*reinterpret_cast<const QDate *>(ptr))); + break; +#ifndef QT_NO_REGEXP + case QMetaType::QRegExp: + result = q_func()->newRegExp(*reinterpret_cast<const QRegExp *>(ptr)); + break; +#endif +#ifndef QT_NO_QOBJECT + case QMetaType::QObjectStar: + case QMetaType::QWidgetStar: + result = q_func()->newQObject(*reinterpret_cast<QObject* const *>(ptr)); + break; +#endif + default: + if (type == qMetaTypeId<QScriptValue>()) { + result = *reinterpret_cast<const QScriptValue*>(ptr); + if (!result.isValid()) + result = QScriptValue(QScriptValue::UndefinedValue); + } else if (type == qMetaTypeId<QVariant>()) { + result = scriptValueFromVariant(*reinterpret_cast<const QVariant*>(ptr)); + } + +#ifndef QT_NO_QOBJECT + // lazy registration of some common list types + else if (type == qMetaTypeId<QObjectList>()) { + qScriptRegisterSequenceMetaType<QObjectList>(q_func()); + return create(type, ptr); + } +#endif + else if (type == qMetaTypeId<QList<int> >()) { + qScriptRegisterSequenceMetaType<QList<int> >(q_func()); + return create(type, ptr); + } + + else { + QByteArray typeName = QMetaType::typeName(type); + if (typeName.endsWith('*') && !*reinterpret_cast<void* const *>(ptr)) + result = QScriptValue(QScriptValue::NullValue); + else + result = q_func()->newVariant(QVariant(type, ptr)); + } + } + } + if (result.isObject() && info && info->prototype.isValid()) + result.setPrototype(info->prototype); + return result; +} + +bool QScriptEnginePrivate::convert(const QScriptValue &value, + int type, void *ptr, + QScriptEnginePrivate *eng) +{ + if (!eng && value.engine()) + eng = QScriptEnginePrivate::get(value.engine()); + if (eng) { + QScriptTypeInfo *info = eng->m_typeInfos.value(type); + if (info && info->demarshal) { + info->demarshal(value, ptr); + return true; + } + } + + // check if it's one of the types we know + switch (QMetaType::Type(type)) { + case QMetaType::Bool: + *reinterpret_cast<bool*>(ptr) = value.toBoolean(); + return true; + case QMetaType::Int: + *reinterpret_cast<int*>(ptr) = value.toInt32(); + return true; + case QMetaType::UInt: + *reinterpret_cast<uint*>(ptr) = value.toUInt32(); + return true; + case QMetaType::LongLong: + *reinterpret_cast<qlonglong*>(ptr) = qlonglong(value.toInteger()); + return true; + case QMetaType::ULongLong: + *reinterpret_cast<qulonglong*>(ptr) = qulonglong(value.toInteger()); + return true; + case QMetaType::Double: + *reinterpret_cast<double*>(ptr) = value.toNumber(); + return true; + case QMetaType::QString: + if (value.isUndefined() || value.isNull()) + *reinterpret_cast<QString*>(ptr) = QString(); + else + *reinterpret_cast<QString*>(ptr) = value.toString(); + return true; + case QMetaType::Float: + *reinterpret_cast<float*>(ptr) = value.toNumber(); + return true; + case QMetaType::Short: + *reinterpret_cast<short*>(ptr) = short(value.toInt32()); + return true; + case QMetaType::UShort: + *reinterpret_cast<unsigned short*>(ptr) = value.toUInt16(); + return true; + case QMetaType::Char: + *reinterpret_cast<char*>(ptr) = char(value.toInt32()); + return true; + case QMetaType::UChar: + *reinterpret_cast<unsigned char*>(ptr) = (unsigned char)(value.toInt32()); + return true; + case QMetaType::QChar: + if (value.isString()) { + QString str = value.toString(); + *reinterpret_cast<QChar*>(ptr) = str.isEmpty() ? QChar() : str.at(0); + } else { + *reinterpret_cast<QChar*>(ptr) = QChar(value.toUInt16()); + } + return true; + case QMetaType::QDateTime: + if (value.isDate()) { + *reinterpret_cast<QDateTime *>(ptr) = value.toDateTime(); + return true; + } break; + case QMetaType::QDate: + if (value.isDate()) { + *reinterpret_cast<QDate *>(ptr) = value.toDateTime().date(); + return true; + } break; +#ifndef QT_NO_REGEXP + case QMetaType::QRegExp: + if (value.isRegExp()) { + *reinterpret_cast<QRegExp *>(ptr) = value.toRegExp(); + return true; + } break; +#endif +#ifndef QT_NO_QOBJECT + case QMetaType::QObjectStar: + if (value.isQObject() || value.isNull()) { + *reinterpret_cast<QObject* *>(ptr) = value.toQObject(); + return true; + } break; + case QMetaType::QWidgetStar: + if (value.isQObject() || value.isNull()) { + QObject *qo = value.toQObject(); + if (!qo || qo->isWidgetType()) { + *reinterpret_cast<QWidget* *>(ptr) = reinterpret_cast<QWidget*>(qo); + return true; + } + } break; +#endif + case QMetaType::QStringList: + if (value.isArray()) { + *reinterpret_cast<QStringList *>(ptr) = stringListFromArray(value); + return true; + } break; + case QMetaType::QVariantList: + if (value.isArray()) { + *reinterpret_cast<QVariantList *>(ptr) = variantListFromArray(value); + return true; + } break; + case QMetaType::QVariantMap: + if (value.isObject()) { + *reinterpret_cast<QVariantMap *>(ptr) = variantMapFromObject(value); + return true; + } break; + default: + ; + } + + QByteArray name = QMetaType::typeName(type); +#ifndef QT_NO_QOBJECT + if (convertToNativeQObject(value, name, reinterpret_cast<void* *>(ptr))) + return true; +#endif + if (value.isVariant() && name.endsWith('*')) { + int valueType = QMetaType::type(name.left(name.size()-1)); + QVariant var = value.toVariant(); + if (valueType == var.userType()) { + *reinterpret_cast<void* *>(ptr) = var.data(); + return true; + } else { + // look in the prototype chain + QScriptValue proto = value.prototype(); + while (proto.isObject()) { + bool canCast = false; + if (proto.isVariant()) { + canCast = (type == proto.toVariant().userType()) + || (valueType && (valueType == proto.toVariant().userType())); + } +#ifndef QT_NO_QOBJECT + else if (proto.isQObject()) { + QByteArray className = name.left(name.size()-1); + if (QObject *qobject = proto.toQObject()) + canCast = qobject->qt_metacast(className) != 0; + } +#endif + if (canCast) { + QByteArray varTypeName = QMetaType::typeName(var.userType()); + if (varTypeName.endsWith('*')) + *reinterpret_cast<void* *>(ptr) = *reinterpret_cast<void* *>(var.data()); + else + *reinterpret_cast<void* *>(ptr) = var.data(); + return true; + } + proto = proto.prototype(); + } + } + } else if (value.isNull() && name.endsWith('*')) { + *reinterpret_cast<void* *>(ptr) = 0; + return true; + } else if (type == qMetaTypeId<QScriptValue>()) { + if (!eng) + return false; + *reinterpret_cast<QScriptValue*>(ptr) = value; + return true; + } else if (type == qMetaTypeId<QVariant>()) { + *reinterpret_cast<QVariant*>(ptr) = value.toVariant(); + return true; + } + + // lazy registration of some common list types +#ifndef QT_NO_QOBJECT + else if (type == qMetaTypeId<QObjectList>()) { + if (!eng) + return false; + qScriptRegisterSequenceMetaType<QObjectList>(eng->q_func()); + return convert(value, type, ptr, eng); + } +#endif + else if (type == qMetaTypeId<QList<int> >()) { + if (!eng) + return false; + qScriptRegisterSequenceMetaType<QList<int> >(eng->q_func()); + return convert(value, type, ptr, eng); + } + +#if 0 + if (!name.isEmpty()) { + qWarning("QScriptEngine::convert: unable to convert value to type `%s'", + name.constData()); + } +#endif + return false; } /*! @@ -1160,7 +1876,7 @@ QScriptValue QScriptEngine::create(int type, const void *ptr) bool QScriptEngine::convert(const QScriptValue &value, int type, void *ptr) { Q_D(QScriptEngine); - return QScriptEnginePrivate::convert(d->toImpl(value), type, ptr, d); + return QScriptEnginePrivate::convert(value, type, ptr, d); } /*! @@ -1168,9 +1884,7 @@ bool QScriptEngine::convert(const QScriptValue &value, int type, void *ptr) */ bool QScriptEngine::convertV2(const QScriptValue &value, int type, void *ptr) { - QScriptValueImpl impl = QScriptValuePrivate::valueOf(value); - QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(value.engine()); - return QScriptEnginePrivate::convert(impl, type, ptr, eng_p); + return QScriptEnginePrivate::convert(value, type, ptr, /*engine=*/0); } /*! @@ -1181,11 +1895,14 @@ void QScriptEngine::registerCustomType(int type, MarshalFunction mf, const QScriptValue &prototype) { Q_D(QScriptEngine); - QScriptCustomTypeInfo info = d->m_customTypes.value(type); - info.marshal = mf; - info.demarshal = df; - info.prototype = d->toImpl(prototype); - d->m_customTypes.insert(type, info); + QScriptTypeInfo *info = d->m_typeInfos.value(type); + if (!info) { + info = new QScriptTypeInfo(); + d->m_typeInfos.insert(type, info); + } + info->marshal = mf; + info->demarshal = df; + info->prototype = prototype; } /*! @@ -1209,10 +1926,8 @@ void QScriptEngine::registerCustomType(int type, MarshalFunction mf, */ void QScriptEngine::installTranslatorFunctions(const QScriptValue &object) { - Q_D(QScriptEngine); - QScriptValue target = object.isObject() ? object : globalObject(); - QScriptValueImpl impl = QScriptValuePrivate::valueOf(target); - d->installTranslatorFunctions(impl); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + Q_UNUSED(object); } /*! @@ -1230,8 +1945,9 @@ void QScriptEngine::installTranslatorFunctions(const QScriptValue &object) */ QScriptValue QScriptEngine::importExtension(const QString &extension) { - Q_D(QScriptEngine); - return d->toPublic(d->importExtension(extension)); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + Q_UNUSED(extension); + return QScriptValue(); } /*! @@ -1245,8 +1961,8 @@ QScriptValue QScriptEngine::importExtension(const QString &extension) */ QStringList QScriptEngine::availableExtensions() const { - Q_D(const QScriptEngine); - return d->availableExtensions(); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return QStringList(); } /*! @@ -1259,8 +1975,8 @@ QStringList QScriptEngine::availableExtensions() const */ QStringList QScriptEngine::importedExtensions() const { - Q_D(const QScriptEngine); - return d->importedExtensions(); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return QStringList(); } /*! \fn QScriptValue QScriptEngine::toScriptValue(const T &value) @@ -1316,7 +2032,7 @@ QStringList QScriptEngine::importedExtensions() const */ /*! - \fn T qScriptValueToValue<T>(const QScriptValue &value) + \fn T qScriptValueToValue(const QScriptValue &value) \since 4.3 \relates QScriptEngine @@ -1371,7 +2087,7 @@ QStringList QScriptEngine::importedExtensions() const */ /*! - \fn T qscriptvalue_cast<T>(const QScriptValue &value) + \fn T qscriptvalue_cast(const QScriptValue &value) \since 4.3 \relates QScriptValue @@ -1510,7 +2226,9 @@ QStringList QScriptEngine::importedExtensions() const void QScriptEngine::collectGarbage() { Q_D(QScriptEngine); - d->gc(); + JSC::JSLock lock(false); + JSC::ExecState* exec = d->globalObject->globalExec(); + exec->heap()->collect(); } /*! @@ -1539,7 +2257,12 @@ void QScriptEngine::collectGarbage() void QScriptEngine::setProcessEventsInterval(int interval) { Q_D(QScriptEngine); - d->m_processEventsInterval = interval; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + // is it possible with JSC? + // JSC has some code for detecting timeouts but not for getting + // a callback at fixed intervals. + // ### we can install a JSC "debugger client" + d->processEventsInterval = interval; } /*! @@ -1552,7 +2275,7 @@ void QScriptEngine::setProcessEventsInterval(int interval) int QScriptEngine::processEventsInterval() const { Q_D(const QScriptEngine); - return d->m_processEventsInterval; + return d->processEventsInterval; } /*! @@ -1565,8 +2288,9 @@ int QScriptEngine::processEventsInterval() const */ bool QScriptEngine::isEvaluating() const { - Q_D(const QScriptEngine); - return d->m_evaluating; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + // check whether we have a lock on the exec state? + return false; } /*! @@ -1587,8 +2311,8 @@ bool QScriptEngine::isEvaluating() const */ void QScriptEngine::abortEvaluation(const QScriptValue &result) { - Q_D(QScriptEngine); - d->abortEvaluation(d->toImpl(result)); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + Q_UNUSED(result); } #ifndef QT_NO_QOBJECT @@ -1613,10 +2337,17 @@ bool qScriptConnect(QObject *sender, const char *signal, return false; if (receiver.isObject() && (receiver.engine() != function.engine())) return false; - QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(function.engine()); - return eng_p->scriptConnect(sender, signal, - eng_p->toImpl(receiver), - eng_p->toImpl(function)); + QScriptEnginePrivate *engine = QScriptEnginePrivate::get(function.engine()); + JSC::JSValue jscReceiver(engine->scriptValueToJSCValue(receiver)); + JSC::JSValue jscFunction(engine->scriptValueToJSCValue(function)); + QScript::QObjectData *data = engine->qobjectData(sender); + + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + // ### FIXME + // return data->addSignalHandler(sender, signal, jscReceiver, jscFunction); + + return false; + } /*! @@ -1638,10 +2369,11 @@ bool qScriptDisconnect(QObject *sender, const char *signal, return false; if (receiver.isObject() && (receiver.engine() != function.engine())) return false; - QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(function.engine()); - return eng_p->scriptDisconnect(sender, signal, - eng_p->toImpl(receiver), - eng_p->toImpl(function)); + QScriptEnginePrivate *engine = QScriptEnginePrivate::get(function.engine()); + JSC::JSValue jscReceiver = engine->scriptValueToJSCValue(receiver); + JSC::JSValue jscFunction = engine->scriptValueToJSCValue(function); + QScript::QObjectData *data = engine->qobjectData(sender); + return data->removeSignalHandler(sender, signal, jscReceiver, jscFunction); } /*! @@ -1678,7 +2410,8 @@ QT_END_INCLUDE_NAMESPACE void QScriptEngine::setAgent(QScriptEngineAgent *agent) { Q_D(QScriptEngine); - d->setAgent(agent); + d->agent = agent; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); } /*! @@ -1692,7 +2425,7 @@ void QScriptEngine::setAgent(QScriptEngineAgent *agent) QScriptEngineAgent *QScriptEngine::agent() const { Q_D(const QScriptEngine); - return d->agent(); + return d->agent; } /*! @@ -1707,8 +2440,9 @@ QScriptEngineAgent *QScriptEngine::agent() const */ QScriptString QScriptEngine::toStringHandle(const QString &str) { - Q_D(QScriptEngine); - return d->internedString(str); + QScriptString ss; + QScriptStringPrivate::init(ss, str); + return ss; } /*! @@ -1733,7 +2467,12 @@ QScriptString QScriptEngine::toStringHandle(const QString &str) QScriptValue QScriptEngine::toObject(const QScriptValue &value) { Q_D(QScriptEngine); - return d->toPublic(d->toObject(d->toImpl(value))); + JSC::JSValue jscValue = d->scriptValueToJSCValue(value); + if (!jscValue) + return QScriptValue(); + JSC::ExecState* exec = d->globalObject->globalExec(); + JSC::JSValue result = jscValue.toObject(exec); + return d->scriptValueFromJSCValue(result); } /*! @@ -1746,8 +2485,10 @@ QScriptValue QScriptEngine::toObject(const QScriptValue &value) */ QScriptValue QScriptEngine::objectById(qint64 id) const { - Q_D(const QScriptEngine); - return const_cast<QScriptEnginePrivate*>(d)->toPublic(d->objectById(id)); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + // mapping from id to JSObject*? + Q_UNUSED(id); + return QScriptValue(); } /*! @@ -1773,6 +2514,19 @@ QScriptValue QScriptEngine::objectById(qint64 id) const \value Valid The program is a syntactically correct Qt Script program. */ +class QScriptSyntaxCheckResultPrivate +{ +public: + QScriptSyntaxCheckResultPrivate() { ref = 0; } + ~QScriptSyntaxCheckResultPrivate() {} + + QScriptSyntaxCheckResult::State state; + int errorColumnNumber; + int errorLineNumber; + QString errorMessage; + QBasicAtomicInt ref; +}; + /*! Constructs a new QScriptSyntaxCheckResult from the \a other result. */ diff --git a/src/script/qscriptengine.h b/src/script/api/qscriptengine.h index afd551b..f293325 100644 --- a/src/script/qscriptengine.h +++ b/src/script/api/qscriptengine.h @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ @@ -363,7 +333,7 @@ inline bool qscriptvalue_cast_helper(const QScriptValue &value, int type, void * template<typename T> T qscriptvalue_cast(const QScriptValue &value -#if !defined qdoc && defined Q_CC_MSVC && _MSC_VER < 1300 +#ifndef Q_QDOC , T * = 0 #endif ) @@ -379,13 +349,11 @@ T qscriptvalue_cast(const QScriptValue &value return T(); } -#if !defined Q_CC_MSVC || _MSC_VER >= 1300 template <> -inline QVariant qscriptvalue_cast<QVariant>(const QScriptValue &value) +inline QVariant qscriptvalue_cast<QVariant>(const QScriptValue &value, QVariant *) { return value.toVariant(); } -#endif template <typename T> inline T qScriptValueToValue(const QScriptValue &value) diff --git a/src/script/api/qscriptengine_p.h b/src/script/api/qscriptengine_p.h new file mode 100644 index 0000000..13a71a7 --- /dev/null +++ b/src/script/api/qscriptengine_p.h @@ -0,0 +1,157 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +****************************************************************************/ + +#ifndef QSCRIPTENGINE_P_H +#define QSCRIPTENGINE_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 "private/qobject_p.h" + +#ifndef QT_NO_SCRIPT + +#include <QtCore/qhash.h> + +#include "RefPtr.h" +#include "Structure.h" +#include "JSGlobalObject.h" +#include "JSValue.h" + +QT_BEGIN_NAMESPACE + +namespace JSC +{ + class JSGlobalObject; + class UString; +} + +namespace QScript +{ + class QObjectPrototype; + class QVariantPrototype; +#ifndef QT_NO_QOBJECT + class QObjectData; +#endif +} + +class QString; +class QStringList; +class QScriptValue; +class QScriptTypeInfo; +class QScriptEngineAgent; + +class QScriptEngine; +class QScriptEnginePrivate +#ifndef QT_NO_QOBJECT + : public QObjectPrivate +#endif +{ + Q_DECLARE_PUBLIC(QScriptEngine) +public: + QScriptEnginePrivate(); + virtual ~QScriptEnginePrivate(); + + static QScriptEnginePrivate *get(QScriptEngine*); + static QScriptEngine *get(QScriptEnginePrivate*); + + static bool convert(const QScriptValue &value, + int type, void *ptr, + QScriptEnginePrivate *eng); + QScriptValue create(int type, const void *ptr); + + QScriptValue scriptValueFromJSCValue(JSC::JSValue value); + JSC::JSValue scriptValueToJSCValue(const QScriptValue &value); + void releaseJSCValue(JSC::JSValue value); + + QScriptValue scriptValueFromVariant(const QVariant &value); + QVariant scriptValueToVariant(const QScriptValue &value, int targetType); + + JSC::JSValue jscValueFromVariant(const QVariant &value); + QVariant jscValueToVariant(JSC::JSValue value, int targetType); + + QScriptValue arrayFromStringList(const QStringList &lst); + static QStringList stringListFromArray(const QScriptValue &arr); + + QScriptValue arrayFromVariantList(const QVariantList &lst); + static QVariantList variantListFromArray(const QScriptValue &arr); + + QScriptValue objectFromVariantMap(const QVariantMap &vmap); + static QVariantMap variantMapFromObject(const QScriptValue &obj); + +#ifndef QT_NO_QOBJECT + JSC::JSValue newQObject(QObject *object, + QScriptEngine::ValueOwnership ownership = QScriptEngine::QtOwnership, + const QScriptEngine:: QObjectWrapOptions &options = 0); + + static bool convertToNativeQObject(const QScriptValue &value, + const QByteArray &targetType, + void **result); + + QScript::QObjectData *qobjectData(QObject *object); + void disposeQObject(QObject *object); + void emitSignalHandlerException(); + + // private slots + void _q_objectDestroyed(QObject *); +#endif + + JSC::JSGlobalObject *globalObject; + + QScript::QObjectPrototype *qobjectPrototype; + WTF::RefPtr<JSC::Structure> qobjectWrapperObjectStructure; + QScript::QVariantPrototype *variantPrototype; + WTF::RefPtr<JSC::Structure> variantWrapperObjectStructure; + + QScriptEngineAgent *agent; + QHash<JSC::JSValue, QBasicAtomicInt> keepAliveValues; + QHash<int, QScriptTypeInfo*> m_typeInfos; + int processEventsInterval; + +#ifndef QT_NO_QOBJECT + QHash<QObject*, QScript::QObjectData*> m_qobjectData; +#endif + +#ifdef QT_NO_QOBJECT + QScriptEngine *q_ptr; +#endif +}; + +namespace QScript +{ + +class GlobalObject : public JSC::JSGlobalObject +{ +public: + GlobalObject(QScriptEnginePrivate*); + ~GlobalObject(); + virtual JSC::UString className() const { return "global"; } + virtual void mark(); + +public: + QScriptEnginePrivate *engine; +}; + +} + +QT_END_NAMESPACE + +#endif // QT_NO_SCRIPT + +#endif diff --git a/src/script/qscriptengineagent.cpp b/src/script/api/qscriptengineagent.cpp index bda94ae..1d7cd27 100644 --- a/src/script/qscriptengineagent.cpp +++ b/src/script/api/qscriptengineagent.cpp @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ @@ -43,14 +13,6 @@ #ifndef QT_NO_SCRIPT -#include "qscriptvalue.h" -#include "qscriptengineagent_p.h" -#include "qscriptengine_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" -#include "qscriptvalueimpl_p.h" - QT_BEGIN_NAMESPACE /*! @@ -132,15 +94,27 @@ QT_BEGIN_NAMESPACE \sa extension() */ +class QScriptEngineAgent; +class Q_SCRIPT_EXPORT QScriptEngineAgentPrivate +{ + Q_DECLARE_PUBLIC(QScriptEngineAgent) +public: + QScriptEngineAgentPrivate(); + virtual ~QScriptEngineAgentPrivate(); + + QScriptEngine *engine; + + QScriptEngineAgent *q_ptr; +}; + QScriptEngineAgentPrivate::QScriptEngineAgentPrivate() - : engine(0), q_ptr(0) { } QScriptEngineAgentPrivate::~QScriptEngineAgentPrivate() { - QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine); - eng_p->agentDeleted(q_ptr); +// ### QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine); +// ### eng_p->agentDeleted(q_ptr); } /*! diff --git a/src/script/qscriptengineagent.h b/src/script/api/qscriptengineagent.h index 3334bc0..d7493dd 100644 --- a/src/script/qscriptengineagent.h +++ b/src/script/api/qscriptengineagent.h @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ diff --git a/src/script/api/qscriptengineagent_p.h b/src/script/api/qscriptengineagent_p.h new file mode 100644 index 0000000..adda00b --- /dev/null +++ b/src/script/api/qscriptengineagent_p.h @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +****************************************************************************/ + +#ifndef QSCRIPTENGINEAGENT_P_H +#define QSCRIPTENGINEAGENT_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 <QtCore/qobjectdefs.h> + +#ifndef QT_NO_SCRIPT + +QT_BEGIN_NAMESPACE + +class QScriptEngine; + +class QScriptEngineAgent; +class Q_SCRIPT_EXPORT QScriptEngineAgentPrivate +{ + Q_DECLARE_PUBLIC(QScriptEngineAgent) +public: + QScriptEngineAgentPrivate(); + virtual ~QScriptEngineAgentPrivate(); + + QScriptEngine *engine; + + QScriptEngineAgent *q_ptr; +}; + +QT_END_NAMESPACE + +#endif // QT_NO_SCRIPT + +#endif diff --git a/src/script/api/qscriptextensioninterface.h b/src/script/api/qscriptextensioninterface.h new file mode 100644 index 0000000..1b83c9b --- /dev/null +++ b/src/script/api/qscriptextensioninterface.h @@ -0,0 +1,43 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +****************************************************************************/ + +#ifndef QSCRIPTEXTENSIONINTERFACE_H +#define QSCRIPTEXTENSIONINTERFACE_H + +#include <QtCore/qfactoryinterface.h> + +#ifndef QT_NO_SCRIPT + +#include <QtCore/qobject.h> + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(Script) + +class QScriptEngine; + +struct Q_SCRIPT_EXPORT QScriptExtensionInterface + : public QFactoryInterface +{ + virtual void initialize(const QString &key, QScriptEngine *engine) = 0; +}; + +Q_DECLARE_INTERFACE(QScriptExtensionInterface, + "com.trolltech.Qt.QScriptExtensionInterface/1.0") + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif // QT_NO_SCRIPT +#endif // QSCRIPTEXTENSIONINTERFACE_H diff --git a/src/script/qscriptextensionplugin.cpp b/src/script/api/qscriptextensionplugin.cpp index 1c85606..27e9005 100644 --- a/src/script/qscriptextensionplugin.cpp +++ b/src/script/api/qscriptextensionplugin.cpp @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ diff --git a/src/script/api/qscriptextensionplugin.h b/src/script/api/qscriptextensionplugin.h new file mode 100644 index 0000000..6f6edb2 --- /dev/null +++ b/src/script/api/qscriptextensionplugin.h @@ -0,0 +1,49 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +****************************************************************************/ + +#ifndef QSCRIPTEXTENSIONPLUGIN_H +#define QSCRIPTEXTENSIONPLUGIN_H + +#include <QtCore/qplugin.h> + +#ifndef QT_NO_SCRIPT + +#include <QtScript/qscriptextensioninterface.h> + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(Script) + +class QScriptValue; + +class Q_SCRIPT_EXPORT QScriptExtensionPlugin : public QObject, + public QScriptExtensionInterface +{ + Q_OBJECT + Q_INTERFACES(QScriptExtensionInterface:QFactoryInterface) +public: + explicit QScriptExtensionPlugin(QObject *parent = 0); + ~QScriptExtensionPlugin(); + + virtual QStringList keys() const = 0; + virtual void initialize(const QString &key, QScriptEngine *engine) = 0; + + QScriptValue setupPackage(const QString &key, QScriptEngine *engine) const; +}; + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif // QT_NO_SCRIPT +#endif // QSCRIPTEXTENSIONPLUGIN_H diff --git a/src/script/qscriptstring.cpp b/src/script/api/qscriptstring.cpp index 69b0796..89ac4ac 100644 --- a/src/script/qscriptstring.cpp +++ b/src/script/api/qscriptstring.cpp @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ @@ -44,13 +14,6 @@ #ifndef QT_NO_SCRIPT #include "qscriptstring_p.h" -#include "qscriptnameid_p.h" -#include "qscriptvalue_p.h" -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" QT_BEGIN_NAMESPACE @@ -81,7 +44,6 @@ QT_BEGIN_NAMESPACE \internal */ QScriptStringPrivate::QScriptStringPrivate() - : nameId(0), engine(0), q_ptr(0) { ref = 0; } @@ -89,26 +51,18 @@ QScriptStringPrivate::QScriptStringPrivate() /*! \internal */ -QScriptStringPrivate *QScriptStringPrivate::create() -{ - return new QScriptStringPrivate(); -} - -/*! - \internal -*/ -QScriptStringPrivate *QScriptStringPrivate::get(const QScriptString &q) +QScriptStringPrivate::~QScriptStringPrivate() { - return const_cast<QScriptStringPrivate*>(q.d_func()); } /*! \internal */ -void QScriptStringPrivate::init(QScriptString &q, QScriptStringPrivate *d) +void QScriptStringPrivate::init(QScriptString &q, const QString &value) { - Q_ASSERT(q.d_ptr == 0); - q.d_ptr = d; + Q_ASSERT(!q.isValid()); + q.d_ptr = new QScriptStringPrivate(); + q.d_ptr->value = value; q.d_ptr->ref.ref(); } @@ -136,12 +90,16 @@ QScriptString::QScriptString(const QScriptString &other) QScriptString::~QScriptString() { if (d_ptr && !d_ptr->ref.deref()) { +// Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); +#if 0 if (isValid()) { d_ptr->engine->uninternString(d_ptr); } else { // the engine has already been deleted delete d_ptr; } +#endif + delete d_ptr; d_ptr = 0; } } @@ -154,12 +112,8 @@ QScriptString &QScriptString::operator=(const QScriptString &other) if (d_ptr == other.d_ptr) return *this; if (d_ptr && !d_ptr->ref.deref()) { - if (isValid()) { - d_ptr->engine->uninternString(d_ptr); - } else { - // the engine has already been deleted - delete d_ptr; - } +// Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + delete d_ptr; } d_ptr = other.d_ptr; if (d_ptr) @@ -174,7 +128,7 @@ QScriptString &QScriptString::operator=(const QScriptString &other) bool QScriptString::isValid() const { Q_D(const QScriptString); - return (d && d->nameId); + return (d != 0); } /*! @@ -206,9 +160,9 @@ bool QScriptString::operator!=(const QScriptString &other) const QString QScriptString::toString() const { Q_D(const QScriptString); - if (!d || !d->nameId) + if (!d) return QString(); - return d->nameId->s; + return d->value; } /*! diff --git a/src/script/api/qscriptstring.h b/src/script/api/qscriptstring.h new file mode 100644 index 0000000..7f854ab --- /dev/null +++ b/src/script/api/qscriptstring.h @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +****************************************************************************/ + +#ifndef QSCRIPTSTRING_H +#define QSCRIPTSTRING_H + +#include <QtCore/qstring.h> + +#ifndef QT_NO_SCRIPT + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(Script) + +class QScriptEngine; +class QScriptStringPrivate; + +class Q_SCRIPT_EXPORT QScriptString +{ +public: + QScriptString(); + QScriptString(const QScriptString &other); + ~QScriptString(); + + QScriptString &operator=(const QScriptString &other); + + bool isValid() const; + + bool operator==(const QScriptString &other) const; + bool operator!=(const QScriptString &other) const; + + QString toString() const; + operator QString() const; + +private: + QScriptStringPrivate *d_ptr; + + Q_DECLARE_PRIVATE(QScriptString) +}; + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif // QT_NO_SCRIPT +#endif // QSCRIPTSTRING_H diff --git a/src/script/api/qscriptstring_p.h b/src/script/api/qscriptstring_p.h new file mode 100644 index 0000000..0f9ccd1 --- /dev/null +++ b/src/script/api/qscriptstring_p.h @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +****************************************************************************/ + +#ifndef QSCRIPTSTRING_P_H +#define QSCRIPTSTRING_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 <QtCore/qobjectdefs.h> + +#ifndef QT_NO_SCRIPT + +#include <QtCore/qstring.h> + +QT_BEGIN_NAMESPACE + +class QScriptString; +class QScriptStringPrivate +{ +public: + QScriptStringPrivate(); + ~QScriptStringPrivate(); + + static void init(QScriptString &q, const QString &value); + + QBasicAtomicInt ref; + QString value; +}; + +QT_END_NAMESPACE + +#endif // QT_NO_SCRIPT + +#endif diff --git a/src/script/qscriptvalue.cpp b/src/script/api/qscriptvalue.cpp index f72d1db..32c5095 100644 --- a/src/script/qscriptvalue.cpp +++ b/src/script/api/qscriptvalue.cpp @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ @@ -44,16 +14,30 @@ #ifndef QT_NO_SCRIPT #include "qscriptvalue_p.h" +#include "qscriptengine.h" #include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" -#include "qscriptclass.h" -#include "qscriptclass_p.h" -#include <QtCore/QDateTime> -#include <QtCore/QRegExp> +#include "JSArray.h" +#include "JSGlobalObject.h" +#include "JSImmediate.h" +#include "JSObject.h" +#include "JSValue.h" +#include "JSFunction.h" +#include "DateInstance.h" +#include "ErrorInstance.h" +#include "RegExpObject.h" +#include "Identifier.h" +#include "Operations.h" +#include "Arguments.h" + +#include <QtCore/qdatetime.h> +#include <QtCore/qregexp.h> +#include <QtCore/qvariant.h> +#include <QtCore/qnumeric.h> + +#include "utils/qscriptdate_p.h" +#include "bridge/qscriptvariant_p.h" +#include "bridge/qscriptqobject_p.h" QT_BEGIN_NAMESPACE @@ -181,6 +165,183 @@ QT_BEGIN_NAMESPACE \value ResolveFull Check the object's own properties first, then search the prototype chain, and finally search the scope chain. */ +// ### move + +#include <QtCore/qnumeric.h> +#include <math.h> + +namespace QScript +{ + +static const qsreal D32 = 4294967296.0; + +qint32 ToInt32(qsreal n) +{ + if (qIsNaN(n) || qIsInf(n) || (n == 0)) + return 0; + + double sign = (n < 0) ? -1.0 : 1.0; + qsreal abs_n = fabs(n); + + n = ::fmod(sign * ::floor(abs_n), D32); + const double D31 = D32 / 2.0; + + if (sign == -1 && n < -D31) + n += D32; + + else if (sign != -1 && n >= D31) + n -= D32; + + return qint32 (n); +} + +quint32 ToUint32(qsreal n) +{ + if (qIsNaN(n) || qIsInf(n) || (n == 0)) + return 0; + + double sign = (n < 0) ? -1.0 : 1.0; + qsreal abs_n = fabs(n); + + n = ::fmod(sign * ::floor(abs_n), D32); + + if (n < 0) + n += D32; + + return quint32 (n); +} + +quint16 ToUint16(qsreal n) +{ + static const qsreal D16 = 65536.0; + + if (qIsNaN(n) || qIsInf(n) || (n == 0)) + return 0; + + double sign = (n < 0) ? -1.0 : 1.0; + qsreal abs_n = fabs(n); + + n = ::fmod(sign * ::floor(abs_n), D16); + + if (n < 0) + n += D16; + + return quint16 (n); +} + +qsreal ToInteger(qsreal n) +{ + if (qIsNaN(n)) + return 0; + + if (n == 0 || qIsInf(n)) + return n; + + int sign = n < 0 ? -1 : 1; + return sign * ::floor(::fabs(n)); +} + +} // namespace QScript + +QScriptValuePrivate::QScriptValuePrivate() +{ + ref = 0; +} + +QScriptValuePrivate::~QScriptValuePrivate() +{ +} + +void QScriptValuePrivate::initFromJSCValue(JSC::JSValue value) +{ + type = JSC; + jscValue = value; + if (!JSC::JSImmediate::isImmediate(value)) { + Q_ASSERT(engine != 0); + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine); + if (value != eng_p->globalObject) { + if (!eng_p->keepAliveValues.contains(value)) + eng_p->keepAliveValues[value] = 0; + eng_p->keepAliveValues[value].ref(); + } + } +} + +void QScriptValuePrivate::initFromNumber(double value) +{ + type = Number; + numberValue = value; +} + +void QScriptValuePrivate::initFromString(const QString &value) +{ + type = String; + stringValue = new QString(value); +} + +void QScriptValuePrivate::initFromJSCValue(QScriptValue &result, + QScriptEngine *engine, + JSC::JSValue value) +{ + Q_ASSERT(!result.isValid()); + result.d_ptr = new QScriptValuePrivate(); + result.d_ptr->engine = engine; + result.d_ptr->initFromJSCValue(value); + result.d_ptr->ref.ref(); +} + +bool QScriptValuePrivate::isJSC() const +{ + return (type == JSC); +} + +QScriptValuePrivate *QScriptValuePrivate::get(const QScriptValue &q) +{ + return q.d_ptr; +} + +namespace QScript +{ +JSC::UString qtStringToJSCUString(const QString &str); +QString qtStringFromJSCUString(const JSC::UString &str); +} + +QScriptValue QScriptValuePrivate::property(const QString &name, int resolveMode) const +{ + Q_ASSERT(type == JSC); + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine); + JSC::ExecState *exec = eng_p->globalObject->globalExec(); + JSC::UString jscName = QScript::qtStringToJSCUString(name); + JSC::Identifier id = JSC::Identifier(exec, jscName); + JSC::JSObject *object = jscValue.getObject(); + JSC::PropertySlot slot(const_cast<JSC::JSObject*>(object)); + JSC::JSValue result; + if (const_cast<JSC::JSObject*>(object)->getOwnPropertySlot(exec, id, slot)) { + result = slot.getValue(exec, id); + } else if ((resolveMode & QScriptValue::ResolvePrototype) + && const_cast<JSC::JSObject*>(object)->getPropertySlot(exec, id, slot)) { + result = slot.getValue(exec, id); + } + return eng_p->scriptValueFromJSCValue(result); +} + +QScriptValue QScriptValuePrivate::property(quint32 index, int resolveMode) const +{ + Q_ASSERT(type == JSC); + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine); + JSC::ExecState *exec = eng_p->globalObject->globalExec(); + JSC::JSObject *object = jscValue.getObject(); + JSC::PropertySlot slot(const_cast<JSC::JSObject*>(object)); + JSC::JSValue result; + if (const_cast<JSC::JSObject*>(object)->getOwnPropertySlot(exec, index, slot)) { + result = slot.getValue(exec, index); + } else if ((resolveMode & QScriptValue::ResolvePrototype) + && const_cast<JSC::JSObject*>(object)->getPropertySlot(exec, index, slot)) { + result = slot.getValue(exec, index); + } + return eng_p->scriptValueFromJSCValue(result); +} + /*! Constructs an invalid QScriptValue. */ @@ -195,11 +356,13 @@ QScriptValue::QScriptValue() QScriptValue::~QScriptValue() { if (d_ptr && !d_ptr->ref.deref()) { - if (engine()) { - QScriptEnginePrivate::get(engine())->unregisterValue(d_ptr); - } else { - delete d_ptr; + if (d_ptr->engine && d_ptr->isJSC() + && !JSC::JSImmediate::isImmediate(d_ptr->jscValue)) { + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d_ptr->engine); + if (d_ptr->jscValue != eng_p->globalObject) + eng_p->releaseJSCValue(d_ptr->jscValue); } + delete d_ptr; d_ptr = 0; } } @@ -225,14 +388,18 @@ QScriptValue::QScriptValue(const QScriptValue &other) registers it with the script \a engine. */ QScriptValue::QScriptValue(QScriptEngine *engine, QScriptValue::SpecialValue value) + : d_ptr(new QScriptValuePrivate) { - if (engine) { - QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine); - d_ptr = eng_p->registerValue(QScriptValueImpl(value)); - d_ptr->ref.ref(); - } else { - d_ptr = 0; + d_ptr->engine = engine; + switch (value) { + case NullValue: + d_ptr->initFromJSCValue(JSC::jsNull()); + break; + case UndefinedValue: + d_ptr->initFromJSCValue(JSC::jsUndefined()); + break; } + d_ptr->ref.ref(); } /*! @@ -244,14 +411,11 @@ QScriptValue::QScriptValue(QScriptEngine *engine, QScriptValue::SpecialValue val registers it with the script \a engine. */ QScriptValue::QScriptValue(QScriptEngine *engine, bool val) + : d_ptr(new QScriptValuePrivate) { - if (engine) { - QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine); - d_ptr = eng_p->registerValue(QScriptValueImpl(val)); - d_ptr->ref.ref(); - } else { - d_ptr = 0; - } + d_ptr->engine = engine; + d_ptr->initFromJSCValue(JSC::jsBoolean(val)); + d_ptr->ref.ref(); } /*! @@ -262,14 +426,21 @@ QScriptValue::QScriptValue(QScriptEngine *engine, bool val) registers it with the script \a engine. */ QScriptValue::QScriptValue(QScriptEngine *engine, int val) + : d_ptr(new QScriptValuePrivate) { + d_ptr->engine = engine; if (engine) { QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine); - d_ptr = eng_p->registerValue(QScriptValueImpl(val)); - d_ptr->ref.ref(); + JSC::ExecState *exec = eng_p->globalObject->globalExec(); + d_ptr->initFromJSCValue(JSC::jsNumber(exec, val)); } else { - d_ptr = 0; + JSC::JSValue immediate = JSC::JSImmediate::from(val); + if (immediate) + d_ptr->initFromJSCValue(immediate); + else + d_ptr->initFromNumber(val); } + d_ptr->ref.ref(); } /*! @@ -280,14 +451,21 @@ QScriptValue::QScriptValue(QScriptEngine *engine, int val) registers it with the script \a engine. */ QScriptValue::QScriptValue(QScriptEngine *engine, uint val) + : d_ptr(new QScriptValuePrivate) { + d_ptr->engine = engine; if (engine) { QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine); - d_ptr = eng_p->registerValue(QScriptValueImpl(val)); - d_ptr->ref.ref(); + JSC::ExecState *exec = eng_p->globalObject->globalExec(); + d_ptr->initFromJSCValue(JSC::jsNumber(exec, val)); } else { - d_ptr = 0; + JSC::JSValue immediate = JSC::JSImmediate::from(val); + if (immediate) + d_ptr->initFromJSCValue(immediate); + else + d_ptr->initFromNumber(val); } + d_ptr->ref.ref(); } /*! @@ -298,14 +476,21 @@ QScriptValue::QScriptValue(QScriptEngine *engine, uint val) registers it with the script \a engine. */ QScriptValue::QScriptValue(QScriptEngine *engine, qsreal val) + : d_ptr(new QScriptValuePrivate) { + d_ptr->engine = engine; if (engine) { QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine); - d_ptr = eng_p->registerValue(QScriptValueImpl(val)); - d_ptr->ref.ref(); + JSC::ExecState *exec = eng_p->globalObject->globalExec(); + d_ptr->initFromJSCValue(JSC::jsNumber(exec, val)); } else { - d_ptr = 0; + JSC::JSValue immediate = JSC::JSImmediate::from(val); + if (immediate) + d_ptr->initFromJSCValue(immediate); + else + d_ptr->initFromNumber(val); } + d_ptr->ref.ref(); } /*! @@ -316,16 +501,18 @@ QScriptValue::QScriptValue(QScriptEngine *engine, qsreal val) registers it with the script \a engine. */ QScriptValue::QScriptValue(QScriptEngine *engine, const QString &val) + : d_ptr(new QScriptValuePrivate) { + d_ptr->engine = engine; if (engine) { - QScriptValueImpl v; QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine); - eng_p->newString(&v, val); - d_ptr = eng_p->registerValue(v); - d_ptr->ref.ref(); + JSC::ExecState *exec = eng_p->globalObject->globalExec(); + JSC::UString jscVal = QScript::qtStringToJSCUString(val); + d_ptr->initFromJSCValue(JSC::jsString(exec, jscVal)); } else { - d_ptr = 0; + d_ptr->initFromString(val); } + d_ptr->ref.ref(); } /*! @@ -338,16 +525,17 @@ QScriptValue::QScriptValue(QScriptEngine *engine, const QString &val) #ifndef QT_NO_CAST_FROM_ASCII QScriptValue::QScriptValue(QScriptEngine *engine, const char *val) + : d_ptr(new QScriptValuePrivate) { + d_ptr->engine = engine; if (engine) { - QScriptValueImpl v; QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine); - eng_p->newString(&v, QString::fromAscii(val)); - d_ptr = eng_p->registerValue(v); - d_ptr->ref.ref(); + JSC::ExecState *exec = eng_p->globalObject->globalExec(); + d_ptr->initFromJSCValue(JSC::jsString(exec, val)); } else { - d_ptr = 0; + d_ptr->initFromString(QString::fromAscii(val)); } + d_ptr->ref.ref(); } #endif @@ -359,7 +547,15 @@ QScriptValue::QScriptValue(QScriptEngine *engine, const char *val) QScriptValue::QScriptValue(SpecialValue value) : d_ptr(new QScriptValuePrivate) { - d_ptr->value = QScriptValueImpl(value); + d_ptr->engine = 0; + switch (value) { + case NullValue: + d_ptr->initFromJSCValue(JSC::jsNull()); + break; + case UndefinedValue: + d_ptr->initFromJSCValue(JSC::jsUndefined()); + break; + } d_ptr->ref.ref(); } @@ -371,7 +567,8 @@ QScriptValue::QScriptValue(SpecialValue value) QScriptValue::QScriptValue(bool value) : d_ptr(new QScriptValuePrivate) { - d_ptr->value = QScriptValueImpl(value); + d_ptr->engine = 0; + d_ptr->initFromJSCValue(JSC::jsBoolean(value)); d_ptr->ref.ref(); } @@ -383,7 +580,12 @@ QScriptValue::QScriptValue(bool value) QScriptValue::QScriptValue(int value) : d_ptr(new QScriptValuePrivate) { - d_ptr->value = QScriptValueImpl(value); + d_ptr->engine = 0; + JSC::JSValue immediate = JSC::JSImmediate::from(value); + if (immediate) + d_ptr->initFromJSCValue(immediate); + else + d_ptr->initFromNumber(value); d_ptr->ref.ref(); } @@ -395,7 +597,12 @@ QScriptValue::QScriptValue(int value) QScriptValue::QScriptValue(uint value) : d_ptr(new QScriptValuePrivate) { - d_ptr->value = QScriptValueImpl(value); + d_ptr->engine = 0; + JSC::JSValue immediate = JSC::JSImmediate::from(value); + if (immediate) + d_ptr->initFromJSCValue(immediate); + else + d_ptr->initFromNumber(value); d_ptr->ref.ref(); } @@ -407,7 +614,12 @@ QScriptValue::QScriptValue(uint value) QScriptValue::QScriptValue(qsreal value) : d_ptr(new QScriptValuePrivate) { - d_ptr->value = QScriptValueImpl(value); + d_ptr->engine = 0; + JSC::JSValue immediate = JSC::JSImmediate::from(value); + if (immediate) + d_ptr->initFromJSCValue(immediate); + else + d_ptr->initFromNumber(value); d_ptr->ref.ref(); } @@ -419,8 +631,8 @@ QScriptValue::QScriptValue(qsreal value) QScriptValue::QScriptValue(const QString &value) : d_ptr(new QScriptValuePrivate) { - d_ptr->value.m_type = QScript::LazyStringType; - d_ptr->value.m_lazy_string_value = new QString(value); + d_ptr->engine = 0; + d_ptr->initFromString(value); d_ptr->ref.ref(); } @@ -432,8 +644,8 @@ QScriptValue::QScriptValue(const QString &value) QScriptValue::QScriptValue(const QLatin1String &value) : d_ptr(new QScriptValuePrivate) { - d_ptr->value.m_type = QScript::LazyStringType; - d_ptr->value.m_lazy_string_value = new QString(value); + d_ptr->engine = 0; + d_ptr->initFromString(value); d_ptr->ref.ref(); } @@ -447,8 +659,8 @@ QScriptValue::QScriptValue(const QLatin1String &value) QScriptValue::QScriptValue(const char *value) : d_ptr(new QScriptValuePrivate) { - d_ptr->value.m_type = QScript::LazyStringType; - d_ptr->value.m_lazy_string_value = new QString(QString::fromAscii(value)); + d_ptr->engine = 0; + d_ptr->initFromString(QString::fromAscii(value)); d_ptr->ref.ref(); } #endif @@ -465,11 +677,12 @@ QScriptValue &QScriptValue::operator=(const QScriptValue &other) if (d_ptr == other.d_ptr) return *this; if (d_ptr && !d_ptr->ref.deref()) { - if (engine()) { - QScriptEnginePrivate::get(engine())->unregisterValue(d_ptr); - } else { - delete d_ptr; + if (d_ptr->engine && d_ptr->isJSC() + && !JSC::JSImmediate::isImmediate(d_ptr->jscValue)) { + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d_ptr->engine); + eng_p->releaseJSCValue(d_ptr->jscValue); } + delete d_ptr; } d_ptr = other.d_ptr; if (d_ptr) @@ -486,7 +699,9 @@ QScriptValue &QScriptValue::operator=(const QScriptValue &other) bool QScriptValue::isError() const { Q_D(const QScriptValue); - return d && d->value.isError(); + if (!d || !d->isJSC() || !d->jscValue.isObject()) + return false; + return static_cast<JSC::JSObject*>(d->jscValue.getObject())->isObject(&JSC::ErrorInstance::info); } /*! @@ -498,7 +713,9 @@ bool QScriptValue::isError() const bool QScriptValue::isArray() const { Q_D(const QScriptValue); - return d && d->value.isArray(); + if (!d || !d->isJSC() || !d->jscValue.isObject()) + return false; + return static_cast<JSC::JSObject*>(d->jscValue.getObject())->isObject(&JSC::JSArray::info); } /*! @@ -510,7 +727,9 @@ bool QScriptValue::isArray() const bool QScriptValue::isDate() const { Q_D(const QScriptValue); - return d && d->value.isDate(); + if (!d || !d->isJSC() || !d->jscValue.isObject()) + return false; + return static_cast<JSC::JSObject*>(d->jscValue.getObject())->isObject(&JSC::DateInstance::info); } /*! @@ -522,7 +741,9 @@ bool QScriptValue::isDate() const bool QScriptValue::isRegExp() const { Q_D(const QScriptValue); - return d && d->value.isRegExp(); + if (!d || !d->isJSC() || !d->jscValue.isObject()) + return false; + return static_cast<JSC::JSObject*>(d->jscValue.getObject())->isObject(&JSC::RegExpObject::info); } /*! @@ -535,10 +756,10 @@ bool QScriptValue::isRegExp() const QScriptValue QScriptValue::prototype() const { Q_D(const QScriptValue); - if (!d || !d->value.isObject()) + if (!d || !d->isJSC() || !d->jscValue.isObject()) return QScriptValue(); - QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine()); - return eng->toPublic(d->value.prototype()); + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine); + return eng_p->scriptValueFromJSCValue(static_cast<JSC::JSObject*>(d->jscValue.getObject())->prototype()); } /*! @@ -555,7 +776,7 @@ QScriptValue QScriptValue::prototype() const void QScriptValue::setPrototype(const QScriptValue &prototype) { Q_D(QScriptValue); - if (!d || !d->value.isObject()) + if (!d || !d->isJSC() || !d->jscValue.isObject()) return; if (prototype.isValid() && prototype.engine() && (prototype.engine() != engine())) { @@ -564,38 +785,31 @@ void QScriptValue::setPrototype(const QScriptValue &prototype) "a different engine"); return; } - QScriptValueImpl was = d->value.prototype(); - d->value.setPrototype(d->value.engine()->toImpl(prototype)); - if (d->value.detectedCycle()) { - qWarning("QScriptValue::setPrototype() failed: " - "cyclic prototype value"); - d->value.setPrototype(was); - } + // ### check for cycle + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine); + JSC::JSValue other = eng_p->scriptValueToJSCValue(prototype); + static_cast<JSC::JSObject*>(d->jscValue.getObject())->setPrototype(other); } /*! - Returns the scope object of this QScriptValue. This function is only - relevant for function objects. The scope determines how variables are - resolved when the function is invoked. + \internal */ QScriptValue QScriptValue::scope() const { Q_D(const QScriptValue); - if (!d || !d->value.isObject()) + if (!d || !d->isJSC() || !d->jscValue.isObject()) return QScriptValue(); - QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine()); - return eng->toPublic(d->value.scope()); + // ### make hidden property + return d->property(QLatin1String("__qt_scope__"), QScriptValue::ResolveLocal); } /*! - Sets the \a scope object of this QScriptValue. This function is only - relevant for function objects. Changing the scope is useful when creating - closures; see \l{Nested Functions and the Scope Chain}. + \internal */ void QScriptValue::setScope(const QScriptValue &scope) { Q_D(QScriptValue); - if (!d || !d->value.isObject()) + if (!d || !d->isJSC() || !d->jscValue.isObject()) return; if (scope.isValid() && scope.engine() && (scope.engine() != engine())) { @@ -604,7 +818,11 @@ void QScriptValue::setScope(const QScriptValue &scope) "a different engine"); return; } - d->value.setScope(d->value.engine()->toImpl(scope)); + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine); + JSC::JSValue other = eng_p->scriptValueToJSCValue(scope); + JSC::ExecState *exec = eng_p->globalObject->globalExec(); + // ### make hidden property + static_cast<JSC::JSObject*>(d->jscValue.getObject())->putDirect(JSC::Identifier(exec, "__qt_scope__"), other); } /*! @@ -619,7 +837,7 @@ void QScriptValue::setScope(const QScriptValue &scope) bool QScriptValue::instanceOf(const QScriptValue &other) const { Q_D(const QScriptValue); - if (!isObject() || !other.isObject()) + if (!d || !d->isJSC() || !d->jscValue.isObject() || !other.isObject()) return false; if (other.engine() != engine()) { qWarning("QScriptValue::instanceof: " @@ -627,10 +845,168 @@ bool QScriptValue::instanceOf(const QScriptValue &other) const "a different engine"); return false; } - return d->value.engine()->toImpl(*this) - .instanceOf(d->value.engine()->toImpl(other)); + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine); + JSC::JSValue jscProto = eng_p->scriptValueToJSCValue(other.property(QLatin1String("prototype"))); + if (!jscProto) + return false; + JSC::ExecState *exec = eng_p->globalObject->globalExec(); + JSC::JSValue jscOther = eng_p->scriptValueToJSCValue(other); + return static_cast<JSC::JSObject*>(jscOther.getObject())->hasInstance(exec, d->jscValue, jscProto); } +// ### move + +namespace QScript +{ + +enum Type { + Undefined, + Null, + Boolean, + String, + Number, + Object +}; + +static Type type(const QScriptValue &v) +{ + if (v.isUndefined()) + return Undefined; + else if (v.isNull()) + return Null; + else if (v.isBoolean()) + return Boolean; + else if (v.isString()) + return String; + else if (v.isNumber()) + return Number; + Q_ASSERT(v.isObject()); + return Object; +} + +QScriptValue ToPrimitive(const QScriptValue &object, JSC::PreferredPrimitiveType hint = JSC::NoPreference) +{ + Q_ASSERT(object.isObject()); + QScriptValuePrivate *pp = QScriptValuePrivate::get(object); + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(pp->engine); + JSC::ExecState *exec = eng_p->globalObject->globalExec(); + return eng_p->scriptValueFromJSCValue(static_cast<JSC::JSObject*>(pp->jscValue.getObject())->toPrimitive(exec, hint)); +} + +static bool IsNumerical(const QScriptValue &value) +{ + return value.isNumber() || value.isBool(); +} + +static bool LessThan(QScriptValue lhs, QScriptValue rhs) +{ + if (type(lhs) == type(rhs)) { + switch (type(lhs)) { + case Undefined: + case Null: + return false; + + case Number: +#if defined Q_CC_MSVC && !defined Q_CC_MSVC_NET + if (qIsNaN(lhs.toNumber()) || qIsNaN(rhs.toNumber())) + return false; +#endif + return lhs.toNumber() < rhs.toNumber(); + + case Boolean: + return lhs.toBool() < rhs.toBool(); + + case String: + return lhs.toString() < rhs.toString(); + + case Object: + break; + } // switch + } + + if (lhs.isObject()) + lhs = ToPrimitive(lhs, JSC::PreferNumber); + + if (rhs.isObject()) + rhs = ToPrimitive(rhs, JSC::PreferNumber); + + if (lhs.isString() && rhs.isString()) + return lhs.toString() < rhs.toString(); + + qsreal n1 = lhs.toNumber(); + qsreal n2 = rhs.toNumber(); +#if defined Q_CC_MSVC && !defined Q_CC_MSVC_NET + if (qIsNaN(n1) || qIsNaN(n2)) + return false; +#endif + return n1 < n2; +} + +static bool Equals(QScriptValue lhs, QScriptValue rhs) +{ + if (type(lhs) == type(rhs)) { + switch (type(lhs)) { + case QScript::Undefined: + case QScript::Null: + return true; + + case QScript::Number: + return lhs.toNumber() == rhs.toNumber(); + + case QScript::Boolean: + return lhs.toBool() == rhs.toBool(); + + case QScript::String: + return lhs.toString() == rhs.toString(); + + case QScript::Object: + if (lhs.isVariant()) + return lhs.strictlyEquals(rhs) || (lhs.toVariant() == rhs.toVariant()); +#ifndef QT_NO_QOBJECT + else if (lhs.isQObject()) + return (lhs.strictlyEquals(rhs)) || (lhs.toQObject() == rhs.toQObject()); +#endif + else + return lhs.strictlyEquals(rhs); + } + } + + if (lhs.isNull() && rhs.isUndefined()) + return true; + + else if (lhs.isUndefined() && rhs.isNull()) + return true; + + else if (IsNumerical(lhs) && rhs.isString()) + return lhs.toNumber() == rhs.toNumber(); + + else if (lhs.isString() && IsNumerical(rhs)) + return lhs.toNumber() == rhs.toNumber(); + + else if (lhs.isBool()) + return Equals(lhs.toNumber(), rhs); + + else if (rhs.isBool()) + return Equals(lhs, rhs.toNumber()); + + else if (lhs.isObject() && !rhs.isNull()) { + lhs = ToPrimitive(lhs); + + if (lhs.isValid() && !lhs.isObject()) + return Equals(lhs, rhs); + } + + else if (rhs.isObject() && ! lhs.isNull()) { + rhs = ToPrimitive(rhs); + if (rhs.isValid() && !rhs.isObject()) + return Equals(lhs, rhs); + } + + return false; +} + +} // namespace QScript + /*! Returns true if this QScriptValue is less than \a other, otherwise returns false. The comparison follows the behavior described in @@ -647,6 +1023,7 @@ bool QScriptValue::instanceOf(const QScriptValue &other) const */ bool QScriptValue::lessThan(const QScriptValue &other) const { + // no equivalent function in JSC? There's a jsLess() in VM/Machine.cpp if (!isValid() || !other.isValid()) return false; if (other.engine() && engine() && (other.engine() != engine())) { @@ -655,8 +1032,7 @@ bool QScriptValue::lessThan(const QScriptValue &other) const "a different engine"); return false; } - return QScriptEnginePrivate::lessThan(QScriptValuePrivate::valueOf(*this), - QScriptValuePrivate::valueOf(other)); + return QScript::LessThan(*this, other); } /*! @@ -685,16 +1061,29 @@ bool QScriptValue::lessThan(const QScriptValue &other) const */ bool QScriptValue::equals(const QScriptValue &other) const { - if (!isValid() || !other.isValid()) - return isValid() == other.isValid(); + Q_D(const QScriptValue); + if (!d || !other.d_ptr) + return (d == other.d_ptr); if (other.engine() && engine() && (other.engine() != engine())) { qWarning("QScriptValue::equals: " "cannot compare to a value created in " "a different engine"); return false; } - return QScriptEnginePrivate::equals(QScriptValuePrivate::valueOf(*this), - QScriptValuePrivate::valueOf(other)); + if (d->isJSC() && other.d_ptr->isJSC()) { + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine); + if (!eng_p) + eng_p = QScriptEnginePrivate::get(other.d_ptr->engine); + if (eng_p) { + JSC::ExecState *exec = eng_p->globalObject->globalExec(); + Q_ASSERT_X(false, Q_FUNC_INFO, "implement me"); +#if 0 + if (JSC::equal(exec, d->jscValue, other.d_ptr->jscValue)) + return true; +#endif + } + } + return QScript::Equals(*this, other); } /*! @@ -721,16 +1110,26 @@ bool QScriptValue::equals(const QScriptValue &other) const */ bool QScriptValue::strictlyEquals(const QScriptValue &other) const { - if (!isValid() || !other.isValid()) - return isValid() == other.isValid(); + Q_D(const QScriptValue); + if (!d || !other.d_ptr) + return (d == other.d_ptr); if (other.engine() && engine() && (other.engine() != engine())) { qWarning("QScriptValue::strictlyEquals: " "cannot compare to a value created in " "a different engine"); return false; } - return QScriptEnginePrivate::strictlyEquals(QScriptValuePrivate::valueOf(*this), - QScriptValuePrivate::valueOf(other)); + if (d->type != other.d_ptr->type) + return false; + switch (d->type) { + case QScriptValuePrivate::JSC: + return JSC::JSValue::strictEqual(d->jscValue, other.d_ptr->jscValue); + case QScriptValuePrivate::Number: + return (d->numberValue == other.d_ptr->numberValue); + case QScriptValuePrivate::String: + return (*d->stringValue == *other.d_ptr->stringValue); + } + return false; } /*! @@ -750,7 +1149,19 @@ QString QScriptValue::toString() const Q_D(const QScriptValue); if (!d) return QString(); - return d->value.toString(); + switch (d->type) { + case QScriptValuePrivate::JSC: { + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine); + JSC::ExecState *exec = eng_p ? eng_p->globalObject->globalExec() : 0; + JSC::UString str = d->jscValue.toString(exec); + return QString(reinterpret_cast<const QChar*>(str.data()), str.size()); + } + case QScriptValuePrivate::Number: + return QScript::qtStringFromJSCUString(JSC::UString::from(d->numberValue)); + case QScriptValuePrivate::String: + return *d->stringValue; + } + return QString(); } /*! @@ -770,7 +1181,18 @@ qsreal QScriptValue::toNumber() const Q_D(const QScriptValue); if (!d) return 0; - return d->value.toNumber(); + switch (d->type) { + case QScriptValuePrivate::JSC: { + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine); + JSC::ExecState *exec = eng_p ? eng_p->globalObject->globalExec() : 0; + return d->jscValue.toNumber(exec); + } + case QScriptValuePrivate::Number: + return d->numberValue; + case QScriptValuePrivate::String: + return QScript::qtStringToJSCUString(*d->stringValue).toDouble(); + } + return 0; } /*! @@ -783,7 +1205,18 @@ bool QScriptValue::toBoolean() const Q_D(const QScriptValue); if (!d) return false; - return d->value.toBoolean(); + switch (d->type) { + case QScriptValuePrivate::JSC: { + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine); + JSC::ExecState *exec = eng_p ? eng_p->globalObject->globalExec() : 0; + return d->jscValue.toBoolean(exec); + } + case QScriptValuePrivate::Number: + return (d->numberValue != 0) && !qIsNaN(d->numberValue); + case QScriptValuePrivate::String: + return (d->stringValue->length() != 0); + } + return false; } /*! @@ -805,7 +1238,18 @@ bool QScriptValue::toBool() const Q_D(const QScriptValue); if (!d) return false; - return d->value.toBoolean(); + switch (d->type) { + case QScriptValuePrivate::JSC: { + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine); + JSC::ExecState *exec = eng_p ? eng_p->globalObject->globalExec() : 0; + return d->jscValue.toBoolean(exec); + } + case QScriptValuePrivate::Number: + return (d->numberValue != 0) && !qIsNaN(d->numberValue); + case QScriptValuePrivate::String: + return (d->stringValue->length() != 0); + } + return false; } /*! @@ -825,7 +1269,18 @@ qint32 QScriptValue::toInt32() const Q_D(const QScriptValue); if (!d) return 0; - return d->value.toInt32(); + switch (d->type) { + case QScriptValuePrivate::JSC: { + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine); + JSC::ExecState *exec = eng_p ? eng_p->globalObject->globalExec() : 0; + return d->jscValue.toInt32(exec); + } + case QScriptValuePrivate::Number: + return QScript::ToInt32(d->numberValue); + case QScriptValuePrivate::String: + return QScript::ToInt32(QScript::qtStringToJSCUString(*d->stringValue).toDouble()); + } + return 0; } /*! @@ -845,7 +1300,18 @@ quint32 QScriptValue::toUInt32() const Q_D(const QScriptValue); if (!d) return 0; - return d->value.toUInt32(); + switch (d->type) { + case QScriptValuePrivate::JSC: { + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine); + JSC::ExecState *exec = eng_p ? eng_p->globalObject->globalExec() : 0; + return d->jscValue.toUInt32(exec); + } + case QScriptValuePrivate::Number: + return QScript::ToUint32(d->numberValue); + case QScriptValuePrivate::String: + return QScript::ToUint32(QScript::qtStringToJSCUString(*d->stringValue).toDouble()); + } + return 0; } /*! @@ -865,7 +1331,17 @@ quint16 QScriptValue::toUInt16() const Q_D(const QScriptValue); if (!d) return 0; - return d->value.toUInt16(); + switch (d->type) { + case QScriptValuePrivate::JSC: { + // no equivalent function in JSC + return QScript::ToUint16(toNumber()); + } + case QScriptValuePrivate::Number: + return QScript::ToUint16(d->numberValue); + case QScriptValuePrivate::String: + return QScript::ToUint16(QScript::qtStringToJSCUString(*d->stringValue).toDouble()); + } + return 0; } /*! @@ -885,7 +1361,18 @@ qsreal QScriptValue::toInteger() const Q_D(const QScriptValue); if (!d) return 0; - return d->value.toInteger(); + switch (d->type) { + case QScriptValuePrivate::JSC: { + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine); + JSC::ExecState *exec = eng_p ? eng_p->globalObject->globalExec() : 0; + return d->jscValue.toInteger(exec); + } + case QScriptValuePrivate::Number: + return QScript::ToInteger(d->numberValue); + case QScriptValuePrivate::String: + return QScript::ToInteger(QScript::qtStringToJSCUString(*d->stringValue).toDouble()); + } + return 0; } /*! @@ -915,7 +1402,43 @@ QVariant QScriptValue::toVariant() const Q_D(const QScriptValue); if (!d) return QVariant(); - return d->value.toVariant(); + switch (d->type) { + case QScriptValuePrivate::JSC: + if (isObject()) { + if (isVariant()) + return static_cast<QScript::QVariantWrapperObject*>(d->jscValue.getObject())->value(); +#ifndef QT_NO_QOBJECT + else if (isQObject()) + return qVariantFromValue(toQObject()); +#endif + else if (isDate()) + return QVariant(toDateTime()); +#ifndef QT_NO_REGEXP + else if (isRegExp()) + return QVariant(toRegExp()); +#endif + else if (isArray()) + return QScriptEnginePrivate::variantListFromArray(*this); + // try to convert to primitive + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine()); + JSC::ExecState *exec = eng_p->globalObject->globalExec(); + JSC::JSValue prim = d->jscValue.toPrimitive(exec); + if (!prim.isObject()) + return eng_p->scriptValueFromJSCValue(prim).toVariant(); + } else if (isNumber()) { + return QVariant(toNumber()); + } else if (isString()) { + return QVariant(toString()); + } else if (isBool()) { + return QVariant(toBool()); + } + return QVariant(); + case QScriptValuePrivate::Number: + return QVariant(d->numberValue); + case QScriptValuePrivate::String: + return QVariant(*d->stringValue); + } + return QVariant(); } /*! @@ -926,12 +1449,22 @@ QVariant QScriptValue::toVariant() const QScriptValue QScriptValue::toObject() const { Q_D(const QScriptValue); - if (!d) + if (!d || !d->engine) return QScriptValue(); - QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine()); - if (!eng) - return QScriptValue(); - return eng->toPublic(eng->toObject(d->value)); + switch (d->type) { + case QScriptValuePrivate::JSC: { + if (JSC::JSImmediate::isUndefinedOrNull(d->jscValue)) + return QScriptValue(); + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine); + JSC::ExecState *exec = eng_p->globalObject->globalExec(); + return eng_p->scriptValueFromJSCValue(d->jscValue.toObject(exec)); + } + case QScriptValuePrivate::Number: + case QScriptValuePrivate::String: + Q_ASSERT_X(false, Q_FUNC_INFO, "you should not get here"); + break; + } + return QScriptValue(); } /*! @@ -944,9 +1477,10 @@ QScriptValue QScriptValue::toObject() const QDateTime QScriptValue::toDateTime() const { Q_D(const QScriptValue); - if (!d) + if (!isDate()) return QDateTime(); - return d->value.toDateTime(); + qsreal t = static_cast<JSC::DateInstance*>(d->jscValue.getObject())->internalNumber(); + return QScript::ToDateTime(t, Qt::LocalTime); } #ifndef QT_NO_REGEXP @@ -960,9 +1494,13 @@ QDateTime QScriptValue::toDateTime() const QRegExp QScriptValue::toRegExp() const { Q_D(const QScriptValue); - if (!d) + if (!isRegExp()) return QRegExp(); - return d->value.toRegExp(); + QString pattern = d->property(QLatin1String("source"), QScriptValue::ResolvePrototype).toString(); + Qt::CaseSensitivity kase = Qt::CaseSensitive; + if (d->property(QLatin1String("ignoreCase"), QScriptValue::ResolvePrototype).toBool()) + kase = Qt::CaseInsensitive; + return QRegExp(pattern, kase, QRegExp::RegExp2); } #endif // QT_NO_REGEXP @@ -979,9 +1517,15 @@ QRegExp QScriptValue::toRegExp() const QObject *QScriptValue::toQObject() const { Q_D(const QScriptValue); - if (!d) - return 0; - return d->value.toQObject(); + if (isQObject()) { + return static_cast<QScript::QObjectWrapperObject*>(d->jscValue.getObject())->value(); + } else if (isVariant()) { + QVariant var = toVariant(); + int type = var.userType(); + if ((type == QMetaType::QObjectStar) || (type == QMetaType::QWidgetStar)) + return *reinterpret_cast<QObject* const *>(var.constData()); + } + return 0; } /*! @@ -992,10 +1536,11 @@ QObject *QScriptValue::toQObject() const */ const QMetaObject *QScriptValue::toQMetaObject() const { - Q_D(const QScriptValue); - if (!d) - return 0; - return d->value.toQMetaObject(); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); +// Q_D(const QScriptValue); +// if (isQMetaObject()) +// return static_cast<QScript::QMetaObjectWrapperObject*>(d->jscValue)->value(); + return 0; } /*! @@ -1026,7 +1571,7 @@ void QScriptValue::setProperty(const QString &name, const QScriptValue &value, const PropertyFlags &flags) { Q_D(QScriptValue); - if (!d || !d->value.isObject()) + if (!d || !d->isJSC() || !d->jscValue.isObject()) return; if (value.engine() && (value.engine() != engine())) { qWarning("QScriptValue::setProperty(%s) failed: " @@ -1034,7 +1579,40 @@ void QScriptValue::setProperty(const QString &name, const QScriptValue &value, qPrintable(name)); return; } - d->value.setProperty(name, d->value.engine()->toImpl(value), flags); + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine); + JSC::JSValue jscValue = eng_p->scriptValueToJSCValue(value); + JSC::UString jscName = QScript::qtStringToJSCUString(name); + JSC::ExecState *exec = eng_p->globalObject->globalExec(); + JSC::Identifier id = JSC::Identifier(exec, jscName); + if (!jscValue) { + static_cast<JSC::JSObject*>(d->jscValue.getObject())->deleteProperty(exec, id); + } else { + if ((flags & QScriptValue::PropertyGetter) || (flags & QScriptValue::PropertySetter)) { + if (jscValue.isObject()) { + if (flags & QScriptValue::PropertyGetter) + static_cast<JSC::JSObject*>(d->jscValue.getObject())->defineGetter(exec, id, static_cast<JSC::JSObject*>(jscValue.getObject())); + if (flags & QScriptValue::PropertySetter) + static_cast<JSC::JSObject*>(d->jscValue.getObject())->defineSetter(exec, id, static_cast<JSC::JSObject*>(jscValue.getObject())); + } + } else { + if (flags != QScriptValue::KeepExistingFlags) { + if (static_cast<JSC::JSObject*>(d->jscValue.getObject())->hasOwnProperty(exec, id)) + static_cast<JSC::JSObject*>(d->jscValue.getObject())->deleteProperty(exec, id); + unsigned attribs = 0; + if (flags & QScriptValue::ReadOnly) + attribs |= JSC::ReadOnly; + if (flags & QScriptValue::SkipInEnumeration) + attribs |= JSC::DontEnum; + if (flags & QScriptValue::Undeletable) + attribs |= JSC::DontDelete; + attribs |= flags & QScriptValue::UserRange; + static_cast<JSC::JSObject*>(d->jscValue.getObject())->putWithAttributes(exec, id, jscValue, attribs); + } else { + JSC::PutPropertySlot slot; + static_cast<JSC::JSObject*>(d->jscValue.getObject())->put(exec, id, jscValue, slot); + } + } + } } /*! @@ -1056,10 +1634,9 @@ QScriptValue QScriptValue::property(const QString &name, const ResolveFlags &mode) const { Q_D(const QScriptValue); - if (!d || !d->value.isObject()) + if (!d || !d->isJSC() || !d->jscValue.isObject()) return QScriptValue(); - QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine()); - return eng->toPublic(d->value.property(name, mode)); + return d->property(name, mode); } /*! @@ -1079,10 +1656,9 @@ QScriptValue QScriptValue::property(quint32 arrayIndex, const ResolveFlags &mode) const { Q_D(const QScriptValue); - if (!d || !d->value.isObject()) + if (!d || !d->isJSC() || !d->jscValue.isObject()) return QScriptValue(); - QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine()); - return eng->toPublic(d->value.property(arrayIndex, mode)); + return d->property(arrayIndex, mode); } /*! @@ -1100,15 +1676,40 @@ QScriptValue QScriptValue::property(quint32 arrayIndex, void QScriptValue::setProperty(quint32 arrayIndex, const QScriptValue &value, const PropertyFlags &flags) { - Q_D(QScriptValue); - if (!d || !d->value.isObject()) + Q_D(const QScriptValue); + if (!d || !d->isJSC() || !d->jscValue.isObject()) return; if (value.engine() && (value.engine() != engine())) { qWarning("QScriptValue::setProperty() failed: " "cannot set value created in a different engine"); return; } - d->value.setProperty(arrayIndex, d->value.engine()->toImpl(value), flags); + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine); + JSC::ExecState *exec = eng_p->globalObject->globalExec(); + JSC::JSValue jscValue = eng_p->scriptValueToJSCValue(value); + if (!jscValue) { + static_cast<JSC::JSObject*>(d->jscValue.getObject())->deleteProperty(exec, arrayIndex); + } else { + if ((flags & QScriptValue::PropertyGetter) || (flags & QScriptValue::PropertySetter)) { + Q_ASSERT_X(false, Q_FUNC_INFO, "property getters and setters not implemented"); + } else { + if (flags != QScriptValue::KeepExistingFlags) { +// if (static_cast<JSC::JSObject*>(d->jscValue->getObject())->hasOwnProperty(exec, arrayIndex)) +// static_cast<JSC::JSObject*>(d->jscValue->getObject())->deleteProperty(exec, arrayIndex); + unsigned attribs = 0; + if (flags & QScriptValue::ReadOnly) + attribs |= JSC::ReadOnly; + if (flags & QScriptValue::SkipInEnumeration) + attribs |= JSC::DontEnum; + if (flags & QScriptValue::Undeletable) + attribs |= JSC::DontDelete; + attribs |= flags & QScriptValue::UserRange; + static_cast<JSC::JSObject*>(d->jscValue.getObject())->putWithAttributes(exec, arrayIndex, jscValue, attribs); + } else { + static_cast<JSC::JSObject*>(d->jscValue.getObject())->put(exec, arrayIndex, jscValue); + } + } + } } /*! @@ -1126,14 +1727,8 @@ void QScriptValue::setProperty(quint32 arrayIndex, const QScriptValue &value, QScriptValue QScriptValue::property(const QScriptString &name, const ResolveFlags &mode) const { - Q_D(const QScriptValue); - if (!d || !d->value.isObject()) - return QScriptValue(); - if (!name.isValid()) - return QScriptValue(); - QScriptStringPrivate *s = QScriptStringPrivate::get(name); - QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine()); - return eng->toPublic(d->value.property(s->nameId, mode)); + // ### simplified for now + return property(name.toString(), mode); } /*! @@ -1153,16 +1748,8 @@ void QScriptValue::setProperty(const QScriptString &name, const QScriptValue &value, const PropertyFlags &flags) { - Q_D(QScriptValue); - if (!d || !d->value.isObject() || !name.isValid()) - return; - if (value.engine() && (value.engine() != engine())) { - qWarning("QScriptValue::setProperty() failed: " - "cannot set value created in a different engine"); - return; - } - QScriptStringPrivate *s = QScriptStringPrivate::get(name); - d->value.setProperty(s->nameId, d->value.engine()->toImpl(value), flags); + // ### simplified for now + setProperty(name.toString(), value, flags); } /*! @@ -1175,9 +1762,35 @@ QScriptValue::PropertyFlags QScriptValue::propertyFlags(const QString &name, const ResolveFlags &mode) const { Q_D(const QScriptValue); - if (!d) + if (!isObject()) + return 0; + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine); + JSC::ExecState *exec = eng_p->globalObject->globalExec(); + JSC::UString jscName = QScript::qtStringToJSCUString(name); + JSC::Identifier id = JSC::Identifier(exec, jscName); + unsigned attribs = 0; + if (!static_cast<JSC::JSObject*>(d->jscValue.getObject())->getPropertyAttributes(exec, id, attribs)) return 0; - return d->value.propertyFlags(name, mode); + QScriptValue::PropertyFlags result = 0; + if (attribs & JSC::ReadOnly) + result |= QScriptValue::ReadOnly; + if (attribs & JSC::DontEnum) + result |= QScriptValue::SkipInEnumeration; + if (attribs & JSC::DontDelete) + result |= QScriptValue::Undeletable; + +// ### FIXME + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); +#if 0 + // ### faster/better way? + if (static_cast<JSC::JSObject*>(d->jscValue.getObject())->lookupGetter(exec, id) != 0) + result |= QScriptValue::PropertyGetter; + if (static_cast<JSC::JSObject*>(d->jscValue.getObject())->lookupSetter(exec, id) != 0) + result |= QScriptValue::PropertySetter; +#endif + + result |= QScriptValue::PropertyFlag(attribs & QScriptValue::UserRange); + return result; } /*! @@ -1191,13 +1804,8 @@ QScriptValue::PropertyFlags QScriptValue::propertyFlags(const QString &name, QScriptValue::PropertyFlags QScriptValue::propertyFlags(const QScriptString &name, const ResolveFlags &mode) const { - Q_D(const QScriptValue); - if (!d) - return 0; - if (!name.isValid()) - return 0; - QScriptStringPrivate *s = QScriptStringPrivate::get(name); - return d->value.propertyFlags(s->nameId, mode); + // ### simplified for now + return propertyFlags(name.toString(), mode); } /*! @@ -1226,19 +1834,28 @@ QScriptValue::PropertyFlags QScriptValue::propertyFlags(const QScriptString &nam QScriptValue QScriptValue::call(const QScriptValue &thisObject, const QScriptValueList &args) { - Q_D(QScriptValue); - if (!d || !d->value.isObject()) - return QScriptValue(); - if (isFunction() && thisObject.isValid() && thisObject.engine() && - engine() && (thisObject.engine() != engine())) { - qWarning("QScriptValue::call() failed: " - "cannot call function with thisObject created in " - "a different engine"); + Q_D(const QScriptValue); + if (!isFunction()) return QScriptValue(); + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine); + JSC::ExecState *exec = eng_p->globalObject->globalExec(); + JSC::ArgList jscArgs; + for (int i = 0; i < args.size(); ++i) { + Q_ASSERT_X(false, Q_FUNC_INFO, "implement me"); +#if 0 + if (!args.at(i).isValid()) + jscArgs.append(JSC::jsUndefined()); + else + jscArgs.append(eng_p->scriptValueToJSCValue(args.at(i))); +#endif } - QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine()); - return eng->toPublic(d->value.call(eng->toImpl(thisObject), - eng->toImplList(args))); + JSC::JSValue jscThisObject = eng_p->scriptValueToJSCValue(thisObject); + if (!jscThisObject || !jscThisObject.isObject()) + jscThisObject = eng_p->globalObject; + JSC::JSValue result = static_cast<JSC::JSFunction*>(JSC::asFunction(d->jscValue))->call(exec, jscThisObject, jscArgs); + if (exec->hadException()) + result = exec->exception(); + return eng_p->scriptValueFromJSCValue(result); } /*! @@ -1268,18 +1885,41 @@ QScriptValue QScriptValue::call(const QScriptValue &thisObject, const QScriptValue &arguments) { Q_D(QScriptValue); - if (!d || !d->value.isObject()) - return QScriptValue(); - if (isFunction() && thisObject.isValid() && thisObject.engine() - && (thisObject.engine() != engine())) { - qWarning("QScriptValue::call() failed: " - "cannot call function with thisObject created in " - "a different engine"); + if (!isFunction()) return QScriptValue(); + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine); + JSC::ExecState *exec = eng_p->globalObject->globalExec(); + + JSC::JSValue jscThisObject = eng_p->scriptValueToJSCValue(thisObject); + if (!jscThisObject || !jscThisObject.isObject()) + jscThisObject = eng_p->globalObject; + + Q_ASSERT_X(false, Q_FUNC_INFO, "implement me"); +#if 0 + // copied from kjs/FunctionPrototype.cpp, functionProtoFuncApply() + JSC::JSValue argArray = eng_p->scriptValueToJSCValue(arguments); + JSC::ArgList applyArgs; + if (!argArray.isUndefinedOrNull()) { + if (argArray.isObject()) { + if (static_cast<JSC::JSObject*>(argArray.getObject())->classInfo() == &JSC::Arguments::info) + static_cast<JSC::Arguments*>(asArguments(argArray))->fillArgList(exec, applyArgs); + else if (exec->interpreter()->isJSArray(argArray)) + static_cast<JSC::JSArray*>(JSC::asArray(argArray))->fillArgList(exec, applyArgs); + else if (static_cast<JSC::JSObject*>(argArray.getObject())->inherits(&JSC::JSArray::info)) { + unsigned length = static_cast<JSC::JSObject*>(argArray.getObject())->get(exec, exec->propertyNames().length)->toUInt32(exec); + for (unsigned i = 0; i < length; ++i) + applyArgs.append(static_cast<JSC::JSObject*>(argArray.getObject())->get(exec, i)); + } else + return QScriptValue(); // ### throwError(exec, TypeError); + } else + return QScriptValue(); // ### throwError(exec, TypeError); } - QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine()); - return eng->toPublic(d->value.call(eng->toImpl(thisObject), - eng->toImpl(arguments))); + + JSC::JSValue result = static_cast<JSC::JSFunction*>(asFunction(d->jscValue))->call(exec, jscThisObject, applyArgs); + if (exec->hadException()) + result = exec->exception(); + return eng_p->scriptValueFromJSCValue(result); +#endif } /*! @@ -1302,11 +1942,25 @@ QScriptValue QScriptValue::call(const QScriptValue &thisObject, */ QScriptValue QScriptValue::construct(const QScriptValueList &args) { - Q_D(QScriptValue); - if (!d || !d->value.isObject()) + Q_D(const QScriptValue); + if (!isFunction()) return QScriptValue(); - QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine()); - return eng->toPublic(d->value.construct(eng->toImplList(args))); + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine); + JSC::ExecState *exec = eng_p->globalObject->globalExec(); + JSC::ArgList jscArgs; + for (int i = 0; i < args.size(); ++i) { +#if 0 + Q_ASSERT_X(false, Q_FUNC_INFO, "implement me"); + if (!args.at(i).isValid()) + jscArgs.append(JSC::jsUndefined()); + else + jscArgs.append(eng_p->scriptValueToJSCValue(args.at(i))); +#endif + } + JSC::JSValue result = static_cast<JSC::JSFunction*>(asFunction(d->jscValue))->construct(exec, jscArgs); + if (exec->hadException()) + result = exec->exception(); + return eng_p->scriptValueFromJSCValue(result); } /*! @@ -1327,10 +1981,37 @@ QScriptValue QScriptValue::construct(const QScriptValueList &args) QScriptValue QScriptValue::construct(const QScriptValue &arguments) { Q_D(QScriptValue); - if (!d || !d->value.isObject()) + if (!isFunction()) return QScriptValue(); - QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine()); - return eng->toPublic(d->value.construct(eng->toImpl(arguments))); + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine); + JSC::ExecState *exec = eng_p->globalObject->globalExec(); + + Q_ASSERT_X(false, Q_FUNC_INFO, "implement me"); +#if 0 + // copied from kjs/FunctionPrototype.cpp, functionProtoFuncApply() + JSC::JSValue argArray = eng_p->scriptValueToJSCValue(arguments); + JSC::ArgList applyArgs; + if (!argArray.isUndefinedOrNull()) { + if (argArray.isObject()) { + if (static_cast<JSC::JSObject*>(argArray.getObject())->classInfo() == &JSC::Arguments::info) + static_cast<JSC::Arguments*>(JSC::asArguments(argArray))->fillArgList(exec, applyArgs); + else if (exec->interpreter()->isJSArray(argArray)) + static_cast<JSC::JSArray*>(JSC::asArray(argArray))->fillArgList(exec, applyArgs); + else if (static_cast<JSC::JSObject*>(argArray.getObject())->inherits(&JSC::JSArray::info)) { + unsigned length = static_cast<JSC::JSObject*>(argArray.getObject())->get(exec, exec->propertyNames().length)->toUInt32(exec); + for (unsigned i = 0; i < length; ++i) + applyArgs.append(static_cast<JSC::JSObject*>(argArray.getObject())->get(exec, i)); + } else + return QScriptValue(); // ### throwError(exec, TypeError); + } else + return QScriptValue(); // ### throwError(exec, TypeError); + } + + JSC::JSValue result = static_cast<JSC::JSFunction*>(JSC::asFunction(d->jscValue))->construct(exec, applyArgs); + if (exec->hadException()) + result = exec->exception(); + return eng_p->scriptValueFromJSCValue(result); +#endif } /*! @@ -1354,7 +2035,7 @@ QScriptEngine *QScriptValue::engine() const bool QScriptValue::isBoolean() const { Q_D(const QScriptValue); - return d && d->value.isBoolean(); + return d && d->isJSC() && d->jscValue.isBoolean(); } /*! @@ -1368,7 +2049,7 @@ bool QScriptValue::isBoolean() const bool QScriptValue::isBool() const { Q_D(const QScriptValue); - return d && d->value.isBoolean(); + return d && d->isJSC() && d->jscValue.isBoolean(); } /*! @@ -1380,7 +2061,17 @@ bool QScriptValue::isBool() const bool QScriptValue::isNumber() const { Q_D(const QScriptValue); - return d && d->value.isNumber(); + if (!d) + return false; + switch (d->type) { + case QScriptValuePrivate::JSC: + return d->jscValue.isNumber(); + case QScriptValuePrivate::Number: + return true; + case QScriptValuePrivate::String: + return false; + } + return false; } /*! @@ -1392,7 +2083,17 @@ bool QScriptValue::isNumber() const bool QScriptValue::isString() const { Q_D(const QScriptValue); - return d && d->value.isString(); + if (!d) + return false; + switch (d->type) { + case QScriptValuePrivate::JSC: + return d->jscValue.isString(); + case QScriptValuePrivate::Number: + return false; + case QScriptValuePrivate::String: + return true; + } + return false; } /*! @@ -1404,7 +2105,10 @@ bool QScriptValue::isString() const bool QScriptValue::isFunction() const { Q_D(const QScriptValue); - return d && d->value.isFunction(); + if (!d || !d->isJSC() || !d->jscValue.isObject()) + return false; + JSC::CallData callData; + return (static_cast<JSC::JSObject*>(d->jscValue.getObject())->getCallData(callData) != JSC::CallTypeNone); } /*! @@ -1416,7 +2120,7 @@ bool QScriptValue::isFunction() const bool QScriptValue::isNull() const { Q_D(const QScriptValue); - return d && d->value.isNull(); + return d && d->isJSC() && d->jscValue.isNull(); } /*! @@ -1428,7 +2132,7 @@ bool QScriptValue::isNull() const bool QScriptValue::isUndefined() const { Q_D(const QScriptValue); - return d && d->value.isUndefined(); + return d && d->isJSC() && d->jscValue.isUndefined(); } /*! @@ -1443,7 +2147,7 @@ bool QScriptValue::isUndefined() const bool QScriptValue::isObject() const { Q_D(const QScriptValue); - return d && d->value.isObject(); + return d && d->isJSC() && d->jscValue.isObject(); } /*! @@ -1455,7 +2159,9 @@ bool QScriptValue::isObject() const bool QScriptValue::isVariant() const { Q_D(const QScriptValue); - return d && d->value.isVariant(); + if (!d || !d->isJSC() || !d->jscValue.isObject()) + return false; + return static_cast<JSC::JSObject*>(d->jscValue.getObject())->isObject(&QScript::QVariantWrapperObject::info); } /*! @@ -1470,7 +2176,9 @@ bool QScriptValue::isVariant() const bool QScriptValue::isQObject() const { Q_D(const QScriptValue); - return d && d->value.isQObject(); + if (!d || !d->isJSC() || !d->jscValue.isObject()) + return false; + return static_cast<JSC::JSObject*>(d->jscValue.getObject())->isObject(&QScript::QObjectWrapperObject::info); } /*! @@ -1482,7 +2190,11 @@ bool QScriptValue::isQObject() const bool QScriptValue::isQMetaObject() const { Q_D(const QScriptValue); - return d && d->value.isQMetaObject(); + if (!d || !d->isJSC() || !d->jscValue.isObject()) + return false; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); +// return static_cast<JSC::JSObject*>(d->jscValue->getObject())->isObject(&QScript::QMetaObjectWrapperObject::info); + return false; } /*! @@ -1492,7 +2204,7 @@ bool QScriptValue::isQMetaObject() const bool QScriptValue::isValid() const { Q_D(const QScriptValue); - return d && d->value.isValid(); + return (d != 0); } /*! @@ -1506,10 +2218,10 @@ bool QScriptValue::isValid() const QScriptValue QScriptValue::data() const { Q_D(const QScriptValue); - if (!d || !d->value.isObject()) + if (!d || !d->isJSC() || !d->jscValue.isObject()) return QScriptValue(); - QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine()); - return eng->toPublic(d->value.internalValue()); + // ### make hidden property + return d->property(QLatin1String("__qt_data__"), QScriptValue::ResolveLocal); } /*! @@ -1523,10 +2235,13 @@ QScriptValue QScriptValue::data() const void QScriptValue::setData(const QScriptValue &data) { Q_D(QScriptValue); - if (!d || !d->value.isObject()) + if (!d || !d->isJSC() || !d->jscValue.isObject()) return; - QScriptEnginePrivate *eng = QScriptEnginePrivate::get(engine()); - d->value.setInternalValue(eng->toImpl(data)); + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(d->engine); + JSC::JSValue other = eng_p->scriptValueToJSCValue(data); + JSC::ExecState *exec = eng_p->globalObject->globalExec(); + // ### make hidden property + static_cast<JSC::JSObject*>(d->jscValue.getObject())->putDirect(JSC::Identifier(exec, "__qt_data__"), other); } /*! @@ -1539,13 +2254,11 @@ void QScriptValue::setData(const QScriptValue &data) */ QScriptClass *QScriptValue::scriptClass() const { - Q_D(const QScriptValue); - if (!d || !d->value.isObject()) + if (isObject()) return 0; - QScriptClassInfo *info = d->value.classInfo(); - if ((info->type() & QScriptClassInfo::TypeMask) < QScriptClassInfo::CustomType) - return 0; - return QScriptClassPrivate::classFromInfo(info); + // ### implement me + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return 0; } /*! @@ -1563,16 +2276,9 @@ QScriptClass *QScriptValue::scriptClass() const */ void QScriptValue::setScriptClass(QScriptClass *scriptClass) { - Q_D(QScriptValue); - if (!d || !d->value.isObject()) - return; - if (!scriptClass) { - QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(engine()); - d->value.setClassInfo(eng_p->m_class_object); - } else { - QScriptClassPrivate *cls_p = QScriptClassPrivate::get(scriptClass); - d->value.setClassInfo(cls_p->classInfo()); - } + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + // no idea... use a "hidden" property? + Q_UNUSED(scriptClass); } /*! @@ -1585,10 +2291,11 @@ void QScriptValue::setScriptClass(QScriptClass *scriptClass) */ qint64 QScriptValue::objectId() const { - Q_D(const QScriptValue); - if (!d || !d->value.isObject()) + if (!isObject()) return -1; - return d->value.m_object_value->m_id; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + // lazily initialized mapping from JSObject* to id? + return -1; } QT_END_NAMESPACE diff --git a/src/script/qscriptvalue.h b/src/script/api/qscriptvalue.h index 306da53..3fa165f 100644 --- a/src/script/qscriptvalue.h +++ b/src/script/api/qscriptvalue.h @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ @@ -215,12 +185,6 @@ public: qint64 objectId() const; private: - // force compile error, prevent QScriptValue(bool) to be called - inline QScriptValue(void *) { Q_ASSERT(false); } - // force compile error, prevent QScriptValue(QScriptEngine*, bool) to be called - inline QScriptValue(QScriptEngine *, void *) { Q_ASSERT(false); } - -private: QScriptValuePrivate *d_ptr; Q_DECLARE_PRIVATE(QScriptValue) diff --git a/src/script/api/qscriptvalue_p.h b/src/script/api/qscriptvalue_p.h new file mode 100644 index 0000000..31230a6 --- /dev/null +++ b/src/script/api/qscriptvalue_p.h @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +****************************************************************************/ + +#ifndef QSCRIPTVALUE_P_H +#define QSCRIPTVALUE_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 <QtCore/qobjectdefs.h> + +#ifndef QT_NO_SCRIPT + +QT_BEGIN_NAMESPACE + +#include "wtf/Platform.h" +#include "JSValue.h" + +class QString; +class QScriptEngine; +class QScriptValue; +class QScriptValuePrivate +{ +public: + enum Type { + JSC, + Number, + String + }; + + QScriptValuePrivate(); + ~QScriptValuePrivate(); + + void initFromJSCValue(JSC::JSValue value); + void initFromNumber(double value); + void initFromString(const QString &value); + + static void initFromJSCValue(QScriptValue &result, + QScriptEngine *engine, + JSC::JSValue value); + + bool isJSC() const; + + static QScriptValuePrivate *get(const QScriptValue &q); + + QScriptValue property(const QString &name, int resolveMode) const; + QScriptValue property(quint32 index, int resolveMode) const; + + QScriptEngine *engine; + Type type; + JSC::JSValue jscValue; + double numberValue; + QString *stringValue; + + QBasicAtomicInt ref; +}; + +QT_END_NAMESPACE + +#endif // QT_NO_SCRIPT + +#endif diff --git a/src/script/qscriptvalueiterator.cpp b/src/script/api/qscriptvalueiterator.cpp index 1a60632..f9286c8 100644 --- a/src/script/qscriptvalueiterator.cpp +++ b/src/script/api/qscriptvalueiterator.cpp @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ @@ -43,13 +13,7 @@ #ifndef QT_NO_SCRIPT -#include "qscriptvalueiterator_p.h" -#include "qscriptvalueiteratorimpl_p.h" -#include "qscriptengine_p.h" -#include "qscriptcontext_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" +#include "qscriptstring.h" QT_BEGIN_NAMESPACE @@ -93,21 +57,11 @@ QT_BEGIN_NAMESPACE \sa QScriptValue::property() */ -/*! - \internal -*/ -QScriptValueIteratorPrivate::QScriptValueIteratorPrivate() - : q_ptr(0), it(0) -{ -} - -/*! - \internal -*/ -QScriptValueIteratorPrivate::~QScriptValueIteratorPrivate() +class QScriptValueIteratorPrivate { - delete it; -} +public: + QScriptValue object; +}; /*! Constructs an iterator for traversing \a object. The iterator is @@ -116,12 +70,9 @@ QScriptValueIteratorPrivate::~QScriptValueIteratorPrivate() */ QScriptValueIterator::QScriptValueIterator(const QScriptValue &object) { - QScriptValueImpl val = QScriptValuePrivate::valueOf(object); - if (!val.isObject()) { + if (!object.isObject()) { d_ptr = 0; } else { - d_ptr = new QScriptValueIteratorPrivate(); - d_ptr->it = new QScriptValueIteratorImpl(val); } } @@ -145,8 +96,8 @@ QScriptValueIterator::~QScriptValueIterator() */ bool QScriptValueIterator::hasNext() const { - Q_D(const QScriptValueIterator); - return (d && d->it->hasNext()); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return false; } /*! @@ -159,9 +110,7 @@ bool QScriptValueIterator::hasNext() const */ void QScriptValueIterator::next() { - Q_D(QScriptValueIterator); - if (d) - d->it->next(); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); } /*! @@ -173,8 +122,8 @@ void QScriptValueIterator::next() */ bool QScriptValueIterator::hasPrevious() const { - Q_D(const QScriptValueIterator); - return (d && d->it->hasPrevious()); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return false; } /*! @@ -187,9 +136,7 @@ bool QScriptValueIterator::hasPrevious() const */ void QScriptValueIterator::previous() { - Q_D(QScriptValueIterator); - if (d) - d->it->previous(); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); } /*! @@ -200,9 +147,7 @@ void QScriptValueIterator::previous() */ void QScriptValueIterator::toFront() { - Q_D(QScriptValueIterator); - if (d) - d->it->toFront(); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); } /*! @@ -213,9 +158,7 @@ void QScriptValueIterator::toFront() */ void QScriptValueIterator::toBack() { - Q_D(QScriptValueIterator); - if (d) - d->it->toBack(); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); } /*! @@ -226,10 +169,8 @@ void QScriptValueIterator::toBack() */ QString QScriptValueIterator::name() const { - Q_D(const QScriptValueIterator); - if (!d) - return QString(); - return d->it->name(); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return QString(); } /*! @@ -240,11 +181,8 @@ QString QScriptValueIterator::name() const */ QScriptString QScriptValueIterator::scriptName() const { - Q_D(const QScriptValueIterator); - if (!d) - return QScriptString(); - QScriptEnginePrivate *eng = d->it->object().engine(); - return eng->internedString(d->it->nameId()); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return QScriptString(); } /*! @@ -255,11 +193,8 @@ QScriptString QScriptValueIterator::scriptName() const */ QScriptValue QScriptValueIterator::value() const { - Q_D(const QScriptValueIterator); - if (!d) - return QScriptValue(); - QScriptEnginePrivate *eng = d->it->object().engine(); - return eng->toPublic(d->it->value()); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return QScriptValue(); } /*! @@ -270,11 +205,8 @@ QScriptValue QScriptValueIterator::value() const */ void QScriptValueIterator::setValue(const QScriptValue &value) { - Q_D(const QScriptValueIterator); - if (d) { - QScriptEnginePrivate *eng = d->it->object().engine(); - d->it->setValue(eng->toImpl(value)); - } + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + Q_UNUSED(value); } /*! @@ -285,10 +217,8 @@ void QScriptValueIterator::setValue(const QScriptValue &value) */ QScriptValue::PropertyFlags QScriptValueIterator::flags() const { - Q_D(const QScriptValueIterator); - if (!d) - return 0; - return QScriptValue::PropertyFlags(d->it->flags() & ~QScript::Member::InternalRange); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + return 0; } /*! @@ -299,9 +229,7 @@ QScriptValue::PropertyFlags QScriptValueIterator::flags() const */ void QScriptValueIterator::remove() { - Q_D(const QScriptValueIterator); - if (d) - d->it->remove(); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); } /*! @@ -311,15 +239,8 @@ void QScriptValueIterator::remove() */ QScriptValueIterator& QScriptValueIterator::operator=(QScriptValue &object) { - if (d_ptr) { - delete d_ptr; - d_ptr = 0; - } - QScriptValueImpl val = QScriptValuePrivate::valueOf(object); - if (val.isObject()) { - d_ptr = new QScriptValueIteratorPrivate(); - d_ptr->it = new QScriptValueIteratorImpl(val); - } + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + Q_UNUSED(object); return *this; } diff --git a/src/script/api/qscriptvalueiterator.h b/src/script/api/qscriptvalueiterator.h new file mode 100644 index 0000000..34a4a12 --- /dev/null +++ b/src/script/api/qscriptvalueiterator.h @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +****************************************************************************/ + +#ifndef QSCRIPTVALUEITERATOR_H +#define QSCRIPTVALUEITERATOR_H + +#include <QtScript/qscriptvalue.h> + +#ifndef QT_NO_SCRIPT + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(Script) + +class QString; +class QScriptString; + +class QScriptValueIteratorPrivate; +class Q_SCRIPT_EXPORT QScriptValueIterator +{ +public: + QScriptValueIterator(const QScriptValue &value); + ~QScriptValueIterator(); + + bool hasNext() const; + void next(); + + bool hasPrevious() const; + void previous(); + + QString name() const; + QScriptString scriptName() const; + + QScriptValue value() const; + void setValue(const QScriptValue &value); + + QScriptValue::PropertyFlags flags() const; + + void remove(); + + void toFront(); + void toBack(); + + QScriptValueIterator& operator=(QScriptValue &value); + +private: + QScriptValueIteratorPrivate *d_ptr; + + Q_DECLARE_PRIVATE(QScriptValueIterator) + Q_DISABLE_COPY(QScriptValueIterator) +}; + +QT_END_NAMESPACE + +QT_END_HEADER + +#endif // QT_NO_SCRIPT + +#endif // QSCRIPTVALUEITERATOR_H diff --git a/src/script/bridge/bridge.pri b/src/script/bridge/bridge.pri new file mode 100644 index 0000000..585ccc0 --- /dev/null +++ b/src/script/bridge/bridge.pri @@ -0,0 +1,9 @@ +SOURCES += \ + $$PWD/qscriptfunction.cpp \ + $$PWD/qscriptvariant.cpp \ + $$PWD/qscriptqobject.cpp + +HEADERS += \ + $$PWD/qscriptfunction_p.h \ + $$PWD/qscriptvariant_p.h \ + $$PWD/qscriptqobject_p.h diff --git a/src/script/bridge/qscriptfunction.cpp b/src/script/bridge/qscriptfunction.cpp new file mode 100644 index 0000000..fd51df1 --- /dev/null +++ b/src/script/bridge/qscriptfunction.cpp @@ -0,0 +1,137 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +****************************************************************************/ + +#include "qscriptfunction_p.h" + +#ifndef QT_NO_SCRIPT + +#include "private/qscriptengine_p.h" +#include "qscriptcontext.h" +#include "private/qscriptcontext_p.h" + +#include "JSGlobalObject.h" + +QT_BEGIN_NAMESPACE + +namespace JSC +{ +ASSERT_CLASS_FITS_IN_CELL(QScript::FunctionWrapper); +ASSERT_CLASS_FITS_IN_CELL(QScript::FunctionWithArgWrapper); +} + +namespace QScript +{ + +FunctionWrapper::FunctionWrapper(QScriptEngine *engine, int length, const JSC::Identifier &name, + QScriptEngine::FunctionSignature function) + : JSC::PrototypeFunction(QScriptEnginePrivate::get(engine)->globalObject->globalExec(), + length, name, proxyCall), data(new Data()) +{ + data->engine = engine; + data->function = function; +} + +FunctionWrapper::~FunctionWrapper() +{ + delete data; +} + +JSC::ConstructType FunctionWrapper::getConstructData(JSC::ConstructData& consData) +{ + consData.native.function = proxyConstruct; + return JSC::ConstructTypeHost; +} + +JSC::JSValue FunctionWrapper::proxyCall(JSC::ExecState *, JSC::JSObject *callee, + JSC::JSValue thisObject, const JSC::ArgList &args) +{ + FunctionWrapper *self = static_cast<FunctionWrapper*>(callee); + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(self->data->engine); + QScriptContextPrivate ctx_p(callee, thisObject, args, + /*calledAsConstructor=*/false, eng_p); + QScriptContext *ctx = QScriptContextPrivate::create(ctx_p); + QScriptValue result = self->data->function(ctx, self->data->engine); + delete ctx; + return eng_p->scriptValueToJSCValue(result); +} + +JSC::JSObject* FunctionWrapper::proxyConstruct(JSC::ExecState *, JSC::JSObject *callee, + const JSC::ArgList &args) +{ + FunctionWrapper *self = static_cast<FunctionWrapper*>(callee); + QScriptValue object = self->data->engine->newObject(); + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(self->data->engine); + QScriptContextPrivate ctx_p(callee, eng_p->scriptValueToJSCValue(object), + args, /*calledAsConstructor=*/true, eng_p); + QScriptContext *ctx = QScriptContextPrivate::create(ctx_p); + QScriptValue result = self->data->function(ctx, self->data->engine); + delete ctx; + if (result.isObject()) + return static_cast<JSC::JSObject*>(JSC::asObject(eng_p->scriptValueToJSCValue(result))); + return static_cast<JSC::JSObject*>(JSC::asObject(eng_p->scriptValueToJSCValue(object))); +} + +FunctionWithArgWrapper::FunctionWithArgWrapper(QScriptEngine *engine, int length, const JSC::Identifier &name, + QScriptEngine::FunctionWithArgSignature function, void *arg) + : JSC::PrototypeFunction(QScriptEnginePrivate::get(engine)->globalObject->globalExec(), + length, name, /*proxyCall*/0), data(new Data()) +{ + Q_ASSERT_X(false, Q_FUNC_INFO, "implement me"); + data->engine = engine; + data->function = function; + data->arg = arg; +} + +FunctionWithArgWrapper::~FunctionWithArgWrapper() +{ + delete data; +} + +JSC::ConstructType FunctionWithArgWrapper::getConstructData(JSC::ConstructData& consData) +{ + consData.native.function = proxyConstruct; + return JSC::ConstructTypeHost; +} + +JSC::JSValue FunctionWithArgWrapper::proxyCall(JSC::ExecState *, JSC::JSObject *callee, + JSC::JSValue thisObject, const JSC::ArgList &args) +{ + FunctionWithArgWrapper *self = static_cast<FunctionWithArgWrapper*>(callee); + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(self->data->engine); + QScriptContextPrivate ctx_p(callee, thisObject, args, + /*calledAsConstructor=*/false, eng_p); + QScriptContext *ctx = QScriptContextPrivate::create(ctx_p); + QScriptValue result = self->data->function(ctx, self->data->engine, self->data->arg); + delete ctx; + return eng_p->scriptValueToJSCValue(result); +} + +JSC::JSObject* FunctionWithArgWrapper::proxyConstruct(JSC::ExecState *, JSC::JSObject *callee, + const JSC::ArgList &args) +{ + FunctionWithArgWrapper *self = static_cast<FunctionWithArgWrapper*>(callee); + QScriptValue object = self->data->engine->newObject(); + QScriptEnginePrivate *eng_p = QScriptEnginePrivate::get(self->data->engine); + QScriptContextPrivate ctx_p(callee, eng_p->scriptValueToJSCValue(object), + args, /*calledAsConstructor=*/true, eng_p); + QScriptContext *ctx = QScriptContextPrivate::create(ctx_p); + QScriptValue result = self->data->function(ctx, self->data->engine, self->data->arg); + delete ctx; + if (result.isObject()) + return static_cast<JSC::JSObject*>(JSC::asObject(eng_p->scriptValueToJSCValue(result))); + return static_cast<JSC::JSObject*>(JSC::asObject(eng_p->scriptValueToJSCValue(object))); +} + +} // namespace QScript + +QT_END_NAMESPACE + +#endif // QT_NO_SCRIPT diff --git a/src/script/bridge/qscriptfunction_p.h b/src/script/bridge/qscriptfunction_p.h new file mode 100644 index 0000000..87e3d59 --- /dev/null +++ b/src/script/bridge/qscriptfunction_p.h @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +****************************************************************************/ + +#ifndef QSCRIPTFUNCTION_P_H +#define QSCRIPTFUNCTIOn_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 <QtCore/qglobal.h> + +#ifndef QT_NO_SCRIPT + +#include "qscriptengine.h" + +#include "PrototypeFunction.h" + +QT_BEGIN_NAMESPACE + +namespace QScript +{ + +class FunctionWrapper : public JSC::PrototypeFunction // ### subclass InternalFunction instead +{ +public: + // work around CELL_SIZE limitation + struct Data + { + QScriptEngine *engine; + QScriptEngine::FunctionSignature function; + }; + + FunctionWrapper(QScriptEngine *, int length, const JSC::Identifier&, QScriptEngine::FunctionSignature); + ~FunctionWrapper(); + +private: + virtual JSC::ConstructType getConstructData(JSC::ConstructData&); + + static JSC::JSValue JSC_HOST_CALL proxyCall(JSC::ExecState *, JSC::JSObject *, JSC::JSValue, const JSC::ArgList &); + static JSC::JSObject* proxyConstruct(JSC::ExecState *, JSC::JSObject *, const JSC::ArgList &); + +private: + Data *data; +}; + +class FunctionWithArgWrapper : public JSC::PrototypeFunction +{ +public: + // work around CELL_SIZE limitation + struct Data + { + QScriptEngine *engine; + QScriptEngine::FunctionWithArgSignature function; + void *arg; + }; + + FunctionWithArgWrapper(QScriptEngine *, int length, const JSC::Identifier&, QScriptEngine::FunctionWithArgSignature, void *); + ~FunctionWithArgWrapper(); + +private: + virtual JSC::ConstructType getConstructData(JSC::ConstructData&); + + static JSC::JSValue proxyCall(JSC::ExecState *, JSC::JSObject *, JSC::JSValue , const JSC::ArgList &); + static JSC::JSObject* proxyConstruct(JSC::ExecState *, JSC::JSObject *, const JSC::ArgList &); + +private: + Data *data; +}; + +} // namespace QScript + +QT_END_NAMESPACE + +#endif // QT_NO_SCRIPT + +#endif diff --git a/src/script/bridge/qscriptqobject.cpp b/src/script/bridge/qscriptqobject.cpp new file mode 100644 index 0000000..84f6108d --- /dev/null +++ b/src/script/bridge/qscriptqobject.cpp @@ -0,0 +1,1338 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +****************************************************************************/ + +#include "qscriptqobject_p.h" + +#ifndef QT_NO_SCRIPT + +#include <QtCore/qmetaobject.h> +#include <QtCore/qvarlengtharray.h> +#include <QtCore/qdebug.h> +#include <QtScript/qscriptable.h> +#include "../api/qscriptengine_p.h" +#include "../api/qscriptable_p.h" + +#include "Error.h" +#include "PrototypeFunction.h" +#include "PropertyNameArray.h" +#include "JSFunction.h" +#include "JSString.h" +#include "JSValue.h" + +QT_BEGIN_NAMESPACE + +namespace JSC +{ +ASSERT_CLASS_FITS_IN_CELL(QScript::QObjectWrapperObject); +ASSERT_CLASS_FITS_IN_CELL(QScript::QObjectPrototype); +} + +namespace QScript +{ + +struct QObjectConnection +{ + int slotIndex; + JSC::JSValue receiver; + JSC::JSValue slot; + JSC::JSValue senderWrapper; + + QObjectConnection(int i, JSC::JSValue r, JSC::JSValue s, + JSC::JSValue sw) + : slotIndex(i), receiver(r), slot(s), senderWrapper(sw) {} + QObjectConnection() : slotIndex(-1) {} + + bool hasTarget(JSC::JSValue r, JSC::JSValue s) const + { + if (r.isObject() != receiver.isObject()) + return false; + if ((r.isObject() && receiver.isObject()) + && (r != receiver)) { + return false; + } + return (s == slot); + } + + void mark() + { + Q_ASSERT_X(false, Q_FUNC_INFO, "implement me"); +/* if (senderWrapper && !senderWrapper->isMarked()) { + // see if the sender should be marked or not + if ((inst->ownership == QScriptEngine::ScriptOwnership) + || ((inst->ownership == QScriptEngine::AutoOwnership) + && inst->value && !inst->value->parent())) { + senderWrapper.invalidate(); + } else { + senderWrapper.mark(generation); + } + }*/ + if (receiver) + receiver.mark(); + if (slot) + slot.mark(); + } +}; + +class QObjectConnectionManager: public QObject +{ +public: + QObjectConnectionManager(QScriptEnginePrivate *engine); + ~QObjectConnectionManager(); + + bool addSignalHandler(QObject *sender, const char *signal, + JSC::JSValue receiver, + JSC::JSValue slot, + JSC::JSValue senderWrapper = 0); + bool removeSignalHandler(QObject *sender, const char *signal, + JSC::JSValue receiver, + JSC::JSValue slot); + + static const QMetaObject staticMetaObject; + virtual const QMetaObject *metaObject() const; + virtual void *qt_metacast(const char *); + virtual int qt_metacall(QMetaObject::Call, int, void **argv); + + void execute(int slotIndex, void **argv); + + void mark(); + +private: + QScriptEnginePrivate *engine; + int slotCounter; + QVector<QVector<QObjectConnection> > connections; +}; + +static bool hasMethodAccess(const QMetaMethod &method, int index, const QScriptEngine::QObjectWrapOptions &opt) +{ + return (method.access() != QMetaMethod::Private) + && ((index != 2) || !(opt & QScriptEngine::ExcludeDeleteLater)); +} + +static bool isEnumerableMetaProperty(const QMetaProperty &prop, + const QMetaObject *mo, int index) +{ + return prop.isScriptable() && prop.isValid() + // the following lookup is to ensure that we have the + // "most derived" occurrence of the property with this name + && (mo->indexOfProperty(prop.name()) == index); +} + +static inline QByteArray methodName(const QMetaMethod &method) +{ + QByteArray signature = method.signature(); + return signature.left(signature.indexOf('(')); +} + +static int indexOfMetaEnum(const QMetaObject *meta, const QByteArray &str) +{ + QByteArray scope; + QByteArray name; + int scopeIdx = str.indexOf("::"); + if (scopeIdx != -1) { + scope = str.left(scopeIdx); + name = str.mid(scopeIdx + 2); + } else { + name = str; + } + for (int i = meta->enumeratorCount() - 1; i >= 0; --i) { + QMetaEnum m = meta->enumerator(i); + if ((m.name() == name)/* && (scope.isEmpty() || (m.scope() == scope))*/) + return i; + } + return -1; +} + +static inline QScriptable *scriptableFromQObject(QObject *qobj) +{ + void *ptr = qobj->qt_metacast("QScriptable"); + return reinterpret_cast<QScriptable*>(ptr); +} + +JSC::UString qtStringToJSCUString(const QString &str); +QString qtStringFromJSCUString(const JSC::UString &str); + +static JSC::JSValue JSC_HOST_CALL QtFunction_call(JSC::ExecState *exec, JSC::JSObject*, + JSC::JSValue thisValue, const JSC::ArgList &args); + +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 mark(); + + virtual const JSC::ClassInfo* classInfo() const { return &info; } + static const JSC::ClassInfo info; + + JSC::JSValue call(JSC::ExecState *exec, JSC::JSValue thisValue, + const JSC::ArgList &args); + +private: + Data *data; +}; + +QtFunction::QtFunction(JSC::JSValue object, int initialIndex, bool maybeOverloaded, + JSC::JSGlobalData *data, WTF::PassRefPtr<JSC::Structure> sid, + const JSC::Identifier &ident) + : JSC::InternalFunction(data, sid, ident), + data(new Data(object, initialIndex, maybeOverloaded)) +{ +} + +QtFunction::~QtFunction() +{ + delete data; +} + +JSC::CallType QtFunction::getCallData(JSC::CallData &callData) +{ + callData.native.function = QtFunction_call; + return JSC::CallTypeHost; +} + +void QtFunction::mark() +{ + data->object.mark(); +} + +class QScriptMetaType +{ +public: + enum Kind { + Invalid, + Variant, + MetaType, + Unresolved, + MetaEnum + }; + + inline QScriptMetaType() + : m_kind(Invalid) { } + + inline Kind kind() const + { return m_kind; } + + int typeId() const; + + inline bool isValid() const + { return (m_kind != Invalid); } + + inline bool isVariant() const + { return (m_kind == Variant); } + + inline bool isMetaType() const + { return (m_kind == MetaType); } + + inline bool isUnresolved() const + { return (m_kind == Unresolved); } + + inline bool isMetaEnum() const + { return (m_kind == MetaEnum); } + + QByteArray name() const; + + inline int enumeratorIndex() const + { Q_ASSERT(isMetaEnum()); return m_typeId; } + + static inline QScriptMetaType variant() + { return QScriptMetaType(Variant); } + + static inline QScriptMetaType metaType(int typeId, const QByteArray &name) + { return QScriptMetaType(MetaType, typeId, name); } + + static inline QScriptMetaType metaEnum(int enumIndex, const QByteArray &name) + { return QScriptMetaType(MetaEnum, enumIndex, name); } + + static inline QScriptMetaType unresolved(const QByteArray &name) + { return QScriptMetaType(Unresolved, /*typeId=*/0, name); } + +private: + inline QScriptMetaType(Kind kind, int typeId = 0, const QByteArray &name = QByteArray()) + : m_kind(kind), m_typeId(typeId), m_name(name) { } + + Kind m_kind; + int m_typeId; + QByteArray m_name; +}; + +int QScriptMetaType::typeId() const +{ + if (isVariant()) + return QMetaType::type("QVariant"); + return isMetaEnum() ? 2/*int*/ : m_typeId; +} + +QByteArray QScriptMetaType::name() const +{ + if (!m_name.isEmpty()) + return m_name; + else if (m_kind == Variant) + return "QVariant"; + return QMetaType::typeName(typeId()); +} + +class QScriptMetaMethod +{ +public: + inline QScriptMetaMethod() + { } + inline QScriptMetaMethod(const QByteArray &name, const QVector<QScriptMetaType> &types) + : m_name(name), m_types(types), m_firstUnresolvedIndex(-1) + { + QVector<QScriptMetaType>::const_iterator it; + for (it = m_types.constBegin(); it != m_types.constEnd(); ++it) { + if ((*it).kind() == QScriptMetaType::Unresolved) { + m_firstUnresolvedIndex = it - m_types.constBegin(); + break; + } + } + } + inline bool isValid() const + { return !m_types.isEmpty(); } + + QByteArray name() const + { return m_name; } + + inline QScriptMetaType returnType() const + { return m_types.at(0); } + + inline int argumentCount() const + { return m_types.count() - 1; } + + inline QScriptMetaType argumentType(int arg) const + { return m_types.at(arg + 1); } + + inline bool fullyResolved() const + { return m_firstUnresolvedIndex == -1; } + + inline bool hasUnresolvedReturnType() const + { return (m_firstUnresolvedIndex == 0); } + + inline int firstUnresolvedIndex() const + { return m_firstUnresolvedIndex; } + + inline int count() const + { return m_types.count(); } + + inline QScriptMetaType type(int index) const + { return m_types.at(index); } + +private: + QByteArray m_name; + QVector<QScriptMetaType> m_types; + int m_firstUnresolvedIndex; +}; + +struct QScriptMetaArguments +{ + int matchDistance; + int index; + QScriptMetaMethod method; + QVarLengthArray<QVariant, 9> args; + + inline QScriptMetaArguments(int dist, int idx, const QScriptMetaMethod &mtd, + const QVarLengthArray<QVariant, 9> &as) + : matchDistance(dist), index(idx), method(mtd), args(as) { } + inline QScriptMetaArguments() + : index(-1) { } + + inline bool isValid() const + { return (index != -1); } +}; + +JSC::JSValue QtFunction::call(JSC::ExecState *exec, JSC::JSValue thisValue, + const JSC::ArgList &scriptArgs) +{ + Q_ASSERT(data->object.isObject(&QObjectWrapperObject::info)); + QObjectWrapperObject *wrapper = static_cast<QObjectWrapperObject*>(JSC::asObject(data->object)); + QScriptEnginePrivate *engine = static_cast<QScript::GlobalObject*>(exec->dynamicGlobalObject())->engine; + QObject *qobj = wrapper->value(); + Q_ASSERT_X(qobj != 0, "QtFunction::call", "handle the case when QObject has been deleted"); + + const QMetaObject *meta = qobj->metaObject(); + QObject *thisQObject; + if (thisValue.isObject(&QObjectWrapperObject::info)) + thisQObject = static_cast<QObjectWrapperObject*>(JSC::asObject(thisValue))->value(); + else + thisQObject = qobj; // ### TypeError + + if (!meta->cast(thisQObject)) { + // invoking a function in the prototype + thisQObject = qobj; + } + + QByteArray funName; + QScriptMetaMethod chosenMethod; + int chosenIndex = -1; + QVarLengthArray<QVariant, 9> args; + QVector<QScriptMetaArguments> candidates; + QVector<QScriptMetaArguments> unresolved; + QVector<int> tooFewArgs; + QVector<int> conversionFailed; + int index; + for (index = data->initialIndex; index >= 0; --index) { + QMetaMethod method = meta->method(index); + + if (index == data->initialIndex) + funName = methodName(method); + else { + if (methodName(method) != funName) + continue; + } + + QVector<QScriptMetaType> types; + // resolve return type + QByteArray returnTypeName = method.typeName(); + int rtype = QMetaType::type(returnTypeName); + if ((rtype == 0) && !returnTypeName.isEmpty()) { + if (returnTypeName == "QVariant") { + types.append(QScriptMetaType::variant()); + } else { + int enumIndex = indexOfMetaEnum(meta, returnTypeName); + if (enumIndex != -1) + types.append(QScriptMetaType::metaEnum(enumIndex, returnTypeName)); + else + types.append(QScriptMetaType::unresolved(returnTypeName)); + } + } else { +/* if (callType == QMetaMethod::Constructor) + types.append(QScriptMetaType::metaType(QMetaType::QObjectStar, "QObject*")); + else*/ if (returnTypeName == "QVariant") + types.append(QScriptMetaType::variant()); + else + types.append(QScriptMetaType::metaType(rtype, returnTypeName)); + } + + // resolve argument types + QList<QByteArray> parameterTypeNames = method.parameterTypes(); + for (int i = 0; i < parameterTypeNames.count(); ++i) { + QByteArray argTypeName = parameterTypeNames.at(i); + int atype = QMetaType::type(argTypeName); + if (atype == 0) { + if (argTypeName == "QVariant") { + types.append(QScriptMetaType::variant()); + } else { + int enumIndex = indexOfMetaEnum(meta, argTypeName); + if (enumIndex != -1) + types.append(QScriptMetaType::metaEnum(enumIndex, argTypeName)); + else + types.append(QScriptMetaType::unresolved(argTypeName)); + } + } else { + if (argTypeName == "QVariant") + types.append(QScriptMetaType::variant()); + else + types.append(QScriptMetaType::metaType(atype, argTypeName)); + } + } + + QScriptMetaMethod mtd = QScriptMetaMethod(methodName(method), types); + + if (args.count() < mtd.argumentCount()) { + tooFewArgs.append(index); + continue; + } + + if (!mtd.fullyResolved()) { + // remember it so we can give an error message later, if necessary + unresolved.append(QScriptMetaArguments(/*matchDistance=*/INT_MAX, index, + mtd, QVarLengthArray<QVariant, 9>())); + if (mtd.hasUnresolvedReturnType()) + continue; + } + + if (args.count() != mtd.count()) + args.resize(mtd.count()); + + QScriptMetaType retType = mtd.returnType(); + args[0] = QVariant(retType.typeId(), (void *)0); // the result + + // try to convert arguments + bool converted = true; + int matchDistance = 0; + for (int i = 0; converted && i < mtd.argumentCount(); ++i) { + QScriptValue actual = engine->scriptValueFromJSCValue(scriptArgs.at(i)); + QScriptMetaType argType = mtd.argumentType(i); + int tid = -1; + QVariant v; + if (argType.isUnresolved()) { + v = QVariant(QMetaType::QObjectStar, (void *)0); + converted = engine->convertToNativeQObject( + actual, argType.name(), reinterpret_cast<void* *>(v.data())); + } else if (argType.isVariant()) { + if (actual.isVariant()) { + v = actual.toVariant(); + } else { + v = actual.toVariant(); + converted = v.isValid() || actual.isUndefined() || actual.isNull(); + } + } else { + tid = argType.typeId(); + v = QVariant(tid, (void *)0); + converted = QScriptEnginePrivate::convert(actual, tid, v.data(), engine); + // ### +// if (engine->hasUncaughtException()) +// return; + } + + if (!converted) { + if (actual.isVariant()) { + if (tid == -1) + tid = argType.typeId(); + QVariant vv = actual.toVariant(); + if (vv.canConvert(QVariant::Type(tid))) { + v = vv; + converted = v.convert(QVariant::Type(tid)); + if (converted && (vv.userType() != tid)) + matchDistance += 10; + } else { + QByteArray vvTypeName = vv.typeName(); + if (vvTypeName.endsWith('*') + && (vvTypeName.left(vvTypeName.size()-1) == argType.name())) { + v = QVariant(tid, *reinterpret_cast<void* *>(vv.data())); + converted = true; + matchDistance += 10; + } + } + } else if (actual.isNumber()) { + // see if it's an enum value + QMetaEnum m; + if (argType.isMetaEnum()) { + m = meta->enumerator(argType.enumeratorIndex()); + } else { + int mi = indexOfMetaEnum(meta, argType.name()); + if (mi != -1) + m = meta->enumerator(mi); + } + if (m.isValid()) { + int ival = actual.toInt32(); + if (m.valueToKey(ival) != 0) { + qVariantSetValue(v, ival); + converted = true; + matchDistance += 10; + } + } + } + } else { + // determine how well the conversion matched + if (actual.isNumber()) { + switch (tid) { + case QMetaType::Double: + // perfect + break; + case QMetaType::Float: + matchDistance += 1; + break; + case QMetaType::LongLong: + case QMetaType::ULongLong: + matchDistance += 2; + break; + case QMetaType::Long: + case QMetaType::ULong: + matchDistance += 3; + break; + case QMetaType::Int: + case QMetaType::UInt: + matchDistance += 4; + break; + case QMetaType::Short: + case QMetaType::UShort: + matchDistance += 5; + break; + case QMetaType::Char: + case QMetaType::UChar: + matchDistance += 6; + break; + default: + matchDistance += 10; + break; + } + } else if (actual.isString()) { + switch (tid) { + case QMetaType::QString: + // perfect + break; + default: + matchDistance += 10; + break; + } + } else if (actual.isBoolean()) { + switch (tid) { + case QMetaType::Bool: + // perfect + break; + default: + matchDistance += 10; + break; + } + } else if (actual.isDate()) { + switch (tid) { + case QMetaType::QDateTime: + // perfect + break; + case QMetaType::QDate: + matchDistance += 1; + break; + case QMetaType::QTime: + matchDistance += 2; + break; + default: + matchDistance += 10; + break; + } + } else if (actual.isRegExp()) { + switch (tid) { + case QMetaType::QRegExp: + // perfect + break; + default: + matchDistance += 10; + break; + } + } else if (actual.isVariant()) { + if (argType.isVariant() + || (actual.toVariant().userType() == tid)) { + // perfect + } else { + matchDistance += 10; + } + } else if (actual.isArray()) { + switch (tid) { + case QMetaType::QStringList: + case QMetaType::QVariantList: + matchDistance += 5; + break; + default: + matchDistance += 10; + break; + } + } else if (actual.isQObject()) { + switch (tid) { + case QMetaType::QObjectStar: + case QMetaType::QWidgetStar: + // perfect + break; + default: + matchDistance += 10; + break; + } + } else if (actual.isNull()) { + switch (tid) { + case QMetaType::VoidStar: + case QMetaType::QObjectStar: + case QMetaType::QWidgetStar: + // perfect + break; + default: + if (!argType.name().endsWith('*')) + matchDistance += 10; + break; + } + } else { + matchDistance += 10; + } + } + + if (converted) + args[i+1] = v; + } + + if (converted) { + if ((scriptArgs.size() == (size_t)mtd.argumentCount()) + && (matchDistance == 0)) { + // perfect match, use this one + chosenMethod = mtd; + chosenIndex = index; + break; + } else { + QScriptMetaArguments metaArgs(matchDistance, index, mtd, args); + if (candidates.isEmpty()) { + candidates.append(metaArgs); + } else { + QScriptMetaArguments otherArgs = candidates.at(0); + if ((args.count() > otherArgs.args.count()) + || ((args.count() == otherArgs.args.count()) + && (matchDistance <= otherArgs.matchDistance))) { + candidates.prepend(metaArgs); + } else { + candidates.append(metaArgs); + } + } + } + } else if (mtd.fullyResolved()) { + conversionFailed.append(index); + } + + if (!data->maybeOverloaded) + break; + } + + JSC::JSValue result; + if ((chosenIndex == -1) && candidates.isEmpty()) { +// context->calleeMetaIndex = initialIndex; +//#ifndef Q_SCRIPT_NO_EVENT_NOTIFY +// engine->notifyFunctionEntry(context); +//#endif + if (!conversionFailed.isEmpty()) { + QString message = QString::fromLatin1("incompatible type of argument(s) in call to %0(); candidates were\n") + .arg(QLatin1String(funName)); + for (int i = 0; i < conversionFailed.size(); ++i) { + if (i > 0) + message += QLatin1String("\n"); + QMetaMethod mtd = meta->method(conversionFailed.at(i)); + message += QString::fromLatin1(" %0").arg(QString::fromLatin1(mtd.signature())); + } + result = JSC::throwError(exec, JSC::TypeError, qtStringToJSCUString(message)); + } else if (!unresolved.isEmpty()) { + QScriptMetaArguments argsInstance = unresolved.first(); + int unresolvedIndex = argsInstance.method.firstUnresolvedIndex(); + Q_ASSERT(unresolvedIndex != -1); + QScriptMetaType unresolvedType = argsInstance.method.type(unresolvedIndex); + QString unresolvedTypeName = QString::fromLatin1(unresolvedType.name()); + QString message = QString::fromLatin1("cannot call %0(): ") + .arg(QString::fromLatin1(funName)); + if (unresolvedIndex > 0) { + message.append(QString::fromLatin1("argument %0 has unknown type `%1'"). + arg(unresolvedIndex).arg(unresolvedTypeName)); + } else { + message.append(QString::fromLatin1("unknown return type `%0'") + .arg(unresolvedTypeName)); + } + message.append(QString::fromLatin1(" (register the type with qScriptRegisterMetaType())")); + result = JSC::throwError(exec, JSC::TypeError, qtStringToJSCUString(message)); + } else { + QString message = QString::fromLatin1("too few arguments in call to %0(); candidates are\n") + .arg(QLatin1String(funName)); + for (int i = 0; i < tooFewArgs.size(); ++i) { + if (i > 0) + message += QLatin1String("\n"); + QMetaMethod mtd = meta->method(tooFewArgs.at(i)); + message += QString::fromLatin1(" %0").arg(QString::fromLatin1(mtd.signature())); + } + result = JSC::throwError(exec, JSC::SyntaxError, qtStringToJSCUString(message)); + } + } else { + if (chosenIndex == -1) { + QScriptMetaArguments metaArgs = candidates.at(0); + if ((candidates.size() > 1) + && (metaArgs.args.count() == candidates.at(1).args.count()) + && (metaArgs.matchDistance == candidates.at(1).matchDistance)) { + // ambiguous call + QString message = QString::fromLatin1("ambiguous call of overloaded function %0(); candidates were\n") + .arg(QLatin1String(funName)); + for (int i = 0; i < candidates.size(); ++i) { + if (i > 0) + message += QLatin1String("\n"); + QMetaMethod mtd = meta->method(candidates.at(i).index); + message += QString::fromLatin1(" %0").arg(QString::fromLatin1(mtd.signature())); + } + result = JSC::throwError(exec, JSC::TypeError, qtStringToJSCUString(message)); + } else { + chosenMethod = metaArgs.method; + chosenIndex = metaArgs.index; + args = metaArgs.args; + } + } + + if (chosenIndex != -1) { + // call it +// context->calleeMetaIndex = chosenIndex; + + QVarLengthArray<void*, 9> array(args.count()); + void **params = array.data(); + for (int i = 0; i < args.count(); ++i) { + const QVariant &v = args[i]; + switch (chosenMethod.type(i).kind()) { + case QScriptMetaType::Variant: + params[i] = const_cast<QVariant*>(&v); + break; + case QScriptMetaType::MetaType: + case QScriptMetaType::MetaEnum: + case QScriptMetaType::Unresolved: + params[i] = const_cast<void*>(v.constData()); + break; + default: + Q_ASSERT(0); + } + } + + QScriptable *scriptable = 0; + if (thisQObject) + scriptable = scriptableFromQObject(thisQObject); + QScriptEngine *oldEngine = 0; + if (scriptable) { + oldEngine = QScriptablePrivate::get(scriptable)->engine; + QScriptablePrivate::get(scriptable)->engine = QScriptEnginePrivate::get(engine); + } + +// ### fixme +//#ifndef Q_SCRIPT_NO_EVENT_NOTIFY +// engine->notifyFunctionEntry(context); +//#endif + +/* if (callType == QMetaMethod::Constructor) { + Q_ASSERT(meta != 0); + meta->static_metacall(QMetaObject::CreateInstance, chosenIndex, params); + } else*/ { + Q_ASSERT(thisQObject != 0); + thisQObject->qt_metacall(QMetaObject::InvokeMetaMethod, chosenIndex, params); + } + + if (scriptable) + QScriptablePrivate::get(scriptable)->engine = oldEngine; + + if (exec->hadException()) { + result = exec->exception() ; // propagate + } else { + QScriptMetaType retType = chosenMethod.returnType(); + if (retType.isVariant()) { + result = engine->jscValueFromVariant(*(QVariant *)params[0]); + } else if (retType.typeId() != 0) { + result = engine->scriptValueToJSCValue(engine->create(retType.typeId(), params[0])); + if (!result) { + QScriptValue sv = QScriptEnginePrivate::get(engine)->newVariant(QVariant(retType.typeId(), params[0])); + result = engine->scriptValueToJSCValue(sv); + } + } else { + result = JSC::jsUndefined(); + } + } + } + } + + return JSC::JSValue(); +} + +const JSC::ClassInfo QtFunction::info = { "QtFunction", 0, 0, 0 }; + +JSC::JSValue QtFunction_call(JSC::ExecState *exec, JSC::JSObject *callee, + JSC::JSValue thisValue, const JSC::ArgList &args) +{ + if (!callee->isObject(&QtFunction::info)) + return throwError(exec, JSC::TypeError); + return static_cast<QtFunction*>(callee)->call(exec, thisValue, args); +} + +const JSC::ClassInfo QObjectWrapperObject::info = { "QObject", 0, 0, 0 }; + +QObjectWrapperObject::QObjectWrapperObject( + QObject *object, QScriptEngine::ValueOwnership ownership, + const QScriptEngine::QObjectWrapOptions &options, + WTF::PassRefPtr<JSC::Structure> sid) + : JSC::JSObject(sid), data(new Data(object, ownership, options)) +{ +} + +QObjectWrapperObject::~QObjectWrapperObject() +{ + switch (data->ownership) { + case QScriptEngine::QtOwnership: + break; + case QScriptEngine::ScriptOwnership: + if (data->value) + delete data->value; // ### fixme +// eng->disposeQObject(value); + break; + case QScriptEngine::AutoOwnership: + if (data->value && !data->value->parent()) + delete data->value; // ### fixme +// eng->disposeQObject(value); + break; + } + delete data; +} + +bool QObjectWrapperObject::getOwnPropertySlot(JSC::ExecState *exec, + const JSC::Identifier &propertyName, + JSC::PropertySlot &slot) +{ + QByteArray name = qtStringFromJSCUString(propertyName.ustring()).toLatin1(); + QObject *qobject = data->value; + if (!qobject) { + QString message = QString::fromLatin1("cannot access member `%0' of deleted QObject") + .arg(QString::fromLatin1(name)); + JSC::throwError(exec, JSC::GeneralError, qtStringToJSCUString(message)); + return false; + } + + const QScriptEngine::QObjectWrapOptions &opt = data->options; + const QMetaObject *meta = qobject->metaObject(); + QScriptEnginePrivate *eng = static_cast<QScript::GlobalObject*>(exec->dynamicGlobalObject())->engine; + int index = -1; + if (name.contains('(')) { + QByteArray normalized = QMetaObject::normalizedSignature(name); + if (-1 != (index = meta->indexOfMethod(normalized))) { + QMetaMethod method = meta->method(index); + if (hasMethodAccess(method, index, opt)) { + if (!(opt & QScriptEngine::ExcludeSuperClassMethods) + || (index >= meta->methodOffset())) { + QtFunction *fun = new (exec)QtFunction( + this, index, /*maybeOverloaded=*/false, + &exec->globalData(), exec->dynamicGlobalObject()->functionStructure(), + propertyName); + slot.setValue(fun); + return true; + } + } + } + } + + index = meta->indexOfProperty(name); + if (index != -1) { + QMetaProperty prop = meta->property(index); + if (prop.isScriptable()) { + if (!(opt & QScriptEngine::ExcludeSuperClassProperties) + || (index >= meta->propertyOffset())) { + JSC::JSValue val = eng->jscValueFromVariant(prop.read(qobject)); + slot.setValue(val); + return true; + } + } + } + + index = qobject->dynamicPropertyNames().indexOf(name); + if (index != -1) { + JSC::JSValue val = eng->jscValueFromVariant(qobject->property(name)); + slot.setValue(val); + return true; + } + + const int offset = (opt & QScriptEngine::ExcludeSuperClassMethods) + ? meta->methodOffset() : 0; + for (index = meta->methodCount() - 1; index >= offset; --index) { + QMetaMethod method = meta->method(index); + if (hasMethodAccess(method, index, opt) + && (methodName(method) == name)) { + QtFunction *fun = new (exec)QtFunction( + this, index, /*maybeOverloaded=*/true, + &exec->globalData(), exec->dynamicGlobalObject()->functionStructure(), + propertyName); + slot.setValue(fun); + return true; + } + } + + if (!(opt & QScriptEngine::ExcludeChildObjects)) { + QList<QObject*> children = qobject->children(); + for (index = 0; index < children.count(); ++index) { + QObject *child = children.at(index); + if (child->objectName() == qtStringFromJSCUString(propertyName.ustring())) { + QScriptEngine::QObjectWrapOptions opt = QScriptEngine::PreferExistingWrapperObject; + QScriptValue tmp = QScriptEnginePrivate::get(eng)->newQObject(child, QScriptEngine::QtOwnership, opt); + slot.setValue(eng->scriptValueToJSCValue(tmp)); + return true; + } + } + } + + return JSC::JSObject::getOwnPropertySlot(exec, propertyName, slot); +} + +void QObjectWrapperObject::put(JSC::ExecState* exec, const JSC::Identifier& propertyName, + JSC::JSValue value, JSC::PutPropertySlot &slot) +{ + QByteArray name = qtStringFromJSCUString(propertyName.ustring()).toLatin1(); + QObject *qobject = data->value; + if (!qobject) { + QString message = QString::fromLatin1("cannot access member `%0' of deleted QObject") + .arg(QString::fromLatin1(name)); + JSC::throwError(exec, JSC::GeneralError, qtStringToJSCUString(message)); + return; + } + + const QScriptEngine::QObjectWrapOptions &opt = data->options; + const QMetaObject *meta = qobject->metaObject(); + QScriptEnginePrivate *eng = static_cast<QScript::GlobalObject*>(exec->dynamicGlobalObject())->engine; + int index = -1; + if (name.contains('(')) { + QByteArray normalized = QMetaObject::normalizedSignature(name); + if (-1 != (index = meta->indexOfMethod(normalized))) { + QMetaMethod method = meta->method(index); + if (hasMethodAccess(method, index, opt)) { + if (!(opt & QScriptEngine::ExcludeSuperClassMethods) + || (index >= meta->methodOffset())) { + Q_ASSERT(0); + return; + } + } + } + } + + index = meta->indexOfProperty(name); + if (index != -1) { + QMetaProperty prop = meta->property(index); + if (prop.isScriptable()) { + if (!(opt & QScriptEngine::ExcludeSuperClassProperties) + || (index >= meta->propertyOffset())) { + QVariant v = eng->jscValueToVariant(value, prop.userType()); + (void)prop.write(qobject, v); + return; + } + } + } + + index = qobject->dynamicPropertyNames().indexOf(name); + if (index != -1) { + QVariant v = eng->scriptValueFromJSCValue(value).toVariant(); + (void)qobject->setProperty(name, v); + return; + } + + JSC::JSObject::put(exec, propertyName, value, slot); +} + +bool QObjectWrapperObject::deleteProperty(JSC::ExecState *exec, + const JSC::Identifier& propertyName) +{ + QByteArray name = qtStringFromJSCUString(propertyName.ustring()).toLatin1(); + QObject *qobject = data->value; + if (!qobject) { + QString message = QString::fromLatin1("cannot access member `%0' of deleted QObject") + .arg(QString::fromLatin1(name)); + JSC::throwError(exec, JSC::GeneralError, qtStringToJSCUString(message)); + return false; + } + + int index = qobject->dynamicPropertyNames().indexOf(name); + if (index != -1) { + (void)qobject->setProperty(name, QVariant()); + return true; + } + + return JSC::JSObject::deleteProperty(exec, propertyName); +} + +void QObjectWrapperObject::getPropertyNames(JSC::ExecState *exec, JSC::PropertyNameArray &propertyNames) +{ + QObject *qobject = data->value; + if (!qobject) { + QString message = QString::fromLatin1("cannot get property names of deleted QObject"); + JSC::throwError(exec, JSC::GeneralError, qtStringToJSCUString(message)); + return; + } + + const QScriptEngine::QObjectWrapOptions &opt = data->options; + const QMetaObject *meta = qobject->metaObject(); + { + int i = (opt & QScriptEngine::ExcludeSuperClassProperties) + ? meta->propertyOffset() : 0; + for ( ; i < meta->propertyCount(); ++i) { + QMetaProperty prop = meta->property(i); + if (isEnumerableMetaProperty(prop, meta, i)) { + QString name = QString::fromLatin1(prop.name()); + propertyNames.add(JSC::Identifier(exec, qtStringToJSCUString(name))); + } + } + } + + { + QList<QByteArray> dpNames = qobject->dynamicPropertyNames(); + for (int i = 0; i < dpNames.size(); ++i) { + QString name = QString::fromLatin1(dpNames.at(i)); + propertyNames.add(JSC::Identifier(exec, qtStringToJSCUString(name))); + } + } + + { + int i = (opt & QScriptEngine::ExcludeSuperClassMethods) + ? meta->methodOffset() : 0; + for ( ; i < meta->methodCount(); ++i) { + QMetaMethod method = meta->method(i); + if (hasMethodAccess(method, i, opt)) { + QMetaMethod method = meta->method(i); + QString name = QString::fromLatin1(methodName(method)); + propertyNames.add(JSC::Identifier(exec, qtStringToJSCUString(name))); + QString sig = QString::fromLatin1(method.signature()); + propertyNames.add(JSC::Identifier(exec, qtStringToJSCUString(sig))); + } + } + } + + JSC::JSObject::getPropertyNames(exec, propertyNames); +} + +static JSC::JSValue JSC_HOST_CALL qobjectProtoFuncToString(JSC::ExecState *exec, JSC::JSObject*, + JSC::JSValue thisValue, const JSC::ArgList&) +{ + if (!thisValue.isObject(&QObjectWrapperObject::info)) + return throwError(exec, JSC::TypeError); + QObject *obj = static_cast<QObjectWrapperObject*>(JSC::asObject(thisValue))->value(); + const QMetaObject *meta = obj ? obj->metaObject() : &QObject::staticMetaObject; + QString name = obj ? obj->objectName() : QString::fromUtf8("unnamed"); + QString str = QString::fromUtf8("%0(name = \"%1\")") + .arg(QLatin1String(meta->className())).arg(name); + return JSC::jsString(exec, qtStringToJSCUString(str)); +} + +QObjectPrototype::QObjectPrototype(JSC::ExecState* exec, WTF::PassRefPtr<JSC::Structure> structure, + JSC::Structure* prototypeFunctionStructure) + : QObjectWrapperObject(new QObject(), QScriptEngine::AutoOwnership, /*options=*/0, structure) +{ + putDirectFunction(exec, new (exec) JSC::PrototypeFunction(exec, prototypeFunctionStructure, /*length=*/0, exec->propertyNames().toString, qobjectProtoFuncToString), JSC::DontEnum); + // ### findChild(), findChildren() +} + +static const uint qt_meta_data_QObjectConnectionManager[] = { + + // content: + 1, // revision + 0, // classname + 0, 0, // classinfo + 1, 10, // methods + 0, 0, // properties + 0, 0, // enums/sets + + // slots: signature, parameters, type, tag, flags + 35, 34, 34, 34, 0x0a, + + 0 // eod +}; + +static const char qt_meta_stringdata_QObjectConnectionManager[] = { + "QScript::QObjectConnectionManager\0\0execute()\0" +}; + +const QMetaObject QObjectConnectionManager::staticMetaObject = { + { &QObject::staticMetaObject, qt_meta_stringdata_QObjectConnectionManager, + qt_meta_data_QObjectConnectionManager, 0 } +}; + +const QMetaObject *QObjectConnectionManager::metaObject() const +{ + return &staticMetaObject; +} + +void *QObjectConnectionManager::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_QObjectConnectionManager)) + return static_cast<void*>(const_cast<QObjectConnectionManager*>(this)); + return QObject::qt_metacast(_clname); +} + +int QObjectConnectionManager::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QObject::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + execute(_id, _a); + _id -= slotCounter; + } + return _id; +} + +void QObjectConnectionManager::execute(int slotIndex, void **argv) +{ + JSC::JSValue receiver; + JSC::JSValue slot; + JSC::JSValue senderWrapper; + int signalIndex = -1; + for (int i = 0; i < connections.size(); ++i) { + const QVector<QObjectConnection> &cs = connections.at(i); + for (int j = 0; j < cs.size(); ++j) { + const QObjectConnection &c = cs.at(j); + if (c.slotIndex == slotIndex) { + receiver = c.receiver; + slot = c.slot; + senderWrapper = c.senderWrapper; + signalIndex = i; + break; + } + } + } +// Q_ASSERT(slot != 0); + +#if 0 + // ### fixme + if (engine->isCollecting()) { + // we can't do a script function call during GC, + // so we're forced to ignore this signal + return; + } + + QScriptFunction *fun = engine->convertToNativeFunction(slot); + if (fun == 0) { + // the signal handler has been GC'ed. This can only happen when + // a QObject is owned by the engine, the engine is destroyed, and + // there is a script function connected to the destroyed() signal + Q_ASSERT(signalIndex <= 1); // destroyed(QObject*) + return; + } +#endif + + const QMetaObject *meta = sender()->metaObject(); + const QMetaMethod method = meta->method(signalIndex); + + QList<QByteArray> parameterTypes = method.parameterTypes(); + int argc = parameterTypes.count(); + + JSC::ExecState *exec = engine->globalObject->globalExec(); + JSC::ArgList jscArgs; + for (int i = 0; i < argc; ++i) { + int argType = QMetaType::type(parameterTypes.at(i)); + QScriptValue arg = engine->create(argType, argv[i + 1]); + Q_ASSERT_X(false, Q_FUNC_INFO, "implement me"); +#if 0 + jscArgs.append(engine->scriptValueToJSCValue(arg)); +#endif + } + + JSC::JSValue senderObject; + if (senderWrapper && senderWrapper.isObject(&QObjectWrapperObject::info)) + senderObject = senderWrapper; + else { + QScriptEngine::QObjectWrapOptions opt = QScriptEngine::PreferExistingWrapperObject; + senderObject = engine->newQObject(sender(), QScriptEngine::QtOwnership, opt); + } + + JSC::JSValue thisObject; + if (receiver && receiver.isObject()) + thisObject = receiver; + else + thisObject = exec->dynamicGlobalObject(); + + (void)static_cast<JSC::JSFunction*>(JSC::asFunction(slot))->call(exec, thisObject, jscArgs); + if (exec->hadException()) + engine->emitSignalHandlerException(); +} + +QObjectConnectionManager::QObjectConnectionManager(QScriptEnginePrivate *eng) + : engine(eng), slotCounter(0) +{ +} + +QObjectConnectionManager::~QObjectConnectionManager() +{ +} + +void QObjectConnectionManager::mark() +{ + for (int i = 0; i < connections.size(); ++i) { + QVector<QObjectConnection> &cs = connections[i]; + for (int j = 0; j < cs.size(); ++j) + cs[j].mark(); + } +} + +bool QObjectConnectionManager::addSignalHandler( + QObject *sender, const char *signal, JSC::JSValue receiver, + JSC::JSValue function, JSC::JSValue senderWrapper) +{ + Q_ASSERT(sender != 0); + Q_ASSERT(signal != 0); + Q_ASSERT(function.isObject(&JSC::JSFunction::info)); + const QMetaObject *meta = sender->metaObject(); + int signalIndex = meta->indexOfSignal(QMetaObject::normalizedSignature(signal+1)); + if (signalIndex == -1) + return false; + if (connections.size() <= signalIndex) + connections.resize(signalIndex+1); + QVector<QObjectConnection> &cs = connections[signalIndex]; + int absSlotIndex = slotCounter + metaObject()->methodOffset(); + bool ok = QMetaObject::connect(sender, signalIndex, this, absSlotIndex); + if (ok) + cs.append(QObjectConnection(slotCounter++, receiver, function, senderWrapper)); + return ok; +} + +bool QObjectConnectionManager::removeSignalHandler( + QObject *sender, const char *signal, + JSC::JSValue receiver, JSC::JSValue slot) +{ + Q_ASSERT(sender != 0); + Q_ASSERT(signal != 0); + const QMetaObject *meta = sender->metaObject(); + int signalIndex = meta->indexOfSignal(QMetaObject::normalizedSignature(signal+1)); + if (signalIndex == -1) + return false; + if (connections.size() <= signalIndex) + return false; + QVector<QObjectConnection> &cs = connections[signalIndex]; + for (int i = 0; i < cs.size(); ++i) { + const QObjectConnection &c = cs.at(i); + if (c.hasTarget(receiver, slot)) { + int absSlotIndex = c.slotIndex + metaObject()->methodOffset(); + bool ok = QMetaObject::disconnect(sender, signalIndex, this, absSlotIndex); + if (ok) + cs.remove(i); + return ok; + } + } + return false; +} + +QObjectData::QObjectData(QScriptEnginePrivate *eng) + : engine(eng), connectionManager(0) +{ +} + +QObjectData::~QObjectData() +{ + if (connectionManager) { + delete connectionManager; + connectionManager = 0; + } +} + +void QObjectData::mark() +{ + if (connectionManager) + connectionManager->mark(); +} + +bool QObjectData::addSignalHandler(QObject *sender, + const char *signal, + JSC::JSValue receiver, + JSC::JSValue slot, + JSC::JSValue senderWrapper) +{ + if (!connectionManager) + connectionManager = new QObjectConnectionManager(engine); + return connectionManager->addSignalHandler( + sender, signal, receiver, slot, senderWrapper); +} + +bool QObjectData::removeSignalHandler(QObject *sender, + const char *signal, + JSC::JSValue receiver, + JSC::JSValue slot) +{ + if (!connectionManager) + return false; + return connectionManager->removeSignalHandler( + sender, signal, receiver, slot); +} + +} // namespace QScript + +namespace JSC +{ + ASSERT_CLASS_FITS_IN_CELL(QScript::QtFunction); +} + +QT_END_NAMESPACE + +#endif // QT_NO_SCRIPT diff --git a/src/script/bridge/qscriptqobject_p.h b/src/script/bridge/qscriptqobject_p.h new file mode 100644 index 0000000..3c2f2d2 --- /dev/null +++ b/src/script/bridge/qscriptqobject_p.h @@ -0,0 +1,134 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_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 <QtCore/qobject.h> + +#ifndef QT_NO_SCRIPT + +#include "qscriptengine.h" +#include <QtCore/qpointer.h> + +#include "JSObject.h" + +QT_BEGIN_NAMESPACE + +namespace QScript +{ + +class QObjectWrapperObject : public JSC::JSObject +{ +public: + // work around CELL_SIZE limitation + struct Data + { + QPointer<QObject> value; + QScriptEngine::ValueOwnership ownership; + QScriptEngine::QObjectWrapOptions options; + + Data(QObject *o, QScriptEngine::ValueOwnership own, + QScriptEngine::QObjectWrapOptions opt) + : value(o), ownership(own), options(opt) {} + }; + + explicit QObjectWrapperObject( + QObject *object, QScriptEngine::ValueOwnership ownership, + const QScriptEngine::QObjectWrapOptions &options, + WTF::PassRefPtr<JSC::Structure> sid); + ~QObjectWrapperObject(); + + 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); + virtual void getPropertyNames(JSC::ExecState*, JSC::PropertyNameArray&); + + virtual const JSC::ClassInfo* classInfo() const { return &info; } + static const JSC::ClassInfo info; + + 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; } + + static WTF::PassRefPtr<JSC::Structure> createStructureID(JSC::JSValue prototype) + { + return JSC::Structure::create(prototype, JSC::TypeInfo(JSC::ObjectType)); + } + +protected: + Data *data; +}; + +class QObjectPrototype : public QObjectWrapperObject +{ +public: + QObjectPrototype(JSC::ExecState*, WTF::PassRefPtr<JSC::Structure>, + JSC::Structure* prototypeFunctionStructure); +}; + +class QObjectConnectionManager; + +class QObjectData // : public QObjectUserData +{ +public: + QObjectData(QScriptEnginePrivate *engine); + ~QObjectData(); + + bool addSignalHandler(QObject *sender, + const char *signal, + JSC::JSValue receiver, + JSC::JSValue slot, + JSC::JSValue senderWrapper = 0); + bool removeSignalHandler(QObject *sender, + const char *signal, + JSC::JSValue receiver, + JSC::JSValue slot); + + void mark(); + +private: + QScriptEnginePrivate *engine; + QScript::QObjectConnectionManager *connectionManager; +// QList<QScriptQObjectWrapperInfo> wrappers; +}; + +} // namespace QScript + +QT_END_NAMESPACE + +#endif // QT_NO_SCRIPT + +#endif diff --git a/src/script/bridge/qscriptvariant.cpp b/src/script/bridge/qscriptvariant.cpp new file mode 100644 index 0000000..0255961 --- /dev/null +++ b/src/script/bridge/qscriptvariant.cpp @@ -0,0 +1,102 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +****************************************************************************/ + +#include "qscriptvariant_p.h" + +#ifndef QT_NO_SCRIPT + +#include "Error.h" +#include "PrototypeFunction.h" +#include "JSString.h" + +QT_BEGIN_NAMESPACE + +namespace JSC +{ +ASSERT_CLASS_FITS_IN_CELL(QScript::QVariantWrapperObject); +ASSERT_CLASS_FITS_IN_CELL(QScript::QVariantPrototype); +} + +namespace QScript +{ + +JSC::UString qtStringToJSCUString(const QString &str); + +const JSC::ClassInfo QVariantWrapperObject::info = { "QVariant", 0, 0, 0 }; + +QVariantWrapperObject::QVariantWrapperObject(WTF::PassRefPtr<JSC::Structure> sid) + : JSC::JSObject(sid), data(new Data()) +{ +} + +QVariantWrapperObject::~QVariantWrapperObject() +{ + delete data; +} + +static JSC::JSValue JSC_HOST_CALL variantProtoFuncToString(JSC::ExecState *exec, JSC::JSObject*, + JSC::JSValue thisValue, const JSC::ArgList&) +{ + if (!thisValue.isObject(&QVariantWrapperObject::info)) + return throwError(exec, JSC::TypeError); + const QVariant &v = static_cast<QVariantWrapperObject*>(JSC::asObject(thisValue))->value(); + // ### check the type + return JSC::jsString(exec, QScript::qtStringToJSCUString(v.toString())); +} + +static JSC::JSValue JSC_HOST_CALL variantProtoFuncValueOf(JSC::ExecState *exec, JSC::JSObject*, + JSC::JSValue thisValue, const JSC::ArgList&) +{ + if (!thisValue.isObject(&QVariantWrapperObject::info)) + return throwError(exec, JSC::TypeError); + const QVariant &v = static_cast<QVariantWrapperObject*>(JSC::asObject(thisValue))->value(); + switch (v.type()) { + case QVariant::Invalid: + return JSC::jsUndefined(); + + case QVariant::String: + return JSC::jsString(exec, QScript::qtStringToJSCUString(v.toString())); + + case QVariant::Int: + return JSC::jsNumber(exec, v.toInt()); + + case QVariant::Bool: + return JSC::jsBoolean(v.toBool()); + + case QVariant::Double: + return JSC::jsNumber(exec, v.toDouble()); + +// case QVariant::Char: +// return JSC::jsNumber(exec, v.toChar().unicode()); + + case QVariant::UInt: + return JSC::jsNumber(exec, v.toUInt()); + default: + ; + } + return thisValue; +} + +QVariantPrototype::QVariantPrototype(JSC::ExecState* exec, WTF::PassRefPtr<JSC::Structure> structure, + JSC::Structure* prototypeFunctionStructure) + : QVariantWrapperObject(structure) +{ + setValue(QVariant()); + + putDirectFunction(exec, new (exec) JSC::PrototypeFunction(exec, prototypeFunctionStructure, 0, exec->propertyNames().toString, variantProtoFuncToString), JSC::DontEnum); + putDirectFunction(exec, new (exec) JSC::PrototypeFunction(exec, prototypeFunctionStructure, 0, exec->propertyNames().valueOf, variantProtoFuncValueOf), JSC::DontEnum); +} + +} // namespace QScript + +QT_END_NAMESPACE + +#endif // QT_NO_SCRIPT diff --git a/src/script/bridge/qscriptvariant_p.h b/src/script/bridge/qscriptvariant_p.h new file mode 100644 index 0000000..da0bb26 --- /dev/null +++ b/src/script/bridge/qscriptvariant_p.h @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +****************************************************************************/ + +#ifndef QSCRIPTVARIANT_P_H +#define QSCRIPTVARIANT_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 <QtCore/qvariant.h> + +#ifndef QT_NO_SCRIPT + +#include "JSObject.h" + +QT_BEGIN_NAMESPACE + +namespace QScript +{ + +class QVariantWrapperObject : public JSC::JSObject +{ +public: + // work around CELL_SIZE limitation + struct Data + { + QVariant value; + }; + + explicit QVariantWrapperObject(WTF::PassRefPtr<JSC::Structure> sid); + ~QVariantWrapperObject(); + + virtual const JSC::ClassInfo* classInfo() const { return &info; } + static const JSC::ClassInfo info; + + inline const QVariant &value() const { return data->value; } + inline void setValue(const QVariant &value) { data->value = value; } + +private: + Data *data; +}; + +class QVariantPrototype : public QVariantWrapperObject +{ +public: + QVariantPrototype(JSC::ExecState*, WTF::PassRefPtr<JSC::Structure>, + JSC::Structure* prototypeFunctionStructure); +}; + +} // namespace QScript + +QT_END_NAMESPACE + +#endif // QT_NO_SCRIPT + +#endif diff --git a/src/script/instruction.table b/src/script/instruction.table deleted file mode 100644 index 389db18..0000000 --- a/src/script/instruction.table +++ /dev/null @@ -1,87 +0,0 @@ -Q_SCRIPT_DEFINE_OPERATOR(Add) -Q_SCRIPT_DEFINE_OPERATOR(Assign) -Q_SCRIPT_DEFINE_OPERATOR(BitAnd) -Q_SCRIPT_DEFINE_OPERATOR(BitOr) -Q_SCRIPT_DEFINE_OPERATOR(BitXor) -Q_SCRIPT_DEFINE_OPERATOR(BitNot) -Q_SCRIPT_DEFINE_OPERATOR(Branch) -Q_SCRIPT_DEFINE_OPERATOR(BranchTrue) -Q_SCRIPT_DEFINE_OPERATOR(BranchFalse) -Q_SCRIPT_DEFINE_OPERATOR(Call) -Q_SCRIPT_DEFINE_OPERATOR(DeclareLocal) -Q_SCRIPT_DEFINE_OPERATOR(Decr) -Q_SCRIPT_DEFINE_OPERATOR(Delete) -Q_SCRIPT_DEFINE_OPERATOR(Div) -Q_SCRIPT_DEFINE_OPERATOR(Duplicate) -Q_SCRIPT_DEFINE_OPERATOR(EnterWith) -Q_SCRIPT_DEFINE_OPERATOR(Equal) -Q_SCRIPT_DEFINE_OPERATOR(Fetch) -Q_SCRIPT_DEFINE_OPERATOR(FetchField) -Q_SCRIPT_DEFINE_OPERATOR(LazyArguments) -Q_SCRIPT_DEFINE_OPERATOR(GreatOrEqual) -Q_SCRIPT_DEFINE_OPERATOR(GreatThan) -Q_SCRIPT_DEFINE_OPERATOR(HasNextElement) -Q_SCRIPT_DEFINE_OPERATOR(In) -Q_SCRIPT_DEFINE_OPERATOR(Incr) -Q_SCRIPT_DEFINE_OPERATOR(InplaceAdd) -Q_SCRIPT_DEFINE_OPERATOR(InplaceAnd) -Q_SCRIPT_DEFINE_OPERATOR(InplaceDiv) -Q_SCRIPT_DEFINE_OPERATOR(InplaceLeftShift) -Q_SCRIPT_DEFINE_OPERATOR(InplaceMod) -Q_SCRIPT_DEFINE_OPERATOR(InplaceMul) -Q_SCRIPT_DEFINE_OPERATOR(InplaceOr) -Q_SCRIPT_DEFINE_OPERATOR(InplaceRightShift) -Q_SCRIPT_DEFINE_OPERATOR(InplaceSub) -Q_SCRIPT_DEFINE_OPERATOR(InplaceURightShift) -Q_SCRIPT_DEFINE_OPERATOR(InstanceOf) -Q_SCRIPT_DEFINE_OPERATOR(LeaveWith) -Q_SCRIPT_DEFINE_OPERATOR(LeftShift) -Q_SCRIPT_DEFINE_OPERATOR(LessOrEqual) -Q_SCRIPT_DEFINE_OPERATOR(LessThan) -Q_SCRIPT_DEFINE_OPERATOR(LoadFalse) -Q_SCRIPT_DEFINE_OPERATOR(LoadString) -Q_SCRIPT_DEFINE_OPERATOR(LoadNumber) -Q_SCRIPT_DEFINE_OPERATOR(LoadThis) -Q_SCRIPT_DEFINE_OPERATOR(LoadActivation) -Q_SCRIPT_DEFINE_OPERATOR(LoadNull) -Q_SCRIPT_DEFINE_OPERATOR(LoadTrue) -Q_SCRIPT_DEFINE_OPERATOR(LoadUndefined) -Q_SCRIPT_DEFINE_OPERATOR(Mod) -Q_SCRIPT_DEFINE_OPERATOR(Mul) -Q_SCRIPT_DEFINE_OPERATOR(New) -Q_SCRIPT_DEFINE_OPERATOR(NewArray) -Q_SCRIPT_DEFINE_OPERATOR(NewClosure) -Q_SCRIPT_DEFINE_OPERATOR(NewEnumeration) -Q_SCRIPT_DEFINE_OPERATOR(NewObject) -Q_SCRIPT_DEFINE_OPERATOR(NewRegExp) -Q_SCRIPT_DEFINE_OPERATOR(NextElement) -Q_SCRIPT_DEFINE_OPERATOR(Nop) -Q_SCRIPT_DEFINE_OPERATOR(Not) -Q_SCRIPT_DEFINE_OPERATOR(NotEqual) -Q_SCRIPT_DEFINE_OPERATOR(Pop) -Q_SCRIPT_DEFINE_OPERATOR(PostDecr) -Q_SCRIPT_DEFINE_OPERATOR(PostIncr) -Q_SCRIPT_DEFINE_OPERATOR(PutField) -Q_SCRIPT_DEFINE_OPERATOR(Receive) -Q_SCRIPT_DEFINE_OPERATOR(Resolve) -Q_SCRIPT_DEFINE_OPERATOR(Ret) -Q_SCRIPT_DEFINE_OPERATOR(RightShift) -Q_SCRIPT_DEFINE_OPERATOR(StrictEqual) -Q_SCRIPT_DEFINE_OPERATOR(StrictNotEqual) -Q_SCRIPT_DEFINE_OPERATOR(Sub) -Q_SCRIPT_DEFINE_OPERATOR(Swap) -Q_SCRIPT_DEFINE_OPERATOR(ToFirstElement) -Q_SCRIPT_DEFINE_OPERATOR(Throw) -Q_SCRIPT_DEFINE_OPERATOR(TypeOf) -Q_SCRIPT_DEFINE_OPERATOR(UnaryMinus) -Q_SCRIPT_DEFINE_OPERATOR(UnaryPlus) -Q_SCRIPT_DEFINE_OPERATOR(URightShift) -Q_SCRIPT_DEFINE_OPERATOR(InplaceXor) -Q_SCRIPT_DEFINE_OPERATOR(Line) -Q_SCRIPT_DEFINE_OPERATOR(Sync) -Q_SCRIPT_DEFINE_OPERATOR(Halt) -Q_SCRIPT_DEFINE_OPERATOR(BeginCatch) -Q_SCRIPT_DEFINE_OPERATOR(EndCatch) -Q_SCRIPT_DEFINE_OPERATOR(MakeReference) -Q_SCRIPT_DEFINE_OPERATOR(NewString) -Q_SCRIPT_DEFINE_OPERATOR(Debugger) diff --git a/src/script/parser/parser.pri b/src/script/parser/parser.pri new file mode 100644 index 0000000..7f2e30a --- /dev/null +++ b/src/script/parser/parser.pri @@ -0,0 +1,16 @@ +SOURCES += \ + $$PWD/qscriptast.cpp \ + $$PWD/qscriptastvisitor.cpp \ + $$PWD/qscriptgrammar.cpp \ +# $$PWD/qscriptlexer.cpp \ +# $$PWD/qscriptparser.cpp \ +# $$PWD/qscriptsyntaxchecker.cpp + +HEADERS += \ + $$PWD/qscriptastfwd_p.h \ + $$PWD/qscriptast_p.h \ + $$PWD/qscriptastvisitor_p.h \ + $$PWD/qscriptgrammar_p.h \ +# $$PWD/qscriptlexer_p.h \ +# $$PWD/qscriptparser_p.h \ +# $$PWD/qscriptsyntaxchecker_p.h diff --git a/src/script/qscript.g b/src/script/parser/qscript.g index 8bf0ce6..c8a0fdd 100644 --- a/src/script/qscript.g +++ b/src/script/parser/qscript.g @@ -1,41 +1,11 @@ ---------------------------------------------------------------------------- -- --- Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +-- Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). -- Contact: Qt Software Information (qt-info@nokia.com) -- --- This file is part of the QtScript module of the Qt Toolkit. +-- This file is part of the $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 qt-sales@nokia.com. --- $QT_END_LICENSE$ +-- $TROLLTECH_DUAL_LICENSE$ -- -- This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -- WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. @@ -84,42 +54,12 @@ /. /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (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. +** This file is part of the $MODULE$ of the Qt Toolkit. ** -** 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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ @@ -151,42 +91,12 @@ /: /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (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. +** This file is part of the $MODULE$ of the Qt Toolkit. ** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ @@ -331,9 +241,7 @@ QScriptParser::QScriptParser(): stack_size(0), sym_stack(0), state_stack(0), - location_stack(0), - error_lineno(0), - error_column(0) + location_stack(0) { } diff --git a/src/script/qscriptast.cpp b/src/script/parser/qscriptast.cpp index defbd28..e2f9606 100644 --- a/src/script/qscriptast.cpp +++ b/src/script/parser/qscriptast.cpp @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ diff --git a/src/script/qscriptast_p.h b/src/script/parser/qscriptast_p.h index 3d3128a..a33e16b 100644 --- a/src/script/qscriptast_p.h +++ b/src/script/parser/qscriptast_p.h @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ diff --git a/src/script/qscriptastfwd_p.h b/src/script/parser/qscriptastfwd_p.h index 192ede1..3bfd5e5 100644 --- a/src/script/qscriptastfwd_p.h +++ b/src/script/parser/qscriptastfwd_p.h @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ diff --git a/src/script/parser/qscriptastvisitor.cpp b/src/script/parser/qscriptastvisitor.cpp new file mode 100644 index 0000000..c4f6e0b --- /dev/null +++ b/src/script/parser/qscriptastvisitor.cpp @@ -0,0 +1,28 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +****************************************************************************/ + +#include "qscriptastvisitor_p.h" + +QT_BEGIN_NAMESPACE + +namespace QScript { namespace AST { + +Visitor::Visitor() +{ +} + +Visitor::~Visitor() +{ +} + +} } // namespace QScript::AST + +QT_END_NAMESPACE diff --git a/src/script/qscriptastvisitor_p.h b/src/script/parser/qscriptastvisitor_p.h index de5528c..b44d9a8 100644 --- a/src/script/qscriptastvisitor_p.h +++ b/src/script/parser/qscriptastvisitor_p.h @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ diff --git a/src/script/qscriptgrammar.cpp b/src/script/parser/qscriptgrammar.cpp index 8b8a05d..b117af4 100644 --- a/src/script/qscriptgrammar.cpp +++ b/src/script/parser/qscriptgrammar.cpp @@ -1,42 +1,12 @@ // This file was generated by qlalr - DO NOT EDIT! /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ diff --git a/src/script/qscriptgrammar_p.h b/src/script/parser/qscriptgrammar_p.h index 90c11fd..803ecca 100644 --- a/src/script/qscriptgrammar_p.h +++ b/src/script/parser/qscriptgrammar_p.h @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ diff --git a/src/script/qscriptlexer.cpp b/src/script/parser/qscriptlexer.cpp index f93b905..810eb90 100644 --- a/src/script/qscriptlexer.cpp +++ b/src/script/parser/qscriptlexer.cpp @@ -1,59 +1,19 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "qscriptengine_p.h" +#include "qscriptlexer_p.h" #ifndef QT_NO_SCRIPT -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" -#include "qscriptlexer_p.h" #include "qscriptgrammar_p.h" - #include <ctype.h> #include <stdlib.h> #include <stdio.h> @@ -72,6 +32,8 @@ extern double qstrtod(const char *s00, char const **se, bool *ok); } \ while (0) +typedef double qsreal; // ### + namespace QScript { extern qsreal integerFromString(const char *buf, int size, int radix); } @@ -79,25 +41,14 @@ extern qsreal integerFromString(const char *buf, int size, int radix); QScript::Lexer::Lexer(QScriptEnginePrivate *eng) : driver(eng), yylineno(0), - done(false), - size8(128), size16(128), - pos8(0), pos16(0), - terminator(false), - restrKeyword(false), - delimited(false), - stackToken(-1), - state(Start), - pos(0), + size8(128), size16(128), restrKeyword(false), + stackToken(-1), pos(0), code(0), length(0), - yycolumn(0), - startlineno(0), startcolumn(0), bol(true), current(0), next1(0), next2(0), next3(0), err(NoError), - wantRx(false), check_reserved(true), parenthesesState(IgnoreParentheses), - parenthesesCount(0), prohibitAutomaticSemicolon(false) { // allocate space for read buffers @@ -790,9 +741,10 @@ int QScript::Lexer::lex() case Identifier: if ((token = findReservedWord(buffer16, pos16)) < 0) { /* TODO: close leak on parse error. same holds true for String */ - if (driver) - qsyylval.ustr = driver->intern(buffer16, pos16); - else + if (driver) { + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + qsyylval.ustr = 0; // driver->intern(buffer16, pos16); + } else qsyylval.ustr = 0; return QScriptGrammar::T_IDENTIFIER; } @@ -808,9 +760,10 @@ int QScript::Lexer::lex() } return token; case String: - if (driver) - qsyylval.ustr = driver->intern(buffer16, pos16); - else + if (driver) { + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + qsyylval.ustr = 0; // driver->intern(buffer16, pos16); + } else qsyylval.ustr = 0; return QScriptGrammar::T_STRING_LITERAL; case Number: @@ -1077,9 +1030,10 @@ bool QScript::Lexer::scanRegExp(RegExpBodyPrefix prefix) lastWasEscape = !lastWasEscape && (current == '\\'); } else { - if (driver) - pattern = driver->intern(buffer16, pos16); - else + if (driver) { + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + pattern = 0; // driver->intern(buffer16, pos16); + } else pattern = 0; pos16 = 0; shift(1); @@ -1090,7 +1044,8 @@ bool QScript::Lexer::scanRegExp(RegExpBodyPrefix prefix) flags = 0; while (isIdentLetter(current)) { - int flag = QScript::Ecma::RegExp::flagFromChar(current); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + int flag = 0; // QScript::Ecma::RegExp::flagFromChar(current); if (flag == 0) { errmsg = QString::fromLatin1("Invalid regular expression flag '%0'") .arg(QChar(current)); diff --git a/src/script/qscriptlexer_p.h b/src/script/parser/qscriptlexer_p.h index acf242c..8e56049 100644 --- a/src/script/qscriptlexer_p.h +++ b/src/script/parser/qscriptlexer_p.h @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ diff --git a/src/script/qscriptparser.cpp b/src/script/parser/qscriptparser.cpp index 7408ec5..9e25c77 100644 --- a/src/script/qscriptparser.cpp +++ b/src/script/parser/qscriptparser.cpp @@ -2,42 +2,12 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ @@ -47,15 +17,7 @@ #include <string.h> -#include "qscriptengine.h" -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" -#include "qscriptlexer_p.h" #include "qscriptast_p.h" -#include "qscriptnodepool_p.h" #define Q_SCRIPT_UPDATE_POSITION(node, startloc, endloc) do { \ node->startLine = startloc.startLine; \ @@ -88,9 +50,7 @@ QScriptParser::QScriptParser(): stack_size(0), sym_stack(0), state_stack(0), - location_stack(0), - error_lineno(0), - error_column(0) + location_stack(0) { } diff --git a/src/script/qscriptparser_p.h b/src/script/parser/qscriptparser_p.h index 98317c7..338e2d6 100644 --- a/src/script/qscriptparser_p.h +++ b/src/script/parser/qscriptparser_p.h @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ diff --git a/src/script/qscriptsyntaxchecker.cpp b/src/script/parser/qscriptsyntaxchecker.cpp index 74ca00f..5883c69 100644 --- a/src/script/qscriptsyntaxchecker.cpp +++ b/src/script/parser/qscriptsyntaxchecker.cpp @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ diff --git a/src/script/parser/qscriptsyntaxchecker_p.h b/src/script/parser/qscriptsyntaxchecker_p.h new file mode 100644 index 0000000..85e3496 --- /dev/null +++ b/src/script/parser/qscriptsyntaxchecker_p.h @@ -0,0 +1,88 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +****************************************************************************/ + +#ifndef QSCRIPTSYNTAXCHECKER_H +#define QSCRIPTSYNTAXCHECKER_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 <QtCore/qstring.h> + +#ifndef QT_NO_SCRIPT + +#include "qscriptgrammar_p.h" + +QT_BEGIN_NAMESPACE + +namespace QScript { + +class Lexer; + +class SyntaxChecker: protected QScriptGrammar +{ +public: + enum State { + Error, + Intermediate, + Valid, + }; + + struct Result { + Result(State s, int ln, int col, const QString &msg) + : state(s), errorLineNumber(ln), errorColumnNumber(col), + errorMessage(msg) {} + State state; + int errorLineNumber; + int errorColumnNumber; + QString errorMessage; + }; + + SyntaxChecker(); + ~SyntaxChecker(); + + Result checkSyntax(const QString &code); + +protected: + bool automatic(QScript::Lexer *lexer, int token) const; + inline void reallocateStack(); + +protected: + int tos; + int stack_size; + int *state_stack; +}; + +inline void SyntaxChecker::reallocateStack() +{ + if (! stack_size) + stack_size = 128; + else + stack_size <<= 1; + + state_stack = reinterpret_cast<int*> (qRealloc(state_stack, stack_size * sizeof(int))); +} + +} // namespace QScript + +QT_END_NAMESPACE + +#endif // QT_NO_SCRIPT + +#endif diff --git a/src/script/qscriptable.h b/src/script/qscriptable.h deleted file mode 100644 index f990db2..0000000 --- a/src/script/qscriptable.h +++ /dev/null @@ -1,89 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTABLE_H -#define QSCRIPTABLE_H - -#include <QtCore/qobjectdefs.h> - -#ifndef QT_NO_SCRIPT - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Script) - -#ifndef QT_NO_QOBJECT - -class QScriptEngine; -class QScriptContext; -class QScriptValue; - -class QScriptablePrivate; - -class Q_SCRIPT_EXPORT QScriptable -{ -public: - QScriptable(); - ~QScriptable(); - - QScriptEngine *engine() const; - QScriptContext *context() const; - QScriptValue thisObject() const; - int argumentCount() const; - QScriptValue argument(int index) const; - -private: - QScriptablePrivate *d_ptr; - - Q_DISABLE_COPY(QScriptable) - Q_DECLARE_PRIVATE(QScriptable) -}; - -#endif // QT_NO_QOBJECT - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif // QT_NO_SCRIPT -#endif // QSCRIPTABLE_H diff --git a/src/script/qscriptable_p.h b/src/script/qscriptable_p.h deleted file mode 100644 index 2343fc4..0000000 --- a/src/script/qscriptable_p.h +++ /dev/null @@ -1,84 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTABLE_P_H -#define QSCRIPTABLE_P_H - -#include <QtCore/qobjectdefs.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. -// - -#if !defined(QT_NO_QOBJECT) && !defined(QT_NO_SCRIPT) - -QT_BEGIN_NAMESPACE - -class QScriptEngine; - -class QScriptablePrivate -{ - Q_DECLARE_PUBLIC(QScriptable) -public: - inline QScriptablePrivate() - : engine(0) - { } - - static inline QScriptablePrivate *get(QScriptable *q) - { return q->d_func(); } - - QScriptEngine *engine; - - QScriptable *q_ptr; -}; - -QT_END_NAMESPACE - -#endif // QT_NO_QOBJECT && QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptarray_p.h b/src/script/qscriptarray_p.h deleted file mode 100644 index 0079b30..0000000 --- a/src/script/qscriptarray_p.h +++ /dev/null @@ -1,428 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTARRAY_P_H -#define QSCRIPTARRAY_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 <QtCore/QMap> - -#ifndef QT_NO_SCRIPT - -#include <QtCore/QVector> - -#include "qscriptvalueimplfwd_p.h" -#include "qscriptenginefwd_p.h" - -QT_BEGIN_NAMESPACE - -namespace QScript { - -class Array -{ -public: - inline Array(QScriptEnginePrivate *engine); - inline Array(const Array &other); - inline ~Array(); - - inline Array &operator = (const Array &other); - - inline bool isEmpty() const; - inline uint size() const; - inline uint count() const; - inline QScriptValueImpl at(uint index) const; - inline void assign(uint index, const QScriptValueImpl &v); - inline void clear(); - inline void mark(int generation); - inline void resize(uint size); - inline void concat(const Array &other); - inline QScriptValueImpl pop(); - inline void sort(const QScriptValueImpl &comparefn); - inline void splice(qsreal start, qsreal deleteCount, - const QVector<QScriptValueImpl> &items, - Array &other); - inline QList<uint> keys() const; - -private: - enum Mode { - VectorMode, - MapMode - }; - - QScriptEnginePrivate *m_engine; - Mode m_mode; - int m_instances; - - union { - QMap<uint, QScriptValueImpl> *to_map; - QVector<QScriptValueImpl> *to_vector; - }; -}; - -class ArrayElementLessThan -{ -public: - inline ArrayElementLessThan(const QScriptValueImpl &comparefn) - : m_comparefn(comparefn) {} - - inline bool operator()(const QScriptValueImpl &v1, const QScriptValueImpl &v2) const - { - if (!v1.isValid() || v1.isUndefined()) - return false; - if (!v2.isValid() || v2.isUndefined()) - return true; - if (!m_comparefn.isUndefined()) { - ArrayElementLessThan *that = const_cast<ArrayElementLessThan*>(this); - QScriptValueImpl result = that->m_comparefn.call(QScriptValueImpl(), - QScriptValueImplList() << v1 << v2); - return result.toNumber() <= 0; - } - return v1.toString() < v2.toString(); - } - -private: - QScriptValueImpl m_comparefn; -}; - -} // namespace QScript - -inline QScript::Array::Array(QScriptEnginePrivate *engine): - m_engine(engine), - m_mode(VectorMode), - m_instances(0) -{ - to_vector = new QVector<QScriptValueImpl>(); -} - -inline QScript::Array::Array(const Array &other): - m_engine(other.m_engine), - m_mode(other.m_mode), - m_instances(other.m_instances) -{ - if (m_mode == VectorMode) - to_vector = new QVector<QScriptValueImpl> (*other.to_vector); - else - to_map = new QMap<uint, QScriptValueImpl> (*other.to_map); -} - -inline QScript::Array::~Array() -{ - if (m_mode == VectorMode) - delete to_vector; - else - delete to_map; -} - -inline QScript::Array &QScript::Array::operator = (const Array &other) -{ - m_engine = other.m_engine; - m_instances = other.m_instances; - if (m_mode != other.m_mode) { - if (m_mode == VectorMode) - delete to_vector; - else - delete to_map; - m_mode = other.m_mode; - - if (m_mode == VectorMode) - to_vector = new QVector<QScriptValueImpl> (*other.to_vector); - else - to_map = new QMap<uint, QScriptValueImpl> (*other.to_map); - } - - if (m_mode == VectorMode) - *to_vector = *other.to_vector; - else - *to_map = *other.to_map; - - return *this; -} - -inline bool QScript::Array::isEmpty() const -{ - if (m_mode == VectorMode) - return to_vector->isEmpty(); - - return to_map->isEmpty(); -} - -inline uint QScript::Array::size() const -{ - if (m_mode == VectorMode) - return to_vector->size(); - - if (to_map->isEmpty()) - return 0; - - return (--to_map->constEnd()).key(); -} - -inline uint QScript::Array::count() const -{ - return size(); -} - -inline QScriptValueImpl QScript::Array::at(uint index) const -{ - if (m_mode == VectorMode) { - if (index < uint(to_vector->size())) - return to_vector->at(index); - return QScriptValueImpl(); - } else { - return to_map->value(index, QScriptValueImpl()); - } -} - -inline void QScript::Array::assign(uint index, const QScriptValueImpl &v) -{ - if (index >= size()) { - resize(index + 1); - if (v.isValid() && m_engine) - m_engine->adjustBytesAllocated(sizeof(QScriptValueImpl) * (size() - index)); - } - - const QScriptValueImpl &oldv = at(index); - if (oldv.isValid() && (oldv.isObject() || oldv.isString())) - --m_instances; - - if (v.isValid() && (v.isObject() || v.isString())) - ++m_instances; - - if (m_mode == VectorMode) { - to_vector->replace(index, v); - } else { - if (!v.isValid()) - to_map->remove(index); - else - to_map->insert(index, v); - } -} - -inline void QScript::Array::clear() -{ - m_instances = 0; - - if (m_mode == VectorMode) - to_vector->clear(); - - else - to_map->clear(); -} - -inline void QScript::Array::mark(int generation) -{ - if (! m_instances) - return; - - if (m_mode == VectorMode) { - for (int i = 0; i < to_vector->size(); ++i) - to_vector->at(i).mark(generation); - } else { - QMap<uint, QScriptValueImpl>::const_iterator it = to_map->constBegin(); - for (; it != to_map->constEnd(); ++it) - it.value().mark(generation); - } -} - -inline void QScript::Array::resize(uint s) -{ - const uint oldSize = size(); - if (oldSize == s) - return; - - const uint N = 10 * 1024; - - if (m_mode == VectorMode) { - if (s < N) { - to_vector->resize (s); - } else { - // switch to MapMode - QMap<uint, QScriptValueImpl> *m = new QMap<uint, QScriptValueImpl>(); - for (uint i = 0; i < oldSize; ++i) { - if (to_vector->at(i).isValid()) - m->insert(i, to_vector->at(i)); - } - m->insert(s, QScriptValueImpl()); - delete to_vector; - to_map = m; - m_mode = MapMode; - } - } - - else { - if (s < N) { - // switch to VectorMode - QVector<QScriptValueImpl> *v = new QVector<QScriptValueImpl> (s); - QMap<uint, QScriptValueImpl>::const_iterator it = to_map->constBegin(); - for ( ; (it != to_map->constEnd()) && (it.key() < s); ++it) - (*v) [it.key()] = it.value(); - delete to_map; - to_vector = v; - m_mode = VectorMode; - } else { - if (!to_map->isEmpty()) { - QMap<uint, QScriptValueImpl>::iterator it = --to_map->end(); - if (oldSize > s) { - // shrink - while ((it != to_map->end()) && (it.key() >= s)) { - it = to_map->erase(it); - --it; - } - } else { - if ((it.key() == oldSize) && !it.value().isValid()) - to_map->erase(it); - } - } - to_map->insert(s, QScriptValueImpl()); - } - } -} - -inline void QScript::Array::concat(const QScript::Array &other) -{ - uint k = size(); - resize (k + other.size()); - for (uint i = 0; i < other.size(); ++i) { - QScriptValueImpl v = other.at(i); - if (! v.isValid()) - continue; - - assign(k + i, v); - } -} - -inline QScriptValueImpl QScript::Array::pop() -{ - if (isEmpty()) - return QScriptValueImpl(); - - QScriptValueImpl v; - - if (m_mode == VectorMode) - v = to_vector->last(); - else - v = *--to_map->end(); - - resize(size() - 1); - - return v; -} - -inline void QScript::Array::sort(const QScriptValueImpl &comparefn) -{ - ArrayElementLessThan lessThan(comparefn); - if (m_mode == VectorMode) { - qSort(to_vector->begin(), to_vector->end(), lessThan); - } else { - QList<uint> keys = to_map->keys(); - QList<QScriptValueImpl> values = to_map->values(); - qStableSort(values.begin(), values.end(), lessThan); - const uint len = keys.size(); - for (uint i = 0; i < len; ++i) - to_map->insert(keys.at(i), values.at(i)); - } -} - -inline void QScript::Array::splice(qsreal start, qsreal deleteCount, - const QVector<QScriptValueImpl> &items, - Array &other) -{ - const qsreal len = size(); - if (start < 0) - start = qMax(len + start, qsreal(0)); - else if (start > len) - start = len; - deleteCount = qMax(qMin(deleteCount, len - start), qsreal(0)); - - const uint st = uint(start); - const uint dc = uint(deleteCount); - other.resize(dc); - - const uint itemsSize = uint(items.size()); - - if (m_mode == VectorMode) { - for (uint i = 0; i < dc; ++i) - other.assign(i, to_vector->at(st + i)); - if (itemsSize > dc) - to_vector->insert(st, itemsSize - dc, QScriptValueImpl()); - else if (itemsSize < dc) - to_vector->remove(st, dc - itemsSize); - for (uint i = 0; i < itemsSize; ++i) - to_vector->replace(st + i, items.at(i)); - } else { - for (uint i = 0; i < dc; ++i) - other.assign(i, to_map->take(st + i)); - uint del = itemsSize - dc; - if (del != 0) { - for (uint i = st; i < uint(len); ++i) { - if (to_map->contains(i)) - to_map->insert(i + del, to_map->take(i)); - } - resize(uint(len) + del); - } - for (uint i = 0; i < itemsSize; ++i) - to_map->insert(st + i, items.at(i)); - } -} - -inline QList<uint> QScript::Array::keys() const -{ - if (m_mode == VectorMode) - return QList<uint>(); - else - return to_map->keys(); -} - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif // QSCRIPTARRAY_P_H diff --git a/src/script/qscriptasm.cpp b/src/script/qscriptasm.cpp deleted file mode 100644 index d898a38..0000000 --- a/src/script/qscriptasm.cpp +++ /dev/null @@ -1,108 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtCore/QTextStream> - -#ifndef QT_NO_SCRIPT - -#include "qscriptasm_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptengine_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" - -QT_BEGIN_NAMESPACE - -const char *QScriptInstruction::opcode[] = { -#define STR(a) #a -#define Q_SCRIPT_DEFINE_OPERATOR(op) STR(i##op) , -#include "instruction.table" -#undef Q_SCRIPT_DEFINE_OPERATOR -#undef STR -}; - -void QScriptInstruction::print(QTextStream &out) const -{ - out << opcode[op]; - - if (! operand[0].isValid()) - return; - - out << '(' << operand[0].toString(); - - if (operand[1].isValid()) - out << ", " << operand[1].toString(); - - out << ')'; -} - -namespace QScript { - -Code::Code(): - optimized(false), - firstInstruction(0), - lastInstruction(0), - astPool(0) -{ -} - -Code::~Code() -{ - delete[] firstInstruction; -} - -void Code::init(const CompilationUnit &compilation, NodePool *pool) -{ - optimized = false; - const QVector<QScriptInstruction> ilist = compilation.instructions(); - firstInstruction = new QScriptInstruction[ilist.count()]; - lastInstruction = firstInstruction + ilist.count(); - qCopy(ilist.begin(), ilist.end(), firstInstruction); - exceptionHandlers = compilation.exceptionHandlers(); - astPool = pool; -} - -} // namespace QScript - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT diff --git a/src/script/qscriptasm_p.h b/src/script/qscriptasm_p.h deleted file mode 100644 index 3f0058d..0000000 --- a/src/script/qscriptasm_p.h +++ /dev/null @@ -1,183 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTASM_P_H -#define QSCRIPTASM_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 <QtCore/qglobal.h> - -#ifndef QT_NO_SCRIPT - -#include <QtCore/qvector.h> - -#include "qscriptvalueimplfwd_p.h" - -QT_BEGIN_NAMESPACE - -class QTextStream; - -class QScriptInstruction -{ -public: - enum Operator { -#define Q_SCRIPT_DEFINE_OPERATOR(op) OP_##op, -#include "instruction.table" -#undef Q_SCRIPT_DEFINE_OPERATOR - OP_Dummy - }; - -public: - Operator op; - QScriptValueImpl operand[2]; -#if defined(Q_SCRIPT_DIRECT_CODE) - void *code; -#endif - - void print(QTextStream &out) const; - - static const char *opcode[]; -}; - -namespace QScript { - -class NodePool; - -class ExceptionHandlerDescriptor -{ -public: - ExceptionHandlerDescriptor() - : m_startInstruction(0), - m_endInstruction(0), - m_handlerInstruction(0) {} - - ExceptionHandlerDescriptor( - int startInstruction, - int endInstruction, - int handlerInstruction) - : m_startInstruction(startInstruction), - m_endInstruction(endInstruction), - m_handlerInstruction(handlerInstruction) {} - - inline int startInstruction() const { return m_startInstruction; } - inline int endInstruction() const { return m_endInstruction; } - inline int handlerInstruction() const { return m_handlerInstruction; } - -private: - int m_startInstruction; - int m_endInstruction; - int m_handlerInstruction; -}; - -class CompilationUnit -{ -public: - CompilationUnit(): m_valid(true), - m_errorLineNumber(-1) {} - - bool isValid() const { return m_valid; } - - void setError(const QString &message, int lineNumber) - { - m_errorMessage = message; - m_errorLineNumber = lineNumber; - m_valid = false; - } - - QString errorMessage() const - { return m_errorMessage; } - int errorLineNumber() const - { return m_errorLineNumber; } - - QVector<QScriptInstruction> instructions() const - { return m_instructions; } - void setInstructions(const QVector<QScriptInstruction> &instructions) - { m_instructions = instructions; } - - QVector<ExceptionHandlerDescriptor> exceptionHandlers() const - { return m_exceptionHandlers; } - void setExceptionHandlers(const QVector<ExceptionHandlerDescriptor> &exceptionHandlers) - { m_exceptionHandlers = exceptionHandlers; } - -private: - bool m_valid; - QString m_errorMessage; - int m_errorLineNumber; - QVector<QScriptInstruction> m_instructions; - QVector<ExceptionHandlerDescriptor> m_exceptionHandlers; -}; - -class Code -{ -public: - Code(); - ~Code(); - - void init(const CompilationUnit &compilation, NodePool *astPool); - -public: // attributes - bool optimized; - QScriptInstruction *firstInstruction; - QScriptInstruction *lastInstruction; - QVector<ExceptionHandlerDescriptor> exceptionHandlers; - NodePool *astPool; - -private: - Q_DISABLE_COPY(Code) -}; - - -} // namespace QScript - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT -#endif // QSCRIPTASM_P_H diff --git a/src/script/qscriptastvisitor.cpp b/src/script/qscriptastvisitor.cpp deleted file mode 100644 index 8502bc5..0000000 --- a/src/script/qscriptastvisitor.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qscriptastvisitor_p.h" - -QT_BEGIN_NAMESPACE - -namespace QScript { namespace AST { - -Visitor::Visitor() -{ -} - -Visitor::~Visitor() -{ -} - -} } // namespace QScript::AST - -QT_END_NAMESPACE diff --git a/src/script/qscriptbuffer_p.h b/src/script/qscriptbuffer_p.h deleted file mode 100644 index 92fe6db..0000000 --- a/src/script/qscriptbuffer_p.h +++ /dev/null @@ -1,206 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTBUFFER_P_H -#define QSCRIPTBUFFER_P_H - -#include <QtCore/qglobal.h> - -QT_BEGIN_NAMESPACE - -// -// 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. -// - -namespace QScript -{ - template <typename T> class Buffer - { - public: - typedef T *iterator; - typedef const T *const_iterator; - - Buffer() : m_data(0), m_capacity(0), m_size(0) { } - ~Buffer() { delete [] m_data; } - - inline void reserve(int num); - inline void reset(); - inline void clear(); - inline void append(const T &t); - - inline iterator begin(); - inline iterator end(); - - inline const_iterator begin() const; - inline const_iterator end() const; - - inline int size() const; - inline void resize(int s); - - inline int capacity() const; - inline T *data(); - inline const T *constData() const; - - inline T &last(); - inline T &takeLast(); - - inline T &at(int i) { return (*this)[i]; } - inline const T &at(int i) const { return (*this)[i]; } - - inline T &operator[](int i); - inline const T &operator[](int i) const; - - inline bool isEmpty() const; - - private: - T *m_data; - int m_capacity; - int m_size; - - private: - Q_DISABLE_COPY(Buffer) - }; - -} // namespace QScript - -template <typename T> T *QScript::Buffer<T>::data() { return m_data; } -template <typename T> const T *QScript::Buffer<T>::constData() const { return m_data; } -template <typename T> void QScript::Buffer<T>::reset() { m_size = 0; } -template <typename T> int QScript::Buffer<T>::capacity() const { return m_capacity; } - -template <typename T> int QScript::Buffer<T>::size() const { return m_size; } -template <typename T> void QScript::Buffer<T>::resize(int s) -{ - if (m_capacity < s) - reserve (s << 1); - - m_size = s; -} - -template <typename T> void QScript::Buffer<T>::clear() -{ - delete [] m_data; - m_data = 0; - m_size = 0; - m_capacity = 0; -} - -template <typename T> void QScript::Buffer<T>::reserve(int x) -{ - // its an ever expanding buffer so it never gets smaller.. - if (x < m_capacity) - return; - m_capacity = x; - T *new_data = new T[m_capacity]; - for (int i=0; i<m_size; ++i) - new_data[i] = m_data[i]; - delete [] m_data; - m_data = new_data; -} - -template <typename T> void QScript::Buffer<T>::append(const T &t) -{ - if (m_size == m_capacity) - reserve(m_capacity + 32); - m_data[m_size++] = t; -} - -template <typename T> T &QScript::Buffer<T>::operator[](int i) -{ - Q_ASSERT(i >= 0); - Q_ASSERT(i < m_size); - return m_data[i]; -} - -template <typename T> const T &QScript::Buffer<T>::operator[](int i) const -{ - Q_ASSERT(i >= 0); - Q_ASSERT(i < m_size); - return m_data[i]; -} - -template <typename T> bool QScript::Buffer<T>::isEmpty() const -{ - return m_size == 0; -} - -template <typename T> T &QScript::Buffer<T>::takeLast() -{ - Q_ASSERT(!isEmpty()); - --m_size; - return m_data[m_size]; -} - -template <typename T> T &QScript::Buffer<T>::last() -{ - return m_data[m_size - 1]; -} - -template <typename T> typename QScript::Buffer<T>::iterator QScript::Buffer<T>::begin() -{ - return m_data; -} - -template <typename T> typename QScript::Buffer<T>::iterator QScript::Buffer<T>::end() -{ - return m_data + m_size; -} - -template <typename T> typename QScript::Buffer<T>::const_iterator QScript::Buffer<T>::begin() const -{ - return m_data; -} - -template <typename T> typename QScript::Buffer<T>::const_iterator QScript::Buffer<T>::end() const -{ - return m_data + m_size; -} - -QT_END_NAMESPACE - -#endif diff --git a/src/script/qscriptclass_p.h b/src/script/qscriptclass_p.h deleted file mode 100644 index 79c1a99..0000000 --- a/src/script/qscriptclass_p.h +++ /dev/null @@ -1,91 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTCLASS_P_H -#define QSCRIPTCLASS_P_H - -#include <QtCore/qobjectdefs.h> - -#ifndef QT_NO_SCRIPT - -QT_BEGIN_NAMESPACE - -// -// 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. -// - -class QScriptEngine; -class QScriptClassInfo; -class QScriptFunction; - -class QScriptClass; -class QScriptClassPrivate -{ - Q_DECLARE_PUBLIC(QScriptClass) -public: - QScriptClassPrivate(QScriptClass*); - virtual ~QScriptClassPrivate(); - - static QScriptClassPrivate *get(QScriptClass *klass); - - QScriptClassInfo *classInfo(); - static QScriptClass *classFromInfo(QScriptClassInfo *info); - - QScriptFunction *newFunction(); - - QScriptEngine *engine; - QScriptClassInfo *m_classInfo; - - QScriptClass *q_ptr; -}; - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptclassdata.cpp b/src/script/qscriptclassdata.cpp deleted file mode 100644 index aed6fea..0000000 --- a/src/script/qscriptclassdata.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qscriptclassdata_p.h" - -#ifndef QT_NO_SCRIPT - -QT_BEGIN_NAMESPACE - -QScriptClassData::QScriptClassData() -{ -} - -QScriptClassData::~QScriptClassData() -{ -} - -void QScriptClassData::mark(const QScriptValueImpl &, int) -{ -} - -bool QScriptClassData:: resolve(const QScriptValueImpl &, QScriptNameIdImpl *, - QScript::Member *, QScriptValueImpl *, - QScript::AccessMode) -{ - return false; -} - -bool QScriptClassData::get(const QScriptValueImpl &, const QScript::Member &, - QScriptValueImpl *) -{ - Q_ASSERT_X(false, "QScriptClassData::get()", - "implement if resolveMember is implemented"); - return false; -} - -bool QScriptClassData::put(QScriptValueImpl *, const QScript::Member &, - const QScriptValueImpl &) -{ - Q_ASSERT_X(false, "QScriptClassData::put()", - "implement if resolveMember is implemented"); - return false; -} - -bool QScriptClassData::removeMember(const QScriptValueImpl &, - const QScript::Member &) -{ - return true; -} - -bool QScriptClassData::implementsHasInstance(const QScriptValueImpl &) -{ - return false; -} - -bool QScriptClassData::hasInstance(const QScriptValueImpl &, - const QScriptValueImpl &) -{ - Q_ASSERT_X(false, "QScriptClassData::hasInstance()", - "implement if implementsHasInstance() returns true"); - return false; -} - -QScriptClassDataIterator *QScriptClassData::newIterator(const QScriptValueImpl &) -{ - return 0; -} - -QScriptClassDataIterator::QScriptClassDataIterator() -{ -} - -QScriptClassDataIterator::~QScriptClassDataIterator() -{ -} - -QT_END_NAMESPACE - -#endif diff --git a/src/script/qscriptclassdata_p.h b/src/script/qscriptclassdata_p.h deleted file mode 100644 index e801ed8..0000000 --- a/src/script/qscriptclassdata_p.h +++ /dev/null @@ -1,119 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTCLASSDATA_P_H -#define QSCRIPTCLASSDATA_P_H - -#include "qscriptglobals_p.h" - -#ifndef QT_NO_SCRIPT - -QT_BEGIN_NAMESPACE - -// -// 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. -// - -class QScriptValueImpl; -class QScriptNameIdImpl; -class QScriptClassDataIterator; - -namespace QScript { - class Member; -} - -class QScriptClassData -{ -protected: - QScriptClassData(); - -public: - virtual ~QScriptClassData(); - - virtual void mark(const QScriptValueImpl &object, int generation); - virtual bool resolve(const QScriptValueImpl &object, QScriptNameIdImpl *nameId, - QScript::Member *member, QScriptValueImpl *base, - QScript::AccessMode access); - virtual bool get(const QScriptValueImpl &obj, const QScript::Member &m, - QScriptValueImpl *result); - virtual bool put(QScriptValueImpl *object, const QScript::Member &member, - const QScriptValueImpl &value); - virtual bool removeMember(const QScriptValueImpl &object, - const QScript::Member &member); - virtual bool implementsHasInstance(const QScriptValueImpl &object); - virtual bool hasInstance(const QScriptValueImpl &object, - const QScriptValueImpl &value); - virtual QScriptClassDataIterator *newIterator(const QScriptValueImpl &object); - -private: - Q_DISABLE_COPY(QScriptClassData) -}; - -class QScriptClassDataIterator -{ -protected: - QScriptClassDataIterator(); - -public: - virtual ~QScriptClassDataIterator(); - - virtual bool hasNext() const = 0; - virtual void next(QScript::Member *member) = 0; - - virtual bool hasPrevious() const = 0; - virtual void previous(QScript::Member *member) = 0; - - virtual void toFront() = 0; - virtual void toBack() = 0; -}; - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif // QSCRIPTCLASSDATA_P_H diff --git a/src/script/qscriptclassinfo_p.h b/src/script/qscriptclassinfo_p.h deleted file mode 100644 index 8eab8a3..0000000 --- a/src/script/qscriptclassinfo_p.h +++ /dev/null @@ -1,122 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTCLASSINFO_P_H -#define QSCRIPTCLASSINFO_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 "qscriptclassdata_p.h" - -#ifndef QT_NO_SCRIPT - -#include <QtCore/qstring.h> - -QT_BEGIN_NAMESPACE - -class QScriptClassInfo -{ -public: - enum Type { - FunctionBased = 0x40000000, - - ObjectType = 1, - FunctionType = 2 | FunctionBased, - ArrayType = 3, - StringType = 4, - BooleanType = 5, - NumberType = 6, - DateType = 7, - RegExpType = 8, - ErrorType = 9, - - VariantType = 10, - QObjectType = 11, - QMetaObjectType = 12 | FunctionBased, - - // Types used by the runtime - ActivationType = 100, - EnumerationType = 101, - - CustomType = 1000, - - TypeMask = 0x0000FFFF - }; - - inline QScriptClassInfo(QScriptEnginePrivate *engine, Type type, const QString &name) - : m_engine(engine), m_type(type), m_name(name), m_data(0) { } - inline ~QScriptClassInfo() { delete m_data; } - - inline QScriptEnginePrivate *engine() const - { return m_engine; } - inline Type type() const - { return m_type; } - inline QString name() const - { return m_name; } - - inline void setData(QScriptClassData *data) - { m_data = data; } - QScriptClassData *data() const - { return m_data; } - -private: - QScriptEnginePrivate *m_engine; - Type m_type; - QString m_name; - QScriptClassData *m_data; - -private: - Q_DISABLE_COPY(QScriptClassInfo) -}; - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT -#endif // QSCRIPTCLASSINFO_P_H diff --git a/src/script/qscriptclasspropertyiterator.h b/src/script/qscriptclasspropertyiterator.h deleted file mode 100644 index 2041a65..0000000 --- a/src/script/qscriptclasspropertyiterator.h +++ /dev/null @@ -1,96 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTCLASSPROPERTYITERATOR_H -#define QSCRIPTCLASSPROPERTYITERATOR_H - -#include <QtCore/qstring.h> - -#ifndef QT_NO_SCRIPT - -#include <QtScript/qscriptvalue.h> - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Script) - -class QScriptClassPropertyIteratorPrivate; -class Q_SCRIPT_EXPORT QScriptClassPropertyIterator -{ -protected: - QScriptClassPropertyIterator(const QScriptValue &object); - -public: - virtual ~QScriptClassPropertyIterator(); - - QScriptValue object() const; - - virtual bool hasNext() const = 0; - virtual void next() = 0; - - virtual bool hasPrevious() const = 0; - virtual void previous() = 0; - - virtual void toFront() = 0; - virtual void toBack() = 0; - - virtual QScriptString name() const = 0; - virtual uint id() const; - virtual QScriptValue::PropertyFlags flags() const; - -protected: - QScriptClassPropertyIterator(const QScriptValue &object, QScriptClassPropertyIteratorPrivate &dd); - QScriptClassPropertyIteratorPrivate *d_ptr; - -private: - Q_DECLARE_PRIVATE(QScriptClassPropertyIterator) - Q_DISABLE_COPY(QScriptClassPropertyIterator) -}; - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptclasspropertyiterator_p.h b/src/script/qscriptclasspropertyiterator_p.h deleted file mode 100644 index b1d7467..0000000 --- a/src/script/qscriptclasspropertyiterator_p.h +++ /dev/null @@ -1,81 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTCLASSPROPERTYITERATOR_P_H -#define QSCRIPTCLASSPROPERTYITERATOR_P_H - -#include <QtCore/qobjectdefs.h> - -#ifndef QT_NO_SCRIPT - -#include "qscriptvalue.h" - -QT_BEGIN_NAMESPACE - -// -// 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. -// - -class QScriptClassPropertyIterator; -class QScriptClassPropertyIteratorPrivate -{ - Q_DECLARE_PUBLIC(QScriptClassPropertyIterator) -public: - QScriptClassPropertyIteratorPrivate(QScriptClassPropertyIterator*); - virtual ~QScriptClassPropertyIteratorPrivate(); - - QScriptValue object; - - QScriptClassPropertyIterator *q_ptr; -}; - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptcompiler.cpp b/src/script/qscriptcompiler.cpp deleted file mode 100644 index 157e466..0000000 --- a/src/script/qscriptcompiler.cpp +++ /dev/null @@ -1,2111 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qscriptcompiler_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptast_p.h" -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" - -#include <QtCore/QtDebug> - -QT_BEGIN_NAMESPACE - -namespace QScript { - -class Compare : protected AST::Visitor -{ -public: - bool operator()(AST::ExpressionNode *e1, AST::ExpressionNode *e2) - { - if (!e1 || !e2) - return (e1 == e2); - - if (e1->kind != e2->kind) - return false; - - m_e2 = e2; - m_equal = false; - e1->accept(this); - return m_equal; - } - -protected: - virtual bool visit(AST::ThisExpression *) - { - m_equal = true; - return false; - } - virtual bool visit(AST::NullExpression *) - { - m_equal = true; - return false; - } - virtual bool visit(AST::VoidExpression *) - { - m_equal = true; - return false; - } - virtual bool visit(AST::FalseLiteral *) - { - m_equal = true; - return false; - } - virtual bool visit(AST::TrueLiteral *) - { - m_equal = true; - return false; - } - virtual bool visit(AST::NumericLiteral *e1) - { - AST::NumericLiteral *e2 = static_cast<AST::NumericLiteral*>(m_e2); - m_equal = (e1->value == e2->value); - return false; - } - virtual bool visit(AST::RegExpLiteral *e1) - { - AST::RegExpLiteral *e2 = static_cast<AST::RegExpLiteral*>(m_e2); - m_equal = (e1->pattern == e2->pattern) - && (e1->flags == e2->flags); - return false; - } - virtual bool visit(AST::StringLiteral *e1) - { - AST::StringLiteral *e2 = static_cast<AST::StringLiteral*>(m_e2); - m_equal = (e1->value == e2->value); - return false; - } - virtual bool visit(AST::IdentifierExpression *e1) - { - AST::IdentifierExpression *e2 = static_cast<AST::IdentifierExpression*>(m_e2); - m_equal = (e1->name == e2->name); - return false; - } - virtual bool visit(AST::ArrayMemberExpression *e1) - { - AST::ArrayMemberExpression *e2 = static_cast<AST::ArrayMemberExpression*>(m_e2); - m_equal = operator()(e1->base, e2->base) - && operator()(e1->expression, e2->expression); - return false; - } - virtual bool visit(AST::FieldMemberExpression *e1) - { - AST::FieldMemberExpression *e2 = static_cast<AST::FieldMemberExpression*>(m_e2); - m_equal = (e1->name == e2->name) && operator()(e1->base, e2->base); - return false; - } - virtual bool visit(AST::BinaryExpression *e1) - { - AST::BinaryExpression *e2 = static_cast<AST::BinaryExpression*>(m_e2); - m_equal = (e1->op == e2->op) && operator()(e1->left, e2->left) - && operator()(e1->right, e2->right); - return false; - } - virtual bool visit(AST::ConditionalExpression *e1) - { - AST::ConditionalExpression *e2 = static_cast<AST::ConditionalExpression*>(m_e2); - m_equal = operator()(e1->expression, e2->expression) - && operator()(e1->ok, e2->ok) - && operator()(e1->ko, e2->ko); - return false; - } - virtual bool visit(AST::TypeOfExpression *e1) - { - AST::TypeOfExpression *e2 = static_cast<AST::TypeOfExpression*>(m_e2); - m_equal = operator()(e1->expression, e2->expression); - return false; - } - virtual bool visit(AST::UnaryPlusExpression *e1) - { - AST::UnaryPlusExpression *e2 = static_cast<AST::UnaryPlusExpression*>(m_e2); - m_equal = operator()(e1->expression, e2->expression); - return false; - } - virtual bool visit(AST::UnaryMinusExpression *e1) - { - AST::UnaryMinusExpression *e2 = static_cast<AST::UnaryMinusExpression*>(m_e2); - m_equal = operator()(e1->expression, e2->expression); - return false; - } - virtual bool visit(AST::TildeExpression *e1) - { - AST::TildeExpression *e2 = static_cast<AST::TildeExpression*>(m_e2); - m_equal = operator()(e1->expression, e2->expression); - return false; - } - virtual bool visit(AST::NotExpression *e1) - { - AST::NotExpression *e2 = static_cast<AST::NotExpression*>(m_e2); - m_equal = operator()(e1->expression, e2->expression); - return false; - } - virtual bool visit(AST::Expression *) - { return false; } - virtual bool visit(AST::ArrayLiteral *) - { return false; } - virtual bool visit(AST::ObjectLiteral *) - { return false; } - virtual bool visit(AST::CallExpression *) - { return false; } - virtual bool visit(AST::DeleteExpression *) - { return false; } - virtual bool visit(AST::FunctionExpression *) - { return false; } - virtual bool visit(AST::NewExpression *) - { return false; } - virtual bool visit(AST::NewMemberExpression *) - { return false; } - virtual bool visit(AST::PostDecrementExpression *) - { return false; } - virtual bool visit(AST::PostIncrementExpression *) - { return false; } - virtual bool visit(AST::PreDecrementExpression *) - { return false; } - virtual bool visit(AST::PreIncrementExpression *) - { return false; } - -private: - AST::ExpressionNode *m_e2; - bool m_equal; -}; - -class FetchName: protected AST::Visitor -{ -public: - inline FetchName(QScriptEnginePrivate *e): - eng(e), name(0) {} - - QScriptNameIdImpl *operator() (AST::PropertyName *node) - { - name = 0; - node->accept(this); - return name; - } - -protected: - virtual bool visit(AST::IdentifierPropertyName *node) - { - name = node->id; - return false; - } - - virtual bool visit(AST::StringLiteralPropertyName *node) - { - name = node->id; - return false; - } - - virtual bool visit(AST::NumericLiteralPropertyName *node) - { - name = eng->nameId(QString::number(node->id), /*persistent=*/false); // ### don't use QString::number - name->persistent = true; // ### remove - return false; - } - -private: - QScriptEnginePrivate *eng; - QScriptNameIdImpl *name; -}; - -class EmptySourceElements: protected AST::Visitor -{ -public: - EmptySourceElements(QScriptEngine *d): - driver(d), empty(false) {} - - inline bool operator () (AST::Node *) - { - empty = false; - return empty; - } - -private: - QScriptEngine *driver; - bool empty; -}; - -class DeclareLocals: protected AST::Visitor -{ -public: - DeclareLocals(Compiler *c): - compiler(c), - eng(c->engine()) - { - } - - void operator () (AST::Node *node) - { - if (node) - node->accept(this); - } - -protected: - virtual bool visit(AST::FunctionDeclaration *node) - { - compiler->iDeclareLocal(node->name, /*readOnly=*/false); - return false; - } - - virtual bool visit(AST::FunctionExpression *) - { return false; } - - virtual bool visit(AST::VariableDeclaration *node) - { - compiler->iDeclareLocal(node->name, node->readOnly); - return false; - } - -private: - Compiler *compiler; - QScriptEnginePrivate *eng; -}; - -Compiler::Compiler(QScriptEnginePrivate *eng): - m_eng(eng), - m_generateReferences(0), m_iterationStatement(0), - m_switchStatement(0), m_withStatement(0), - m_generateLeaveWithOnBreak(0), m_generateFastArgumentLookup(0), - m_parseStatements(0), m_pad(0), - m_topLevelCompiler(false), - m_activeLoop(0) -{ -} - -Compiler::~Compiler() -{ -} - -bool Compiler::topLevelCompiler() const -{ - return m_topLevelCompiler; -} - -void Compiler::setTopLevelCompiler(bool b) -{ - m_topLevelCompiler = b; -} - - CompilationUnit Compiler::compile(AST::Node *node, const QList<QScriptNameIdImpl *> &formals) -{ - m_formals = formals; - m_generateReferences = 0; - m_iterationStatement = 0; - m_switchStatement = 0; - m_withStatement = 0; - m_generateLeaveWithOnBreak = 0; - m_generateFastArgumentLookup = 0; - m_parseStatements = 0; - m_pad = 0; - m_instructions.clear(); - m_exceptionHandlers.clear(); - m_generateFastArgumentLookup = false; // ### !formals.isEmpty(); // ### disabled for now.. it's buggy :( - - m_compilationUnit = CompilationUnit(); - - if (node) - node->accept(this); - - // add a terminator - if (topLevelCompiler()) { - iHalt(); - } else if (m_instructions.isEmpty() || m_instructions.last().op != QScriptInstruction::OP_Ret) { - iLoadUndefined(); - iRet(); - } - - m_compilationUnit.setInstructions(m_instructions); - m_compilationUnit.setExceptionHandlers(m_exceptionHandlers); - return m_compilationUnit; -} - -bool Compiler::preVisit(AST::Node *) -{ - return m_compilationUnit.isValid(); -} - -bool Compiler::visit(AST::SourceElements *node) -{ - DeclareLocals declareLocals(this); - declareLocals(node); - - bool was = changeParseStatements(false); - - for (AST::SourceElements *it = node; it != 0; it = it->next) - it->element->accept(this); - - changeParseStatements(true); - - for (AST::SourceElements *it = node; it != 0; it = it->next) - it->element->accept(this); - - changeParseStatements(was); - - return false; -} - -bool Compiler::visit(AST::StatementList *) -{ - return true; -} - -bool Compiler::visit(AST::FunctionSourceElement *) -{ - return m_parseStatements == 0; -} - -bool Compiler::visit(AST::StatementSourceElement *) -{ - return m_parseStatements; -} - -bool Compiler::visit(AST::ThisExpression *) -{ - iLoadThis(); - return false; -} - -bool Compiler::visit(AST::NullExpression *) -{ - iLoadNull(); - return false; -} - -bool Compiler::visit(AST::RegExpLiteral *node) -{ - Q_ASSERT(node->pattern != 0); - - if (node->flags) - iNewRegExp(node->pattern, node->flags); - else - iNewRegExp(node->pattern); - - return false; -} - -bool Compiler::visit(AST::NumericLiteral *node) -{ - iLoadNumber(node->value); - return false; -} - -bool Compiler::visit(AST::StringLiteral *node) -{ - iNewString(node->value); - - return false; -} - -bool Compiler::visit(AST::ObjectLiteral *node) -{ - iNewObject(); - - FetchName fetchName(m_eng); - bool was = generateReferences(false); - for (AST::PropertyNameAndValueList *it = node->properties; it != 0; it = it->next) { - iLine(it->value); - iDuplicate(); - - QScriptNameIdImpl *name = fetchName(it->name); - Q_ASSERT(name != 0); - iLoadString(name); - iMakeReference(); - - it->value->accept(this); - iPutField(); - } - generateReferences(was); - - return false; -} - -bool Compiler::visit(AST::IdentifierExpression *node) -{ - Q_ASSERT(node->name != 0); - - if (node->name == m_eng->idTable()->id_arguments) - iLazyArguments(); - if (m_generateReferences) - iResolve(node->name); - else - iFetch(node->name); - - return false; -} - -bool Compiler::visit(AST::FunctionDeclaration *node) -{ - iLoadActivation(); - iLoadString(node->name); - iMakeReference(); - iNewClosure(node); - iPutField(); - return false; -} - -bool Compiler::visit(AST::FunctionExpression *node) -{ - iNewClosure(node); - if (node->name) { - iDuplicate(); - iLoadActivation(); - iSwap(); - iLoadString(node->name); - iSwap(); - iMakeReference(); - iSwap(); - iPutField(); - } - return false; -} - -bool Compiler::visit(AST::CallExpression *node) -{ - bool was = generateReferences(true); - node->base->accept(this); - generateReferences(false); - - int argc = 0; - for (AST::ArgumentList *it = node->arguments; it != 0; it = it->next) { - it->expression->accept(this); - ++argc; - } - - generateReferences(was); - - iCall(argc); - return false; -} - -bool Compiler::visit(AST::NewExpression *node) -{ - bool was = generateReferences(true); - node->expression->accept(this); - generateReferences(was); - iNew(0); - return false; -} - -bool Compiler::visit(AST::NewMemberExpression *node) -{ - bool was = generateReferences(true); - node->base->accept(this); - generateReferences(false); - - int argc = 0; - for (AST::ArgumentList *it = node->arguments; it != 0; it = it->next) { - it->expression->accept(this); - ++argc; - } - - generateReferences(was); - - iNew(argc); - return false; -} - -bool Compiler::visit(AST::FieldMemberExpression *node) -{ - bool was = generateReferences(false); - node->base->accept(this); - generateReferences(was); - - iLoadString(node->name); - - if (! was) - iFetchField(); - else - iMakeReference(); - - return false; -} - -bool Compiler::visit(AST::ArrayMemberExpression *node) -{ - bool was = generateReferences(false); - node->base->accept(this); - node->expression->accept(this); - generateReferences(was); - - if (! was) - iFetchField(); - else - iMakeReference(); - - return false; -} - -bool Compiler::visit(AST::PostIncrementExpression *node) -{ - bool was = generateReferences(true); - node->base->accept(this); - generateReferences(was); - iPostIncr(); - - return false; -} - -bool Compiler::visit(AST::PostDecrementExpression *node) -{ - bool was = generateReferences(true); - node->base->accept(this); - generateReferences(was); - iPostDecr(); - - return false; -} - -bool Compiler::visit(AST::PreIncrementExpression *node) -{ - bool was = generateReferences(true); - node->expression->accept(this); - generateReferences(was); - iIncr(); - return false; -} - -bool Compiler::visit(AST::PreDecrementExpression *node) -{ - bool was = generateReferences(true); - node->expression->accept(this); - generateReferences(was); - iDecr(); - return false; -} - -void Compiler::endVisit(AST::NotExpression *) -{ - iNot(); -} - -void Compiler::endVisit(AST::TildeExpression *) -{ - iBitNot(); -} - -bool Compiler::visit(AST::ThrowStatement *node) -{ - iLine(node); - return true; -} - -bool Compiler::visit(AST::TryStatement *node) -{ - int start = nextInstructionOffset(); - if (node->statement) - node->statement->accept(this); - int end = nextInstructionOffset(); - if (node->catchExpression) { - iBranch(0); // skip the catch if no exception - ExceptionHandlerDescriptor ehd(start, end, nextInstructionOffset()); - m_exceptionHandlers.append(ehd); - iBeginCatch(node->catchExpression->name); - node->catchExpression->statement->accept(this); - iEndCatch(); - patchInstruction(end, nextInstructionOffset() - end); - } - if (node->finallyExpression) { - if (!node->catchExpression) { - ExceptionHandlerDescriptor ehd(start, end, nextInstructionOffset()); - m_exceptionHandlers.prepend(ehd); - } - node->finallyExpression->statement->accept(this); - } - return false; -} - -void Compiler::endVisit(AST::ThrowStatement *node) -{ - if (! node->expression) - iLoadUndefined(); - - iThrow(); -} - -void Compiler::endVisit(AST::VoidExpression *) -{ - iPop(); - iLoadUndefined(); -} - -bool Compiler::visit(AST::TypeOfExpression *node) -{ - bool was = generateReferences(true); - node->expression->accept(this); - generateReferences(was); - iTypeOf(); - return false; -} - -bool Compiler::visit(AST::DeleteExpression *node) -{ - bool was = generateReferences(true); - node->expression->accept(this); - generateReferences(was); - iDelete(); - return false; -} - -bool Compiler::visit(AST::ReturnStatement *node) -{ - if (topLevelCompiler()) { - m_compilationUnit.setError(QString::fromUtf8("return outside function body"), - node->startLine); - return false; - } - iLine(node); - return true; -} - -void Compiler::endVisit(AST::ReturnStatement *node) -{ - if (! node->expression) - iLoadUndefined(); - - iRet(); -} - -bool Compiler::visit(AST::VariableStatement *node) -{ - AST::VariableDeclarationList *lst = node->declarations; - while (lst) { - if (lst->declaration->expression) { - iLine(node); - break; - } - lst = lst->next; - } - return true; -} - -bool Compiler::visit(AST::VariableDeclaration *node) -{ - if (node->expression != 0) { - iResolve(node->name); - node->expression->accept(this); - iAssign(); - iPop(); - } - - return false; -} - -bool Compiler::visit(AST::ConditionalExpression *node) -{ - node->expression->accept(this); - - int cond = nextInstructionOffset(); - iBranchFalse(0); - - node->ok->accept(this); - - if (! node->ko) { - patchInstruction(cond, nextInstructionOffset() - cond); - } else { - int terminator = nextInstructionOffset(); - iBranch(0); - node->ko->accept(this); - - patchInstruction(cond, terminator + 1 - cond); - patchInstruction(terminator, nextInstructionOffset() - terminator); - } - - return false; -} - -bool Compiler::visit(AST::IfStatement *node) -{ - iLine(node); - node->expression->accept(this); - - int cond = nextInstructionOffset(); - iBranchFalse(0); - - node->ok->accept(this); - - if (! node->ko) { - patchInstruction(cond, nextInstructionOffset() - cond); - } else { - int terminator = nextInstructionOffset(); - iBranch(0); - node->ko->accept(this); - - patchInstruction(cond, terminator + 1 - cond); - patchInstruction(terminator, nextInstructionOffset() - terminator); - } - if (!m_instructions.isEmpty() && m_instructions.last().op == QScriptInstruction::OP_Ret) - iNop(); - - return false; -} - -bool Compiler::visit(AST::Block *node) -{ - if (node->statements && m_loops.contains(node)) { - Loop &loop = m_loops[node]; - - node->statements->accept(this); - - loop.breakLabel.offset = nextInstructionOffset(); - - foreach (int index, loop.breakLabel.uses) { - patchInstruction(index, loop.breakLabel.offset - index); - } - - return false; - } - - return true; -} - -bool Compiler::visit(AST::WhileStatement *node) -{ - Loop *previousLoop = changeActiveLoop(&m_loops[node]); - m_activeLoop->continueLabel.offset = nextInstructionOffset(); - - iLine(node); - int again = nextInstructionOffset(); - node->expression->accept(this); - - int cond = nextInstructionOffset(); - iBranchFalse(0); - - bool was = iterationStatement(true); - bool was2 = generateLeaveOnBreak(false); - node->statement->accept(this); - generateLeaveOnBreak(was2); - iterationStatement(was); - - iBranch(again - nextInstructionOffset()); - patchInstruction(cond, nextInstructionOffset() - cond); - - m_activeLoop->breakLabel.offset = nextInstructionOffset(); - - foreach (int index, m_activeLoop->breakLabel.uses) { - patchInstruction(index, m_activeLoop->breakLabel.offset - index); - } - - foreach (int index, m_activeLoop->continueLabel.uses) { - patchInstruction(index, m_activeLoop->continueLabel.offset - index); - } - - changeActiveLoop(previousLoop); - m_loops.remove(node); - - return false; -} - -bool Compiler::visit(AST::DoWhileStatement *node) -{ - Loop *previousLoop = changeActiveLoop(&m_loops[node]); - int again = nextInstructionOffset(); - iLine(node); - bool was = iterationStatement(true); - node->statement->accept(this); - iterationStatement(was); - - m_activeLoop->continueLabel.offset = nextInstructionOffset(); - - node->expression->accept(this); - - iBranchTrue(again - nextInstructionOffset()); - m_activeLoop->breakLabel.offset = nextInstructionOffset(); - - foreach (int index, m_activeLoop->breakLabel.uses) { - patchInstruction(index, m_activeLoop->breakLabel.offset - index); - } - - foreach (int index, m_activeLoop->continueLabel.uses) { - patchInstruction(index, m_activeLoop->continueLabel.offset - index); - } - - changeActiveLoop(previousLoop); - m_loops.remove(node); - - return false; -} - -bool Compiler::visit(AST::ForEachStatement *node) -{ - Loop *previousLoop = changeActiveLoop(&m_loops[node]); - - iLine(node); - node->expression->accept(this); - iNewEnumeration(); - iDuplicate(); - iToFirstElement(); - - int again = nextInstructionOffset(); - m_activeLoop->continueLabel.offset = again; - iDuplicate(); - iHasNextElement(); - int cond = nextInstructionOffset(); - iBranchFalse(0); - bool was = generateReferences(true); - node->initialiser->accept(this); - generateReferences(was); - iNextElement(); - iAssign(); - iPop(); - was = iterationStatement(true); - node->statement->accept(this); - iterationStatement(was); - iBranch(again - nextInstructionOffset()); - patchInstruction(cond, nextInstructionOffset() - cond); - - m_activeLoop->breakLabel.offset = nextInstructionOffset(); - iPop(); // pop the Enumeration - - foreach (int index, m_activeLoop->breakLabel.uses) { - patchInstruction(index, m_activeLoop->breakLabel.offset - index); - } - - foreach (int index, m_activeLoop->continueLabel.uses) { - patchInstruction(index, m_activeLoop->continueLabel.offset - index); - } - - changeActiveLoop(previousLoop); - m_loops.remove(node); - - return false; -} - -bool Compiler::visit(AST::LocalForEachStatement *node) -{ - Loop *previousLoop = changeActiveLoop(&m_loops[node]); - - iLine(node); - node->declaration->accept(this); - node->expression->accept(this); - iNewEnumeration(); - iDuplicate(); - iToFirstElement(); - - int again = nextInstructionOffset(); - m_activeLoop->continueLabel.offset = again; - iDuplicate(); - iHasNextElement(); - int cond = nextInstructionOffset(); - iBranchFalse(0); - iResolve(node->declaration->name); - iNextElement(); - iAssign(); - iPop(); - bool was = iterationStatement(true); - node->statement->accept(this); - iterationStatement(was); - iBranch(again - nextInstructionOffset()); - patchInstruction(cond, nextInstructionOffset() - cond); - - m_activeLoop->breakLabel.offset = nextInstructionOffset(); - iPop(); // pop the Enumeration - - foreach (int index, m_activeLoop->breakLabel.uses) { - patchInstruction(index, m_activeLoop->breakLabel.offset - index); - } - - foreach (int index, m_activeLoop->continueLabel.uses) { - patchInstruction(index, m_activeLoop->continueLabel.offset - index); - } - - changeActiveLoop(previousLoop); - m_loops.remove(node); - - return false; -} - -void Compiler::visitForInternal(AST::Statement *node, AST::ExpressionNode *condition, AST::Statement *statement, AST::ExpressionNode *expression) -{ - Q_ASSERT(statement != 0); - - int again = nextInstructionOffset(); - if (condition != 0) { -// iLine(condition); - condition->accept(this); - } else { -// iLine(node); - iLoadNumber(1); - } - - int cond = nextInstructionOffset(); - iBranchFalse(0); - - Loop *previousLoop = changeActiveLoop(&m_loops[node]); - - bool was = iterationStatement(true); - statement->accept(this); - iterationStatement(was); - - m_activeLoop->continueLabel.offset = nextInstructionOffset(); - - if (expression != 0) { - expression->accept(this); - iPop(); - } - - iBranch(again - nextInstructionOffset()); - patchInstruction(cond, nextInstructionOffset() - cond); - - m_activeLoop->breakLabel.offset = nextInstructionOffset(); - - foreach (int index, m_activeLoop->breakLabel.uses) { - patchInstruction(index, m_activeLoop->breakLabel.offset - index); - } - - foreach (int index, m_activeLoop->continueLabel.uses) { - patchInstruction(index, m_activeLoop->continueLabel.offset - index); - } - - changeActiveLoop(previousLoop); - m_loops.remove(node); -} - -bool Compiler::visit(AST::ForStatement *node) -{ - iLine(node); - - if (node->initialiser != 0) { - node->initialiser->accept(this); - iPop(); - } - - visitForInternal(node, node->condition, node->statement, node->expression); - return false; -} - -bool Compiler::visit(AST::LocalForStatement *node) -{ - iLine(node); - - if (node->declarations) - node->declarations->accept(this); - - visitForInternal(node, node->condition, node->statement, node->expression); - return false; -} - -bool Compiler::isAssignmentOperator(int op) const -{ - switch (op) { - - case QSOperator::Assign: - case QSOperator::InplaceAnd: - case QSOperator::InplaceSub: - case QSOperator::InplaceDiv: - case QSOperator::InplaceAdd: - case QSOperator::InplaceLeftShift: - case QSOperator::InplaceMod: - case QSOperator::InplaceMul: - case QSOperator::InplaceOr: - case QSOperator::InplaceRightShift: - case QSOperator::InplaceURightShift: - case QSOperator::InplaceXor: - return true; - - default: - break; - - } - - return false; -} - -int Compiler::inplaceAssignmentOperator(int op) const -{ - switch (op) { - case QSOperator::BitAnd: - return QSOperator::InplaceAnd; - case QSOperator::Sub: - return QSOperator::InplaceSub; - case QSOperator::Div: - return QSOperator::InplaceDiv; - case QSOperator::Add: - return QSOperator::InplaceAdd; - case QSOperator::LShift: - return QSOperator::InplaceLeftShift; - case QSOperator::Mod: - return QSOperator::InplaceMod; - case QSOperator::Mul: - return QSOperator::InplaceMul; - case QSOperator::BitOr: - return QSOperator::InplaceOr; - case QSOperator::RShift: - return QSOperator::InplaceRightShift; - case QSOperator::URShift: - return QSOperator::InplaceURightShift; - case QSOperator::BitXor: - return QSOperator::InplaceXor; - - default: - break; - - } - - return(-1); -} - -bool Compiler::visit(AST::Expression *node) -{ - node->left->accept(this); - iPop(); // ### or iSync? - node->right->accept(this); - return false; -} - -bool Compiler::visit(AST::BinaryExpression *node) -{ - if (isAssignmentOperator(node->op)) { - bool was = generateReferences(true); - node->left->accept(this); - generateReferences(was); - } else { - node->left->accept(this); - } - - int address = 0; - if (node->op == QSOperator::Or || node->op == QSOperator::And) { - iDuplicate(); - address = nextInstructionOffset(); - if (node->op == QSOperator::Or) - iBranchTrue(0); - else - iBranchFalse(0); - iPop(); - } - - int op = node->op; - Compare compare; - if ((op == QSOperator::Assign) && node->right->binaryExpressionCast() - && (inplaceAssignmentOperator(node->right->binaryExpressionCast()->op) != -1) - && compare(node->left, node->right->binaryExpressionCast()->left)) { - // node->left is equivalent to node->right->left, so we generate - // x op= y rather than x = x op y - op = inplaceAssignmentOperator(node->right->binaryExpressionCast()->op); - node->right->binaryExpressionCast()->right->accept(this); - } else { - node->right->accept(this); - } - - switch (op) { - - case QSOperator::Assign: - iAssign(); - break; - - case QSOperator::InplaceAnd: - iInplaceAnd(); - break; - - case QSOperator::InplaceSub: - iInplaceSub(); - break; - - case QSOperator::InplaceDiv: - iInplaceDiv(); - break; - - case QSOperator::InplaceAdd: - iInplaceAdd(); - break; - - case QSOperator::InplaceLeftShift: - iInplaceLeftShift(); - break; - - case QSOperator::InplaceMod: - iInplaceMod(); - break; - - case QSOperator::InplaceMul: - iInplaceMul(); - break; - - case QSOperator::InplaceOr: - iInplaceOr(); - break; - - case QSOperator::InplaceRightShift: - iInplaceRightShift(); - break; - - case QSOperator::InplaceURightShift: - iInplaceURightShift(); - break; - - case QSOperator::InplaceXor: - iInplaceXor(); - break; - - case QSOperator::BitAnd: - iBitAnd(); - break; - - case QSOperator::BitOr: - iBitOr(); - break; - - case QSOperator::BitXor: - iBitXor(); - break; - - case QSOperator::LShift: - iLeftShift(); - break; - - case QSOperator::Mod: - iMod(); - break; - - case QSOperator::RShift: - iRightShift(); - break; - - case QSOperator::URShift: - iURightShift(); - break; - - case QSOperator::InstanceOf: - iInstanceOf(); - break; - - case QSOperator::Add: - iAdd(); - break; - - case QSOperator::And: - patchInstruction(address, nextInstructionOffset() - address); - break; - - case QSOperator::Div: - iDiv(); - break; - - case QSOperator::Equal: - iEqual(); - break; - - case QSOperator::Ge: - iGreatOrEqual(); - break; - - case QSOperator::Gt: - iGreatThan(); - break; - - case QSOperator::Le: - iLessOrEqual(); - break; - - case QSOperator::Lt: - iLessThan(); - break; - - case QSOperator::Mul: - iMul(); - break; - - case QSOperator::NotEqual: - iNotEqual(); - break; - - case QSOperator::Or: - patchInstruction(address, nextInstructionOffset() - address); - break; - - case QSOperator::Sub: - iSub(); - break; - - case QSOperator::StrictEqual: - iStrictEqual(); - break; - - case QSOperator::StrictNotEqual: - iStrictNotEqual(); - break; - - case QSOperator::In: - iIn(); - break; - } - - return false; -} - -bool Compiler::visit(AST::TrueLiteral *) -{ - iLoadTrue(); - return false; -} - -bool Compiler::visit(AST::FalseLiteral *) -{ - iLoadFalse(); - return false; -} - -bool Compiler::visit(AST::SwitchStatement *node) -{ - iLine(node); - Loop *previousLoop = changeActiveLoop(&m_loops[node]); - - node->expression->accept(this); - - bool was = switchStatement(true); - - AST::CaseClauses *clauses; - int skipIndex = -1; - int fallthroughIndex = -1; - // ### make a function for this - for (clauses = node->block->clauses; clauses != 0; clauses = clauses->next) { - AST::CaseClause *clause = clauses->clause; - if (skipIndex != -1) - patchInstruction(skipIndex, nextInstructionOffset() - skipIndex); - - iDuplicate(); // expression - clause->expression->accept(this); - iStrictEqual(); - skipIndex = nextInstructionOffset(); - iBranchFalse(0); // next case - - if (fallthroughIndex != -1) // previous case falls through to here - patchInstruction(fallthroughIndex, nextInstructionOffset() - fallthroughIndex); - - int breaksBefore = m_activeLoop->breakLabel.uses.count(); - if (clause->statements) - clause->statements->accept(this); - int breaksAfter = m_activeLoop->breakLabel.uses.count(); - if (breaksAfter == breaksBefore) { // fallthrough - fallthroughIndex = nextInstructionOffset(); - iBranch(0); - } else { // no fallthrough (break) - fallthroughIndex = -1; - } - } - - if (fallthroughIndex != -1) { - patchInstruction(fallthroughIndex, nextInstructionOffset() - fallthroughIndex); - fallthroughIndex = -1; - } - - int defaultIndex = -1; - if (node->block->defaultClause) { - int skipDefaultIndex = -1; - if (!node->block->clauses && node->block->moreClauses) { - skipDefaultIndex = nextInstructionOffset(); - iBranch(0); - } - defaultIndex = nextInstructionOffset(); - int breaksBefore = m_activeLoop->breakLabel.uses.count(); - if (node->block->defaultClause->statements) - node->block->defaultClause->statements->accept(this); - int breaksAfter = m_activeLoop->breakLabel.uses.count(); - if (breaksAfter == breaksBefore) { // fallthrough - fallthroughIndex = nextInstructionOffset(); - iBranch(0); - } else { // no fallthrough (break) - fallthroughIndex = -1; - } - if (skipDefaultIndex != -1) - patchInstruction(skipDefaultIndex, nextInstructionOffset() - skipDefaultIndex); - } - - for (clauses = node->block->moreClauses; clauses != 0; clauses = clauses->next) { - AST::CaseClause *clause = clauses->clause; - if (skipIndex != -1) - patchInstruction(skipIndex, nextInstructionOffset() - skipIndex); - - iDuplicate(); // expression - clause->expression->accept(this); - iStrictEqual(); - skipIndex = nextInstructionOffset(); - iBranchFalse(0); // next case - - if (fallthroughIndex != -1) // previous case falls through to here - patchInstruction(fallthroughIndex, nextInstructionOffset() - fallthroughIndex); - - int breaksBefore = m_activeLoop->breakLabel.uses.count(); - if (clause->statements) - clause->statements->accept(this); - int breaksAfter = m_activeLoop->breakLabel.uses.count(); - if (breaksAfter == breaksBefore) { // fallthrough - fallthroughIndex = nextInstructionOffset(); - iBranch(0); - } else { // no fallthrough (break) - fallthroughIndex = -1; - } - } - - if (skipIndex != -1) { - patchInstruction(skipIndex, nextInstructionOffset() - skipIndex); - if (defaultIndex != -1) - iBranch(defaultIndex - nextInstructionOffset()); // goto default - } - - if (fallthroughIndex != -1) - patchInstruction(fallthroughIndex, nextInstructionOffset() - fallthroughIndex); - - // backpatch the breaks - int term = nextInstructionOffset(); - foreach (int index, m_activeLoop->breakLabel.uses) { - patchInstruction(index, term - index); - } - - iPop(); // expression - - if (previousLoop && !m_activeLoop->continueLabel.uses.isEmpty()) { - // join the continues and add to outer loop - iBranch(3); - foreach (int index, m_activeLoop->continueLabel.uses) { - patchInstruction(index, nextInstructionOffset() - index); - } - iPop(); - iBranch(0); - previousLoop->continueLabel.uses.append(nextInstructionOffset() - 1); - } - - switchStatement(was); - changeActiveLoop(previousLoop); - m_loops.remove(node); - return false; -} - -bool Compiler::visit(AST::LabelledStatement *node) -{ - Loop *loop = findLoop(node->label); - if (loop != 0) { - QString str = m_eng->toString(node->label); - m_compilationUnit.setError(QString::fromUtf8("duplicate label `%1'").arg(str), - node->startLine); - return false; - } - - loop = &m_loops[node->statement]; - loop->name = node->label; - node->statement->accept(this); - if (m_loops.contains(node->statement)) { - loop->breakLabel.offset = nextInstructionOffset(); - foreach (int index, loop->breakLabel.uses) { - patchInstruction(index, loop->breakLabel.offset - index); - } - m_loops.remove(node->statement); - } - return false; -} - -bool Compiler::visit(AST::ExpressionStatement *node) -{ - if (node->expression) - iLine(node->expression); - return true; -} - -void Compiler::endVisit(AST::ExpressionStatement *) -{ - if (topLevelCompiler()) - iSync(); - else - iPop(); -} - -void Compiler::endVisit(AST::UnaryPlusExpression *) -{ - iUnaryPlus(); -} - -void Compiler::endVisit(AST::UnaryMinusExpression *) -{ - iUnaryMinus(); -} - -bool Compiler::visit(AST::ContinueStatement *node) -{ - iLine(node); - return true; -} - -void Compiler::endVisit(AST::ContinueStatement *node) -{ - int offset = nextInstructionOffset(); - iBranch(0); - - Loop *loop = findLoop(node->label); - if (!loop || !m_iterationStatement) { - m_compilationUnit.setError(QString::fromUtf8("label not found"), - node->startLine); - return; - } - - loop->continueLabel.uses.append(offset); -} - -bool Compiler::visit(AST::BreakStatement *node) -{ - iLine(node); - return true; -} - -void Compiler::endVisit(AST::BreakStatement *node) -{ - Loop *loop = findLoop(node->label); - if (! loop) { - m_compilationUnit.setError(QString::fromUtf8("label not found"), - node->startLine); - return; - } - - if (m_generateLeaveWithOnBreak) - iLeaveWith(); - int offset = nextInstructionOffset(); - iBranch(0); - loop->breakLabel.uses.append(offset); -} - -void Compiler::endVisit(AST::EmptyStatement *node) -{ - iLine(node); -} - -bool Compiler::visit(AST::DebuggerStatement *node) -{ - iLine(node); - iDebugger(); - return false; -} - -void Compiler::patchInstruction(int index, int offset) -{ - QScriptInstruction &i = m_instructions[index]; - - switch (i.op) { - case QScriptInstruction::OP_Branch: - case QScriptInstruction::OP_BranchFalse: - case QScriptInstruction::OP_BranchTrue: - m_eng->newInteger(&i.operand[0], offset); - break; - - default: - Q_ASSERT_X(0, "Compiler::patchInstruction()", "expected a branch instruction"); - break; - } -} - -bool Compiler::visit(AST::WithStatement *node) -{ - iLine(node); - node->expression->accept(this); - iEnterWith(); - bool was = withStatement(true); - bool was2 = generateLeaveOnBreak(true); - node->statement->accept(this); - generateLeaveOnBreak(was2); - withStatement(was); - iLeaveWith(); - return false; -} - -bool Compiler::visit(AST::ArrayLiteral *node) -{ - iNewArray(); - - int length = 0; - - for (AST::ElementList *it = node->elements; it != 0; it = it->next) { - for (AST::Elision *eit = it->elision; eit != 0; eit = eit->next) { - iDuplicate(); - iLoadNumber(length); - iMakeReference(); - iLoadUndefined(); - iAssign(); - iPop(); - ++length; - } - - if (it->expression) { - iDuplicate(); - iLoadNumber(length); - iMakeReference(); - it->expression->accept(this); - iAssign(); - iPop(); - ++length; - } - } - - for (AST::Elision *eit = node->elision; eit != 0; eit = eit->next) { - iDuplicate(); - iLoadNumber(length); - iMakeReference(); - iLoadUndefined(); - iAssign(); - iPop(); - ++length; - } - - return false; -} - -void Compiler::iLoadUndefined() -{ - pushInstruction(QScriptInstruction::OP_LoadUndefined); -} - -void Compiler::iLoadThis() -{ - pushInstruction(QScriptInstruction::OP_LoadThis); -} - -void Compiler::iLoadActivation() -{ - pushInstruction(QScriptInstruction::OP_LoadActivation); -} - -void Compiler::iLoadNull() -{ - pushInstruction(QScriptInstruction::OP_LoadNull); -} - -void Compiler::iLoadNumber(double number) -{ - QScriptValueImpl arg0(number); - pushInstruction(QScriptInstruction::OP_LoadNumber, arg0); -} - -void Compiler::iLoadString(QScriptNameIdImpl *id) -{ - QScriptValueImpl arg0; - id->persistent = true; - m_eng->newNameId(&arg0, id); - pushInstruction(QScriptInstruction::OP_LoadString, arg0); -} - -void Compiler::iDuplicate() -{ - pushInstruction(QScriptInstruction::OP_Duplicate); -} - -void Compiler::iSwap() -{ - pushInstruction(QScriptInstruction::OP_Swap); -} - -void Compiler::iResolve(QScriptNameIdImpl *id) -{ - QScriptValueImpl arg0; - id->persistent = true; - m_eng->newNameId(&arg0, id); - pushInstruction(QScriptInstruction::OP_Resolve, arg0); -} - -void Compiler::iPutField() -{ - pushInstruction(QScriptInstruction::OP_PutField); -} - -void Compiler::iCall(int argc) -{ - QScriptValueImpl arg0; - m_eng->newInteger(&arg0, argc); - pushInstruction(QScriptInstruction::OP_Call, arg0); -} - -void Compiler::iNew(int argc) -{ - QScriptValueImpl arg0; - m_eng->newInteger(&arg0, argc); - pushInstruction(QScriptInstruction::OP_New, arg0); -} - -void Compiler::iFetchField() -{ - pushInstruction(QScriptInstruction::OP_FetchField); -} - -void Compiler::iLazyArguments() -{ - pushInstruction(QScriptInstruction::OP_LazyArguments); -} - -void Compiler::iRet() -{ - pushInstruction(QScriptInstruction::OP_Ret); -} - -void Compiler::iDeclareLocal(QScriptNameIdImpl *id, bool readOnly) -{ - QScriptValueImpl arg0; - id->persistent = true; - m_eng->newNameId(&arg0, id); - QScriptValueImpl arg1; - m_eng->newInteger(&arg1, readOnly); - pushInstruction(QScriptInstruction::OP_DeclareLocal, arg0, arg1); -} - -void Compiler::iAssign() -{ - pushInstruction(QScriptInstruction::OP_Assign); -} - -void Compiler::iBitAnd() -{ - pushInstruction(QScriptInstruction::OP_BitAnd); -} - -void Compiler::iBitOr() -{ - pushInstruction(QScriptInstruction::OP_BitOr); -} - -void Compiler::iBitXor() -{ - pushInstruction(QScriptInstruction::OP_BitXor); -} - -void Compiler::iLeftShift() -{ - pushInstruction(QScriptInstruction::OP_LeftShift); -} - -void Compiler::iMod() -{ - pushInstruction(QScriptInstruction::OP_Mod); -} - -void Compiler::iRightShift() -{ - pushInstruction(QScriptInstruction::OP_RightShift); -} - -void Compiler::iURightShift() -{ - pushInstruction(QScriptInstruction::OP_URightShift); -} - -void Compiler::iAdd() -{ - pushInstruction(QScriptInstruction::OP_Add); -} - -void Compiler::iDiv() -{ - pushInstruction(QScriptInstruction::OP_Div); -} - -void Compiler::iEqual() -{ - pushInstruction(QScriptInstruction::OP_Equal); -} - -void Compiler::iGreatOrEqual() -{ - pushInstruction(QScriptInstruction::OP_GreatOrEqual); -} - -void Compiler::iGreatThan() -{ - pushInstruction(QScriptInstruction::OP_GreatThan); -} - -void Compiler::iLessOrEqual() -{ - pushInstruction(QScriptInstruction::OP_LessOrEqual); -} - -void Compiler::iLessThan() -{ - pushInstruction(QScriptInstruction::OP_LessThan); -} - -void Compiler::iMul() -{ - pushInstruction(QScriptInstruction::OP_Mul); -} - -void Compiler::iNotEqual() -{ - pushInstruction(QScriptInstruction::OP_NotEqual); -} - -void Compiler::iSub() -{ - pushInstruction(QScriptInstruction::OP_Sub); -} - -void Compiler::iStrictEqual() -{ - pushInstruction(QScriptInstruction::OP_StrictEqual); -} - -void Compiler::iStrictNotEqual() -{ - pushInstruction(QScriptInstruction::OP_StrictNotEqual); -} - -void Compiler::iBranch(int index) -{ - QScriptValueImpl arg0; - m_eng->newInteger(&arg0, index); - pushInstruction(QScriptInstruction::OP_Branch, arg0); -} - -void Compiler::iBranchFalse(int index) -{ - QScriptValueImpl arg0; - m_eng->newInteger(&arg0, index); - pushInstruction(QScriptInstruction::OP_BranchFalse, arg0); -} - -void Compiler::iBranchTrue(int index) -{ - QScriptValueImpl arg0; - m_eng->newInteger(&arg0, index); - pushInstruction(QScriptInstruction::OP_BranchTrue, arg0); -} - -void Compiler::iNewClosure(AST::FunctionExpression *expr) -{ - QScriptValueImpl arg0; - m_eng->newPointer(&arg0, expr); - - pushInstruction(QScriptInstruction::OP_NewClosure, arg0); -} - -void Compiler::iIncr() -{ - pushInstruction(QScriptInstruction::OP_Incr); -} - -void Compiler::iDecr() -{ - pushInstruction(QScriptInstruction::OP_Decr); -} - -void Compiler::iPop() -{ - pushInstruction(QScriptInstruction::OP_Pop); -} - -void Compiler::iFetch(QScriptNameIdImpl *id) -{ - if (m_generateFastArgumentLookup) { - int index = m_formals.indexOf(id); - - if (index != -1) { - QScriptValueImpl arg0; - m_eng->newInteger(&arg0, index); - pushInstruction(QScriptInstruction::OP_Receive, arg0); - return; - } - } - - QScriptValueImpl arg0; - id->persistent = true; - m_eng->newNameId(&arg0, id); - pushInstruction(QScriptInstruction::OP_Fetch, arg0); -} - -void Compiler::iLoadTrue() -{ - pushInstruction(QScriptInstruction::OP_LoadTrue); -} - -void Compiler::iLoadFalse() -{ - pushInstruction(QScriptInstruction::OP_LoadFalse); -} - -void Compiler::iUnaryMinus() -{ - pushInstruction(QScriptInstruction::OP_UnaryMinus); -} - -void Compiler::iUnaryPlus() -{ - pushInstruction(QScriptInstruction::OP_UnaryPlus); -} - -void Compiler::iPostIncr() -{ - pushInstruction(QScriptInstruction::OP_PostIncr); -} - -void Compiler::iPostDecr() -{ - pushInstruction(QScriptInstruction::OP_PostDecr); -} - -void Compiler::iNewArray() -{ - pushInstruction(QScriptInstruction::OP_NewArray); -} - -void Compiler::iNewObject() -{ - pushInstruction(QScriptInstruction::OP_NewObject); -} - -void Compiler::iTypeOf() -{ - pushInstruction(QScriptInstruction::OP_TypeOf); -} - -void Compiler::iDelete() -{ - pushInstruction(QScriptInstruction::OP_Delete); -} - -void Compiler::iInstanceOf() -{ - pushInstruction(QScriptInstruction::OP_InstanceOf); -} - -void Compiler::iInplaceAnd() -{ - pushInstruction(QScriptInstruction::OP_InplaceAnd); -} - -void Compiler::iInplaceSub() -{ - pushInstruction(QScriptInstruction::OP_InplaceSub); -} - -void Compiler::iInplaceDiv() -{ - pushInstruction(QScriptInstruction::OP_InplaceDiv); -} - -void Compiler::iInplaceAdd() -{ - pushInstruction(QScriptInstruction::OP_InplaceAdd); -} - -void Compiler::iInplaceLeftShift() -{ - pushInstruction(QScriptInstruction::OP_InplaceLeftShift); -} - -void Compiler::iInplaceMod() -{ - pushInstruction(QScriptInstruction::OP_InplaceMod); -} - -void Compiler::iInplaceMul() -{ - pushInstruction(QScriptInstruction::OP_InplaceMul); -} - -void Compiler::iInplaceOr() -{ - pushInstruction(QScriptInstruction::OP_InplaceOr); -} - -void Compiler::iInplaceRightShift() -{ - pushInstruction(QScriptInstruction::OP_InplaceRightShift); -} - -void Compiler::iInplaceURightShift() -{ - pushInstruction(QScriptInstruction::OP_InplaceURightShift); -} - -void Compiler::iInplaceXor() -{ - pushInstruction(QScriptInstruction::OP_InplaceXor); -} - -void Compiler::iThrow() -{ - pushInstruction(QScriptInstruction::OP_Throw); -} - -void Compiler::iLine(AST::Node *node) -{ - if (! node) - return; - - QScriptValueImpl arg0; - m_eng->newInteger(&arg0, node->startLine); - - QScriptValueImpl arg1; - m_eng->newInteger(&arg1, node->startColumn); - - pushInstruction(QScriptInstruction::OP_Line, arg0, arg1); -} - -void Compiler::iBitNot() -{ - pushInstruction(QScriptInstruction::OP_BitNot); -} - -void Compiler::iNot() -{ - pushInstruction(QScriptInstruction::OP_Not); -} - -void Compiler::iNewRegExp(QScriptNameIdImpl *pattern) -{ - QScriptValueImpl arg0; - pattern->persistent = true; - m_eng->newNameId(&arg0, pattern); - pushInstruction(QScriptInstruction::OP_NewRegExp, arg0); -} - -void Compiler::iNewRegExp(QScriptNameIdImpl *pattern, int flags) -{ - QScriptValueImpl arg0; - pattern->persistent = true; - m_eng->newNameId(&arg0, pattern); - - QScriptValueImpl arg1; - m_eng->newInteger(&arg1, flags); - - pushInstruction(QScriptInstruction::OP_NewRegExp, arg0, arg1); -} - -void Compiler::iNewEnumeration() -{ - pushInstruction(QScriptInstruction::OP_NewEnumeration); -} - -void Compiler::iToFirstElement() -{ - pushInstruction(QScriptInstruction::OP_ToFirstElement); -} - -void Compiler::iHasNextElement() -{ - pushInstruction(QScriptInstruction::OP_HasNextElement); -} - -void Compiler::iNextElement() -{ - pushInstruction(QScriptInstruction::OP_NextElement); -} - -void Compiler::iEnterWith() -{ - pushInstruction(QScriptInstruction::OP_EnterWith); -} - -void Compiler::iLeaveWith() -{ - pushInstruction(QScriptInstruction::OP_LeaveWith); -} - -void Compiler::iBeginCatch(QScriptNameIdImpl *id) -{ - QScriptValueImpl arg0; - id->persistent = true; - m_eng->newNameId(&arg0, id); - pushInstruction(QScriptInstruction::OP_BeginCatch, arg0); -} - -void Compiler::iEndCatch() -{ - pushInstruction(QScriptInstruction::OP_EndCatch); -} - -void Compiler::iSync() -{ - pushInstruction(QScriptInstruction::OP_Sync); -} - -void Compiler::iHalt() -{ - pushInstruction(QScriptInstruction::OP_Halt); -} - -void Compiler::iMakeReference() -{ - pushInstruction(QScriptInstruction::OP_MakeReference); -} - -void Compiler::iIn() -{ - pushInstruction(QScriptInstruction::OP_In); -} - -void Compiler::iNop() -{ - pushInstruction(QScriptInstruction::OP_Nop); -} - -void Compiler::iNewString(QScriptNameIdImpl *id) -{ - QScriptValueImpl arg0; - id->persistent = true; - m_eng->newNameId(&arg0, id); - pushInstruction(QScriptInstruction::OP_NewString, arg0); -} - -void Compiler::iDebugger() -{ - pushInstruction(QScriptInstruction::OP_Debugger); -} - -Compiler::Loop *Compiler::findLoop(QScriptNameIdImpl *name) -{ - if (! name) - return m_activeLoop; - - QMap<AST::Statement*, Loop>::iterator it = m_loops.begin(); - - for (; it != m_loops.end(); ++it) { - Loop &loop = *it; - - if (loop.name == name) - return &loop; - } - - return 0; -} - - -} // namespace QScript - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT diff --git a/src/script/qscriptcompiler_p.h b/src/script/qscriptcompiler_p.h deleted file mode 100644 index 67fa60f..0000000 --- a/src/script/qscriptcompiler_p.h +++ /dev/null @@ -1,377 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTCOMPILER_P_H -#define QSCRIPTCOMPILER_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 <QtCore/QMap> - -#ifndef QT_NO_SCRIPT - -#include <QtCore/QVector> - -#include "qscriptastvisitor_p.h" -#include "qscriptasm_p.h" - -QT_BEGIN_NAMESPACE - -class QScriptEnginePrivate; - -namespace QScript { - -class Compiler: protected AST::Visitor -{ -public: - Compiler(QScriptEnginePrivate *eng); - virtual ~Compiler(); - - inline QScriptEnginePrivate *engine() const { return m_eng; } - - bool topLevelCompiler() const; - void setTopLevelCompiler(bool b); - - CompilationUnit compile(AST::Node *node, const QList<QScriptNameIdImpl *> &formals - = QList<QScriptNameIdImpl *>()); - - struct Label { - Label(int o = 0): - offset (o) {} - - int offset; - QVector<int> uses; - }; - -// instruction set - void iAdd(); - void iAssign(); - void iBitAnd(); - void iBitOr(); - void iBitXor(); - void iBitNot(); - void iBranch(int index); - void iBranchTrue(int index); - void iBranchFalse(int index); - void iCall(int argc); - void iDeclareLocal(QScriptNameIdImpl *id, bool readOnly); - void iDecr(); - void iDelete(); - void iDiv(); - void iDuplicate(); - void iEqual(); - void iFetch(QScriptNameIdImpl *id); - void iFetchField(); - void iLazyArguments(); - void iGreatOrEqual(); - void iGreatThan(); - void iIncr(); - void iInplaceAdd(); - void iInplaceAnd(); - void iInplaceDecr(); - void iInplaceDiv(); - void iInplaceLeftShift(); - void iInplaceMod(); - void iInplaceMul(); - void iInplaceOr(); - void iInplaceRightShift(); - void iInplaceSub(); - void iInplaceURightShift(); - void iInstanceOf(); - void iLeftShift(); - void iLessOrEqual(); - void iLessThan(); - void iLoadFalse(); - void iLoadNumber(double number); - void iLoadString(QScriptNameIdImpl *id); - void iNewString(QScriptNameIdImpl *id); - void iLoadThis(); - void iLoadActivation(); - void iLoadNull(); - void iLoadTrue(); - void iLoadUndefined(); - void iMod(); - void iMul(); - void iUnaryPlus(); - void iUnaryMinus(); - void iNew(int argc); - void iNewArray(); - void iNewClosure(AST::FunctionExpression *expr); - void iNewObject(); - void iNewRegExp(QScriptNameIdImpl *pattern); - void iNewRegExp(QScriptNameIdImpl *pattern, int flags); - void iNot(); - void iNotEqual(); - void iPop(); - void iPostDecr(); - void iPostIncr(); - void iPutField(); - void iResolve(QScriptNameIdImpl *id); - void iRet(); - void iRightShift(); - void iSub(); - void iStrictEqual(); - void iStrictNotEqual(); - void iSwap(); - void iThrow(); - void iTypeOf(); - void iURightShift(); - void iInplaceXor(); - void iLine(AST::Node *node); - void iNewEnumeration(); - void iToFirstElement(); - void iHasNextElement(); - void iNextElement(); - void iEnterWith(); - void iLeaveWith(); - void iBeginCatch(QScriptNameIdImpl *id); - void iEndCatch(); - void iSync(); - void iHalt(); - void iMakeReference(); - void iIn(); - void iNop(); - void iDebugger(); - -protected: - virtual bool preVisit(AST::Node *node); - - virtual bool visit(AST::ArrayLiteral *node); - virtual bool visit(AST::ArrayMemberExpression *node); - virtual bool visit(AST::Expression *node); - virtual bool visit(AST::BinaryExpression *node); - virtual bool visit(AST::BreakStatement *node); - virtual bool visit(AST::CallExpression *node); - virtual bool visit(AST::ConditionalExpression *node); - virtual bool visit(AST::ContinueStatement *node); - virtual bool visit(AST::DeleteExpression *node); - virtual bool visit(AST::DoWhileStatement *node); - virtual bool visit(AST::ExpressionStatement *node); - virtual bool visit(AST::FalseLiteral *node); - virtual bool visit(AST::FieldMemberExpression *node); - virtual bool visit(AST::ForEachStatement *node); - virtual bool visit(AST::LocalForEachStatement *node); - virtual bool visit(AST::ForStatement *node); - virtual bool visit(AST::FunctionDeclaration *node); - virtual bool visit(AST::FunctionExpression *node); - virtual bool visit(AST::FunctionSourceElement *node); - virtual bool visit(AST::IdentifierExpression *node); - virtual bool visit(AST::IfStatement *node); - virtual bool visit(AST::LabelledStatement *node); - virtual bool visit(AST::LocalForStatement *node); - virtual bool visit(AST::NewExpression *node); - virtual bool visit(AST::NewMemberExpression *node); - virtual bool visit(AST::NumericLiteral *node); - virtual bool visit(AST::ObjectLiteral *node); - virtual bool visit(AST::PostDecrementExpression *node); - virtual bool visit(AST::PostIncrementExpression *node); - virtual bool visit(AST::PreDecrementExpression *node); - virtual bool visit(AST::PreIncrementExpression *node); - virtual bool visit(AST::RegExpLiteral *node); - virtual bool visit(AST::ReturnStatement *node); - virtual bool visit(AST::SourceElements *node); - virtual bool visit(AST::StatementList *node); - virtual bool visit(AST::StatementSourceElement *node); - virtual bool visit(AST::StringLiteral *node); - virtual bool visit(AST::SwitchStatement *node); - virtual bool visit(AST::ThisExpression *node); - virtual bool visit(AST::NullExpression *node); - virtual bool visit(AST::ThrowStatement *node); - virtual bool visit(AST::TryStatement *node); - virtual bool visit(AST::TrueLiteral *node); - virtual bool visit(AST::VariableStatement *node); - virtual bool visit(AST::VariableDeclaration *node); - virtual bool visit(AST::WhileStatement *node); - virtual bool visit(AST::WithStatement *node); - virtual bool visit(AST::Block *node); - virtual bool visit(AST::TypeOfExpression *node); - virtual bool visit(AST::DebuggerStatement *node); - - virtual void endVisit(AST::BreakStatement *node); - virtual void endVisit(AST::ContinueStatement *node); - virtual void endVisit(AST::ExpressionStatement *node); - virtual void endVisit(AST::NotExpression *node); - virtual void endVisit(AST::ReturnStatement *node); - virtual void endVisit(AST::ThrowStatement *node); - virtual void endVisit(AST::TildeExpression *node); - virtual void endVisit(AST::UnaryPlusExpression *node); - virtual void endVisit(AST::UnaryMinusExpression *node); - virtual void endVisit(AST::VoidExpression *node); - virtual void endVisit(AST::EmptyStatement *node); - - void visitForInternal(AST::Statement *node, AST::ExpressionNode *condition, - AST::Statement *statement, AST::ExpressionNode *expression); - - bool isAssignmentOperator(int op) const; - int inplaceAssignmentOperator(int op) const; - - inline int nextInstructionOffset() const - { return m_instructions.count(); } - - inline void pushInstruction(QScriptInstruction::Operator op) - { - pushInstruction(op, QScriptValueImpl(), QScriptValueImpl()); - } - - inline void pushInstruction(QScriptInstruction::Operator op, - const QScriptValueImpl &arg1) - { - pushInstruction(op, arg1, QScriptValueImpl()); - } - - inline void pushInstruction(QScriptInstruction::Operator op, - const QScriptValueImpl &arg1, - const QScriptValueImpl &arg2) - { - QScriptInstruction i; - i.op = op; - i.operand[0] = arg1; - i.operand[1] = arg2; - m_instructions.append(i); - } - - inline bool generateReferences(bool b) - { - bool was = m_generateReferences; - m_generateReferences = b; - return was; - } - - inline bool generateFastArgumentLookup(bool b) - { - bool was = m_generateFastArgumentLookup; - m_generateFastArgumentLookup= b; - return was; - } - - inline bool iterationStatement(bool b) - { - bool was = m_iterationStatement; - m_iterationStatement = b; - return was; - } - - inline bool switchStatement(bool b) - { - bool was = m_switchStatement; - m_switchStatement = b; - return was; - } - - inline bool changeParseStatements(bool b) - { - bool was = m_parseStatements; - m_parseStatements = b; - return was; - } - - inline bool withStatement(bool b) - { - bool was = m_withStatement; - m_withStatement = b; - return was; - } - - inline bool generateLeaveOnBreak(bool b) - { - bool was = m_generateLeaveWithOnBreak; - m_generateLeaveWithOnBreak = b; - return was; - } - - void patchInstruction(int index, int offset); - -private: - QScriptEnginePrivate *m_eng; - - uint m_generateReferences: 1; - uint m_iterationStatement: 1; - uint m_switchStatement: 1; - uint m_withStatement: 1; - uint m_generateLeaveWithOnBreak: 1; - uint m_generateFastArgumentLookup: 1; - uint m_parseStatements: 1; - uint m_pad: 25; - - bool m_topLevelCompiler; // bit - QVector<QScriptInstruction> m_instructions; - QVector<ExceptionHandlerDescriptor> m_exceptionHandlers; - QList<QScriptNameIdImpl *> m_formals; - - struct Loop { - Loop(QScriptNameIdImpl *n = 0): - name(n) {} - - QScriptNameIdImpl *name; - Label breakLabel; - Label continueLabel; - }; - - inline Loop *changeActiveLoop(Loop *activeLoop) - { - Loop *was = m_activeLoop; - m_activeLoop = activeLoop; - return was; - } - - Loop *findLoop(QScriptNameIdImpl *name = 0); - - Loop *m_activeLoop; - QMap<AST::Statement*, Loop> m_loops; - CompilationUnit m_compilationUnit; -}; - -} // namespace QScript - -#endif // QT_NO_SCRIPT - -QT_END_NAMESPACE - -#endif diff --git a/src/script/qscriptcontext_p.cpp b/src/script/qscriptcontext_p.cpp deleted file mode 100644 index f19ba9c..0000000 --- a/src/script/qscriptcontext_p.cpp +++ /dev/null @@ -1,2598 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtCore/QtDebug> - -#ifndef QT_NO_SCRIPT - -#include "qscriptcontext_p.h" -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" -#include "qscriptprettypretty_p.h" -#include "qscriptast_p.h" -#include "qscriptnodepool_p.h" -#include "qscriptcompiler_p.h" -#include "qscriptextenumeration_p.h" - -#include <math.h> // floor & friends... - -QT_BEGIN_NAMESPACE - -#define Q_SCRIPT_NO_PRINT_GENERATED_CODE - -#define Q_SCRIPT_NO_JOINED_FUNCTION - -#define CHECK_TEMPSTACK(needed) do { \ - if (stackPtr + needed >= eng->tempStackEnd) { \ - throwError(QLatin1String("out of memory")); \ - HandleException(); \ - } \ -} while (0) - -#ifndef Q_SCRIPT_NO_PRINT_GENERATED_CODE -static QTextStream qout(stderr, QIODevice::WriteOnly); -#endif - -static inline void qscript_uint_to_string_helper(uint i, QString &s) -{ - switch (i) { - case 0: case 1: case 2: case 3: case 4: - case 5: case 6: case 7: case 8: case 9: - s += QLatin1Char('0' + i); - break; - - default: - qscript_uint_to_string_helper(i / 10, s); - s += QLatin1Char('0' + (i % 10)); - } -} - -static inline void qscript_uint_to_string(qsreal i, QString &s) -{ - if ((i < 0) || (i > 0xFFFFFFFF)) - return; // nothing to do - - qsreal x = ::fmod(i, 10); - - if (x != 0.0 && x != 1.0 - && x != 2.0 && x != 3.0 - && x != 4.0 && x != 5.0 - && x != 6.0 && x != 7.0 - && x != 8.0 && x != 9.0) - return; // nothing to do - - qscript_uint_to_string_helper(uint(i), s); -} - -static inline quint32 toArrayIndex(const QScriptValueImpl &v) -{ - if (v.isNumber()) { - quint32 ui = v.toUInt32(); - if (qsreal(ui) == v.m_number_value) - return ui; - } else if (v.isString()) { - QByteArray bytes = v.m_string_value->s.toUtf8(); - char *eptr; - quint32 pos = strtoul(bytes.constData(), &eptr, 10); - if ((eptr == bytes.constData() + bytes.size()) - && (QByteArray::number(pos) == bytes)) { - return pos; - } - } - return 0xFFFFFFFF; -} - -#define CREATE_MEMBER(__obj__, __name__, __member__, __flags__) do { \ - (__obj__).createMember(__name__, __member__, __flags__); \ - eng->adjustBytesAllocated(sizeof(QScript::Member) + sizeof(QScriptValueImpl)); \ -} while (0) - -#define BEGIN_PREFIX_OPERATOR \ - QScriptValue::ResolveFlags mode; \ - mode = QScriptValue::ResolveFlags(stackPtr[0].m_int_value) \ - | QScriptValue::ResolvePrototype; \ - --stackPtr; \ - QScriptValueImpl object = eng->toObject(stackPtr[-1]); \ - if (!object.isObject()) { \ - stackPtr -= 2; \ - throwTypeError(QLatin1String("not an object")); \ - HandleException(); \ - } \ - QScriptNameIdImpl *memberName = 0; \ - if (stackPtr[0].isString() && stackPtr[0].m_string_value->unique) \ - memberName = stackPtr[0].m_string_value; \ - else \ - memberName = eng->nameId(stackPtr[0].toString(), /*persistent=*/false); \ - QScript::Member member; \ - QScriptValueImpl base; \ - QScriptValueImpl value; \ - QScriptValueImpl getter; \ - QScriptValueImpl setter; \ - const bool isMemberAssignment = (object.m_object_value != m_scopeChain.m_object_value); \ - if (object.resolve(memberName, &member, &base, mode, QScript::ReadWrite)) { \ - base.get(member, &value); \ - if (hasUncaughtException()) { \ - stackPtr -= 2; \ - HandleException(); \ - } else if (member.isGetterOrSetter()) { \ - if (member.isGetter()) { \ - getter = value; \ - if (!member.isSetter() && !base.m_object_value->findSetter(&member)) { \ - stackPtr -= 2; \ - throwError(QLatin1String("No setter defined")); \ - HandleException(); \ - } \ - base.get(member, &setter); \ - } else { \ - setter = value; \ - QScript::Member tmp = member; \ - if (!base.m_object_value->findGetter(&member)) { \ - stackPtr -= 2; \ - throwError(QLatin1String("No getter defined")); \ - HandleException(); \ - } \ - base.get(member, &getter); \ - member = tmp; \ - } \ - value = getter.call(object); \ - if (hasUncaughtException()) { \ - stackPtr -= 2; \ - Done(); \ - } \ - } \ - } else if (!isMemberAssignment) { \ - stackPtr -= 2; \ - throwNotDefined(memberName); \ - HandleException(); \ - } else { \ - base = object; \ - CREATE_MEMBER(base, memberName, &member, /*flags=*/0); \ - value = undefined; \ - } - -#define END_PREFIX_OPERATOR \ - if (member.isSetter()) { \ - setter.call(object, QScriptValueImplList() << value); \ - if (hasUncaughtException()) { \ - stackPtr -= 2; \ - Done(); \ - } \ - } else { \ - if (member.isWritable()) { \ - if (isMemberAssignment && (base.m_object_value != object.m_object_value)) { \ - base = object; \ - CREATE_MEMBER(base, memberName, &member, /*flags=*/0); \ - } \ - base.put(member, value); \ - if (hasUncaughtException()) { \ - stackPtr -= 2; \ - HandleException(); \ - } \ - } \ - } \ - *--stackPtr = value; \ - ++iPtr; - -#define BEGIN_INPLACE_OPERATOR \ - if (! stackPtr[-1].isReference()) { \ - stackPtr -= 2; \ - throwSyntaxError(QLatin1String("invalid assignment lvalue")); \ - HandleException(); \ - } \ - QScriptValue::ResolveFlags mode; \ - mode = QScriptValue::ResolveFlags(stackPtr[-1].m_int_value) \ - | QScriptValue::ResolvePrototype; \ - QScriptValueImpl object = eng->toObject(stackPtr[-3]); \ - if (! object.isValid()) { \ - stackPtr -= 4; \ - throwTypeError(QLatin1String("not an object")); \ - HandleException(); \ - } \ - QScriptNameIdImpl *memberName = 0; \ - if (stackPtr[-2].isString() && stackPtr[-2].m_string_value->unique) \ - memberName = stackPtr[-2].m_string_value; \ - else \ - memberName = eng->nameId(stackPtr[-2].toString(), /*persistent=*/false); \ - QScriptValueImpl lhs; \ - QScriptValueImpl base; \ - QScript::Member member; \ - QScriptValueImpl getter; \ - QScriptValueImpl setter; \ - const bool isMemberAssignment = (object.m_object_value != m_scopeChain.m_object_value); \ - if (object.resolve(memberName, &member, &base, mode, QScript::ReadWrite)) { \ - base.get(member, &lhs); \ - if (hasUncaughtException()) { \ - stackPtr -= 4; \ - HandleException(); \ - } else if (member.isGetterOrSetter()) { \ - if (member.isGetter()) { \ - getter = lhs; \ - if (!member.isSetter() && !base.m_object_value->findSetter(&member)) { \ - stackPtr -= 4; \ - throwError(QLatin1String("No setter defined")); \ - HandleException(); \ - } \ - base.get(member, &setter); \ - } else { \ - setter = lhs; \ - QScript::Member tmp = member; \ - if (!base.m_object_value->findGetter(&member)) { \ - stackPtr -= 4; \ - throwError(QLatin1String("No getter defined")); \ - HandleException(); \ - } \ - base.get(member, &getter); \ - member = tmp; \ - } \ - lhs = getter.call(object); \ - if (hasUncaughtException()) { \ - stackPtr -= 4; \ - Done(); \ - } \ - } \ - } else if (!isMemberAssignment) { \ - stackPtr -= 4; \ - throwNotDefined(memberName); \ - HandleException(); \ - } else { \ - base = object; \ - CREATE_MEMBER(base, memberName, &member, /*flags=*/0); \ - lhs = undefined; \ - } \ - QScriptValueImpl rhs = stackPtr[0]; - -#define END_INPLACE_OPERATOR \ - if (member.isSetter()) { \ - setter.call(object, QScriptValueImplList() << *stackPtr); \ - if (hasUncaughtException()) { \ - stackPtr -= 1; \ - Done(); \ - } \ - } else { \ - if (member.isWritable()) { \ - if (isMemberAssignment && (base.m_object_value != object.m_object_value)) { \ - base = object; \ - CREATE_MEMBER(base, memberName, &member, /*flags=*/0); \ - } \ - base.put(member, *stackPtr); \ - if (hasUncaughtException()) { \ - stackPtr -= 1; \ - HandleException(); \ - } \ - } \ - } \ - ++iPtr; - -namespace QScript { - -void ScriptFunction::execute(QScriptContextPrivate *context) -{ - if (! m_compiledCode) { - QScriptEnginePrivate *eng = context->engine(); - Compiler compiler(eng); - - CompilationUnit unit = compiler.compile(m_definition->body, formals); - if (! unit.isValid()) { - context->throwError(unit.errorMessage()); - return; - } - - m_compiledCode = m_astPool->createCompiledCode(m_definition->body, unit); - } - - context->execute(m_compiledCode); -} - -QString ScriptFunction::toString(QScriptContextPrivate *) const -{ - QString str; - QTextStream out(&str, QIODevice::WriteOnly); - PrettyPretty pp(out); - pp(m_definition, /*indent=*/ 0); - return str; -} - -QString ScriptFunction::fileName() const -{ - return m_astPool->fileName(); -} - -QString ScriptFunction::functionName() const -{ - if (!m_definition->name) - return QString(); - return m_definition->name->s; -} - -int ScriptFunction::startLineNumber() const -{ - return m_definition->startLine; -} - -int ScriptFunction::endLineNumber() const -{ - return m_definition->endLine; -} - -} // namespace QScript - -/*! - \internal - - Resolves and gets the value specified by \a stackPtr. - stackPtr[0] contains the member specifier, stackPtr[-1] contains the object. - If the member can be resolved, sets \a value to the value of that member, - otherwise returns false. -*/ -bool QScriptContextPrivate::resolveField(QScriptEnginePrivate *eng, - QScriptValueImpl *stackPtr, - QScriptValueImpl *value) -{ - const QScriptValueImpl &m = stackPtr[0]; - QScriptValueImpl &object = stackPtr[-1]; - - if (! object.isObject()) - object = eng->toObject(object); - - if (! object.isValid()) - return false; - - if (QScript::Ecma::Array::Instance *arrayInstance = eng->arrayConstructor->get(object)) { - quint32 pos = toArrayIndex(m); - if (pos != 0xFFFFFFFF) { - *value = arrayInstance->value.at(pos); - - if (! value->isValid()) - *value = eng->undefinedValue(); - - return true; - } - } - - QScriptNameIdImpl *nameId = m.isString() ? m.m_string_value : 0; - - if (! nameId || ! nameId->unique) - nameId = eng->nameId(QScriptEnginePrivate::convertToNativeString(m), /*persistent=*/false); // ### slow! - - QScript::Member member; - QScriptValueImpl base; - - if (! object.resolve(nameId, &member, &base, QScriptValue::ResolveFull, QScript::Read)) // ### ... - return false; - - if (QScriptEnginePrivate::strictlyEquals(base, eng->m_globalObject)) - stackPtr[-1] = base; - else if (object.classInfo() == eng->m_class_with) - stackPtr[-1] = object.prototype(); - - base.get(member, value); - - if (member.isGetterOrSetter()) { - // call the getter function - QScriptValueImpl getter; - if (member.isGetter()) { - getter = *value; - } else { - if (!base.m_object_value->findGetter(&member)) { - *value = eng->undefinedValue(); - return true; - } - base.get(member, &getter); - } - *value = getter.call(object); - } - - return true; -} - -void QScriptContextPrivate::execute(QScript::Code *code) -{ - int oldCurrentLine = currentLine; - int oldCurrentColumn = currentColumn; - QScript::Code *oldCode = m_code; - m_code = code; - -#ifndef Q_SCRIPT_NO_PRINT_GENERATED_CODE - qout << QLatin1String("function:") << endl; - for (QScriptInstruction *current = code->firstInstruction; current != code->lastInstruction; ++current) { - qout << int(current - code->firstInstruction) << QLatin1String(":\t"); - current->print(qout); - qout << endl; - } - qout << endl; -#endif - - QScriptEnginePrivate *eng = engine(); - - bool wasEvaluating = eng->m_evaluating; - if (!wasEvaluating) { - eng->setupProcessEvents(); - eng->resetAbortFlag(); - } - eng->m_evaluating = true; - - // set up the temp stack - if (! tempStack) - stackPtr = tempStack = eng->tempStackBegin; - - QScriptValueImpl undefined(eng->undefinedValue()); - - catching = false; - m_state = QScriptContext::NormalState; - m_result = undefined; - firstInstruction = code->firstInstruction; - lastInstruction = code->lastInstruction; - iPtr = code->firstInstruction; - - if (!m_scopeChain.isValid()) - m_scopeChain = m_activation; - -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - eng->notifyFunctionEntry(this); -#endif - -#ifndef Q_SCRIPT_DIRECT_CODE - -# define I(opc) case QScriptInstruction::OP_##opc -# define Next() goto Lfetch -# define Done() goto Ldone -# define HandleException() goto Lhandle_exception -# define Abort() goto Labort - -Lfetch: - - -#else - -# define I(opc) qscript_execute_##opc -# define Next() goto *iPtr->code -# define Done() goto Ldone -# define HandleException() goto Lhandle_exception -# define Abort() goto Labort - - static void * const jump_table[] = { - -# define Q_SCRIPT_DEFINE_OPERATOR(op) &&I(op), -# include "instruction.table" -# undef Q_SCRIPT_DEFINE_OPERATOR - }; // jump_table - - - if (!code->optimized) { - for (QScriptInstruction *current = code->firstInstruction; current != code->lastInstruction; ++current) { - current->code = jump_table[current->op]; - } - - code->optimized = true; - } - -#endif -Ltop: - -#ifndef Q_SCRIPT_DIRECT_CODE - switch (iPtr->op) { -#else - goto *iPtr->code; -#endif - - I(Nop): - { - ++iPtr; - } Next(); - - I(LoadUndefined): - { - CHECK_TEMPSTACK(1); - *(++stackPtr) = undefined; - ++iPtr; - } Next(); - - I(LoadTrue): - { - CHECK_TEMPSTACK(1); - *(++stackPtr) = QScriptValueImpl(true); - ++iPtr; - } Next(); - - I(LoadFalse): - { - CHECK_TEMPSTACK(1); - *(++stackPtr) = QScriptValueImpl(false); - ++iPtr; - } Next(); - - I(LoadThis): - { - CHECK_TEMPSTACK(1); - Q_ASSERT(m_thisObject.isObject()); - *++stackPtr = m_thisObject; - ++iPtr; - } Next(); - - I(LoadActivation): - { - CHECK_TEMPSTACK(1); - *++stackPtr = m_activation; - ++iPtr; - } Next(); - - I(LoadNull): - { - CHECK_TEMPSTACK(1); - *(++stackPtr) = eng->nullValue(); - ++iPtr; - } Next(); - - I(LoadNumber): - { - CHECK_TEMPSTACK(1); - *++stackPtr = iPtr->operand[0]; - ++iPtr; - } Next(); - - - I(LoadString): - { - CHECK_TEMPSTACK(1); - *++stackPtr = iPtr->operand[0]; - ++iPtr; - } Next(); - - I(NewString): - { - CHECK_TEMPSTACK(1); - eng->newNameId(++stackPtr, iPtr->operand[0].m_string_value); - ++iPtr; - } Next(); - - I(Duplicate): - { - CHECK_TEMPSTACK(1); - ++stackPtr; - *stackPtr = stackPtr[-1]; - ++iPtr; - } Next(); - - I(Swap): - { - QScriptValueImpl tmp = stackPtr[0]; - *stackPtr = stackPtr[-1]; - stackPtr[-1] = tmp; - ++iPtr; - } Next(); - - - I(Receive): - { - int n = iPtr->operand[0].m_int_value; - - if (n >= argc) { - throwError(QLatin1String("invalid argument")); - HandleException(); - } - - CHECK_TEMPSTACK(1); - *++stackPtr = argument(n); - ++iPtr; - } Next(); - - I(Fetch): - { - CHECK_TEMPSTACK(1); - - QScriptNameIdImpl *memberName = iPtr->operand[0].m_string_value; - - QScriptValueImpl base; - QScript::Member member; - - QScriptObject *instance = m_scopeChain.m_object_value; - if (instance->findMember(memberName, &member)) { - instance->get(member, ++stackPtr); - base = m_scopeChain; - } else { - if (m_scopeChain.resolve_helper(memberName, &member, &base, QScriptValue::ResolveFull, QScript::Read)) { - base.get(member, ++stackPtr); - if (hasUncaughtException()) { - stackPtr -= 1; - HandleException(); - } - } else { - throwNotDefined(memberName); - HandleException(); - } - } - if (member.isGetterOrSetter()) { - // locate the getter function - QScriptValueImpl getter; - if (member.isGetter()) { - getter = *stackPtr; - } else { - if (!base.m_object_value->findGetter(&member)) { - stackPtr -= 1; - throwError(QLatin1String("No getter defined")); - HandleException(); - } - base.get(member, &getter); - } - // decide the this-object. This is the object that actually - // has the getter (in its prototype chain). - QScriptValueImpl object = m_scopeChain; - while (!object.resolve(memberName, &member, &base, QScriptValue::ResolvePrototype, QScript::Read)) - object = object.scope(); - if (object.classInfo() == eng->m_class_with) - object = object.prototype(); - - *stackPtr = getter.call(object); - if (hasUncaughtException()) { - stackPtr -= 1; - Done(); - } - } - ++iPtr; - } Next(); - - I(Resolve): - { - Q_ASSERT(iPtr->operand[0].isString()); - - CHECK_TEMPSTACK(2); - *++stackPtr = m_scopeChain; - *++stackPtr = iPtr->operand[0]; - eng->newReference(++stackPtr, QScriptValue::ResolveScope); - ++iPtr; - } Next(); - - I(PutField): - { - Q_ASSERT(stackPtr[-1].isReference()); - - const QScriptValueImpl &object = stackPtr[-3]; - QScriptNameIdImpl *memberName = stackPtr[-2].m_string_value; - const QScriptValueImpl &value = stackPtr[0]; - - QScript::Member member; - QScriptValueImpl base; - - if (! object.resolve(memberName, &member, &base, QScriptValue::ResolveLocal, QScript::Write)) { - base = object; - CREATE_MEMBER(base, memberName, &member, /*flags=*/0); - } - - base.put(member, value); - stackPtr -= 4; - if (hasUncaughtException()) - HandleException(); - ++iPtr; - } Next(); - - I(Call): - { - int argc = iPtr->operand[0].m_int_value; - QScriptValueImpl *argp = stackPtr - argc; - - QScriptValueImpl base; - QScriptValueImpl callee; - - bool isReference = argp[0].isReference(); - - if (! isReference) { // we have a value - base = eng->m_globalObject; - callee = argp[0]; - } else if (resolveField(eng, &argp[-1], &callee)) { - if (hasUncaughtException()) { - stackPtr = argp - 3; - HandleException(); - } - base = argp[-2]; - } else { - QScriptValueImpl member = argp[-1]; - stackPtr = argp - 1; - Q_ASSERT(isReference); - stackPtr -= 2; - - if (member.isString()) - throwNotDefined(member.toString()); - else - throwNotDefined(QLatin1String("function")); - HandleException(); - } - - Q_ASSERT(base.isValid()); - Q_ASSERT(callee.isValid()); - - QScriptFunction *function = QScriptEnginePrivate::convertToNativeFunction(callee); - if (! function) { - QScriptValueImpl member = argp[-1]; - QString message; - if (member.isString()) { - message = QString::fromLatin1("%0 is not a function") - .arg(member.toString()); - } else { - message = QLatin1String("not a function"); - } - throwTypeError(message); - HandleException(); - } - - if (++eng->m_callDepth == eng->m_maxCallDepth) { - throwError(QLatin1String("call stack overflow")); - HandleException(); - } - - QScriptContextPrivate *nested_data = eng->pushContext(); - nested_data->m_thisObject = base; - nested_data->m_callee = callee; - - // create the activation - eng->newActivation(&nested_data->m_activation); - QScriptObject *activation_data = nested_data->m_activation.m_object_value; - - int formalCount = function->formals.count(); - int mx = qMax(formalCount, argc); - activation_data->m_members.resize(mx); - activation_data->m_values.resize(mx); - for (int i = 0; i < mx; ++i) { - QScriptNameIdImpl *nameId = 0; - if (i < formalCount) - nameId = function->formals.at(i); - - activation_data->m_members[i].object(nameId, i, - QScriptValue::Undeletable - | QScriptValue::SkipInEnumeration); - activation_data->m_values[i] = (i < argc) ? argp[i + 1] : undefined; - } - - nested_data->argc = argc; - if (callee.m_object_value->m_scope.isValid()) - activation_data->m_scope = callee.m_object_value->m_scope; - else - activation_data->m_scope = eng->m_globalObject; - nested_data->tempStack = stackPtr; - nested_data->args = &argp[1]; - - function->execute(nested_data); - - --eng->m_callDepth; - - stackPtr = argp - 1; - if (isReference) - stackPtr -= 2; - - if (nested_data->m_state == QScriptContext::ExceptionState) { - eng->popContext(); - if (eng->shouldAbort()) - Abort(); - else - Done(); - } - - CHECK_TEMPSTACK(1); - *++stackPtr = nested_data->m_result; - - eng->popContext(); - - if (eng->shouldAbort()) - Abort(); - - if (eng->m_processEventsInterval > 0) - eng->processEvents(); - - ++iPtr; - } Next(); - - - I(NewArray): - { - CHECK_TEMPSTACK(1); - eng->arrayConstructor->newArray(++stackPtr, QScript::Array(eng)); - ++iPtr; - } Next(); - - I(NewRegExp): - { - CHECK_TEMPSTACK(1); - - QString pattern = eng->toString(iPtr->operand[0].m_string_value); -#ifndef QT_NO_REGEXP - QString literal = pattern; -#endif - int flags = 0; - if (iPtr->operand[1].isValid()) { - flags = iPtr->operand[1].m_int_value; -#ifndef QT_NO_REGEXP - if (flags != 0) { - literal += QLatin1Char('/'); - literal += QString::number(flags); - } -#endif - } - -#ifndef QT_NO_REGEXP - QRegExp rx; - // lazy compilation of regexp literals - QHash<QString, QRegExp>::const_iterator it; - it = eng->m_regExpLiterals.constFind(literal); - if (it == eng->m_regExpLiterals.constEnd()) { - rx = QScript::Ecma::RegExp::toRegExp(pattern, flags); - eng->m_regExpLiterals.insert(literal, rx); - } else { - rx = *it; - } - eng->regexpConstructor->newRegExp(++stackPtr, rx, flags); -#else - eng->regexpConstructor->newRegExp(++stackPtr, pattern, flags); -#endif - ++iPtr; - } Next(); - - I(NewObject): - { - CHECK_TEMPSTACK(1); - eng->objectConstructor->newObject(++stackPtr); - ++iPtr; - } Next(); - - I(New): - { - int argc = iPtr->operand[0].m_int_value; - QScriptValueImpl *argp = stackPtr - argc; - - // QScriptValueImpl base; - QScriptValueImpl callee; - - bool isReference = argp[0].isReference(); - - if (! isReference) { // we have a value - // base = eng->globalObject; - callee = argp[0]; - } else if (resolveField(eng, &argp[-1], &callee)) { - // base = argp[-2]; - if (hasUncaughtException()) { - stackPtr = argp - 3; - HandleException(); - } - } else { - QScriptValueImpl member = argp[-1]; - stackPtr = argp - 1; - Q_ASSERT(isReference); - stackPtr -= 2; - - if (member.isString()) - throwNotDefined(member.toString()); - else - throwNotDefined(QLatin1String("constructor")); - HandleException(); - } - - // Q_ASSERT(base.isValid()); - Q_ASSERT(callee.isValid()); - - QScriptFunction *function = QScriptEnginePrivate::convertToNativeFunction(callee); - if (! function) { - QScriptValueImpl member = argp[-1]; - QString message; - if (member.isString()) { - message = QString::fromLatin1("%0 is not a constructor") - .arg(member.toString()); - } else { - message = QLatin1String("not a constructor"); - } - throwTypeError(message); - HandleException(); - } - - if (++eng->m_callDepth == eng->m_maxCallDepth) { - throwError(QLatin1String("call stack overflow")); - HandleException(); - } - - QScriptContextPrivate *nested_data = eng->pushContext(); - nested_data->m_callee = callee; - nested_data->m_calledAsConstructor = true; - - // create the activation - eng->newActivation(&nested_data->m_activation); - QScriptObject *activation_data = nested_data->m_activation.m_object_value; - - int formalCount = function->formals.count(); - int mx = qMax(formalCount, argc); - activation_data->m_members.resize(mx); - activation_data->m_values.resize(mx); - for (int i = 0; i < mx; ++i) { - QScriptNameIdImpl *nameId = 0; - if (i < formalCount) - nameId = function->formals.at(i); - - activation_data->m_members[i].object(nameId, i, - QScriptValue::Undeletable - | QScriptValue::SkipInEnumeration); - activation_data->m_values[i] = (i < argc) ? argp[i + 1] : undefined; - } - - eng->objectConstructor->newObject(&nested_data->m_thisObject); - nested_data->argc = argc; - if (callee.m_object_value->m_scope.isValid()) - activation_data->m_scope = callee.m_object_value->m_scope; - else - activation_data->m_scope = eng->m_globalObject; - nested_data->tempStack = stackPtr; - nested_data->args = &argp[1]; - nested_data->m_result = undefined; - - QScriptObject *instance = nested_data->m_thisObject.m_object_value; - - // set [[prototype]] - QScriptValueImpl dummy; - QScript::Member proto; - if (callee.resolve(eng->idTable()->id_prototype, &proto, &dummy, QScriptValue::ResolveLocal, QScript::Read)) - callee.get(proto, &instance->m_prototype); - if (!instance->m_prototype.isObject()) - instance->m_prototype = eng->objectConstructor->publicPrototype; - - function->execute(nested_data); - - --eng->m_callDepth; - - stackPtr = argp - 1; - if (isReference) - stackPtr -= 2; - - if (! nested_data->m_result.isValid()) - nested_data->m_result = undefined; - else if (! nested_data->m_result.isObject()) - nested_data->m_result = nested_data->m_thisObject; - - if (nested_data->m_state == QScriptContext::ExceptionState) { - eng->popContext(); - if (eng->shouldAbort()) - Abort(); - else - Done(); - } - - CHECK_TEMPSTACK(1); - - *++stackPtr = nested_data->m_result; - - eng->popContext(); - - if (eng->shouldAbort()) - Abort(); - - if (eng->m_processEventsInterval > 0) - eng->processEvents(); - - ++iPtr; - } Next(); - - I(FetchField): - { - QScriptValueImpl object = eng->toObject(stackPtr[-1]); - if (! object.isValid()) { - stackPtr -= 2; - throwTypeError(QLatin1String("not an object")); - HandleException(); - } - - QScriptValueImpl m = stackPtr[0]; - - QScript::Ecma::Array::Instance *arrayInstance = 0; - if (object.classInfo() == eng->arrayConstructor->classInfo()) - arrayInstance = static_cast<QScript::Ecma::Array::Instance *> (object.m_object_value->m_data); - - if (arrayInstance) { - quint32 pos = toArrayIndex(m); - if (pos != 0xFFFFFFFF) { - QScriptValueImpl val = arrayInstance->value.at(pos); - if (val.isValid()) { - *--stackPtr = val; - ++iPtr; - Next(); - } - } - } - - QScriptNameIdImpl *nameId = m.isString() ? m.m_string_value : 0; - - if (! nameId || ! nameId->unique) { - QString str; - - if (m.isNumber()) - qscript_uint_to_string(m.m_number_value, str); - - if (str.isEmpty()) - str = QScriptEnginePrivate::convertToNativeString(m); - - nameId = eng->nameId(str, /*persistent=*/false); - } - - QScript::Member member; - QScriptValueImpl base; - - if (object.resolve(nameId, &member, &base, QScriptValue::ResolvePrototype, QScript::Read)) { - base.get(member, --stackPtr); - if (hasUncaughtException()) { - stackPtr -= 1; - HandleException(); - } else if (member.isGetterOrSetter()) { - // call the getter function - QScriptValueImpl getter; - if (member.isGetter()) { - getter = *stackPtr; - } else { - if (!base.m_object_value->findGetter(&member)) { - stackPtr -= 1; - throwError(QLatin1String("No getter defined")); - HandleException(); - } - base.get(member, &getter); - } - *stackPtr = getter.call(object); - if (hasUncaughtException()) { - stackPtr -= 1; - Done(); - } - } - } else { - *(--stackPtr) = undefined; - } - - ++iPtr; - } Next(); - - I(LazyArguments): - { - QScript::Member member; - QScriptValueImpl base; - QScriptNameIdImpl *arguments = eng->idTable()->id_arguments; - if (!m_activation.resolve(arguments, &member, &base, QScriptValue::ResolveLocal, QScript::Read)) { - CREATE_MEMBER(m_activation, arguments, &member, QScriptValue::Undeletable); - if (!m_arguments.isValid()) { - if (eng->strictlyEquals(m_activation, eng->globalObject())) - m_arguments = undefined; - else - eng->newArguments(&m_arguments, m_activation, argc, m_callee); - } - m_activation.put(member, m_arguments); - } - ++iPtr; - } Next(); - - I(DeclareLocal): - { - QScriptValueImpl &act = m_activation; - - QScriptNameIdImpl *memberName = iPtr->operand[0].m_string_value; - bool readOnly = iPtr->operand[1].m_int_value != 0; - QScript::Member member; - QScriptValueImpl object; - - if (! act.resolve(memberName, &member, &object, QScriptValue::ResolveLocal, QScript::ReadWrite)) { - uint flags = QScriptValue::Undeletable; - if (readOnly) - flags |= QScript::Member::UninitializedConst | QScriptValue::ReadOnly; - CREATE_MEMBER(act, memberName, &member, flags); - act.put(member, undefined); - } - ++iPtr; - } Next(); - - I(Assign): - { - if (! stackPtr[-1].isReference()) { - stackPtr -= 2; - throwSyntaxError(QLatin1String("invalid assignment lvalue")); - HandleException(); - } - - QScriptValue::ResolveFlags mode; - mode = QScriptValue::ResolveFlags(stackPtr[-1].m_int_value) - | QScriptValue::ResolvePrototype; - - QScriptValueImpl object = eng->toObject(stackPtr[-3]); - if (! object.isValid()) { - stackPtr -= 4; - throwTypeError(QLatin1String("invalid assignment lvalue")); - HandleException(); - } - - QScriptValueImpl m = stackPtr[-2]; - QScriptValueImpl value = stackPtr[0]; - - quint32 pos = 0xFFFFFFFF; - - QScript::Ecma::Array::Instance *arrayInstance = eng->arrayConstructor->get(object); - if (arrayInstance) - pos = toArrayIndex(m); - - stackPtr -= 3; - - if (pos != 0xFFFFFFFF) - arrayInstance->value.assign(pos, value); - - else { - QScriptNameIdImpl *memberName; - - if (m.isString() && m.m_string_value->unique) - memberName = m.m_string_value; - else - memberName = eng->nameId(QScriptEnginePrivate::convertToNativeString(m), /*persistent=*/false); - - QScriptValueImpl base; - QScript::Member member; - - const bool isMemberAssignment = (object.m_object_value != m_scopeChain.m_object_value); - if (! object.resolve(memberName, &member, &base, mode, QScript::Write)) { - if (isMemberAssignment) - base = object; - else - base = eng->m_globalObject; - - CREATE_MEMBER(base, memberName, &member, /*flags=*/0); - } - - if (value.isString() && ! value.m_string_value->unique) - eng->newNameId(&value, value.m_string_value->s); - - if (member.isGetterOrSetter()) { - // find and call setter(value) - QScriptValueImpl setter; - if (!member.isSetter()) { - if (!base.m_object_value->findSetter(&member)) { - stackPtr -= 1; - throwError(QLatin1String("no setter defined")); - HandleException(); - } - } - base.get(member, &setter); - - if (!isMemberAssignment) { - // decide the this-object. This is the object that actually - // has the setter (in its prototype chain). - while (!object.resolve(memberName, &member, &base, QScriptValue::ResolvePrototype, QScript::Write)) - object = object.scope(); - if (object.classInfo() == eng->m_class_with) - object = object.prototype(); - } - - value = setter.call(object, QScriptValueImplList() << value); - if (hasUncaughtException()) { - stackPtr -= 1; - Done(); - } - } else { - if (object.classInfo() == eng->m_class_with) - object = object.prototype(); - - if (member.isWritable()) { - if (isMemberAssignment && (base.m_object_value != object.m_object_value)) { - base = object; - CREATE_MEMBER(base, memberName, &member, /*flags=*/0); - } - base.put(member, value); - } else if (member.isUninitializedConst()) { - base.put(member, value); - if (member.isObjectProperty()) { - base.m_object_value->m_members[member.id()] - .unsetFlags(QScript::Member::UninitializedConst); - } - } - if (hasUncaughtException()) { - stackPtr -= 1; - HandleException(); - } - } - } - - *stackPtr = value; - ++iPtr; - } Next(); - - I(BitAnd): - { - qint32 v1 = QScriptEnginePrivate::convertToNativeInt32(stackPtr[-1]); - qint32 v2 = QScriptEnginePrivate::convertToNativeInt32(stackPtr[0]); - *(--stackPtr) = QScriptValueImpl(v1 & v2); - ++iPtr; - } Next(); - - I(BitOr): - { - qint32 v1 = QScriptEnginePrivate::convertToNativeInt32(stackPtr[-1]); - qint32 v2 = QScriptEnginePrivate::convertToNativeInt32(stackPtr[0]); - *(--stackPtr) = QScriptValueImpl(v1 | v2); - ++iPtr; - } Next(); - - I(BitXor): - { - qint32 v1 = QScriptEnginePrivate::convertToNativeInt32(stackPtr[-1]); - qint32 v2 = QScriptEnginePrivate::convertToNativeInt32(stackPtr[0]); - *(--stackPtr) = QScriptValueImpl(v1 ^ v2); - ++iPtr; - } Next(); - - I(BitNot): - { - qint32 v1 = QScriptEnginePrivate::convertToNativeInt32(stackPtr[0]); - *stackPtr = QScriptValueImpl(~v1); - ++iPtr; - } Next(); - - I(Not): - { - bool v1 = QScriptEnginePrivate::convertToNativeBoolean(stackPtr[0]); - *stackPtr = QScriptValueImpl(!v1); - ++iPtr; - } Next(); - - I(LeftShift): - { - qint32 v1 = QScriptEnginePrivate::convertToNativeInt32(stackPtr[-1]); - qint32 v2 = QScriptEnginePrivate::convertToNativeInt32(stackPtr[0]) & 0x1f; - *(--stackPtr) = QScriptValueImpl(v1 << v2); - ++iPtr; - } Next(); - - I(Mod): - { - qsreal v1 = QScriptEnginePrivate::convertToNativeDouble(stackPtr[-1]); - qsreal v2 = QScriptEnginePrivate::convertToNativeDouble(stackPtr[0]); - - *(--stackPtr) = QScriptValueImpl(::fmod(v1, v2)); - ++iPtr; - } Next(); - - I(RightShift): - { - qint32 v1 = QScriptEnginePrivate::convertToNativeInt32(stackPtr[-1]); - quint32 v2 = QScriptEnginePrivate::toUint32 (eng->convertToNativeDouble(stackPtr[0])) & 0x1f; - *(--stackPtr) = QScriptValueImpl(v1 >> v2); - ++iPtr; - } Next(); - - I(URightShift): - { - quint32 v1 = QScriptEnginePrivate::toUint32 (eng->convertToNativeDouble(stackPtr[-1])); - qint32 v2 = QScriptEnginePrivate::convertToNativeInt32(stackPtr[0]) & 0x1f; - *(--stackPtr) = QScriptValueImpl(v1 >> v2); - ++iPtr; - } Next(); - - I(InstanceOf): - { - QScriptValueImpl object = stackPtr[-1]; - QScriptValueImpl ctor = stackPtr[0]; - - if (!ctor.isObject() || !ctor.implementsHasInstance()) { - stackPtr -= 2; - throwTypeError(QLatin1String("invalid 'instanceof' operand")); - HandleException(); - } - - bool result = ctor.hasInstance(object); - if (eng->hasUncaughtException()) { - stackPtr -= 2; - HandleException(); - } - - *(--stackPtr) = QScriptValueImpl(result); - ++iPtr; - } Next(); - - I(In): - { - QScriptValueImpl object = stackPtr[0]; - if (!object.isObject()) { - stackPtr -= 2; - throwTypeError(QLatin1String("invalid 'in' operand")); - HandleException(); - } - QString propertyName = QScriptEnginePrivate::convertToNativeString(stackPtr[-1]); - bool result = object.property(propertyName, QScriptValue::ResolvePrototype).isValid(); // ### hasProperty() - *(--stackPtr) = QScriptValueImpl(result); - ++iPtr; - } Next(); - - I(Add): - { - QScriptValueImpl lhs = eng->toPrimitive(stackPtr[-1], QScriptValueImpl::NoTypeHint); - QScriptValueImpl rhs = eng->toPrimitive(stackPtr[0], QScriptValueImpl::NoTypeHint); - - if (lhs.isString() || rhs.isString()) { - QString tmp = QScriptEnginePrivate::convertToNativeString(lhs); - tmp += QScriptEnginePrivate::convertToNativeString(rhs); - eng->newString(--stackPtr, tmp); - } else { - qsreal tmp = QScriptEnginePrivate::convertToNativeDouble(lhs); - tmp += QScriptEnginePrivate::convertToNativeDouble(rhs); - *(--stackPtr) = QScriptValueImpl(tmp); - } - - ++iPtr; - } Next(); - - I(Div): - { - qsreal v1 = QScriptEnginePrivate::convertToNativeDouble(stackPtr[-1]); - qsreal v2 = QScriptEnginePrivate::convertToNativeDouble(stackPtr[0]); - *(--stackPtr) = QScriptValueImpl(v1 / v2); - ++iPtr; - } Next(); - - I(Equal): - { - QScriptValueImpl v1 = stackPtr[-1]; - QScriptValueImpl v2 = stackPtr[0]; - *(--stackPtr) = QScriptValueImpl(eq_cmp(v1, v2)); - ++iPtr; - } Next(); - - I(GreatOrEqual): - { - QScriptValueImpl v1 = stackPtr[0]; - QScriptValueImpl v2 = stackPtr[-1]; - *(--stackPtr) = QScriptValueImpl(le_cmp(v1, v2)); - ++iPtr; - } Next(); - - I(GreatThan): - { - QScriptValueImpl v1 = stackPtr[0]; - QScriptValueImpl v2 = stackPtr[-1]; - *(--stackPtr) = QScriptValueImpl(lt_cmp(v1, v2)); - ++iPtr; - } Next(); - - I(LessOrEqual): - { - QScriptValueImpl v1 = stackPtr[-1]; - QScriptValueImpl v2 = stackPtr[0]; - *(--stackPtr) = QScriptValueImpl(le_cmp(v1, v2)); - ++iPtr; - } Next(); - - I(LessThan): - { - QScriptValueImpl v1 = stackPtr[-1]; - QScriptValueImpl v2 = stackPtr[0]; - *(--stackPtr) = QScriptValueImpl(lt_cmp(v1, v2)); - ++iPtr; - } Next(); - - I(NotEqual): - { - QScriptValueImpl v1 = stackPtr[-1]; - QScriptValueImpl v2 = stackPtr[0]; - *(--stackPtr) = QScriptValueImpl(!eq_cmp(v1, v2)); - ++iPtr; - } Next(); - - I(Mul): - { - qsreal v1 = QScriptEnginePrivate::convertToNativeDouble(stackPtr[-1]); - qsreal v2 = QScriptEnginePrivate::convertToNativeDouble(stackPtr[0]); - *(--stackPtr) = QScriptValueImpl(v1 * v2); - ++iPtr; - } Next(); - - I(StrictEqual): - { - QScriptValueImpl v1 = stackPtr[-1]; - QScriptValueImpl v2 = stackPtr[0]; - *(--stackPtr) = strict_eq_cmp(v1, v2); - ++iPtr; - } Next(); - - I(StrictNotEqual): - { - QScriptValueImpl v1 = stackPtr[-1]; - QScriptValueImpl v2 = stackPtr[0]; - *(--stackPtr) = ! strict_eq_cmp(v1, v2); - ++iPtr; - } Next(); - - I(Sub): - { - qsreal v1 = QScriptEnginePrivate::convertToNativeDouble(stackPtr[-1]); - qsreal v2 = QScriptEnginePrivate::convertToNativeDouble(stackPtr[0]); - *(--stackPtr) = QScriptValueImpl(v1 - v2); - ++iPtr; - } Next(); - - I(UnaryMinus): - { - qsreal v1 = QScriptEnginePrivate::convertToNativeDouble(*stackPtr); - *stackPtr = QScriptValueImpl(-v1); - ++iPtr; - } Next(); - - I(UnaryPlus): - { - qsreal v1 = QScriptEnginePrivate::convertToNativeDouble(*stackPtr); - *stackPtr = QScriptValueImpl(+v1); - ++iPtr; - } Next(); - - I(Branch): - { - eng->maybeProcessEvents(); - if (hasUncaughtException()) - HandleException(); - if (eng->shouldAbort()) - Abort(); - iPtr += iPtr->operand[0].m_int_value; - } Next(); - - I(BranchFalse): - { - if (! QScriptEnginePrivate::convertToNativeBoolean(*stackPtr--)) - iPtr += iPtr->operand[0].m_int_value; - else - ++iPtr; - } Next(); - - I(BranchTrue): - { - if (eng->convertToNativeBoolean(*stackPtr--)) - iPtr += iPtr->operand[0].m_int_value; - else - ++iPtr; - } Next(); - - I(NewClosure): - { - CHECK_TEMPSTACK(1); - - QScript::AST::FunctionExpression *expr = static_cast<QScript::AST::FunctionExpression *> (iPtr->operand[0].m_ptr_value); - -#ifndef Q_SCRIPT_NO_JOINED_FUNCTION - if (QScript::Code *code = eng->findCode(functionBody)) { - QScriptValueImpl value = code->value; - - if (isValid(value)) { - QScriptObject *instance = value.m_object_value; - Q_ASSERT(instance != 0); - - if (instance->m_scope.m_object_value == m_scopeChain.m_object_value) - { - *++stackPtr = value; - ++iPtr; - Next(); - } - } - } -#endif - - QScript::ScriptFunction *function = new QScript::ScriptFunction(expr, code->astPool); - - // update the formals - for (QScript::AST::FormalParameterList *it = expr->formals; it != 0; it = it->next) { - function->formals.append(it->name); - } - function->length = function->formals.count(); - - eng->functionConstructor->newFunction(++stackPtr, function); - - QScriptObject *instance = stackPtr->m_object_value; - // initialize [[scope]] - instance->m_scope = m_scopeChain; - - // create and initialize `prototype' - QScriptValueImpl proto; - eng->objectConstructor->newObject(&proto); - - QScript::Member member; - CREATE_MEMBER(proto, eng->idTable()->id_constructor, &member, - QScriptValue::Undeletable - | QScriptValue::SkipInEnumeration); - proto.put(member, *stackPtr); - - stackPtr->createMember(eng->idTable()->id_prototype, &member, - QScriptValue::Undeletable); - stackPtr->put(member, proto); - - ++iPtr; - } Next(); - - I(Incr): - { - if (! stackPtr[0].isReference()) { - stackPtr -= 1; - throwSyntaxError(QLatin1String("invalid increment operand")); - HandleException(); - } - - BEGIN_PREFIX_OPERATOR - - qsreal x = QScriptEnginePrivate::convertToNativeDouble(value); - value = QScriptValueImpl(x + 1); - - END_PREFIX_OPERATOR - } Next(); - - I(Decr): - { - if (! stackPtr[0].isReference()) { - stackPtr -= 1; - throwSyntaxError(QLatin1String("invalid decrement operand")); - HandleException(); - } - - BEGIN_PREFIX_OPERATOR - - qsreal x = QScriptEnginePrivate::convertToNativeDouble(value); - value = QScriptValueImpl(x - 1); - - END_PREFIX_OPERATOR - } Next(); - - I(PostIncr): - { - if (! stackPtr[0].isReference()) { - stackPtr -= 1; - throwSyntaxError(QLatin1String("invalid increment operand")); - HandleException(); - } - - QScriptValue::ResolveFlags mode; - mode = QScriptValue::ResolveFlags(stackPtr[0].m_int_value) - | QScriptValue::ResolvePrototype; - - --stackPtr; - - QScriptValueImpl object = eng->toObject(stackPtr[-1]); - if (!object.isObject()) { - stackPtr -= 2; - throwTypeError(QLatin1String("not an object")); - HandleException(); - } - - QScriptNameIdImpl *memberName = 0; - if (stackPtr[0].isString() && stackPtr[0].m_string_value->unique) - memberName = stackPtr[0].m_string_value; - else - memberName = eng->nameId(stackPtr[0].toString(), /*persistent=*/false); - - QScript::Member member; - QScriptValueImpl base; - QScriptValueImpl value; - QScriptObject *instance = object.m_object_value; - const bool isMemberAssignment = (instance != m_scopeChain.m_object_value); - if (instance->findMember(memberName, &member)) { - if (!member.isGetterOrSetter()) { - QScriptValueImpl &r = instance->reference(member); - if (r.isNumber()) { - *(--stackPtr) = QScriptValueImpl(r.m_number_value); - r.incr(); - ++iPtr; - Next(); - } - } - base = object; - } else if (!object.resolve_helper(memberName, &member, &base, mode, QScript::ReadWrite)) { - if (!isMemberAssignment) { - stackPtr -= 2; - throwNotDefined(memberName); - HandleException(); - } - base = object; - CREATE_MEMBER(base, memberName, &member, /*flags=*/0); - base.put(member, undefined); - } - - QScriptValueImpl getter; - QScriptValueImpl setter; - base.get(member, &value); - if (hasUncaughtException()) { - stackPtr -= 2; - HandleException(); - } else if (member.isGetterOrSetter()) { - if (member.isGetter()) { - getter = value; - if (!member.isSetter() && !base.m_object_value->findSetter(&member)) { - stackPtr -= 2; - throwError(QLatin1String("No setter defined")); - HandleException(); - } - base.get(member, &setter); - } else { - setter = value; - QScript::Member tmp = member; - if (!base.m_object_value->findGetter(&member)) { - stackPtr -= 2; - throwError(QLatin1String("No getter defined")); - HandleException(); - } - base.get(member, &getter); - member = tmp; - } - value = getter.call(object); - if (hasUncaughtException()) { - stackPtr -= 2; - Done(); - } - } - - qsreal x = QScriptEnginePrivate::convertToNativeDouble(value); - - value = QScriptValueImpl(x + 1); - - if (member.isSetter()) { - setter.call(object, QScriptValueImplList() << value); - if (hasUncaughtException()) { - stackPtr -= 2; - Done(); - } - } else { - if (isMemberAssignment && (base.m_object_value != object.m_object_value)) { - base = object; - CREATE_MEMBER(base, memberName, &member, /*flags=*/0); - } - if (member.isWritable()) { - base.put(member, value); - if (hasUncaughtException()) { - stackPtr -= 2; - HandleException(); - } - } - } - - *(--stackPtr) = QScriptValueImpl(x); - - ++iPtr; - } Next(); - - I(PostDecr): - { - // ### most of the code is duplicated from PostIncr -- try to merge - if (! stackPtr[0].isReference()) { - stackPtr -= 1; - throwSyntaxError(QLatin1String("invalid decrement operand")); - HandleException(); - } - - QScriptValue::ResolveFlags mode = QScriptValue::ResolveFlags(stackPtr[0].m_int_value) - | QScriptValue::ResolvePrototype; - - --stackPtr; - - QScriptValueImpl object = eng->toObject(stackPtr[-1]); - if (!object.isObject()) { - stackPtr -= 2; - throwTypeError(QLatin1String("not an object")); - HandleException(); - } - - QScriptNameIdImpl *memberName = 0; - if (stackPtr[0].isString() && stackPtr[0].m_string_value->unique) - memberName = stackPtr[0].m_string_value; - else - memberName = eng->nameId(stackPtr[0].toString(), /*persistent=*/false); - - QScript::Member member; - QScriptValueImpl base; - QScriptValueImpl value; - QScriptObject *instance = object.m_object_value; - const bool isMemberAssignment = (instance != m_scopeChain.m_object_value); - if (instance->findMember(memberName, &member)) { - if (!member.isGetterOrSetter()) { - QScriptValueImpl &r = instance->reference(member); - if (r.isNumber()) { - *(--stackPtr) = QScriptValueImpl(r.m_number_value); - r.decr(); - ++iPtr; - Next(); - } - } - base = object; - } else if (! object.resolve_helper(memberName, &member, &base, mode, QScript::ReadWrite)) { - if (!isMemberAssignment) { - stackPtr -= 2; - throwNotDefined(memberName); - HandleException(); - } - base = object; - CREATE_MEMBER(base, memberName, &member, /*flags=*/0); - base.put(member, undefined); - } - - QScriptValueImpl getter; - QScriptValueImpl setter; - base.get(member, &value); - if (hasUncaughtException()) { - stackPtr -= 2; - HandleException(); - } else if (member.isGetterOrSetter()) { - if (member.isGetter()) { - getter = value; - if (!member.isSetter() && !base.m_object_value->findSetter(&member)) { - stackPtr -= 2; - throwError(QLatin1String("No setter defined")); - HandleException(); - } - base.get(member, &setter); - } else { - setter = value; - QScript::Member tmp = member; - if (!base.m_object_value->findGetter(&member)) { - stackPtr -= 2; - throwError(QLatin1String("No getter defined")); - HandleException(); - } - base.get(member, &getter); - member = tmp; - } - value = getter.call(object); - if (hasUncaughtException()) { - stackPtr -= 2; - Done(); - } - } - - qsreal x = QScriptEnginePrivate::convertToNativeDouble(value); - - value = QScriptValueImpl(x - 1); - - if (member.isSetter()) { - setter.call(object, QScriptValueImplList() << value); - if (hasUncaughtException()) { - stackPtr -= 2; - Done(); - } - } else { - if (isMemberAssignment && (base.m_object_value != object.m_object_value)) { - base = object; - CREATE_MEMBER(base, memberName, &member, /*flags=*/0); - } - if (member.isWritable()) { - base.put(member, value); - if (hasUncaughtException()) { - stackPtr -= 2; - HandleException(); - } - } - } - - *(--stackPtr) = QScriptValueImpl(x); - - ++iPtr; - } Next(); - - I(InplaceAdd): - { - BEGIN_INPLACE_OPERATOR - - lhs = eng->toPrimitive(lhs); - rhs = eng->toPrimitive(rhs); - if (lhs.isString() || rhs.isString()) { - if (lhs.isString() && !lhs.m_string_value->unique) { - lhs.m_string_value->s += QScriptEnginePrivate::convertToNativeString(rhs); - stackPtr -= 3; - *stackPtr = lhs; - } else { - QString tmp = QScriptEnginePrivate::convertToNativeString(lhs); - tmp += QScriptEnginePrivate::convertToNativeString(rhs); - stackPtr -= 3; - eng->newString(stackPtr, tmp); - } - } else { - qsreal tmp = QScriptEnginePrivate::convertToNativeDouble(lhs); - tmp += QScriptEnginePrivate::convertToNativeDouble(rhs); - stackPtr -= 3; - *stackPtr = QScriptValueImpl(tmp); - } - - END_INPLACE_OPERATOR - } Next(); - - I(InplaceSub): - { - BEGIN_INPLACE_OPERATOR - - qsreal v1 = QScriptEnginePrivate::convertToNativeDouble(lhs); - qsreal v2 = QScriptEnginePrivate::convertToNativeDouble(rhs); - - stackPtr -= 3; - *stackPtr = QScriptValueImpl(v1 - v2); - - END_INPLACE_OPERATOR - } Next(); - - I(InplaceAnd): - { - BEGIN_INPLACE_OPERATOR - - qint32 v1 = QScriptEnginePrivate::convertToNativeInt32(lhs); - qint32 v2 = QScriptEnginePrivate::convertToNativeInt32(rhs); - - stackPtr -= 3; - *stackPtr = QScriptValueImpl(v1 & v2); - - END_INPLACE_OPERATOR - } Next(); - - I(InplaceDiv): - { - BEGIN_INPLACE_OPERATOR - - qsreal v1 = QScriptEnginePrivate::convertToNativeDouble(lhs); - qsreal v2 = QScriptEnginePrivate::convertToNativeDouble(rhs); - - stackPtr -= 3; - *stackPtr = QScriptValueImpl(v1 / v2); - - END_INPLACE_OPERATOR - } Next(); - - I(InplaceLeftShift): - { - BEGIN_INPLACE_OPERATOR - - qint32 v1 = QScriptEnginePrivate::convertToNativeInt32(lhs); - qint32 v2 = QScriptEnginePrivate::convertToNativeInt32(rhs); - - stackPtr -= 3; - *stackPtr = QScriptValueImpl(v1 << v2); - - END_INPLACE_OPERATOR - } Next(); - - I(InplaceMod): - { - BEGIN_INPLACE_OPERATOR - - qsreal v1 = QScriptEnginePrivate::convertToNativeDouble(lhs); - qsreal v2 = QScriptEnginePrivate::convertToNativeDouble(rhs); - - stackPtr -= 3; - *stackPtr = QScriptValueImpl(::fmod (v1, v2)); - - END_INPLACE_OPERATOR - } Next(); - - I(InplaceMul): - { - BEGIN_INPLACE_OPERATOR - - qsreal v1 = QScriptEnginePrivate::convertToNativeDouble(lhs); - qsreal v2 = QScriptEnginePrivate::convertToNativeDouble(rhs); - - stackPtr -= 3; - *stackPtr = QScriptValueImpl(v1 * v2); - - END_INPLACE_OPERATOR - } Next(); - - I(InplaceOr): - { - BEGIN_INPLACE_OPERATOR - - qint32 v1 = QScriptEnginePrivate::convertToNativeInt32(lhs); - qint32 v2 = QScriptEnginePrivate::convertToNativeInt32(rhs); - - stackPtr -= 3; - *stackPtr = QScriptValueImpl(v1 | v2); - - END_INPLACE_OPERATOR - } Next(); - - I(InplaceRightShift): - { - BEGIN_INPLACE_OPERATOR - - qint32 v1 = QScriptEnginePrivate::convertToNativeInt32(lhs); - qint32 v2 = QScriptEnginePrivate::convertToNativeInt32(rhs); - - stackPtr -= 3; - *stackPtr = QScriptValueImpl(v1 >> v2); - - END_INPLACE_OPERATOR - } Next(); - - I(InplaceURightShift): - { - BEGIN_INPLACE_OPERATOR - - quint32 v1 = QScriptEnginePrivate::toUint32 (eng->convertToNativeDouble(lhs)); - qint32 v2 = QScriptEnginePrivate::convertToNativeInt32(rhs); - - stackPtr -= 3; - *stackPtr = QScriptValueImpl(v1 >> v2); - - END_INPLACE_OPERATOR - } Next(); - - I(InplaceXor): - { - BEGIN_INPLACE_OPERATOR - - qint32 v1 = QScriptEnginePrivate::convertToNativeInt32(lhs); - qint32 v2 = QScriptEnginePrivate::convertToNativeInt32(rhs); - - stackPtr -= 3; - *stackPtr = QScriptValueImpl(v1 ^ v2); - - END_INPLACE_OPERATOR - } Next(); - - I(MakeReference): - { - CHECK_TEMPSTACK(1); - eng->newReference(++stackPtr, QScriptValue::ResolveLocal); - ++iPtr; - } Next(); - - I(TypeOf): - { - QScriptValueImpl value; - - bool isReference = stackPtr[0].isReference(); - - if (! isReference) { // we have a value - value = stackPtr[0]; - } else if (resolveField(eng, &stackPtr[-1], &value)) { - stackPtr -= 2; - if (hasUncaughtException()) { - stackPtr -= 1; - HandleException(); - } - } else { - value = undefined; - stackPtr -= 2; - } - - QString typeName; - - switch (value.type()) { - case QScript::InvalidType: - typeName = QLatin1String("invalid"); - break; - - case QScript::UndefinedType: - typeName = QLatin1String("undefined"); - break; - - case QScript::NullType: - typeName = QLatin1String("object"); - break; - - case QScript::BooleanType: - typeName = QLatin1String("boolean"); - break; - - case QScript::IntegerType: - case QScript::NumberType: - typeName = QLatin1String("number"); - break; - - case QScript::StringType: - case QScript::LazyStringType: - typeName = QLatin1String("string"); - break; - - case QScript::ReferenceType: - typeName = QLatin1String("reference"); - break; - - case QScript::PointerType: - typeName = QLatin1String("pointer"); - break; - - case QScript::ObjectType: - if (value.isFunction()) - typeName = QLatin1String("function"); - else - typeName = QLatin1String("object"); - break; - } - - eng->newString(stackPtr, typeName); - ++iPtr; - } Next(); - - I(Line): - { - eng->maybeGC(); - eng->maybeProcessEvents(); - if (hasUncaughtException()) - HandleException(); - if (eng->shouldAbort()) - Abort(); - currentLine = iPtr->operand[0].m_int_value; - currentColumn = iPtr->operand[1].m_int_value; -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - if (eng->shouldNotify()) { - eng->notifyPositionChange(this); - if (hasUncaughtException()) - HandleException(); - if (eng->shouldAbort()) - Abort(); - } -#endif - ++iPtr; - } Next(); - - I(Delete): - { - bool result; - if (! stackPtr[0].isReference()) - result = true; - - else { - QScriptValueImpl object = stackPtr[-2]; - if (!object.isObject()) - object = eng->toObject(object); - - QScriptNameIdImpl *nameId = 0; - if (stackPtr[-1].isString() && stackPtr[-1].m_string_value->unique) { - nameId = stackPtr[-1].m_string_value; - } else { - nameId = eng->nameId(QScriptEnginePrivate::convertToNativeString(stackPtr[-1]), - /*persistent=*/false); - } - if (object.classInfo() == eng->m_class_with) - object = object.prototype(); - result = object.deleteProperty(nameId, QScriptValue::ResolveScope); - stackPtr -= 2; - } - - *stackPtr = QScriptValueImpl(result); - - ++iPtr; - } Next(); - - - I(NewEnumeration): { - QScriptValueImpl e; - QScriptValueImpl object = eng->toObject(stackPtr[0]); - eng->enumerationConstructor->newEnumeration(&e, object); - *stackPtr = e; - ++iPtr; - } Next(); - - - I(ToFirstElement): { - QScript::Ext::Enumeration::Instance *e = eng->enumerationConstructor->get(stackPtr[0]); - Q_ASSERT(e != 0); - e->toFront(); - --stackPtr; - ++iPtr; - } Next(); - - - I(HasNextElement): { - QScript::Ext::Enumeration::Instance *e = eng->enumerationConstructor->get(stackPtr[0]); - Q_ASSERT(e != 0); - e->hasNext(this, stackPtr); - ++iPtr; - } Next(); - - - I(NextElement): { - // the Enumeration should be located below the result of I(Resolve) - if (! stackPtr[0].isReference()) { - throwTypeError(QLatin1String("QScript.VM.NextElement")); - HandleException(); - } - - QScript::Ext::Enumeration::Instance *e = eng->enumerationConstructor->get(stackPtr[-3]); - if (! e) { - throwTypeError(QLatin1String("QScript.VM.NextElement")); - HandleException(); - } - e->next(this, ++stackPtr); - ++iPtr; - } Next(); - - - I(Pop): - { - --stackPtr; - ++iPtr; - } Next(); - - I(Sync): - { - m_result = *stackPtr; - --stackPtr; - ++iPtr; - } Next(); - - I(Throw): - { - Q_ASSERT(stackPtr->isValid()); - m_result = *stackPtr--; - if (!m_result.isError() && !exceptionHandlerContext()) - eng->m_exceptionBacktrace = backtrace(); - m_state = QScriptContext::ExceptionState; -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - eng->notifyException(this); -#endif - } HandleException(); - - I(Ret): - { - Q_ASSERT(stackPtr->isValid()); - m_result = *stackPtr--; - ++iPtr; - } Done(); - - I(Halt): - { - ++iPtr; - } Done(); - - I(EnterWith): - { - QScriptValueImpl object = eng->toObject(*stackPtr--); - if (! object.isValid()) { - throwTypeError(QLatin1String("value has no properties")); - HandleException(); - } - QScriptValueImpl withObject; - eng->newObject(&withObject, object, eng->m_class_with); - withObject.m_object_value->m_scope = m_scopeChain; - m_scopeChain = withObject; - ++iPtr; - } Next(); - - I(LeaveWith): - { - QScriptValueImpl withObject = m_scopeChain; - m_scopeChain = withObject.m_object_value->m_scope; - ++iPtr; - } Next(); - - I(BeginCatch): - { - // result contains the thrown object - QScriptValueImpl object; - eng->newObject(&object, undefined); // ### prototype - QScript::Member member; - CREATE_MEMBER(object, iPtr->operand[0].m_string_value, &member, /*flags=*/0); - object.put(member, m_result); - // make catch-object head of scopechain - object.m_object_value->m_scope = m_scopeChain; - m_scopeChain = object; - - catching = true; - ++iPtr; - } Next(); - - I(EndCatch): - { - // remove catch-object from scopechain - QScriptValueImpl object = m_scopeChain; - m_scopeChain = object.m_object_value->m_scope; - - catching = false; - ++iPtr; - } Next(); - - I(Debugger): - { -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - eng->notifyDebugger(this); -#endif - ++iPtr; - } Next(); - -#ifndef Q_SCRIPT_DIRECT_CODE - I(Dummy): - { ; } - - } // end switch -#endif - -Lhandle_exception: - errorLineNumber = currentLine; - -Ldone: - Q_ASSERT(m_result.isValid()); - - if (m_state == QScriptContext::ExceptionState) { - if (catching) { - // exception thrown in catch -- clean up scopechain - QScriptValueImpl object = m_scopeChain; - m_scopeChain = object.m_object_value->m_scope; - catching = false; - } - - // see if we have an exception handler in this context - const QScriptInstruction *exPtr = findExceptionHandler(iPtr); - if (exPtr) { - if (m_scopeChain.classInfo() == eng->m_class_with) { - // clean up effects of with-statements if necessary - int withLevel = 0; - for (++iPtr; iPtr != exPtr; ++iPtr) { - if (iPtr->op == QScriptInstruction::OP_EnterWith) { - ++withLevel; - } else if (iPtr->op == QScriptInstruction::OP_LeaveWith) { - --withLevel; - if (withLevel < 0) { - QScriptValueImpl withObject = m_scopeChain; - m_scopeChain = withObject.m_object_value->m_scope; - } - } - } - } else { - iPtr = exPtr; - } - // go to the handler - recover(); -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - eng->notifyExceptionCatch(this); -#endif - goto Ltop; - } else { - if (!parentContext()) { - // pop all the top-level with-objects - while ((m_scopeChain.classInfo() == eng->m_class_with) - && !m_scopeChain.internalValue().isValid()) { - QScriptValueImpl withObject = m_scopeChain; - m_scopeChain = withObject.m_object_value->m_scope; - } - } - } - } - -Labort: -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - eng->notifyFunctionExit(this); -#endif - - eng->maybeGC(); - - currentLine = oldCurrentLine; - currentColumn = oldCurrentColumn; - m_code = oldCode; - - eng->m_evaluating = wasEvaluating; -} - -QScriptValueImpl QScriptContextPrivate::throwError(QScriptContext::Error error, const QString &text) -{ - QScriptEnginePrivate *eng_p = engine(); - QScript::Ecma::Error *ctor = eng_p->errorConstructor; - m_result.invalidate(); - switch (error) { - case QScriptContext::ReferenceError: - ctor->newReferenceError(&m_result, text); - break; - case QScriptContext::SyntaxError: - ctor->newSyntaxError(&m_result, text); - break; - case QScriptContext::TypeError: - ctor->newTypeError(&m_result, text); - break; - case QScriptContext::RangeError: - ctor->newRangeError(&m_result, text); - break; - case QScriptContext::URIError: - ctor->newURIError(&m_result, text); - break; - case QScriptContext::UnknownError: - default: - ctor->newError(&m_result, text); - } - setDebugInformation(&m_result); - m_state = QScriptContext::ExceptionState; -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - eng_p->notifyException(this); -#endif - return m_result; -} - -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY -qint64 QScriptContextPrivate::scriptId() const -{ - if (!m_code) - return -1; - return m_code->astPool->id(); -} -#endif - -QString QScriptContextPrivate::fileName() const -{ - if (!m_code) - return QString(); - return m_code->astPool->fileName(); -} - -QString QScriptContextPrivate::functionName() const -{ - if (!m_callee.isValid()) - return QString(); - QScriptFunction *fun = m_callee.toFunction(); - if (fun) - return fun->functionName(); - return QString(); -} - -void QScriptContextPrivate::setDebugInformation(QScriptValueImpl *error) const -{ - QScriptEnginePrivate *eng_p = engine(); - error->setProperty(QLatin1String("lineNumber"), QScriptValueImpl(currentLine)); - if (!fileName().isEmpty()) - error->setProperty(QLatin1String("fileName"), QScriptValueImpl(eng_p, fileName())); - - const QScriptContextPrivate *ctx = this; - QScriptValueImpl stackArray = eng_p->newArray(); - int i = 0; - while (ctx) { - QScriptValueImpl obj = eng_p->newObject(); - obj.setProperty(QLatin1String("frame"), ctx->activationObject()); - obj.setProperty(QLatin1String("lineNumber"), QScriptValueImpl(ctx->currentLine)); - if (!ctx->fileName().isEmpty()) - obj.setProperty(QLatin1String("fileName"), QScriptValueImpl(eng_p, ctx->fileName())); - if (!ctx->functionName().isEmpty()) - obj.setProperty(QLatin1String("functionName"), QScriptValueImpl(eng_p, ctx->functionName())); - stackArray.setProperty(i, obj); - ctx = ctx->parentContext(); - ++i; - } - error->setProperty(QLatin1String("stack"), stackArray); -} - -QStringList QScriptContextPrivate::backtrace() const -{ - QStringList result; - const QScriptContextPrivate *ctx = this; - while (ctx) { - QString s; - QString functionName = ctx->functionName(); - if (!functionName.isEmpty()) - s += functionName; - else { - if (ctx->parentContext()) { - if (ctx->callee().isFunction() - && ctx->callee().toFunction()->type() != QScriptFunction::Script) { - s += QLatin1String("<native>"); - } else { - s += QLatin1String("<anonymous>"); - } - } else { - s += QLatin1String("<global>"); - } - } - s += QLatin1Char('('); - for (int i = 0; i < ctx->argc; ++i) { - if (i > 0) - s += QLatin1Char(','); - QScriptValueImpl arg = ctx->args[i]; - if (arg.isObject()) - s += QLatin1String("[object Object]"); // don't do a function call - else - s += arg.toString(); - } - s += QLatin1String(")@"); - s += ctx->fileName(); - s += QString::fromLatin1(":%0").arg(ctx->currentLine); - result.append(s); - ctx = ctx->parentContext(); - } - return result; -} - -QScriptValueImpl QScriptContextPrivate::throwError(const QString &text) -{ - return throwError(QScriptContext::UnknownError, text); -} - -QScriptValueImpl QScriptContextPrivate::throwNotImplemented(const QString &name) -{ - return throwTypeError(QString::fromUtf8("%1 is not implemented").arg(name)); -} - -QScriptValueImpl QScriptContextPrivate::throwNotDefined(const QString &name) -{ - return throwError(QScriptContext::ReferenceError, - QString::fromUtf8("%1 is not defined").arg(name)); -} - -QScriptValueImpl QScriptContextPrivate::throwNotDefined(QScriptNameIdImpl *nameId) -{ - return throwNotDefined(QScriptEnginePrivate::toString(nameId)); -} - -bool QScriptContextPrivate::eq_cmp_helper(QScriptValueImpl lhs, QScriptValueImpl rhs) -{ - if (lhs.isNull() && rhs.isUndefined()) - return true; - - else if (lhs.isUndefined() && rhs.isNull()) - return true; - - else if (isNumerical(lhs) && rhs.isString()) - return QScriptEnginePrivate::convertToNativeDouble(lhs) == QScriptEnginePrivate::convertToNativeDouble(rhs); - - else if (lhs.isString() && isNumerical(rhs)) - return QScriptEnginePrivate::convertToNativeDouble(lhs) == QScriptEnginePrivate::convertToNativeDouble(rhs); - - else if (lhs.isBoolean()) - return eq_cmp(QScriptValueImpl(QScriptEnginePrivate::convertToNativeDouble(lhs)), rhs); - - else if (rhs.isBoolean()) - return eq_cmp(lhs, QScriptValueImpl(QScriptEnginePrivate::convertToNativeDouble(rhs))); - - else if (lhs.isObject() && ! rhs.isNull()) { - lhs = lhs.engine()->toPrimitive(lhs); - - if (lhs.isValid() && ! lhs.isObject()) - return eq_cmp(lhs, rhs); - } - - else if (rhs.isObject() && ! lhs.isNull()) { - rhs = rhs.engine()->toPrimitive(rhs); - - if (rhs.isValid() && ! rhs.isObject()) - return eq_cmp(lhs, rhs); - } - - return false; -} - -#if defined(Q_CC_GNU) && __GNUC__ <= 3 -bool QScriptContextPrivate::lt_cmp(QScriptValueImpl lhs, QScriptValueImpl rhs) -{ - if (lhs.type() == rhs.type()) { - switch (lhs.type()) { - case QScript::InvalidType: - case QScript::UndefinedType: - case QScript::NullType: - return false; - - case QScript::NumberType: - return lhs.m_number_value < rhs.m_number_value; - - case QScript::IntegerType: - return lhs.m_int_value < rhs.m_int_value; - - case QScript::BooleanType: - return lhs.m_bool_value < rhs.m_bool_value; - - default: - break; - } // switch - } -#else -bool QScriptContextPrivate::lt_cmp_helper(QScriptValueImpl lhs, QScriptValueImpl rhs) -{ -#endif - if ((lhs.type() == rhs.type()) && (lhs.type() == QScript::StringType)) - return lhs.m_string_value->s < rhs.m_string_value->s; - - if (lhs.isObject()) - lhs = lhs.engine()->toPrimitive(lhs, QScriptValueImpl::NumberTypeHint); - - if (rhs.isObject()) - rhs = rhs.engine()->toPrimitive(rhs, QScriptValueImpl::NumberTypeHint); - - if (lhs.isString() && rhs.isString()) - return QScriptEnginePrivate::convertToNativeString(lhs) < QScriptEnginePrivate::convertToNativeString(rhs); - - qsreal n1 = QScriptEnginePrivate::convertToNativeDouble(lhs); - qsreal n2 = QScriptEnginePrivate::convertToNativeDouble(rhs); -#if defined Q_CC_MSVC && !defined Q_CC_MSVC_NET - if (qIsNaN(n1) || qIsNaN(n2)) - return false; -#endif - return n1 < n2; -} - -bool QScriptContextPrivate::le_cmp_helper(QScriptValueImpl lhs, QScriptValueImpl rhs) -{ - if ((lhs.type() == rhs.type()) && (lhs.type() == QScript::StringType)) - return lhs.m_string_value->s <= rhs.m_string_value->s; - - if (lhs.isObject()) - lhs = lhs.engine()->toPrimitive(lhs, QScriptValueImpl::NumberTypeHint); - - if (rhs.isObject()) - rhs = rhs.engine()->toPrimitive(rhs, QScriptValueImpl::NumberTypeHint); - - if (lhs.isString() && rhs.isString()) - return QScriptEnginePrivate::convertToNativeString(lhs) <= QScriptEnginePrivate::convertToNativeString(rhs); - - qsreal n1 = QScriptEnginePrivate::convertToNativeDouble(lhs); - qsreal n2 = QScriptEnginePrivate::convertToNativeDouble(rhs); - return n1 <= n2; -} - -const QScriptInstruction *QScriptContextPrivate::findExceptionHandler( - const QScriptInstruction *ip) const -{ - Q_ASSERT(m_code); - int offset = ip - m_code->firstInstruction; - for (int i = 0; i < m_code->exceptionHandlers.count(); ++i) { - QScript::ExceptionHandlerDescriptor e = m_code->exceptionHandlers.at(i); - if (offset >= e.startInstruction() && offset <= e.endInstruction()) { - return m_code->firstInstruction + e.handlerInstruction(); - } - } - return 0; -} - -const QScriptInstruction *QScriptContextPrivate::findExceptionHandlerRecursive( - const QScriptInstruction *ip, QScriptContextPrivate **handlerContext) const -{ - const QScriptContextPrivate *ctx = this; - const QScriptInstruction *iip = ip; - while (ctx) { - if (ctx->m_code) { - const QScriptInstruction *ep = ctx->findExceptionHandler(iip); - if (ep) { - Q_ASSERT(handlerContext); - *handlerContext = const_cast<QScriptContextPrivate*>(ctx); - return ep; - } - } - ctx = ctx->parentContext(); - if (ctx) - iip = ctx->iPtr; - } - return 0; -} - -/*! - Requires that iPtr in current context is in sync -*/ -QScriptContextPrivate *QScriptContextPrivate::exceptionHandlerContext() const -{ - QScriptContextPrivate *handlerContext; - if (findExceptionHandlerRecursive(iPtr, &handlerContext)) - return handlerContext; - return 0; -} - -QScriptContext *QScriptContextPrivate::get(QScriptContextPrivate *d) -{ - if (d) - return d->q_func(); - return 0; -} - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT diff --git a/src/script/qscriptcontext_p.h b/src/script/qscriptcontext_p.h deleted file mode 100644 index b5be471..0000000 --- a/src/script/qscriptcontext_p.h +++ /dev/null @@ -1,361 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTCONTEXT_P_H -#define QSCRIPTCONTEXT_P_H - -#include "qscriptcontextfwd_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptenginefwd_p.h" -#include "qscriptnameid_p.h" - -#include <QtCore/qnumeric.h> - -QT_BEGIN_NAMESPACE - -// -// 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. -// - -inline QScriptContextPrivate::QScriptContextPrivate() - : previous(0), - argc(0), - m_state(QScriptContext::NormalState), - args(0), - tempStack(0), - stackPtr(0), - m_code(0), - iPtr(0), - firstInstruction(0), - lastInstruction(0), - currentLine(0), - currentColumn(0), - errorLineNumber(0), - catching(false), - m_calledAsConstructor(false), - calleeMetaIndex(0), - q_ptr(0) -{ -} - -inline QScriptContextPrivate *QScriptContextPrivate::get(QScriptContext *q) -{ - if (q) - return q->d_func(); - return 0; -} - -inline const QScriptContextPrivate *QScriptContextPrivate::get(const QScriptContext *q) -{ - if (q) - return q->d_func(); - return 0; -} - -inline QScriptContext *QScriptContextPrivate::create() -{ - return new QScriptContext; -} - -inline QScriptEnginePrivate *QScriptContextPrivate::engine() const -{ - return m_activation.engine(); -} - -inline QScriptContextPrivate *QScriptContextPrivate::parentContext() const -{ - return previous; -} - -inline void QScriptContextPrivate::init(QScriptContextPrivate *parent) -{ - m_state = QScriptContext::NormalState; - previous = parent; - args = 0; - argc = 0; - m_code = 0; - iPtr = firstInstruction = lastInstruction = 0; - stackPtr = tempStack = (parent != 0) ? parent->stackPtr : 0; - m_activation.invalidate(); - m_thisObject.invalidate(); - m_result.invalidate(); - m_scopeChain.invalidate(); - m_callee.invalidate(); - m_arguments.invalidate(); - currentLine = -1; - currentColumn = -1; - errorLineNumber = -1; - m_calledAsConstructor = false; -} - -inline QScriptValueImpl QScriptContextPrivate::argument(int index) const -{ - if (index >= argc) - return engine()->undefinedValue(); - - Q_ASSERT(args != 0); - return args[index]; -} - -inline int QScriptContextPrivate::argumentCount() const -{ - return argc; -} - -inline QScriptValueImpl QScriptContextPrivate::argumentsObject() const -{ - if (!m_arguments.isValid() && m_activation.isValid()) { - QScriptContextPrivate *dd = const_cast<QScriptContextPrivate*>(this); - engine()->newArguments(&dd->m_arguments, m_activation, - argc, m_callee); - } - return m_arguments; -} - -inline void QScriptContextPrivate::throwException() -{ - m_state = QScriptContext::ExceptionState; -} - -inline bool QScriptContextPrivate::hasUncaughtException() const -{ - return m_state == QScriptContext::ExceptionState; -} - -inline void QScriptContextPrivate::recover() -{ - m_state = QScriptContext::NormalState; - errorLineNumber = -1; -} - -inline bool QScriptContextPrivate::isNumerical(const QScriptValueImpl &v) -{ - switch (v.type()) { - case QScript::BooleanType: - case QScript::IntegerType: - case QScript::NumberType: - return true; - - default: - return false; - } -} - -inline bool QScriptContextPrivate::eq_cmp(const QScriptValueImpl &lhs, const QScriptValueImpl &rhs) -{ - if (lhs.type() == rhs.type()) { - switch (lhs.type()) { - case QScript::InvalidType: - case QScript::UndefinedType: - case QScript::NullType: - return true; - - case QScript::NumberType: - return lhs.m_number_value == rhs.m_number_value; - - case QScript::ReferenceType: - case QScript::IntegerType: - return lhs.m_int_value == rhs.m_int_value; - - case QScript::BooleanType: - return lhs.m_bool_value == rhs.m_bool_value; - - case QScript::StringType: - if (lhs.m_string_value->unique && rhs.m_string_value->unique) - return lhs.m_string_value == rhs.m_string_value; - return lhs.m_string_value->s == rhs.m_string_value->s; - - case QScript::PointerType: - return lhs.m_ptr_value == rhs.m_ptr_value; - - case QScript::ObjectType: - if (lhs.isVariant()) - return lhs.m_object_value == rhs.m_object_value || lhs.toVariant() == rhs.toVariant(); -#ifndef QT_NO_QOBJECT - else if (lhs.isQObject()) - return lhs.m_object_value == rhs.m_object_value || lhs.toQObject() == rhs.toQObject(); -#endif - else - return lhs.m_object_value == rhs.m_object_value; - - case QScript::LazyStringType: - return *lhs.m_lazy_string_value == *rhs.m_lazy_string_value; - } - } - - return eq_cmp_helper(lhs, rhs); -} - -inline bool QScriptContextPrivate::strict_eq_cmp( const QScriptValueImpl &lhs, const QScriptValueImpl &rhs) -{ - if (lhs.type() != rhs.type()) - return false; - - switch (lhs.type()) { - case QScript::InvalidType: - case QScript::UndefinedType: - case QScript::NullType: - return true; - - case QScript::NumberType: - if (qIsNaN(lhs.m_number_value) || qIsNaN(rhs.m_number_value)) - return false; - return lhs.m_number_value == rhs.m_number_value; - - case QScript::IntegerType: - return lhs.m_int_value == rhs.m_int_value; - - case QScript::BooleanType: - return lhs.m_bool_value == rhs.m_bool_value; - - case QScript::StringType: - if (lhs.m_string_value->unique && rhs.m_string_value->unique) - return lhs.m_string_value == rhs.m_string_value; - return lhs.m_string_value->s == rhs.m_string_value->s; - - case QScript::ObjectType: - return lhs.m_object_value == rhs.m_object_value; - - case QScript::ReferenceType: - return lhs.m_int_value == rhs.m_int_value; - - case QScript::PointerType: - return lhs.m_ptr_value == rhs.m_ptr_value; - - case QScript::LazyStringType: - return *lhs.m_lazy_string_value == *rhs.m_lazy_string_value; - } - - return false; -} - -inline QScriptValueImpl QScriptContextPrivate::throwTypeError(const QString &text) -{ - return throwError(QScriptContext::TypeError, text); -} - -inline QScriptValueImpl QScriptContextPrivate::throwSyntaxError(const QString &text) -{ - return throwError(QScriptContext::SyntaxError, text); -} - -inline QScriptValueImpl QScriptContextPrivate::thisObject() const -{ - return m_thisObject; -} - -inline void QScriptContextPrivate::setThisObject(const QScriptValueImpl &object) -{ - m_thisObject = object; -} - -inline QScriptValueImpl QScriptContextPrivate::callee() const -{ - return m_callee; -} - -inline bool QScriptContextPrivate::isCalledAsConstructor() const -{ - return m_calledAsConstructor; -} - -inline QScriptValueImpl QScriptContextPrivate::returnValue() const -{ - return m_result; -} - -inline void QScriptContextPrivate::setReturnValue(const QScriptValueImpl &value) -{ - m_result = value; -} - -inline QScriptValueImpl QScriptContextPrivate::activationObject() const -{ - if (previous && !m_activation.property(QLatin1String("arguments")).isValid()) { - QScriptContextPrivate *dd = const_cast<QScriptContextPrivate*>(this); - dd->m_activation.setProperty(QLatin1String("arguments"), argumentsObject()); - } - return m_activation; -} - -inline void QScriptContextPrivate::setActivationObject(const QScriptValueImpl &activation) -{ - m_activation = activation; -} - -inline const QScriptInstruction *QScriptContextPrivate::instructionPointer() -{ - return iPtr; -} - -inline void QScriptContextPrivate::setInstructionPointer(const QScriptInstruction *instructionPointer) -{ - iPtr = instructionPointer; -} - -inline const QScriptValueImpl *QScriptContextPrivate::baseStackPointer() const -{ - return tempStack; -} - -inline const QScriptValueImpl *QScriptContextPrivate::currentStackPointer() const -{ - return stackPtr; -} - -inline QScriptContext::ExecutionState QScriptContextPrivate::state() const -{ - return m_state; -} - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT -#endif diff --git a/src/script/qscriptcontextfwd_p.h b/src/script/qscriptcontextfwd_p.h deleted file mode 100644 index 9b486d6..0000000 --- a/src/script/qscriptcontextfwd_p.h +++ /dev/null @@ -1,257 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTCONTEXTFWD_P_H -#define QSCRIPTCONTEXTFWD_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 "qscriptvalueimplfwd_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptcontext.h" - -#include <QtCore/qobjectdefs.h> - -#if defined Q_CC_MSVC && !defined Q_CC_MSVC_NET -#include <QtCore/qnumeric.h> -#endif - -QT_BEGIN_NAMESPACE - -namespace QScript { - namespace AST { - class Node; - } -class Code; -} - -class QScriptInstruction; - -class QScriptContextPrivate -{ - Q_DECLARE_PUBLIC(QScriptContext) -public: - inline QScriptContextPrivate(); - - static inline QScriptContextPrivate *get(QScriptContext *q); - static inline const QScriptContextPrivate *get(const QScriptContext *q); - static QScriptContext *get(QScriptContextPrivate *d); - - static inline QScriptContext *create(); - - inline QScriptEnginePrivate *engine() const; - inline QScriptContextPrivate *parentContext() const; - - inline void init(QScriptContextPrivate *parent); - inline QScriptValueImpl argument(int index) const; - inline int argumentCount() const; - inline QScriptValueImpl argumentsObject() const; - - inline void throwException(); - inline bool hasUncaughtException() const; - const QScriptInstruction *findExceptionHandler(const QScriptInstruction *ip) const; - const QScriptInstruction *findExceptionHandlerRecursive( - const QScriptInstruction *ip, QScriptContextPrivate **handlerContext) const; - QScriptContextPrivate *exceptionHandlerContext() const; - inline void recover(); - QStringList backtrace() const; - - static inline bool isNumerical(const QScriptValueImpl &v); - - static inline bool eq_cmp(const QScriptValueImpl &lhs, const QScriptValueImpl &rhs); - - static bool eq_cmp_helper(QScriptValueImpl lhs, QScriptValueImpl rhs); - -#if defined(Q_CC_GNU) && __GNUC__ <= 3 - static bool lt_cmp(QScriptValueImpl lhs, QScriptValueImpl rhs); -#else - static bool lt_cmp(const QScriptValueImpl &lhs, const QScriptValueImpl &rhs) - { - if (lhs.type() == rhs.type()) { - switch (lhs.type()) { - case QScript::UndefinedType: - case QScript::NullType: - return false; - - case QScript::NumberType: -#if defined Q_CC_MSVC && !defined Q_CC_MSVC_NET - if (qIsNaN(lhs.m_number_value) || qIsNaN(rhs.m_number_value)) - return false; -#endif - return lhs.m_number_value < rhs.m_number_value; - - case QScript::IntegerType: - return lhs.m_int_value < rhs.m_int_value; - - case QScript::BooleanType: - return lhs.m_bool_value < rhs.m_bool_value; - - default: - break; - } // switch - } - - return lt_cmp_helper(lhs, rhs); - } - - static bool lt_cmp_helper(QScriptValueImpl lhs, QScriptValueImpl rhs); -#endif - - static bool le_cmp(const QScriptValueImpl &lhs, const QScriptValueImpl &rhs) - { - if (lhs.type() == rhs.type()) { - switch (lhs.type()) { - case QScript::UndefinedType: - case QScript::NullType: - return true; - - case QScript::NumberType: - return lhs.m_number_value <= rhs.m_number_value; - - case QScript::IntegerType: - return lhs.m_int_value <= rhs.m_int_value; - - case QScript::BooleanType: - return lhs.m_bool_value <= rhs.m_bool_value; - - default: - break; - } // switch - } - - return le_cmp_helper(lhs, rhs); - } - - static bool le_cmp_helper(QScriptValueImpl lhs, QScriptValueImpl rhs); - - static inline bool strict_eq_cmp(const QScriptValueImpl &lhs, const QScriptValueImpl &rhs); - - bool resolveField(QScriptEnginePrivate *eng, QScriptValueImpl *stackPtr, - QScriptValueImpl *value); - - void execute(QScript::Code *code); - - QScriptValueImpl throwError(QScriptContext::Error error, const QString &text); - QScriptValueImpl throwError(const QString &text); - -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - qint64 scriptId() const; -#endif - QString fileName() const; - QString functionName() const; - void setDebugInformation(QScriptValueImpl *error) const; - - QScriptValueImpl throwNotImplemented(const QString &name); - QScriptValueImpl throwNotDefined(const QString &name); - QScriptValueImpl throwNotDefined(QScriptNameIdImpl *nameId); - - inline QScriptValueImpl throwTypeError(const QString &text); - inline QScriptValueImpl throwSyntaxError(const QString &text); - - inline QScriptValueImpl thisObject() const; - inline void setThisObject(const QScriptValueImpl &object); - - inline QScriptValueImpl callee() const; - inline bool isCalledAsConstructor() const; - - inline QScriptValueImpl returnValue() const; - inline void setReturnValue(const QScriptValueImpl &value); - - inline QScriptValueImpl activationObject() const; - inline void setActivationObject(const QScriptValueImpl &activation); - - inline const QScriptInstruction *instructionPointer(); - inline void setInstructionPointer(const QScriptInstruction *instructionPointer); - - inline const QScriptValueImpl *baseStackPointer() const; - inline const QScriptValueImpl *currentStackPointer() const; - - inline QScriptContext::ExecutionState state() const; - -public: - QScriptContextPrivate *previous; - int argc; - QScriptContext::ExecutionState m_state; - - QScriptValueImpl m_activation; - QScriptValueImpl m_thisObject; - QScriptValueImpl m_result; - QScriptValueImpl m_scopeChain; - QScriptValueImpl m_callee; - QScriptValueImpl m_arguments; - - QScriptValueImpl *args; - QScriptValueImpl *tempStack; - QScriptValueImpl *stackPtr; - - QScript::Code *m_code; - const QScriptInstruction *iPtr; - const QScriptInstruction *firstInstruction; - const QScriptInstruction *lastInstruction; - - int currentLine; - int currentColumn; - - int errorLineNumber; - - bool catching; - bool m_calledAsConstructor; - - int calleeMetaIndex; - - QScriptContext *q_ptr; -}; - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT -#endif diff --git a/src/script/qscriptcontextinfo_p.h b/src/script/qscriptcontextinfo_p.h deleted file mode 100644 index 775a81c..0000000 --- a/src/script/qscriptcontextinfo_p.h +++ /dev/null @@ -1,99 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTCONTEXTINFO_P_H -#define QSCRIPTCONTEXTINFO_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 "qscriptcontextinfo.h" - -#ifndef QT_NO_SCRIPT - -#include <QtCore/qatomic.h> -#include <QtCore/qstring.h> - -QT_BEGIN_NAMESPACE - -class QScriptContext; - -class QScriptContextInfo; -class QScriptContextInfoPrivate -{ - Q_DECLARE_PUBLIC(QScriptContextInfo) -public: - QScriptContextInfoPrivate(); - QScriptContextInfoPrivate(const QScriptContext *context); - ~QScriptContextInfoPrivate(); - - qint64 scriptId; - int lineNumber; - int columnNumber; - QString fileName; - - QString functionName; - QScriptContextInfo::FunctionType functionType; - - int functionStartLineNumber; - int functionEndLineNumber; - int functionMetaIndex; - - QStringList parameterNames; - - QBasicAtomicInt ref; - - QScriptContextInfo *q_ptr; -}; - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptecmaarray.cpp b/src/script/qscriptecmaarray.cpp deleted file mode 100644 index d068ba6..0000000 --- a/src/script/qscriptecmaarray.cpp +++ /dev/null @@ -1,777 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qscriptecmaarray_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" -#include "qscriptclassdata_p.h" - -#include <QtCore/QtDebug> - -QT_BEGIN_NAMESPACE - -namespace QScript { namespace Ecma { - -class ArrayClassData: public QScriptClassData -{ - QScriptClassInfo *m_classInfo; - -public: - ArrayClassData(QScriptClassInfo *classInfo); - virtual ~ArrayClassData(); - - inline QScriptClassInfo *classInfo() const - { return m_classInfo; } - - virtual void mark(const QScriptValueImpl &object, int generation); - virtual bool resolve(const QScriptValueImpl &object, - QScriptNameIdImpl *nameId, - QScript::Member *member, - QScriptValueImpl *base, - QScript::AccessMode mode); - virtual bool get(const QScriptValueImpl &obj, const Member &m, - QScriptValueImpl *out_value); - virtual bool put(QScriptValueImpl *object, const Member &member, - const QScriptValueImpl &value); - virtual bool removeMember(const QScriptValueImpl &object, - const QScript::Member &member); - virtual QScriptClassDataIterator *newIterator(const QScriptValueImpl &object); -}; - -class ArrayClassDataIterator: public QScriptClassDataIterator -{ -public: - ArrayClassDataIterator(Array::Instance *instance); - virtual ~ArrayClassDataIterator(); - - virtual bool hasNext() const; - virtual void next(QScript::Member *member); - - virtual bool hasPrevious() const; - virtual void previous(QScript::Member *member); - - virtual void toFront(); - virtual void toBack(); - -private: - Array::Instance *m_instance; - QList<uint> m_keys; - quint32 m_pos; -}; - -ArrayClassData::ArrayClassData(QScriptClassInfo *classInfo): - m_classInfo(classInfo) -{ -} - -ArrayClassData::~ArrayClassData() -{ -} - -void ArrayClassData::mark(const QScriptValueImpl &object, int generation) -{ - Array::Instance *instance = Array::Instance::get(object, classInfo()); - if (! instance) - return; - - instance->value.mark(generation); -} - -bool ArrayClassData::resolve(const QScriptValueImpl &object, - QScriptNameIdImpl *nameId, - QScript::Member *member, - QScriptValueImpl *base, - QScript::AccessMode access) -{ - QScriptEnginePrivate *eng_p = object.engine(); - - Array::Instance *instance = Array::Instance::get(object, classInfo()); - if (!instance) - return false; - - if (nameId == eng_p->idTable()->id_length) { - member->native(nameId, /*id=*/ 0, - QScriptValue::Undeletable - | QScriptValue::SkipInEnumeration); - *base = object; - return true; - } - - QString propertyName = eng_p->toString(nameId); - bool isNumber; - quint32 pos = propertyName.toUInt(&isNumber); - - if (!isNumber || (pos == 0xFFFFFFFF) - || (QScriptValueImpl(pos).toString() != propertyName)) { // ### improve me - return false; - } - - if ((access == QScript::Read) && ((pos >= instance->value.count()) || !instance->value.at(pos).isValid())) - return false; - - member->native(0, pos, /*flags=*/0); - *base = object; - return true; -} - -bool ArrayClassData::get(const QScriptValueImpl &object, - const QScript::Member &member, - QScriptValueImpl *result) -{ - Q_ASSERT(member.isValid()); - - if (! member.isNativeProperty()) - return false; - - QScriptEnginePrivate *eng = object.engine(); - - Array::Instance *instance = Array::Instance::get(object, classInfo()); - if (! instance) - return false; - - if (member.nameId() == eng->idTable()->id_length) - *result = QScriptValueImpl(instance->value.count()); - - else { - quint32 pos = quint32 (member.id()); - - if (pos < instance->value.count()) - *result = instance->value.at(pos); - else - *result = eng->undefinedValue(); - } - - return true; -} - -bool ArrayClassData::put(QScriptValueImpl *object, - const QScript::Member &member, - const QScriptValueImpl &value) -{ - Q_ASSERT(object != 0); - Q_ASSERT(member.isValid()); - - if (! member.isNativeProperty()) - return false; - - Array::Instance *instance = Array::Instance::get(*object, classInfo()); - if (! instance) - return false; - - QScriptEnginePrivate *eng_p = object->engine(); - - if (member.nameId() == eng_p->idTable()->id_length) { - qsreal length = value.toNumber(); - quint32 len = eng_p->toUint32(length); - instance->value.resize(len); - } - - else if (member.nameId() == 0) { - quint32 pos = quint32 (member.id()); - instance->value.assign(pos, value); - } - - return true; -} - -bool ArrayClassData::removeMember(const QScriptValueImpl &object, - const QScript::Member &member) -{ - if (!member.isNativeProperty() || !member.isDeletable() || (member.nameId() != 0)) - return false; - - Array::Instance *instance = Array::Instance::get(object, classInfo()); - if (! instance) - return false; - - quint32 pos = quint32 (member.id()); - if (instance->value.at(pos).isValid()) - instance->value.assign(pos, QScriptValueImpl()); - return true; -} - -QScriptClassDataIterator *ArrayClassData::newIterator(const QScriptValueImpl &object) -{ - Array::Instance *instance = Array::Instance::get(object, classInfo()); - return new ArrayClassDataIterator(instance); -} - -ArrayClassDataIterator::ArrayClassDataIterator(Array::Instance *instance) -{ - m_instance = instance; - toFront(); -} - -ArrayClassDataIterator::~ArrayClassDataIterator() -{ -} - -bool ArrayClassDataIterator::hasNext() const -{ - quint32 limit = m_keys.isEmpty() ? m_instance->value.size() : quint32(m_keys.size()); - for (quint32 i = m_pos; i < limit; ++i) { - quint32 realI = m_keys.isEmpty() ? i : m_keys.at(i); - if (m_instance->value.at(realI).isValid()) - return true; - } - return false; -} - -void ArrayClassDataIterator::next(QScript::Member *member) -{ - quint32 limit = m_keys.isEmpty() ? m_instance->value.size() : quint32(m_keys.size()); - for (quint32 i = m_pos; i < limit; ++i) { - quint32 realI = m_keys.isEmpty() ? i : m_keys.at(i); - if (m_instance->value.at(realI).isValid()) { - member->native(/*nameId=*/0, realI, /*flags=*/0); - m_pos = i + 1; - return; - } - } - member->invalidate(); -} - -bool ArrayClassDataIterator::hasPrevious() const -{ - for (quint32 i = m_pos - 1; i != 0xFFFFFFFF; --i) { - quint32 realI = m_keys.isEmpty() ? i : m_keys.at(i); - if (m_instance->value.at(realI).isValid()) - return true; - } - return false; -} - -void ArrayClassDataIterator::previous(QScript::Member *member) -{ - for (quint32 i = m_pos - 1; i != 0xFFFFFFFF; --i) { - quint32 realI = m_keys.isEmpty() ? i : m_keys.at(i); - if (m_instance->value.at(realI).isValid()) { - member->native(/*nameId=*/ 0, realI, /*flags=*/0); - m_pos = i; - return; - } - } - member->invalidate(); -} - -void ArrayClassDataIterator::toFront() -{ - m_keys = m_instance->value.keys(); - m_pos = 0; -} - -void ArrayClassDataIterator::toBack() -{ - m_keys = m_instance->value.keys(); - m_pos = m_keys.isEmpty() ? m_instance->value.count() : m_keys.size(); -} - - - -Array::Array(QScriptEnginePrivate *eng): - Core(eng, QLatin1String("Array"), QScriptClassInfo::ArrayType) -{ - classInfo()->setData(new ArrayClassData(classInfo())); - - newArray(&publicPrototype, QScript::Array(eng)); - - eng->newConstructor(&ctor, this, publicPrototype); - - addPrototypeFunction(QLatin1String("toString"), method_toString, 0); - addPrototypeFunction(QLatin1String("toLocaleString"), method_toLocaleString, 0); - addPrototypeFunction(QLatin1String("concat"), method_concat, 1); - addPrototypeFunction(QLatin1String("join"), method_join, 1); - addPrototypeFunction(QLatin1String("pop"), method_pop, 0); - addPrototypeFunction(QLatin1String("push"), method_push, 1); - addPrototypeFunction(QLatin1String("reverse"), method_reverse, 0); - addPrototypeFunction(QLatin1String("shift"), method_shift, 0); - addPrototypeFunction(QLatin1String("slice"), method_slice, 2); - addPrototypeFunction(QLatin1String("sort"), method_sort, 1); - addPrototypeFunction(QLatin1String("splice"), method_splice, 2); - addPrototypeFunction(QLatin1String("unshift"), method_unshift, 1); -} - -Array::~Array() -{ -} - -void Array::execute(QScriptContextPrivate *context) -{ -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - engine()->notifyFunctionEntry(context); -#endif - QScript::Array value(engine()); - - if (context->argumentCount() == 1 && context->argument(0).isNumber()) { - qsreal size = context->argument(0).toNumber(); - quint32 isize = QScriptEnginePrivate::toUint32(size); - - if (size != qsreal(isize)) { - context->throwError(QScriptContext::RangeError, QLatin1String("invalid array length")); - return; - } - - value.resize(isize); - } else { - for (int i = 0; i < context->argumentCount(); ++i) { - value.assign(i, context->argument(i)); - } - } - - if (context->isCalledAsConstructor()) { - QScriptValueImpl &object = context->m_thisObject; - object.setClassInfo(classInfo()); - object.setPrototype(publicPrototype); - initArray(&object, value); - } else { - newArray(&context->m_result, value); - } - -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - engine()->notifyFunctionExit(context); -#endif -} - -void Array::newArray(QScriptValueImpl *result, const QScript::Array &value) -{ - engine()->newObject(result, publicPrototype, classInfo()); - initArray(result, value); -} - -void Array::initArray(QScriptValueImpl *result, const QScript::Array &value) -{ - Instance *instance = new Instance(engine()); - instance->value = value; - result->setObjectData(instance); -} - -QScriptValueImpl Array::method_toString(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo) -{ - return method_join(context, eng, classInfo); // ### fixme -} - -QScriptValueImpl Array::method_toLocaleString(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo) -{ - return method_toString(context, eng, classInfo); -} - -QScriptValueImpl Array::method_concat(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo) -{ - QScript::Array result(eng); - - if (Instance *instance = Instance::get(context->thisObject(), classInfo)) - result = instance->value; - - else { - QString v = context->thisObject().toString(); - result.assign(0, QScriptValueImpl(eng, v)); - } - - for (int i = 0; i < context->argumentCount(); ++i) { - quint32 k = result.size(); - QScriptValueImpl arg = context->argument(i); - - if (Instance *elt = Instance::get(arg, classInfo)) - result.concat(elt->value); - - else - result.assign(k, QScriptValueImpl(eng, arg.toString())); - } - - return eng->newArray(result); -} - -QScriptValueImpl Array::method_join(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *) -{ - QScriptValueImpl arg = context->argument(0); - - QString r4; - if (arg.isUndefined()) - r4 = QLatin1String(","); - else - r4 = arg.toString(); - - QScriptValueImpl self = context->thisObject(); - - QScriptNameIdImpl *id_length = eng->idTable()->id_length; - QScriptValueImpl length = self.property(id_length); - qsreal r1 = length.isValid() ? length.toNumber() : 0; - quint32 r2 = QScriptEnginePrivate::toUint32(r1); - - if (! r2) - return QScriptValueImpl(eng, QString()); - - if (eng->visitedArrayElements.contains(self.objectValue())) { - // avoid infinite recursion - return QScriptValueImpl(eng, QString()); - } - eng->visitedArrayElements.insert(self.objectValue()); - - QString R; - - QScriptValueImpl r6 = self.property(QLatin1String("0")); - if (r6.isValid() && !(r6.isUndefined() || r6.isNull())) - R = r6.toString(); - - for (quint32 k = 1; k < r2; ++k) { - R += r4; - - QScriptNameIdImpl *name = eng->nameId(QScriptValueImpl(k).toString()); - QScriptValueImpl r12 = self.property(name); - - if (r12.isValid() && ! (r12.isUndefined() || r12.isNull())) - R += r12.toString(); - } - - eng->visitedArrayElements.remove(self.objectValue()); - return QScriptValueImpl(eng, R); -} - -QScriptValueImpl Array::method_pop(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (Instance *instance = Instance::get(self, classInfo)) { - QScriptValueImpl elt = instance->value.pop(); - if (! elt.isValid()) - elt = eng->undefinedValue(); - - return elt; - } - - QScriptNameIdImpl *id_length = eng->idTable()->id_length; - - QScriptValueImpl r1 = self.property(id_length); - quint32 r2 = r1.toUInt32(); - if (! r2) { - self.setProperty(id_length, QScriptValueImpl(0)); - return eng->undefinedValue(); - } - QScriptNameIdImpl *r6 = eng->nameId(QScriptValueImpl(r2 - 1).toString()); - QScriptValueImpl r7 = self.property(r6); - self.deleteProperty(r6); - self.setProperty(id_length, QScriptValueImpl(r2 - 1)); - if (!r7.isValid()) - return eng->undefinedValue(); - return r7; -} - -QScriptValueImpl Array::method_push(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (Instance *instance = Instance::get(self, classInfo)) { - uint pos = instance->value.size(); - for (int i = 0; i < context->argumentCount(); ++i) { - QScriptValueImpl val = context->argument(i); - if (pos == 0xFFFFFFFF) { - self.setProperty(pos++, val); - self.setProperty(eng->idTable()->id_length, 0); - } else { - instance->value.assign(pos++, val); - } - } - return QScriptValueImpl(pos); - } - - QScriptNameIdImpl *id_length = eng->idTable()->id_length; - QScriptValueImpl r1 = self.property(id_length); - quint32 n = r1.toUInt32(); - for (int index = 0; index < context->argumentCount(); ++index, ++n) { - QScriptValueImpl r3 = context->argument(index); - QScriptNameIdImpl *name = eng->nameId(QScriptValueImpl(n).toString()); - self.setProperty(name, r3); - } - QScriptValueImpl r(n); - self.setProperty(id_length, r); - return r; -} - -QScriptValueImpl Array::method_reverse(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (Instance *instance = Instance::get(self, classInfo)) { - int lo = 0, hi = instance->value.count () - 1; - - for (; lo < hi; ++lo, --hi) { - QScriptValueImpl tmp = instance->value.at(lo); - instance->value.assign(lo, instance->value.at(hi)); - instance->value.assign(hi, tmp); - } - - } else { - QScriptNameIdImpl *id_length = eng->idTable()->id_length; - - QScriptValueImpl lengthValue = self.property(id_length); - quint32 length = 0; - if (lengthValue.isValid()) - length = QScriptEnginePrivate::toUint32(lengthValue.toNumber()); - const quint32 m = length / 2; - for (quint32 i = 0; i < m; ++i) { - quint32 j = length - i - 1; - - QScriptNameIdImpl *iid = eng->nameId(QScriptValueImpl(i).toString()); - QScriptNameIdImpl *jid = eng->nameId(QScriptValueImpl(j).toString()); - - QScript::Member imember; - QScriptValueImpl ibase; - QScriptValueImpl ival; - bool iok = self.resolve(iid, &imember, &ibase, QScriptValue::ResolvePrototype, QScript::ReadWrite); - if (iok) - ibase.get(iid, &ival); - else - ival = eng->undefinedValue(); - - QScript::Member jmember; - QScriptValueImpl jbase; - QScriptValueImpl jval; - bool jok = self.resolve(jid, &jmember, &jbase, QScriptValue::ResolvePrototype, QScript::ReadWrite); - if (jok) - jbase.get(jid, &jval); - else - jval = eng->undefinedValue(); - - if (!jok) { - if (iok) { - if (eng->strictlyEquals(ibase, self)) - ibase.removeMember(imember); - self.setProperty(jid, ival); - } - } else if (!iok) { - self.setProperty(iid, jval); - if (eng->strictlyEquals(jbase, self)) - jbase.removeMember(jmember); - } else { - if (eng->strictlyEquals(self, ibase)) - self.put(imember, jval); - else - self.setProperty(iid, jval); - if (eng->strictlyEquals(self, jbase)) - self.put(jmember, ival); - else - self.setProperty(jid, ival); - } - } - } - - return context->thisObject(); -} - -QScriptValueImpl Array::method_shift(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *) -{ - QScriptNameIdImpl *id_length = eng->idTable()->id_length; - - QScriptValueImpl self = context->thisObject(); - quint32 length = self.property(id_length).toUInt32(); - if (length == 0) { - self.setProperty(id_length, QScriptValueImpl(0)); - return eng->undefinedValue(); - } - - QScript::Member member; - QScriptValueImpl base; - - QScriptValueImpl result = self.property(QLatin1String("0")); - if (! result.isValid()) - result = eng->undefinedValue(); - - for (quint32 index = 1; index < length; ++index) { - QScriptNameIdImpl *k = eng->nameId(QScriptValueImpl(index).toString()); - QScriptNameIdImpl *k1 = eng->nameId(QScriptValueImpl(index - 1).toString()); - - QScriptValueImpl v = self.property(k); - QScriptValueImpl v1 = self.property(k1); - - if (v.isValid()) - self.setProperty(k1, v); - - else if (v1.isValid() && self.resolve(k1, &member, &base, QScriptValue::ResolveLocal, QScript::ReadWrite)) - self.removeMember(member); - } - - QScriptValueImpl len = QScriptValueImpl(length - 1); - - if (self.resolve(eng->nameId(len.toString()), &member, &base, QScriptValue::ResolveLocal, QScript::ReadWrite)) - self.removeMember(member); - - self.setProperty(id_length, len); - return (result); -} - -QScriptValueImpl Array::method_slice(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *) -{ - QScript::Array result(eng); - - QScriptValueImpl start = context->argument(0); - QScriptValueImpl end = context->argument(1); - - QScriptValueImpl self = context->thisObject(); - QScriptNameIdImpl *id_length = eng->idTable()->id_length; - qsreal r2 = self.property(id_length).toNumber(); - quint32 r3 = QScriptEnginePrivate::toUint32(r2); - qint32 r4 = qint32 (start.toInteger()); - quint32 r5 = r4 < 0 ? qMax(quint32(r3 + r4), quint32(0)) : qMin(quint32(r4), r3); - quint32 k = r5; - qint32 r7 = end.isUndefined() ? r3 : qint32 (end.toInteger()); - quint32 r8 = r7 < 0 ? qMax(quint32(r3 + r7), quint32(0)) : qMin(quint32(r7), r3); - quint32 n = 0; - for (; k < r8; ++k) { - QString r11 = QScriptValueImpl(k).toString(); - QScriptValueImpl v = self.property(r11); - if (v.isValid()) - result.assign(n++, v); - } - return eng->newArray(result); -} - -QScriptValueImpl Array::method_sort(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - QScriptValueImpl comparefn = context->argument(0); - if (Instance *instance = Instance::get(self, classInfo)) { - instance->value.sort(comparefn); - return context->thisObject(); - } - return context->throwNotImplemented(QLatin1String("Array.prototype.sort")); -} - -QScriptValueImpl Array::method_splice(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo) -{ - if (context->argumentCount() < 2) - return eng->undefinedValue(); - - QScriptValueImpl self = context->thisObject(); - - qsreal start = context->argument(0).toInteger(); - qsreal deleteCount = context->argument(1).toInteger(); - - QScriptValueImpl arrayCtor = eng->globalObject().property(QLatin1String("Array")); - QScriptValueImpl a = arrayCtor.construct(); - - if (Instance *instance = Instance::get(self, classInfo)) { - QVector<QScriptValueImpl> items; - for (int i = 2; i < context->argumentCount(); ++i) - items << context->argument(i); - Instance *otherInstance = Instance::get(a, classInfo); - Q_ASSERT(otherInstance); - instance->value.splice(start, deleteCount, items, otherInstance->value); - return a; - } - - return context->throwNotImplemented(QLatin1String("Array.prototype.splice")); -} - -QScriptValueImpl Array::method_unshift(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *) -{ - QScriptValueImpl self = context->thisObject(); - - QScriptNameIdImpl *id_length = eng->idTable()->id_length; - QScriptValueImpl r1 = self.property(id_length); - quint32 r2 = r1.isValid() ? QScriptEnginePrivate::toUint32(r1.toNumber()) : 0; - quint32 r3 = quint32 (context->argumentCount()); - quint32 k = r2; - for (; k != 0; --k) { - QScriptNameIdImpl *r6 = eng->nameId(QScriptValueImpl(k - 1).toString()); - QScriptNameIdImpl *r7 = eng->nameId(QScriptValueImpl(k + r3 - 1).toString()); - QScriptValueImpl r8 = self.property(r6); - if (r8.isValid()) - self.setProperty(r7, r8); - - else { - QScript::Member member; - QScriptValueImpl base; - - if (self.resolve(r7, &member, &base, QScriptValue::ResolveLocal, QScript::ReadWrite)) - self.removeMember(member); - } - } - - for (k = 0; k < r3; ++k) { - QScriptValueImpl r16 = context->argument(k); - QScriptNameIdImpl *r17 = eng->nameId(QScriptValueImpl(k).toString()); - self.setProperty(r17, r16); - } - QScriptValueImpl r(r2 + r3); - self.setProperty(id_length, r); - return (r); -} - -Array::Instance *Array::Instance::get(const QScriptValueImpl &object, QScriptClassInfo *klass) -{ - if (! klass || klass == object.classInfo()) - return static_cast<Instance*> (object.objectData()); - - return 0; -} - -} } // namespace QScript::Ecma - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT diff --git a/src/script/qscriptecmaarray_p.h b/src/script/qscriptecmaarray_p.h deleted file mode 100644 index 7230a92..0000000 --- a/src/script/qscriptecmaarray_p.h +++ /dev/null @@ -1,141 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTECMAARRAY_P_H -#define QSCRIPTECMAARRAY_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 "qscriptarray_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptecmacore_p.h" - -QT_BEGIN_NAMESPACE - -namespace QScript { namespace Ecma { - -class Array: public Core -{ -public: - Array(QScriptEnginePrivate *engine); - virtual ~Array(); - - virtual void execute(QScriptContextPrivate *context); - - class Instance: public QScriptObjectData { - public: - Instance(QScriptEnginePrivate *engine) - : value(QScript::Array(engine)) {} - virtual ~Instance() {} - - static Instance *get(const QScriptValueImpl &object, - QScriptClassInfo *klass); - - public: // attributes - QScript::Array value; - }; - - inline Instance *get(const QScriptValueImpl &object) const - { return Instance::get(object, classInfo()); } - - void newArray(QScriptValueImpl *result, - const QScript::Array &value); - -protected: - static QScriptValueImpl method_toString(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_toLocaleString(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_concat(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_join(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_pop(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_push(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_reverse(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_shift(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_slice(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_sort(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_splice(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_unshift(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - -private: - void initArray(QScriptValueImpl *result, const QScript::Array &value); -}; - -} } // namespace QScript::Ecma - -#endif // QT_NO_SCRIPT - -QT_END_NAMESPACE - -#endif diff --git a/src/script/qscriptecmaboolean.cpp b/src/script/qscriptecmaboolean.cpp deleted file mode 100644 index 08cad66..0000000 --- a/src/script/qscriptecmaboolean.cpp +++ /dev/null @@ -1,137 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qscriptecmaboolean_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" - -#include <QtCore/QtDebug> - -QT_BEGIN_NAMESPACE - -namespace QScript { namespace Ecma { - -Boolean::Boolean(QScriptEnginePrivate *eng): - Core(eng, QLatin1String("Boolean"), QScriptClassInfo::BooleanType) -{ - newBoolean(&publicPrototype, false); - - eng->newConstructor(&ctor, this, publicPrototype); - - addPrototypeFunction(QLatin1String("toString"), method_toString, 0); - addPrototypeFunction(QLatin1String("valueOf"), method_valueOf, 0); -} - -Boolean::~Boolean() -{ -} - -void Boolean::execute(QScriptContextPrivate *context) -{ -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - engine()->notifyFunctionEntry(context); -#endif - bool value; - if (context->argumentCount() > 0) - value = context->argument(0).toBoolean(); - else - value = false; - - QScriptValueImpl boolean(value); - if (!context->isCalledAsConstructor()) { - context->setReturnValue(boolean); - } else { - QScriptValueImpl &obj = context->m_thisObject; - obj.setClassInfo(classInfo()); - obj.setInternalValue(boolean); - obj.setPrototype(publicPrototype); - context->setReturnValue(obj); - } -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - engine()->notifyFunctionExit(context); -#endif -} - -void Boolean::newBoolean(QScriptValueImpl *result, bool value) -{ - engine()->newObject(result, publicPrototype, classInfo()); - result->setInternalValue(QScriptValueImpl(value)); -} - -QScriptValueImpl Boolean::method_toString(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() != classInfo) { - return throwThisObjectTypeError( - context, QLatin1String("Boolean.prototype.toString")); - } - const QScript::IdTable *t = eng->idTable(); - bool v = self.internalValue().toBoolean(); - QScriptValueImpl result; - eng->newNameId(&result, v ? t->id_true : t->id_false); - return result; -} - -QScriptValueImpl Boolean::method_valueOf(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() != classInfo) { - return throwThisObjectTypeError( - context, QLatin1String("Boolean.prototype.valueOf")); - } - return self.internalValue(); -} - -} } // namespace QScript::Ecma - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT diff --git a/src/script/qscriptecmaboolean_p.h b/src/script/qscriptecmaboolean_p.h deleted file mode 100644 index 4dbaa27..0000000 --- a/src/script/qscriptecmaboolean_p.h +++ /dev/null @@ -1,89 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTECMABOOLEAN_P_H -#define QSCRIPTECMABOOLEAN_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 "qscriptecmacore_p.h" - -QT_BEGIN_NAMESPACE - -#ifndef QT_NO_SCRIPT - -namespace QScript { namespace Ecma { - -class Boolean: public Core -{ -public: - Boolean(QScriptEnginePrivate *engine); - virtual ~Boolean(); - - virtual void execute(QScriptContextPrivate *context); - - void newBoolean(QScriptValueImpl *result, bool value = false); - -protected: - static QScriptValueImpl method_toString(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_valueOf(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); -}; - -} } // namespace QScript::Ecma - -#endif // QT_NO_SCRIPT - -QT_END_NAMESPACE - -#endif diff --git a/src/script/qscriptecmacore.cpp b/src/script/qscriptecmacore.cpp deleted file mode 100644 index ed0fce1..0000000 --- a/src/script/qscriptecmacore.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qscriptecmacore_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" - -QT_BEGIN_NAMESPACE - -namespace QScript { namespace Ecma { - -Core::Core(QScriptEnginePrivate *engine, const QString &className, - QScriptClassInfo::Type type) - : m_engine(engine) -{ - m_classInfo = engine->registerClass(className, type); - this->length = 1; -} - -Core::Core(QScriptEnginePrivate *engine, QScriptClassInfo *classInfo) - : m_engine(engine), m_classInfo(classInfo) -{ - this->length = 1; -} - -Core::~Core() -{ -} - -void Core::addPrototypeFunction(const QString &name, QScriptInternalFunctionSignature fun, - int length, const QScriptValue::PropertyFlags flags) -{ - addFunction(publicPrototype, name, fun, length, flags); -} - -void Core::addConstructorFunction(const QString &name, QScriptInternalFunctionSignature fun, - int length, const QScriptValue::PropertyFlags flags) -{ - addFunction(ctor, name, fun, length, flags); -} - -void Core::addFunction(QScriptValueImpl &object, const QString &name, - QScriptInternalFunctionSignature fun, int length, - const QScriptValue::PropertyFlags flags) -{ - QScriptValueImpl val = engine()->createFunction(fun, length, m_classInfo, name); - object.setProperty(name, val, flags); -} - -QString Core::functionName() const -{ - return m_classInfo->name(); -} - -void Core::mark(QScriptEnginePrivate *eng, int generation) -{ - QScriptFunction::mark(eng, generation); - eng->markObject(ctor, generation); - eng->markObject(publicPrototype, generation); -} - -QScriptValueImpl Core::throwThisObjectTypeError(QScriptContextPrivate *context, - const QString &functionName) -{ - return context->throwError(QScriptContext::TypeError, - QString::fromLatin1("%0 called on incompatible object") - .arg(functionName)); -} - -} // namespace Ecma - -} // namespace QScript - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT diff --git a/src/script/qscriptecmacore_p.h b/src/script/qscriptecmacore_p.h deleted file mode 100644 index b4c1780..0000000 --- a/src/script/qscriptecmacore_p.h +++ /dev/null @@ -1,115 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTECMACORE_P_H -#define QSCRIPTECMACORE_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 "qscriptfunction_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptvalueimplfwd_p.h" -#include "qscriptclassinfo_p.h" - -QT_BEGIN_NAMESPACE - -namespace QScript { namespace Ecma { - -class Core: public QScriptFunction -{ -public: - Core(QScriptEnginePrivate *engine, const QString &className, - QScriptClassInfo::Type type); - Core(QScriptEnginePrivate *engine, QScriptClassInfo *classInfo); - virtual ~Core(); - - inline QScriptEnginePrivate *engine() const - { return m_engine; } - - inline QScriptClassInfo *classInfo() const - { return m_classInfo; } - - void addPrototypeFunction( - const QString &name, QScriptInternalFunctionSignature fun, int length, - const QScriptValue::PropertyFlags flags = QScriptValue::SkipInEnumeration); - void addConstructorFunction( - const QString &name, QScriptInternalFunctionSignature fun, int length, - const QScriptValue::PropertyFlags flags = QScriptValue::SkipInEnumeration); - - QString functionName() const; - - virtual void mark(QScriptEnginePrivate *eng, int generation); - -public: // attributes - QScriptValueImpl ctor; - QScriptValueImpl publicPrototype; - -protected: - static QScriptValueImpl throwThisObjectTypeError( - QScriptContextPrivate *context, const QString &functionName); - -private: - void addFunction(QScriptValueImpl &object, const QString &name, - QScriptInternalFunctionSignature fun, int length, - const QScriptValue::PropertyFlags flags); - - QScriptEnginePrivate *m_engine; - QScriptClassInfo *m_classInfo; -}; - -} } // namespace QScript::Ecma - -#endif // QT_NO_SCRIPT - -QT_END_NAMESPACE - -#endif diff --git a/src/script/qscriptecmadate.cpp b/src/script/qscriptecmadate.cpp deleted file mode 100644 index cc80383..0000000 --- a/src/script/qscriptecmadate.cpp +++ /dev/null @@ -1,1281 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qscriptecmadate_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" - -#include <QtCore/QDateTime> -#include <QtCore/QRegExp> -#include <QtCore/QtDebug> -#include <QtCore/QLocale> -#include <QtCore/qnumeric.h> - -#include <math.h> - -#ifndef Q_WS_WIN -# include <time.h> -# include <sys/time.h> -#else -# include <windows.h> -#endif - -QT_BEGIN_NAMESPACE - -namespace QScript { - -static const qsreal HoursPerDay = 24.0; -static const qsreal MinutesPerHour = 60.0; -static const qsreal SecondsPerMinute = 60.0; -static const qsreal msPerSecond = 1000.0; -static const qsreal msPerMinute = 60000.0; -static const qsreal msPerHour = 3600000.0; -static const qsreal msPerDay = 86400000.0; - -static qsreal LocalTZA = 0.0; // initialized at startup - -static inline qsreal TimeWithinDay(qsreal t) -{ - qsreal r = ::fmod(t, msPerDay); - return (r >= 0) ? r : r + msPerDay; -} - -static inline int HourFromTime(qsreal t) -{ - int r = int(::fmod(::floor(t / msPerHour), HoursPerDay)); - return (r >= 0) ? r : r + int(HoursPerDay); -} - -static inline int MinFromTime(qsreal t) -{ - int r = int(::fmod(::floor(t / msPerMinute), MinutesPerHour)); - return (r >= 0) ? r : r + int(MinutesPerHour); -} - -static inline int SecFromTime(qsreal t) -{ - int r = int(::fmod(::floor(t / msPerSecond), SecondsPerMinute)); - return (r >= 0) ? r : r + int(SecondsPerMinute); -} - -static inline int msFromTime(qsreal t) -{ - int r = int(::fmod(t, msPerSecond)); - return (r >= 0) ? r : r + int(msPerSecond); -} - -static inline qsreal Day(qsreal t) -{ - return ::floor(t / msPerDay); -} - -static inline qsreal DaysInYear(qsreal y) -{ - if (::fmod(y, 4)) - return 365; - - else if (::fmod(y, 100)) - return 366; - - else if (::fmod(y, 400)) - return 365; - - return 366; -} - -static inline qsreal DayFromYear(qsreal y) -{ - return 365 * (y - 1970) - + ::floor((y - 1969) / 4) - - ::floor((y - 1901) / 100) - + ::floor((y - 1601) / 400); -} - -static inline qsreal TimeFromYear(qsreal y) -{ - return msPerDay * DayFromYear(y); -} - -static inline qsreal YearFromTime(qsreal t) -{ - int y = 1970; - y += (int) ::floor(t / (msPerDay * 365.2425)); - - qsreal t2 = TimeFromYear(y); - return (t2 > t) ? y - 1 : ((t2 + msPerDay * DaysInYear(y)) <= t) ? y + 1 : y; -} - -static inline bool InLeapYear(qsreal t) -{ - qsreal x = DaysInYear(YearFromTime(t)); - if (x == 365) - return 0; - - Q_ASSERT (x == 366); - return 1; -} - -static inline qsreal DayWithinYear(qsreal t) -{ - return Day(t) - DayFromYear(YearFromTime(t)); -} - -static inline qsreal MonthFromTime(qsreal t) -{ - qsreal d = DayWithinYear(t); - qsreal l = InLeapYear(t); - - if (d < 31.0) - return 0; - - else if (d < 59.0 + l) - return 1; - - else if (d < 90.0 + l) - return 2; - - else if (d < 120.0 + l) - return 3; - - else if (d < 151.0 + l) - return 4; - - else if (d < 181.0 + l) - return 5; - - else if (d < 212.0 + l) - return 6; - - else if (d < 243.0 + l) - return 7; - - else if (d < 273.0 + l) - return 8; - - else if (d < 304.0 + l) - return 9; - - else if (d < 334.0 + l) - return 10; - - else if (d < 365.0 + l) - return 11; - - return qSNaN(); // ### assert? -} - -static inline qsreal DateFromTime(qsreal t) -{ - int m = (int) QScriptEnginePrivate::toInteger(MonthFromTime(t)); - qsreal d = DayWithinYear(t); - qsreal l = InLeapYear(t); - - switch (m) { - case 0: return d + 1.0; - case 1: return d - 30.0; - case 2: return d - 58.0 - l; - case 3: return d - 89.0 - l; - case 4: return d - 119.0 - l; - case 5: return d - 150.0 - l; - case 6: return d - 180.0 - l; - case 7: return d - 211.0 - l; - case 8: return d - 242.0 - l; - case 9: return d - 272.0 - l; - case 10: return d - 303.0 - l; - case 11: return d - 333.0 - l; - } - - return qSNaN(); // ### assert -} - -static inline qsreal WeekDay(qsreal t) -{ - qsreal r = ::fmod (Day(t) + 4.0, 7.0); - return (r >= 0) ? r : r + 7.0; -} - - -static inline qsreal MakeTime(qsreal hour, qsreal min, qsreal sec, qsreal ms) -{ - return ((hour * MinutesPerHour + min) * SecondsPerMinute + sec) * msPerSecond + ms; -} - -static inline qsreal DayFromMonth(qsreal month, qsreal leap) -{ - switch ((int) month) { - case 0: return 0; - case 1: return 31.0; - case 2: return 59.0 + leap; - case 3: return 90.0 + leap; - case 4: return 120.0 + leap; - case 5: return 151.0 + leap; - case 6: return 181.0 + leap; - case 7: return 212.0 + leap; - case 8: return 243.0 + leap; - case 9: return 273.0 + leap; - case 10: return 304.0 + leap; - case 11: return 334.0 + leap; - } - - return qSNaN(); // ### assert? -} - -static qsreal MakeDay(qsreal year, qsreal month, qsreal day) -{ - year += ::floor(month / 12.0); - - month = ::fmod(month, 12.0); - if (month < 0) - month += 12.0; - - qsreal t = TimeFromYear(year); - qsreal leap = InLeapYear(t); - - day += ::floor(t / msPerDay); - day += DayFromMonth(month, leap); - - return day - 1; -} - -static inline qsreal MakeDate(qsreal day, qsreal time) -{ - return day * msPerDay + time; -} - -static inline qsreal DaylightSavingTA(double t) -{ -#ifndef Q_WS_WIN - long int tt = (long int)(t / msPerSecond); - struct tm *tmtm = localtime((const time_t*)&tt); - if (! tmtm) - return 0; - return (tmtm->tm_isdst > 0) ? msPerHour : 0; -#else - Q_UNUSED(t); - /// ### implement me - return 0; -#endif -} - -static inline qsreal LocalTime(qsreal t) -{ - return t + LocalTZA + DaylightSavingTA(t); -} - -static inline qsreal UTC(qsreal t) -{ - return t - LocalTZA - DaylightSavingTA(t - LocalTZA); -} - -static inline qsreal currentTime() -{ -#ifndef Q_WS_WIN - struct timeval tv; - - gettimeofday(&tv, 0); - return ::floor(tv.tv_sec * msPerSecond + (tv.tv_usec / 1000.0)); -#else - SYSTEMTIME st; - GetSystemTime(&st); - FILETIME ft; - SystemTimeToFileTime(&st, &ft); - LARGE_INTEGER li; - li.LowPart = ft.dwLowDateTime; - li.HighPart = ft.dwHighDateTime; - return double(li.QuadPart - Q_INT64_C(116444736000000000)) / 10000.0; -#endif -} - -static inline qsreal TimeClip(qsreal t) -{ - if (! qIsFinite(t) || fabs(t) > 8.64e15) - return qSNaN(); - return QScriptEnginePrivate::toInteger(t); -} - -static inline qsreal FromDateTime(const QDateTime &dt) -{ - if (!dt.isValid()) - return qSNaN(); - QDate date = dt.date(); - QTime taim = dt.time(); - int year = date.year(); - int month = date.month() - 1; - int day = date.day(); - int hours = taim.hour(); - int mins = taim.minute(); - int secs = taim.second(); - int ms = taim.msec(); - double t = MakeDate(MakeDay(year, month, day), - MakeTime(hours, mins, secs, ms)); - if (dt.timeSpec() == Qt::LocalTime) - t = UTC(t); - return TimeClip(t); -} - -static inline qsreal ParseString(const QString &s) -{ - QDateTime dt = QDateTime::fromString(s, Qt::TextDate); - if (!dt.isValid()) - dt = QDateTime::fromString(s, Qt::ISODate); - if (!dt.isValid()) { - QStringList formats; - formats << QLatin1String("M/d/yyyy") - << QLatin1String("M/d/yyyy hh:mm") - << QLatin1String("M/d/yyyy hh:mm A") - - << QLatin1String("M/d/yyyy, hh:mm") - << QLatin1String("M/d/yyyy, hh:mm A") - - << QLatin1String("MMM d yyyy") - << QLatin1String("MMM d yyyy hh:mm") - << QLatin1String("MMM d yyyy hh:mm:ss") - << QLatin1String("MMM d yyyy, hh:mm") - << QLatin1String("MMM d yyyy, hh:mm:ss") - - << QLatin1String("MMMM d yyyy") - << QLatin1String("MMMM d yyyy hh:mm") - << QLatin1String("MMMM d yyyy hh:mm:ss") - << QLatin1String("MMMM d yyyy, hh:mm") - << QLatin1String("MMMM d yyyy, hh:mm:ss") - - << QLatin1String("MMM d, yyyy") - << QLatin1String("MMM d, yyyy hh:mm") - << QLatin1String("MMM d, yyyy hh:mm:ss") - - << QLatin1String("MMMM d, yyyy") - << QLatin1String("MMMM d, yyyy hh:mm") - << QLatin1String("MMMM d, yyyy hh:mm:ss") - - << QLatin1String("d MMM yyyy") - << QLatin1String("d MMM yyyy hh:mm") - << QLatin1String("d MMM yyyy hh:mm:ss") - << QLatin1String("d MMM yyyy, hh:mm") - << QLatin1String("d MMM yyyy, hh:mm:ss") - - << QLatin1String("d MMMM yyyy") - << QLatin1String("d MMMM yyyy hh:mm") - << QLatin1String("d MMMM yyyy hh:mm:ss") - << QLatin1String("d MMMM yyyy, hh:mm") - << QLatin1String("d MMMM yyyy, hh:mm:ss") - - << QLatin1String("d MMM, yyyy") - << QLatin1String("d MMM, yyyy hh:mm") - << QLatin1String("d MMM, yyyy hh:mm:ss") - - << QLatin1String("d MMMM, yyyy") - << QLatin1String("d MMMM, yyyy hh:mm") - << QLatin1String("d MMMM, yyyy hh:mm:ss"); - - for (int i = 0; i < formats.size(); ++i) { - dt = QDateTime::fromString(s, formats.at(i)); - if (dt.isValid()) - break; - } - } - return FromDateTime(dt); -} - -/*! - \internal - - Converts the ECMA Date value \tt (in UTC form) to QDateTime - according to \a spec. -*/ -static inline QDateTime ToDateTime(qsreal t, Qt::TimeSpec spec) -{ - if (qIsNaN(t)) - return QDateTime(); - if (spec == Qt::LocalTime) - t = LocalTime(t); - int year = int(YearFromTime(t)); - int month = int(MonthFromTime(t) + 1); - int day = int(DateFromTime(t)); - int hours = HourFromTime(t); - int mins = MinFromTime(t); - int secs = SecFromTime(t); - int ms = msFromTime(t); - return QDateTime(QDate(year, month, day), QTime(hours, mins, secs, ms), spec); -} - -static inline QString ToString(qsreal t) -{ - if (qIsNaN(t)) - return QLatin1String("Invalid Date"); - QString str = ToDateTime(t, Qt::LocalTime).toString() + QLatin1String(" GMT"); - qsreal tzoffset = LocalTZA + DaylightSavingTA(t); - if (tzoffset) { - int hours = static_cast<int>(::fabs(tzoffset) / 1000 / 60 / 60); - int mins = int(::fabs(tzoffset) / 1000 / 60) % 60; - str.append(QLatin1Char((tzoffset > 0) ? '+' : '-')); - if (hours < 10) - str.append(QLatin1Char('0')); - str.append(QString::number(hours)); - if (mins < 10) - str.append(QLatin1Char('0')); - str.append(QString::number(mins)); - } - return str; -} - -static inline QString ToUTCString(qsreal t) -{ - if (qIsNaN(t)) - return QLatin1String("Invalid Date"); - return ToDateTime(t, Qt::UTC).toString() + QLatin1String(" GMT"); -} - -static inline QString ToDateString(qsreal t) -{ - return ToDateTime(t, Qt::LocalTime).date().toString(); -} - -static inline QString ToTimeString(qsreal t) -{ - return ToDateTime(t, Qt::LocalTime).time().toString(); -} - -static inline QString ToLocaleString(qsreal t) -{ - return ToDateTime(t, Qt::LocalTime).toString(Qt::LocaleDate); -} - -static inline QString ToLocaleDateString(qsreal t) -{ - return ToDateTime(t, Qt::LocalTime).date().toString(Qt::LocaleDate); -} - -static inline QString ToLocaleTimeString(qsreal t) -{ - return ToDateTime(t, Qt::LocalTime).time().toString(Qt::LocaleDate); -} - -static qsreal getLocalTZA() -{ -#ifndef Q_WS_WIN - struct tm* t; - time_t curr; - time(&curr); - t = localtime(&curr); - time_t locl = mktime(t); - t = gmtime(&curr); - time_t globl = mktime(t); - return double(locl - globl) * 1000.0; -#else - TIME_ZONE_INFORMATION tzInfo; - GetTimeZoneInformation(&tzInfo); - return -tzInfo.Bias * 60.0 * 1000.0; -#endif -} - -namespace Ecma { - -Date::Date(QScriptEnginePrivate *eng): - Core(eng, QLatin1String("Date"), QScriptClassInfo::DateType) -{ - LocalTZA = getLocalTZA(); - - newDate(&publicPrototype, qSNaN()); - - eng->newConstructor(&ctor, this, publicPrototype); - addConstructorFunction(QLatin1String("parse"), method_parse, 1); - addConstructorFunction(QLatin1String("UTC"), method_UTC, 7); - - addPrototypeFunction(QLatin1String("toString"), method_toString, 0); - addPrototypeFunction(QLatin1String("toDateString"), method_toDateString, 0); - addPrototypeFunction(QLatin1String("toTimeString"), method_toTimeString, 0); - addPrototypeFunction(QLatin1String("toLocaleString"), method_toLocaleString, 0); - addPrototypeFunction(QLatin1String("toLocaleDateString"), method_toLocaleDateString, 0); - addPrototypeFunction(QLatin1String("toLocaleTimeString"), method_toLocaleTimeString, 0); - addPrototypeFunction(QLatin1String("valueOf"), method_valueOf, 0); - addPrototypeFunction(QLatin1String("getTime"), method_getTime, 0); - addPrototypeFunction(QLatin1String("getYear"), method_getYear, 0); - addPrototypeFunction(QLatin1String("getFullYear"), method_getFullYear, 0); - addPrototypeFunction(QLatin1String("getUTCFullYear"), method_getUTCFullYear, 0); - addPrototypeFunction(QLatin1String("getMonth"), method_getMonth, 0); - addPrototypeFunction(QLatin1String("getUTCMonth"), method_getUTCMonth, 0); - addPrototypeFunction(QLatin1String("getDate"), method_getDate, 0); - addPrototypeFunction(QLatin1String("getUTCDate"), method_getUTCDate, 0); - addPrototypeFunction(QLatin1String("getDay"), method_getDay, 0); - addPrototypeFunction(QLatin1String("getUTCDay"), method_getUTCDay, 0); - addPrototypeFunction(QLatin1String("getHours"), method_getHours, 0); - addPrototypeFunction(QLatin1String("getUTCHours"), method_getUTCHours, 0); - addPrototypeFunction(QLatin1String("getMinutes"), method_getMinutes, 0); - addPrototypeFunction(QLatin1String("getUTCMinutes"), method_getUTCMinutes, 0); - addPrototypeFunction(QLatin1String("getSeconds"), method_getSeconds, 0); - addPrototypeFunction(QLatin1String("getUTCSeconds"), method_getUTCSeconds, 0); - addPrototypeFunction(QLatin1String("getMilliseconds"), method_getMilliseconds, 0); - addPrototypeFunction(QLatin1String("getUTCMilliseconds"), method_getUTCMilliseconds, 0); - addPrototypeFunction(QLatin1String("getTimezoneOffset"), method_getTimezoneOffset, 0); - addPrototypeFunction(QLatin1String("setTime"), method_setTime, 1); - addPrototypeFunction(QLatin1String("setMilliseconds"), method_setMilliseconds, 1); - addPrototypeFunction(QLatin1String("setUTCMilliseconds"), method_setUTCMilliseconds, 1); - addPrototypeFunction(QLatin1String("setSeconds"), method_setSeconds, 2); - addPrototypeFunction(QLatin1String("setUTCSeconds"), method_setUTCSeconds, 2); - addPrototypeFunction(QLatin1String("setMinutes"), method_setMinutes, 3); - addPrototypeFunction(QLatin1String("setUTCMinutes"), method_setUTCMinutes, 3); - addPrototypeFunction(QLatin1String("setHours"), method_setHours, 4); - addPrototypeFunction(QLatin1String("setUTCHours"), method_setUTCHours, 4); - addPrototypeFunction(QLatin1String("setDate"), method_setDate, 1); - addPrototypeFunction(QLatin1String("setUTCDate"), method_setUTCDate, 1); - addPrototypeFunction(QLatin1String("setMonth"), method_setMonth, 2); - addPrototypeFunction(QLatin1String("setUTCMonth"), method_setUTCMonth, 2); - addPrototypeFunction(QLatin1String("setYear"), method_setYear, 1); - addPrototypeFunction(QLatin1String("setFullYear"), method_setFullYear, 3); - addPrototypeFunction(QLatin1String("setUTCFullYear"), method_setUTCFullYear, 3); - addPrototypeFunction(QLatin1String("toUTCString"), method_toUTCString, 0); - addPrototypeFunction(QLatin1String("toGMTString"), method_toUTCString, 0); -} - -Date::~Date() -{ -} - -void Date::execute(QScriptContextPrivate *context) -{ -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - engine()->notifyFunctionEntry(context); -#endif - if (!context->isCalledAsConstructor()) { - double t = currentTime(); - context->setReturnValue(QScriptValueImpl(engine(), ToString(t))); - } else { - // called as constructor - qsreal t; - - if (context->argumentCount() == 0) - t = currentTime(); - - else if (context->argumentCount() == 1) { - QScriptValueImpl arg = context->argument(0); - if (arg.isDate()) - arg = arg.internalValue(); - else - arg = engine()->toPrimitive(arg); - if (arg.isString()) - t = ParseString(arg.toString()); - else - t = TimeClip(arg.toNumber()); - } - - else { // context->argumentCount() > 1 - qsreal year = context->argument(0).toNumber(); - qsreal month = context->argument(1).toNumber(); - qsreal day = context->argumentCount() >= 3 ? context->argument(2).toNumber() : 1; - qsreal hours = context->argumentCount() >= 4 ? context->argument(3).toNumber() : 0; - qsreal mins = context->argumentCount() >= 5 ? context->argument(4).toNumber() : 0; - qsreal secs = context->argumentCount() >= 6 ? context->argument(5).toNumber() : 0; - qsreal ms = context->argumentCount() >= 7 ? context->argument(6).toNumber() : 0; - if (year >= 0 && year <= 99) - year += 1900; - t = MakeDate(MakeDay(year, month, day), MakeTime(hours, mins, secs, ms)); - t = TimeClip(UTC(t)); - } - - QScriptValueImpl &obj = context->m_thisObject; - obj.setClassInfo(classInfo()); - obj.setInternalValue(QScriptValueImpl(t)); - obj.setPrototype(publicPrototype); - context->setReturnValue(obj); - } -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - engine()->notifyFunctionExit(context); -#endif -} - -void Date::newDate(QScriptValueImpl *result, qsreal t) -{ - engine()->newObject(result, publicPrototype, classInfo()); - result->setInternalValue(QScriptValueImpl(t)); -} - -void Date::newDate(QScriptValueImpl *result, const QDateTime &dt) -{ - newDate(result, FromDateTime(dt)); -} - -void Date::newDate(QScriptValueImpl *result, const QDate &d) -{ - newDate(result, QDateTime(d)); -} - -QDateTime Date::toDateTime(const QScriptValueImpl &date) const -{ - Q_ASSERT(date.classInfo() == classInfo()); - qsreal t = date.internalValue().toNumber(); - return ToDateTime(t, Qt::LocalTime); -} - -QScriptValueImpl Date::method_parse(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *) -{ - return QScriptValueImpl(ParseString(context->argument(0).toString())); -} - -QScriptValueImpl Date::method_UTC(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - const int numArgs = context->argumentCount(); - if (numArgs >= 2) { - qsreal year = context->argument(0).toNumber(); - qsreal month = context->argument(1).toNumber(); - qsreal day = numArgs >= 3 ? context->argument(2).toNumber() : 1; - qsreal hours = numArgs >= 4 ? context->argument(3).toNumber() : 0; - qsreal mins = numArgs >= 5 ? context->argument(4).toNumber() : 0; - qsreal secs = numArgs >= 6 ? context->argument(5).toNumber() : 0; - qsreal ms = numArgs >= 7 ? context->argument(6).toNumber() : 0; - if (year >= 0 && year <= 99) - year += 1900; - qsreal t = MakeDate(MakeDay(year, month, day), - MakeTime(hours, mins, secs, ms)); - return QScriptValueImpl(TimeClip(t)); - } - return (eng->undefinedValue()); -} - -QScriptValueImpl Date::method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - return QScriptValueImpl(eng, ToString(t)); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.toString")); -} - -QScriptValueImpl Date::method_toDateString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - return QScriptValueImpl(eng, ToDateString(t)); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.toDateString")); -} - -QScriptValueImpl Date::method_toTimeString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - return QScriptValueImpl(eng, ToTimeString(t)); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.toTimeString")); -} - -QScriptValueImpl Date::method_toLocaleString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - return QScriptValueImpl(eng, ToLocaleString(t)); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.toLocaleString")); -} - -QScriptValueImpl Date::method_toLocaleDateString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - return QScriptValueImpl(eng, ToLocaleDateString(t)); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.toLocaleDateString")); -} - -QScriptValueImpl Date::method_toLocaleTimeString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - return QScriptValueImpl(eng, ToLocaleTimeString(t)); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.toLocaleTimeString")); -} - -QScriptValueImpl Date::method_valueOf(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) - return QScriptValueImpl(self.internalValue().toNumber()); - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.valueOf")); -} - -QScriptValueImpl Date::method_getTime(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) - return QScriptValueImpl(self.internalValue().toNumber()); - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.getTime")); -} - -QScriptValueImpl Date::method_getYear(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - if (! qIsNaN(t)) - t = YearFromTime(LocalTime(t)) - 1900; - return QScriptValueImpl(t); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.getYear")); -} - -QScriptValueImpl Date::method_getFullYear(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - if (! qIsNaN(t)) - t = YearFromTime(LocalTime(t)); - return QScriptValueImpl(t); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.getFullYear")); -} - -QScriptValueImpl Date::method_getUTCFullYear(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - if (! qIsNaN(t)) - t = YearFromTime(t); - return QScriptValueImpl(t); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.getUTCFullYear")); -} - -QScriptValueImpl Date::method_getMonth(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - if (! qIsNaN(t)) - t = MonthFromTime(LocalTime(t)); - return QScriptValueImpl(t); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.getMonth")); -} - -QScriptValueImpl Date::method_getUTCMonth(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - if (! qIsNaN(t)) - t = MonthFromTime(t); - return QScriptValueImpl(t); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.getUTCMonth")); -} - -QScriptValueImpl Date::method_getDate(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - if (! qIsNaN(t)) - t = DateFromTime(LocalTime(t)); - return QScriptValueImpl(t); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.getDate")); -} - -QScriptValueImpl Date::method_getUTCDate(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - if (! qIsNaN(t)) - t = DateFromTime(t); - return QScriptValueImpl(t); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.getUTCDate")); -} - -QScriptValueImpl Date::method_getDay(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - if (! qIsNaN(t)) - t = WeekDay(LocalTime(t)); - return QScriptValueImpl(t); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.getDay")); -} - -QScriptValueImpl Date::method_getUTCDay(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - if (! qIsNaN(t)) - t = WeekDay(t); - return QScriptValueImpl(t); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.getUTCDay")); -} - -QScriptValueImpl Date::method_getHours(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - if (! qIsNaN(t)) - t = HourFromTime(LocalTime(t)); - return QScriptValueImpl(t); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.getHours")); -} - -QScriptValueImpl Date::method_getUTCHours(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - if (! qIsNaN(t)) - t = HourFromTime(t); - return QScriptValueImpl(t); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.getUTCHours")); -} - -QScriptValueImpl Date::method_getMinutes(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - if (! qIsNaN(t)) - t = MinFromTime(LocalTime(t)); - return QScriptValueImpl(t); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.getMinutes")); -} - -QScriptValueImpl Date::method_getUTCMinutes(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - if (! qIsNaN(t)) - t = MinFromTime(t); - return QScriptValueImpl(t); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.getUTCMinutes")); -} - -QScriptValueImpl Date::method_getSeconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - if (! qIsNaN(t)) - t = SecFromTime(LocalTime(t)); - return QScriptValueImpl(t); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.getSeconds")); -} - -QScriptValueImpl Date::method_getUTCSeconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - if (! qIsNaN(t)) - t = SecFromTime(t); - return QScriptValueImpl(t); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.getUTCSeconds")); -} - -QScriptValueImpl Date::method_getMilliseconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - if (! qIsNaN(t)) - t = msFromTime(LocalTime(t)); - return QScriptValueImpl(t); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.getMilliseconds")); -} - -QScriptValueImpl Date::method_getUTCMilliseconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - if (! qIsNaN(t)) - t = msFromTime(t); - return QScriptValueImpl(t); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.getUTCMilliseconds")); -} - -QScriptValueImpl Date::method_getTimezoneOffset(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - if (! qIsNaN(t)) - t = (t - LocalTime(t)) / msPerMinute; - return QScriptValueImpl(t); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.getTimezoneOffset")); -} - -QScriptValueImpl Date::method_setTime(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = TimeClip(context->argument(0).toNumber()); - QScriptValueImpl r(t); - self.setInternalValue(r); - return r; - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.setTime")); -} - -QScriptValueImpl Date::method_setMilliseconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = LocalTime(self.internalValue().toNumber()); - qsreal ms = context->argument(0).toNumber(); - t = TimeClip(UTC(MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms)))); - QScriptValueImpl r(t); - self.setInternalValue(r); - return r; - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.setMilliseconds")); -} - -QScriptValueImpl Date::method_setUTCMilliseconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - qsreal ms = context->argument(0).toNumber(); - t = TimeClip(MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms))); - QScriptValueImpl r(t); - self.setInternalValue(r); - return r; - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.setUTCMilliseconds")); -} - -QScriptValueImpl Date::method_setSeconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = LocalTime(self.internalValue().toNumber()); - qsreal sec = context->argument(0).toNumber(); - qsreal ms = (context->argumentCount() < 2) ? msFromTime(t) : context->argument(1).toNumber(); - t = TimeClip(UTC(MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), sec, ms)))); - QScriptValueImpl r(t); - self.setInternalValue(r); - return r; - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.setSeconds")); -} - -QScriptValueImpl Date::method_setUTCSeconds(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - qsreal sec = context->argument(0).toNumber(); - qsreal ms = (context->argumentCount() < 2) ? msFromTime(t) : context->argument(1).toNumber(); - t = TimeClip(MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), sec, ms))); - QScriptValueImpl r(t); - self.setInternalValue(r); - return r; - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.setUTCSeconds")); -} - -QScriptValueImpl Date::method_setMinutes(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = LocalTime(self.internalValue().toNumber()); - qsreal min = context->argument(0).toNumber(); - qsreal sec = (context->argumentCount() < 2) ? SecFromTime(t) : context->argument(1).toNumber(); - qsreal ms = (context->argumentCount() < 3) ? msFromTime(t) : context->argument(2).toNumber(); - t = TimeClip(UTC(MakeDate(Day(t), MakeTime(HourFromTime(t), min, sec, ms)))); - QScriptValueImpl r(t); - self.setInternalValue(r); - return r; - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.setMinutes")); -} - -QScriptValueImpl Date::method_setUTCMinutes(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - qsreal min = context->argument(0).toNumber(); - qsreal sec = (context->argumentCount() < 2) ? SecFromTime(t) : context->argument(1).toNumber(); - qsreal ms = (context->argumentCount() < 3) ? msFromTime(t) : context->argument(2).toNumber(); - t = TimeClip(MakeDate(Day(t), MakeTime(HourFromTime(t), min, sec, ms))); - QScriptValueImpl r(t); - self.setInternalValue(r); - return r; - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.setUTCMinutes")); -} - -QScriptValueImpl Date::method_setHours(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = LocalTime(self.internalValue().toNumber()); - qsreal hour = context->argument(0).toNumber(); - qsreal min = (context->argumentCount() < 2) ? MinFromTime(t) : context->argument(1).toNumber(); - qsreal sec = (context->argumentCount() < 3) ? SecFromTime(t) : context->argument(2).toNumber(); - qsreal ms = (context->argumentCount() < 4) ? msFromTime(t) : context->argument(3).toNumber(); - t = TimeClip(UTC(MakeDate(Day(t), MakeTime(hour, min, sec, ms)))); - QScriptValueImpl r(t); - self.setInternalValue(r); - return r; - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.setHours")); -} - -QScriptValueImpl Date::method_setUTCHours(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - qsreal hour = context->argument(0).toNumber(); - qsreal min = (context->argumentCount() < 2) ? MinFromTime(t) : context->argument(1).toNumber(); - qsreal sec = (context->argumentCount() < 3) ? SecFromTime(t) : context->argument(2).toNumber(); - qsreal ms = (context->argumentCount() < 4) ? msFromTime(t) : context->argument(3).toNumber(); - t = TimeClip(MakeDate(Day(t), MakeTime(hour, min, sec, ms))); - QScriptValueImpl r(t); - self.setInternalValue(r); - return r; - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.setUTCHours")); -} - -QScriptValueImpl Date::method_setDate(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = LocalTime(self.internalValue().toNumber()); - qsreal date = context->argument(0).toNumber(); - t = TimeClip(UTC(MakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), date), TimeWithinDay(t)))); - QScriptValueImpl r(t); - self.setInternalValue(r); - return r; - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.setDate")); -} - -QScriptValueImpl Date::method_setUTCDate(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - qsreal date = context->argument(0).toNumber(); - t = TimeClip(MakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), date), TimeWithinDay(t))); - QScriptValueImpl r(t); - self.setInternalValue(r); - return r; - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.setUTCDate")); -} - -QScriptValueImpl Date::method_setMonth(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = LocalTime(self.internalValue().toNumber()); - qsreal month = context->argument(0).toNumber(); - qsreal date = (context->argumentCount() < 2) ? DateFromTime(t) : context->argument(1).toNumber(); - t = TimeClip(UTC(MakeDate(MakeDay(YearFromTime(t), month, date), TimeWithinDay(t)))); - QScriptValueImpl r(t); - self.setInternalValue(r); - return r; - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.setMonth")); -} - -QScriptValueImpl Date::method_setUTCMonth(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - qsreal month = context->argument(0).toNumber(); - qsreal date = (context->argumentCount() < 2) ? DateFromTime(t) : context->argument(1).toNumber(); - t = TimeClip(MakeDate(MakeDay(YearFromTime(t), month, date), TimeWithinDay(t))); - QScriptValueImpl r(t); - self.setInternalValue(r); - return r; - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.setUTCMonth")); -} - -QScriptValueImpl Date::method_setFullYear(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = LocalTime(self.internalValue().toNumber()); - qsreal year = context->argument(0).toNumber(); - qsreal month = (context->argumentCount() < 2) ? MonthFromTime(t) : context->argument(1).toNumber(); - qsreal date = (context->argumentCount() < 3) ? DateFromTime(t) : context->argument(2).toNumber(); - t = TimeClip(UTC(MakeDate(MakeDay(year, month, date), TimeWithinDay(t)))); - QScriptValueImpl r(t); - self.setInternalValue(r); - return r; - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.setFullYear")); -} - -QScriptValueImpl Date::method_setUTCFullYear(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - qsreal year = context->argument(0).toNumber(); - qsreal month = (context->argumentCount() < 2) ? MonthFromTime(t) : context->argument(1).toNumber(); - qsreal date = (context->argumentCount() < 3) ? DateFromTime(t) : context->argument(2).toNumber(); - t = TimeClip(MakeDate(MakeDay(year, month, date), TimeWithinDay(t))); - QScriptValueImpl r(t); - self.setInternalValue(r); - return r; - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.setUTCFullYear")); -} - -QScriptValueImpl Date::method_setYear(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - Q_UNUSED(eng); - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - if (qIsNaN(t)) - t = 0; - else - t = LocalTime(t); - qsreal year = context->argument(0).toNumber(); - qsreal r; - if (qIsNaN(year)) { - r = qSNaN(); - } else { - if ((eng->toInteger(year) >= 0) && (eng->toInteger(year) <= 99)) - year += 1900; - r = MakeDay(year, MonthFromTime(t), DateFromTime(t)); - r = UTC(MakeDate(r, TimeWithinDay(t))); - r = TimeClip(r); - } - QScriptValueImpl v = QScriptValueImpl(r); - self.setInternalValue(v); - return v; - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.setYear")); -} - -QScriptValueImpl Date::method_toUTCString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() == classInfo) { - qsreal t = self.internalValue().toNumber(); - return QScriptValueImpl(eng, ToUTCString(t)); - } - return throwThisObjectTypeError( - context, QLatin1String("Date.prototype.toUTCString")); -} - -} } // namespace QScript::Ecma - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT diff --git a/src/script/qscriptecmadate_p.h b/src/script/qscriptecmadate_p.h deleted file mode 100644 index 4d705a5..0000000 --- a/src/script/qscriptecmadate_p.h +++ /dev/null @@ -1,234 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTECMADATE_P_H -#define QSCRIPTECMADATE_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 "qscriptecmacore_p.h" - -#ifndef QT_NO_SCRIPT - -QT_BEGIN_NAMESPACE - -class QDate; -class QDateTime; - -namespace QScript { namespace Ecma { - -class Date: public Core -{ -public: - Date(QScriptEnginePrivate *engine); - virtual ~Date(); - - virtual void execute(QScriptContextPrivate *context); - - void newDate(QScriptValueImpl *result, double t); - void newDate(QScriptValueImpl *result, const QDateTime &dt); - void newDate(QScriptValueImpl *result, const QDate &d); - - QDateTime toDateTime(const QScriptValueImpl &date) const; - -protected: - static QScriptValueImpl method_MakeTime(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_MakeDate(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_TimeClip(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_parse(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_UTC(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_toString(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_toDateString(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_toTimeString(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_toLocaleString(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_toLocaleDateString(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_toLocaleTimeString(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_valueOf(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_getTime(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_getYear(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_getFullYear(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_getUTCFullYear(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_getMonth(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_getUTCMonth(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_getDate(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_getUTCDate(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_getDay(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_getUTCDay(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_getHours(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_getUTCHours(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_getMinutes(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_getUTCMinutes(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_getSeconds(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_getUTCSeconds(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_getMilliseconds(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_getUTCMilliseconds(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_getTimezoneOffset(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_setTime(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_setMilliseconds(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_setUTCMilliseconds(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_setSeconds(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_setUTCSeconds(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_setMinutes(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_setUTCMinutes(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_setHours(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_setUTCHours(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_setDate(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_setUTCDate(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_setMonth(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_setUTCMonth(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_setYear(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_setFullYear(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_setUTCFullYear(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_toUTCString(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); -}; - -} } // namespace QScript::Ecma - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptecmaerror.cpp b/src/script/qscriptecmaerror.cpp deleted file mode 100644 index 0dde68c..0000000 --- a/src/script/qscriptecmaerror.cpp +++ /dev/null @@ -1,368 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qscriptecmaerror_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" - -#include <QtCore/QtDebug> - -QT_BEGIN_NAMESPACE - -namespace QScript { namespace Ecma { - -static QString getMessage(QScriptContextPrivate *context) -{ - if (context->argumentCount() > 0) - return context->argument(0).toString(); - return QString(); -} - -static void setDebugInformation(QScriptValueImpl *error, QScriptContextPrivate *context) -{ - Q_ASSERT(context->previous); - context->previous->setDebugInformation(error); -} - -static QScriptValueImpl method_EvalError(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QScriptValueImpl result; - if (context->isCalledAsConstructor()) - result = context->thisObject(); - eng->errorConstructor->newEvalError(&result, getMessage(context)); - setDebugInformation(&result, context); - return result; -} - -static QScriptValueImpl method_RangeError(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QScriptValueImpl result; - if (context->isCalledAsConstructor()) - result = context->thisObject(); - eng->errorConstructor->newRangeError(&result, getMessage(context)); - setDebugInformation(&result, context); - return result; -} - -static QScriptValueImpl method_ReferenceError(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QScriptValueImpl result; - if (context->isCalledAsConstructor()) - result = context->thisObject(); - eng->errorConstructor->newReferenceError(&result, getMessage(context)); - setDebugInformation(&result, context); - return result; -} - -static QScriptValueImpl method_SyntaxError(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QScriptValueImpl result; - if (context->isCalledAsConstructor()) - result = context->thisObject(); - eng->errorConstructor->newSyntaxError(&result, getMessage(context)); - setDebugInformation(&result, context); - return result; -} - -static QScriptValueImpl method_TypeError(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QScriptValueImpl result; - if (context->isCalledAsConstructor()) - result = context->thisObject(); - eng->errorConstructor->newTypeError(&result, getMessage(context)); - setDebugInformation(&result, context); - return result; -} - -static QScriptValueImpl method_UriError(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QScriptValueImpl result; - if (context->isCalledAsConstructor()) - result = context->thisObject(); - eng->errorConstructor->newURIError(&result, getMessage(context)); - setDebugInformation(&result, context); - return result; -} - -Error::Error(QScriptEnginePrivate *eng): - Core(eng, QLatin1String("Error"), QScriptClassInfo::ErrorType) -{ - eng->newFunction(&ctor, this); - newErrorPrototype(&publicPrototype, QScriptValueImpl(), ctor, QLatin1String("Error")); - addPrototypeFunction(QLatin1String("backtrace"), method_backtrace, 0); - addPrototypeFunction(QLatin1String("toString"), method_toString, 0); - - // native errors - - evalErrorCtor = eng->createFunction(method_EvalError, 3, - classInfo(), QLatin1String("EvalError")); - rangeErrorCtor = eng->createFunction(method_RangeError, 3, - classInfo(), QLatin1String("RangeError")); - referenceErrorCtor = eng->createFunction(method_ReferenceError, 3, - classInfo(), QLatin1String("ReferenceError")); - syntaxErrorCtor = eng->createFunction(method_SyntaxError, 3, - classInfo(), QLatin1String("SyntaxError")); - typeErrorCtor = eng->createFunction(method_TypeError, 3, - classInfo(), QLatin1String("TypeError")); - uriErrorCtor = eng->createFunction(method_UriError, 3, - classInfo(), QLatin1String("URIError")); - - newErrorPrototype(&evalErrorPrototype, publicPrototype, - evalErrorCtor, QLatin1String("EvalError")); - newErrorPrototype(&rangeErrorPrototype, publicPrototype, - rangeErrorCtor, QLatin1String("RangeError")); - newErrorPrototype(&referenceErrorPrototype, publicPrototype, - referenceErrorCtor, QLatin1String("ReferenceError")); - newErrorPrototype(&syntaxErrorPrototype, publicPrototype, - syntaxErrorCtor, QLatin1String("SyntaxError")); - newErrorPrototype(&typeErrorPrototype, publicPrototype, - typeErrorCtor, QLatin1String("TypeError")); - newErrorPrototype(&uriErrorPrototype, publicPrototype, - uriErrorCtor, QLatin1String("URIError")); -} - -Error::~Error() -{ -} - -void Error::execute(QScriptContextPrivate *context) -{ -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - engine()->notifyFunctionEntry(context); -#endif - QString message = QString(); - - if (context->argumentCount() > 0) - message = context->argument(0).toString(); - - QScriptValueImpl result; - newError(&result, publicPrototype, message); - - setDebugInformation(&result, context); - - context->setReturnValue(result); -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - engine()->notifyFunctionExit(context); -#endif -} - -void Error::mark(QScriptEnginePrivate *eng, int generation) -{ - Core::mark(eng, generation); - - eng->markObject(evalErrorCtor, generation); - eng->markObject(rangeErrorCtor, generation); - eng->markObject(referenceErrorCtor, generation); - eng->markObject(syntaxErrorCtor, generation); - eng->markObject(typeErrorCtor, generation); - eng->markObject(uriErrorCtor, generation); - - eng->markObject(evalErrorPrototype, generation); - eng->markObject(rangeErrorPrototype, generation); - eng->markObject(referenceErrorPrototype, generation); - eng->markObject(syntaxErrorPrototype, generation); - eng->markObject(typeErrorPrototype, generation); - eng->markObject(uriErrorPrototype, generation); -} - -void Error::newError(QScriptValueImpl *result, const QString &message) -{ - newError(result, publicPrototype, message); -} - -void Error::newEvalError(QScriptValueImpl *result, const QString &message) -{ - newError(result, evalErrorPrototype, message); -} - -void Error::newRangeError(QScriptValueImpl *result, const QString &message) -{ - newError(result, rangeErrorPrototype, message); -} - -void Error::newReferenceError(QScriptValueImpl *result, const QString &message) -{ - newError(result, referenceErrorPrototype, message); -} - -void Error::newSyntaxError(QScriptValueImpl *result, const QString &message) -{ - newError(result, syntaxErrorPrototype, message); -} - -void Error::newTypeError(QScriptValueImpl *result, const QString &message) -{ - newError(result, typeErrorPrototype, message); -} - -void Error::newURIError(QScriptValueImpl *result, const QString &message) -{ - newError(result, uriErrorPrototype, message); -} - -void Error::newError(QScriptValueImpl *result, const QScriptValueImpl &proto, - const QString &message) -{ - QScriptEnginePrivate *eng_p = engine(); - - if (!result->isValid()) - eng_p->newObject(result, proto, classInfo()); - else - result->setClassInfo(classInfo()); - result->setProperty(QLatin1String("message"), QScriptValueImpl(eng_p, message)); -} - -void Error::newErrorPrototype(QScriptValueImpl *result, const QScriptValueImpl &proto, - QScriptValueImpl &ztor, const QString &name) -{ - newError(result, proto); - result->setProperty(QLatin1String("name"), QScriptValueImpl(engine(), name)); - result->setProperty(QLatin1String("constructor"), ztor, - QScriptValue::Undeletable - | QScriptValue::SkipInEnumeration); - ztor.setProperty(QLatin1String("prototype"), *result, - QScriptValue::Undeletable - | QScriptValue::ReadOnly - | QScriptValue::SkipInEnumeration); -} - -bool Error::isEvalError(const QScriptValueImpl &value) const -{ - return value.instanceOf(evalErrorPrototype); -} - -bool Error::isRangeError(const QScriptValueImpl &value) const -{ - return value.instanceOf(rangeErrorPrototype); -} - -bool Error::isReferenceError(const QScriptValueImpl &value) const -{ - return value.instanceOf(referenceErrorPrototype); -} - -bool Error::isSyntaxError(const QScriptValueImpl &value) const -{ - return value.instanceOf(syntaxErrorPrototype); -} - -bool Error::isTypeError(const QScriptValueImpl &value) const -{ - return value.instanceOf(typeErrorPrototype); -} - -bool Error::isURIError(const QScriptValueImpl &value) const -{ - return value.instanceOf(uriErrorPrototype); -} - -QStringList Error::backtrace(const QScriptValueImpl &error) -{ - QStringList result; - QScriptValueImpl stack = error.property(QLatin1String("stack")); - int frameCount = stack.property(QLatin1String("length")).toInt32(); - for (int i = 0; i < frameCount; ++i) { - QScriptValueImpl o = stack.property(i); - QScriptValueImpl frame = o.property(QLatin1String("frame")); - QString s; - QString functionName = o.property(QLatin1String("functionName")).toString(); - if (functionName.isEmpty()) { - if (i == frameCount-1) - s += QLatin1String("<global>"); - else - s += QLatin1String("<anonymous>"); - } else { - s += functionName; - } - s += QLatin1Char('('); - QScriptValueImpl arguments = frame.property(QLatin1String("arguments")); - if (arguments.isObject()) { - int argCount = arguments.property(QLatin1String("length")).toInt32(); - for (int j = 0; j < argCount; ++j) { - if (j > 0) - s += QLatin1Char(','); - s += arguments.property(j).toString(); - } - } - s += QLatin1String(")@") + o.property(QLatin1String("fileName")).toString() - + QLatin1Char(':') + o.property(QLatin1String("lineNumber")).toString(); - result.append(s); - } - return result; -} - -QScriptValueImpl Error::method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QScriptValueImpl name = context->thisObject().property(QLatin1String("name"), - QScriptValue::ResolvePrototype); - QScriptValueImpl message = context->thisObject().property(QLatin1String("message"), - QScriptValue::ResolvePrototype); - QString result = QLatin1String(""); - if (name.isValid()) - result = name.toString(); - if (message.isValid()) { - QString str = message.toString(); - if (!str.isEmpty()) { - if (!result.isEmpty()) - result += QLatin1String(": "); - result += str; - } - } - return (QScriptValueImpl(eng, result)); -} - -QScriptValueImpl Error::method_backtrace(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QScriptValueImpl self = context->thisObject(); - return eng->arrayFromStringList(backtrace(self)); -} - -} } // namespace QSA::Ecma - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT diff --git a/src/script/qscriptecmaerror_p.h b/src/script/qscriptecmaerror_p.h deleted file mode 100644 index dddcb3e..0000000 --- a/src/script/qscriptecmaerror_p.h +++ /dev/null @@ -1,121 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTECMAERROR_P_H -#define QSCRIPTECMAERROR_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 "qscriptecmacore_p.h" - -#ifndef QT_NO_SCRIPT - -QT_BEGIN_NAMESPACE - -namespace QScript { namespace Ecma { - -class Error: public Core -{ -public: - Error(QScriptEnginePrivate *engine); - virtual ~Error(); - - virtual void execute(QScriptContextPrivate *context); - - virtual void mark(QScriptEnginePrivate *eng, int generation); - - void newError(QScriptValueImpl *result, const QString &message = QString()); - void newEvalError(QScriptValueImpl *result, const QString &message = QString()); - void newRangeError(QScriptValueImpl *result, const QString &message = QString()); - void newReferenceError(QScriptValueImpl *result, const QString &message = QString()); - void newSyntaxError(QScriptValueImpl *result, const QString &message = QString()); - void newTypeError(QScriptValueImpl *result, const QString &message = QString()); - void newURIError(QScriptValueImpl *result, const QString &message = QString()); - - bool isEvalError(const QScriptValueImpl &value) const; - bool isRangeError(const QScriptValueImpl &value) const; - bool isReferenceError(const QScriptValueImpl &value) const; - bool isSyntaxError(const QScriptValueImpl &value) const; - bool isTypeError(const QScriptValueImpl &value) const; - bool isURIError(const QScriptValueImpl &value) const; - - static QStringList backtrace(const QScriptValueImpl &error); - - QScriptValueImpl evalErrorCtor; - QScriptValueImpl rangeErrorCtor; - QScriptValueImpl referenceErrorCtor; - QScriptValueImpl syntaxErrorCtor; - QScriptValueImpl typeErrorCtor; - QScriptValueImpl uriErrorCtor; - - QScriptValueImpl evalErrorPrototype; - QScriptValueImpl rangeErrorPrototype; - QScriptValueImpl referenceErrorPrototype; - QScriptValueImpl syntaxErrorPrototype; - QScriptValueImpl typeErrorPrototype; - QScriptValueImpl uriErrorPrototype; - -protected: - static QScriptValueImpl method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo); - static QScriptValueImpl method_backtrace(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo); - -private: - void newError(QScriptValueImpl *result, const QScriptValueImpl &proto, - const QString &message = QString()); - void newErrorPrototype(QScriptValueImpl *result, const QScriptValueImpl &proto, - QScriptValueImpl &ztor, const QString &name); -}; - -} } // namespace QScript::Ecma - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT -#endif // QSCRIPTECMAERROR_P_H diff --git a/src/script/qscriptecmafunction.cpp b/src/script/qscriptecmafunction.cpp deleted file mode 100644 index a1e5b58..0000000 --- a/src/script/qscriptecmafunction.cpp +++ /dev/null @@ -1,459 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qscriptecmafunction_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" - -#include <QtCore/QtDebug> - -#ifndef QT_NO_QOBJECT -# include "qscriptextqobject_p.h" -# include <QtCore/QMetaMethod> -#endif - -QT_BEGIN_NAMESPACE - -namespace QScript { namespace Ecma { - -class FunctionClassData: public QScriptClassData -{ - QScriptClassInfo *m_classInfo; - -public: - FunctionClassData(QScriptClassInfo *classInfo); - virtual ~FunctionClassData(); - - inline QScriptClassInfo *classInfo() const - { return m_classInfo; } - - virtual bool resolve(const QScriptValueImpl &object, - QScriptNameIdImpl *nameId, - QScript::Member *member, QScriptValueImpl *base, - QScript::AccessMode access); - virtual bool get(const QScriptValueImpl &obj, const Member &m, - QScriptValueImpl *out_value); - virtual bool put(QScriptValueImpl *object, const QScript::Member &member, - const QScriptValueImpl &value); - virtual void mark(const QScriptValueImpl &object, int generation); -}; - -FunctionClassData::FunctionClassData(QScriptClassInfo *classInfo) - : m_classInfo(classInfo) -{ -} - -FunctionClassData::~FunctionClassData() -{ -} - -bool FunctionClassData::resolve(const QScriptValueImpl &object, - QScriptNameIdImpl *nameId, - QScript::Member *member, QScriptValueImpl *base, - QScript::AccessMode /*access*/) -{ - if (object.classInfo() != classInfo()) - return false; - - QScriptEnginePrivate *eng = object.engine(); - - if ((nameId == eng->idTable()->id_length) - || (nameId == eng->idTable()->id_arguments)) { - member->native(nameId, /*id=*/ 0, - QScriptValue::Undeletable - | QScriptValue::ReadOnly - | QScriptValue::SkipInEnumeration); - *base = object; - return true; - } - - return false; -} - -bool FunctionClassData::get(const QScriptValueImpl &object, const Member &member, - QScriptValueImpl *result) -{ - if (object.classInfo() != classInfo()) - return false; - - QScriptEnginePrivate *eng = object.engine(); - if (! member.isNativeProperty()) - return false; - - if (member.nameId() == eng->idTable()->id_length) { - *result = QScriptValueImpl(object.toFunction()->length); - return true; - } else if (member.nameId() == eng->idTable()->id_arguments) { - *result = eng->nullValue(); - return true; - } - - return false; -} - -bool FunctionClassData::put(QScriptValueImpl *, const QScript::Member &, - const QScriptValueImpl &) -{ - return false; -} - -void FunctionClassData::mark(const QScriptValueImpl &object, int generation) -{ - if (object.classInfo() != classInfo()) - return; - QScriptFunction *fun = object.toFunction(); - QScriptEnginePrivate *eng = object.engine(); - fun->mark(eng, generation); -} - -Function::Function(QScriptEnginePrivate *eng, QScriptClassInfo *classInfo): - Core(eng, classInfo) -{ - publicPrototype = eng->createFunction(method_void, 0, classInfo); // public prototype -} - -Function::~Function() -{ -} - -void Function::initialize() -{ - QScriptEnginePrivate *eng = engine(); - eng->newConstructor(&ctor, this, publicPrototype); - - addPrototypeFunction(QLatin1String("toString"), method_toString, 1); - addPrototypeFunction(QLatin1String("apply"), method_apply, 2); - addPrototypeFunction(QLatin1String("call"), method_call, 1); - addPrototypeFunction(QLatin1String("connect"), method_connect, 1); - addPrototypeFunction(QLatin1String("disconnect"), method_disconnect, 1); - - classInfo()->setData(new FunctionClassData(classInfo())); -} - -void Function::execute(QScriptContextPrivate *context) -{ -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - engine()->notifyFunctionEntry(context); -#endif - int lineNumber = context->currentLine; - QString contents = buildFunction(context); - engine()->evaluate(context, contents, lineNumber); -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - engine()->notifyFunctionExit(context); -#endif -} - -QString Function::buildFunction(QScriptContextPrivate *context) -{ - int argc = context->argumentCount(); - - QString code; - code += QLatin1String("function("); - - // the formals - for (int i = 0; i < argc - 1; ++i) { - if (i != 0) - code += QLatin1Char(','); - - code += context->argument(i).toString(); - } - - code += QLatin1String("){"); - - // the function body - if (argc != 0) - code += context->argument(argc - 1).toString(); - - code += QLatin1String("\n}"); - - return code; -} - -void Function::newFunction(QScriptValueImpl *result, QScriptFunction *foo) -{ - engine()->newFunction(result, foo); -} - -QScriptValueImpl Function::method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QScriptValueImpl self = context->thisObject(); - if (QScriptFunction *foo = self.toFunction()) { - QString code = foo->toString(context); - return QScriptValueImpl(eng, code); - } - - return throwThisObjectTypeError( - context, QLatin1String("Function.prototype.toString")); -} - -QScriptValueImpl Function::method_call(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - if (! context->thisObject().isFunction()) { - return throwThisObjectTypeError( - context, QLatin1String("Function.prototype.call")); - } - - QScriptValueImpl thisObject = eng->toObject(context->argument(0)); - if (! (thisObject.isValid () && thisObject.isObject())) - thisObject = eng->globalObject(); - - QScriptValueImplList args; - for (int i = 1; i < context->argumentCount(); ++i) - args << context->argument(i); - - return context->thisObject().call(thisObject, args); -} - -QScriptValueImpl Function::method_apply(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - if (! context->thisObject().isFunction()) { - return throwThisObjectTypeError( - context, QLatin1String("Function.prototype.apply")); - } - - QScriptValueImpl thisObject = eng->toObject(context->argument(0)); - if (! (thisObject.isValid () && thisObject.isObject())) - thisObject = eng->globalObject(); - - QScriptValueImplList args; - QScriptValueImpl undefined = eng->undefinedValue(); - - QScriptValueImpl arg = context->argument(1); - - if (Ecma::Array::Instance *arr = eng->arrayConstructor->get(arg)) { - QScript::Array actuals = arr->value; - - for (quint32 i = 0; i < actuals.count(); ++i) { - QScriptValueImpl a = actuals.at(i); - if (! a.isValid()) - args << undefined; - else - args << a; - } - } else if (arg.classInfo() == eng->m_class_arguments) { - QScript::ArgumentsObjectData *arguments; - arguments = static_cast<QScript::ArgumentsObjectData*> (arg.objectData()); - QScriptObject *activation = arguments->activation.objectValue(); - for (uint i = 0; i < arguments->length; ++i) - args << activation->m_values[i]; - } else if (!(arg.isUndefined() || arg.isNull())) { - return context->throwError(QScriptContext::TypeError, - QLatin1String("Function.prototype.apply: second argument is not an array")); - } - - return context->thisObject().call(thisObject, args); -} - -QScriptValueImpl Function::method_void(QScriptContextPrivate *, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - return eng->undefinedValue(); -} - -QScriptValueImpl Function::method_disconnect(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ -#ifndef QT_NO_QOBJECT - if (context->argumentCount() == 0) { - return context->throwError( - QLatin1String("Function.prototype.disconnect: no arguments given")); - } - - QScriptValueImpl self = context->thisObject(); - QScriptFunction *fun = self.toFunction(); - if ((fun == 0) || (fun->type() != QScriptFunction::Qt)) { - return context->throwError( - QScriptContext::TypeError, - QLatin1String("Function.prototype.disconnect: this object is not a signal")); - } - - QtFunction *qtSignal = static_cast<QtFunction*>(fun); - - const QMetaObject *meta = qtSignal->metaObject(); - if (!meta) { - return context->throwError( - QScriptContext::TypeError, - QString::fromLatin1("Function.prototype.disconnect: cannot disconnect from deleted QObject")); - } - - QMetaMethod sig = meta->method(qtSignal->initialIndex()); - if (sig.methodType() != QMetaMethod::Signal) { - return context->throwError(QScriptContext::TypeError, - QString::fromLatin1("Function.prototype.disconnect: %0::%1 is not a signal") - .arg(QLatin1String(qtSignal->metaObject()->className())) - .arg(QLatin1String(sig.signature()))); - } - - QScriptValueImpl receiver; - QScriptValueImpl slot; - QScriptValueImpl arg0 = context->argument(0); - if (context->argumentCount() < 2) { - receiver = QScriptValueImpl(); - slot = arg0; - } else { - receiver = arg0; - QScriptValueImpl arg1 = context->argument(1); - if (arg1.isFunction()) - slot = arg1; - else - slot = receiver.property(arg1.toString(), QScriptValue::ResolvePrototype); - } - - if (!slot.isFunction()) { - return context->throwError( - QScriptContext::TypeError, - QLatin1String("Function.prototype.disconnect: target is not a function")); - } - - bool ok = eng->scriptDisconnect(self, receiver, slot); - if (!ok) { - return context->throwError( - QString::fromLatin1("Function.prototype.disconnect: failed to disconnect from %0::%1") - .arg(QLatin1String(qtSignal->metaObject()->className())) - .arg(QLatin1String(sig.signature()))); - } - return eng->undefinedValue(); -#else - Q_UNUSED(eng); - return context->throwError(QScriptContext::TypeError, - QLatin1String("Function.prototype.disconnect")); -#endif // QT_NO_QOBJECT -} - -QScriptValueImpl Function::method_connect(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - Q_UNUSED(classInfo); - -#ifndef QT_NO_QOBJECT - if (context->argumentCount() == 0) { - return context->throwError( - QLatin1String("Function.prototype.connect: no arguments given")); - } - - QScriptValueImpl self = context->thisObject(); - QScriptFunction *fun = self.toFunction(); - if ((fun == 0) || (fun->type() != QScriptFunction::Qt)) { - return context->throwError( - QScriptContext::TypeError, - QLatin1String("Function.prototype.connect: this object is not a signal")); - } - - QtFunction *qtSignal = static_cast<QtFunction*>(fun); - - const QMetaObject *meta = qtSignal->metaObject(); - if (!meta) { - return context->throwError( - QScriptContext::TypeError, - QString::fromLatin1("Function.prototype.connect: cannot connect to deleted QObject")); - } - - QMetaMethod sig = meta->method(qtSignal->initialIndex()); - if (sig.methodType() != QMetaMethod::Signal) { - return context->throwError(QScriptContext::TypeError, - QString::fromLatin1("Function.prototype.connect: %0::%1 is not a signal") - .arg(QLatin1String(qtSignal->metaObject()->className())) - .arg(QLatin1String(sig.signature()))); - } - - { - QList<int> overloads = qtSignal->overloadedIndexes(); - if (!overloads.isEmpty()) { - overloads.append(qtSignal->initialIndex()); - QByteArray signature = sig.signature(); - QString message = QString::fromLatin1("Function.prototype.connect: ambiguous connect to %0::%1(); candidates are\n") - .arg(QLatin1String(qtSignal->metaObject()->className())) - .arg(QLatin1String(signature.left(signature.indexOf('(')))); - for (int i = 0; i < overloads.size(); ++i) { - QMetaMethod mtd = meta->method(overloads.at(i)); - message.append(QString::fromLatin1(" %0\n").arg(QString::fromLatin1(mtd.signature()))); - } - message.append(QString::fromLatin1("Use e.g. object['%0'].connect() to connect to a particular overload") - .arg(QLatin1String(signature))); - return context->throwError(message); - } - } - - QScriptValueImpl receiver; - QScriptValueImpl slot; - QScriptValueImpl arg0 = context->argument(0); - if (context->argumentCount() < 2) { - receiver = QScriptValueImpl(); - slot = arg0; - } else { - receiver = arg0; - QScriptValueImpl arg1 = context->argument(1); - if (arg1.isFunction()) - slot = arg1; - else - slot = receiver.property(arg1.toString(), QScriptValue::ResolvePrototype); - } - - if (!slot.isFunction()) { - return context->throwError( - QScriptContext::TypeError, - QLatin1String("Function.prototype.connect: target is not a function")); - } - - bool ok = eng->scriptConnect(self, receiver, slot); - if (!ok) { - return context->throwError( - QString::fromLatin1("Function.prototype.connect: failed to connect to %0::%1") - .arg(QLatin1String(qtSignal->metaObject()->className())) - .arg(QLatin1String(sig.signature()))); - } - return eng->undefinedValue(); -#else - Q_UNUSED(eng); - Q_UNUSED(classInfo); - return context->throwError(QScriptContext::TypeError, - QLatin1String("Function.prototype.connect")); -#endif // QT_NO_QOBJECT -} - -} } // namespace QScript::Ecma - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT diff --git a/src/script/qscriptecmafunction_p.h b/src/script/qscriptecmafunction_p.h deleted file mode 100644 index 23b56f9..0000000 --- a/src/script/qscriptecmafunction_p.h +++ /dev/null @@ -1,105 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTECMAFUNCTION_P_H -#define QSCRIPTECMAFUNCTION_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 "qscriptecmacore_p.h" - -#ifndef QT_NO_SCRIPT - -QT_BEGIN_NAMESPACE - -namespace QScript { namespace Ecma { - -class Function: public Core -{ -public: - Function(QScriptEnginePrivate *engine, QScriptClassInfo *classInfo); - virtual ~Function(); - - void initialize(); - - virtual void execute(QScriptContextPrivate *context); - - void newFunction(QScriptValueImpl *result, QScriptFunction *foo); - -protected: - QString buildFunction(QScriptContextPrivate *context); - - static QScriptValueImpl method_toString(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_apply(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_call(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_void(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_disconnect(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_connect(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); -}; - -} } // namespace QScript::Ecma - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptecmaglobal.cpp b/src/script/qscriptecmaglobal.cpp deleted file mode 100644 index b5cf675..0000000 --- a/src/script/qscriptecmaglobal.cpp +++ /dev/null @@ -1,572 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -// for strtoll -#include <qplatformdefs.h> - -#ifndef QT_NO_SCRIPT - -#include "qscriptecmaglobal_p.h" -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" - -#include <QtCore/QVarLengthArray> -#include <QtCore/qnumeric.h> - -QT_BEGIN_NAMESPACE - -extern double qstrtod(const char *s00, char const **se, bool *ok); - -namespace QScript { - -extern qsreal integerFromString(const QString &str, int radix); - -static inline char toHex(char c) -{ - static const char hexnumbers[] = "0123456789ABCDEF"; - return hexnumbers[c & 0xf]; -} - -static int fromHex(char c) -{ - if ((c >= '0') && (c <= '9')) - return c - '0'; - if ((c >= 'A') && (c <= 'F')) - return c - 'A' + 10; - if ((c >= 'a') && (c <= 'f')) - return c - 'a' + 10; - return -1; -} - -static QByteArray escape(const QString &input) -{ - QVarLengthArray<char> output; - output.reserve(input.size() * 3); - const int length = input.length(); - for (int i = 0; i < length; ++i) { - ushort uc = input.at(i).unicode(); - if (uc < 0x100) { - if ( (uc > 0x60 && uc < 0x7B) - || (uc > 0x3F && uc < 0x5B) - || (uc > 0x2C && uc < 0x3A) - || (uc == 0x2A) - || (uc == 0x2B) - || (uc == 0x5F)) { - output.append(char(uc)); - } else { - output.append('%'); - output.append(toHex(uc >> 4)); - output.append(toHex(uc)); - } - } else { - output.append('%'); - output.append('u'); - output.append(toHex(uc >> 12)); - output.append(toHex(uc >> 8)); - output.append(toHex(uc >> 4)); - output.append(toHex(uc)); - } - } - return QByteArray(output.constData(), output.size()); -} - -static QString unescape(const QByteArray &input) -{ - QString result; - int i = 0; - const int length = input.length(); - while (i < length) { - char c = input.at(i++); - if ((c == '%') && (i + 1 < length)) { - char a = input.at(i); - if ((a == 'u') && (i + 4 < length)) { - int d3 = fromHex(input.at(i+1)); - int d2 = fromHex(input.at(i+2)); - int d1 = fromHex(input.at(i+3)); - int d0 = fromHex(input.at(i+4)); - if ((d3 != -1) && (d2 != -1) && (d1 != -1) && (d0 != -1)) { - ushort uc = ushort((d3 << 12) | (d2 << 8) | (d1 << 4) | d0); - result.append(QChar(uc)); - i += 5; - } else { - result.append(QLatin1Char(c)); - } - } else { - int d1 = fromHex(a); - int d0 = fromHex(input.at(i+1)); - if ((d1 != -1) && (d0 != -1)) { - c = (d1 << 4) | d0; - i += 2; - } - result.append(QLatin1Char(c)); - } - } else { - result.append(QLatin1Char(c)); - } - } - return result; -} - -static const char uriReserved[] = ";/?:@&=+$,"; -static const char uriUnescaped[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.!~*'()"; - -static QString encode(const QString &input, const QString &unescapedSet, bool *ok) -{ - QString output; - const int length = input.length(); - int i = 0; - while (i < length) { - const QChar c = input.at(i); - if (!unescapedSet.contains(c)) { - ushort uc = c.unicode(); - if ((uc >= 0xDC00) && (uc <= 0xDFFF)) { - // URIError - break; - } - if (!((uc < 0xD800) || (uc > 0xDBFF))) { - ++i; - if (i == length) { - // URIError - break; - } - const ushort uc2 = input.at(i).unicode(); - if ((uc < 0xDC00) || (uc > 0xDFFF)) { - // URIError - break; - } - uc = ((uc - 0xD800) * 0x400) + (uc2 - 0xDC00) + 0x10000; - } - QString tmp(1, QChar(uc)); - QByteArray octets = tmp.toUtf8(); - for (int j = 0; j < octets.length(); ++j) { - output.append(QLatin1Char('%')); - output.append(QLatin1Char(toHex(octets.at(j) >> 4))); - output.append(QLatin1Char(toHex(octets.at(j)))); - } - } else { - output.append(c); - } - ++i; - } - *ok = (i == length); - return output; -} - -static QString decode(const QString &input, const QString &reservedSet, bool *ok) -{ - QString output; - const int length = input.length(); - int i = 0; - const QChar percent = QLatin1Char('%'); - while (i < length) { - const QChar c = input.at(i); - if (c == percent) { - int start = i; - if (i + 2 >= length) { - // URIError - break; - } - int d1 = fromHex(input.at(i+1).toLatin1()); - int d0 = fromHex(input.at(i+2).toLatin1()); - if ((d1 == -1) || (d0 == -1)) { - // URIError - break; - } - int b = (d1 << 4) | d0; - i += 2; - if (b & 0x80) { - int n = -1; - while ((b << ++n) & 0x80) ; - if ((n == 1) || (n > 4)) { - // URIError - break; - } - QByteArray octets; - octets.append(b); - if (i + (3 * (n - 1)) >= length) { - // URIError - break; - } - for (int j = 1; j < n; ++j) { - ++i; - if (input.at(i) != percent) { - // URIError - break; - } - d1 = fromHex(input.at(i+1).toLatin1()); - d0 = fromHex(input.at(i+2).toLatin1()); - if ((d1 == -1) || (d0 == -1)) { - // URIError - break; - } - b = (d1 << 4) | d0; - if ((b & 0xC0) != 0x80) { - // URIError - break; - } - i += 2; - octets.append(b); - } - QString tmp = QString::fromUtf8(octets); - Q_ASSERT(tmp.length() == 1); - uint v = tmp.at(0).unicode(); // ### need 32-bit value - if (v < 0x10000) { - QChar z = QChar(ushort(v)); - if (!reservedSet.contains(z)) { - output.append(z); - } else { - output.append(input.mid(start, i - start + 1)); - } - } else { - if (v > 0x10FFFF) { - // URIError - break; - } - ushort l = ushort(((v - 0x10000) & 0x3FF) + 0xDC00); - ushort h = ushort((((v - 0x10000) >> 10) & 0x3FF) + 0xD800); - output.append(QChar(l)); - output.append(QChar(h)); - } - } else { - output.append(ushort(b)); - } - } else { - output.append(c); - } - ++i; - } - *ok = (i == length); - return output; -} - -class PrintFunction : public QScriptFunction -{ -public: - PrintFunction() {} - - virtual ~PrintFunction() {} - - virtual void execute(QScriptContextPrivate *context) - { - QScriptEnginePrivate *eng = context->engine(); -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - eng->notifyFunctionEntry(context); -#endif - QString result; - for (int i = 0; i < context->argumentCount(); ++i) { - if (i != 0) - result.append(QLatin1Char(' ')); - - QString s = context->argument(i).toString(); - if (context->state() == QScriptContext::ExceptionState) - break; - result.append(s); - } - - if (context->state() != QScriptContext::ExceptionState) { - QTextStream qout(stdout, QIODevice::WriteOnly); - qout << result << endl; - context->setReturnValue(eng->undefinedValue()); - } -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - eng->notifyFunctionExit(context); -#endif - } - - QString functionName() const - { - return QLatin1String("print"); - } -}; - -} // anonumous - -namespace QScript { namespace Ecma { - -Global::Global(QScriptEnginePrivate *engine, QScriptClassInfo *classInfo) - : m_engine(engine), m_classInfo(classInfo) -{ -} - -Global::~Global() -{ -} - -void Global::construct(QScriptValueImpl *object, QScriptEnginePrivate *eng) -{ - QScriptClassInfo *classInfo = eng->registerClass(QLatin1String("global"), - QScriptClassInfo::ActivationType); - - // create with prototype null, since Object.prototype doesn't exist at this point - eng->newObject(object, eng->nullValue(), classInfo); - - Global *instance = new Global(eng, classInfo); - object->setObjectData(instance); -} - -void Global::initialize(QScriptValueImpl *object, QScriptEnginePrivate *eng) -{ - // set the real prototype - object->setPrototype(eng->objectConstructor->publicPrototype); - - const QScriptValue::PropertyFlags flags = QScriptValue::Undeletable - | QScriptValue::SkipInEnumeration; - - object->setProperty(QLatin1String("NaN"), QScriptValueImpl(qSNaN()), flags); - object->setProperty(QLatin1String("Infinity"), QScriptValueImpl(qInf()), flags); - object->setProperty(QLatin1String("undefined"), eng->undefinedValue(), flags); - - object->setProperty(QLatin1String("print"), - eng->createFunction(new PrintFunction()), flags); - addFunction(*object, QLatin1String("parseInt"), method_parseInt, 2, flags); - addFunction(*object, QLatin1String("parseFloat"), method_parseFloat, 1, flags); - addFunction(*object, QLatin1String("isNaN"), method_isNaN, 1, flags); - addFunction(*object, QLatin1String("isFinite"), method_isFinite, 1, flags); - addFunction(*object, QLatin1String("decodeURI"), method_decodeURI, 1, flags); - addFunction(*object, QLatin1String("decodeURIComponent"), method_decodeURIComponent, 1, flags); - addFunction(*object, QLatin1String("encodeURI"), method_encodeURI, 1, flags); - addFunction(*object, QLatin1String("encodeURIComponent"), method_encodeURIComponent, 1, flags); - addFunction(*object, QLatin1String("escape"), method_escape, 1, flags); - addFunction(*object, QLatin1String("unescape"), method_unescape, 1, flags); - addFunction(*object, QLatin1String("version"), method_version, 0, flags); - addFunction(*object, QLatin1String("gc"), method_gc, 0, flags); -} - -QScriptValueImpl Global::method_parseInt(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - if (context->argumentCount() == 0) - return qSNaN(); - - qsreal radix = 0; - if (context->argumentCount() > 1) { - radix = context->argument(1).toInteger(); - if (qIsNaN(radix) || (radix && (radix < 2 || radix > 36))) { - return qSNaN(); - } - } - - return QScript::integerFromString(context->argument(0).toString(), static_cast<int>(radix)); -} - -QScriptValueImpl Global::method_parseFloat(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - if (context->argumentCount() == 0) - return QScriptValueImpl(qSNaN()); - QString str = context->argument(0).toString().trimmed(); - QByteArray latin1 = str.toLatin1(); - const char *data = latin1.constData(); - const char *eptr = 0; - qsreal result = qstrtod(data, &eptr, 0); - if (eptr == data) { - if (str == QLatin1String("Infinity")) - result = +qInf(); - else if (str == QLatin1String("+Infinity")) - result = +qInf(); - else if (str == QLatin1String("-Infinity")) - result = -qInf(); - else - result = qSNaN(); - } - return result; -} - -QScriptValueImpl Global::method_isNaN(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - qsreal v = qSNaN(); - if (context->argumentCount() > 0) - v = context->argument(0).toNumber(); - return (QScriptValueImpl(qIsNaN(v))); -} - -QScriptValueImpl Global::method_isFinite(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - qsreal v = qInf(); - if (context->argumentCount() > 0) - v = context->argument(0).toNumber(); - return (QScriptValueImpl(qIsFinite(v))); -} - -QScriptValueImpl Global::method_decodeURI(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *) -{ - QScriptValueImpl result; - - if (context->argumentCount() > 0) { - QString str = context->argument(0).toString(); - bool ok; - QString out = decode(str, QString::fromUtf8(uriReserved) + QString::fromUtf8("#"), &ok); - if (ok) - return QScriptValueImpl(eng, out); - else - return context->throwError(QScriptContext::URIError, - QLatin1String("malformed URI sequence")); - } - - return eng->undefinedValue(); -} - -QScriptValueImpl Global::method_decodeURIComponent(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *) -{ - QScriptValueImpl result; - if (context->argumentCount() > 0) { - QString str = context->argument(0).toString(); - bool ok; - QString out = decode(str, QString::fromUtf8(""), &ok); - if (ok) - result = QScriptValueImpl(eng, out); - else - result = context->throwError(QScriptContext::URIError, - QLatin1String("malformed URI sequence")); - } else { - result = eng->undefinedValue(); - } - return result; -} - -QScriptValueImpl Global::method_encodeURI(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *) -{ - QScriptValueImpl result; - if (context->argumentCount() > 0) { - QString str = context->argument(0).toString(); - bool ok; - QString out = encode(str, - QLatin1String(uriReserved) - + QLatin1String(uriUnescaped) - + QString::fromUtf8("#"), - &ok); - if (ok) - result = QScriptValueImpl(eng, out); - else - result = context->throwError(QScriptContext::URIError, - QLatin1String("malformed URI sequence")); - } else { - result = eng->undefinedValue(); - } - return result; -} - -QScriptValueImpl Global::method_encodeURIComponent(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *) -{ - QScriptValueImpl result; - if (context->argumentCount() > 0) { - QString str = context->argument(0).toString(); - bool ok; - QString out = encode(str, QLatin1String(uriUnescaped), &ok); - if (ok) - result = QScriptValueImpl(eng, out); - else - result = context->throwError(QScriptContext::URIError, - QLatin1String("malformed URI sequence")); - } else { - result = eng->undefinedValue(); - } - return result; -} - -QScriptValueImpl Global::method_escape(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *) -{ - if (context->argumentCount() > 0) { - QString str = context->argument(0).toString(); - return QScriptValueImpl(eng, QLatin1String(escape(str))); - } - return QScriptValueImpl(eng, QLatin1String("undefined")); -} - -QScriptValueImpl Global::method_unescape(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *) -{ - if (context->argumentCount() > 0) { - QByteArray data = context->argument(0).toString().toLatin1(); - return QScriptValueImpl(eng, unescape(data)); - } - return QScriptValueImpl(eng, QLatin1String("undefined")); -} - -QScriptValueImpl Global::method_version(QScriptContextPrivate *, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - return (QScriptValueImpl(1)); -} - -QScriptValueImpl Global::method_gc(QScriptContextPrivate *, - QScriptEnginePrivate *eng, - QScriptClassInfo *) -{ - eng->gc(); - return QScriptValueImpl(eng->objectAllocator.freeBlocks()); -} - -void Global::addFunction(QScriptValueImpl &object, const QString &name, - QScriptInternalFunctionSignature fun, int length, - const QScriptValue::PropertyFlags flags) -{ - QScriptEnginePrivate *eng_p = object.engine(); - QScriptValueImpl val = eng_p->createFunction(fun, length, object.classInfo(), name); - object.setProperty(name, val, flags); -} - -} } // namespace QScript::Ecma - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT diff --git a/src/script/qscriptecmaglobal_p.h b/src/script/qscriptecmaglobal_p.h deleted file mode 100644 index 3df1c0a..0000000 --- a/src/script/qscriptecmaglobal_p.h +++ /dev/null @@ -1,141 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTECMAGLOBAL_P_H -#define QSCRIPTECMAGLOBAL_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 "qscriptobjectdata_p.h" -#include "qscriptfunction_p.h" -#include "qscriptvalue.h" - -QT_BEGIN_NAMESPACE - -class QScriptEnginePrivate; -class QScriptContextPrivate; -class QScriptClassInfo; -class QScriptValueImpl; - -#ifndef QT_NO_SCRIPT - -namespace QScript { namespace Ecma { - -class Global: public QScriptObjectData -{ -protected: - Global(QScriptEnginePrivate *engine, QScriptClassInfo *classInfo); - -public: - virtual ~Global(); - - inline QScriptEnginePrivate *engine() const; - - static void construct(QScriptValueImpl *object, QScriptEnginePrivate *eng); - static void initialize(QScriptValueImpl *object, QScriptEnginePrivate *eng); - -protected: - static QScriptValueImpl method_parseInt(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_parseFloat(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_isNaN(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_isFinite(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_decodeURI(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_decodeURIComponent(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_encodeURI(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_encodeURIComponent(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_escape(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_unescape(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_version(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_gc(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - -private: - static void addFunction(QScriptValueImpl &object, const QString &name, - QScriptInternalFunctionSignature fun, int length, - const QScriptValue::PropertyFlags flags); - - QScriptEnginePrivate *m_engine; - QScriptClassInfo *m_classInfo; -}; - -inline QScriptEnginePrivate *Global::engine() const -{ return m_engine; } - - -} } // namespace QScript::Ecma - -#endif // QT_NO_SCRIPT - -QT_END_NAMESPACE - -#endif diff --git a/src/script/qscriptecmamath.cpp b/src/script/qscriptecmamath.cpp deleted file mode 100644 index e0fcf0a..0000000 --- a/src/script/qscriptecmamath.cpp +++ /dev/null @@ -1,391 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qscriptecmamath_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" - -#include <QtCore/QtDebug> -#include <QtCore/qnumeric.h> -#include <QtCore/QSysInfo> -#include <math.h> - -QT_BEGIN_NAMESPACE - -namespace QScript { namespace Ecma { - -static const qsreal qt_PI = 2.0 * ::asin(1.0); - -Math::Math(QScriptEnginePrivate *engine, QScriptClassInfo *classInfo): - m_engine(engine), - m_classInfo(classInfo) -{ -} - -Math::~Math() -{ -} - -void Math::construct(QScriptValueImpl *object, QScriptEnginePrivate *eng) -{ - QScriptClassInfo *classInfo = eng->registerClass(QLatin1String("Math")); - - Math *instance = new Math(eng, classInfo); - eng->newObject(object, classInfo); - object->setObjectData(instance); - - QScriptValue::PropertyFlags flags = QScriptValue::Undeletable - | QScriptValue::ReadOnly - | QScriptValue::SkipInEnumeration; - - object->setProperty(QLatin1String("E"), - QScriptValueImpl(::exp(1.0)), flags); - object->setProperty(QLatin1String("LN2"), - QScriptValueImpl(::log(2.0)), flags); - object->setProperty(QLatin1String("LN10"), - QScriptValueImpl(::log(10.0)), flags); - object->setProperty(QLatin1String("LOG2E"), - QScriptValueImpl(1.0/::log(2.0)), flags); - object->setProperty(QLatin1String("LOG10E"), - QScriptValueImpl(1.0/::log(10.0)), flags); - object->setProperty(QLatin1String("PI"), - QScriptValueImpl(qt_PI), flags); - object->setProperty(QLatin1String("SQRT1_2"), - QScriptValueImpl(::sqrt(0.5)), flags); - object->setProperty(QLatin1String("SQRT2"), - QScriptValueImpl(::sqrt(2.0)), flags); - - flags = QScriptValue::SkipInEnumeration; - addFunction(*object, QLatin1String("abs"), method_abs, 1, flags); - addFunction(*object, QLatin1String("acos"), method_acos, 1, flags); - addFunction(*object, QLatin1String("asin"), method_asin, 0, flags); - addFunction(*object, QLatin1String("atan"), method_atan, 1, flags); - addFunction(*object, QLatin1String("atan2"), method_atan2, 2, flags); - addFunction(*object, QLatin1String("ceil"), method_ceil, 1, flags); - addFunction(*object, QLatin1String("cos"), method_cos, 1, flags); - addFunction(*object, QLatin1String("exp"), method_exp, 1, flags); - addFunction(*object, QLatin1String("floor"), method_floor, 1, flags); - addFunction(*object, QLatin1String("log"), method_log, 1, flags); - addFunction(*object, QLatin1String("max"), method_max, 2, flags); - addFunction(*object, QLatin1String("min"), method_min, 2, flags); - addFunction(*object, QLatin1String("pow"), method_pow, 2, flags); - addFunction(*object, QLatin1String("random"), method_random, 0, flags); - addFunction(*object, QLatin1String("round"), method_round, 1, flags); - addFunction(*object, QLatin1String("sin"), method_sin, 1, flags); - addFunction(*object, QLatin1String("sqrt"), method_sqrt, 1, flags); - addFunction(*object, QLatin1String("tan"), method_tan, 1, flags); -} - -/* copies the sign from y to x and returns the result */ -static qsreal copySign(qsreal x, qsreal y) -{ - uchar *xch = (uchar *)&x; - uchar *ych = (uchar *)&y; - if (QSysInfo::ByteOrder == QSysInfo::BigEndian) - xch[0] = (xch[0] & 0x7f) | (ych[0] & 0x80); - else - xch[7] = (xch[7] & 0x7f) | (ych[7] & 0x80); - return x; -} - -QScriptValueImpl Math::method_abs(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - qsreal v = context->argument(0).toNumber(); - if (v == 0) // 0 | -0 - return (QScriptValueImpl(0)); - else - return (QScriptValueImpl(v < 0 ? -v : v)); -} - -QScriptValueImpl Math::method_acos(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - qsreal v = context->argument(0).toNumber(); - if (v > 1) - return QScriptValueImpl(qSNaN()); - return (QScriptValueImpl(::acos(v))); -} - -QScriptValueImpl Math::method_asin(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - qsreal v = context->argument(0).toNumber(); - if (v > 1) - return QScriptValueImpl(qSNaN()); - return (QScriptValueImpl(::asin(v))); -} - -QScriptValueImpl Math::method_atan(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - qsreal v = context->argument(0).toNumber(); - if (v == 0.0) - return QScriptValueImpl(v); - return (QScriptValueImpl(::atan(v))); -} - -QScriptValueImpl Math::method_atan2(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - qsreal v1 = context->argument(0).toNumber(); - qsreal v2 = context->argument(1).toNumber(); -#ifdef Q_OS_WINCE - if (v1 == 0.0) { - const bool v1MinusZero = _copysign(1.0, v1) < 0.0; - const bool v2MinusZero = (v2 == 0 && _copysign(1.0, v2) < 0.0); - if ((v1MinusZero && v2MinusZero) || (v1MinusZero && v2 == -1.0)) - return QScriptValueImpl(-qt_PI); - if (v2MinusZero) - return QScriptValueImpl(qt_PI); - if (v1MinusZero && v2 == 1.0) - return QScriptValueImpl(-0.0); -#if defined(_X86_) - if (v2 == 0.0 && (v1MinusZero || (!v1MinusZero && !v2MinusZero))) - return QScriptValueImpl(0.0); -#endif - } -#endif -#if defined(Q_OS_WINCE) && defined(_X86_) - if (v1 == -1.0 && !_finite(v2) && _copysign(1.0, v2) > 0.0) - return QScriptValueImpl(-0.0); -#endif - if ((v1 < 0) && qIsFinite(v1) && qIsInf(v2) && (copySign(1.0, v2) == 1.0)) - return QScriptValueImpl(copySign(0, -1.0)); - if ((v1 == 0.0) && (v2 == 0.0)) { - if ((copySign(1.0, v1) == 1.0) && (copySign(1.0, v2) == -1.0)) - return QScriptValueImpl(qt_PI); - else if ((copySign(1.0, v1) == -1.0) && (copySign(1.0, v2) == -1.0)) - return QScriptValueImpl(-qt_PI); - } - return (QScriptValueImpl(::atan2(v1, v2))); -} - -QScriptValueImpl Math::method_ceil(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - qsreal v = context->argument(0).toNumber(); - if (v < 0.0 && v > -1.0) - return QScriptValueImpl(copySign(0, -1.0)); - return (QScriptValueImpl(::ceil(v))); -} - -QScriptValueImpl Math::method_cos(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - qsreal v = context->argument(0).toNumber(); - return (QScriptValueImpl(::cos(v))); -} - -QScriptValueImpl Math::method_exp(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - qsreal v = context->argument(0).toNumber(); - if (qIsInf(v)) { - if (copySign(1.0, v) == -1.0) - return QScriptValueImpl(0); - else - return QScriptValueImpl(qInf()); - } - return (QScriptValueImpl(::exp(v))); -} - -QScriptValueImpl Math::method_floor(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - qsreal v = context->argument(0).toNumber(); - return (QScriptValueImpl(::floor(v))); -} - -QScriptValueImpl Math::method_log(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - qsreal v = context->argument(0).toNumber(); - if (v < 0) - return QScriptValueImpl(qSNaN()); - return (QScriptValueImpl(::log(v))); -} - -QScriptValueImpl Math::method_max(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - qsreal mx = -qInf(); - for (int i = 0; i < context->argumentCount(); ++i) { - qsreal x = context->argument(i).toNumber(); - if (x > mx || qIsNaN(x)) - mx = x; - } - return (QScriptValueImpl(mx)); -} - -QScriptValueImpl Math::method_min(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - qsreal mx = qInf(); - for (int i = 0; i < context->argumentCount(); ++i) { - qsreal x = context->argument(i).toNumber(); - if ((x == 0 && mx == x && copySign(1.0, x) == -1.0) - || (x < mx) || qIsNaN(x)) { - mx = x; - } - } - return (QScriptValueImpl(mx)); -} - -QScriptValueImpl Math::method_pow(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - qsreal x = context->argument(0).toNumber(); - qsreal y = context->argument(1).toNumber(); - if (qIsNaN(y)) - return QScriptValueImpl(qSNaN()); - if (y == 0) - return QScriptValueImpl(1); - if (((x == 1) || (x == -1)) && qIsInf(y)) - return QScriptValueImpl(qSNaN()); - if (((x == 0) && copySign(1.0, x) == 1.0) && (y < 0)) - return QScriptValueImpl(qInf()); - if ((x == 0) && copySign(1.0, x) == -1.0) { - if (y < 0) { - if (::fmod(-y, 2.0) == 1.0) - return QScriptValueImpl(-qInf()); - else - return QScriptValueImpl(qInf()); - } else if (y > 0) { - if (::fmod(y, 2.0) == 1.0) - return QScriptValueImpl(copySign(0, -1.0)); - else - return QScriptValueImpl(0); - } - } -#ifdef Q_OS_AIX - if (qIsInf(x) && copySign(1.0, x) == -1.0) { - if (y > 0) { - if (::fmod(y, 2.0) == 1.0) - return QScriptValueImpl(-qInf()); - else - return QScriptValueImpl(qInf()); - } else if (y < 0) { - if (::fmod(-y, 2.0) == 1.0) - return QScriptValueImpl(copySign(0, -1.0)); - else - return QScriptValueImpl(0); - } - } -#endif - return (QScriptValueImpl(::pow(x, y))); -} - -QScriptValueImpl Math::method_random(QScriptContextPrivate *, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - return (QScriptValueImpl(qrand() / (qsreal) RAND_MAX)); -} - -QScriptValueImpl Math::method_round(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - qsreal v = context->argument(0).toNumber(); - v = copySign(::floor(v + 0.5), v); - return (QScriptValueImpl(v)); -} - -QScriptValueImpl Math::method_sin(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - qsreal v = context->argument(0).toNumber(); - return (QScriptValueImpl(::sin(v))); -} - -QScriptValueImpl Math::method_sqrt(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - qsreal v = context->argument(0).toNumber(); - return (QScriptValueImpl(::sqrt(v))); -} - -QScriptValueImpl Math::method_tan(QScriptContextPrivate *context, - QScriptEnginePrivate *, - QScriptClassInfo *) -{ - qsreal v = context->argument(0).toNumber(); - if (v == 0.0) - return QScriptValueImpl(v); - return (QScriptValueImpl(::tan(v))); -} - -void Math::addFunction(QScriptValueImpl &object, const QString &name, - QScriptInternalFunctionSignature fun, int length, - const QScriptValue::PropertyFlags flags) -{ - QScriptEnginePrivate *eng_p = object.engine(); - QScriptValueImpl val = eng_p->createFunction(fun, length, object.classInfo(), name); - object.setProperty(name, val, flags); -} - -} } // namespace QScript::Ecma - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT diff --git a/src/script/qscriptecmamath_p.h b/src/script/qscriptecmamath_p.h deleted file mode 100644 index 3a850c2..0000000 --- a/src/script/qscriptecmamath_p.h +++ /dev/null @@ -1,158 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTECMAMATH_P_H -#define QSCRIPTECMAMATH_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 "qscriptobjectdata_p.h" -#include "qscriptfunction_p.h" -#include "qscriptvalue.h" - -QT_BEGIN_NAMESPACE - -class QScriptEnginePrivate; -class QScriptContextPrivate; -class QScriptClassInfo; -class QScriptValueImpl; - -#ifndef QT_NO_SCRIPT - -namespace QScript { namespace Ecma { - -class Math: public QScriptObjectData -{ -protected: - Math(QScriptEnginePrivate *engine, QScriptClassInfo *classInfo); - -public: - virtual ~Math(); - - static void construct(QScriptValueImpl *object, QScriptEnginePrivate *eng); - - inline QScriptEnginePrivate *engine() const; - -protected: - static QScriptValueImpl method_abs(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_acos(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_asin(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_atan(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_atan2(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_ceil(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_cos(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_exp(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_floor(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_log(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_max(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_min(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_pow(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_random(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_round(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_sin(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_sqrt(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_tan(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - -private: - static void addFunction(QScriptValueImpl &object, const QString &name, - QScriptInternalFunctionSignature fun, int length, - const QScriptValue::PropertyFlags flags); - - QScriptEnginePrivate *m_engine; - QScriptClassInfo *m_classInfo; -}; - -inline QScriptEnginePrivate *Math::engine() const -{ return m_engine; } - - -} } // namespace QScript::Ecma - -#endif // QT_NO_SCRIPT - -QT_END_NAMESPACE - -#endif diff --git a/src/script/qscriptecmanumber.cpp b/src/script/qscriptecmanumber.cpp deleted file mode 100644 index 7d3d903..0000000 --- a/src/script/qscriptecmanumber.cpp +++ /dev/null @@ -1,268 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qscriptecmanumber_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" - -#include <QtCore/QtDebug> -#include <QtCore/qnumeric.h> -#include <math.h> - -QT_BEGIN_NAMESPACE - -namespace QScript { namespace Ecma { - -Number::Number(QScriptEnginePrivate *eng): - Core(eng, QLatin1String("Number"), QScriptClassInfo::NumberType) -{ - newNumber(&publicPrototype, 0); - - eng->newConstructor(&ctor, this, publicPrototype); - - addPrototypeFunction(QLatin1String("toString"), method_toString, 0); - addPrototypeFunction(QLatin1String("toLocaleString"), method_toLocaleString, 0); - addPrototypeFunction(QLatin1String("valueOf"), method_valueOf, 0); - addPrototypeFunction(QLatin1String("toFixed"), method_toFixed, 1); - addPrototypeFunction(QLatin1String("toExponential"), method_toExponential, 1); - addPrototypeFunction(QLatin1String("toPrecision"), method_toPrecision, 1); - - QScriptValue::PropertyFlags flags = QScriptValue::Undeletable - | QScriptValue::ReadOnly - | QScriptValue::SkipInEnumeration; - ctor.setProperty(QLatin1String("NaN"), - QScriptValueImpl(qSNaN()), flags); - ctor.setProperty(QLatin1String("NEGATIVE_INFINITY"), - QScriptValueImpl(-qInf()), flags); - ctor.setProperty(QLatin1String("POSITIVE_INFINITY"), - QScriptValueImpl(qInf()), flags); - ctor.setProperty(QLatin1String("MAX_VALUE"), - QScriptValueImpl(1.7976931348623158e+308), flags); -#ifdef __INTEL_COMPILER -# pragma warning( push ) -# pragma warning(disable: 239) -#endif - ctor.setProperty(QLatin1String("MIN_VALUE"), - QScriptValueImpl(5e-324), flags); -#ifdef __INTEL_COMPILER -# pragma warning( pop ) -#endif -} - -Number::~Number() -{ -} - -void Number::execute(QScriptContextPrivate *context) -{ -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - engine()->notifyFunctionEntry(context); -#endif - qsreal value; - if (context->argumentCount() > 0) - value = context->argument(0).toNumber(); - else - value = 0; - - QScriptValueImpl num(value); - if (!context->isCalledAsConstructor()) { - context->setReturnValue(num); - } else { - QScriptValueImpl &obj = context->m_thisObject; - obj.setClassInfo(classInfo()); - obj.setInternalValue(num); - obj.setPrototype(publicPrototype); - context->setReturnValue(obj); - } -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - engine()->notifyFunctionExit(context); -#endif -} - -void Number::newNumber(QScriptValueImpl *result, qsreal value) -{ - engine()->newObject(result, publicPrototype, classInfo()); - result->setInternalValue(QScriptValueImpl(value)); -} - -QScriptValueImpl Number::method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() != classInfo) { - return throwThisObjectTypeError( - context, QLatin1String("Number.prototype.toString")); - } - QScriptValueImpl arg = context->argument(0); - if (!arg.isUndefined()) { - int radix = arg.toInt32(); - if (radix < 2 || radix > 36) - return context->throwError(QString::fromLatin1("Number.prototype.toString: %0 is not a valid radix") - .arg(radix)); - if (radix != 10) { - QString str; - qsreal num = self.internalValue().toNumber(); - if (qIsNaN(num)) - return QScriptValueImpl(eng, QLatin1String("NaN")); - else if (qIsInf(num)) - return QScriptValueImpl(eng, QLatin1String(num < 0 ? "-Infinity" : "Infinity")); - bool negative = false; - if (num < 0) { - negative = true; - num = -num; - } - qsreal frac = num - ::floor(num); - num = QScriptEnginePrivate::toInteger(num); - do { - char c = (char)::fmod(num, radix); - c = (c < 10) ? (c + '0') : (c - 10 + 'a'); - str.prepend(QLatin1Char(c)); - num = ::floor(num / radix); - } while (num != 0); - if (frac != 0) { - str.append(QLatin1Char('.')); - do { - frac = frac * radix; - char c = (char)::floor(frac); - c = (c < 10) ? (c + '0') : (c - 10 + 'a'); - str.append(QLatin1Char(c)); - frac = frac - ::floor(frac); - } while (frac != 0); - } - if (negative) - str.prepend(QLatin1Char('-')); - return QScriptValueImpl(eng, str); - } - } - QString str = self.internalValue().toString(); - return (QScriptValueImpl(eng, str)); -} - -QScriptValueImpl Number::method_toLocaleString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() != classInfo) { - return throwThisObjectTypeError( - context, QLatin1String("Number.prototype.toLocaleString")); - } - QString str = self.internalValue().toString(); - return (QScriptValueImpl(eng, str)); -} - -QScriptValueImpl Number::method_valueOf(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() != classInfo) { - return throwThisObjectTypeError( - context, QLatin1String("Number.prototype.valueOf")); - } - return (self.internalValue()); -} - -QScriptValueImpl Number::method_toFixed(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() != classInfo) { - return throwThisObjectTypeError( - context, QLatin1String("Number.prototype.toFixed")); - } - qsreal fdigits = 0; - - if (context->argumentCount() > 0) - fdigits = context->argument(0).toInteger(); - - if (qIsNaN(fdigits)) - fdigits = 0; - - qsreal v = self.internalValue().toNumber(); - QString str; - if (qIsNaN(v)) - str = QString::fromLatin1("NaN"); - else if (qIsInf(v)) - str = QString::fromLatin1(v < 0 ? "-Infinity" : "Infinity"); - else - str = QString::number(v, 'f', int (fdigits)); - return (QScriptValueImpl(eng, str)); -} - -QScriptValueImpl Number::method_toExponential(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() != classInfo) { - return throwThisObjectTypeError( - context, QLatin1String("Number.prototype.toExponential")); - } - qsreal fdigits = 0; - - if (context->argumentCount() > 0) - fdigits = context->argument(0).toInteger(); - - qsreal v = self.internalValue().toNumber(); - QString z = QString::number(v, 'e', int (fdigits)); - return (QScriptValueImpl(eng, z)); -} - -QScriptValueImpl Number::method_toPrecision(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() != classInfo) { - return throwThisObjectTypeError( - context, QLatin1String("Number.prototype.toPrecision")); - } - qsreal fdigits = 0; - - if (context->argumentCount() > 0) - fdigits = context->argument(0).toInteger(); - - qsreal v = self.internalValue().toNumber(); - return (QScriptValueImpl(eng, QString::number(v, 'g', int (fdigits)))); -} - -} } // namespace QScript::Ecma - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT diff --git a/src/script/qscriptecmanumber_p.h b/src/script/qscriptecmanumber_p.h deleted file mode 100644 index 55e2cf9..0000000 --- a/src/script/qscriptecmanumber_p.h +++ /dev/null @@ -1,89 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTECMANUMBER_P_H -#define QSCRIPTECMANUMBER_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 "qscriptecmacore_p.h" - -#ifndef QT_NO_SCRIPT - -QT_BEGIN_NAMESPACE - -namespace QScript { namespace Ecma { - -class Number: public Core -{ -public: - Number(QScriptEnginePrivate *engine); - virtual ~Number(); - - virtual void execute(QScriptContextPrivate *context); - - void newNumber(QScriptValueImpl *result, double value = 0); - -protected: - static QScriptValueImpl method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo); - static QScriptValueImpl method_toLocaleString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo); - static QScriptValueImpl method_valueOf(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo); - static QScriptValueImpl method_toFixed(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo); - static QScriptValueImpl method_toExponential(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo); - static QScriptValueImpl method_toPrecision(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo); -}; - -} } // namespace QScript::Ecma - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptecmaobject.cpp b/src/script/qscriptecmaobject.cpp deleted file mode 100644 index c4a1b08..0000000 --- a/src/script/qscriptecmaobject.cpp +++ /dev/null @@ -1,238 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qscriptecmaobject_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" - -#include <QtCore/QtDebug> - -QT_BEGIN_NAMESPACE - -namespace QScript { namespace Ecma { - -Object::Object(QScriptEnginePrivate *eng, QScriptClassInfo *classInfo): - Core(eng, classInfo) -{ - newObject(&publicPrototype, eng->nullValue()); -} - -Object::~Object() -{ -} - -void Object::initialize() -{ - QScriptEnginePrivate *eng = engine(); - - eng->newConstructor(&ctor, this, publicPrototype); - - addPrototypeFunction(QLatin1String("toString"), method_toString, 1); - addPrototypeFunction(QLatin1String("toLocaleString"), method_toLocaleString, 1); - addPrototypeFunction(QLatin1String("valueOf"), method_valueOf, 0); - addPrototypeFunction(QLatin1String("hasOwnProperty"), method_hasOwnProperty, 1); - addPrototypeFunction(QLatin1String("isPrototypeOf"), method_isPrototypeOf, 1); - addPrototypeFunction(QLatin1String("propertyIsEnumerable"), method_propertyIsEnumerable, 1); - addPrototypeFunction(QLatin1String("__defineGetter__"), method_defineGetter, 2); - addPrototypeFunction(QLatin1String("__defineSetter__"), method_defineSetter, 2); -} - -void Object::execute(QScriptContextPrivate *context) -{ -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - engine()->notifyFunctionEntry(context); -#endif - QScriptValueImpl value; - - if (context->argumentCount() > 0) - value = engine()->toObject(context->argument(0)); - else - value.invalidate(); - - if (! value.isValid()) - newObject(&value); - - context->setReturnValue(value); -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - engine()->notifyFunctionExit(context); -#endif -} - -void Object::newObject(QScriptValueImpl *result, const QScriptValueImpl &proto) -{ - engine()->newObject(result, proto, classInfo()); -} - -QScriptValueImpl Object::method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QScriptValueImpl glo = eng->globalObject(); - QString s = QLatin1String("[object "); - QScriptValueImpl self = context->thisObject(); - s += self.classInfo()->name(); - s += QLatin1Char(']'); - return (QScriptValueImpl(eng, s)); -} - -QScriptValueImpl Object::method_toLocaleString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - return method_toString(context, eng, classInfo); -} - -QScriptValueImpl Object::method_valueOf(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *) -{ - return (context->thisObject()); -} - -QScriptValueImpl Object::method_hasOwnProperty(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - bool result = false; - - if (context->thisObject().isObject() && (context->argumentCount() > 0)) { - QScriptValueImpl arg = context->argument(0); - - QScriptNameIdImpl *id = 0; - if (arg.isString()) - id = arg.stringValue(); - - if (! id || ! id->unique) { - QString str = arg.toString(); - id = eng->nameId(str); - } - - QScript::Member member; - QScriptValueImpl base; - QScriptValueImpl self = context->thisObject(); - if (self.resolve(id, &member, &base, QScriptValue::ResolveLocal, QScript::Read)) - result = true; - } - - return (QScriptValueImpl(result)); -} - -QScriptValueImpl Object::method_isPrototypeOf(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *) -{ - bool result = false; - - if (context->thisObject().isObject() && (context->argumentCount() > 0)) { - QScriptValueImpl arg = context->argument(0); - - if (arg.isObject()) { - QScriptValueImpl proto = arg.prototype(); - - if (proto.isObject()) { - QScriptValueImpl self = context->thisObject(); - result = self.objectValue() == proto.objectValue(); - } - } - } - - return (QScriptValueImpl(result)); -} - -QScriptValueImpl Object::method_propertyIsEnumerable(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - bool result = false; - - if (context->thisObject().isObject() && (context->argumentCount() > 0)) { - QScriptValueImpl arg = context->argument(0); - - QScriptNameIdImpl *id = 0; - if (arg.isString()) - id = arg.stringValue(); - - if (! id || ! id->unique) { - QString str = arg.toString(); - id = eng->nameId(str); - } - - QScript::Member member; - QScriptValueImpl base; - QScriptValueImpl self = context->thisObject(); - if (self.resolve(id, &member, &base, QScriptValue::ResolveLocal, QScript::Read)) { - result = ! member.dontEnum(); - if (result) { - QScriptValueImpl tmp; - base.get(member, &tmp); - result = tmp.isValid(); - } - } - } - - return (QScriptValueImpl(result)); -} - -QScriptValueImpl Object::method_defineGetter(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *) -{ - QString propertyName = context->argument(0).toString(); - if (context->thisObject().propertyFlags(propertyName) & QScriptValue::ReadOnly) - return context->throwError(QLatin1String("cannot redefine read-only property")); - QScriptValueImpl getter = context->argument(1); - if (!getter.isFunction()) - return context->throwError(QLatin1String("getter must be a function")); - context->thisObject().setProperty(propertyName, getter, QScriptValue::PropertyGetter); - return eng->undefinedValue(); -} - -QScriptValueImpl Object::method_defineSetter(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *) -{ - QString propertyName = context->argument(0).toString(); - if (context->thisObject().propertyFlags(propertyName) & QScriptValue::ReadOnly) - return context->throwError(QLatin1String("cannot redefine read-only property")); - QScriptValueImpl setter = context->argument(1); - if (!setter.isFunction()) - return context->throwError(QLatin1String("setter must be a function")); - context->thisObject().setProperty(propertyName, setter, QScriptValue::PropertySetter); - return eng->undefinedValue(); -} - -} } // namespace QScript::Ecma - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT diff --git a/src/script/qscriptecmaobject_p.h b/src/script/qscriptecmaobject_p.h deleted file mode 100644 index d55a425..0000000 --- a/src/script/qscriptecmaobject_p.h +++ /dev/null @@ -1,109 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTECMAOBJECT_P_H -#define QSCRIPTECMAOBJECT_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 "qscriptecmacore_p.h" - -#ifndef QT_NO_SCRIPT - -QT_BEGIN_NAMESPACE - -namespace QScript { namespace Ecma { - -class Object: public Core -{ -public: - Object(QScriptEnginePrivate *engine, QScriptClassInfo *classInfo); - virtual ~Object(); - - void initialize(); - - virtual void execute(QScriptContextPrivate *context); - - void newObject(QScriptValueImpl *result, const QScriptValueImpl &proto = QScriptValueImpl()); - -protected: - static QScriptValueImpl method_toString(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_toLocaleString(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_valueOf(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_hasOwnProperty(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_isPrototypeOf(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_propertyIsEnumerable(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_defineGetter(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_defineSetter(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); -}; - -} } // namespace QScript::Ecma - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptecmaregexp.cpp b/src/script/qscriptecmaregexp.cpp deleted file mode 100644 index 4aef611..0000000 --- a/src/script/qscriptecmaregexp.cpp +++ /dev/null @@ -1,339 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qscriptecmaregexp_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" - -#include <QtCore/QStringList> -#include <QtCore/QRegExp> -#include <QtCore/QtDebug> - -QT_BEGIN_NAMESPACE - -namespace QScript { namespace Ecma { - -RegExp::RegExp(QScriptEnginePrivate *eng): - Core(eng, QLatin1String("RegExp"), QScriptClassInfo::RegExpType) -{ - newRegExp(&publicPrototype, QString(), /*flags=*/0); - - eng->newConstructor(&ctor, this, publicPrototype); - - addPrototypeFunction(QLatin1String("exec"), method_exec, 1); - addPrototypeFunction(QLatin1String("test"), method_test, 1); - addPrototypeFunction(QLatin1String("toString"), method_toString, 1); -} - -RegExp::~RegExp() -{ -} - -RegExp::Instance *RegExp::Instance::get(const QScriptValueImpl &object, QScriptClassInfo *klass) -{ - if (! klass || klass == object.classInfo()) - return static_cast<Instance*> (object.objectData()); - - return 0; -} - -void RegExp::execute(QScriptContextPrivate *context) -{ -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - engine()->notifyFunctionEntry(context); -#endif - QString P; - int F; - QScriptValueImpl pattern = context->argument(0); - QScriptValueImpl flags = context->argument(1); - if (!context->isCalledAsConstructor()) { - if ((pattern.classInfo() == classInfo()) && flags.isUndefined()) { - context->m_result = pattern; - goto Lout; - } - } - if (pattern.classInfo() == classInfo()) { - if (!flags.isUndefined()) { - context->throwTypeError(QString::fromLatin1("cannot specify flags when creating a copy of a RegExp")); - goto Lout; - } - Instance *data = Instance::get(pattern, classInfo()); -#ifndef QT_NO_REGEXP - P = data->value.pattern(); -#else - P = data->pattern; -#endif - F = data->flags; - } else { - if (!pattern.isUndefined()) - P = pattern.toString(); - F = 0; - if (!flags.isUndefined()) { - QString flagsStr = flags.toString(); - for (int i = 0; i < flagsStr.length(); ++i) { - int bitflag = flagFromChar(flagsStr.at(i)); - if (bitflag == 0) { - context->throwError( - QScriptContext::SyntaxError, - QString::fromUtf8("invalid regular expression flag '%0'") - .arg(flagsStr.at(i))); - goto Lout; - } - F |= bitflag; - } - } - } - if (context->isCalledAsConstructor()) { - QScriptValueImpl &object = context->m_thisObject; - object.setClassInfo(classInfo()); - object.setPrototype(publicPrototype); -#ifndef QT_NO_REGEXP - initRegExp(&object, toRegExp(P, F), F); -#else - initRegExp(&object, P, F); -#endif - } else { - newRegExp(&context->m_result, P, F); - } - Lout: ; -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - engine()->notifyFunctionExit(context); -#endif -} - -void RegExp::newRegExp(QScriptValueImpl *result, const QString &pattern, int flags) -{ -#ifndef QT_NO_REGEXP - QRegExp rx = toRegExp(pattern, flags); - newRegExp_helper(result, rx, flags); -#else - engine()->newObject(result, publicPrototype, classInfo()); - initRegExp(result, pattern, flags); -#endif // QT_NO_REGEXP -} - -#ifndef QT_NO_REGEXP -void RegExp::newRegExp(QScriptValueImpl *result, const QRegExp &rx, int flags) -{ - Q_ASSERT(!(flags & IgnoreCase) || (rx.caseSensitivity() == Qt::CaseInsensitive)); - newRegExp_helper(result, rx, flags); -} - -void RegExp::newRegExp_helper(QScriptValueImpl *result, const QRegExp &rx, - int flags) -{ - engine()->newObject(result, publicPrototype, classInfo()); - initRegExp(result, rx, flags); -} - -QRegExp RegExp::toRegExp(const QScriptValueImpl &value) const -{ - Instance *rx_data = Instance::get(value, classInfo()); - Q_ASSERT(rx_data != 0); - return rx_data->value; -} - -QRegExp RegExp::toRegExp(const QString &pattern, int flags) -{ - bool ignoreCase = (flags & IgnoreCase) != 0; - return QRegExp(pattern, - (ignoreCase ? Qt::CaseInsensitive: Qt::CaseSensitive), - QRegExp::RegExp2); -} - -#endif // QT_NO_REGEXP - -void RegExp::initRegExp(QScriptValueImpl *result, -#ifndef QT_NO_REGEXP - const QRegExp &rx, -#else - const QString &pattern, -#endif - int flags) -{ - Instance *instance = new Instance(); -#ifndef QT_NO_REGEXP - instance->value = rx; -#else - instance->pattern = pattern; -#endif - instance->flags = flags; - result->setObjectData(instance); - - bool global = (flags & Global) != 0; - bool ignoreCase = (flags & IgnoreCase) != 0; - bool multiline = (flags & Multiline) != 0; - - QScriptValue::PropertyFlags propertyFlags = QScriptValue::SkipInEnumeration - | QScriptValue::Undeletable - | QScriptValue::ReadOnly; - - result->setProperty(QLatin1String("global"), QScriptValueImpl(global), - propertyFlags); - result->setProperty(QLatin1String("ignoreCase"), QScriptValueImpl(ignoreCase), - propertyFlags); - result->setProperty(QLatin1String("multiline"), QScriptValueImpl(multiline), - propertyFlags); -#ifndef QT_NO_REGEXP - const QString &pattern = rx.pattern(); -#endif - result->setProperty(QLatin1String("source"), QScriptValueImpl(engine(), pattern), - propertyFlags); - result->setProperty(QLatin1String("lastIndex"), QScriptValueImpl(0), - propertyFlags & ~QScriptValue::ReadOnly); -} - -int RegExp::flagFromChar(const QChar &ch) -{ - static QHash<QChar, int> flagsHash; - if (flagsHash.isEmpty()) { - flagsHash[QLatin1Char('g')] = Global; - flagsHash[QLatin1Char('i')] = IgnoreCase; - flagsHash[QLatin1Char('m')] = Multiline; - } - QHash<QChar, int>::const_iterator it; - it = flagsHash.constFind(ch); - if (it == flagsHash.constEnd()) - return 0; - return it.value(); -} - -QString RegExp::flagsToString(int flags) -{ - QString result; - if (flags & Global) - result += QLatin1Char('g'); - if (flags & IgnoreCase) - result += QLatin1Char('i'); - if (flags & Multiline) - result += QLatin1Char('m'); - return result; -} - -QScriptValueImpl RegExp::method_exec(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() != classInfo) { - return throwThisObjectTypeError( - context, QLatin1String("RegExp.prototype.exec")); - } - Instance *rx_data = Instance::get(self, classInfo); - Q_ASSERT(rx_data != 0); - - QString S = context->argument(0).toString(); - int length = S.length(); - QScriptValueImpl lastIndex = self.property(QLatin1String("lastIndex")); - - int i = lastIndex.isValid() ? int (lastIndex.toInteger()) : 0; - bool global = self.property(QLatin1String("global")).toBoolean(); - - if (! global) - i = 0; - - if (i < 0 || i >= length) - return (eng->nullValue()); - -#ifndef QT_NO_REGEXP - int index = rx_data->value.indexIn(S, i); - if (index == -1) -#endif // QT_NO_REGEXP - return eng->nullValue(); - -#ifndef QT_NO_REGEXP - int e = index + rx_data->value.matchedLength(); - - if (global) - self.setProperty(QLatin1String("lastIndex"), QScriptValueImpl(e)); - - QScript::Array elts(eng); - QStringList capturedTexts = rx_data->value.capturedTexts(); - for (int i = 0; i < capturedTexts.count(); ++i) - elts.assign(i, QScriptValueImpl(eng, capturedTexts.at(i))); - - QScriptValueImpl r = eng->newArray(elts); - - r.setProperty(QLatin1String("index"), QScriptValueImpl(index)); - r.setProperty(QLatin1String("input"), QScriptValueImpl(eng, S)); - - return r; -#endif // QT_NO_REGEXP -} - -QScriptValueImpl RegExp::method_test(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - QScriptValueImpl r = method_exec(context, eng, classInfo); - return QScriptValueImpl(!r.isNull()); -} - -QScriptValueImpl RegExp::method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - if (Instance *instance = Instance::get(context->thisObject(), classInfo)) { - QString result; - result += QLatin1Char('/'); -#ifndef QT_NO_REGEXP - const QString &pattern = instance->value.pattern(); -#else - const QString &pattern = instance->pattern; -#endif - if (pattern.isEmpty()) - result += QLatin1String("(?:)"); - else - result += pattern; // ### quote - result += QLatin1Char('/'); - result += flagsToString(instance->flags); - return (QScriptValueImpl(eng, result)); - } - - return throwThisObjectTypeError( - context, QLatin1String("RegExp.prototype.toString")); -} - -} } // namespace QScript::Ecma - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT diff --git a/src/script/qscriptecmaregexp_p.h b/src/script/qscriptecmaregexp_p.h deleted file mode 100644 index 77fe467..0000000 --- a/src/script/qscriptecmaregexp_p.h +++ /dev/null @@ -1,142 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTECMAREGEXP_P_H -#define QSCRIPTECMAREGEXP_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 <QtCore/QRegExp> - -#ifndef QT_NO_SCRIPT - -#include "qscriptecmacore_p.h" - -QT_BEGIN_NAMESPACE - -namespace QScript { namespace Ecma { - -class RegExp: public Core -{ -public: - enum RegExpFlag { - Global = 0x01, - IgnoreCase = 0x02, - Multiline = 0x04 - }; - - RegExp(QScriptEnginePrivate *engine); - virtual ~RegExp(); - - virtual void execute(QScriptContextPrivate *context); - - class Instance: public QScriptObjectData { - public: - Instance() : flags(0) {} - virtual ~Instance() {} - - static Instance *get(const QScriptValueImpl &object, - QScriptClassInfo *klass); - - public: // attributes -#ifndef QT_NO_REGEXP - QRegExp value; -#else - QString pattern; -#endif - int flags; - }; - - inline Instance *get(const QScriptValueImpl &object) const - { return Instance::get(object, classInfo()); } - - void newRegExp(QScriptValueImpl *result, const QString &pattern, - int flags); -#ifndef QT_NO_REGEXP - void newRegExp(QScriptValueImpl *result, const QRegExp &rx, - int flags = 0); - QRegExp toRegExp(const QScriptValueImpl &value) const; - static QRegExp toRegExp(const QString &pattern, int flags); -#endif - - static int flagFromChar(const QChar &ch); - static QString flagsToString(int flags); - -protected: - static QScriptValueImpl method_exec(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_test(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_toString(QScriptContextPrivate *context, - QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - -private: -#ifndef QT_NO_REGEXP - void newRegExp_helper(QScriptValueImpl *result, const QRegExp &rx, - int flags); -#endif - void initRegExp(QScriptValueImpl *result, -#ifndef QT_NO_REGEXP - const QRegExp &rx, -#else - const QString &pattern, -#endif - int flags); -}; - -} } // namespace QScript::Ecma - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT -#endif // QSCRIPTECMAREGEXP_P_H diff --git a/src/script/qscriptecmastring.cpp b/src/script/qscriptecmastring.cpp deleted file mode 100644 index 3c04375..0000000 --- a/src/script/qscriptecmastring.cpp +++ /dev/null @@ -1,778 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qscriptecmastring_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" -#include "qscriptclassdata_p.h" - -#include <QtCore/QStringList> -#include <QtCore/QtDebug> -#include <QtCore/qnumeric.h> - -#include <limits.h> - -QT_BEGIN_NAMESPACE - -namespace QScript { namespace Ecma { - -class StringClassData: public QScriptClassData -{ - QScriptClassInfo *m_classInfo; - -public: - StringClassData(QScriptClassInfo *classInfo); - virtual ~StringClassData(); - - inline QScriptClassInfo *classInfo() const - { return m_classInfo; } - - virtual bool resolve(const QScriptValueImpl &object, - QScriptNameIdImpl *nameId, - QScript::Member *member, QScriptValueImpl *base, - QScript::AccessMode access); - virtual bool get(const QScriptValueImpl &object, const Member &member, - QScriptValueImpl *out_value); - virtual bool put(QScriptValueImpl *object, const Member &member, - const QScriptValueImpl &value); - virtual QScriptClassDataIterator *newIterator(const QScriptValueImpl &object); -}; - -class StringClassDataIterator: public QScriptClassDataIterator -{ -public: - StringClassDataIterator(int length); - virtual ~StringClassDataIterator(); - - virtual bool hasNext() const; - virtual void next(QScript::Member *member); - - virtual bool hasPrevious() const; - virtual void previous(QScript::Member *member); - - virtual void toFront(); - virtual void toBack(); - -private: - int m_length; - int m_pos; -}; - -StringClassData::StringClassData(QScriptClassInfo *classInfo): - m_classInfo(classInfo) -{ -} - -StringClassData::~StringClassData() -{ -} - -bool StringClassData::resolve(const QScriptValueImpl &object, - QScriptNameIdImpl *nameId, - QScript::Member *member, - QScriptValueImpl *base, - QScript::AccessMode /*access*/) -{ - if (object.classInfo() != classInfo()) - return false; - - QScriptEnginePrivate *eng = object.engine(); - - if (nameId == eng->idTable()->id_length) { - member->native(nameId, /*id=*/ 0, - QScriptValue::Undeletable - | QScriptValue::ReadOnly - | QScriptValue::SkipInEnumeration); - *base = object; - return true; - } - - bool ok = false; - int index = nameId->s.toInt(&ok); - if (!ok || (index < 0)) - return false; - - QScriptNameIdImpl *ref = object.internalValue().stringValue(); - if (index >= ref->s.length()) - return false; - - member->native(nameId, index, QScriptValue::Undeletable | QScriptValue::ReadOnly); - return true; -} - -bool StringClassData::get(const QScriptValueImpl &object, - const QScript::Member &member, - QScriptValueImpl *result) -{ - Q_ASSERT(member.isValid()); - - if (object.classInfo() != classInfo()) - return false; - - QScriptEnginePrivate *eng = object.engine(); - if (! member.isNativeProperty()) - return false; - - QScriptNameIdImpl *ref = object.internalValue().stringValue(); - int len = ref->s.length(); - - if (member.nameId() == eng->idTable()->id_length) - *result = QScriptValueImpl(len); - - else if (member.id() >= 0 && member.id() < len) - eng->newString(result, ref->s.at(member.id())); - - else - *result = eng->undefinedValue(); - - return true; -} - -bool StringClassData::put(QScriptValueImpl *, const Member &, - const QScriptValueImpl &) -{ - // writes to string elements are ignored - return true; -} - -QScriptClassDataIterator *StringClassData::newIterator(const QScriptValueImpl &object) -{ - QScriptNameIdImpl *id = object.internalValue().stringValue(); - return new StringClassDataIterator(id->s.length()); -} - -StringClassDataIterator::StringClassDataIterator(int length) -{ - m_length = length; - m_pos = 0; -} - -StringClassDataIterator::~StringClassDataIterator() -{ -} - -bool StringClassDataIterator::hasNext() const -{ - return m_pos < m_length; -} - -void StringClassDataIterator::next(QScript::Member *member) -{ - member->native(/*nameId=*/ 0, m_pos, QScriptValue::Undeletable | QScriptValue::ReadOnly); - ++m_pos; -} - -bool StringClassDataIterator::hasPrevious() const -{ - return (m_pos - 1) >= 0; -} - -void StringClassDataIterator::previous(QScript::Member *member) -{ - --m_pos; - member->native(/*nameId=*/ 0, m_pos, QScriptValue::Undeletable | QScriptValue::ReadOnly); -} - -void StringClassDataIterator::toFront() -{ - m_pos = 0; -} - -void StringClassDataIterator::toBack() -{ - m_pos = m_length; -} - - - -String::String(QScriptEnginePrivate *eng): - Core(eng, QLatin1String("String"), QScriptClassInfo::StringType) -{ - classInfo()->setData(new StringClassData(classInfo())); - - newString(&publicPrototype, QString()); - - eng->newConstructor(&ctor, this, publicPrototype); - - addPrototypeFunction(QLatin1String("toString"), method_toString, 0); - addPrototypeFunction(QLatin1String("valueOf"), method_valueOf, 0); - addPrototypeFunction(QLatin1String("charAt"), method_charAt, 1); - addPrototypeFunction(QLatin1String("charCodeAt"), method_charCodeAt, 1); - addPrototypeFunction(QLatin1String("concat"), method_concat, 1); - addPrototypeFunction(QLatin1String("indexOf"), method_indexOf, 1); - addPrototypeFunction(QLatin1String("lastIndexOf"), method_lastIndexOf, 1); - addPrototypeFunction(QLatin1String("localeCompare"), method_localeCompare, 1); - addPrototypeFunction(QLatin1String("match"), method_match, 1); - addPrototypeFunction(QLatin1String("replace"), method_replace, 2); - addPrototypeFunction(QLatin1String("search"), method_search, 1); - addPrototypeFunction(QLatin1String("slice"), method_slice, 2); - addPrototypeFunction(QLatin1String("split"), method_split, 2); - addPrototypeFunction(QLatin1String("substr"), method_substr, 2); - addPrototypeFunction(QLatin1String("substring"), method_substring, 2); - addPrototypeFunction(QLatin1String("toLowerCase"), method_toLowerCase, 0); - addPrototypeFunction(QLatin1String("toLocaleLowerCase"), method_toLocaleLowerCase, 0); - addPrototypeFunction(QLatin1String("toUpperCase"), method_toUpperCase, 0); - addPrototypeFunction(QLatin1String("toLocaleUpperCase"), method_toLocaleUpperCase, 0); - - addConstructorFunction(QLatin1String("fromCharCode"), method_fromCharCode, 1); -} - -String::~String() -{ -} - -void String::execute(QScriptContextPrivate *context) -{ -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - engine()->notifyFunctionEntry(context); -#endif - QString value; - - if (context->argumentCount() > 0) - value = context->argument(0).toString(); - - QScriptValueImpl str(engine(), value); - if (!context->isCalledAsConstructor()) { - context->setReturnValue(str); - } else { - QScriptValueImpl &obj = context->m_thisObject; - obj.setClassInfo(classInfo()); - obj.setInternalValue(str); - obj.setPrototype(publicPrototype); - context->setReturnValue(obj); - } -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - engine()->notifyFunctionExit(context); -#endif -} - -void String::newString(QScriptValueImpl *result, const QString &value) -{ - engine()->newObject(result, publicPrototype, classInfo()); - result->setInternalValue(QScriptValueImpl(engine(), value)); -} - -QScriptValueImpl String::method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() != classInfo) { - return context->throwError(QScriptContext::TypeError, QLatin1String("String.prototype.toString")); - } - return (self.internalValue()); -} - -QScriptValueImpl String::method_valueOf(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - QScriptValueImpl self = context->thisObject(); - if (self.classInfo() != classInfo) { - return throwThisObjectTypeError( - context, QLatin1String("String.prototype.valueOf")); - } - return (self.internalValue()); -} - -QScriptValueImpl String::method_charAt(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QString str = context->thisObject().toString(); - - int pos = 0; - if (context->argumentCount() > 0) - pos = int (context->argument(0).toInteger()); - - QString result; - if (pos >= 0 && pos < str.length()) - result += str.at(pos); - - return (QScriptValueImpl(eng, result)); -} - -QScriptValueImpl String::method_charCodeAt(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *) -{ - QString str = context->thisObject().toString(); - - int pos = 0; - if (context->argumentCount() > 0) - pos = int (context->argument(0).toInteger()); - - qsreal result = qSNaN(); - - if (pos >= 0 && pos < str.length()) - result = str.at(pos).unicode(); - - return (QScriptValueImpl(result)); -} - -QScriptValueImpl String::method_concat(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QString value = context->thisObject().toString(); - - for (int i = 0; i < context->argumentCount(); ++i) - value += context->argument(i).toString(); - - return (QScriptValueImpl(eng, value)); -} - -QScriptValueImpl String::method_indexOf(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *) -{ - QString value = context->thisObject().toString(); - - QString searchString = context->argument(0).toString(); - - int pos = 0; - if (context->argumentCount() > 1) - pos = int (context->argument(1).toInteger()); - - int index = -1; - if (! value.isEmpty()) - index = value.indexOf(searchString, qMin(qMax(pos, 0), value.length())); - - return (QScriptValueImpl(index)); -} - -QScriptValueImpl String::method_lastIndexOf(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *) -{ - QString value = context->thisObject().toString(); - - QString searchString = context->argument(0).toString(); - - qsreal position = context->argument(1).toNumber(); - if (qIsNaN(position)) - position = +qInf(); - else - position = QScriptEnginePrivate::toInteger(position); - - int pos = QScriptEnginePrivate::toInt32(qMin(qMax(position, 0.0), qsreal(value.length()))); - if (!searchString.isEmpty() && pos == value.length()) - --pos; - int index = value.lastIndexOf(searchString, pos); - return (QScriptValueImpl(index)); -} - -QScriptValueImpl String::method_localeCompare(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *) -{ - QString value = context->thisObject().toString(); - QString that = context->argument(0).toString(); - return QScriptValueImpl(QString::localeAwareCompare(value, that)); -} - -QScriptValueImpl String::method_match(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QScriptValueImpl pattern = context->argument(0); - - if (! eng->regexpConstructor->get(pattern)) - eng->regexpConstructor->newRegExp(&pattern, context->argument(0).toString(), /*flags=*/0); - - QScriptValueImpl rx_exec = pattern.property(QLatin1String("exec"), QScriptValue::ResolvePrototype); - if (! (rx_exec.isValid() && rx_exec.isFunction())) { - return context->throwError(QScriptContext::TypeError, - QLatin1String("String.prototype.match")); - } - - QScriptValueImplList args; - args << context->thisObject(); - - QScriptValueImpl global = pattern.property(QLatin1String("global")); - if (! (global.isValid() && global.toBoolean())) - return (rx_exec.call(pattern, args)); - - QScript::Array result(eng); - - QScriptNameIdImpl *lastIndexId = eng->nameId(QLatin1String("lastIndex")); - QScriptNameIdImpl *zeroId = eng->nameId(QLatin1String("0")); - - pattern.setProperty(lastIndexId, QScriptValueImpl(0)); - int n = 0; - while (true) { - qsreal lastIndex = pattern.property(lastIndexId).toNumber(); - QScriptValueImpl r = rx_exec.call(pattern, args); - if (r.isNull()) - break; - qsreal newLastIndex = pattern.property(lastIndexId).toNumber(); - if (newLastIndex == lastIndex) - pattern.setProperty(lastIndexId, QScriptValueImpl(lastIndex + 1)); - result.assign(n++, r.property(zeroId)); - } - - return (eng->newArray(result)); -} - -QScriptValueImpl String::method_replace(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QString input = context->thisObject().toString(); - QScriptValueImpl searchValue = context->argument(0); - QScriptValueImpl replaceValue = context->argument(1); - - QString output; - if (searchValue.classInfo() == eng->regexpConstructor->classInfo()) { - // searchValue is a RegExp - QScriptValueImpl rx_exec = searchValue.property(QLatin1String("exec"), QScriptValue::ResolvePrototype); - if (!rx_exec.isFunction()) { - return context->throwError(QScriptContext::TypeError, - QLatin1String("String.prototype.replace")); - } - QVector<QScriptValueImpl> occurrences; - QScriptValueImpl global = searchValue.property(QLatin1String("global")); - QScriptValueImplList args; - args << QScriptValueImpl(eng, input); - if (!global.toBoolean()) { - QScriptValueImpl r = rx_exec.call(searchValue, args); - if (!r.isNull()) - occurrences.append(r); - } else { - QScriptNameIdImpl *lastIndexId = eng->nameId(QLatin1String("lastIndex")); - searchValue.setProperty(lastIndexId, QScriptValueImpl(0)); - while (true) { - qsreal lastIndex = searchValue.property(lastIndexId).toNumber(); - QScriptValueImpl r = rx_exec.call(searchValue, args); - if (r.isNull()) - break; - qsreal newLastIndex = searchValue.property(lastIndexId).toNumber(); - if (newLastIndex == lastIndex) - searchValue.setProperty(lastIndexId, QScriptValueImpl(lastIndex + 1)); - occurrences.append(r); - } - } - int pos = 0; - if (replaceValue.isFunction()) { - QScriptNameIdImpl *indexId = eng->nameId(QLatin1String("index")); - QScriptNameIdImpl *lengthId = eng->nameId(QLatin1String("length")); - for (int i = 0; i < occurrences.count(); ++i) { - QScriptValueImpl needle = occurrences.at(i); - int index = int (needle.property(indexId).toInteger()); - uint length = eng->toUint32(needle.property(lengthId).toNumber()); - output += input.mid(pos, index - pos); - args.clear(); - for (uint j = 0; j < length; ++j) - args << needle.property(j); - args << QScriptValueImpl(index); - args << QScriptValueImpl(eng, input); - QScriptValueImpl ret = replaceValue.call(eng->nullValue(), args); - output += ret.toString(); - pos = index + args[0].toString().length(); - } - } else { - // use string representation of replaceValue - const QString replaceString = replaceValue.toString(); - const QLatin1Char dollar = QLatin1Char('$'); - QScriptNameIdImpl *indexId = eng->nameId(QLatin1String("index")); - QScriptNameIdImpl *zeroId = eng->nameId(QLatin1String("0")); - for (int i = 0; i < occurrences.count(); ++i) { - QScriptValueImpl needle = occurrences.at(i); - int index = int (needle.property(indexId).toInteger()); - output += input.mid(pos, index - pos); - int j = 0; - while (j < replaceString.length()) { - const QChar c = replaceString.at(j++); - if ((c == dollar) && (j < replaceString.length())) { - const QChar nc = replaceString.at(j); - if (nc == dollar) { - ++j; - } else if (nc == QLatin1Char('`')) { - ++j; - output += input.left(index); - continue; - } else if (nc == QLatin1Char('\'')) { - ++j; - output += input.mid(index + needle.property(zeroId).toString().length()); - continue; - } else if (nc.isDigit()) { - ++j; - int cap = nc.toLatin1() - '0'; - if ((j < replaceString.length()) && replaceString.at(j).isDigit()) { - cap = cap * 10; - cap = replaceString.at(j++).toLatin1() - '0'; - } - output += needle.property(QScriptValueImpl(cap).toString()).toString(); - continue; - } - } - output += c; - } - pos = index + needle.property(zeroId).toString().length(); - } - } - output += input.mid(pos); - } else { - // use string representation of searchValue - const QString searchString = searchValue.toString(); - int pos = 0; - if (replaceValue.isFunction()) { - int index = input.indexOf(searchString, pos); - if (index != -1) { - output += input.mid(pos, index - pos); - QScriptValueImplList args; - args << QScriptValueImpl(eng, searchString); - args << QScriptValueImpl(index); - args << QScriptValueImpl(eng, input); - QScriptValueImpl ret = replaceValue.call(eng->nullValue(), args); - output += ret.toString(); - pos = index + searchString.length(); - } - } else { - // use string representation of replaceValue - const QString replaceString = replaceValue.toString(); - const QLatin1Char dollar = QLatin1Char('$'); - int index = input.indexOf(searchString, pos); - if (index != -1) { - output += input.mid(pos, index - pos); - int j = 0; - while (j < replaceString.length()) { - const QChar c = replaceString.at(j++); - if ((c == dollar) && (j < replaceString.length())) { - const QChar nc = replaceString.at(j); - if (nc == dollar) { - ++j; - } else if (nc == QLatin1Char('`')) { - output += input.left(index); - ++j; - continue; - } else if (nc == QLatin1Char('\'')) { - output += input.mid(index + searchString.length()); - ++j; - continue; - } - } - output += c; - } - pos = index + searchString.length(); - } - } - output += input.mid(pos); - } - return QScriptValueImpl(eng, output); -} - -QScriptValueImpl String::method_search(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QScriptValueImpl pattern = context->argument(0); - - Ecma::RegExp::Instance *rx_data = 0; - if (0 == (rx_data = eng->regexpConstructor->get(pattern))) { - eng->regexpConstructor->newRegExp(&pattern, context->argument(0).toString(), /*flags=*/0); - rx_data = eng->regexpConstructor->get(pattern); - } - - QString value = context->thisObject().toString(); -#ifndef QT_NO_REGEXP - return (QScriptValueImpl(value.indexOf(rx_data->value))); -#else - return eng->nullValue(); -#endif -} - -QScriptValueImpl String::method_slice(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QString text = context->thisObject().toString(); - int length = text.length(); - - int start = int (context->argument(0).toInteger()); - int end = context->argument(1).isUndefined() - ? length : int (context->argument(1).toInteger()); - - if (start < 0) - start = qMax(length + start, 0); - else - start = qMin(start, length); - - if (end < 0) - end = qMax(length + end, 0); - else - end = qMin(end, length); - - int count = qMax(0, end - start); - return (QScriptValueImpl(eng, text.mid(start, count))); -} - -QScriptValueImpl String::method_split(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QScriptValueImpl l = context->argument(1); - quint32 lim = l.isUndefined() ? UINT_MAX : QScriptEnginePrivate::toUint32(l.toNumber()); - - if (lim == 0) - return eng->newArray(); - - QString S = context->thisObject().toString(); - QScriptValueImpl separator = context->argument(0); - - QScript::Array A(eng); - // the argumentCount() check is for compatibility with spidermonkey; - // it is not according to ECMA-262 - if (separator.isUndefined() && (context->argumentCount() == 0)) { - A.assign(0, QScriptValueImpl(eng, S)); - } else { - QStringList matches; -#ifndef QT_NO_REGEXP - if (Ecma::RegExp::Instance *rx = eng->regexpConstructor->get(separator)) { - matches = S.split(rx->value, rx->value.pattern().isEmpty() - ? QString::SkipEmptyParts : QString::KeepEmptyParts); - } else -#endif // QT_NO_REGEXP - { - QString sep = separator.toString(); - matches = S.split(sep, sep.isEmpty() - ? QString::SkipEmptyParts : QString::KeepEmptyParts); - } - uint count = qMin(lim, uint(matches.count())); - for (uint i = 0; i < count; ++i) - A.assign(i, QScriptValueImpl(eng, matches.at(i))); - } - - return eng->newArray(A); -} - -QScriptValueImpl String::method_substr(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QString value = context->thisObject().toString(); - - qsreal start = 0; - if (context->argumentCount() > 0) - start = context->argument(0).toInteger(); - - qsreal length = +qInf(); - if (context->argumentCount() > 1) - length = context->argument(1).toInteger(); - - qsreal count = value.length(); - if (start < 0) - start = qMax(count + start, 0.0); - - length = qMin(qMax(length, 0.0), count - start); - - qint32 x = QScriptEnginePrivate::toInt32(start); - qint32 y = QScriptEnginePrivate::toInt32(length); - return QScriptValueImpl(eng, value.mid(x, y)); -} - -QScriptValueImpl String::method_substring(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QString value = context->thisObject().toString(); - int length = value.length(); - - qsreal start = 0; - qsreal end = length; - - if (context->argumentCount() > 0) - start = context->argument(0).toInteger(); - - if (context->argumentCount() > 1) - end = context->argument(1).toInteger(); - - if (qIsNaN(start) || start < 0) - start = 0; - - if (qIsNaN(end) || end < 0) - end = 0; - - if (start > length) - start = length; - - if (end > length) - end = length; - - if (start > end) { - qsreal was = start; - start = end; - end = was; - } - - qint32 x = QScriptEnginePrivate::toInt32(start); - qint32 y = QScriptEnginePrivate::toInt32(end - start); - - return (QScriptValueImpl(eng, value.mid(x, y))); -} - -QScriptValueImpl String::method_toLowerCase(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QString value = context->thisObject().toString(); - return (QScriptValueImpl(eng, value.toLower())); -} - -QScriptValueImpl String::method_toLocaleLowerCase(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - return method_toLowerCase(context, eng, classInfo); // ### check me -} - -QScriptValueImpl String::method_toUpperCase(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QString value = context->thisObject().toString(); - return (QScriptValueImpl(eng, value.toUpper())); -} - -QScriptValueImpl String::method_toLocaleUpperCase(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - return method_toUpperCase(context, eng, classInfo); // ### check me -} - -QScriptValueImpl String::method_fromCharCode(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QString str; - for (int i = 0; i < context->argumentCount(); ++i) { - QChar c(context->argument(i).toUInt16()); - str += c; - } - return (QScriptValueImpl(eng, str)); -} - -// Qt extensions - -QScriptValueImpl String::method_ext_arg(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - QString value = context->thisObject().toString(); - QScriptValueImpl arg = context->argument(0); - QString result; - if (arg.isString()) - result = value.arg(arg.toString()); - else if (arg.isNumber()) - result = value.arg(arg.toNumber()); - return QScriptValueImpl(eng, result); -} - -} } // namespace QScript::Ecma - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT diff --git a/src/script/qscriptecmastring_p.h b/src/script/qscriptecmastring_p.h deleted file mode 100644 index 9ddd659..0000000 --- a/src/script/qscriptecmastring_p.h +++ /dev/null @@ -1,128 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTECMASTRING_P_H -#define QSCRIPTECMASTRING_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 "qscriptecmacore_p.h" - -#ifndef QT_NO_SCRIPT - -QT_BEGIN_NAMESPACE - -namespace QScript { namespace Ecma { - -class String: public Core -{ -public: - String(QScriptEnginePrivate *engine); - virtual ~String(); - - virtual void execute(QScriptContextPrivate *context); - - void newString(QScriptValueImpl *result, const QString &value = QString()); - -protected: - static QScriptValueImpl method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_valueOf(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_charAt(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_charCodeAt(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_concat(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_indexOf(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_lastIndexOf(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_localeCompare(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_match(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_replace(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_search(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_slice(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_split(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_substr(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_substring(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_toLowerCase(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_toLocaleLowerCase(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_toUpperCase(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_toLocaleUpperCase(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_fromCharCode(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - -public: - // Qt extensions - static QScriptValueImpl method_ext_arg(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); -}; - -} } // namespace QScript::Ecma - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptengine_p.cpp b/src/script/qscriptengine_p.cpp deleted file mode 100644 index 84a420d..0000000 --- a/src/script/qscriptengine_p.cpp +++ /dev/null @@ -1,2729 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qscriptengine_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" -#include "qscriptlexer_p.h" -#include "qscriptnodepool_p.h" -#include "qscriptparser_p.h" -#include "qscriptcompiler_p.h" -#include "qscriptvalueiteratorimpl_p.h" -#include "qscriptecmaglobal_p.h" -#include "qscriptecmamath_p.h" -#include "qscriptecmaarray_p.h" -#include "qscriptextenumeration_p.h" -#include "qscriptsyntaxchecker_p.h" -#include "qscriptsyntaxcheckresult_p.h" -#include "qscriptclass.h" -#include "qscriptclass_p.h" -#include "qscriptengineagent.h" - -#include <QtCore/QDate> -#include <QtCore/QDateTime> -#include <QtCore/QRegExp> -#include <QtCore/QStringList> -#include <QtCore/QVariant> - -#ifndef QT_NO_QOBJECT -#include "qscriptextensioninterface.h" -#include <QtCore/QDir> -#include <QtCore/QFile> -#include <QtCore/QFileInfo> -#include <QtCore/QTextStream> -#include <QtCore/QCoreApplication> -#include <QtCore/QPluginLoader> -#endif - -Q_DECLARE_METATYPE(QScriptValue) -#ifndef QT_NO_QOBJECT -Q_DECLARE_METATYPE(QObjectList) -#endif -Q_DECLARE_METATYPE(QList<int>) - -QT_BEGIN_NAMESPACE - -extern char *qdtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve, char **digits_str); -extern double qstrtod(const char *s00, char const **se, bool *ok); - -namespace QScript { - -QString numberToString(qsreal value) -{ - if (qIsNaN(value)) - return QLatin1String("NaN"); - - else if (qIsInf(value)) - return QLatin1String(value < 0 ? "-Infinity" : "Infinity"); - - else if (value == 0) - return QLatin1String("0"); - - QByteArray buf; - buf.reserve(80); - - int decpt; - int sign; - char *result = 0; - (void) qdtoa(value, 0, 0, &decpt, &sign, 0, &result); - - if (! result) - return QString(); - - else if (decpt <= 0 && decpt > -6) { - - buf.fill('0', -decpt + 2 + sign); - - if (sign) // fix the sign. - buf[0] = '-'; - - buf[sign + 1] = '.'; - buf += result; - } - - else { - if (sign) - buf += '-'; - - buf += result; - int length = buf.length() - sign; - - if (decpt <= 21 && decpt > 0) { - if (length <= decpt) - buf += QByteArray().fill('0', decpt - length); - else - buf.insert(decpt + sign, '.'); - } - - else if (result[0] >= '0' && result[0] <= '9') { - if (length > 1) - buf.insert(1 + sign, '.'); - - buf += 'e'; - buf += (decpt >= 0) ? '+' : '-'; - - int e = decpt - 1; - - if (e < 0) - e = -e; - - if (e >= 100) - buf += '0' + e / 100; - - if (e >= 10) - buf += '0' + (e % 100) / 10; - - buf += '0' + e % 10; - } - } - - free(result); - - return QString::fromLatin1(buf); -} - -static int toDigit(char c) -{ - if ((c >= '0') && (c <= '9')) - return c - '0'; - else if ((c >= 'a') && (c <= 'z')) - return 10 + c - 'a'; - else if ((c >= 'A') && (c <= 'Z')) - return 10 + c - 'A'; - return -1; -} - -qsreal integerFromString(const char *buf, int size, int radix) -{ - if (size == 0) - return qSNaN(); - - qsreal sign = 1.0; - int i = 0; - if (buf[0] == '+') { - ++i; - } else if (buf[0] == '-') { - sign = -1.0; - ++i; - } - - if (((size-i) >= 2) && (buf[i] == '0')) { - if (((buf[i+1] == 'x') || (buf[i+1] == 'X')) - && (radix < 34)) { - if ((radix != 0) && (radix != 16)) - return 0; - radix = 16; - i += 2; - } else { - if (radix == 0) { - radix = 8; - ++i; - } - } - } else if (radix == 0) { - radix = 10; - } - - int j = i; - for ( ; i < size; ++i) { - int d = toDigit(buf[i]); - if ((d == -1) || (d >= radix)) - break; - } - qsreal result; - if (j == i) { - if (!qstrcmp(buf, "Infinity")) - result = qInf(); - else - result = qSNaN(); - } else { - result = 0; - qsreal multiplier = 1; - for (--i ; i >= j; --i, multiplier *= radix) - result += toDigit(buf[i]) * multiplier; - } - result *= sign; - return result; -} - -qsreal integerFromString(const QString &str, int radix) -{ - QByteArray ba = str.trimmed().toUtf8(); - return integerFromString(ba.constData(), ba.size(), radix); -} - -qsreal numberFromString(const QString &repr) -{ - QString str = repr.trimmed(); - if ((str.length() > 2) && (str.at(0) == QLatin1Char('0')) && (str.at(1).toUpper() == QLatin1Char('X'))) - return integerFromString(str.mid(2), 16); - QByteArray latin1 = str.toLatin1(); - const char *data = latin1.constData(); - const char *eptr = 0; - qsreal result = qstrtod(data, &eptr, 0); - if (eptr == data) { - if (str == QLatin1String("Infinity")) - result = +qInf(); - else if (str == QLatin1String("+Infinity")) - result = +qInf(); - else if (str == QLatin1String("-Infinity")) - result = -qInf(); - else if (str.isEmpty()) - result = 0; - else - result = qSNaN(); - } else if (eptr != (data + latin1.length())) { - result = qSNaN(); - } - return result; -} - -NodePool::NodePool(const QString &fileName, QScriptEnginePrivate *engine) - : m_fileName(fileName), m_engine(engine) -{ -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - m_id = engine->nextScriptId(); -#endif -} - -NodePool::~NodePool() -{ - qDeleteAll(m_codeCache); - m_codeCache.clear(); - -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - m_engine->notifyScriptUnload(id()); -#endif -} - -Code *NodePool::createCompiledCode(AST::Node *node, CompilationUnit &compilation) -{ - QHash<AST::Node*, Code*>::const_iterator it = m_codeCache.constFind(node); - if (it != m_codeCache.constEnd()) - return it.value(); - - Code *code = new Code(); - code->init(compilation, this); - - m_codeCache.insert(node, code); - return code; -} - -class EvalFunction : public QScriptFunction -{ -public: - EvalFunction(QScriptEnginePrivate *) - { length = 1; } - - virtual ~EvalFunction() {} - - void evaluate(QScriptContextPrivate *context, const QString &contents, - int lineNo, const QString &fileName, bool calledFromScript) - { - QScriptEnginePrivate *eng_p = context->engine(); - - QExplicitlySharedDataPointer<NodePool> pool; - pool = new NodePool(fileName, eng_p); - eng_p->setNodePool(pool.data()); - - QString errorMessage; - int errorLineNumber; - AST::Node *program = eng_p->createAbstractSyntaxTree( - contents, lineNo, &errorMessage, &errorLineNumber); - - eng_p->setNodePool(0); - -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - eng_p->notifyScriptLoad(pool->id(), contents, fileName, lineNo); -#endif - - Code *code = 0; - if (program) { - Compiler compiler(eng_p); - compiler.setTopLevelCompiler(true); - CompilationUnit compilation = compiler.compile(program); - if (!compilation.isValid()) { - errorMessage = compilation.errorMessage(); - errorLineNumber = compilation.errorLineNumber(); - } else { - code = pool->createCompiledCode(program, compilation); - } - } - - if (!code) { - context->errorLineNumber = errorLineNumber; - context->currentLine = errorLineNumber; -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - Code *oldCode = context->m_code; - Code dummy; - dummy.astPool = pool.data(); - context->m_code = &dummy; // so agents get the script ID - bool wasEvaluating = eng_p->m_evaluating; - eng_p->m_evaluating = true; - eng_p->notifyFunctionEntry(context); -#endif - context->throwError(QScriptContext::SyntaxError, errorMessage); -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - eng_p->notifyFunctionExit(context); - eng_p->m_evaluating = wasEvaluating; - context->m_code = oldCode; -#endif - return; - } - - if (calledFromScript) { - if (QScriptContextPrivate *pc = context->parentContext()) { - context->setActivationObject(pc->activationObject()); - context->setThisObject(pc->thisObject()); - context->m_scopeChain = pc->m_scopeChain; - } - } - - const QScriptInstruction *iPtr = context->instructionPointer(); - context->execute(code); - context->setInstructionPointer(iPtr); - } - - virtual void execute(QScriptContextPrivate *context) - { - QScriptEnginePrivate *eng = context->engine(); - int lineNo = context->currentLine; - if (lineNo == -1) { - QScriptContextPrivate *pc = context->parentContext(); - if (pc) - lineNo = pc->currentLine; - else - lineNo = 1; - } - QString fileName; // don't set this for now, we don't want to change the official eval() for now. - - if (context->argumentCount() == 0) { - context->setReturnValue(eng->undefinedValue()); - } else { - QScriptValueImpl arg = context->argument(0); - if (arg.isString()) { - QString contents = arg.toString(); - evaluate(context, contents, lineNo, fileName, /*calledFromScript=*/true); - } else { - context->setReturnValue(arg); - } - } - } - - QString functionName() const - { - return QLatin1String("eval"); - } -}; - -class ArgumentsClassData: public QScriptClassData -{ - -public: - - static inline QScript::ArgumentsObjectData *get(const QScriptValueImpl &object) - { return static_cast<QScript::ArgumentsObjectData*>(object.objectData()); } - - virtual bool resolve(const QScriptValueImpl &object, QScriptNameIdImpl *nameId, - QScript::Member *member, QScriptValueImpl *base, - QScript::AccessMode access); - virtual bool get(const QScriptValueImpl &object, const QScript::Member &member, - QScriptValueImpl *out_value); - virtual bool put(QScriptValueImpl *object, const QScript::Member &member, - const QScriptValueImpl &value); - virtual void mark(const QScriptValueImpl &object, int generation); - virtual QScriptClassDataIterator *newIterator(const QScriptValueImpl &object); -}; - -class ArgumentsClassDataIterator: public QScriptClassDataIterator -{ -public: - ArgumentsClassDataIterator(ArgumentsObjectData *data); - virtual ~ArgumentsClassDataIterator(); - - virtual bool hasNext() const; - virtual void next(QScript::Member *member); - - virtual bool hasPrevious() const; - virtual void previous(QScript::Member *member); - - virtual void toFront(); - virtual void toBack(); - -private: - ArgumentsObjectData *m_data; - uint m_pos; -}; - -bool ArgumentsClassData::resolve(const QScriptValueImpl &object, QScriptNameIdImpl *nameId, - QScript::Member *member, QScriptValueImpl *base, - QScript::AccessMode /*access*/) -{ - QString propertyName = object.engine()->toString(nameId); - bool isNumber; - quint32 index = propertyName.toUInt(&isNumber); - if (isNumber) { - QScript::ArgumentsObjectData *data = ArgumentsClassData::get(object); - if (index < data->length) { - member->native(/*nameId=*/0, index, QScriptValue::SkipInEnumeration); - *base = object; - return true; - } - } - - return false; -} - -bool ArgumentsClassData::get(const QScriptValueImpl &object, const QScript::Member &member, - QScriptValueImpl *out_value) -{ - QScript::ArgumentsObjectData *data = ArgumentsClassData::get(object); - if (member.nameId() == 0) { - QScriptObject *activation_data = data->activation.objectValue(); - *out_value = activation_data->m_values[member.id()]; - return true; - } - return false; -} - -bool ArgumentsClassData::put(QScriptValueImpl *object, const QScript::Member &member, - const QScriptValueImpl &value) -{ - Q_ASSERT(member.nameId() == 0); - QScript::ArgumentsObjectData *data = ArgumentsClassData::get(*object); - QScriptObject *activation_data = data->activation.objectValue(); - activation_data->m_values[member.id()] = value; - return true; -} - -void ArgumentsClassData::mark(const QScriptValueImpl &object, int generation) -{ - QScript::ArgumentsObjectData *data = ArgumentsClassData::get(object); - data->activation.mark(generation); -} - -QScriptClassDataIterator *ArgumentsClassData::newIterator(const QScriptValueImpl &object) -{ - QScript::ArgumentsObjectData *data = ArgumentsClassData::get(object); - return new ArgumentsClassDataIterator(data); -} - -ArgumentsClassDataIterator::ArgumentsClassDataIterator(ArgumentsObjectData *data) - : m_data(data), m_pos(0) -{ -} - -ArgumentsClassDataIterator::~ArgumentsClassDataIterator() -{ -} - -bool ArgumentsClassDataIterator::hasNext() const -{ - return m_pos < m_data->length; -} - -void ArgumentsClassDataIterator::next(QScript::Member *member) -{ - if (m_pos == m_data->length) { - member->invalidate(); - } else { - member->native(/*nameId=*/0, m_pos, QScriptValue::SkipInEnumeration); - ++m_pos; - } -} - -bool ArgumentsClassDataIterator::hasPrevious() const -{ - return (m_pos != 0); -} - -void ArgumentsClassDataIterator::previous(QScript::Member *member) -{ - if (m_pos == 0) { - member->invalidate(); - } else { - --m_pos; - member->native(/*nameId=*/0, m_pos, QScriptValue::SkipInEnumeration); - } -} - -void ArgumentsClassDataIterator::toFront() -{ - m_pos = 0; -} - -void ArgumentsClassDataIterator::toBack() -{ - m_pos = m_data->length; -} - -} // namespace QScript - -const qsreal QScriptEnginePrivate::D16 = 65536.0; -const qsreal QScriptEnginePrivate::D32 = 4294967296.0; - -QScriptEnginePrivate::~QScriptEnginePrivate() -{ - while (!m_agents.isEmpty()) - delete m_agents.takeFirst(); - - // invalidate values that we have references to - { - QHash<QScriptObject*, QScriptValuePrivate*>::const_iterator it; - for (it = m_objectHandles.constBegin(); it != m_objectHandles.constEnd(); ++it) - (*it)->invalidate(); - } - { - QHash<QScriptNameIdImpl*, QScriptValuePrivate*>::const_iterator it; - for (it = m_stringHandles.constBegin(); it != m_stringHandles.constEnd(); ++it) - (*it)->invalidate(); - } - { - QVector<QScriptValuePrivate*>::const_iterator it; - for (it = m_otherHandles.constBegin(); it != m_otherHandles.constEnd(); ++it) - (*it)->invalidate(); - } - - // invalidate interned strings that are known to the outside world - { - QHash<QScriptNameIdImpl*, QScriptStringPrivate*>::const_iterator it; - for (it = m_internedStrings.constBegin(); it != m_internedStrings.constEnd(); ++it) - it.value()->nameId = 0; - } - - delete[] m_string_hash_base; - qDeleteAll(m_stringRepository); - qDeleteAll(m_tempStringRepository); - - if (tempStackBegin) - delete[] tempStackBegin; - -#ifndef QT_NO_QOBJECT - deletePendingQObjects(); - qDeleteAll(m_qobjectData); -# ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE - qDeleteAll(m_cachedMetaObjects); -# endif -#endif - - qDeleteAll(m_allocated_classes); -} - -QScript::AST::Node *QScriptEnginePrivate::changeAbstractSyntaxTree(QScript::AST::Node *prg) -{ - QScript::AST::Node *was = m_abstractSyntaxTree; - m_abstractSyntaxTree = prg; - return was; -} - -QScript::AST::Node *QScriptEnginePrivate::createAbstractSyntaxTree( - const QString &source, int lineNumber, QString *errorMessage, int *errorLineNumber) -{ - QScript::Lexer lex(this); - setLexer(&lex); - lex.setCode(source, lineNumber); - - QScriptParser parser; - - if (! parser.parse(this)) { - if (errorMessage) - *errorMessage = parser.errorMessage(); - if (errorLineNumber) - *errorLineNumber = parser.errorLineNumber(); - return 0; - } - - return abstractSyntaxTree(); -} - -void QScriptEnginePrivate::markObject(const QScriptValueImpl &object, int generation) -{ - QScriptObject *instance = object.objectValue(); - QScript::GCBlock *block = QScript::GCBlock::get(instance); - - enum { MAX_GC_DEPTH = 32 }; - - if (block->generation + 1 != generation) - return; - - if (m_gc_depth >= MAX_GC_DEPTH) { - // do the marking later - m_markStack.append(object); - return; - } - - ++block->generation; - ++m_gc_depth; - - if (QScriptClassData *data = object.classInfo()->data()) - data->mark(object, generation); - - if (instance->m_prototype.isObject()) - markObject(instance->m_prototype, generation); - - if (instance->m_scope.isObject()) - markObject(instance->m_scope, generation); - - const QScriptValueImpl &internalValue = instance->m_internalValue; - - if (internalValue.isValid()) { - if (internalValue.isObject()) - markObject(internalValue, generation); - - else if (internalValue.isString()) - markString(internalValue.m_string_value, generation); - } - - int garbage = 0; - - for (int i = 0; i < instance->memberCount(); ++i) { - QScript::Member m; - instance->member(i, &m); - - if (! m.isValid()) { - ++garbage; - continue; - } - - Q_ASSERT(m.isObjectProperty()); - - QScriptValueImpl child; - instance->get(m, &child); - - if (m.nameId()) - markString(m.nameId(), generation); - - if (! child.isValid()) - continue; - - else if (child.isObject()) - markObject(child, generation); - - else if (child.isString()) - markString(child.m_string_value, generation); - } - - --m_gc_depth; - - if (garbage < 128) // ### - return; - - int j = 0; - for (int i = 0; i < instance->memberCount(); ++i) { - QScript::Member m; - instance->member(i, &m); - - if (! m.isValid()) - continue; - - if (i != j) { - instance->m_members[j].object(m.nameId(), j, m.flags()); - instance->m_values[j] = instance->m_values[i]; - } - ++j; - } - //qDebug() << "==> old:" << instance->m_members.size() << "new:" << j; - instance->m_members.resize(j); - instance->m_values.resize(j); -} - -void QScriptEnginePrivate::markFrame(QScriptContextPrivate *context, int generation) -{ - QScriptValueImpl activation = context->activationObject(); - QScriptValueImpl thisObject = context->thisObject(); - QScriptValueImpl scopeChain = context->m_scopeChain; - QScriptValueImpl callee = context->m_callee; - QScriptValueImpl arguments = context->m_arguments; - - if (activation.isObject()) - markObject(activation, generation); - - if (scopeChain.isObject()) - markObject(scopeChain, generation); - - if (thisObject.isObject()) - markObject(thisObject, generation); - - if (callee.isObject()) - markObject(callee, generation); - - if (arguments.isObject()) - markObject(arguments, generation); - - if (context->returnValue().isValid()) { - if (context->returnValue().isObject()) - markObject(context->returnValue(), generation); - - else if (context->returnValue().isString()) - markString(context->returnValue().m_string_value, generation); - } - - if (context->baseStackPointer() != context->currentStackPointer()) { - // mark the temp stack - - for (const QScriptValueImpl *it = context->baseStackPointer(); it != (context->currentStackPointer() + 1); ++it) { - if (! it) { - qWarning() << "no temp stack!!!"; - break; - } - - else if (! it->isValid()) // ### assert? - continue; - - else if (it->isObject()) - markObject(*it, generation); - - else if (it->isString()) - markString(it->m_string_value, generation); - } - } -} - -bool QScriptEnginePrivate::isCollecting() const -{ - return (m_gc_depth != -1) || objectAllocator.sweeping(); -} - -void QScriptEnginePrivate::maybeGC_helper(bool do_string_gc) -{ - // qDebug() << "==>" << objectAllocator.newAllocatedBlocks() << "free:" << objectAllocator.freeBlocks(); - Q_ASSERT(m_gc_depth == -1); - ++m_gc_depth; - - int generation = m_objectGeneration + 1; - - markObject(m_globalObject, generation); - - objectConstructor->mark(this, generation); - numberConstructor->mark(this, generation); - booleanConstructor->mark(this, generation); - stringConstructor->mark(this, generation); - dateConstructor->mark(this, generation); - functionConstructor->mark(this, generation); - arrayConstructor->mark(this, generation); - regexpConstructor->mark(this, generation); - errorConstructor->mark(this, generation); - enumerationConstructor->mark(this, generation); - variantConstructor->mark(this, generation); -#ifndef QT_NO_QOBJECT - qobjectConstructor->mark(this, generation); - qmetaObjectConstructor->mark(this, generation); -#endif - - { - QScriptContextPrivate *current = currentContext(); - while (current != 0) { - markFrame (current, generation); - current = current->parentContext(); - } - } - - { - QHash<QScriptObject*, QScriptValuePrivate*>::const_iterator it; - for (it = m_objectHandles.constBegin(); it != m_objectHandles.constEnd(); ++it) - markObject((*it)->value, generation); - } - - { - QHash<QScriptNameIdImpl*, QScriptValuePrivate*>::const_iterator it; - for (it = m_stringHandles.constBegin(); it != m_stringHandles.constEnd(); ++it) - markString((*it)->value.stringValue(), generation); - } - - { - QHash<int, QScriptCustomTypeInfo>::const_iterator it; - for (it = m_customTypes.constBegin(); it != m_customTypes.constEnd(); ++it) - (*it).prototype.mark(generation); - } - -#ifndef QT_NO_QOBJECT -# ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE - { - QHash<const QMetaObject*, QScriptMetaObject*>::const_iterator it; - for (it = m_cachedMetaObjects.constBegin(); it != m_cachedMetaObjects.constEnd(); ++it) { - { - QList<QScriptNameIdImpl*> memberNames = (*it)->registeredMemberNames(); - QList<QScriptNameIdImpl*>::const_iterator it2; - for (it2 = memberNames.constBegin(); it2 != memberNames.constEnd(); ++it2) - markString(*it2, generation); - } - { - QList<QScriptValueImpl> propertyAccessors = (*it)->registeredPropertyAccessors(); - QList<QScriptValueImpl>::const_iterator it2; - for (it2 = propertyAccessors.constBegin(); it2 != propertyAccessors.constEnd(); ++it2) - markObject(*it2, generation); - } - } - } -# endif - processMarkStack(generation); // make sure everything is marked before marking qobject data - { - QHash<QObject*, QScriptQObjectData*>::const_iterator it; - for (it = m_qobjectData.constBegin(); it != m_qobjectData.constEnd(); ++it) { - QScriptQObjectData *qdata = it.value(); - qdata->mark(generation); - } - } -#endif - processMarkStack(generation); - - Q_ASSERT(m_gc_depth == 0); - --m_gc_depth; - - objectAllocator.sweep(generation); - - m_objectGeneration = generation; - - //qDebug() << "free blocks:" << objectAllocator.freeBlocks(); - -#ifndef QT_NO_QOBJECT - deletePendingQObjects(); -#endif - - if (! do_string_gc) - return; - - { - QHash<QScriptNameIdImpl*, QScriptStringPrivate*>::const_iterator it; - for (it = m_internedStrings.constBegin(); it != m_internedStrings.constEnd(); ++it) { - it.value()->nameId->used = true; - } - } - -#if 0 - qDebug() << "do_string_gc:" << do_string_gc - << ((m_stringRepository.size() - m_oldStringRepositorySize) > 256) - << ((m_tempStringRepository.size() - m_oldTempStringRepositorySize) > 2048); -#endif - - QVector<QScriptNameIdImpl*> compressed; - compressed.reserve(m_stringRepository.size()); - - for (int i = 0; i < m_stringRepository.size(); ++i) { - QScriptNameIdImpl *entry = m_stringRepository.at(i); - - if (entry->used || entry->persistent) { - compressed.append(entry); - entry->used = false; - } - - else { - //qDebug() << "deleted unique:" << entry->s; - delete entry; - } - } - - // qDebug() << "before:" << m_stringRepository.size() << "after:" << compressed.size() << globalObject.objectValue()->m_members.size(); - m_stringRepository = compressed; - rehashStringRepository(/*resize=*/ false); - m_oldStringRepositorySize = m_stringRepository.size(); - m_newAllocatedStringRepositoryChars = 0; - - compressed.clear(); - for (int i = 0; i < m_tempStringRepository.size(); ++i) { - QScriptNameIdImpl *entry = m_tempStringRepository.at(i); - - if (entry->used || entry->persistent) { - compressed.append(entry); - entry->used = false; - } - - else { - //qDebug() << "deleted:" << entry->s; - delete entry; - } - } - - //qDebug() << "before:" << m_tempStringRepository.size() << "after:" << compressed.size(); - - m_tempStringRepository = compressed; - m_oldTempStringRepositorySize = m_tempStringRepository.size(); - m_newAllocatedTempStringRepositoryChars = 0; -} - -void QScriptEnginePrivate::processMarkStack(int generation) -{ - // mark the objects we couldn't process due to recursion depth - while (!m_markStack.isEmpty()) - markObject(m_markStack.takeLast(), generation); -} - -void QScriptEnginePrivate::evaluate(QScriptContextPrivate *context, const QString &contents, int lineNumber, const QString &fileName) -{ - // ### try to remove cast - QScript::EvalFunction *evalFunction = static_cast<QScript::EvalFunction*>(m_evalFunction); - evalFunction->evaluate(context, contents, lineNumber, fileName, /*calledFromScript=*/ false); -} - -qsreal QScriptEnginePrivate::convertToNativeDouble_helper(const QScriptValueImpl &value) -{ - switch (value.type()) { - case QScript::InvalidType: - Q_ASSERT(value.isValid()); - break; - - case QScript::UndefinedType: - case QScript::PointerType: - break; - - case QScript::NullType: - return 0; - - case QScript::BooleanType: - return value.m_bool_value; - - case QScript::IntegerType: - case QScript::ReferenceType: - return value.m_int_value; - - case QScript::NumberType: - return value.m_number_value; - - case QScript::StringType: - return QScript::numberFromString(toString(value.m_string_value)); - - case QScript::ObjectType: { - QScriptValueImpl p = value.engine()->toPrimitive(value, QScriptValueImpl::NumberTypeHint); - if (! p.isValid() || p.isObject()) - break; - - return convertToNativeDouble(p); - } - - case QScript::LazyStringType: - return QScript::numberFromString(*value.m_lazy_string_value); - - } // switch - - return qSNaN(); -} - -bool QScriptEnginePrivate::convertToNativeBoolean_helper(const QScriptValueImpl &value) -{ - switch (value.type()) { - case QScript::InvalidType: - Q_ASSERT(value.isValid()); - return false; - - case QScript::UndefinedType: - case QScript::PointerType: - case QScript::NullType: - case QScript::ReferenceType: - return false; - - case QScript::BooleanType: - return value.m_bool_value; - - case QScript::IntegerType: - return value.m_int_value != 0; - - case QScript::NumberType: - return value.m_number_value != 0 && !qIsNaN(value.m_number_value); - - case QScript::StringType: - return toString(value.m_string_value).length() != 0; - - case QScript::ObjectType: - return true; - - case QScript::LazyStringType: - return value.m_lazy_string_value->length() != 0; - - } // switch - - return false; -} - -QString QScriptEnginePrivate::convertToNativeString_helper(const QScriptValueImpl &value) -{ - static QStringList predefined; - if (predefined.isEmpty()) { - predefined.append(QString::fromLatin1("undefined")); - predefined.append(QString::fromLatin1("null")); - predefined.append(QString::fromLatin1("true")); - predefined.append(QString::fromLatin1("false")); - predefined.append(QString::fromLatin1("pointer")); - } - - switch (value.type()) { - case QScript::InvalidType: - Q_ASSERT(value.isValid()); - return QString(); - - case QScript::UndefinedType: - return predefined.at(0); - - case QScript::NullType: - return predefined.at(1); - - case QScript::BooleanType: - return value.m_bool_value ? predefined.at(2) : predefined.at(3); - - case QScript::IntegerType: - return QString::number(value.m_int_value); - - case QScript::NumberType: - return QScript::numberToString(value.m_number_value); - - case QScript::PointerType: - return predefined.at(4); - - case QScript::StringType: - return toString(value.m_string_value); - - case QScript::ReferenceType: - return QString(); - - case QScript::ObjectType: { - QScriptValueImpl p = value.engine()->toPrimitive(value, QScriptValueImpl::StringTypeHint); - - if (!p.isValid() || strictlyEquals(p, value)) - return p.classInfo()->name(); - - return convertToNativeString(p); - } - - case QScript::LazyStringType: - return *value.m_lazy_string_value; - - } // switch - - return QString(); -} - -QScriptValueImpl QScriptEnginePrivate::toObject_helper(const QScriptValueImpl &value) -{ - QScriptValueImpl result; - switch (value.type()) { - case QScript::BooleanType: - booleanConstructor->newBoolean(&result, value.m_bool_value); - break; - - case QScript::NumberType: - numberConstructor->newNumber(&result, value.m_number_value); - break; - - case QScript::StringType: - stringConstructor->newString(&result, value.m_string_value->s); - break; - - case QScript::LazyStringType: - stringConstructor->newString(&result, *value.m_lazy_string_value); - break; - - case QScript::InvalidType: - case QScript::UndefinedType: - case QScript::NullType: - case QScript::IntegerType: - case QScript::ReferenceType: - case QScript::PointerType: - case QScript::ObjectType: - break; - } // switch - - return result; -} - -// [[defaultValue]] -QScriptValueImpl QScriptEnginePrivate::toPrimitive_helper(const QScriptValueImpl &object, - QScriptValueImpl::TypeHint hint) -{ - QScriptNameIdImpl *functionIds[2]; - - if ((hint == QScriptValueImpl::NumberTypeHint) - || (hint == QScriptValueImpl::NoTypeHint - && object.classInfo() != dateConstructor->classInfo())) { - functionIds[0] = idTable()->id_valueOf; - functionIds[1] = idTable()->id_toString; - } else { - functionIds[0] = idTable()->id_toString; - functionIds[1] = idTable()->id_valueOf; - } - - for (int i = 0; i < 2; ++i) { - QScriptValueImpl base; - QScript::Member member; - - if (! object.resolve(functionIds[i], &member, &base, QScriptValue::ResolvePrototype, QScript::Read)) - return object; - - QScriptValueImpl f_valueOf; - base.get(member, &f_valueOf); - - if (QScriptFunction *foo = convertToNativeFunction(f_valueOf)) { - QScriptContextPrivate *me = pushContext(); - QScriptValueImpl activation; - newActivation(&activation); - if (f_valueOf.scope().isValid()) - activation.setScope(f_valueOf.scope()); - else - activation.setScope(m_globalObject); - me->setActivationObject(activation); - me->setThisObject(object); - me->m_callee = f_valueOf; - foo->execute(me); - QScriptValueImpl result = me->returnValue(); - bool exception = (me->state() == QScriptContext::ExceptionState); - popContext(); - if (exception || (result.isValid() && !result.isObject())) - return result; - } - } - - return object; -} - -void QScriptEnginePrivate::rehashStringRepository(bool resize) -{ - if (resize) { - delete[] m_string_hash_base; - m_string_hash_size <<= 1; // ### use primes - - m_string_hash_base = new QScriptNameIdImpl* [m_string_hash_size]; - } - - memset(m_string_hash_base, 0, sizeof(QScriptNameIdImpl*) * m_string_hash_size); - - for (int index = 0; index < m_stringRepository.size(); ++index) { - QScriptNameIdImpl *entry = m_stringRepository.at(index); - uint h = _q_scriptHash(entry->s) % m_string_hash_size; - entry->h = h; - entry->next = m_string_hash_base[h]; - m_string_hash_base[h] = entry; - } -} - -QScriptNameIdImpl *QScriptEnginePrivate::insertStringEntry(const QString &s) -{ - QScriptNameIdImpl *entry = new QScriptNameIdImpl(s); - entry->unique = true; - m_stringRepository.append(entry); - m_newAllocatedStringRepositoryChars += s.length(); - - uint h = _q_scriptHash(s) % m_string_hash_size; - entry->h = h; - entry->next = m_string_hash_base[h]; - m_string_hash_base[h] = entry; - - if (m_stringRepository.count() == m_string_hash_size) - rehashStringRepository(); - - return entry; -} - -QScriptValueImpl QScriptEnginePrivate::call(const QScriptValueImpl &callee, - const QScriptValueImpl &thisObject, - const QScriptValueImplList &args, - bool asConstructor) -{ - QScriptFunction *function = callee.toFunction(); - Q_ASSERT(function); - - if (++m_callDepth == m_maxCallDepth) { - QScriptContextPrivate *ctx_p = currentContext(); - return ctx_p->throwError(QLatin1String("call stack overflow")); - } - - QScriptContextPrivate *nested = pushContext(); - // set up the temp stack - if (! nested->tempStack) - nested->stackPtr = nested->tempStack = tempStackBegin; - - newActivation(&nested->m_activation); - if (callee.m_object_value->m_scope.isValid()) - nested->m_activation.m_object_value->m_scope = callee.m_object_value->m_scope; - else - nested->m_activation.m_object_value->m_scope = m_globalObject; - - QScriptObject *activation_data = nested->m_activation.m_object_value; - - int formalCount = function->formals.count(); - int argc = args.count(); - int mx = qMax(formalCount, argc); - activation_data->m_members.resize(mx); - activation_data->m_values.resize(mx); - for (int i = 0; i < mx; ++i) { - QScriptNameIdImpl *nameId = 0; - if (i < formalCount) - nameId = function->formals.at(i); - - activation_data->m_members[i].object(nameId, i, QScriptValue::SkipInEnumeration); - QScriptValueImpl arg = (i < argc) ? args.at(i) : m_undefinedValue; - if (arg.isValid() && arg.engine() && (arg.engine() != this)) { - qWarning("QScriptValue::call() failed: " - "cannot call function with argument created in " - "a different engine"); - popContext(); - return QScriptValueImpl(); - } - activation_data->m_values[i] = arg.isValid() ? arg : m_undefinedValue; - } - - nested->argc = argc; - QVector<QScriptValueImpl> argsv = args.toVector(); - nested->args = const_cast<QScriptValueImpl*> (argsv.constData()); - - if (thisObject.isObject()) - nested->m_thisObject = thisObject; - else - nested->m_thisObject = m_globalObject; - nested->m_callee = callee; - nested->m_calledAsConstructor = asConstructor; - - nested->m_result = m_undefinedValue; - function->execute(nested); - --m_callDepth; - QScriptValueImpl result = nested->m_result; - nested->args = 0; - popContext(); - - return result; -} - -QScriptValueImpl QScriptEnginePrivate::call(const QScriptValueImpl &callee, - const QScriptValueImpl &thisObject, - const QScriptValueImpl &args, - bool asConstructor) -{ - QScriptValueImplList argsList; - if (QScript::Ecma::Array::Instance *arr = arrayConstructor->get(args)) { - QScript::Array actuals = arr->value; - for (quint32 i = 0; i < actuals.count(); ++i) { - QScriptValueImpl a = actuals.at(i); - if (! a.isValid()) - argsList << undefinedValue(); - else - argsList << a; - } - } else if (args.classInfo() == m_class_arguments) { - QScript::ArgumentsObjectData *arguments; - arguments = static_cast<QScript::ArgumentsObjectData*> (args.objectData()); - QScriptObject *activation = arguments->activation.objectValue(); - for (uint i = 0; i < arguments->length; ++i) - argsList << activation->m_values[i]; - } else if (!(args.isUndefined() || args.isNull())) { - return currentContext()->throwError( - QScriptContext::TypeError, - QLatin1String("QScriptValue::call(): arguments must be an array")); - } - return call(callee, thisObject, argsList, asConstructor); -} - -QScriptValueImpl QScriptEnginePrivate::arrayFromStringList(const QStringList &lst) -{ - QScriptValueImpl arr = newArray(lst.size()); - for (int i = 0; i < lst.size(); ++i) - arr.setProperty(i, QScriptValueImpl(this, lst.at(i))); - return arr; -} - -QStringList QScriptEnginePrivate::stringListFromArray(const QScriptValueImpl &arr) -{ - QStringList lst; - uint len = arr.property(QLatin1String("length")).toUInt32(); - for (uint i = 0; i < len; ++i) - lst.append(arr.property(i).toString()); - return lst; -} - -QScriptValueImpl QScriptEnginePrivate::arrayFromVariantList(const QVariantList &lst) -{ - QScriptValueImpl arr = newArray(lst.size()); - for (int i = 0; i < lst.size(); ++i) - arr.setProperty(i, valueFromVariant(lst.at(i))); - return arr; -} - -QVariantList QScriptEnginePrivate::variantListFromArray(const QScriptValueImpl &arr) -{ - QVariantList lst; - uint len = arr.property(QLatin1String("length")).toUInt32(); - for (uint i = 0; i < len; ++i) - lst.append(arr.property(i).toVariant()); - return lst; -} - -QScriptValueImpl QScriptEnginePrivate::objectFromVariantMap(const QVariantMap &vmap) -{ - QScriptValueImpl obj = newObject(); - QVariantMap::const_iterator it; - for (it = vmap.constBegin(); it != vmap.constEnd(); ++it) - obj.setProperty(it.key(), valueFromVariant(it.value())); - return obj; -} - -QVariantMap QScriptEnginePrivate::variantMapFromObject(const QScriptValueImpl &obj) -{ - QVariantMap vmap; - QScriptValueIteratorImpl it(obj); - while (it.hasNext()) { - it.next(); - vmap.insert(it.name(), it.value().toVariant()); - } - return vmap; -} - -QScriptValueImpl QScriptEnginePrivate::create(int type, const void *ptr) -{ - Q_Q(QScriptEngine); - Q_ASSERT(ptr); - QScriptValueImpl result; - QScriptCustomTypeInfo info = m_customTypes.value(type); - if (info.marshal) { - result = toImpl(info.marshal(q, ptr)); - } else { - // check if it's one of the types we know - switch (QMetaType::Type(type)) { - case QMetaType::Void: - result = m_undefinedValue; - break; - case QMetaType::Bool: - result = QScriptValueImpl(*reinterpret_cast<const bool*>(ptr)); - break; - case QMetaType::Int: - result = QScriptValueImpl(*reinterpret_cast<const int*>(ptr)); - break; - case QMetaType::UInt: - result = QScriptValueImpl(*reinterpret_cast<const uint*>(ptr)); - break; - case QMetaType::LongLong: - result = QScriptValueImpl(qsreal(*reinterpret_cast<const qlonglong*>(ptr))); - break; - case QMetaType::ULongLong: -#if defined(Q_OS_WIN) && defined(_MSC_FULL_VER) && _MSC_FULL_VER <= 12008804 -#pragma message("** NOTE: You need the Visual Studio Processor Pack to compile support for 64bit unsigned integers.") - result = QScriptValueImpl(qsreal((qlonglong)*reinterpret_cast<const qulonglong*>(ptr))); -#elif defined(Q_CC_MSVC) && !defined(Q_CC_MSVC_NET) - result = QScriptValueImpl(qsreal((qlonglong)*reinterpret_cast<const qulonglong*>(ptr))); -#else - result = QScriptValueImpl(qsreal(*reinterpret_cast<const qulonglong*>(ptr))); -#endif - break; - case QMetaType::Double: - result = QScriptValueImpl(*reinterpret_cast<const double*>(ptr)); - break; - case QMetaType::QString: - result = QScriptValueImpl(this, *reinterpret_cast<const QString*>(ptr)); - break; - case QMetaType::Float: - result = QScriptValueImpl(*reinterpret_cast<const float*>(ptr)); - break; - case QMetaType::Short: - result = QScriptValueImpl(*reinterpret_cast<const short*>(ptr)); - break; - case QMetaType::UShort: - result = QScriptValueImpl(*reinterpret_cast<const unsigned short*>(ptr)); - break; - case QMetaType::Char: - result = QScriptValueImpl(*reinterpret_cast<const char*>(ptr)); - break; - case QMetaType::UChar: - result = QScriptValueImpl(*reinterpret_cast<const unsigned char*>(ptr)); - break; - case QMetaType::QChar: - result = QScriptValueImpl((*reinterpret_cast<const QChar*>(ptr)).unicode()); - break; - case QMetaType::QStringList: - result = arrayFromStringList(*reinterpret_cast<const QStringList *>(ptr)); - break; - case QMetaType::QVariantList: - result = arrayFromVariantList(*reinterpret_cast<const QVariantList *>(ptr)); - break; - case QMetaType::QVariantMap: - result = objectFromVariantMap(*reinterpret_cast<const QVariantMap *>(ptr)); - break; - case QMetaType::QDateTime: { - QDateTime dateTime = *reinterpret_cast<const QDateTime *>(ptr); - dateConstructor->newDate(&result, dateTime); - } break; - case QMetaType::QDate: { - QDate date = *reinterpret_cast<const QDate *>(ptr); - dateConstructor->newDate(&result, date); - } break; -#ifndef QT_NO_REGEXP - case QMetaType::QRegExp: { - QRegExp rx = *reinterpret_cast<const QRegExp *>(ptr); - regexpConstructor->newRegExp(&result, rx); - } break; -#endif -#ifndef QT_NO_QOBJECT - case QMetaType::QObjectStar: - case QMetaType::QWidgetStar: - newQObject(&result, *reinterpret_cast<QObject* const *>(ptr)); - break; -#endif - default: - if (type == qMetaTypeId<QScriptValue>()) { - result = toImpl(*reinterpret_cast<const QScriptValue*>(ptr)); - if (!result.isValid()) - result = m_undefinedValue; - } - -#ifndef QT_NO_QOBJECT - // lazy registration of some common list types - else if (type == qMetaTypeId<QObjectList>()) { - qScriptRegisterSequenceMetaType<QObjectList>(q); - return create(type, ptr); - } -#endif - else if (type == qMetaTypeId<QList<int> >()) { - qScriptRegisterSequenceMetaType<QList<int> >(q); - return create(type, ptr); - } - - else { - QByteArray typeName = QMetaType::typeName(type); - if (typeName == "QVariant") - result = valueFromVariant(*reinterpret_cast<const QVariant*>(ptr)); - else if (typeName.endsWith('*') && !*reinterpret_cast<void* const *>(ptr)) - result = nullValue(); - else - newVariant(&result, QVariant(type, ptr)); - } - } - } - if (result.isObject() && info.prototype.isValid() - && strictlyEquals(result.prototype(), objectConstructor->publicPrototype)) { - result.setPrototype(info.prototype); - } - return result; -} - -bool QScriptEnginePrivate::convert(const QScriptValueImpl &value, - int type, void *ptr, - QScriptEnginePrivate *eng) -{ - if (!eng) - eng = value.engine(); - if (eng) { - QScriptCustomTypeInfo info = eng->m_customTypes.value(type); - if (info.demarshal) { - info.demarshal(eng->toPublic(value), ptr); - return true; - } - } - - // check if it's one of the types we know - switch (QMetaType::Type(type)) { - case QMetaType::Bool: - *reinterpret_cast<bool*>(ptr) = value.toBoolean(); - return true; - case QMetaType::Int: - *reinterpret_cast<int*>(ptr) = value.toInt32(); - return true; - case QMetaType::UInt: - *reinterpret_cast<uint*>(ptr) = value.toUInt32(); - return true; - case QMetaType::LongLong: - *reinterpret_cast<qlonglong*>(ptr) = qlonglong(value.toInteger()); - return true; - case QMetaType::ULongLong: - *reinterpret_cast<qulonglong*>(ptr) = qulonglong(value.toInteger()); - return true; - case QMetaType::Double: - *reinterpret_cast<double*>(ptr) = value.toNumber(); - return true; - case QMetaType::QString: - if (value.isUndefined() || value.isNull()) - *reinterpret_cast<QString*>(ptr) = QString(); - else - *reinterpret_cast<QString*>(ptr) = value.toString(); - return true; - case QMetaType::Float: - *reinterpret_cast<float*>(ptr) = value.toNumber(); - return true; - case QMetaType::Short: - *reinterpret_cast<short*>(ptr) = short(value.toInt32()); - return true; - case QMetaType::UShort: - *reinterpret_cast<unsigned short*>(ptr) = value.toUInt16(); - return true; - case QMetaType::Char: - *reinterpret_cast<char*>(ptr) = char(value.toInt32()); - return true; - case QMetaType::UChar: - *reinterpret_cast<unsigned char*>(ptr) = (unsigned char)(value.toInt32()); - return true; - case QMetaType::QChar: - if (value.isString()) { - QString str = value.toString(); - *reinterpret_cast<QChar*>(ptr) = str.isEmpty() ? QChar() : str.at(0); - } else { - *reinterpret_cast<QChar*>(ptr) = QChar(value.toUInt16()); - } - return true; - case QMetaType::QDateTime: - if (value.isDate()) { - *reinterpret_cast<QDateTime *>(ptr) = value.toDateTime(); - return true; - } break; - case QMetaType::QDate: - if (value.isDate()) { - *reinterpret_cast<QDate *>(ptr) = value.toDateTime().date(); - return true; - } break; -#ifndef QT_NO_REGEXP - case QMetaType::QRegExp: - if (value.isRegExp()) { - *reinterpret_cast<QRegExp *>(ptr) = value.toRegExp(); - return true; - } break; -#endif -#ifndef QT_NO_QOBJECT - case QMetaType::QObjectStar: - if (value.isQObject() || value.isNull()) { - *reinterpret_cast<QObject* *>(ptr) = value.toQObject(); - return true; - } break; - case QMetaType::QWidgetStar: - if (value.isQObject() || value.isNull()) { - QObject *qo = value.toQObject(); - if (!qo || qo->isWidgetType()) { - *reinterpret_cast<QWidget* *>(ptr) = reinterpret_cast<QWidget*>(qo); - return true; - } - } break; -#endif - case QMetaType::QStringList: - if (value.isArray()) { - *reinterpret_cast<QStringList *>(ptr) = stringListFromArray(value); - return true; - } break; - case QMetaType::QVariantList: - if (value.isArray()) { - *reinterpret_cast<QVariantList *>(ptr) = variantListFromArray(value); - return true; - } break; - case QMetaType::QVariantMap: - if (value.isObject()) { - *reinterpret_cast<QVariantMap *>(ptr) = variantMapFromObject(value); - return true; - } break; - default: - ; - } - - QByteArray name = QMetaType::typeName(type); -#ifndef QT_NO_QOBJECT - if (convertToNativeQObject(value, name, reinterpret_cast<void* *>(ptr))) - return true; -#endif - if (value.isVariant() && name.endsWith('*')) { - int valueType = QMetaType::type(name.left(name.size()-1)); - QVariant &var = value.variantValue(); - if (valueType == var.userType()) { - *reinterpret_cast<void* *>(ptr) = var.data(); - return true; - } else { - // look in the prototype chain - QScriptValueImpl proto = value.prototype(); - while (proto.isObject()) { - bool canCast = false; - if (proto.isVariant()) { - canCast = (type == proto.variantValue().userType()) - || (valueType && (valueType == proto.variantValue().userType())); - } -#ifndef QT_NO_QOBJECT - else if (proto.isQObject()) { - QByteArray className = name.left(name.size()-1); - if (QObject *qobject = proto.toQObject()) - canCast = qobject->qt_metacast(className) != 0; - } -#endif - if (canCast) { - QByteArray varTypeName = QMetaType::typeName(var.userType()); - if (varTypeName.endsWith('*')) - *reinterpret_cast<void* *>(ptr) = *reinterpret_cast<void* *>(var.data()); - else - *reinterpret_cast<void* *>(ptr) = var.data(); - return true; - } - proto = proto.prototype(); - } - } - } else if (value.isNull() && name.endsWith('*')) { - *reinterpret_cast<void* *>(ptr) = 0; - return true; - } else if (type == qMetaTypeId<QScriptValue>()) { - if (!eng) - return false; - *reinterpret_cast<QScriptValue*>(ptr) = eng->toPublic(value); - return true; - } else if (name == "QVariant") { - *reinterpret_cast<QVariant*>(ptr) = value.toVariant(); - return true; - } - - // lazy registration of some common list types -#ifndef QT_NO_QOBJECT - else if (type == qMetaTypeId<QObjectList>()) { - if (!eng) - return false; - qScriptRegisterSequenceMetaType<QObjectList>(eng->q_func()); - return convert(value, type, ptr, eng); - } -#endif - else if (type == qMetaTypeId<QList<int> >()) { - if (!eng) - return false; - qScriptRegisterSequenceMetaType<QList<int> >(eng->q_func()); - return convert(value, type, ptr, eng); - } - -#if 0 - if (!name.isEmpty()) { - qWarning("QScriptEngine::convert: unable to convert value to type `%s'", - name.constData()); - } -#endif - return false; -} - -QScriptEngine::DemarshalFunction QScriptEnginePrivate::demarshalFunction(int type) const -{ - return m_customTypes.value(type).demarshal; -} - -QScriptValuePrivate *QScriptEnginePrivate::registerValue(const QScriptValueImpl &value) -{ - if (value.isString()) { - QScriptNameIdImpl *id = value.stringValue(); - QScriptValuePrivate *p = m_stringHandles.value(id); - if (p) - return p; - p = m_handleRepository.get(); - p->engine = q_func(); - p->value = value; - m_stringHandles.insert(id, p); - return p; - } else if (value.isObject()) { - QScriptObject *instance = value.objectValue(); - QScriptValuePrivate *p = m_objectHandles.value(instance); - if (p) - return p; - p = m_handleRepository.get(); - p->engine = q_func(); - p->value = value; - m_objectHandles.insert(instance, p); - return p; - } - QScriptValuePrivate *p = m_handleRepository.get(); - p->engine = q_func(); - p->value = value; - m_otherHandles.append(p); - return p; -} - -QScriptEnginePrivate::QScriptEnginePrivate() -{ - m_undefinedValue = QScriptValueImpl(QScriptValue::UndefinedValue); - m_nullValue = QScriptValueImpl(QScriptValue::NullValue); - - m_evaluating = false; - m_abort = false; - m_callDepth = 0; -#if defined(Q_OS_WIN) - m_maxCallDepth = 88; -#elif defined(Q_OS_MAC) - m_maxCallDepth = 640; -#elif defined(QT_ARCH_ARM) || defined(QT_ARCH_ARMV6) - m_maxCallDepth = 360; -#else - m_maxCallDepth = 512; -#endif - m_oldStringRepositorySize = 0; - m_oldTempStringRepositorySize = 0; - m_newAllocatedStringRepositoryChars = 0; - m_newAllocatedTempStringRepositoryChars = 0; - m_context = 0; - m_abstractSyntaxTree = 0; - m_lexer = 0; - m_scriptCounter = 0; - m_agent = 0; - m_objectGeneration = 0; - m_class_prev_id = QScriptClassInfo::CustomType; - m_next_object_id = 0; - m_gc_depth = -1; - - objectConstructor = 0; - numberConstructor = 0; - booleanConstructor = 0; - stringConstructor = 0; - dateConstructor = 0; - functionConstructor = 0; - arrayConstructor = 0; - regexpConstructor = 0; - errorConstructor = 0; - enumerationConstructor = 0; - variantConstructor = 0; - qobjectConstructor = 0; - qmetaObjectConstructor = 0; - - m_processEventsInterval = -1; - m_nextProcessEvents = 0; - m_processEventIncr = 0; - - m_stringRepository.reserve(DefaultHashSize); - m_string_hash_size = DefaultHashSize; - m_string_hash_base = new QScriptNameIdImpl* [m_string_hash_size]; - memset(m_string_hash_base, 0, sizeof(QScriptNameIdImpl*) * m_string_hash_size); - - tempStackBegin = 0; -} - -void QScriptEnginePrivate::init() -{ - qMetaTypeId<QScriptValue>(); - qMetaTypeId<QList<int> >(); -#ifndef QT_NO_QOBJECT - qMetaTypeId<QObjectList>(); -#endif - - m_class_prev_id = QScriptClassInfo::CustomType; - m_class_object = registerClass(QLatin1String("Object"), QScriptClassInfo::ObjectType); - m_class_function = registerClass(QLatin1String("Function"), QScriptClassInfo::FunctionType); - m_class_activation = registerClass(QLatin1String("activation"), QScriptClassInfo::ActivationType); - - m_class_arguments = registerClass(QLatin1String("arguments"), QScript::ObjectType); - m_class_arguments->setData(new QScript::ArgumentsClassData()); - - m_class_with = registerClass(QLatin1String("__qscript_internal_with"), QScript::ObjectType); - - // public name ids - m_id_table.id_constructor = nameId(QLatin1String("constructor"), true); - m_id_table.id_false = nameId(QLatin1String("false"), true); - m_id_table.id_null = nameId(QLatin1String("null"), true); - m_id_table.id_object = nameId(QLatin1String("object"), true); - m_id_table.id_pointer = nameId(QLatin1String("pointer"), true); - m_id_table.id_prototype = nameId(QLatin1String("prototype"), true); - m_id_table.id_arguments = nameId(QLatin1String("arguments"), true); - m_id_table.id_this = nameId(QLatin1String("this"), true); - m_id_table.id_toString = nameId(QLatin1String("toString"), true); - m_id_table.id_true = nameId(QLatin1String("true"), true); - m_id_table.id_undefined = nameId(QLatin1String("undefined"), true); - m_id_table.id_valueOf = nameId(QLatin1String("valueOf"), true); - m_id_table.id_length = nameId(QLatin1String("length"), true); - m_id_table.id_callee = nameId(QLatin1String("callee"), true); - m_id_table.id___proto__ = nameId(QLatin1String("__proto__"), true); - m_id_table.id___qt_sender__ = nameId(QLatin1String("__qt_sender__"), true); - - const int TEMP_STACK_SIZE = 10 * 1024; - tempStackBegin = new QScriptValueImpl[TEMP_STACK_SIZE]; - tempStackEnd = tempStackBegin + TEMP_STACK_SIZE; - tempStackBegin[0] = m_undefinedValue; - - objectAllocator.blockGC(true); - - QScript::Ecma::Global::construct(&m_globalObject, this); - - // create the prototypes first... - objectConstructor = new QScript::Ecma::Object(this, m_class_object); - functionConstructor = new QScript::Ecma::Function(this, m_class_function); - // ... then we can initialize - functionConstructor->initialize(); - objectConstructor->initialize(); - - numberConstructor = new QScript::Ecma::Number(this); - booleanConstructor = new QScript::Ecma::Boolean(this); - stringConstructor = new QScript::Ecma::String(this); - dateConstructor = new QScript::Ecma::Date(this); - arrayConstructor = new QScript::Ecma::Array(this); - regexpConstructor = new QScript::Ecma::RegExp(this); - errorConstructor = new QScript::Ecma::Error(this); - - QScript::Ecma::Global::initialize(&m_globalObject, this); - - const QScriptValue::PropertyFlags flags = QScriptValue::SkipInEnumeration; - - m_globalObject.setProperty(QLatin1String("Object"), - objectConstructor->ctor, flags); - m_globalObject.setProperty(QLatin1String("Function"), - functionConstructor->ctor, flags); - m_globalObject.setProperty(QLatin1String("Number"), - numberConstructor->ctor, flags); - m_globalObject.setProperty(QLatin1String("Boolean"), - booleanConstructor->ctor, flags); - m_globalObject.setProperty(QLatin1String("String"), - stringConstructor->ctor, flags); - m_globalObject.setProperty(QLatin1String("Date"), - dateConstructor->ctor, flags); - m_globalObject.setProperty(QLatin1String("Array"), - arrayConstructor->ctor, flags); - m_globalObject.setProperty(QLatin1String("RegExp"), - regexpConstructor->ctor, flags); - m_globalObject.setProperty(QLatin1String("Error"), - errorConstructor->ctor, flags); - - m_globalObject.setProperty(QLatin1String("EvalError"), - errorConstructor->evalErrorCtor, flags); - m_globalObject.setProperty(QLatin1String("RangeError"), - errorConstructor->rangeErrorCtor, flags); - m_globalObject.setProperty(QLatin1String("ReferenceError"), - errorConstructor->referenceErrorCtor, flags); - m_globalObject.setProperty(QLatin1String("SyntaxError"), - errorConstructor->syntaxErrorCtor, flags); - m_globalObject.setProperty(QLatin1String("TypeError"), - errorConstructor->typeErrorCtor, flags); - m_globalObject.setProperty(QLatin1String("URIError"), - errorConstructor->uriErrorCtor, flags); - - QScriptValueImpl tmp; // ### fixme - m_evalFunction = new QScript::EvalFunction(this); - functionConstructor->newFunction(&tmp, m_evalFunction); - m_globalObject.setProperty(QLatin1String("eval"), tmp, flags); - - QScriptValueImpl mathObject; - QScript::Ecma::Math::construct(&mathObject, this); - m_globalObject.setProperty(QLatin1String("Math"), mathObject, flags); - - enumerationConstructor = new QScript::Ext::Enumeration(this); - - variantConstructor = new QScript::Ext::Variant(this); - -#ifndef QT_NO_QOBJECT - qobjectConstructor = new QScript::ExtQObject(this); - qmetaObjectConstructor = new QScript::ExtQMetaObject(this); -#endif - - objectAllocator.blockGC(false); - - QScriptContextPrivate *context_p = pushContext(); - context_p->setActivationObject(m_globalObject); - context_p->setThisObject(m_globalObject); -} - -#if !defined(QT_NO_QOBJECT) && !defined(QT_NO_LIBRARY) -static QScriptValueImpl __setupPackage__(QScriptContextPrivate *ctx, - QScriptEnginePrivate *eng, - QScriptClassInfo *) -{ - QString path = ctx->argument(0).toString(); - QStringList components = path.split(QLatin1Char('.')); - QScriptValueImpl o = eng->globalObject(); - for (int i = 0; i < components.count(); ++i) { - QString name = components.at(i); - QScriptValueImpl oo = o.property(name); - if (!oo.isValid()) { - oo = eng->newObject(); - o.setProperty(name, oo); - } - o = oo; - } - return o; -} -#endif - -QScriptValueImpl QScriptEnginePrivate::importExtension(const QString &extension) -{ -#if defined(QT_NO_QOBJECT) || defined(QT_NO_LIBRARY) || defined(QT_NO_SETTINGS) - Q_UNUSED(extension); -#else - Q_Q(QScriptEngine); - if (m_importedExtensions.contains(extension)) - return undefinedValue(); // already imported - - QScriptContextPrivate *context = currentContext(); - QCoreApplication *app = QCoreApplication::instance(); - if (!app) - return context->throwError(QLatin1String("No application object")); - - QObjectList staticPlugins = QPluginLoader::staticInstances(); - QStringList libraryPaths = app->libraryPaths(); - QString dot = QLatin1String("."); - QStringList pathComponents = extension.split(dot); - QString initDotJs = QLatin1String("__init__.js"); - - QString ext; - for (int i = 0; i < pathComponents.count(); ++i) { - if (!ext.isEmpty()) - ext.append(dot); - ext.append(pathComponents.at(i)); - if (m_importedExtensions.contains(ext)) - continue; // already imported - - if (m_extensionsBeingImported.contains(ext)) { - return context->throwError(QString::fromLatin1("recursive import of %0") - .arg(extension)); - } - m_extensionsBeingImported.insert(ext); - - QScriptExtensionInterface *iface = 0; - QString initjsContents; - QString initjsFileName; - - // look for the extension in static plugins - for (int j = 0; j < staticPlugins.size(); ++j) { - iface = qobject_cast<QScriptExtensionInterface*>(staticPlugins.at(j)); - if (!iface) - continue; - if (iface->keys().contains(ext)) - break; // use this one - else - iface = 0; // keep looking - } - - { - // look for __init__.js resource - QString path = QString::fromLatin1(":/qtscriptextension"); - for (int j = 0; j <= i; ++j) { - path.append(QLatin1Char('/')); - path.append(pathComponents.at(j)); - } - path.append(QLatin1Char('/')); - path.append(initDotJs); - QFile file(path); - if (file.open(QIODevice::ReadOnly)) { - QTextStream ts(&file); - initjsContents = ts.readAll(); - initjsFileName = path; - file.close(); - } - } - - if (!iface && initjsContents.isEmpty()) { - // look for the extension in library paths - for (int j = 0; j < libraryPaths.count(); ++j) { - QString libPath = libraryPaths.at(j) + QDir::separator() + QLatin1String("script"); - QDir dir(libPath); - if (!dir.exists(dot)) - continue; - - // look for C++ plugin - QFileInfoList files = dir.entryInfoList(QDir::Files); - for (int k = 0; k < files.count(); ++k) { - QFileInfo entry = files.at(k); - QString filePath = entry.canonicalFilePath(); - QPluginLoader loader(filePath); - iface = qobject_cast<QScriptExtensionInterface*>(loader.instance()); - if (iface) { - if (iface->keys().contains(ext)) - break; // use this one - else - iface = 0; // keep looking - } - } - - // look for __init__.js in the corresponding dir - QDir dirdir(libPath); - bool dirExists = dirdir.exists(); - for (int k = 0; dirExists && (k <= i); ++k) - dirExists = dirdir.cd(pathComponents.at(k)); - if (dirExists && dirdir.exists(initDotJs)) { - QFile file(dirdir.canonicalPath() - + QDir::separator() + initDotJs); - if (file.open(QIODevice::ReadOnly)) { - QTextStream ts(&file); - initjsContents = ts.readAll(); - initjsFileName = file.fileName(); - file.close(); - } - } - - if (iface || !initjsContents.isEmpty()) - break; - } - } - - if (!iface && initjsContents.isEmpty()) { - m_extensionsBeingImported.remove(ext); - return context->throwError( - QString::fromLatin1("Unable to import %0: no such extension") - .arg(extension)); - } - - // initialize the extension in a new context - QScriptContextPrivate *ctx_p = pushContext(); - ctx_p->setThisObject(globalObject()); - newActivation(&ctx_p->m_activation); - QScriptObject *activation_data = ctx_p->m_activation.m_object_value; - activation_data->m_scope = globalObject(); - - activation_data->m_members.resize(4); - activation_data->m_values.resize(4); - activation_data->m_members[0].object( - nameId(QLatin1String("__extension__")), 0, - QScriptValue::ReadOnly | QScriptValue::Undeletable); - activation_data->m_values[0] = QScriptValueImpl(this, ext); - activation_data->m_members[1].object( - nameId(QLatin1String("__setupPackage__")), 1, 0); - activation_data->m_values[1] = createFunction(__setupPackage__, 0, 0); - activation_data->m_members[2].object( - nameId(QLatin1String("__all__")), 2, 0); - activation_data->m_values[2] = undefinedValue(); - activation_data->m_members[3].object( - nameId(QLatin1String("__postInit__")), 3, 0); - activation_data->m_values[3] = undefinedValue(); - - // the script is evaluated first - if (!initjsContents.isEmpty()) { - evaluate(ctx_p, initjsContents, /*lineNumber=*/1, initjsFileName); - if (hasUncaughtException()) { - QScriptValueImpl r = ctx_p->returnValue(); - popContext(); - m_extensionsBeingImported.remove(ext); - return r; - } - } - - // next, the C++ plugin is called - if (iface) { - iface->initialize(ext, q); - if (hasUncaughtException()) { - QScriptValueImpl r = ctx_p->returnValue(); - popContext(); - m_extensionsBeingImported.remove(ext); - return r; - } - } - - // if the __postInit__ function has been set, we call it - QScriptValueImpl postInit = ctx_p->m_activation.property(QLatin1String("__postInit__")); - if (postInit.isFunction()) { - postInit.call(globalObject()); - if (hasUncaughtException()) { - QScriptValueImpl r = ctx_p->returnValue(); - popContext(); - m_extensionsBeingImported.remove(ext); - return r; - } - } - - popContext(); - - m_importedExtensions.insert(ext); - m_extensionsBeingImported.remove(ext); - } // for (i) -#endif // QT_NO_QOBJECT - return undefinedValue(); -} - -QStringList QScriptEnginePrivate::availableExtensions() const -{ -#if defined(QT_NO_QOBJECT) || defined(QT_NO_LIBRARY) || defined(QT_NO_SETTINGS) - return QStringList(); -#else - QCoreApplication *app = QCoreApplication::instance(); - if (!app) - return QStringList(); - - QSet<QString> result; - - QObjectList staticPlugins = QPluginLoader::staticInstances(); - for (int i = 0; i < staticPlugins.size(); ++i) { - QScriptExtensionInterface *iface; - iface = qobject_cast<QScriptExtensionInterface*>(staticPlugins.at(i)); - if (iface) { - QStringList keys = iface->keys(); - for (int j = 0; j < keys.count(); ++j) - result << keys.at(j); - } - } - - QStringList libraryPaths = app->libraryPaths(); - for (int i = 0; i < libraryPaths.count(); ++i) { - QString libPath = libraryPaths.at(i) + QDir::separator() + QLatin1String("script"); - QDir dir(libPath); - if (!dir.exists()) - continue; - - // look for C++ plugins - QFileInfoList files = dir.entryInfoList(QDir::Files); - for (int j = 0; j < files.count(); ++j) { - QFileInfo entry = files.at(j); - QString filePath = entry.canonicalFilePath(); - QPluginLoader loader(filePath); - QScriptExtensionInterface *iface; - iface = qobject_cast<QScriptExtensionInterface*>(loader.instance()); - if (iface) { - QStringList keys = iface->keys(); - for (int k = 0; k < keys.count(); ++k) - result << keys.at(k); - } - } - - // look for scripts - QString initDotJs = QLatin1String("__init__.js"); - QList<QFileInfo> stack; - stack << dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); - while (!stack.isEmpty()) { - QFileInfo entry = stack.takeLast(); - QDir dd(entry.canonicalFilePath()); - if (dd.exists(initDotJs)) { - QString rpath = dir.relativeFilePath(dd.canonicalPath()); - QStringList components = rpath.split(QLatin1Char('/')); - result << components.join(QLatin1String(".")); - stack << dd.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot); - } - } - } - - QStringList lst = result.toList(); - qSort(lst); - return lst; -#endif -} - -QStringList QScriptEnginePrivate::importedExtensions() const -{ - QStringList lst = m_importedExtensions.toList(); - qSort(lst); - return lst; -} - -void QScriptEnginePrivate::gc() -{ - if (!objectAllocator.blocked()) { - // do the GC now - maybeGC_helper(/*do_string_gc=*/true); - } else { - // GC will be performed the next time maybeGC() - // is called and the allocator is not blocked - objectAllocator.requestGC(); - } -} - -QStringList QScriptEnginePrivate::uncaughtExceptionBacktrace() const -{ - QScriptValueImpl value = uncaughtException(); - if (!value.isError()) - return m_exceptionBacktrace; - return QScript::Ecma::Error::backtrace(value); -} - -void QScriptEnginePrivate::clearExceptions() -{ - m_exceptionBacktrace = QStringList(); - QScriptContextPrivate *ctx_p = currentContext(); - while (ctx_p) { - ctx_p->m_state = QScriptContext::NormalState; - ctx_p = ctx_p->parentContext(); - } -} - -#ifndef QT_NO_QOBJECT -void QScriptEnginePrivate::emitSignalHandlerException() -{ - Q_Q(QScriptEngine); - emit q->signalHandlerException(toPublic(uncaughtException())); -} -#endif - -void QScriptEnginePrivate::processEvents() -{ -#ifndef QT_NO_QOBJECT - Q_ASSERT(m_processEventTracker.isValid()); - int elapsed = m_processEventTracker.elapsed(); - if (m_nextProcessEvents < elapsed) { - do { - m_nextProcessEvents = m_nextProcessEvents + m_processEventsInterval; - } while (m_nextProcessEvents < elapsed); - QCoreApplication::processEvents(); - } -#endif -} - -void QScriptEnginePrivate::setupProcessEvents() -{ - if (m_processEventsInterval > 0) { - m_nextProcessEvents = m_processEventsInterval; - m_processEventIncr = 0; - m_processEventTracker.restart(); - } -} - -void QScriptEnginePrivate::abortEvaluation(const QScriptValueImpl &result) -{ - m_abort = true; - currentContext()->setReturnValue(result); -} - -#ifndef QT_NO_QOBJECT - -void QScriptEnginePrivate::newQObject(QScriptValueImpl *out, QObject *object, - QScriptEngine::ValueOwnership ownership, - const QScriptEngine::QObjectWrapOptions &options, - bool setDefaultPrototype) -{ - if (!object) { - *out = m_nullValue; - return; - } - Q_ASSERT(qobjectConstructor != 0); - QScriptQObjectData *data = qobjectData(object); - bool preferExisting = (options & QScriptEngine::PreferExistingWrapperObject) != 0; - QScriptEngine::QObjectWrapOptions opt = options & ~QScriptEngine::PreferExistingWrapperObject; - QScriptValueImpl existingWrapper; - bool hasExisting = data->findWrapper(ownership, opt, &existingWrapper); - if (preferExisting) { - if (hasExisting) { - *out = existingWrapper; - } else { - qobjectConstructor->newQObject(out, object, ownership, opt); - data->registerWrapper(*out, ownership, opt); - } - } else { - qobjectConstructor->newQObject(out, object, ownership, opt); - if (!hasExisting) - data->registerWrapper(*out, ownership, opt); - } - - if (setDefaultPrototype) { - const QMetaObject *meta = object->metaObject(); - while (meta) { - QByteArray typeString = meta->className(); - typeString.append('*'); - int typeId = QMetaType::type(typeString); - if (typeId != 0) { - QScriptValueImpl proto = defaultPrototype(typeId); - if (proto.isValid()) { - out->setPrototype(proto); - break; - } - } - meta = meta->superClass(); - } - } -} - -QScriptQObjectData *QScriptEnginePrivate::qobjectData(QObject *object) -{ - QHash<QObject*, QScriptQObjectData*>::const_iterator it; - it = m_qobjectData.constFind(object); - if (it != m_qobjectData.constEnd()) - return it.value(); - - QScriptQObjectData *data = new QScriptQObjectData(); - m_qobjectData.insert(object, data); - QObject::connect(object, SIGNAL(destroyed(QObject*)), - q_func(), SLOT(_q_objectDestroyed(QObject *))); - return data; -} - -void QScriptEnginePrivate::_q_objectDestroyed(QObject *object) -{ - QHash<QObject*, QScriptQObjectData*>::iterator it; - it = m_qobjectData.find(object); - Q_ASSERT(it != m_qobjectData.end()); - QScriptQObjectData *data = it.value(); - m_qobjectData.erase(it); - delete data; -} - -void QScriptEnginePrivate::disposeQObject(QObject *object) -{ - if (isCollecting()) { - // wait until we're done with GC before deleting it - int index = m_qobjectsToBeDeleted.indexOf(object); - if (index == -1) - m_qobjectsToBeDeleted.append(object); - } else { - delete object; - } -} - -void QScriptEnginePrivate::deletePendingQObjects() -{ - while (!m_qobjectsToBeDeleted.isEmpty()) - delete m_qobjectsToBeDeleted.takeFirst(); -} - -bool QScriptEnginePrivate::scriptConnect(QObject *sender, const char *signal, - const QScriptValueImpl &receiver, - const QScriptValueImpl &function) -{ - Q_ASSERT(sender); - Q_ASSERT(signal); - const QMetaObject *meta = sender->metaObject(); - int index = meta->indexOfSignal(QMetaObject::normalizedSignature(signal+1)); - if (index == -1) - return false; - return scriptConnect(sender, index, receiver, function); -} - -bool QScriptEnginePrivate::scriptDisconnect(QObject *sender, const char *signal, - const QScriptValueImpl &receiver, - const QScriptValueImpl &function) -{ - Q_ASSERT(sender); - Q_ASSERT(signal); - const QMetaObject *meta = sender->metaObject(); - int index = meta->indexOfSignal(QMetaObject::normalizedSignature(signal+1)); - if (index == -1) - return false; - return scriptDisconnect(sender, index, receiver, function); -} - -bool QScriptEnginePrivate::scriptConnect(QObject *sender, int signalIndex, - const QScriptValueImpl &receiver, - const QScriptValueImpl &function, - const QScriptValueImpl &senderWrapper) -{ - QScriptQObjectData *data = qobjectData(sender); - return data->addSignalHandler(sender, signalIndex, receiver, function, senderWrapper); -} - -bool QScriptEnginePrivate::scriptDisconnect(QObject *sender, int signalIndex, - const QScriptValueImpl &receiver, - const QScriptValueImpl &function) -{ - QScriptQObjectData *data = qobjectData(sender); - if (!data) - return false; - return data->removeSignalHandler(sender, signalIndex, receiver, function); -} - -bool QScriptEnginePrivate::scriptConnect(const QScriptValueImpl &signal, - const QScriptValueImpl &receiver, - const QScriptValueImpl &function) -{ - QScript::QtFunction *fun = static_cast<QScript::QtFunction*>(signal.toFunction()); - int index = fun->mostGeneralMethod(); - return scriptConnect(fun->qobject(), index, receiver, function, fun->object()); -} - -bool QScriptEnginePrivate::scriptDisconnect(const QScriptValueImpl &signal, - const QScriptValueImpl &receiver, - const QScriptValueImpl &function) -{ - QScript::QtFunction *fun = static_cast<QScript::QtFunction*>(signal.toFunction()); - int index = fun->mostGeneralMethod(); - return scriptDisconnect(fun->qobject(), index, receiver, function); -} - -bool QScriptEnginePrivate::convertToNativeQObject(const QScriptValueImpl &value, - const QByteArray &targetType, - void **result) -{ - if (!targetType.endsWith('*')) - return false; - if (QObject *qobject = value.toQObject()) { - int start = targetType.startsWith("const ") ? 6 : 0; - QByteArray className = targetType.mid(start, targetType.size()-start-1); - if (void *instance = qobject->qt_metacast(className)) { - *result = instance; - return true; - } - } - return false; -} - -#endif // QT_NO_QOBJECT - -void QScriptEnginePrivate::setAgent(QScriptEngineAgent *agent) -{ - Q_Q(QScriptEngine); - if (agent && (agent->engine() != q)) { - qWarning("QScriptEngine::setAgent(): " - "cannot set agent belonging to different engine"); - return; - } - if (agent) { - int index = m_agents.indexOf(agent); - if (index == -1) - m_agents.append(agent); - } - m_agent = agent; -} - -QScriptEngineAgent *QScriptEnginePrivate::agent() const -{ - return m_agent; -} - -void QScriptEnginePrivate::agentDeleted(QScriptEngineAgent *agent) -{ - m_agents.removeOne(agent); - if (m_agent == agent) - m_agent = 0; -} - -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY -qint64 QScriptEnginePrivate::nextScriptId() -{ - // ### reuse IDs by using a pool - return m_scriptCounter++; -} - -void QScriptEnginePrivate::notifyScriptLoad_helper(qint64 id, const QString &program, - const QString &fileName, int lineNumber) -{ - m_agent->scriptLoad(id, program, fileName, lineNumber); -} - -void QScriptEnginePrivate::notifyScriptUnload_helper(qint64 id) -{ - m_agent->scriptUnload(id); -} - -void QScriptEnginePrivate::notifyPositionChange_helper(QScriptContextPrivate *ctx) -{ - m_agent->positionChange(ctx->scriptId(), ctx->currentLine, ctx->currentColumn); -} - -void QScriptEnginePrivate::notifyContextPush_helper() -{ - m_agent->contextPush(); -} - -void QScriptEnginePrivate::notifyContextPop_helper() -{ - m_agent->contextPop(); -} - -void QScriptEnginePrivate::notifyFunctionEntry_helper(QScriptContextPrivate *ctx) -{ - m_agent->functionEntry(ctx->scriptId()); -} - -void QScriptEnginePrivate::notifyFunctionExit_helper(QScriptContextPrivate *ctx) -{ - m_agent->functionExit(ctx->scriptId(), toPublic(ctx->returnValue())); -} - -void QScriptEnginePrivate::notifyException_helper(QScriptContextPrivate *ctx) -{ - bool hasHandler = (ctx->exceptionHandlerContext() != 0); - m_agent->exceptionThrow(ctx->scriptId(), toPublic(ctx->returnValue()), hasHandler); -} - -void QScriptEnginePrivate::notifyExceptionCatch_helper(QScriptContextPrivate *ctx) -{ - m_agent->exceptionCatch(ctx->scriptId(), toPublic(ctx->returnValue())); -} - -void QScriptEnginePrivate::notifyDebugger(QScriptContextPrivate *ctx) -{ - if (m_agent && m_agent->supportsExtension(QScriptEngineAgent::DebuggerInvocationRequest)) { - QVariantList args; - args.append(ctx->scriptId()); - args.append(ctx->currentLine); - args.append(ctx->currentColumn); - QVariant ret = m_agent->extension(QScriptEngineAgent::DebuggerInvocationRequest, args); - QScriptValueImpl val = valueFromVariant(ret); - if (val.isValid()) - ctx->m_result = val; - } -} - -#endif // Q_SCRIPT_NO_EVENT_NOTIFY - -QScriptString QScriptEnginePrivate::internedString(const QString &str) -{ - return internedString(nameId(str, /*persistent=*/false)); -} - -QScriptString QScriptEnginePrivate::internedString(QScriptNameIdImpl *nid) -{ - if (!nid) - return QScriptString(); - QScriptStringPrivate *d = m_internedStrings.value(nid); - if (!d) { - d = m_internedStringRepository.get(); - d->nameId = nid; - d->engine = this; - m_internedStrings.insert(d->nameId, d); - } - QScriptString result; - QScriptStringPrivate::init(result, d); - return result; -} - -void QScriptEnginePrivate::uninternString(QScriptStringPrivate *d) -{ - Q_ASSERT(d->nameId); - QHash<QScriptNameIdImpl*, QScriptStringPrivate*>::iterator it; - it = m_internedStrings.find(d->nameId); - Q_ASSERT(it != m_internedStrings.end()); - m_internedStrings.erase(it); - m_internedStringRepository.release(d); -} - -QScriptValueImpl QScriptEnginePrivate::toImpl_helper(const QScriptValue &value) -{ - QScriptValuePrivate *p = QScriptValuePrivate::get(value); - Q_ASSERT(p != 0); - Q_ASSERT(p->value.type() == QScript::LazyStringType); - QString str = *p->value.m_lazy_string_value; - if (!p->ref.deref()) - delete p; - QScriptValueImpl v; - newString(&v, str); - p = registerValue(v); - QScriptValuePrivate::init(const_cast<QScriptValue&>(value), p); - return v; -} - -QScriptValueImpl QScriptEnginePrivate::newObject(QScriptClass *scriptClass, - const QScriptValueImpl &data) -{ - if (!scriptClass) - return QScriptValueImpl(); - QScriptValueImpl v; - QScriptValueImpl proto = toImpl(scriptClass->prototype()); - if (!proto.isObject()) - proto = objectConstructor->publicPrototype; - newObject(&v, proto); - QScriptClassPrivate *cls_p = QScriptClassPrivate::get(scriptClass); - QScriptClassInfo *info = cls_p->classInfo(); - v.setClassInfo(info); - if (info->type() & QScriptClassInfo::FunctionBased) { - QScriptFunction *fun = cls_p->newFunction(); - v.setObjectData(fun); - } - v.setInternalValue(data); - return v; -} - -int QScriptEnginePrivate::registerCustomClassType() -{ - return ++m_class_prev_id; -} - -QScriptValueImpl QScriptEnginePrivate::objectById(qint64 id) const -{ - QScript::GCAlloc<QScriptObject>::const_iterator it; - for (it = objectAllocator.constBegin(); it != objectAllocator.constEnd(); ++it) { - const QScriptObject *obj = it.data(); - if (obj->m_id == id) { - QScriptValueImpl ret; - ret.m_type = QScript::ObjectType; - ret.m_object_value = const_cast<QScriptObject*>(obj); - return ret; - } - } - return QScriptValueImpl(); -} - -namespace QScript { - -static QScriptValueImpl qsTranslate(QScriptContextPrivate *ctx, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - if (ctx->argumentCount() < 2) - return ctx->throwError(QString::fromLatin1("qsTranslate() requires at least two arguments")); - if (!ctx->argument(0).isString()) - return ctx->throwError(QString::fromLatin1("qsTranslate(): first argument (context) must be a string")); - if (!ctx->argument(1).isString()) - return ctx->throwError(QString::fromLatin1("qsTranslate(): second argument (text) must be a string")); - if ((ctx->argumentCount() > 2) && !ctx->argument(2).isString()) - return ctx->throwError(QString::fromLatin1("qsTranslate(): third argument (comment) must be a string")); - if ((ctx->argumentCount() > 3) && !ctx->argument(3).isString()) - return ctx->throwError(QString::fromLatin1("qsTranslate(): fourth argument (encoding) must be a string")); - if ((ctx->argumentCount() > 4) && !ctx->argument(4).isNumber()) - return ctx->throwError(QString::fromLatin1("qsTranslate(): fifth argument (n) must be a number")); -#ifndef QT_NO_QOBJECT - QString context = ctx->argument(0).toString(); -#endif - QString text = ctx->argument(1).toString(); -#ifndef QT_NO_QOBJECT - QString comment; - if (ctx->argumentCount() > 2) - comment = ctx->argument(2).toString(); - QCoreApplication::Encoding encoding = QCoreApplication::CodecForTr; - if (ctx->argumentCount() > 3) { - QString encStr = ctx->argument(3).toString(); - if (encStr == QLatin1String("CodecForTr")) - encoding = QCoreApplication::CodecForTr; - else if (encStr == QLatin1String("UnicodeUTF8")) - encoding = QCoreApplication::UnicodeUTF8; - else - return ctx->throwError(QString::fromLatin1("qsTranslate(): invalid encoding '%s'").arg(encStr)); - } - int n = -1; - if (ctx->argumentCount() > 4) - n = ctx->argument(4).toInt32(); -#endif - QString result; -#ifndef QT_NO_QOBJECT - result = QCoreApplication::translate(context.toLatin1().constData(), - text.toLatin1().constData(), - comment.toLatin1().constData(), - encoding, n); -#else - result = text; -#endif - return QScriptValueImpl(eng, result); -} - -static QScriptValueImpl qTranslateNoOp(QScriptContextPrivate *ctx, QScriptEnginePrivate *, QScriptClassInfo *) -{ - return ctx->argument(1); -} - -static QScriptValueImpl qsTr(QScriptContextPrivate *ctx, QScriptEnginePrivate *eng, QScriptClassInfo *) -{ - if (ctx->argumentCount() < 1) - return ctx->throwError(QString::fromLatin1("qsTr() requires at least one argument")); - if (!ctx->argument(0).isString()) - return ctx->throwError(QString::fromLatin1("qsTr(): first argument (text) must be a string")); - if ((ctx->argumentCount() > 1) && !ctx->argument(1).isString()) - return ctx->throwError(QString::fromLatin1("qsTr(): second argument (comment) must be a string")); - if ((ctx->argumentCount() > 2) && !ctx->argument(2).isNumber()) - return ctx->throwError(QString::fromLatin1("qsTranslate(): third argument (n) must be a number")); -#ifndef QT_NO_QOBJECT - QString context; - if (ctx->parentContext()) - context = QFileInfo(ctx->parentContext()->fileName()).baseName(); -#endif - QString text = ctx->argument(0).toString(); -#ifndef QT_NO_QOBJECT - QString comment; - if (ctx->argumentCount() > 1) - comment = ctx->argument(1).toString(); - int n = -1; - if (ctx->argumentCount() > 2) - n = ctx->argument(2).toInt32(); -#endif - QString result; -#ifndef QT_NO_QOBJECT - result = QCoreApplication::translate(context.toLatin1().constData(), - text.toLatin1().constData(), - comment.toLatin1().constData(), - QCoreApplication::CodecForTr, n); -#else - result = text; -#endif - return QScriptValueImpl(eng, result); -} - -static QScriptValueImpl qTrNoOp(QScriptContextPrivate *ctx, QScriptEnginePrivate *, QScriptClassInfo *) -{ - return ctx->argument(0); -} - -} // namespace QScript - -void QScriptEnginePrivate::installTranslatorFunctions(QScriptValueImpl &object) -{ - Q_ASSERT(object.isObject()); - const QScriptValue::PropertyFlags flags = QScriptValue::SkipInEnumeration; - object.setProperty(QLatin1String("qsTranslate"), - createFunction(QScript::qsTranslate, /*length=*/5, /*classInfo=*/0), - flags); - object.setProperty(QLatin1String("QT_TRANSLATE_NOOP"), - createFunction(QScript::qTranslateNoOp, /*length=*/2, /*classInfo=*/0), - flags); - object.setProperty(QLatin1String("qsTr"), - createFunction(QScript::qsTr, /*length=*/3, /*classInfo=*/0), - flags); - object.setProperty(QLatin1String("QT_TR_NOOP"), - createFunction(QScript::qTrNoOp, /*length=*/1, /*classInfo=*/0), - flags); - - stringConstructor->addPrototypeFunction(QLatin1String("arg"), QScript::Ecma::String::method_ext_arg, 1); -} - -bool QScriptEnginePrivate::canEvaluate(const QString &program) -{ - QScript::SyntaxChecker checker; - QScript::SyntaxChecker::Result result = checker.checkSyntax(program); - return (result.state != QScript::SyntaxChecker::Intermediate); -} - -QScriptSyntaxCheckResult QScriptEnginePrivate::checkSyntax(const QString &program) -{ - QScript::SyntaxChecker checker; - QScript::SyntaxChecker::Result result = checker.checkSyntax(program); - QScriptSyntaxCheckResultPrivate *p = new QScriptSyntaxCheckResultPrivate(); - switch (result.state) { - case QScript::SyntaxChecker::Error: - p->state = QScriptSyntaxCheckResult::Error; - break; - case QScript::SyntaxChecker::Intermediate: - p->state = QScriptSyntaxCheckResult::Intermediate; - break; - case QScript::SyntaxChecker::Valid: - p->state = QScriptSyntaxCheckResult::Valid; - break; - } - p->errorLineNumber = result.errorLineNumber; - p->errorColumnNumber = result.errorColumnNumber; - p->errorMessage = result.errorMessage; - return QScriptSyntaxCheckResult(p); -} - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT diff --git a/src/script/qscriptengine_p.h b/src/script/qscriptengine_p.h deleted file mode 100644 index 3d13628..0000000 --- a/src/script/qscriptengine_p.h +++ /dev/null @@ -1,828 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTENGINE_P_H -#define QSCRIPTENGINE_P_H - -#include "qscriptenginefwd_p.h" - -#ifndef QT_NO_SCRIPT - -#include <QtCore/QDateTime> -#include <QtCore/QMutex> -#include <QtCore/QLinkedList> -#include <QtCore/QString> -#include <QtCore/QVector> -#include <QtCore/QHash> -#include <QtCore/qnumeric.h> - -#include "qscriptengine.h" -#include "qscriptnameid_p.h" -#include "qscriptobjectfwd_p.h" -#include "qscriptrepository_p.h" -#include "qscriptgc_p.h" -#include "qscriptecmaarray_p.h" -#include "qscriptecmadate_p.h" -#include "qscriptecmaobject_p.h" -#include "qscriptecmaboolean_p.h" -#include "qscriptecmanumber_p.h" -#include "qscriptecmastring_p.h" -#include "qscriptecmafunction_p.h" -#include "qscriptextvariant_p.h" -#include "qscriptextqobject_p.h" -#include "qscriptvalue_p.h" -#include "qscriptcontextfwd_p.h" - -#include <math.h> - -QT_BEGIN_NAMESPACE - -// -// 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. -// - -namespace QScript { - -class ArgumentsObjectData: public QScriptObjectData -{ -public: - ArgumentsObjectData() : length(0) {} - virtual ~ArgumentsObjectData() {} - -public: // attributes - QScriptValueImpl activation; - uint length; -}; - -} // namespace QScript - -inline QScriptEnginePrivate *QScriptEnginePrivate::get(QScriptEngine *q) -{ - if (q) - return q->d_func(); - return 0; -} - -inline const QScriptEnginePrivate *QScriptEnginePrivate::get(const QScriptEngine *q) -{ - if (q) - return q->d_func(); - return 0; -} - -inline QScriptEngine *QScriptEnginePrivate::get(QScriptEnginePrivate *d) -{ - return d->q_func(); -} - -inline QString QScriptEnginePrivate::toString(QScriptNameIdImpl *id) -{ - if (! id) - return QString(); - - return id->s; -} - -inline QString QScriptEnginePrivate::memberName(const QScript::Member &member) const -{ - return toString(member.nameId()); -} - -inline void QScriptEnginePrivate::newReference(QScriptValueImpl *o, int mode) -{ - Q_ASSERT(o); - o->m_type = QScript::ReferenceType; - o->m_int_value = (mode); -} - -inline void QScriptEnginePrivate::newActivation(QScriptValueImpl *o) -{ - Q_ASSERT(o); - newObject(o, nullValue(), m_class_activation); -} - -inline void QScriptEnginePrivate::newPointer(QScriptValueImpl *o, void *ptr) -{ - Q_ASSERT(o); - o->m_type = QScript::PointerType; - o->m_ptr_value = ptr; -} - -inline void QScriptEnginePrivate::newInteger(QScriptValueImpl *o, int i) -{ - Q_ASSERT(o); - o->m_type = QScript::IntegerType; - o->m_int_value = (i); -} - -inline void QScriptEnginePrivate::newNameId(QScriptValueImpl *o, const QString &s) -{ - Q_ASSERT(o); - o->m_type = QScript::StringType; - o->m_string_value = (nameId(s, /*persistent=*/false)); -} - -inline void QScriptEnginePrivate::newString(QScriptValueImpl *o, const QString &s) -{ - Q_ASSERT(o); - o->m_type = QScript::StringType; - QScriptNameIdImpl *entry = new QScriptNameIdImpl(s); - m_tempStringRepository.append(entry); - o->m_string_value = (entry); - m_newAllocatedTempStringRepositoryChars += s.length(); -} - -inline void QScriptEnginePrivate::newNameId(QScriptValueImpl *o, QScriptNameIdImpl *id) -{ - Q_ASSERT(o); - o->m_type = QScript::StringType; - o->m_string_value = (id); -} - -inline const QScript::IdTable *QScriptEnginePrivate::idTable() const -{ - return &m_id_table; -} - -inline qsreal QScriptEnginePrivate::convertToNativeDouble(const QScriptValueImpl &value) -{ - Q_ASSERT (value.isValid()); - - if (value.isNumber()) - return value.m_number_value; - - return convertToNativeDouble_helper(value); -} - -inline qint32 QScriptEnginePrivate::convertToNativeInt32(const QScriptValueImpl &value) -{ - Q_ASSERT (value.isValid()); - - return toInt32 (convertToNativeDouble(value)); -} - - -inline bool QScriptEnginePrivate::convertToNativeBoolean(const QScriptValueImpl &value) -{ - Q_ASSERT (value.isValid()); - - if (value.isBoolean()) - return value.m_bool_value; - - return convertToNativeBoolean_helper(value); -} - -inline QString QScriptEnginePrivate::convertToNativeString(const QScriptValueImpl &value) -{ - Q_ASSERT (value.isValid()); - - if (value.isString()) - return value.m_string_value->s; - - return convertToNativeString_helper(value); -} - -inline qsreal QScriptEnginePrivate::toInteger(qsreal n) -{ - if (qIsNaN(n)) - return 0; - - if (n == 0 || qIsInf(n)) - return n; - - int sign = n < 0 ? -1 : 1; - return sign * ::floor(::fabs(n)); -} - -inline qint32 QScriptEnginePrivate::toInt32(qsreal n) -{ - if (qIsNaN(n) || qIsInf(n) || (n == 0)) - return 0; - - double sign = (n < 0) ? -1.0 : 1.0; - qsreal abs_n = fabs(n); - - n = ::fmod(sign * ::floor(abs_n), D32); - const double D31 = D32 / 2.0; - - if (sign == -1 && n < -D31) - n += D32; - - else if (sign != -1 && n >= D31) - n -= D32; - - return qint32 (n); -} - -inline quint32 QScriptEnginePrivate::toUint32(qsreal n) -{ - if (qIsNaN(n) || qIsInf(n) || (n == 0)) - return 0; - - double sign = (n < 0) ? -1.0 : 1.0; - qsreal abs_n = fabs(n); - - n = ::fmod(sign * ::floor(abs_n), D32); - - if (n < 0) - n += D32; - - return quint32 (n); -} - -inline quint16 QScriptEnginePrivate::toUint16(qsreal n) -{ - if (qIsNaN(n) || qIsInf(n) || (n == 0)) - return 0; - - double sign = (n < 0) ? -1.0 : 1.0; - qsreal abs_n = fabs(n); - - n = ::fmod(sign * ::floor(abs_n), D16); - - if (n < 0) - n += D16; - - return quint16 (n); -} - -inline QScript::AST::Node *QScriptEnginePrivate::abstractSyntaxTree() const -{ - return m_abstractSyntaxTree; -} - -inline QScript::MemoryPool *QScriptEnginePrivate::nodePool() -{ - return m_pool; -} - -inline void QScriptEnginePrivate::setNodePool(QScript::MemoryPool *pool) -{ - m_pool = pool; -} - -inline QScript::Lexer *QScriptEnginePrivate::lexer() -{ - return m_lexer; -} - -inline void QScriptEnginePrivate::setLexer(QScript::Lexer *lexer) -{ - m_lexer = lexer; -} - -inline QScriptObject *QScriptEnginePrivate::allocObject() -{ - return objectAllocator(m_objectGeneration); -} - -inline QScriptContextPrivate *QScriptEnginePrivate::currentContext() const -{ - return m_context; -} - -inline QScriptContextPrivate *QScriptEnginePrivate::pushContext() -{ - QScriptContext *context = m_frameRepository.get(); - QScriptContextPrivate *ctx_p = QScriptContextPrivate::get(context); - ctx_p->init(m_context); - m_context = ctx_p; -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - notifyContextPush(); -#endif - return m_context; -} - -inline void QScriptEnginePrivate::popContext() -{ - Q_ASSERT(m_context != 0); -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - notifyContextPop(); -#endif - QScriptContextPrivate *context = m_context; - m_context = context->parentContext(); - if (m_context) { - QScriptContextPrivate *p1 = m_context; - QScriptContextPrivate *p2 = context; - if ((p1->m_state != QScriptContext::ExceptionState) - || (p2->m_state == QScriptContext::ExceptionState)) { - // propagate the state - p1->m_result = p2->m_result; - p1->m_state = p2->m_state; - // only update errorLineNumber if there actually was an exception - if (p2->m_state == QScriptContext::ExceptionState) { - if (p2->errorLineNumber != -1) - p1->errorLineNumber = p2->errorLineNumber; - else - p1->errorLineNumber = p1->currentLine; - } - } - } - m_frameRepository.release(QScriptContextPrivate::get(context)); -} - -inline void QScriptEnginePrivate::maybeGC() -{ - if (objectAllocator.blocked()) - return; - - bool do_string_gc = ((m_stringRepository.size() - m_oldStringRepositorySize) > 256) - || (m_newAllocatedStringRepositoryChars > 0x800000); - do_string_gc |= ((m_tempStringRepository.size() - m_oldTempStringRepositorySize) > 1024) - || (m_newAllocatedTempStringRepositoryChars > 0x800000); - - if (! do_string_gc && ! objectAllocator.poll()) - return; - - maybeGC_helper(do_string_gc); -} - -inline void QScriptEnginePrivate::adjustBytesAllocated(int bytes) -{ - objectAllocator.adjustBytesAllocated(bytes); -} - -inline bool QScriptEnginePrivate::blockGC(bool block) -{ - return objectAllocator.blockGC(block); -} - -inline void QScriptEnginePrivate::markString(QScriptNameIdImpl *id, int /*generation*/) -{ - id->used = true; -} - -inline QScriptValueImpl QScriptEnginePrivate::createFunction(QScriptFunction *fun) -{ - QScriptValueImpl v; - newFunction(&v, fun); - return v; -} - -inline QScriptValueImpl QScriptEnginePrivate::newArray(const QScript::Array &value) -{ - QScriptValueImpl v; - newArray(&v, value); - return v; -} - -inline QScriptValueImpl QScriptEnginePrivate::newArray(uint length) -{ - QScriptValueImpl v; - QScript::Array a(this); - a.resize(length); - newArray(&v, a); - return v; -} - -inline QScriptClassInfo *QScriptEnginePrivate::registerClass(const QString &pname, int type) -{ - if (type == -1) - type = ++m_class_prev_id; - - QScriptClassInfo *oc = new QScriptClassInfo(this, QScriptClassInfo::Type(type), pname); - m_allocated_classes.append(oc); - - return oc; -} - -inline QScriptClassInfo *QScriptEnginePrivate::registerClass(const QString &name) -{ - return registerClass(name, -1); -} - -inline QScriptValueImpl QScriptEnginePrivate::createFunction(QScriptInternalFunctionSignature fun, - int length, QScriptClassInfo *classInfo, const QString &name) -{ - return createFunction(new QScript::C2Function(fun, length, classInfo, name)); -} - -inline void QScriptEnginePrivate::newFunction(QScriptValueImpl *o, QScriptFunction *function) -{ - QScriptValueImpl proto; - if (functionConstructor) - proto = functionConstructor->publicPrototype; - else { - // creating the Function prototype object - Q_ASSERT(objectConstructor); - proto = objectConstructor->publicPrototype; - } - newObject(o, proto, m_class_function); - o->setObjectData(function); -} - -inline void QScriptEnginePrivate::newConstructor(QScriptValueImpl *ctor, - QScriptFunction *function, - QScriptValueImpl &proto) -{ - newFunction(ctor, function); - ctor->setProperty(m_id_table.id_prototype, proto, - QScriptValue::Undeletable - | QScriptValue::ReadOnly - | QScriptValue::SkipInEnumeration); - proto.setProperty(m_id_table.id_constructor, *ctor, - QScriptValue::Undeletable - | QScriptValue::SkipInEnumeration); -} - -inline void QScriptEnginePrivate::newArguments(QScriptValueImpl *object, - const QScriptValueImpl &activation, - uint length, - const QScriptValueImpl &callee) -{ - QScript::ArgumentsObjectData *data = new QScript::ArgumentsObjectData(); - data->activation = activation; - data->length = length; - newObject(object, m_class_arguments); - object->setObjectData(data); - object->setProperty(m_id_table.id_callee, callee, - QScriptValue::SkipInEnumeration); - object->setProperty(m_id_table.id_length, QScriptValueImpl(length), - QScriptValue::SkipInEnumeration); -} - -inline QScriptFunction *QScriptEnginePrivate::convertToNativeFunction(const QScriptValueImpl &object) -{ - if (object.isFunction()) - return static_cast<QScriptFunction*> (object.objectData()); - return 0; -} - -inline QScriptValue QScriptEnginePrivate::toPublic(const QScriptValueImpl &value) -{ - if (!value.isValid()) - return QScriptValue(); - - QScriptValuePrivate *p = registerValue(value); - QScriptValue v; - QScriptValuePrivate::init(v, p); - return v; -} - -inline QScriptValueImpl QScriptEnginePrivate::toImpl(const QScriptValue &value) -{ - QScriptValuePrivate *p = QScriptValuePrivate::get(value); - if (!p) - return QScriptValueImpl(); - if (p->value.type() == QScript::LazyStringType) - return toImpl_helper(value); - return p->value; -} - -inline QScriptValueImplList QScriptEnginePrivate::toImplList(const QScriptValueList &lst) -{ - QScriptValueImplList result; - QScriptValueList::const_iterator it; - for (it = lst.constBegin(); it != lst.constEnd(); ++it) - result.append(toImpl(*it)); - return result; -} - -inline QScriptValueImpl QScriptEnginePrivate::toObject(const QScriptValueImpl &value) -{ - if (value.isObject() || !value.isValid()) - return value; - return toObject_helper(value); -} - -inline QScriptValueImpl QScriptEnginePrivate::toPrimitive(const QScriptValueImpl &object, - QScriptValueImpl::TypeHint hint) -{ - Q_ASSERT(object.isValid()); - - if (! object.isObject()) - return object; - - return toPrimitive_helper(object, hint); -} - -inline QDateTime QScriptEnginePrivate::toDateTime(const QScriptValueImpl &value) const -{ - return dateConstructor->toDateTime(value); -} - -inline void QScriptEnginePrivate::newArray(QScriptValueImpl *object, const QScript::Array &value) -{ - arrayConstructor->newArray(object, value); -} - -inline void QScriptEnginePrivate::newObject(QScriptValueImpl *o, const QScriptValueImpl &proto, - QScriptClassInfo *oc) -{ - Q_ASSERT(o != 0); - - QScriptObject *od = allocObject(); - od->reset(); - od->m_id = ++m_next_object_id; - if (proto.isValid()) - od->m_prototype = proto; - else { - Q_ASSERT(objectConstructor); - od->m_prototype = objectConstructor->publicPrototype; - } - - o->m_type = QScript::ObjectType; - od->m_class = (oc ? oc : m_class_object); - o->m_object_value = od; -} - -inline void QScriptEnginePrivate::newObject(QScriptValueImpl *o, QScriptClassInfo *oc) -{ - newObject(o, objectConstructor->publicPrototype, oc); -} - -inline QScriptValueImpl QScriptEnginePrivate::newObject() -{ - QScriptValueImpl v; - newObject(&v); - return v; -} - -inline void QScriptEnginePrivate::newVariant(QScriptValueImpl *out, - const QVariant &value, - bool setDefaultPrototype) -{ - Q_ASSERT(variantConstructor != 0); - variantConstructor->newVariant(out, value); - if (setDefaultPrototype) { - QScriptValueImpl proto = defaultPrototype(value.userType()); - if (proto.isValid()) - out->setPrototype(proto); - } -} - -#ifndef QT_NO_QOBJECT -# ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE -inline QScriptMetaObject *QScriptEnginePrivate::cachedMetaObject(const QMetaObject *meta) -{ - QScriptMetaObject *value = m_cachedMetaObjects.value(meta); - if (!value) { - value = new QScriptMetaObject; - m_cachedMetaObjects.insert(meta, value); - } - return value; -} -# endif -#endif // !QT_NO_QOBJECT - -inline QScriptNameIdImpl *QScriptEnginePrivate::nameId(const QString &str, bool persistent) -{ - QScriptNameIdImpl *entry = toStringEntry(str); - if (! entry) - entry = insertStringEntry(str); - - Q_ASSERT(entry->unique); - - if (persistent) - entry->persistent = true; - - return entry; -} - -inline QScriptNameIdImpl *QScriptEnginePrivate::intern(const QChar *u, int s) -{ - QString tmp(u, s); - return nameId(tmp, /*persistent=*/ true); -} - -inline QScriptValueImpl QScriptEnginePrivate::valueFromVariant(const QVariant &v) -{ - QScriptValueImpl result = create(v.userType(), v.data()); - Q_ASSERT(result.isValid()); - return result; -} - -inline QScriptValueImpl QScriptEnginePrivate::undefinedValue() -{ - return m_undefinedValue; -} - -inline QScriptValueImpl QScriptEnginePrivate::nullValue() -{ - return m_nullValue; -} - -inline QScriptValueImpl QScriptEnginePrivate::defaultPrototype(int metaTypeId) const -{ - QScriptCustomTypeInfo info = m_customTypes.value(metaTypeId); - return info.prototype; -} - -inline void QScriptEnginePrivate::setDefaultPrototype(int metaTypeId, const QScriptValueImpl &prototype) -{ - QScriptCustomTypeInfo info = m_customTypes.value(metaTypeId); - info.prototype = prototype; - m_customTypes.insert(metaTypeId, info); -} - -inline uint _q_scriptHash(const QString &key) -{ - const QChar *p = key.unicode(); - int n = qMin(key.size(), 128); - uint h = key.size(); - uint g; - - while (n--) { - h = (h << 4) + (*p++).unicode(); - if ((g = (h & 0xf0000000)) != 0) - h ^= g >> 23; - h &= ~g; - } - return h; -} - -inline QScriptNameIdImpl *QScriptEnginePrivate::toStringEntry(const QString &s) -{ - uint h = _q_scriptHash(s) % m_string_hash_size; - - for (QScriptNameIdImpl *entry = m_string_hash_base[h]; entry && entry->h == h; entry = entry->next) { - if (entry->s == s) - return entry; - } - - return 0; -} - -inline bool QScriptEnginePrivate::lessThan(const QScriptValueImpl &lhs, const QScriptValueImpl &rhs) -{ - return QScriptContextPrivate::lt_cmp(lhs, rhs); -} - -inline bool QScriptEnginePrivate::equals(const QScriptValueImpl &lhs, const QScriptValueImpl &rhs) -{ - return QScriptContextPrivate::eq_cmp(lhs, rhs); -} - -inline bool QScriptEnginePrivate::strictlyEquals(const QScriptValueImpl &lhs, const QScriptValueImpl &rhs) -{ - return QScriptContextPrivate::strict_eq_cmp(lhs, rhs); -} - -inline void QScriptEnginePrivate::unregisterValue(QScriptValuePrivate *p) -{ - QScriptValueImpl &v = p->value; - Q_ASSERT(v.isValid()); - if (v.isString()) { - QScriptNameIdImpl *id = v.stringValue(); - m_stringHandles.remove(id); - } else if (v.isObject()) { - QScriptObject *instance = v.objectValue(); - m_objectHandles.remove(instance); - } else { - int i = m_otherHandles.indexOf(p); - Q_ASSERT(i != -1); - m_otherHandles.remove(i); - } - m_handleRepository.release(p); -} - -inline QScriptValueImpl QScriptEnginePrivate::globalObject() const -{ - return m_globalObject; -} - -inline bool QScriptEnginePrivate::hasUncaughtException() const -{ - return (currentContext()->state() == QScriptContext::ExceptionState); -} - -inline QScriptValueImpl QScriptEnginePrivate::uncaughtException() const -{ - if (!hasUncaughtException()) - return QScriptValueImpl(); - return currentContext()->returnValue(); -} - -inline void QScriptEnginePrivate::maybeProcessEvents() -{ - if (m_processEventsInterval > 0 && ++m_processEventIncr > 512) { - m_processEventIncr = 0; - processEvents(); - } -} - -inline bool QScriptEnginePrivate::shouldAbort() const -{ - return m_abort; -} - -inline void QScriptEnginePrivate::resetAbortFlag() -{ - m_abort = false; -} - -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - -inline bool QScriptEnginePrivate::shouldNotify() const -{ - return m_agent != 0; -} - -inline void QScriptEnginePrivate::notifyScriptLoad( - qint64 id, const QString &program, - const QString &fileName, int lineNumber) -{ - if (shouldNotify()) - notifyScriptLoad_helper(id, program, fileName, lineNumber); -} - -inline void QScriptEnginePrivate::notifyScriptUnload(qint64 id) -{ - if (shouldNotify()) - notifyScriptUnload_helper(id); -} - -inline void QScriptEnginePrivate::notifyPositionChange(QScriptContextPrivate *ctx) -{ - Q_ASSERT(m_agent != 0); - notifyPositionChange_helper(ctx); -} - -inline void QScriptEnginePrivate::notifyContextPush() -{ - if (shouldNotify()) - notifyContextPush_helper(); -} - -inline void QScriptEnginePrivate::notifyContextPop() -{ - if (shouldNotify()) - notifyContextPop_helper(); -} - -inline void QScriptEnginePrivate::notifyFunctionEntry(QScriptContextPrivate *ctx) -{ - if (shouldNotify()) - notifyFunctionEntry_helper(ctx); -} - -inline void QScriptEnginePrivate::notifyFunctionExit(QScriptContextPrivate *ctx) -{ - if (shouldNotify()) - notifyFunctionExit_helper(ctx); -} - -inline void QScriptEnginePrivate::notifyException(QScriptContextPrivate *ctx) -{ - if (shouldNotify()) - notifyException_helper(ctx); -} - -inline void QScriptEnginePrivate::notifyExceptionCatch(QScriptContextPrivate *ctx) -{ - if (shouldNotify()) - notifyExceptionCatch_helper(ctx); -} - -#endif // Q_SCRIPT_NO_EVENT_NOTIFY - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptengineagent_p.h b/src/script/qscriptengineagent_p.h deleted file mode 100644 index f0b3969..0000000 --- a/src/script/qscriptengineagent_p.h +++ /dev/null @@ -1,81 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTENGINEAGENT_P_H -#define QSCRIPTENGINEAGENT_P_H - -#include <QtCore/qobjectdefs.h> - -#ifndef QT_NO_SCRIPT - -// -// 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. -// - -QT_BEGIN_NAMESPACE - -class QScriptEngine; - -class QScriptEngineAgent; -class Q_SCRIPT_EXPORT QScriptEngineAgentPrivate -{ - Q_DECLARE_PUBLIC(QScriptEngineAgent) -public: - QScriptEngineAgentPrivate(); - virtual ~QScriptEngineAgentPrivate(); - - QScriptEngine *engine; - - QScriptEngineAgent *q_ptr; -}; - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptenginefwd_p.h b/src/script/qscriptenginefwd_p.h deleted file mode 100644 index 855317c..0000000 --- a/src/script/qscriptenginefwd_p.h +++ /dev/null @@ -1,560 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTENGINEFWD_P_H -#define QSCRIPTENGINEFWD_P_H - -#ifndef QT_NO_QOBJECT -#include "private/qobject_p.h" -#endif - -#ifndef QT_NO_SCRIPT - -#include <QtCore/qobjectdefs.h> - -#include <QtCore/QHash> -#include <QtCore/QList> -#include <QtCore/QRegExp> -#include <QtCore/QSet> -#include <QtCore/QStringList> -#include <QtCore/QTime> -#include <QtCore/QVector> - -#include "qscriptengine.h" -#include "qscriptrepository_p.h" -#include "qscriptgc_p.h" -#include "qscriptobjectfwd_p.h" -#include "qscriptclassinfo_p.h" -#include "qscriptstring_p.h" - -QT_BEGIN_NAMESPACE - -// -// 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. -// - -class QScriptClass; -class QScriptContext; - -namespace QScript { - -namespace AST { - class Node; -} // namespace AST - -namespace Ecma { - class Object; - class Number; - class Boolean; - class String; - class Math; - class Date; - class Function; - class Array; - class RegExp; - class Error; -} // namespace Ecma - -namespace Ext { - class Enumeration; - class Variant; -} // namespace Ext - -class ExtQObject; -class ExtQMetaObject; - -class Array; -class Lexer; -class Code; -class CompilationUnit; -class IdTable; -class MemoryPool; - -class IdTable -{ -public: - inline IdTable() - : id_constructor(0), id_false(0), id_null(0), - id_object(0), id_pointer(0), id_prototype(0), - id_arguments(0), id_this(0), id_toString(0), - id_true(0), id_undefined(0), id_valueOf(0), - id_length(0), id_callee(0), id___proto__(0), - id___qt_sender__(0) - {} - - QScriptNameIdImpl *id_constructor; - QScriptNameIdImpl *id_false; - QScriptNameIdImpl *id_null; - QScriptNameIdImpl *id_object; - QScriptNameIdImpl *id_pointer; - QScriptNameIdImpl *id_prototype; - QScriptNameIdImpl *id_arguments; - QScriptNameIdImpl *id_this; - QScriptNameIdImpl *id_toString; - QScriptNameIdImpl *id_true; - QScriptNameIdImpl *id_undefined; - QScriptNameIdImpl *id_valueOf; - QScriptNameIdImpl *id_length; - QScriptNameIdImpl *id_callee; - QScriptNameIdImpl *id___proto__; - QScriptNameIdImpl *id___qt_sender__; -}; - -} // namespace QScript - -#ifndef QT_NO_QOBJECT -class QScriptQObjectData; -class QScriptMetaObject; -#endif - -class QScriptCustomTypeInfo -{ -public: - QScriptCustomTypeInfo() : signature(0, '\0'), marshal(0), demarshal(0) - { prototype.invalidate(); } - - QByteArray signature; - QScriptEngine::MarshalFunction marshal; - QScriptEngine::DemarshalFunction demarshal; - QScriptValueImpl prototype; -}; - -class QScriptEnginePrivate -#ifndef QT_NO_QOBJECT - : public QObjectPrivate -#endif -{ - Q_DECLARE_PUBLIC(QScriptEngine) - - enum { - DefaultHashSize = 1021 - }; - -public: - QScriptEnginePrivate(); - virtual ~QScriptEnginePrivate(); - - void init(); - void initStringRepository(); - - static inline QScriptEnginePrivate *get(QScriptEngine *q); - static inline const QScriptEnginePrivate *get(const QScriptEngine *q); - static inline QScriptEngine *get(QScriptEnginePrivate *d); - - QScript::AST::Node *createAbstractSyntaxTree( - const QString &source, int lineNumber, - QString *errorMessage, int *errorLineNumber); - QScript::AST::Node *changeAbstractSyntaxTree(QScript::AST::Node *program); - - inline QScript::AST::Node *abstractSyntaxTree() const; - inline bool hasUncaughtException() const; - inline QScriptValueImpl uncaughtException() const; - QStringList uncaughtExceptionBacktrace() const; - void clearExceptions(); -#ifndef QT_NO_QOBJECT - void emitSignalHandlerException(); -#endif - - static bool canEvaluate(const QString &program); - static QScriptSyntaxCheckResult checkSyntax(const QString &program); - - inline QScriptContextPrivate *currentContext() const; - inline QScriptContextPrivate *pushContext(); - inline void popContext(); - - inline QScript::MemoryPool *nodePool(); - inline QScript::Lexer *lexer(); - inline QScriptObject *allocObject(); - - inline void maybeGC(); - - void maybeGC_helper(bool do_string_gc); - - inline bool blockGC(bool block); - - void gc(); - bool isCollecting() const; - void processMarkStack(int generation); - - inline void adjustBytesAllocated(int bytes); - - void markObject(const QScriptValueImpl &object, int generation); - void markFrame(QScriptContextPrivate *context, int generation); - - inline void markString(QScriptNameIdImpl *id, int generation); - - inline QScriptValueImpl createFunction(QScriptFunction *fun); - inline QScriptValueImpl newArray(const QScript::Array &value); - inline QScriptValueImpl newArray(uint length = 0); - - void evaluate(QScriptContextPrivate *context, const QString &contents, - int lineNumber, const QString &fileName = QString()); - - inline void setLexer(QScript::Lexer *lexer); - - inline void setNodePool(QScript::MemoryPool *pool); - - inline QScriptClassInfo *registerClass(const QString &pname, int type); - - inline QScriptClassInfo *registerClass(const QString &name); - - int registerCustomClassType(); - - inline QScriptValueImpl createFunction(QScriptInternalFunctionSignature fun, - int length, QScriptClassInfo *classInfo, - const QString &name = QString()); - - static inline QString toString(QScriptNameIdImpl *id); - inline QString memberName(const QScript::Member &member) const; - inline void newReference(QScriptValueImpl *object, int mode); - inline void newActivation(QScriptValueImpl *object); - inline void newFunction(QScriptValueImpl *object, QScriptFunction *function); - inline void newConstructor(QScriptValueImpl *ctor, QScriptFunction *function, - QScriptValueImpl &proto); - inline void newInteger(QScriptValueImpl *object, int i); - inline void newPointer(QScriptValueImpl *object, void *ptr); - inline void newNameId(QScriptValueImpl *object, const QString &s); - inline void newNameId(QScriptValueImpl *object, QScriptNameIdImpl *id); - inline void newString(QScriptValueImpl *object, const QString &s); - inline void newArguments(QScriptValueImpl *object, const QScriptValueImpl &activation, - uint length, const QScriptValueImpl &callee); - static inline QString convertToNativeString(const QScriptValueImpl &value); - static QString convertToNativeString_helper(const QScriptValueImpl &value); - static inline qsreal convertToNativeDouble(const QScriptValueImpl &value); - static qsreal convertToNativeDouble_helper(const QScriptValueImpl &value); - static inline bool convertToNativeBoolean(const QScriptValueImpl &value); - static bool convertToNativeBoolean_helper(const QScriptValueImpl &value); - static inline qint32 convertToNativeInt32(const QScriptValueImpl &value); - static inline QScriptFunction *convertToNativeFunction(const QScriptValueImpl &value); - - inline QScriptValue toPublic(const QScriptValueImpl &value); - inline QScriptValueImpl toImpl(const QScriptValue &value); - QScriptValueImpl toImpl_helper(const QScriptValue &value); - inline QScriptValueImplList toImplList(const QScriptValueList &lst); - - inline const QScript::IdTable *idTable() const; - - inline QScriptValueImpl toObject(const QScriptValueImpl &value); - QScriptValueImpl toObject_helper(const QScriptValueImpl &value); - - inline QScriptValueImpl toPrimitive(const QScriptValueImpl &object, - QScriptValueImpl::TypeHint hint = QScriptValueImpl::NoTypeHint); - QScriptValueImpl toPrimitive_helper(const QScriptValueImpl &object, - QScriptValueImpl::TypeHint hint); - - static const qsreal D16; - static const qsreal D32; - - inline static qsreal toInteger(qsreal n); - inline static qint32 toInt32(qsreal m); - inline static quint32 toUint32(qsreal n); - inline static quint16 toUint16(qsreal n); - - inline QDateTime toDateTime(const QScriptValueImpl &value) const; - - inline void newArray(QScriptValueImpl *object, const QScript::Array &value); - - inline void newObject(QScriptValueImpl *o, const QScriptValueImpl &proto, - QScriptClassInfo *oc = 0); - inline void newObject(QScriptValueImpl *o, QScriptClassInfo *oc = 0); - QScriptValueImpl newObject(QScriptClass *scriptClass, const QScriptValueImpl &data); - - inline QScriptValueImpl newObject(); - - inline void newVariant(QScriptValueImpl *out, const QVariant &value, - bool setDefaultPrototype = true); - -#ifndef QT_NO_QOBJECT - void newQObject(QScriptValueImpl *out, QObject *object, - QScriptEngine::ValueOwnership ownership = QScriptEngine::QtOwnership, - const QScriptEngine::QObjectWrapOptions &options = 0, - bool setDefaultPrototype = true); - -# ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE - inline QScriptMetaObject *cachedMetaObject(const QMetaObject *meta); -# endif -#endif - - inline QScriptNameIdImpl *nameId(const QString &str, bool persistent = false); - - inline QScriptNameIdImpl *intern(const QChar *u, int s); - - QScriptString internedString(const QString &str); - QScriptString internedString(QScriptNameIdImpl *nid); - void uninternString(QScriptStringPrivate *d); - - inline QScriptValueImpl valueFromVariant(const QVariant &v); - - inline QScriptValueImpl undefinedValue(); - - inline QScriptValueImpl nullValue(); - - inline QScriptValueImpl defaultPrototype(int metaTypeId) const; - - inline void setDefaultPrototype(int metaTypeId, const QScriptValueImpl &prototype); - - QScriptValueImpl call(const QScriptValueImpl &callee, const QScriptValueImpl &thisObject, - const QScriptValueImplList &args, bool asConstructor); - QScriptValueImpl call(const QScriptValueImpl &callee, const QScriptValueImpl &thisObject, - const QScriptValueImpl &args, bool asConstructor); - - void rehashStringRepository(bool resize = true); - inline QScriptNameIdImpl *toStringEntry(const QString &s); - QScriptNameIdImpl *insertStringEntry(const QString &s); - - QScriptValueImpl create(int type, const void *ptr); - static bool convert(const QScriptValueImpl &value, int type, void *ptr, - QScriptEnginePrivate *eng); - QScriptEngine::DemarshalFunction demarshalFunction(int type) const; - - QScriptValueImpl arrayFromStringList(const QStringList &lst); - static QStringList stringListFromArray(const QScriptValueImpl &arr); - - QScriptValueImpl arrayFromVariantList(const QVariantList &lst); - static QVariantList variantListFromArray(const QScriptValueImpl &arr); - - QScriptValueImpl objectFromVariantMap(const QVariantMap &vmap); - static QVariantMap variantMapFromObject(const QScriptValueImpl &obj); - - static inline bool lessThan(const QScriptValueImpl &lhs, const QScriptValueImpl &rhs); - static inline bool equals(const QScriptValueImpl &lhs, const QScriptValueImpl &rhs); - static inline bool strictlyEquals(const QScriptValueImpl &lhs, const QScriptValueImpl &rhs); - - QScriptValuePrivate *registerValue(const QScriptValueImpl &value); - inline void unregisterValue(QScriptValuePrivate *p); - - inline QScriptValueImpl globalObject() const; - - QScriptValueImpl objectById(qint64 id) const; - - QScriptValueImpl importExtension(const QString &extension); - QStringList availableExtensions() const; - QStringList importedExtensions() const; - - inline void maybeProcessEvents(); - void setupProcessEvents(); - void processEvents(); - -#ifndef QT_NO_QOBJECT - QScriptQObjectData *qobjectData(QObject *object); - - bool scriptConnect(QObject *sender, const char *signal, - const QScriptValueImpl &receiver, - const QScriptValueImpl &function); - bool scriptDisconnect(QObject *sender, const char *signal, - const QScriptValueImpl &receiver, - const QScriptValueImpl &function); - - bool scriptConnect(QObject *sender, int index, - const QScriptValueImpl &receiver, - const QScriptValueImpl &function, - const QScriptValueImpl &senderWrapper = QScriptValueImpl()); - bool scriptDisconnect(QObject *sender, int index, - const QScriptValueImpl &receiver, - const QScriptValueImpl &function); - - bool scriptConnect(const QScriptValueImpl &signal, - const QScriptValueImpl &receiver, - const QScriptValueImpl &function); - bool scriptDisconnect(const QScriptValueImpl &signal, - const QScriptValueImpl &receiver, - const QScriptValueImpl &function); - - void _q_objectDestroyed(QObject *object); - - void disposeQObject(QObject *object); - void deletePendingQObjects(); - - static bool convertToNativeQObject(const QScriptValueImpl &value, - const QByteArray &targetType, - void **result); -#endif - - void abortEvaluation(const QScriptValueImpl &result); - inline bool shouldAbort() const; - inline void resetAbortFlag(); - - void setAgent(QScriptEngineAgent *agent); - QScriptEngineAgent *agent() const; - - void agentDeleted(QScriptEngineAgent *agent); - - void installTranslatorFunctions(QScriptValueImpl &object); - -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - qint64 nextScriptId(); - inline bool shouldNotify() const; - inline void notifyScriptLoad(qint64 id, const QString &program, - const QString &fileName, int lineNumber); - void notifyScriptLoad_helper(qint64 id, const QString &program, - const QString &fileName, int lineNumber); - inline void notifyScriptUnload(qint64 id); - void notifyScriptUnload_helper(qint64 id); - inline void notifyPositionChange(QScriptContextPrivate *ctx); - void notifyPositionChange_helper(QScriptContextPrivate *ctx); - inline void notifyContextPush(); - void notifyContextPush_helper(); - inline void notifyContextPop(); - void notifyContextPop_helper(); - inline void notifyFunctionEntry(QScriptContextPrivate *ctx); - void notifyFunctionEntry_helper(QScriptContextPrivate *ctx); - inline void notifyFunctionExit(QScriptContextPrivate *ctx); - void notifyFunctionExit_helper(QScriptContextPrivate *ctx); - inline void notifyException(QScriptContextPrivate *ctx); - void notifyException_helper(QScriptContextPrivate *ctx); - inline void notifyExceptionCatch(QScriptContextPrivate *ctx); - void notifyExceptionCatch_helper(QScriptContextPrivate *ctx); - void notifyDebugger(QScriptContextPrivate *ctx); -#endif // Q_SCRIPT_NO_EVENT_NOTIFY - -public: // attributes - bool m_evaluating; - bool m_abort; - int m_callDepth; - int m_maxCallDepth; - int m_gc_depth; - QList<QScriptValueImpl> m_markStack; - QScriptValueImpl m_globalObject; - int m_oldStringRepositorySize; - int m_oldTempStringRepositorySize; - QVector<QScriptNameIdImpl*> m_stringRepository; - int m_newAllocatedStringRepositoryChars; - QVector<QScriptNameIdImpl*> m_tempStringRepository; - int m_newAllocatedTempStringRepositoryChars; - QScriptNameIdImpl **m_string_hash_base; - int m_string_hash_size; - QScript::GCAlloc<QScriptObject> objectAllocator; - int m_objectGeneration; - QScript::Repository<QScriptContext, QScriptContextPrivate> m_frameRepository; - QScriptContextPrivate *m_context; - QScriptValueImpl *tempStackBegin; - QScriptValueImpl *tempStackEnd; - QScript::AST::Node *m_abstractSyntaxTree; - QScript::Lexer *m_lexer; - QScript::MemoryPool *m_pool; - QStringList m_exceptionBacktrace; - qint64 m_scriptCounter; - - QScriptValueImpl m_undefinedValue; - QScriptValueImpl m_nullValue; - - QScript::Ecma::Object *objectConstructor; - QScript::Ecma::Number *numberConstructor; - QScript::Ecma::Boolean *booleanConstructor; - QScript::Ecma::String *stringConstructor; - QScript::Ecma::Date *dateConstructor; - QScript::Ecma::Function *functionConstructor; - QScript::Ecma::Array *arrayConstructor; - QScript::Ecma::RegExp *regexpConstructor; - QScript::Ecma::Error *errorConstructor; - QScript::Ext::Enumeration *enumerationConstructor; - QScript::Ext::Variant *variantConstructor; - QScript::ExtQObject *qobjectConstructor; - QScript::ExtQMetaObject *qmetaObjectConstructor; - - QHash<int, QScriptCustomTypeInfo> m_customTypes; - - QScriptFunction *m_evalFunction; - - QList<QScriptClassInfo*> m_allocated_classes; - QScriptClassInfo *m_class_object; - QScriptClassInfo *m_class_function; - QScriptClassInfo *m_class_with; - QScriptClassInfo *m_class_arguments; - QScriptClassInfo *m_class_activation; - - int m_class_prev_id; - qint64 m_next_object_id; - - QScript::Repository<QScriptValuePrivate, QScriptValuePrivate> m_handleRepository; - QHash<QScriptObject*, QScriptValuePrivate*> m_objectHandles; - QHash<QScriptNameIdImpl*, QScriptValuePrivate*> m_stringHandles; - QVector<QScriptValuePrivate*> m_otherHandles; - - QScript::Repository<QScriptStringPrivate, - QScriptStringPrivate> m_internedStringRepository; - QHash<QScriptNameIdImpl*, QScriptStringPrivate*> m_internedStrings; - - QSet<QScriptObject*> visitedArrayElements; - -#ifndef QT_NO_REGEXP - QHash<QString, QRegExp> m_regExpLiterals; -#endif - - QScript::IdTable m_id_table; - - QSet<QString> m_importedExtensions; - QSet<QString> m_extensionsBeingImported; - - int m_processEventsInterval; - int m_nextProcessEvents; - int m_processEventIncr; - QTime m_processEventTracker; - - QList<QScriptEngineAgent*> m_agents; - QScriptEngineAgent *m_agent; - -#ifndef QT_NO_QOBJECT - QList<QObject*> m_qobjectsToBeDeleted; - QHash<QObject*, QScriptQObjectData*> m_qobjectData; - -# ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE - QHash<const QMetaObject*, QScriptMetaObject*> m_cachedMetaObjects; -# endif -#endif - -#ifdef QT_NO_QOBJECT - QScriptEngine *q_ptr; -#endif -}; - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptextensioninterface.h b/src/script/qscriptextensioninterface.h deleted file mode 100644 index 35dc7ed..0000000 --- a/src/script/qscriptextensioninterface.h +++ /dev/null @@ -1,73 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTEXTENSIONINTERFACE_H -#define QSCRIPTEXTENSIONINTERFACE_H - -#include <QtCore/qfactoryinterface.h> - -#ifndef QT_NO_SCRIPT - -#include <QtCore/qobject.h> - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Script) - -class QScriptEngine; - -struct Q_SCRIPT_EXPORT QScriptExtensionInterface - : public QFactoryInterface -{ - virtual void initialize(const QString &key, QScriptEngine *engine) = 0; -}; - -Q_DECLARE_INTERFACE(QScriptExtensionInterface, - "com.trolltech.Qt.QScriptExtensionInterface/1.0") - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif // QT_NO_SCRIPT -#endif // QSCRIPTEXTENSIONINTERFACE_H diff --git a/src/script/qscriptextensionplugin.h b/src/script/qscriptextensionplugin.h deleted file mode 100644 index e646b54..0000000 --- a/src/script/qscriptextensionplugin.h +++ /dev/null @@ -1,79 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTEXTENSIONPLUGIN_H -#define QSCRIPTEXTENSIONPLUGIN_H - -#include <QtCore/qplugin.h> - -#ifndef QT_NO_SCRIPT - -#include <QtScript/qscriptextensioninterface.h> - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Script) - -class QScriptValue; - -class Q_SCRIPT_EXPORT QScriptExtensionPlugin : public QObject, - public QScriptExtensionInterface -{ - Q_OBJECT - Q_INTERFACES(QScriptExtensionInterface:QFactoryInterface) -public: - explicit QScriptExtensionPlugin(QObject *parent = 0); - ~QScriptExtensionPlugin(); - - virtual QStringList keys() const = 0; - virtual void initialize(const QString &key, QScriptEngine *engine) = 0; - - QScriptValue setupPackage(const QString &key, QScriptEngine *engine) const; -}; - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif // QT_NO_SCRIPT -#endif // QSCRIPTEXTENSIONPLUGIN_H diff --git a/src/script/qscriptextenumeration.cpp b/src/script/qscriptextenumeration.cpp deleted file mode 100644 index 4b043a9..0000000 --- a/src/script/qscriptextenumeration.cpp +++ /dev/null @@ -1,209 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qscriptextenumeration_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" -#include "qscriptvalueiteratorimpl_p.h" - -#include <QtCore/QtDebug> - -QT_BEGIN_NAMESPACE - -namespace QScript { namespace Ext { - -EnumerationClassData::EnumerationClassData(QScriptClassInfo *classInfo): - m_classInfo(classInfo) -{ -} - -EnumerationClassData::~EnumerationClassData() -{ -} - -void EnumerationClassData::mark(const QScriptValueImpl &object, int generation) -{ - Q_ASSERT(object.isValid()); - - QScriptEnginePrivate *eng = object.engine(); - - if (Enumeration::Instance *instance = Enumeration::Instance::get(object, classInfo())) { - eng->markObject(instance->object, generation); - if (instance->it) - eng->markObject(instance->it->object(), generation); - } -} - -Enumeration::Enumeration(QScriptEnginePrivate *eng): - Ecma::Core(eng, QLatin1String("Enumeration"), QScriptClassInfo::EnumerationType) -{ - classInfo()->setData(new EnumerationClassData(classInfo())); - - newEnumeration(&publicPrototype, eng->newArray()); - - eng->newConstructor(&ctor, this, publicPrototype); - - addPrototypeFunction(QLatin1String("toFront"), method_toFront, 0); - addPrototypeFunction(QLatin1String("hasNext"), method_hasNext, 0); - addPrototypeFunction(QLatin1String("next"), method_next, 0); -} - -Enumeration::~Enumeration() -{ -} - -Enumeration::Instance *Enumeration::Instance::get(const QScriptValueImpl &object, QScriptClassInfo *klass) -{ - if (! klass || klass == object.classInfo()) - return static_cast<Instance*> (object.objectData()); - - return 0; -} - -void Enumeration::execute(QScriptContextPrivate *context) -{ - if (context->argumentCount() > 0) { - newEnumeration(&context->m_result, context->argument(0)); - } else { - context->throwError(QScriptContext::TypeError, - QLatin1String("Enumeration.execute")); - } -} - -void Enumeration::newEnumeration(QScriptValueImpl *result, const QScriptValueImpl &object) -{ - Instance *instance = new Instance(); - instance->object = object; - if (object.isObject()) { - instance->it = new QScriptValueIteratorImpl(object); - instance->it->setIgnoresDontEnum(false); - instance->it->setEnumeratePrototype(true); - } else { - instance->it = 0; - } - engine()->newObject(result, publicPrototype, classInfo()); - result->setObjectData(instance); -} - -QScriptValueImpl Enumeration::method_toFront(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - if (Instance *instance = Instance::get(context->thisObject(), classInfo)) { - if (instance->it) - instance->it->toFront(); - return eng->undefinedValue(); - } else { - return context->throwError(QScriptContext::TypeError, - QLatin1String("Enumeration.toFront")); - } -} - -QScriptValueImpl Enumeration::method_hasNext(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - Instance *instance = Instance::get(context->thisObject(), classInfo); - if (!instance) { - return context->throwError(QScriptContext::TypeError, - QLatin1String("Enumeration.hasNext")); - } - - QScriptValueImpl v; - instance->hasNext(context, &v); - return v; -} - -QScriptValueImpl Enumeration::method_next(QScriptContextPrivate *context, QScriptEnginePrivate *, QScriptClassInfo *classInfo) -{ - Instance *instance = Instance::get(context->thisObject(), classInfo); - if (!instance) { - return context->throwError(QScriptContext::TypeError, - QLatin1String("Enumeration.next")); - } - - QScriptValueImpl v; - instance->next(context, &v); - return v; -} - -Enumeration::Instance::~Instance() -{ - if (it) { - delete it; - it = 0; - } -} - -void Enumeration::Instance::toFront() -{ - if (it) - it->toFront(); -} - -void Enumeration::Instance::hasNext(QScriptContextPrivate *, QScriptValueImpl *result) -{ - *result = QScriptValueImpl(it && it->hasNext()); -} - -void Enumeration::Instance::next(QScriptContextPrivate *context, QScriptValueImpl *result) -{ - QScriptEnginePrivate *eng = context->engine(); - Q_ASSERT(it != 0); - it->next(); - QScript::Member *member = it->member(); - if (member->isObjectProperty() || member->nameId()) - eng->newNameId(result, member->nameId()); - - else if (member->isNativeProperty() && !member->nameId()) - *result = QScriptValueImpl(uint(member->id())); - - else - *result = eng->undefinedValue(); -} - -} } // namespace QScript::Ext - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT diff --git a/src/script/qscriptextenumeration_p.h b/src/script/qscriptextenumeration_p.h deleted file mode 100644 index 4c49f74..0000000 --- a/src/script/qscriptextenumeration_p.h +++ /dev/null @@ -1,126 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTEXTENUMERATION_P_H -#define QSCRIPTEXTENUMERATION_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 "qscriptecmacore_p.h" - -QT_BEGIN_NAMESPACE - -#ifndef QT_NO_SCRIPT - -class QScriptValueIteratorImpl; - -namespace QScript { namespace Ext { - -class EnumerationClassData: public QScriptClassData -{ - QScriptClassInfo *m_classInfo; - -public: - EnumerationClassData(QScriptClassInfo *classInfo); - virtual ~EnumerationClassData(); - - inline QScriptClassInfo *classInfo() const - { return m_classInfo; } - - virtual void mark(const QScriptValueImpl &object, int generation); -}; - -class Enumeration: public QScript::Ecma::Core -{ -public: - Enumeration(QScriptEnginePrivate *engine); - virtual ~Enumeration(); - - virtual void execute(QScriptContextPrivate *context); - - class Instance: public QScriptObjectData { - public: - Instance() : it(0) {} - virtual ~Instance(); - - static Instance *get(const QScriptValueImpl &object, - QScriptClassInfo *klass); - - void toFront(); - void hasNext(QScriptContextPrivate *context, QScriptValueImpl *result); - void next(QScriptContextPrivate *context, QScriptValueImpl *result); - - public: // attributes - QScriptValueIteratorImpl *it; - QScriptValueImpl object; - }; - - void newEnumeration(QScriptValueImpl *result, const QScriptValueImpl &value); - - inline Instance *get(const QScriptValueImpl &object) const - { - return Instance::get(object, classInfo()); - } - -protected: - static QScriptValueImpl method_toFront(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_hasNext(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_next(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); -}; - -} } // namespace QScript::Ext - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT -#endif diff --git a/src/script/qscriptextqobject.cpp b/src/script/qscriptextqobject.cpp deleted file mode 100644 index 47c04d4..0000000 --- a/src/script/qscriptextqobject.cpp +++ /dev/null @@ -1,2241 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtCore/qglobal.h> - -#ifndef QT_NO_SCRIPT - -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" -#include "qscriptable.h" -#include "qscriptable_p.h" -#include "qscriptextqobject_p.h" - -#include <QtCore/QtDebug> -#include <QtCore/QMetaMethod> -#include <QtCore/QRegExp> -#include <QtCore/QVarLengthArray> -#include <QtCore/QPointer> - -QT_BEGIN_NAMESPACE - -// we use bits 15..12 of property flags -enum { - PROPERTY_ID = 0 << 12, - DYNAPROPERTY_ID = 1 << 12, - METHOD_ID = 2 << 12, - CHILD_ID = 3 << 12, - ID_MASK = 7 << 12, - MAYBE_OVERLOADED = 8 << 12 -}; - -static const bool GeneratePropertyFunctions = true; - -int QScriptMetaType::typeId() const -{ - if (isVariant()) - return QMetaType::type("QVariant"); - return isMetaEnum() ? 2/*int*/ : m_typeId; -} - -QByteArray QScriptMetaType::name() const -{ - if (!m_name.isEmpty()) - return m_name; - else if (m_kind == Variant) - return "QVariant"; - return QMetaType::typeName(typeId()); -} - -namespace QScript { - -class QObjectNotifyCaller : public QObject -{ -public: - void callConnectNotify(const char *signal) - { connectNotify(signal); } - void callDisconnectNotify(const char *signal) - { disconnectNotify(signal); } -}; - -class QtPropertyFunction: public QScriptFunction -{ -public: - QtPropertyFunction(const QMetaObject *meta, int index) - : m_meta(meta), m_index(index) - { } - - ~QtPropertyFunction() { } - - virtual void execute(QScriptContextPrivate *context); - - virtual Type type() const { return QScriptFunction::QtProperty; } - - virtual QString functionName() const; - -private: - const QMetaObject *m_meta; - int m_index; -}; - -class QObjectPrototype : public QObject -{ - Q_OBJECT -public: - QObjectPrototype(QObject *parent = 0) - : QObject(parent) { } - ~QObjectPrototype() { } -}; - -static inline QByteArray methodName(const QMetaMethod &method) -{ - QByteArray signature = method.signature(); - return signature.left(signature.indexOf('(')); -} - -static inline QVariant variantFromValue(QScriptEnginePrivate *eng, - int targetType, const QScriptValueImpl &value) -{ - QVariant v(targetType, (void *)0); - Q_ASSERT(eng); - if (QScriptEnginePrivate::convert(value, targetType, v.data(), eng)) - return v; - if (uint(targetType) == QVariant::LastType) - return value.toVariant(); - if (value.isVariant()) { - v = value.toVariant(); - if (v.canConvert(QVariant::Type(targetType))) { - v.convert(QVariant::Type(targetType)); - return v; - } - QByteArray typeName = v.typeName(); - if (typeName.endsWith('*') - && (QMetaType::type(typeName.left(typeName.size()-1)) == targetType)) { - return QVariant(targetType, *reinterpret_cast<void* *>(v.data())); - } - } - - return QVariant(); -} - -void ExtQObject::Instance::finalize(QScriptEnginePrivate *eng) -{ - switch (ownership) { - case QScriptEngine::QtOwnership: - break; - case QScriptEngine::ScriptOwnership: - if (value) - eng->disposeQObject(value); - break; - case QScriptEngine::AutoOwnership: - if (value && !value->parent()) - eng->disposeQObject(value); - break; - } -} - -ExtQObject::Instance *ExtQObject::Instance::get(const QScriptValueImpl &object, QScriptClassInfo *klass) -{ - if (! klass || klass == object.classInfo()) - return static_cast<Instance*> (object.objectData()); - - return 0; -} - - -static inline QScriptable *scriptableFromQObject(QObject *qobj) -{ - void *ptr = qobj->qt_metacast("QScriptable"); - return reinterpret_cast<QScriptable*>(ptr); -} - -static bool isObjectProperty(const QScriptValueImpl &object, const char *name) -{ - QScriptEnginePrivate *eng = object.engine(); - QScriptNameIdImpl *nameId = eng->nameId(QLatin1String(name)); - QScript::Member member; - QScriptValueImpl base; - return object.resolve(nameId, &member, &base, QScriptValue::ResolveLocal, QScript::Read) - && member.testFlags(QScript::Member::ObjectProperty); -} - -static bool hasMethodAccess(const QMetaMethod &method, int index, const QScriptEngine::QObjectWrapOptions &opt) -{ - return (method.access() != QMetaMethod::Private) - && ((index != 2) || !(opt & QScriptEngine::ExcludeDeleteLater)); -} - -static bool isEnumerableMetaProperty(const QMetaProperty &prop, - const QMetaObject *mo, int index) -{ - return prop.isScriptable() && prop.isValid() - // the following lookup is to ensure that we have the - // "most derived" occurrence of the property with this name - && (mo->indexOfProperty(prop.name()) == index); -} - -static uint flagsForMetaProperty(const QMetaProperty &prop) -{ - return (QScriptValue::Undeletable - | (!prop.isWritable() - ? QScriptValue::ReadOnly - : QScriptValue::PropertyFlag(0)) - | (GeneratePropertyFunctions - ? (QScriptValue::PropertyGetter - | QScriptValue::PropertySetter) - : QScriptValue::PropertyFlag(0)) - | QScriptValue::QObjectMember - | PROPERTY_ID); -} - - -static int indexOfMetaEnum(const QMetaObject *meta, const QByteArray &str) -{ - QByteArray scope; - QByteArray name; - int scopeIdx = str.lastIndexOf("::"); - if (scopeIdx != -1) { - scope = str.left(scopeIdx); - name = str.mid(scopeIdx + 2); - } else { - name = str; - } - for (int i = meta->enumeratorCount() - 1; i >= 0; --i) { - QMetaEnum m = meta->enumerator(i); - if ((m.name() == name) && (scope.isEmpty() || (m.scope() == scope))) - return i; - } - return -1; -} - -static QMetaMethod metaMethod(const QMetaObject *meta, - QMetaMethod::MethodType type, - int index) -{ - if (type != QMetaMethod::Constructor) - return meta->method(index); - else - return meta->constructor(index); -} - -static void callQtMethod(QScriptContextPrivate *context, QMetaMethod::MethodType callType, - QObject *thisQObject, const QMetaObject *meta, int initialIndex, - bool maybeOverloaded) -{ - QScriptValueImpl result; - QScriptEnginePrivate *engine = context->engine(); - - int limit; -#ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE - int lastFoundIndex = initialIndex; - QScriptMetaObject *metaCache = engine->cachedMetaObject(meta); - if (callType != QMetaMethod::Constructor) - limit = metaCache->methodLowerBound(initialIndex); - else - limit = 0; -#else - limit = 0; -#endif - - QByteArray funName; - QScriptMetaMethod chosenMethod; - int chosenIndex = -1; - QVarLengthArray<QVariant, 9> args; - QVector<QScriptMetaArguments> candidates; - QVector<QScriptMetaArguments> unresolved; - QVector<int> tooFewArgs; - QVector<int> conversionFailed; - int index; - for (index = initialIndex; index >= limit; --index) { - QScriptMetaMethod mtd; -#ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE - if (callType != QMetaMethod::Constructor) - mtd = metaCache->findMethod(index); - if (!mtd.isValid()) -#endif - { - QMetaMethod method = metaMethod(meta, callType, index); - - QVector<QScriptMetaType> types; - // resolve return type - QByteArray returnTypeName = method.typeName(); - int rtype = QMetaType::type(returnTypeName); - if ((rtype == 0) && !returnTypeName.isEmpty()) { - if (returnTypeName == "QVariant") { - types.append(QScriptMetaType::variant()); - } else { - int enumIndex = indexOfMetaEnum(meta, returnTypeName); - if (enumIndex != -1) - types.append(QScriptMetaType::metaEnum(enumIndex, returnTypeName)); - else - types.append(QScriptMetaType::unresolved(returnTypeName)); - } - } else { - if (callType == QMetaMethod::Constructor) - types.append(QScriptMetaType::metaType(QMetaType::QObjectStar, "QObject*")); - else if (returnTypeName == "QVariant") - types.append(QScriptMetaType::variant()); - else - types.append(QScriptMetaType::metaType(rtype, returnTypeName)); - } - // resolve argument types - QList<QByteArray> parameterTypeNames = method.parameterTypes(); - for (int i = 0; i < parameterTypeNames.count(); ++i) { - QByteArray argTypeName = parameterTypeNames.at(i); - int atype = QMetaType::type(argTypeName); - if (atype == 0) { - if (argTypeName == "QVariant") { - types.append(QScriptMetaType::variant()); - } else { - int enumIndex = indexOfMetaEnum(meta, argTypeName); - if (enumIndex != -1) - types.append(QScriptMetaType::metaEnum(enumIndex, argTypeName)); - else - types.append(QScriptMetaType::unresolved(argTypeName)); - } - } else { - if (argTypeName == "QVariant") - types.append(QScriptMetaType::variant()); - else - types.append(QScriptMetaType::metaType(atype, argTypeName)); - } - } - - mtd = QScriptMetaMethod(methodName(method), types); - -#ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE - if (mtd.fullyResolved() && (callType != QMetaMethod::Constructor)) - metaCache->registerMethod(index, mtd); -#endif - } - - if (index == initialIndex) - funName = mtd.name(); - else { - if (mtd.name() != funName) - continue; -#ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE - lastFoundIndex = index; -#endif - } - - if (context->argumentCount() < mtd.argumentCount()) { - tooFewArgs.append(index); - continue; - } - - if (!mtd.fullyResolved()) { - // remember it so we can give an error message later, if necessary - unresolved.append(QScriptMetaArguments(/*matchDistance=*/INT_MAX, index, - mtd, QVarLengthArray<QVariant, 9>())); - if (mtd.hasUnresolvedReturnType()) - continue; - } - - if (args.count() != mtd.count()) - args.resize(mtd.count()); - - QScriptMetaType retType = mtd.returnType(); - args[0] = QVariant(retType.typeId(), (void *)0); // the result - - // try to convert arguments - bool converted = true; - int matchDistance = 0; - for (int i = 0; converted && i < mtd.argumentCount(); ++i) { - QScriptValueImpl actual = context->argument(i); - QScriptMetaType argType = mtd.argumentType(i); - int tid = -1; - QVariant v; - if (argType.isUnresolved()) { - v = QVariant(QMetaType::QObjectStar, (void *)0); - converted = engine->convertToNativeQObject( - actual, argType.name(), reinterpret_cast<void* *>(v.data())); - } else if (argType.isVariant()) { - if (actual.isVariant()) { - v = actual.variantValue(); - } else { - v = actual.toVariant(); - converted = v.isValid() || actual.isUndefined() || actual.isNull(); - } - } else { - tid = argType.typeId(); - v = QVariant(tid, (void *)0); - converted = QScriptEnginePrivate::convert(actual, tid, v.data(), engine); - if (engine->hasUncaughtException()) - return; - } - - if (!converted) { - if (actual.isVariant()) { - if (tid == -1) - tid = argType.typeId(); - QVariant &vv = actual.variantValue(); - if (vv.canConvert(QVariant::Type(tid))) { - v = vv; - converted = v.convert(QVariant::Type(tid)); - if (converted && (vv.userType() != tid)) - matchDistance += 10; - } else { - QByteArray vvTypeName = vv.typeName(); - if (vvTypeName.endsWith('*') - && (vvTypeName.left(vvTypeName.size()-1) == argType.name())) { - v = QVariant(tid, *reinterpret_cast<void* *>(vv.data())); - converted = true; - matchDistance += 10; - } - } - } else if (actual.isNumber() || actual.isString()) { - // see if it's an enum value - QMetaEnum m; - if (argType.isMetaEnum()) { - m = meta->enumerator(argType.enumeratorIndex()); - } else { - int mi = indexOfMetaEnum(meta, argType.name()); - if (mi != -1) - m = meta->enumerator(mi); - } - if (m.isValid()) { - if (actual.isNumber()) { - int ival = actual.toInt32(); - if (m.valueToKey(ival) != 0) { - qVariantSetValue(v, ival); - converted = true; - matchDistance += 10; - } - } else { - QString sval = actual.toString(); - int ival = m.keyToValue(sval.toLatin1()); - if (ival != -1) { - qVariantSetValue(v, ival); - converted = true; - matchDistance += 10; - } - } - } - } - } else { - // determine how well the conversion matched - if (actual.isNumber()) { - switch (tid) { - case QMetaType::Double: - // perfect - break; - case QMetaType::Float: - matchDistance += 1; - break; - case QMetaType::LongLong: - case QMetaType::ULongLong: - matchDistance += 2; - break; - case QMetaType::Long: - case QMetaType::ULong: - matchDistance += 3; - break; - case QMetaType::Int: - case QMetaType::UInt: - matchDistance += 4; - break; - case QMetaType::Short: - case QMetaType::UShort: - matchDistance += 5; - break; - case QMetaType::Char: - case QMetaType::UChar: - matchDistance += 6; - break; - default: - matchDistance += 10; - break; - } - } else if (actual.isString()) { - switch (tid) { - case QMetaType::QString: - // perfect - break; - default: - matchDistance += 10; - break; - } - } else if (actual.isBoolean()) { - switch (tid) { - case QMetaType::Bool: - // perfect - break; - default: - matchDistance += 10; - break; - } - } else if (actual.isDate()) { - switch (tid) { - case QMetaType::QDateTime: - // perfect - break; - case QMetaType::QDate: - matchDistance += 1; - break; - case QMetaType::QTime: - matchDistance += 2; - break; - default: - matchDistance += 10; - break; - } - } else if (actual.isRegExp()) { - switch (tid) { - case QMetaType::QRegExp: - // perfect - break; - default: - matchDistance += 10; - break; - } - } else if (actual.isVariant()) { - if (argType.isVariant() - || (actual.variantValue().userType() == tid)) { - // perfect - } else { - matchDistance += 10; - } - } else if (actual.isArray()) { - switch (tid) { - case QMetaType::QStringList: - case QMetaType::QVariantList: - matchDistance += 5; - break; - default: - matchDistance += 10; - break; - } - } else if (actual.isQObject()) { - switch (tid) { - case QMetaType::QObjectStar: - case QMetaType::QWidgetStar: - // perfect - break; - default: - matchDistance += 10; - break; - } - } else if (actual.isNull()) { - switch (tid) { - case QMetaType::VoidStar: - case QMetaType::QObjectStar: - case QMetaType::QWidgetStar: - // perfect - break; - default: - if (!argType.name().endsWith('*')) - matchDistance += 10; - break; - } - } else { - matchDistance += 10; - } - } - - if (converted) - args[i+1] = v; - } - - if (converted) { - if ((context->argumentCount() == mtd.argumentCount()) - && (matchDistance == 0)) { - // perfect match, use this one - chosenMethod = mtd; - chosenIndex = index; - break; - } else { - bool redundant = false; - if ((callType != QMetaMethod::Constructor) - && (index < meta->methodOffset())) { - // it is possible that a virtual method is redeclared in a subclass, - // in which case we want to ignore the superclass declaration - for (int i = 0; i < candidates.size(); ++i) { - const QScriptMetaArguments &other = candidates.at(i); - if (mtd.types() == other.method.types()) { - redundant = true; - break; - } - } - } - if (!redundant) { - QScriptMetaArguments metaArgs(matchDistance, index, mtd, args); - if (candidates.isEmpty()) { - candidates.append(metaArgs); - } else { - const QScriptMetaArguments &otherArgs = candidates.at(0); - if ((args.count() > otherArgs.args.count()) - || ((args.count() == otherArgs.args.count()) - && (matchDistance <= otherArgs.matchDistance))) { - candidates.prepend(metaArgs); - } else { - candidates.append(metaArgs); - } - } - } - } - } else if (mtd.fullyResolved()) { - conversionFailed.append(index); - } - - if (!maybeOverloaded) - break; - } - -#ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE - if ((index == -1) && (lastFoundIndex != limit) && maybeOverloaded - && (callType != QMetaMethod::Constructor)) { - metaCache->setMethodLowerBound(initialIndex, lastFoundIndex); - } -#endif - - if ((chosenIndex == -1) && candidates.isEmpty()) { - context->calleeMetaIndex = initialIndex; -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - engine->notifyFunctionEntry(context); -#endif - if (!conversionFailed.isEmpty()) { - QString message = QString::fromLatin1("incompatible type of argument(s) in call to %0(); candidates were\n") - .arg(QLatin1String(funName)); - for (int i = 0; i < conversionFailed.size(); ++i) { - if (i > 0) - message += QLatin1String("\n"); - QMetaMethod mtd = metaMethod(meta, callType, conversionFailed.at(i)); - message += QString::fromLatin1(" %0").arg(QString::fromLatin1(mtd.signature())); - } - result = context->throwError(QScriptContext::TypeError, message); - } else if (!unresolved.isEmpty()) { - QScriptMetaArguments argsInstance = unresolved.first(); - int unresolvedIndex = argsInstance.method.firstUnresolvedIndex(); - Q_ASSERT(unresolvedIndex != -1); - QScriptMetaType unresolvedType = argsInstance.method.type(unresolvedIndex); - QString unresolvedTypeName = QString::fromLatin1(unresolvedType.name()); - QString message = QString::fromLatin1("cannot call %0(): ") - .arg(QString::fromLatin1(funName)); - if (unresolvedIndex > 0) { - message.append(QString::fromLatin1("argument %0 has unknown type `%1'"). - arg(unresolvedIndex).arg(unresolvedTypeName)); - } else { - message.append(QString::fromLatin1("unknown return type `%0'") - .arg(unresolvedTypeName)); - } - message.append(QString::fromLatin1(" (register the type with qScriptRegisterMetaType())")); - result = context->throwError(QScriptContext::TypeError, message); - } else { - QString message = QString::fromLatin1("too few arguments in call to %0(); candidates are\n") - .arg(QLatin1String(funName)); - for (int i = 0; i < tooFewArgs.size(); ++i) { - if (i > 0) - message += QLatin1String("\n"); - QMetaMethod mtd = metaMethod(meta, callType, tooFewArgs.at(i)); - message += QString::fromLatin1(" %0").arg(QString::fromLatin1(mtd.signature())); - } - result = context->throwError(QScriptContext::SyntaxError, message); - } - } else { - if (chosenIndex == -1) { - QScriptMetaArguments metaArgs = candidates.at(0); - if ((candidates.size() > 1) - && (metaArgs.args.count() == candidates.at(1).args.count()) - && (metaArgs.matchDistance == candidates.at(1).matchDistance)) { - // ambiguous call - QString message = QString::fromLatin1("ambiguous call of overloaded function %0(); candidates were\n") - .arg(QLatin1String(funName)); - for (int i = 0; i < candidates.size(); ++i) { - if (i > 0) - message += QLatin1String("\n"); - QMetaMethod mtd = metaMethod(meta, callType, candidates.at(i).index); - message += QString::fromLatin1(" %0").arg(QString::fromLatin1(mtd.signature())); - } - result = context->throwError(QScriptContext::TypeError, message); - } else { - chosenMethod = metaArgs.method; - chosenIndex = metaArgs.index; - args = metaArgs.args; - } - } - - if (chosenIndex != -1) { - // call it - context->calleeMetaIndex = chosenIndex; - - QVarLengthArray<void*, 9> array(args.count()); - void **params = array.data(); - for (int i = 0; i < args.count(); ++i) { - const QVariant &v = args[i]; - switch (chosenMethod.type(i).kind()) { - case QScriptMetaType::Variant: - params[i] = const_cast<QVariant*>(&v); - break; - case QScriptMetaType::MetaType: - case QScriptMetaType::MetaEnum: - case QScriptMetaType::Unresolved: - params[i] = const_cast<void*>(v.constData()); - break; - default: - Q_ASSERT(0); - } - } - - QScriptable *scriptable = 0; - if (thisQObject) - scriptable = scriptableFromQObject(thisQObject); - QScriptEngine *oldEngine = 0; - if (scriptable) { - oldEngine = QScriptablePrivate::get(scriptable)->engine; - QScriptablePrivate::get(scriptable)->engine = QScriptEnginePrivate::get(engine); - } - -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - engine->notifyFunctionEntry(context); -#endif - - if (callType == QMetaMethod::Constructor) { - Q_ASSERT(meta != 0); - meta->static_metacall(QMetaObject::CreateInstance, chosenIndex, params); - } else { - Q_ASSERT(thisQObject != 0); - thisQObject->qt_metacall(QMetaObject::InvokeMetaMethod, chosenIndex, params); - } - - if (scriptable) - QScriptablePrivate::get(scriptable)->engine = oldEngine; - - if (context->state() == QScriptContext::ExceptionState) { - result = context->returnValue(); // propagate - } else { - QScriptMetaType retType = chosenMethod.returnType(); - if (retType.isVariant()) { - result = engine->valueFromVariant(*(QVariant *)params[0]); - } else if (retType.typeId() != 0) { - result = engine->create(retType.typeId(), params[0]); - if (!result.isValid()) - engine->newVariant(&result, QVariant(retType.typeId(), params[0])); - } else { - result = engine->undefinedValue(); - } - } - } - } - - context->m_result = result; -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - engine->notifyFunctionExit(context); -#endif -} - - -class ExtQObjectDataIterator: public QScriptClassDataIterator -{ -public: - ExtQObjectDataIterator(const QScriptValueImpl &object); - virtual ~ExtQObjectDataIterator(); - - virtual bool hasNext() const; - virtual void next(QScript::Member *member); - - virtual bool hasPrevious() const; - virtual void previous(QScript::Member *member); - - virtual void toFront(); - virtual void toBack(); - -private: - enum State { - MetaProperties, - DynamicProperties, - MetaMethods - }; - - QScriptValueImpl m_object; - int m_index; - State m_state; -}; - -ExtQObjectDataIterator::ExtQObjectDataIterator(const QScriptValueImpl &object) -{ - m_object = object; - toFront(); -} - -ExtQObjectDataIterator::~ExtQObjectDataIterator() -{ -} - -bool ExtQObjectDataIterator::hasNext() const -{ - ExtQObject::Instance *inst = ExtQObject::Instance::get(m_object); - if (!inst->value) - return false; - const QMetaObject *meta = inst->value->metaObject(); - int i = m_index; - - switch (m_state) { - case MetaProperties: { - for ( ; i < meta->propertyCount(); ++i) { - QMetaProperty prop = meta->property(i); - if (isEnumerableMetaProperty(prop, meta, i) - && !isObjectProperty(m_object, prop.name())) { - return true; - } - } - i = 0; - // fall-through - } - - case DynamicProperties: { - QList<QByteArray> dpNames = inst->value->dynamicPropertyNames(); - for ( ; i < dpNames.count(); ++i) { - if (!isObjectProperty(m_object, dpNames.at(i))) { - return true; - } - } - if (inst->options & QScriptEngine::SkipMethodsInEnumeration) - return false; - i = (inst->options & QScriptEngine::ExcludeSuperClassMethods) - ? meta->methodOffset() : 0; - // fall-through - } - - case MetaMethods: { - for ( ; i < meta->methodCount(); ++i) { - QMetaMethod method = meta->method(i); - if (hasMethodAccess(method, i, inst->options) - && !isObjectProperty(m_object, method.signature())) { - return true; - } - } - } - - } // switch - - return false; -} - -void ExtQObjectDataIterator::next(QScript::Member *member) -{ - QScriptEnginePrivate *eng = m_object.engine(); - ExtQObject::Instance *inst = ExtQObject::Instance::get(m_object); - if (!inst->value) - return; - const QMetaObject *meta = inst->value->metaObject(); - int i = m_index; - - switch (m_state) { - case MetaProperties: { - for ( ; i < meta->propertyCount(); ++i) { - QMetaProperty prop = meta->property(i); - if (isEnumerableMetaProperty(prop, meta, i) - && !isObjectProperty(m_object, prop.name())) { - QScriptNameIdImpl *nameId = eng->nameId(QLatin1String(prop.name())); - member->native(nameId, i, flagsForMetaProperty(prop)); - m_index = i + 1; - return; - } - } - m_state = DynamicProperties; - m_index = 0; - i = m_index; - // fall-through - } - - case DynamicProperties: { - QList<QByteArray> dpNames = inst->value->dynamicPropertyNames(); - for ( ; i < dpNames.count(); ++i) { - if (!isObjectProperty(m_object, dpNames.at(i))) { - QByteArray name = dpNames.at(i); - QScriptNameIdImpl *nameId = eng->nameId(QLatin1String(name)); - member->native(nameId, i, - QScriptValue::QObjectMember - | DYNAPROPERTY_ID); - m_index = i + 1; - return; - } - } - m_state = MetaMethods; - m_index = (inst->options & QScriptEngine::ExcludeSuperClassMethods) - ? meta->methodOffset() : 0; - i = m_index; - // fall-through - } - - case MetaMethods: { - for ( ; i < meta->methodCount(); ++i) { - QMetaMethod method = meta->method(i); - if (hasMethodAccess(method, i, inst->options) - && !isObjectProperty(m_object, method.signature())) { - QMetaMethod method = meta->method(i); - QScriptNameIdImpl *nameId = eng->nameId(QLatin1String(method.signature())); - member->native(nameId, i, - QScriptValue::QObjectMember - | METHOD_ID); - m_index = i + 1; - return; - } - } - } - - } // switch - - member->invalidate(); -} - -bool ExtQObjectDataIterator::hasPrevious() const -{ - ExtQObject::Instance *inst = ExtQObject::Instance::get(m_object); - if (!inst->value) - return false; - const QMetaObject *meta = inst->value->metaObject(); - int i = m_index - 1; - - switch (m_state) { - case MetaMethods: { - int limit = (inst->options & QScriptEngine::ExcludeSuperClassMethods) - ? meta->methodOffset() : 0; - for ( ; i >= limit; --i) { - QMetaMethod method = meta->method(i); - if (hasMethodAccess(method, i, inst->options) - && !isObjectProperty(m_object, method.signature())) { - return true; - } - } - i = inst->value->dynamicPropertyNames().count() - 1; - // fall-through - } - - case DynamicProperties: { - QList<QByteArray> dpNames = inst->value->dynamicPropertyNames(); - for ( ; i >= 0; --i) { - if (!isObjectProperty(m_object, dpNames.at(i))) { - return true; - } - } - i = meta->propertyCount() - 1; - // fall-through - } - - case MetaProperties: { - int limit = (inst->options & QScriptEngine::ExcludeSuperClassProperties) - ? meta->propertyOffset() : 0; - for ( ; i >= limit; --i) { - QMetaProperty prop = meta->property(i); - if (isEnumerableMetaProperty(prop, meta, i) - && !isObjectProperty(m_object, prop.name())) { - return true; - } - } - } - - } // switch - - return false; -} - -void ExtQObjectDataIterator::previous(QScript::Member *member) -{ - QScriptEnginePrivate *eng = m_object.engine(); - ExtQObject::Instance *inst = ExtQObject::Instance::get(m_object); - if (!inst->value) - return; - const QMetaObject *meta = inst->value->metaObject(); - int i = m_index - 1; - - switch (m_state) { - case MetaMethods: { - int limit = (inst->options & QScriptEngine::ExcludeSuperClassMethods) - ? meta->methodOffset() : 0; - for ( ; i >= limit; --i) { - QMetaMethod method = meta->method(i); - if (hasMethodAccess(method, i, inst->options) - && !isObjectProperty(m_object, method.signature())) { - QMetaMethod method = meta->method(i); - QScriptNameIdImpl *nameId = eng->nameId(QLatin1String(method.signature())); - member->native(nameId, i, - QScriptValue::QObjectMember - | METHOD_ID); - m_index = i; - return; - } - } - m_state = DynamicProperties; - m_index = inst->value->dynamicPropertyNames().count() - 1; - i = m_index; - // fall-through - } - - case DynamicProperties: { - QList<QByteArray> dpNames = inst->value->dynamicPropertyNames(); - for ( ; i >= 0; --i) { - if (!isObjectProperty(m_object, dpNames.at(i))) { - QByteArray name = dpNames.at(i); - QScriptNameIdImpl *nameId = eng->nameId(QLatin1String(name)); - member->native(nameId, i, - QScriptValue::QObjectMember - | DYNAPROPERTY_ID); - m_index = i; - return; - } - } - m_state = MetaProperties; - m_index = meta->propertyCount() - 1; - i = m_index; - // fall-through - } - - case MetaProperties: { - int limit = (inst->options & QScriptEngine::ExcludeSuperClassProperties) - ? meta->propertyOffset() : 0; - for ( ; i >= limit; --i) { - QMetaProperty prop = meta->property(i); - if (isEnumerableMetaProperty(prop, meta, i) - && !isObjectProperty(m_object, prop.name())) { - QScriptNameIdImpl *nameId = eng->nameId(QLatin1String(prop.name())); - member->native(nameId, i, flagsForMetaProperty(prop)); - m_index = i; - return; - } - } - } - - } // switch - - member->invalidate(); -} - -void ExtQObjectDataIterator::toFront() -{ - ExtQObject::Instance *inst = ExtQObject::Instance::get(m_object); - if (!inst->value) - return; - m_state = MetaProperties; - const QMetaObject *meta = inst->value->metaObject(); - m_index = (inst->options & QScriptEngine::ExcludeSuperClassProperties) - ? meta->propertyOffset() : 0; -} - -void ExtQObjectDataIterator::toBack() -{ - ExtQObject::Instance *inst = ExtQObject::Instance::get(m_object); - if (!inst->value) - return; - if (inst->options & QScriptEngine::SkipMethodsInEnumeration) { - m_state = DynamicProperties; - m_index = inst->value->dynamicPropertyNames().count(); - } else { - m_state = MetaMethods; - const QMetaObject *meta = inst->value->metaObject(); - m_index = meta->methodCount(); - } -} - -class ExtQObjectData: public QScriptClassData -{ -public: - ExtQObjectData(QScriptClassInfo *classInfo) - : m_classInfo(classInfo) - { - } - - virtual bool resolve(const QScriptValueImpl &object, QScriptNameIdImpl *nameId, - QScript::Member *member, QScriptValueImpl *, - QScript::AccessMode access) - { - ExtQObject::Instance *inst = ExtQObject::Instance::get(object, m_classInfo); - QObject *qobject = inst->value; - if (! qobject) { - // the object was deleted. We return true so we can - // throw an error in get()/put() - member->native(nameId, /*id=*/-1, /*flags=*/0); - return true; - } - - const QScriptEngine::QObjectWrapOptions &opt = inst->options; - const QMetaObject *meta = qobject->metaObject(); - - QScriptEnginePrivate *eng = object.engine(); - -#ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE - QScriptMetaObject *metaCache = eng->cachedMetaObject(meta); - if (metaCache->findMember(nameId, member)) { - bool ignore = false; - switch (member->flags() & ID_MASK) { - case PROPERTY_ID: - ignore = (opt & QScriptEngine::ExcludeSuperClassProperties) - && (member->id() < meta->propertyOffset()); - break; - case METHOD_ID: - ignore = ((opt & QScriptEngine::ExcludeSuperClassMethods) - && (member->id() < meta->methodOffset())) - || ((opt & QScriptEngine::ExcludeDeleteLater) - && (member->id() == 2)); - break; - // we don't cache dynamic properties nor children, - // so no need to handle DYNAPROPERTY_ID and CHILD_ID - default: - break; - } - if (!ignore) - return true; - } -#endif - - QString memberName = eng->toString(nameId); - QByteArray name = memberName.toLatin1(); - - int index = -1; - - if (name.contains('(')) { - QByteArray normalized = QMetaObject::normalizedSignature(name); - if (-1 != (index = meta->indexOfMethod(normalized))) { - QMetaMethod method = meta->method(index); - if (hasMethodAccess(method, index, opt)) { - member->native(nameId, index, - QScriptValue::QObjectMember - | METHOD_ID); -#ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE - metaCache->registerMember(nameId, *member); -#endif - if (!(opt & QScriptEngine::ExcludeSuperClassMethods) - || (index >= meta->methodOffset())) { - return true; - } - } - } - } - - index = meta->indexOfProperty(name); - if (index != -1) { - QMetaProperty prop = meta->property(index); - if (prop.isScriptable()) { - member->native(nameId, index, flagsForMetaProperty(prop)); -#ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE - metaCache->registerMember(nameId, *member); -#endif - if (!(opt & QScriptEngine::ExcludeSuperClassProperties) - || (index >= meta->propertyOffset())) { - return true; - } - } - } - - index = qobject->dynamicPropertyNames().indexOf(name); - if (index != -1) { - member->native(nameId, index, - QScriptValue::QObjectMember - | DYNAPROPERTY_ID); - // not cached because it can be removed - return true; - } - - const int offset = (opt & QScriptEngine::ExcludeSuperClassMethods) - ? meta->methodOffset() : 0; - for (index = meta->methodCount() - 1; index >= offset; --index) { - QMetaMethod method = meta->method(index); - if (hasMethodAccess(method, index, opt) - && (methodName(method) == name)) { - member->native(nameId, index, - QScriptValue::QObjectMember - | METHOD_ID - | MAYBE_OVERLOADED); -#ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE - metaCache->registerMember(nameId, *member); -#endif - return true; - } - } - - if (!(opt & QScriptEngine::ExcludeChildObjects)) { - QList<QObject*> children = qobject->children(); - for (index = 0; index < children.count(); ++index) { - QObject *child = children.at(index); - if (child->objectName() == memberName) { - member->native(nameId, index, - QScriptValue::ReadOnly - | QScriptValue::Undeletable - | QScriptValue::SkipInEnumeration - | CHILD_ID); - // not cached because it can be removed or change name - return true; - } - } - } - - if ((access & QScript::Write) && (opt & QScriptEngine::AutoCreateDynamicProperties)) { - member->native(nameId, -1, DYNAPROPERTY_ID); - return true; - } - - return false; - } - - virtual bool get(const QScriptValueImpl &obj, const QScript::Member &member, QScriptValueImpl *result) - { - if (! member.isNativeProperty()) - return false; - - QScriptEnginePrivate *eng = obj.engine(); - - ExtQObject::Instance *inst = ExtQObject::Instance::get(obj, m_classInfo); - QObject *qobject = inst->value; - if (!qobject) { - QScriptContextPrivate *ctx = eng->currentContext(); - *result = ctx->throwError( - QString::fromLatin1("cannot access member `%0' of deleted QObject") - .arg(member.nameId()->s)); - return true; - } - - switch (member.flags() & ID_MASK) { - case PROPERTY_ID: { - const QMetaObject *meta = qobject->metaObject(); - const int propertyIndex = member.id(); - QMetaProperty prop = meta->property(propertyIndex); - Q_ASSERT(prop.isScriptable()); - if (GeneratePropertyFunctions) { - QScriptValueImpl accessor; -#ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE - QScriptMetaObject *metaCache = eng->cachedMetaObject(meta); - accessor = metaCache->findPropertyAccessor(propertyIndex); - if (!accessor.isValid()) { -#endif - accessor = eng->createFunction(new QtPropertyFunction(meta, propertyIndex)); -#ifndef Q_SCRIPT_NO_QMETAOBJECT_CACHE - metaCache->registerPropertyAccessor(propertyIndex, accessor); - } -#endif - *result = accessor; - } else { - QVariant v = prop.read(qobject); - *result = eng->valueFromVariant(v); - } - } break; - - case DYNAPROPERTY_ID: { - if (member.id() != -1) { - QVariant v = qobject->property(member.nameId()->s.toLatin1()); - *result = eng->valueFromVariant(v); - } else { - *result = eng->undefinedValue(); - } - } break; - - case METHOD_ID: { - QScript::Member m; - bool maybeOverloaded = (member.flags() & MAYBE_OVERLOADED) != 0; - *result = eng->createFunction(new QtFunction(obj, member.id(), - maybeOverloaded)); - // make it persist (otherwise Function.prototype.disconnect() would fail) - uint flags = QScriptValue::QObjectMember; - if (inst->options & QScriptEngine::SkipMethodsInEnumeration) - flags |= QScriptValue::SkipInEnumeration; - QScriptObject *instance = obj.objectValue(); - if (!instance->findMember(member.nameId(), &m)) - instance->createMember(member.nameId(), &m, flags); - instance->put(m, *result); - } break; - - case CHILD_ID: { - QObject *child = qobject->children().at(member.id()); - result->invalidate(); - QScriptEngine::QObjectWrapOptions opt = QScriptEngine::PreferExistingWrapperObject; - eng->newQObject(result, child, QScriptEngine::QtOwnership, opt); - } break; - - } // switch - - return true; - } - - virtual bool put(QScriptValueImpl *object, const QScript::Member &member, const QScriptValueImpl &value) - { - if (! member.isNativeProperty() || ! member.isWritable()) - return false; - - ExtQObject::Instance *inst = ExtQObject::Instance::get(*object, m_classInfo); - QObject *qobject = inst->value; - if (!qobject) { - QScriptEnginePrivate *eng = object->engine(); - QScriptContextPrivate *ctx = eng->currentContext(); - ctx->throwError(QString::fromLatin1("cannot access member `%0' of deleted QObject") - .arg(member.nameId()->s)); - return true; - } - - switch (member.flags() & ID_MASK) { - case CHILD_ID: - return false; - - case METHOD_ID: { - QScript::Member m; - QScriptObject *instance = object->objectValue(); - if (!instance->findMember(member.nameId(), &m)) { - instance->createMember(member.nameId(), &m, - /*flags=*/0); - } - instance->put(m, value); - return true; - } - - case PROPERTY_ID: - if (GeneratePropertyFunctions) { - // we shouldn't get here, QScriptValueImpl::setProperty() messed up - Q_ASSERT_X(0, "put", "Q_PROPERTY access cannot be overridden"); - return false; - } else { - const QMetaObject *meta = qobject->metaObject(); - QMetaProperty prop = meta->property(member.id()); - Q_ASSERT(prop.isScriptable()); - QVariant v = variantFromValue(object->engine(), prop.userType(), value); - bool ok = prop.write(qobject, v); - return ok; - } - - case DYNAPROPERTY_ID: { - QVariant v = value.toVariant(); - return ! qobject->setProperty(member.nameId()->s.toLatin1(), v); - } - - } // switch - return false; - } - - virtual bool removeMember(const QScriptValueImpl &object, - const QScript::Member &member) - { - QObject *qobject = object.toQObject(); - if (!qobject || !member.isNativeProperty() || !member.isDeletable()) - return false; - - if ((member.flags() & ID_MASK) == DYNAPROPERTY_ID) { - qobject->setProperty(member.nameId()->s.toLatin1(), QVariant()); - return true; - } - - return false; - } - - virtual void mark(const QScriptValueImpl &, int) - { - } - - virtual QScriptClassDataIterator *newIterator(const QScriptValueImpl &object) - { - return new ExtQObjectDataIterator(object); - } - -private: - QScriptClassInfo *m_classInfo; -}; - -struct QObjectConnection -{ - int slotIndex; - QScriptValueImpl receiver; - QScriptValueImpl slot; - QScriptValueImpl senderWrapper; - - QObjectConnection(int i, const QScriptValueImpl &r, const QScriptValueImpl &s, - const QScriptValueImpl &sw) - : slotIndex(i), receiver(r), slot(s), senderWrapper(sw) {} - QObjectConnection() : slotIndex(-1) {} - - bool hasTarget(const QScriptValueImpl &r, const QScriptValueImpl &s) const - { - if (r.isObject() != receiver.isObject()) - return false; - if ((r.isObject() && receiver.isObject()) - && (r.objectValue() != receiver.objectValue())) { - return false; - } - return (s.objectValue() == slot.objectValue()); - } - - void mark(int generation) - { - if (senderWrapper.isValid() && !senderWrapper.isMarked(generation)) { - // see if the sender should be marked or not - ExtQObject::Instance *inst = ExtQObject::Instance::get(senderWrapper); - if ((inst->ownership == QScriptEngine::ScriptOwnership) - || ((inst->ownership == QScriptEngine::AutoOwnership) - && inst->value && !inst->value->parent())) { - senderWrapper.invalidate(); - } else { - senderWrapper.mark(generation); - } - } - if (receiver.isValid()) - receiver.mark(generation); - if (slot.isValid()) - slot.mark(generation); - } -}; - -class QObjectConnectionManager: public QObject -{ -public: - QObjectConnectionManager(); - ~QObjectConnectionManager(); - - bool addSignalHandler(QObject *sender, int signalIndex, - const QScriptValueImpl &receiver, - const QScriptValueImpl &slot, - const QScriptValueImpl &senderWrapper = QScriptValueImpl()); - bool removeSignalHandler( - QObject *sender, int signalIndex, - const QScriptValueImpl &receiver, - const QScriptValueImpl &slot); - - static const QMetaObject staticMetaObject; - virtual const QMetaObject *metaObject() const; - virtual void *qt_metacast(const char *); - virtual int qt_metacall(QMetaObject::Call, int, void **argv); - - void execute(int slotIndex, void **argv); - - void mark(int generation); - -private: - int m_slotCounter; - QVector<QVector<QObjectConnection> > connections; -}; - -} // ::QScript - - - -QScript::ExtQObject::ExtQObject(QScriptEnginePrivate *eng): - Ecma::Core(eng, QLatin1String("QObject"), QScriptClassInfo::QObjectType) -{ - newQObject(&publicPrototype, new QScript::QObjectPrototype(), - QScriptEngine::AutoOwnership, - QScriptEngine::ExcludeSuperClassMethods - | QScriptEngine::ExcludeSuperClassProperties - | QScriptEngine::ExcludeChildObjects); - - eng->newConstructor(&ctor, this, publicPrototype); - addPrototypeFunction(QLatin1String("toString"), method_toString, 0); - addPrototypeFunction(QLatin1String("findChild"), method_findChild, 1); - addPrototypeFunction(QLatin1String("findChildren"), method_findChildren, 1); - - classInfo()->setData(new QScript::ExtQObjectData(classInfo())); -} - -QScript::ExtQObject::~ExtQObject() -{ -} - -void QScript::ExtQObject::execute(QScriptContextPrivate *context) -{ - QScriptValueImpl tmp; - newQObject(&tmp, 0); - context->setReturnValue(tmp); -} - -void QScript::ExtQObject::newQObject(QScriptValueImpl *result, QObject *value, - QScriptEngine::ValueOwnership ownership, - const QScriptEngine::QObjectWrapOptions &options) -{ - Instance *instance; - if (!result->isValid()) { - engine()->newObject(result, publicPrototype, classInfo()); - instance = new Instance(); - result->setObjectData(instance); - } else { - Q_ASSERT(result->isObject()); - if (result->classInfo() != classInfo()) { - result->destroyObjectData(); - result->setClassInfo(classInfo()); - instance = new Instance(); - result->setObjectData(instance); - } else { - instance = Instance::get(*result); - } - } - instance->value = value; - instance->ownership = ownership; - instance->options = options; -} - -QScriptValueImpl QScript::ExtQObject::method_findChild(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - if (Instance *instance = Instance::get(context->thisObject(), classInfo)) { - QObject *obj = instance->value; - QString name = context->argument(0).toString(); - QObject *child = qFindChild<QObject*>(obj, name); - QScriptEngine::QObjectWrapOptions opt = QScriptEngine::PreferExistingWrapperObject; - QScriptValueImpl result; - eng->newQObject(&result, child, QScriptEngine::QtOwnership, opt); - return result; - } - return eng->undefinedValue(); -} - -QScriptValueImpl QScript::ExtQObject::method_findChildren(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - if (Instance *instance = Instance::get(context->thisObject(), classInfo)) { - QObject *obj = instance->value; - QList<QObject*> found; - QScriptValueImpl arg = context->argument(0); -#ifndef QT_NO_REGEXP - if (arg.isRegExp()) { - QRegExp re = arg.toRegExp(); - found = qFindChildren<QObject*>(obj, re); - } else -#endif - { - QString name = arg.isUndefined() ? QString() : arg.toString(); - found = qFindChildren<QObject*>(obj, name); - } - QScriptValueImpl result = eng->newArray(found.size()); - QScriptEngine::QObjectWrapOptions opt = QScriptEngine::PreferExistingWrapperObject; - for (int i = 0; i < found.size(); ++i) { - QScriptValueImpl value; - eng->newQObject(&value, found.at(i), QScriptEngine::QtOwnership, opt); - result.setProperty(i, value); - } - return result; - } - return eng->undefinedValue(); -} - -QScriptValueImpl QScript::ExtQObject::method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - if (Instance *instance = Instance::get(context->thisObject(), classInfo)) { - QObject *obj = instance->value; - const QMetaObject *meta = obj ? obj->metaObject() : &QObject::staticMetaObject; - QString name = obj ? obj->objectName() : QString::fromUtf8("unnamed"); - - QString str = QString::fromUtf8("%0(name = \"%1\")") - .arg(QLatin1String(meta->className())).arg(name); - return QScriptValueImpl(eng, str); - } - return eng->undefinedValue(); -} - - - -static const uint qt_meta_data_QObjectConnectionManager[] = { - - // content: - 1, // revision - 0, // classname - 0, 0, // classinfo - 1, 10, // methods - 0, 0, // properties - 0, 0, // enums/sets - - // slots: signature, parameters, type, tag, flags - 35, 34, 34, 34, 0x0a, - - 0 // eod -}; - -static const char qt_meta_stringdata_QObjectConnectionManager[] = { - "QScript::QObjectConnectionManager\0\0execute()\0" -}; - -const QMetaObject QScript::QObjectConnectionManager::staticMetaObject = { - { &QObject::staticMetaObject, qt_meta_stringdata_QObjectConnectionManager, - qt_meta_data_QObjectConnectionManager, 0 } -}; - -const QMetaObject *QScript::QObjectConnectionManager::metaObject() const -{ - return &staticMetaObject; -} - -void *QScript::QObjectConnectionManager::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_QObjectConnectionManager)) - return static_cast<void*>(const_cast<QObjectConnectionManager*>(this)); - return QObject::qt_metacast(_clname); -} - -int QScript::QObjectConnectionManager::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QObject::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - if (_c == QMetaObject::InvokeMetaMethod) { - execute(_id, _a); - _id -= m_slotCounter; - } - return _id; -} - -void QScript::QObjectConnectionManager::execute(int slotIndex, void **argv) -{ - QScriptValueImpl receiver; - QScriptValueImpl slot; - QScriptValueImpl senderWrapper; - int signalIndex = -1; - for (int i = 0; i < connections.size(); ++i) { - const QVector<QObjectConnection> &cs = connections.at(i); - for (int j = 0; j < cs.size(); ++j) { - const QObjectConnection &c = cs.at(j); - if (c.slotIndex == slotIndex) { - receiver = c.receiver; - slot = c.slot; - senderWrapper = c.senderWrapper; - signalIndex = i; - break; - } - } - } - Q_ASSERT(slot.isValid()); - - QScriptEnginePrivate *eng = slot.engine(); - - if (eng->isCollecting()) { - // we can't do a script function call during GC, - // so we're forced to ignore this signal - return; - } - - QScriptFunction *fun = eng->convertToNativeFunction(slot); - if (fun == 0) { - // the signal handler has been GC'ed. This can only happen when - // a QObject is owned by the engine, the engine is destroyed, and - // there is a script function connected to the destroyed() signal - Q_ASSERT(signalIndex <= 1); // destroyed(QObject*) - return; - } - - const QMetaObject *meta = sender()->metaObject(); - const QMetaMethod method = meta->method(signalIndex); - - QList<QByteArray> parameterTypes = method.parameterTypes(); - int argc = parameterTypes.count(); - - QScriptValueImpl activation; - eng->newActivation(&activation); - QScriptObject *activation_data = activation.objectValue(); - activation_data->m_scope = slot.scope(); - - int formalCount = fun->formals.count(); - int mx = qMax(formalCount, argc); - activation_data->m_members.resize(mx + 1); - activation_data->m_values.resize(mx + 1); - for (int i = 0; i < mx; ++i) { - QScriptNameIdImpl *nameId; - if (i < formalCount) - nameId = fun->formals.at(i); - else - nameId = 0; - activation_data->m_members[i].object(nameId, i, - QScriptValue::Undeletable - | QScriptValue::SkipInEnumeration); - QScriptValueImpl actual; - if (i < argc) { - void *arg = argv[i + 1]; - QByteArray typeName = parameterTypes.at(i); - int argType = QMetaType::type(typeName); - if (!argType) { - if (typeName == "QVariant") { - actual = eng->valueFromVariant(*reinterpret_cast<QVariant*>(arg)); - } else { - qWarning("QScriptEngine: Unable to handle unregistered datatype '%s' " - "when invoking handler of signal %s::%s", - typeName.constData(), meta->className(), method.signature()); - actual = eng->undefinedValue(); - } - } else { - actual = eng->create(argType, arg); - } - } else { - actual = eng->undefinedValue(); - } - activation_data->m_values[i] = actual; - } - - QScriptValueImpl senderObject; - if (senderWrapper.isQObject()) { - senderObject = senderWrapper; - } else { - QScriptEngine::QObjectWrapOptions opt = QScriptEngine::PreferExistingWrapperObject; - eng->newQObject(&senderObject, sender(), QScriptEngine::QtOwnership, opt); - } - activation_data->m_members[mx].object(eng->idTable()->id___qt_sender__, mx, - QScriptValue::SkipInEnumeration); - activation_data->m_values[mx] = senderObject; - - QScriptValueImpl thisObject; - if (receiver.isObject()) - thisObject = receiver; - else - thisObject = eng->globalObject(); - - QScriptContextPrivate *context_data = eng->pushContext(); - context_data->m_activation = activation; - context_data->m_callee = slot; - context_data->m_thisObject = thisObject; - context_data->argc = argc; - context_data->args = const_cast<QScriptValueImpl*> (activation_data->m_values.constData()); - - fun->execute(context_data); - - eng->popContext(); - if (eng->hasUncaughtException()) - eng->emitSignalHandlerException(); -} - -QScript::QObjectConnectionManager::QObjectConnectionManager() - : m_slotCounter(0) -{ -} - -QScript::QObjectConnectionManager::~QObjectConnectionManager() -{ -} - -void QScript::QObjectConnectionManager::mark(int generation) -{ - for (int i = 0; i < connections.size(); ++i) { - QVector<QObjectConnection> &cs = connections[i]; - for (int j = 0; j < cs.size(); ++j) - cs[j].mark(generation); - } -} - -bool QScript::QObjectConnectionManager::addSignalHandler( - QObject *sender, int signalIndex, const QScriptValueImpl &receiver, - const QScriptValueImpl &function, const QScriptValueImpl &senderWrapper) -{ - if (connections.size() <= signalIndex) - connections.resize(signalIndex+1); - QVector<QObjectConnection> &cs = connections[signalIndex]; - int absSlotIndex = m_slotCounter + metaObject()->methodOffset(); - bool ok = QMetaObject::connect(sender, signalIndex, this, absSlotIndex); - if (ok) { - cs.append(QScript::QObjectConnection(m_slotCounter++, receiver, function, senderWrapper)); - QMetaMethod signal = sender->metaObject()->method(signalIndex); - QByteArray signalString; - signalString.append('2'); // signal code - signalString.append(signal.signature()); - static_cast<QScript::QObjectNotifyCaller*>(sender)->callConnectNotify(signalString); - } - return ok; -} - -bool QScript::QObjectConnectionManager::removeSignalHandler( - QObject *sender, int signalIndex, - const QScriptValueImpl &receiver, - const QScriptValueImpl &slot) -{ - if (connections.size() <= signalIndex) - return false; - QVector<QObjectConnection> &cs = connections[signalIndex]; - for (int i = 0; i < cs.size(); ++i) { - const QObjectConnection &c = cs.at(i); - if (c.hasTarget(receiver, slot)) { - int absSlotIndex = c.slotIndex + metaObject()->methodOffset(); - bool ok = QMetaObject::disconnect(sender, signalIndex, this, absSlotIndex); - if (ok) { - cs.remove(i); - QMetaMethod signal = sender->metaObject()->method(signalIndex); - QByteArray signalString; - signalString.append('2'); // signal code - signalString.append(signal.signature()); - static_cast<QScript::QObjectNotifyCaller*>(sender)->callDisconnectNotify(signalString); - } - return ok; - } - } - return false; -} - - - -QString QScript::QtPropertyFunction::functionName() const -{ - QMetaProperty prop = m_meta->property(m_index); - return QLatin1String(prop.name()); -} - -void QScript::QtPropertyFunction::execute(QScriptContextPrivate *context) -{ - context->calleeMetaIndex = m_index; - - QScriptEnginePrivate *eng_p = context->engine(); -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - eng_p->notifyFunctionEntry(context); -#endif - QScriptValueImpl result = eng_p->undefinedValue(); - - QScriptValueImpl object = context->thisObject(); - QObject *qobject = object.toQObject(); - while ((!qobject || (qobject->metaObject() != m_meta)) - && object.prototype().isObject()) { - object = object.prototype(); - qobject = object.toQObject(); - } - Q_ASSERT(qobject); - - QMetaProperty prop = m_meta->property(m_index); - Q_ASSERT(prop.isScriptable()); - if (context->argumentCount() == 0) { - // get - if (prop.isValid()) { - QScriptable *scriptable = scriptableFromQObject(qobject); - QScriptEngine *oldEngine = 0; - if (scriptable) { - oldEngine = QScriptablePrivate::get(scriptable)->engine; - QScriptablePrivate::get(scriptable)->engine = QScriptEnginePrivate::get(eng_p); - } - - QVariant v = prop.read(qobject); - - if (scriptable) - QScriptablePrivate::get(scriptable)->engine = oldEngine; - - result = eng_p->valueFromVariant(v); - } - } else { - // set - QScriptValueImpl arg = context->argument(0); - QVariant v; - if (prop.isEnumType() && arg.isString() - && !eng_p->demarshalFunction(prop.userType())) { - // give QMetaProperty::write() a chance to convert from - // string to enum value - v = arg.toString(); - } else { - v = variantFromValue(eng_p, prop.userType(), arg); - } - - QScriptable *scriptable = scriptableFromQObject(qobject); - QScriptEngine *oldEngine = 0; - if (scriptable) { - oldEngine = QScriptablePrivate::get(scriptable)->engine; - QScriptablePrivate::get(scriptable)->engine = QScriptEnginePrivate::get(eng_p); - } - - prop.write(qobject, v); - - if (scriptable) - QScriptablePrivate::get(scriptable)->engine = oldEngine; - - result = context->argument(0); - } - if (!eng_p->hasUncaughtException()) - context->m_result = result; -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - eng_p->notifyFunctionExit(context); -#endif -} - -QString QScript::QtFunction::functionName() const -{ - const QMetaObject *meta = metaObject(); - if (!meta) - return QString(); - QMetaMethod method = meta->method(m_initialIndex); - return QLatin1String(methodName(method)); -} - -void QScript::QtFunction::mark(QScriptEnginePrivate *engine, int generation) -{ - if (m_object.isValid()) - engine->markObject(m_object, generation); - QScriptFunction::mark(engine, generation); -} - -void QScript::QtFunction::execute(QScriptContextPrivate *context) -{ - QScriptEnginePrivate *eng_p = context->engine(); - QObject *qobj = qobject(); - if (!qobj) { - context->calleeMetaIndex = m_initialIndex; -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - eng_p->notifyFunctionEntry(context); -#endif - context->throwError(QLatin1String("cannot call function of deleted QObject")); -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - eng_p->notifyFunctionExit(context); -#endif - return; - } - - const QMetaObject *meta = qobj->metaObject(); - - QObject *thisQObject = context->thisObject().toQObject(); - if (!thisQObject) // ### TypeError - thisQObject = qobj; - - if (!meta->cast(thisQObject)) { -#if 0 - // ### find common superclass, see if initialIndex is - // in that class (or a superclass of that class), - // then it's still safe to execute it - funName = methodName(meta->method(m_initialIndex)); - context->throwError( - QString::fromUtf8("cannot execute %0: %1 does not inherit %2") - .arg(QLatin1String(funName)) - .arg(QLatin1String(thisQObject->metaObject()->className())) - .arg(QLatin1String(meta->className()))); - return; -#endif - // invoking a function in the prototype - thisQObject = qobj; - } - - callQtMethod(context, QMetaMethod::Method, thisQObject, - meta, m_initialIndex, m_maybeOverloaded); -} - -int QScript::QtFunction::mostGeneralMethod(QMetaMethod *out) const -{ - const QMetaObject *meta = metaObject(); - if (!meta) - return -1; - int index = m_initialIndex; - QMetaMethod method = meta->method(index); - if (maybeOverloaded() && (method.attributes() & QMetaMethod::Cloned)) { - // find the most general method - do { - method = meta->method(--index); - } while (method.attributes() & QMetaMethod::Cloned); - } - if (out) - *out = method; - return index; -} - -QList<int> QScript::QtFunction::overloadedIndexes() const -{ - if (!maybeOverloaded()) - return QList<int>(); - QList<int> result; - QString name = functionName(); - const QMetaObject *meta = metaObject(); - for (int index = mostGeneralMethod() - 1; index >= 0; --index) { - QString otherName = QString::fromLatin1(methodName(meta->method(index))); - if (otherName == name) - result.append(index); - } - return result; -} - -///////////////////////////////////////////////////////// - -namespace QScript -{ - -ExtQMetaObject::Instance *ExtQMetaObject::Instance::get(const QScriptValueImpl &object, - QScriptClassInfo *klass) -{ - if (! klass || klass == object.classInfo()) - return static_cast<Instance*> (object.objectData()); - - return 0; -} - -void ExtQMetaObject::Instance::execute(QScriptContextPrivate *context) -{ - if (ctor.isFunction()) { - QScriptValueImplList args; - for (int i = 0; i < context->argumentCount(); ++i) - args << context->argument(i); - QScriptEnginePrivate *eng = context->engine(); - context->m_result = eng->call(ctor, context->thisObject(), args, - context->isCalledAsConstructor()); - } else { - if (value->constructorCount() > 0) { - callQtMethod(context, QMetaMethod::Constructor, /*thisQObject=*/0, - value, value->constructorCount()-1, /*maybeOverloaded=*/true); - if (context->state() == QScriptContext::NormalState) { - ExtQObject::Instance *inst = ExtQObject::Instance::get(context->m_result); - Q_ASSERT(inst != 0); - inst->ownership = QScriptEngine::AutoOwnership; - context->m_result.setPrototype(prototype); - } - } else { - context->m_result = context->throwError( - QScriptContext::TypeError, - QString::fromUtf8("no constructor for %0") - .arg(QLatin1String(value->className()))); - } - } -} - -struct StaticQtMetaObject : public QObject -{ - static const QMetaObject *get() - { return &static_cast<StaticQtMetaObject*> (0)->staticQtMetaObject; } -}; - -class ExtQMetaObjectData: public QScriptClassData -{ -public: - ExtQMetaObjectData(QScriptEnginePrivate *, QScriptClassInfo *classInfo); - - virtual bool resolve(const QScriptValueImpl &object, QScriptNameIdImpl *nameId, - QScript::Member *member, QScriptValueImpl *base, - QScript::AccessMode access); - virtual bool get(const QScriptValueImpl &object, const QScript::Member &member, - QScriptValueImpl *result); - virtual bool put(QScriptValueImpl *object, const QScript::Member &member, - const QScriptValueImpl &value); - virtual void mark(const QScriptValueImpl &object, int generation); - -private: - QScriptClassInfo *m_classInfo; -}; - -ExtQMetaObjectData::ExtQMetaObjectData(QScriptEnginePrivate *, - QScriptClassInfo *classInfo) - : m_classInfo(classInfo) -{ -} - -bool ExtQMetaObjectData::resolve(const QScriptValueImpl &object, - QScriptNameIdImpl *nameId, - QScript::Member *member, - QScriptValueImpl *base, - QScript::AccessMode /*access*/) -{ - const QMetaObject *meta = object.toQMetaObject(); - if (!meta) - return false; - - QScriptEnginePrivate *eng_p = object.engine(); - if (eng_p->idTable()->id_prototype == nameId) { - // prototype property is a proxy to constructor's prototype property - member->native(nameId, /*id=*/0, QScriptValue::Undeletable); - return true; - } - - QByteArray name = eng_p->toString(nameId).toLatin1(); - - for (int i = 0; i < meta->enumeratorCount(); ++i) { - QMetaEnum e = meta->enumerator(i); - - for (int j = 0; j < e.keyCount(); ++j) { - const char *key = e.key(j); - - if (! qstrcmp (key, name.constData())) { - member->native(nameId, e.value(j), QScriptValue::ReadOnly); - *base = object; - return true; - } - } - } - - return false; -} - -bool ExtQMetaObjectData::get(const QScriptValueImpl &object, - const QScript::Member &member, - QScriptValueImpl *result) -{ - if (! member.isNativeProperty()) - return false; - - QScriptEnginePrivate *eng_p = object.engine(); - if (eng_p->idTable()->id_prototype == member.nameId()) { - ExtQMetaObject::Instance *inst = ExtQMetaObject::Instance::get(object, m_classInfo); - if (inst->ctor.isFunction()) - *result = inst->ctor.property(eng_p->idTable()->id_prototype); - else - *result = inst->prototype; - } else { - *result = QScriptValueImpl(member.id()); - } - return true; -} - -bool ExtQMetaObjectData::put(QScriptValueImpl *object, const Member &member, - const QScriptValueImpl &value) -{ - if (! member.isNativeProperty()) - return false; - - QScriptEnginePrivate *eng_p = object->engine(); - if (eng_p->idTable()->id_prototype == member.nameId()) { - ExtQMetaObject::Instance *inst = ExtQMetaObject::Instance::get(*object, m_classInfo); - if (inst->ctor.isFunction()) - inst->ctor.setProperty(eng_p->idTable()->id_prototype, value); - else - inst->prototype = value; - } - - return true; -} - -void ExtQMetaObjectData::mark(const QScriptValueImpl &object, int generation) -{ - ExtQMetaObject::Instance *inst = ExtQMetaObject::Instance::get(object, m_classInfo); - if (inst->ctor.isObject() || inst->ctor.isString()) - inst->ctor.mark(generation); -} - -} // namespace QScript - -QScript::ExtQMetaObject::ExtQMetaObject(QScriptEnginePrivate *eng) - : Ecma::Core(eng, QLatin1String("QMetaObject"), QScriptClassInfo::QMetaObjectType) -{ - newQMetaObject(&publicPrototype, QScript::StaticQtMetaObject::get()); - - eng->newConstructor(&ctor, this, publicPrototype); - addPrototypeFunction(QLatin1String("className"), method_className, 0); - - classInfo()->setData(new QScript::ExtQMetaObjectData(eng, classInfo())); -} - -QScript::ExtQMetaObject::~ExtQMetaObject() -{ -} - -void QScript::ExtQMetaObject::execute(QScriptContextPrivate *context) -{ - QScriptValueImpl tmp; - newQMetaObject(&tmp, 0); - context->setReturnValue(tmp); -} - -void QScript::ExtQMetaObject::newQMetaObject(QScriptValueImpl *result, const QMetaObject *value, - const QScriptValueImpl &ctor) -{ - Instance *instance = new Instance(); - instance->value = value; - if (ctor.isFunction()) { - instance->ctor = ctor; - } else { - instance->prototype = engine()->newObject(); - instance->prototype.setPrototype(engine()->qobjectConstructor->publicPrototype); - } - - engine()->newObject(result, publicPrototype, classInfo()); - result->setObjectData(instance); -} - -QScriptValueImpl QScript::ExtQMetaObject::method_className(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - if (Instance *instance = Instance::get(context->thisObject(), classInfo)) { - return QScriptValueImpl(eng, QString::fromLatin1(instance->value->className())); - } - return eng->undefinedValue(); -} - -QScriptQObjectData::QScriptQObjectData() - : m_connectionManager(0) -{ -} - -QScriptQObjectData::~QScriptQObjectData() -{ - if (m_connectionManager) { - delete m_connectionManager; - m_connectionManager = 0; - } -} - -bool QScriptQObjectData::addSignalHandler(QObject *sender, - int signalIndex, - const QScriptValueImpl &receiver, - const QScriptValueImpl &slot, - const QScriptValueImpl &senderWrapper) -{ - if (!m_connectionManager) - m_connectionManager = new QScript::QObjectConnectionManager(); - return m_connectionManager->addSignalHandler( - sender, signalIndex, receiver, slot, senderWrapper); -} - -bool QScriptQObjectData::removeSignalHandler(QObject *sender, - int signalIndex, - const QScriptValueImpl &receiver, - const QScriptValueImpl &slot) -{ - if (!m_connectionManager) - return false; - return m_connectionManager->removeSignalHandler( - sender, signalIndex, receiver, slot); -} - -bool QScriptQObjectData::findWrapper(QScriptEngine::ValueOwnership ownership, - const QScriptEngine::QObjectWrapOptions &options, - QScriptValueImpl *out) -{ - for (int i = 0; i < wrappers.size(); ++i) { - const QScriptQObjectWrapperInfo &info = wrappers.at(i); - if ((info.ownership == ownership) && (info.options == options)) { - *out = info.object; - return true; - } - } - return false; -} - -void QScriptQObjectData::registerWrapper(const QScriptValueImpl &wrapper, - QScriptEngine::ValueOwnership ownership, - const QScriptEngine::QObjectWrapOptions &options) -{ - wrappers.append(QScriptQObjectWrapperInfo(wrapper, ownership, options)); -} - -void QScriptQObjectData::mark(int generation) -{ - if (m_connectionManager) - m_connectionManager->mark(generation); - - { - QList<QScriptQObjectWrapperInfo>::iterator it; - for (it = wrappers.begin(); it != wrappers.end(); ) { - const QScriptQObjectWrapperInfo &info = *it; - if (info.object.isMarked(generation)) { - ++it; - } else { - it = wrappers.erase(it); - } - } - } -} - -QT_END_NAMESPACE - -#include "qscriptextqobject.moc" - -#endif // QT_NO_SCRIPT diff --git a/src/script/qscriptextqobject_p.h b/src/script/qscriptextqobject_p.h deleted file mode 100644 index 537fa49..0000000 --- a/src/script/qscriptextqobject_p.h +++ /dev/null @@ -1,447 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTEXTQOBJECT_P_H -#define QSCRIPTEXTQOBJECT_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. -// - -#ifndef QT_NO_QOBJECT - -#include "qscriptecmacore_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptclassdata_p.h" -#include "qscriptfunction_p.h" -#include "qscriptengine.h" -#include "qscriptmemberfwd_p.h" - -#include <QtCore/QHash> -#include <QtCore/QPointer> -#include <QtCore/QObject> -#include <QtCore/QVariant> -#include <QtCore/QVarLengthArray> -#include <QtCore/QVector> - -QT_BEGIN_NAMESPACE - -namespace QScript { - -class QObjectConnectionManager; - -class ExtQObject: public Ecma::Core -{ -public: - ExtQObject(QScriptEnginePrivate *engine); - virtual ~ExtQObject(); - - virtual void execute(QScriptContextPrivate *context); - - class Instance: public QScriptObjectData { - public: - Instance() : ownership(QScriptEngine::QtOwnership) { } - virtual void finalize(QScriptEnginePrivate *engine); - virtual ~Instance() {} - - static Instance *get(const QScriptValueImpl &object, QScriptClassInfo *klass = 0); - - public: - QPointer<QObject> value; - QScriptEngine::ValueOwnership ownership; - QScriptEngine::QObjectWrapOptions options; - }; - - inline Instance *get(const QScriptValueImpl &object) const - { return Instance::get(object, classInfo()); } - - void newQObject(QScriptValueImpl *result, QObject *value, - QScriptEngine::ValueOwnership ownership = QScriptEngine::QtOwnership, - const QScriptEngine::QObjectWrapOptions &options = 0); - -protected: - static QScriptValueImpl method_findChild(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo); - static QScriptValueImpl method_findChildren(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo); - static QScriptValueImpl method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo); -}; - -class QtFunction: public QScriptFunction -{ -public: - QtFunction(const QScriptValueImpl &object, int initialIndex, bool maybeOverloaded) - : m_object(object), m_initialIndex(initialIndex), - m_maybeOverloaded(maybeOverloaded) - { } - - virtual ~QtFunction() { } - - virtual void execute(QScriptContextPrivate *context); - - virtual Type type() const { return QScriptFunction::Qt; } - - virtual QString functionName() const; - - virtual void mark(QScriptEnginePrivate *engine, int generation); - - inline QScriptValueImpl object() const { return m_object; } - - inline QObject *qobject() const { - if (!m_object.isQObject()) - return 0; - return m_object.toQObject(); - } - - inline const QMetaObject *metaObject() const { - if (!m_object.isQObject()) - return 0; - QObject *qobj = m_object.toQObject(); - if (!qobj) - return 0; - return qobj->metaObject(); - } - - int mostGeneralMethod(QMetaMethod *out = 0) const; - QList<int> overloadedIndexes() const; - - inline int initialIndex() const { return m_initialIndex; } - inline bool maybeOverloaded() const { return m_maybeOverloaded; } - -private: - QScriptValueImpl m_object; - int m_initialIndex; - bool m_maybeOverloaded; -}; - -class ExtQMetaObject: public Ecma::Core -{ -public: - ExtQMetaObject(QScriptEnginePrivate *engine); - virtual ~ExtQMetaObject(); - - virtual void execute(QScriptContextPrivate *context); - - class Instance: public QScriptFunction { - public: - Instance() : value(0) { } - virtual ~Instance() { } - - static Instance *get(const QScriptValueImpl &object, QScriptClassInfo *klass); - - virtual void execute(QScriptContextPrivate *context); - - public: - const QMetaObject *value; - QScriptValueImpl ctor; - QScriptValueImpl prototype; - }; - - inline Instance *get(const QScriptValueImpl &object) const - { return Instance::get(object, classInfo()); } - - void newQMetaObject(QScriptValueImpl *result, const QMetaObject *value, - const QScriptValueImpl &ctor = QScriptValueImpl()); - -protected: - static QScriptValueImpl method_className(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo); -}; - -} // namespace QScript - -struct QScriptQObjectWrapperInfo -{ - QScriptQObjectWrapperInfo(const QScriptValueImpl &obj, - QScriptEngine::ValueOwnership own, - const QScriptEngine::QObjectWrapOptions &opt) - : object(obj), ownership(own), options(opt) {} - - QScriptValueImpl object; - QScriptEngine::ValueOwnership ownership; - QScriptEngine::QObjectWrapOptions options; -}; - -class QScriptQObjectData // : public QObjectUserData -{ -public: - QScriptQObjectData(); - ~QScriptQObjectData(); - - bool addSignalHandler(QObject *sender, - int signalIndex, - const QScriptValueImpl &receiver, - const QScriptValueImpl &slot, - const QScriptValueImpl &senderWrapper = QScriptValueImpl()); - bool removeSignalHandler(QObject *sender, - int signalIndex, - const QScriptValueImpl &receiver, - const QScriptValueImpl &slot); - - bool findWrapper(QScriptEngine::ValueOwnership ownership, - const QScriptEngine::QObjectWrapOptions &options, - QScriptValueImpl *out); - void registerWrapper(const QScriptValueImpl &wrapper, - QScriptEngine::ValueOwnership ownership, - const QScriptEngine::QObjectWrapOptions &options); - - void mark(int generation); - -private: - QScript::QObjectConnectionManager *m_connectionManager; - QList<QScriptQObjectWrapperInfo> wrappers; -}; - -class QScriptMetaType -{ -public: - enum Kind { - Invalid, - Variant, - MetaType, - Unresolved, - MetaEnum - }; - - inline QScriptMetaType() - : m_kind(Invalid), m_typeId(0) { } - - inline Kind kind() const - { return m_kind; } - - int typeId() const; - - inline bool isValid() const - { return (m_kind != Invalid); } - - inline bool isVariant() const - { return (m_kind == Variant); } - - inline bool isMetaType() const - { return (m_kind == MetaType); } - - inline bool isUnresolved() const - { return (m_kind == Unresolved); } - - inline bool isMetaEnum() const - { return (m_kind == MetaEnum); } - - QByteArray name() const; - - inline int enumeratorIndex() const - { Q_ASSERT(isMetaEnum()); return m_typeId; } - - inline bool operator==(const QScriptMetaType &other) const - { - return (m_kind == other.m_kind) && (m_typeId == other.m_typeId); - } - - static inline QScriptMetaType variant() - { return QScriptMetaType(Variant); } - - static inline QScriptMetaType metaType(int typeId, const QByteArray &name) - { return QScriptMetaType(MetaType, typeId, name); } - - static inline QScriptMetaType metaEnum(int enumIndex, const QByteArray &name) - { return QScriptMetaType(MetaEnum, enumIndex, name); } - - static inline QScriptMetaType unresolved(const QByteArray &name) - { return QScriptMetaType(Unresolved, /*typeId=*/0, name); } - -private: - inline QScriptMetaType(Kind kind, int typeId = 0, const QByteArray &name = QByteArray()) - : m_kind(kind), m_typeId(typeId), m_name(name) { } - - Kind m_kind; - int m_typeId; - QByteArray m_name; -}; - -class QScriptMetaMethod -{ -public: - inline QScriptMetaMethod() - : m_firstUnresolvedIndex(-1) - { } - inline QScriptMetaMethod(const QByteArray &name, const QVector<QScriptMetaType> &types) - : m_name(name), m_types(types), m_firstUnresolvedIndex(-1) - { - QVector<QScriptMetaType>::const_iterator it; - for (it = m_types.constBegin(); it != m_types.constEnd(); ++it) { - if ((*it).kind() == QScriptMetaType::Unresolved) { - m_firstUnresolvedIndex = it - m_types.constBegin(); - break; - } - } - } - inline bool isValid() const - { return !m_types.isEmpty(); } - - QByteArray name() const - { return m_name; } - - inline QScriptMetaType returnType() const - { return m_types.at(0); } - - inline int argumentCount() const - { return m_types.count() - 1; } - - inline QScriptMetaType argumentType(int arg) const - { return m_types.at(arg + 1); } - - inline bool fullyResolved() const - { return m_firstUnresolvedIndex == -1; } - - inline bool hasUnresolvedReturnType() const - { return (m_firstUnresolvedIndex == 0); } - - inline int firstUnresolvedIndex() const - { return m_firstUnresolvedIndex; } - - inline int count() const - { return m_types.count(); } - - inline QScriptMetaType type(int index) const - { return m_types.at(index); } - - inline QVector<QScriptMetaType> types() const - { return m_types; } - -private: - QByteArray m_name; - QVector<QScriptMetaType> m_types; - int m_firstUnresolvedIndex; -}; - -struct QScriptMetaArguments -{ - int matchDistance; - int index; - QScriptMetaMethod method; - QVarLengthArray<QVariant, 9> args; - - inline QScriptMetaArguments(int dist, int idx, const QScriptMetaMethod &mtd, - const QVarLengthArray<QVariant, 9> &as) - : matchDistance(dist), index(idx), method(mtd), args(as) { } - inline QScriptMetaArguments() - : matchDistance(0), index(-1) { } - - inline bool isValid() const - { return (index != -1); } -}; - -class QScriptMetaObject -{ -public: - inline QScriptMetaMethod findMethod(int index) const - { - return m_methods.value(index); - } - - inline void registerMethod(int index, const QScriptMetaMethod &method) - { - m_methods.insert(index, method); - } - - inline bool findMember(QScriptNameIdImpl *nameId, QScript::Member *member) const - { - QHash<QScriptNameIdImpl*, QScript::Member>::const_iterator it; - it = m_members.constFind(nameId); - if (it == m_members.constEnd()) - return false; - *member = it.value(); - return true; - } - - inline void registerMember(QScriptNameIdImpl *nameId, const QScript::Member &member) - { - m_members.insert(nameId, member); - } - - inline QList<QScriptNameIdImpl*> registeredMemberNames() const - { - return m_members.keys(); - } - - inline QScriptValueImpl findPropertyAccessor(int index) const - { - return m_propertyAccessors.value(index); - } - - inline void registerPropertyAccessor(int index, const QScriptValueImpl &accessor) - { - m_propertyAccessors.insert(index, accessor); - } - - inline QList<QScriptValueImpl> registeredPropertyAccessors() const - { - return m_propertyAccessors.values(); - } - - inline int methodLowerBound(int index) const - { - return m_methodBounds.value(index, 0); - } - - inline void setMethodLowerBound(int index, int bound) - { - m_methodBounds.insert(index, bound); - } - -private: - QHash<int, QScriptValueImpl> m_propertyAccessors; - QHash<int, QScriptMetaMethod> m_methods; - QHash<int, int> m_methodBounds; - QHash<QScriptNameIdImpl*, QScript::Member> m_members; -}; - -#endif // QT_NO_QOBJECT - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT -#endif // QSCRIPTEXTQOBJECT_P_H diff --git a/src/script/qscriptextvariant.cpp b/src/script/qscriptextvariant.cpp deleted file mode 100644 index 33c5edd..0000000 --- a/src/script/qscriptextvariant.cpp +++ /dev/null @@ -1,169 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qscriptextvariant_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" - -#include <QtCore/QtDebug> - -#include <QtCore/QStringList> - -#include <limits.h> - -QT_BEGIN_NAMESPACE - -namespace QScript { namespace Ext { - -Variant::Variant(QScriptEnginePrivate *eng): - Ecma::Core(eng, QLatin1String("QVariant"), QScriptClassInfo::VariantType) -{ - newVariant(&publicPrototype, QVariant()); - - eng->newConstructor(&ctor, this, publicPrototype); - - addPrototypeFunction(QLatin1String("toString"), method_toString, 0); - addPrototypeFunction(QLatin1String("valueOf"), method_valueOf, 0); -} - -Variant::~Variant() -{ -} - -Variant::Instance *Variant::Instance::get(const QScriptValueImpl &object, QScriptClassInfo *klass) -{ - if (! klass || klass == object.classInfo()) - return static_cast<Instance*> (object.objectData()); - - return 0; -} - -void Variant::execute(QScriptContextPrivate *context) -{ - QScriptValueImpl tmp; - newVariant(&tmp, QVariant()); - context->setReturnValue(tmp); -} - -void Variant::newVariant(QScriptValueImpl *result, const QVariant &value) -{ - Instance *instance; - if (!result->isValid()) { - engine()->newObject(result, publicPrototype, classInfo()); - instance = new Instance(); - result->setObjectData(instance); - } else { - Q_ASSERT(result->isObject()); - if (result->classInfo() != classInfo()) { - result->destroyObjectData(); - result->setClassInfo(classInfo()); - instance = new Instance(); - result->setObjectData(instance); - } else { - instance = Instance::get(*result, classInfo()); - } - } - instance->value = value; -} - -QScriptValueImpl Variant::method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - if (Instance *instance = Instance::get(context->thisObject(), classInfo)) { - QString result; - QScriptValueImpl value = method_valueOf(context, eng, classInfo); - if (value.isObject()) { - result = instance->value.toString(); - if (result.isEmpty()) { - result = QString::fromLatin1("QVariant(%0)") - .arg(QLatin1String(instance->value.typeName())); - } - } else { - result = value.toString(); - } - return QScriptValueImpl(eng, result); - } - return context->throwError(QScriptContext::TypeError, - QLatin1String("QVariant.prototype.toString")); -} - -QScriptValueImpl Variant::method_valueOf(QScriptContextPrivate *context, QScriptEnginePrivate *eng, QScriptClassInfo *classInfo) -{ - if (Instance *instance = Instance::get(context->thisObject(), classInfo)) { - QVariant v = instance->value; - switch (v.type ()) { - case QVariant::Invalid: - return eng->undefinedValue(); - case QVariant::String: - return (QScriptValueImpl(eng, v.toString())); - - case QVariant::Int: - return (QScriptValueImpl(v.toInt())); - - case QVariant::Bool: - return (QScriptValueImpl(v.toBool())); - - case QVariant::Double: - return (QScriptValueImpl(v.toDouble())); // ### hmmm - - case QVariant::Char: - return (QScriptValueImpl(v.toChar().unicode())); - - case QVariant::UInt: - return (QScriptValueImpl(v.toUInt())); - - default: - return context->thisObject(); - } // switch - } - return context->thisObject(); -} - -} } // namespace QScript::Ecma - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT diff --git a/src/script/qscriptextvariant_p.h b/src/script/qscriptextvariant_p.h deleted file mode 100644 index cac17e5..0000000 --- a/src/script/qscriptextvariant_p.h +++ /dev/null @@ -1,106 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTEXTVARIANT_P_H -#define QSCRIPTEXTVARIANT_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 <QtCore/QVariant> - -#include "qscriptecmacore_p.h" - -QT_BEGIN_NAMESPACE - -#ifndef QT_NO_SCRIPT - -namespace QScript { namespace Ext { - -class Instance; - -class Variant: public Ecma::Core -{ -public: - Variant(QScriptEnginePrivate *engine); - virtual ~Variant(); - - virtual void execute(QScriptContextPrivate *context); - - class Instance: public QScriptObjectData { - public: - Instance() {} - virtual ~Instance() {} - - static Instance *get(const QScriptValueImpl &object, - QScriptClassInfo *klass); - - public: - QVariant value; - }; - - inline Instance *get(const QScriptValueImpl &object) const - { return Instance::get(object, classInfo()); } - - void newVariant(QScriptValueImpl *result, const QVariant &value); - -protected: - static QScriptValueImpl method_toString(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); - static QScriptValueImpl method_valueOf(QScriptContextPrivate *context, QScriptEnginePrivate *eng, - QScriptClassInfo *classInfo); -}; - -} } // namespace QScript::Ext - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif // QSCRIPTEXTVARIANT_P_H diff --git a/src/script/qscriptfunction.cpp b/src/script/qscriptfunction.cpp deleted file mode 100644 index 55d5e61..0000000 --- a/src/script/qscriptfunction.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qscriptfunction_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" - -QT_BEGIN_NAMESPACE - -QScriptFunction::~QScriptFunction() -{ -} - -QString QScriptFunction::toString(QScriptContextPrivate *) const -{ - QString result; - result += QLatin1String("function () { [native] }"); - return result; -} - -QString QScriptFunction::fileName() const -{ - return QString(); -} - -QString QScriptFunction::functionName() const -{ - return QString(); -} - -int QScriptFunction::startLineNumber() const -{ - return -1; -} - -int QScriptFunction::endLineNumber() const -{ - return -1; -} - -void QScriptFunction::mark(QScriptEnginePrivate *engine, int generation) -{ - for (int i = 0; i < formals.count(); ++i) - engine->markString(formals.at(i), generation); -} - -// public API function -void QScript::CFunction::execute(QScriptContextPrivate *context) -{ - QScriptEnginePrivate *eng_p = context->engine(); - - context->m_result = eng_p->undefinedValue(); - -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - eng_p->notifyFunctionEntry(context); -#endif - - QScriptContext *publicContext = QScriptContextPrivate::get(eng_p->currentContext()); - QScriptEngine *publicEngine = QScriptEnginePrivate::get(eng_p); - QScriptValueImpl result = eng_p->toImpl((*m_funPtr)(publicContext, publicEngine)); - if (result.isValid() && !eng_p->shouldAbort() - && (context->state() == QScriptContext::NormalState)) { - context->m_result = result; - } - -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - eng_p->notifyFunctionExit(context); -#endif -} - -QString QScript::CFunction::functionName() const -{ - return QString(); -} - -// internal API function -void QScript::C2Function::execute(QScriptContextPrivate *context) -{ - QScriptEnginePrivate *eng_p = context->engine(); - - bool blocked = eng_p->blockGC(true); - -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - eng_p->notifyFunctionEntry(context); -#endif - - context->m_result = (*m_funPtr)(context, eng_p, m_classInfo); - Q_ASSERT(context->m_result.isValid()); - -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - eng_p->notifyFunctionExit(context); -#endif - - eng_p->blockGC(blocked); -} - -QString QScript::C2Function::functionName() const -{ - if (!m_name.isEmpty()) - return m_name; - return QString(); -} - -void QScript::C3Function::execute(QScriptContextPrivate *context) -{ - QScriptEnginePrivate *eng_p = context->engine(); - - context->m_result = eng_p->undefinedValue(); - -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - eng_p->notifyFunctionEntry(context); -#endif - - QScriptContext *publicContext = QScriptContextPrivate::get(eng_p->currentContext()); - QScriptEngine *publicEngine = QScriptEnginePrivate::get(eng_p); - QScriptValueImpl result = eng_p->toImpl((*m_funPtr)(publicContext, publicEngine, m_arg)); - if (result.isValid() && !eng_p->shouldAbort()) - context->m_result = result; - -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - eng_p->notifyFunctionExit(context); -#endif -} - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT diff --git a/src/script/qscriptfunction_p.h b/src/script/qscriptfunction_p.h deleted file mode 100644 index ec79f32..0000000 --- a/src/script/qscriptfunction_p.h +++ /dev/null @@ -1,219 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTFUNCTION_P_H -#define QSCRIPTFUNCTION_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 "qscriptobjectdata_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptglobals_p.h" -#include "qscriptnodepool_p.h" - -#include <QtCore/QList> - -#ifndef QT_NO_QOBJECT -# include <QtCore/QPointer> -# include <QtCore/QMetaMethod> -#endif - -QT_BEGIN_NAMESPACE - -class QScriptContext; -class QScriptContextPrivate; -class QScriptNameIdImpl; - -class QScriptFunction: public QScriptObjectData -{ -public: - enum Type { - Unknown, - Script, - C, - C2, - C3, - Qt, - QtProperty - }; - - QScriptFunction(int len = 0) - : length(len) - { } - virtual ~QScriptFunction(); - - virtual void execute(QScriptContextPrivate *context) = 0; - virtual QString toString(QScriptContextPrivate *context) const; - - virtual Type type() const { return Unknown; } - - // name of the file the function is defined in - virtual QString fileName() const; - - virtual QString functionName() const; - - virtual int startLineNumber() const; - - virtual int endLineNumber() const; - - virtual void mark(QScriptEnginePrivate *engine, int generation); - -public: // ### private - int length; - QList<QScriptNameIdImpl*> formals; -}; - -namespace QScript { - -// public API function -class CFunction: public QScriptFunction -{ -public: - CFunction(QScriptFunctionSignature funPtr, int length) - : QScriptFunction(length), m_funPtr(funPtr) - { } - - virtual ~CFunction() { } - - virtual void execute(QScriptContextPrivate *context); - - virtual Type type() const { return QScriptFunction::C; } - - virtual QString functionName() const; - -private: - QScriptFunctionSignature m_funPtr; -}; - -// internal API function -class C2Function: public QScriptFunction -{ -public: - C2Function(QScriptInternalFunctionSignature funPtr, int length, - QScriptClassInfo *classInfo, const QString &name) - : QScriptFunction(length), m_funPtr(funPtr), - m_classInfo(classInfo), m_name(name) - { } - - virtual ~C2Function() {} - - virtual void execute(QScriptContextPrivate *context); - - virtual Type type() const { return QScriptFunction::C2; } - - virtual QString functionName() const; - -private: - QScriptInternalFunctionSignature m_funPtr; - QScriptClassInfo *m_classInfo; - QString m_name; -}; - -class C3Function: public QScriptFunction -{ -public: - C3Function(QScriptFunctionWithArgSignature funPtr, void *arg, int length) - : QScriptFunction(length), m_funPtr(funPtr), m_arg(arg) - { } - - virtual ~C3Function() { } - - virtual void execute(QScriptContextPrivate *context); - - virtual Type type() const { return QScriptFunction::C3; } - -private: - QScriptFunctionWithArgSignature m_funPtr; - void *m_arg; -}; - -namespace AST { - class FunctionExpression; -} - -// implemented in qscriptcontext_p.cpp -class ScriptFunction: public QScriptFunction -{ -public: - ScriptFunction(AST::FunctionExpression *definition, NodePool *astPool): - m_definition(definition), m_astPool(astPool), m_compiledCode(0) {} - - virtual ~ScriptFunction() {} - - virtual void execute(QScriptContextPrivate *context); - - virtual QString toString(QScriptContextPrivate *context) const; - - virtual Type type() const - { return QScriptFunction::Script; } - - virtual QString fileName() const; - - virtual QString functionName() const; - - virtual int startLineNumber() const; - - virtual int endLineNumber() const; - -private: - AST::FunctionExpression *m_definition; - QExplicitlySharedDataPointer<NodePool> m_astPool; - Code *m_compiledCode; -}; - -} // namespace QScript - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif // QSCRIPTFUNCTION_P_H diff --git a/src/script/qscriptgc_p.h b/src/script/qscriptgc_p.h deleted file mode 100644 index 6ded5bd..0000000 --- a/src/script/qscriptgc_p.h +++ /dev/null @@ -1,317 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTGC_P_H -#define QSCRIPTGC_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 <QtCore/qglobal.h> - -#ifndef QT_NO_SCRIPT - -#include <QtCore/QtDebug> -#include <new> - -#include "qscriptmemorypool_p.h" - -QT_BEGIN_NAMESPACE - -namespace QScript { - -class GCBlock -{ -public: - GCBlock *next; - - union { - int generation; - uint flags; - }; - -public: - inline GCBlock(GCBlock *n): - next(n), flags(0) {} - - inline void *data() - { return reinterpret_cast<char *>(this) + sizeof(GCBlock); } - - inline static GCBlock *get(void *ptr) - { - char *where = reinterpret_cast<char *>(ptr); - return reinterpret_cast<GCBlock *>(where - sizeof(GCBlock)); - } -}; - -template <typename _Tp> -class GCAlloc -{ -private: - int m_new_allocated_blocks; - int m_free_blocks; - int m_new_allocated_extra_bytes; - GCBlock *m_head; - GCBlock *m_current; - GCBlock *m_free; - bool m_blocked_gc; - bool m_force_gc; - bool m_sweeping; - MemoryPool pool; - _Tp trivial; - -public: - enum { MaxNumberOfBlocks = 1 << 14 }; - enum { MaxNumberOfExtraBytes = 0x800000 }; - -public: - inline GCAlloc(): - m_new_allocated_blocks(0), - m_free_blocks(0), - m_new_allocated_extra_bytes(0), - m_head(0), - m_current(0), - m_free(0), - m_blocked_gc(false), - m_force_gc(false), - m_sweeping(false) { - trivial.reset(); - } - - inline ~GCAlloc() { - } - - inline void destruct() { - m_sweeping = true; - GCBlock *blk = m_free; - - if (! blk) { - blk = m_head; - m_head = 0; - } - - while (blk) { - GCBlock *was = blk; - blk = blk->next; - - Q_ASSERT(was->data()); - _Tp *data = reinterpret_cast<_Tp*>(was->data()); - data->~_Tp(); - blk->~GCBlock(); - - if (! blk && m_head) { - blk = m_head; - m_head = 0; - } - } - m_sweeping = false; - } - - inline int newAllocatedBlocks() const { return m_new_allocated_blocks; } - inline int freeBlocks() const { return m_free_blocks; } - - inline _Tp *operator()(int generation) - { - GCBlock *previous = m_current; - void *where = 0; - - if (! m_free) { - Q_ASSERT (m_free_blocks == 0); - where = pool.allocate(sizeof(GCBlock) + sizeof(_Tp)); - ++m_new_allocated_blocks; - (void) new (reinterpret_cast<char*>(where) + sizeof(GCBlock)) _Tp(); - } else { - --m_free_blocks; - where = m_free; - m_free = m_free->next; - - if (! m_free) - m_force_gc = true; - } - - m_current = new (where) GCBlock(0); - - if (! previous) { - Q_ASSERT(! m_head); - m_head = m_current; - } else { - previous->next = m_current; - } - m_current->generation = generation; - - return reinterpret_cast<_Tp*> (m_current->data()); - } - - inline bool blocked() const - { - return m_blocked_gc; - } - - inline bool sweeping() const - { - return m_sweeping; - } - - inline bool blockGC(bool block) - { - bool was = m_blocked_gc; - m_blocked_gc = block; - return was; - } - - inline void requestGC() - { - m_force_gc = true; - } - - inline void adjustBytesAllocated(int bytes) - { m_new_allocated_extra_bytes += bytes; } - - inline bool poll() - { - if (m_blocked_gc || ! m_head) - return false; - - else if (m_force_gc) { - m_force_gc = false; - return true; - } - - else if (m_free && ! m_free->next) - return true; - - return (m_new_allocated_blocks >= MaxNumberOfBlocks) - || ((m_new_allocated_extra_bytes >= MaxNumberOfExtraBytes) - && (m_new_allocated_blocks > 0)); - } - - inline int generation(_Tp *ptr) const - { return GCBlock::get(ptr)->generation; } - - inline GCBlock *head() const - { return m_head; } - - void sweep(int generation) - { - m_sweeping = true; - GCBlock *blk = m_head; - m_current = 0; - - m_new_allocated_blocks = 0; - m_new_allocated_extra_bytes = 0; - - while (blk != 0) { - if (blk->generation != generation) { - if (m_current) - m_current->next = blk->next; - - GCBlock *tmp = blk; - blk = blk->next; // advance the pointer - - tmp->next = m_free; // prepend the node to the free list... - m_free = tmp; - ++m_free_blocks; - - if (m_free == m_head) - m_head = blk; - - _Tp *data = reinterpret_cast<_Tp *>(tmp->data()); - data->finalize(); - tmp->~GCBlock(); - } else { - m_current = blk; - blk = blk->next; - } - } - - if (! m_current) - m_head = m_current; - m_sweeping = false; - } - - class const_iterator - { - public: - typedef _Tp value_type; - typedef const _Tp *pointer; - typedef const _Tp &reference; - inline const_iterator() : i(0) { } - inline const_iterator(GCBlock *block) : i(block) { } - inline const_iterator(const const_iterator &o) - { i = reinterpret_cast<const const_iterator &>(o).i; } - - inline const _Tp *data() const { return reinterpret_cast<_Tp*>(i->data()); } - inline const _Tp &value() const { return *reinterpret_cast<_Tp*>(i->data()); } - inline const _Tp &operator*() const { return *reinterpret_cast<_Tp*>(i->data()); } - inline const _Tp *operator->() const { return reinterpret_cast<_Tp*>(i->data()); } - inline bool operator==(const const_iterator &o) const { return i == o.i; } - inline bool operator!=(const const_iterator &o) const { return i != o.i; } - - inline const_iterator &operator++() { - i = i->next; - return *this; - } - private: - GCBlock *i; - }; - friend class const_iterator; - - inline const_iterator constBegin() const { return const_iterator(m_head); } - inline const_iterator constEnd() const { return const_iterator(0); } - -private: - Q_DISABLE_COPY(GCAlloc) -}; - -} // namespace QScript - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT -#endif // QSCRIPT_GC_H diff --git a/src/script/qscriptglobals_p.h b/src/script/qscriptglobals_p.h deleted file mode 100644 index c4bec42..0000000 --- a/src/script/qscriptglobals_p.h +++ /dev/null @@ -1,104 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTGLOBALS_P_H -#define QSCRIPTGLOBALS_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 <QtCore/qglobal.h> - -#ifndef QT_NO_SCRIPT - -QT_BEGIN_NAMESPACE - -class QScriptValue; -class QScriptValueImpl; -class QScriptClassInfo; -class QScriptEngine; -class QScriptEnginePrivate; -class QScriptContext; -class QScriptContextPrivate; - -typedef QScriptValueImpl (*QScriptInternalFunctionSignature)(QScriptContextPrivate *, QScriptEnginePrivate *, QScriptClassInfo *); -typedef QScriptValue (*QScriptFunctionSignature)(QScriptContext *, QScriptEngine *); -typedef QScriptValue (*QScriptFunctionWithArgSignature)(QScriptContext *, QScriptEngine *, void *); - -namespace QScript { - -enum Type { - InvalidType, - // standard types - UndefinedType, - NullType, - BooleanType, - StringType, - NumberType, - ObjectType, - // internal types - IntegerType, - ReferenceType, - PointerType, - LazyStringType -}; - -enum AccessMode { - Read = 0x01, - Write = 0x02, - ReadWrite = 0x03 -}; - -} // namespace QScript - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif // QSCRIPTGLOBALS_P_H diff --git a/src/script/qscriptmember_p.h b/src/script/qscriptmember_p.h deleted file mode 100644 index ac98432..0000000 --- a/src/script/qscriptmember_p.h +++ /dev/null @@ -1,191 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTMEMBER_P_H -#define QSCRIPTMEMBER_P_H - -#include "qscriptmemberfwd_p.h" - -#ifndef QT_NO_SCRIPT - -QT_BEGIN_NAMESPACE - -// -// 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. -// - -inline void QScript::Member::resetFlags(uint flags) -{ - m_flags = flags; -} - -inline void QScript::Member::setFlags(uint flags) -{ - m_flags |= flags; -} - -inline void QScript::Member::unsetFlags(uint flags) -{ - m_flags &= ~flags; -} - -inline uint QScript::Member::flags() const -{ - return m_flags; -} - -inline bool QScript::Member::testFlags(uint mask) const -{ - return m_flags & mask; -} - -inline bool QScript::Member::isValid() const -{ - return m_flags & 0x00000300; -} - -inline bool QScript::Member::isWritable() const -{ - return !(m_flags & QScriptValue::ReadOnly); -} - -inline bool QScript::Member::isDeletable() const -{ - return !(m_flags & QScriptValue::Undeletable); -} - -inline bool QScript::Member::dontEnum() const -{ - return m_flags & QScriptValue::SkipInEnumeration; -} - -inline bool QScript::Member::isObjectProperty() const -{ - return m_flags & ObjectProperty; -} - -inline bool QScript::Member::isNativeProperty() const -{ - return m_flags & NativeProperty; -} - -inline bool QScript::Member::isUninitializedConst() const -{ - return m_flags & UninitializedConst; -} - -inline bool QScript::Member::isGetter() const -{ - return m_flags & QScriptValue::PropertyGetter; -} - -inline bool QScript::Member::isSetter() const -{ - return m_flags & QScriptValue::PropertySetter; -} - -inline bool QScript::Member::isGetterOrSetter() const -{ - return m_flags & (QScriptValue::PropertyGetter | QScriptValue::PropertySetter); -} - -inline int QScript::Member::id() const -{ - return m_id; -} - -inline QScriptNameIdImpl *QScript::Member::nameId() const -{ - return m_nameId; -} - -inline QScript::Member QScript::Member::invalid() -{ - Member m; - m.m_flags = 0; - return m; -} - -inline void QScript::Member::invalidate() -{ - m_flags = 0; -} - -inline void QScript::Member::native(QScriptNameIdImpl *nameId, int id, uint flags) -{ - Q_ASSERT(! (flags & ObjectProperty)); - - m_nameId = nameId; - m_id = id; - m_flags = flags | NativeProperty; -} - -inline void QScript::Member::object(QScriptNameIdImpl *nameId, int id, uint flags) -{ - Q_ASSERT(! (flags & NativeProperty)); - - m_nameId = nameId; - m_id = id; - m_flags = flags | ObjectProperty; -} - -inline bool QScript::Member::operator==(const QScript::Member &other) const -{ - return m_nameId == other.m_nameId; -} - -inline bool QScript::Member::operator!=(const QScript::Member &other) const -{ - return m_nameId != other.m_nameId; -} - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptmemberfwd_p.h b/src/script/qscriptmemberfwd_p.h deleted file mode 100644 index 023815a..0000000 --- a/src/script/qscriptmemberfwd_p.h +++ /dev/null @@ -1,126 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTMEMBERFWD_P_H -#define QSCRIPTMEMBERFWD_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 <QtCore/qglobal.h> - -QT_BEGIN_NAMESPACE - -#ifndef QT_NO_SCRIPT - -class QScriptNameIdImpl; - -namespace QScript { - - class Member - { - public: - enum PropertyFlag { - ObjectProperty = 0x00000100, // Stored in the member table - NativeProperty = 0x00000200, - - UninitializedConst = 0x00000800, // NB: shared with QScriptValue::KeepExistingFlags - - InternalRange = 0x0000ff00 // Not user-accessible (read as 0, don't change on write) - }; - - inline Member() : m_nameId(0), m_id(0), m_flags(0) {} - - inline void resetFlags(uint flags); - inline void setFlags(uint flags); - inline void unsetFlags(uint flags); - inline uint flags() const; - inline bool testFlags(uint mask) const; - - inline bool isValid() const; - - inline bool isWritable() const; - inline bool isDeletable() const; - - inline bool dontEnum() const; - - inline bool isObjectProperty() const; - inline bool isNativeProperty() const; - - inline bool isUninitializedConst() const; - - inline bool isGetter() const; - inline bool isSetter() const; - inline bool isGetterOrSetter() const; - - inline int id() const; - inline QScriptNameIdImpl *nameId() const; - - inline bool operator==(const Member &other) const; - inline bool operator!=(const Member &other) const; - - inline static Member invalid(); - inline void invalidate(); - - inline void native(QScriptNameIdImpl *nameId, int id, uint flags); - inline void object(QScriptNameIdImpl *nameId, int id, uint flags); - - private: - QScriptNameIdImpl *m_nameId; - int m_id; - uint m_flags; - }; - -} // namespace QScript - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptmemorypool_p.h b/src/script/qscriptmemorypool_p.h deleted file mode 100644 index 2f069ec..0000000 --- a/src/script/qscriptmemorypool_p.h +++ /dev/null @@ -1,130 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTMEMORYPOOL_P_H -#define QSCRIPTMEMORYPOOL_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 <QtCore/qglobal.h> -#include <QtCore/qshareddata.h> -#include <string.h> - -QT_BEGIN_NAMESPACE - -namespace QScript { - -class MemoryPool : public QSharedData -{ -public: - enum { maxBlockCount = -1 }; - enum { defaultBlockSize = 1 << 12 }; - - MemoryPool() { - m_blockIndex = maxBlockCount; - m_currentIndex = 0; - m_storage = 0; - m_currentBlock = 0; - m_currentBlockSize = 0; - } - - virtual ~MemoryPool() { - for (int index = 0; index < m_blockIndex + 1; ++index) - qFree(m_storage[index]); - - qFree(m_storage); - } - - char *allocate(int bytes) { - bytes += (8 - bytes) & 7; // ensure multiple of 8 bytes (maintain alignment) - if (m_currentBlock == 0 || m_currentBlockSize < m_currentIndex + bytes) { - ++m_blockIndex; - m_currentBlockSize = defaultBlockSize << m_blockIndex; - - m_storage = reinterpret_cast<char**>(qRealloc(m_storage, sizeof(char*) * (1 + m_blockIndex))); - m_currentBlock = m_storage[m_blockIndex] = reinterpret_cast<char*>(qMalloc(m_currentBlockSize)); - ::memset(m_currentBlock, 0, m_currentBlockSize); - - m_currentIndex = (8 - quintptr(m_currentBlock)) & 7; // ensure first chunk is 64-bit aligned - Q_ASSERT(m_currentIndex + bytes <= m_currentBlockSize); - } - - char *p = reinterpret_cast<char *> - (m_currentBlock + m_currentIndex); - - m_currentIndex += bytes; - - return p; - } - - int bytesAllocated() const { - int bytes = 0; - for (int index = 0; index < m_blockIndex; ++index) - bytes += (defaultBlockSize << index); - bytes += m_currentIndex; - return bytes; - } - -private: - int m_blockIndex; - int m_currentIndex; - char *m_currentBlock; - int m_currentBlockSize; - char **m_storage; - -private: - Q_DISABLE_COPY(MemoryPool) -}; - -} // namespace QScript - -QT_END_NAMESPACE - -#endif diff --git a/src/script/qscriptnameid_p.h b/src/script/qscriptnameid_p.h deleted file mode 100644 index c0d8f6b..0000000 --- a/src/script/qscriptnameid_p.h +++ /dev/null @@ -1,77 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTNAMEID_P_H -#define QSCRIPTNAMEID_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 <QtCore/qglobal.h> - -QT_BEGIN_NAMESPACE - -class QScriptNameIdImpl -{ -public: - QString s; - uint h; - QScriptNameIdImpl *next; - uint used: 1; - uint persistent: 1; - uint unique: 1; - uint pad: 29; - - inline QScriptNameIdImpl(const QString &_s): - s(_s), h(0), next(0), used(0), persistent(0), unique(0), pad(0) { } -}; - -QT_END_NAMESPACE - -#endif // QSCRIPTNAMEID_P_H diff --git a/src/script/qscriptnodepool_p.h b/src/script/qscriptnodepool_p.h deleted file mode 100644 index 5e1876c..0000000 --- a/src/script/qscriptnodepool_p.h +++ /dev/null @@ -1,139 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTNODEPOOL_P_H -#define QSCRIPTNODEPOOL_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 <QtCore/QHash> -#include <QtCore/QString> - -#include "qscriptmemorypool_p.h" - -QT_BEGIN_NAMESPACE - -class QScriptEnginePrivate; - -namespace QScript { - -namespace AST { -class Node; -} // namespace AST - -class Code; -class CompilationUnit; - -template <typename NodeType> -inline NodeType *makeAstNode(MemoryPool *storage) -{ - NodeType *node = new (storage->allocate(sizeof(NodeType))) NodeType(); - return node; -} - -template <typename NodeType, typename Arg1> -inline NodeType *makeAstNode(MemoryPool *storage, Arg1 arg1) -{ - NodeType *node = new (storage->allocate(sizeof(NodeType))) NodeType(arg1); - return node; -} - -template <typename NodeType, typename Arg1, typename Arg2> -inline NodeType *makeAstNode(MemoryPool *storage, Arg1 arg1, Arg2 arg2) -{ - NodeType *node = new (storage->allocate(sizeof(NodeType))) NodeType(arg1, arg2); - return node; -} - -template <typename NodeType, typename Arg1, typename Arg2, typename Arg3> -inline NodeType *makeAstNode(MemoryPool *storage, Arg1 arg1, Arg2 arg2, Arg3 arg3) -{ - NodeType *node = new (storage->allocate(sizeof(NodeType))) NodeType(arg1, arg2, arg3); - return node; -} - -template <typename NodeType, typename Arg1, typename Arg2, typename Arg3, typename Arg4> -inline NodeType *makeAstNode(MemoryPool *storage, Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4) -{ - NodeType *node = new (storage->allocate(sizeof(NodeType))) NodeType(arg1, arg2, arg3, arg4); - return node; -} - -class NodePool : public MemoryPool -{ -public: - NodePool(const QString &fileName, QScriptEnginePrivate *engine); - virtual ~NodePool(); - - Code *createCompiledCode(AST::Node *node, CompilationUnit &compilation); - - inline QString fileName() const { return m_fileName; } - inline QScriptEnginePrivate *engine() const { return m_engine; } -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - inline qint64 id() const { return m_id; } -#endif - -private: - QHash<AST::Node*, Code*> m_codeCache; - QString m_fileName; - QScriptEnginePrivate *m_engine; -#ifndef Q_SCRIPT_NO_EVENT_NOTIFY - qint64 m_id; -#endif - -private: - Q_DISABLE_COPY(NodePool) -}; - -} // namespace QScript - -QT_END_NAMESPACE - -#endif diff --git a/src/script/qscriptobject_p.h b/src/script/qscriptobject_p.h deleted file mode 100644 index 1ac3c65..0000000 --- a/src/script/qscriptobject_p.h +++ /dev/null @@ -1,188 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTOBJECT_P_H -#define QSCRIPTOBJECT_P_H - -#include "qscriptobjectfwd_p.h" - -#ifndef QT_NO_SCRIPT - -QT_BEGIN_NAMESPACE - -// -// 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. -// - -inline bool QScriptObject::findMember(QScriptNameIdImpl *nameId, - QScript::Member *m) const -{ - const QScript::Member *members = m_members.constData(); - const int size = m_members.size(); - - const QScript::Member *first = &members[-1]; - const QScript::Member *last = &members[size - 1]; - - for (const QScript::Member *it = last; it != first; --it) { - if (it->nameId() == nameId && it->isValid()) { - *m = *it; - return true; - } - } - - return false; -} - -// assumes that m already points to the setter -inline bool QScriptObject::findGetter(QScript::Member *m) const -{ - const QScript::Member *members = m_members.constData(); - const QScript::Member *first = &members[-1]; - const QScript::Member *last = &members[m->id() - 1]; - - for (const QScript::Member *it = last; it != first; --it) { - if (it->nameId() == m->nameId() && it->isValid() && it->isGetter()) { - *m = *it; - return true; - } - } - - return false; -} - -// assumes that m already points to the getter -inline bool QScriptObject::findSetter(QScript::Member *m) const -{ - const QScript::Member *members = m_members.constData(); - const QScript::Member *first = &members[-1]; - const QScript::Member *last = &members[m->id() - 1]; - - for (const QScript::Member *it = last; it != first; --it) { - if (it->nameId() == m->nameId() && it->isValid() && it->isSetter()) { - *m = *it; - return true; - } - } - - return false; -} - -inline int QScriptObject::memberCount() const -{ - return m_members.size(); -} - -inline void QScriptObject::createMember(QScriptNameIdImpl *nameId, - QScript::Member *member, uint flags) -{ - member->object(nameId, m_values.size(), flags); - m_members.append(*member); - m_values.append(QScriptValueImpl()); -} - -inline void QScriptObject::member(int index, QScript::Member *member) -{ - *member = m_members[index]; -} - -inline void QScriptObject::put(const QScript::Member &m, const QScriptValueImpl &v) -{ - m_values[m.id()] = v; -} - -inline QScriptValueImpl &QScriptObject::reference(const QScript::Member &m) -{ - return m_values[m.id()]; -} - -inline void QScriptObject::get(const QScript::Member &m, QScriptValueImpl *v) -{ - Q_ASSERT(m.isObjectProperty()); - *v = m_values[m.id()]; -} - -inline void QScriptObject::removeMember(const QScript::Member &member) -{ - m_members[member.id()].invalidate(); - m_values[member.id()].invalidate(); -} - -inline QScriptObject::~QScriptObject() -{ - finalize(); -} - -inline void QScriptObject::finalize() -{ - finalizeData(); -} - -inline void QScriptObject::finalizeData() -{ - if (m_data) { - m_data->finalize(m_class->engine()); - delete m_data; - m_data = 0; - } -} - -inline void QScriptObject::reset() -{ - m_prototype.invalidate(); - m_scope.invalidate(); - m_internalValue.invalidate(); - m_members.resize(0); - m_values.resize(0); - m_data = 0; -} - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptobjectdata_p.h b/src/script/qscriptobjectdata_p.h deleted file mode 100644 index ed4e5fd..0000000 --- a/src/script/qscriptobjectdata_p.h +++ /dev/null @@ -1,81 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTOBJECTDATA_P_H -#define QSCRIPTOBJECTDATA_P_H - -#include <QtCore/qglobal.h> - -#ifndef QT_NO_SCRIPT - -QT_BEGIN_NAMESPACE - -// -// 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. -// - -class QScriptEnginePrivate; - -class QScriptObjectData -{ -protected: - inline QScriptObjectData() {} - -public: - virtual void finalize(QScriptEnginePrivate *) {} - virtual ~QScriptObjectData() {} - -private: - Q_DISABLE_COPY(QScriptObjectData) -}; - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptobjectfwd_p.h b/src/script/qscriptobjectfwd_p.h deleted file mode 100644 index 0cbec1f..0000000 --- a/src/script/qscriptobjectfwd_p.h +++ /dev/null @@ -1,112 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTOBJECTFWD_P_H -#define QSCRIPTOBJECTFWD_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 <QtCore/qglobal.h> - -#ifndef QT_NO_SCRIPT - -#include "qscriptbuffer_p.h" -#include "qscriptmemberfwd_p.h" -#include "qscriptvalueimplfwd_p.h" - -QT_BEGIN_NAMESPACE - -class QScriptObjectData; - -class QScriptObject -{ -public: - inline void reset(); - inline ~QScriptObject(); - inline void finalize(); - inline void finalizeData(); - - inline bool findMember(QScriptNameIdImpl *nameId, - QScript::Member *m) const; - - inline bool findGetter(QScript::Member *m) const; - - inline bool findSetter(QScript::Member *m) const; - - inline int memberCount() const; - - inline void createMember(QScriptNameIdImpl *nameId, - QScript::Member *member, uint flags); - - inline void member(int index, QScript::Member *member); - - inline void put(const QScript::Member &m, const QScriptValueImpl &v); - - inline QScriptValueImpl &reference(const QScript::Member &m); - - inline void get(const QScript::Member &m, QScriptValueImpl *v); - - inline void removeMember(const QScript::Member &member); - - QScriptValueImpl m_prototype; - QScriptValueImpl m_scope; - QScriptValueImpl m_internalValue; // [[value]] - QScriptObjectData *m_data; - QScript::Buffer<QScript::Member> m_members; - QScript::Buffer<QScriptValueImpl> m_values; - qint64 m_id; - QScriptClassInfo *m_class; -}; - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptrepository_p.h b/src/script/qscriptrepository_p.h deleted file mode 100644 index 64dbac0..0000000 --- a/src/script/qscriptrepository_p.h +++ /dev/null @@ -1,91 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTREPOSITORY_P_H -#define QSCRIPTREPOSITORY_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 "qscriptbuffer_p.h" - -QT_BEGIN_NAMESPACE - -namespace QScript { - -template <typename Tp, typename Factory> -class Repository -{ -public: - inline Repository() { cache.reserve(32); } - inline ~Repository() { qDeleteAll(cache); } - - inline Tp *get() - { - if (cache.isEmpty()) - return Factory::create(); - - return cache.takeLast(); - } - - inline void release(Tp *item) - { cache.append(item); } - -private: - Buffer<Tp*> cache; - -private: - Q_DISABLE_COPY(Repository) -}; - -} // namespace QScript - -QT_END_NAMESPACE - -#endif diff --git a/src/script/qscriptstring.h b/src/script/qscriptstring.h deleted file mode 100644 index d2fecd8..0000000 --- a/src/script/qscriptstring.h +++ /dev/null @@ -1,86 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTSTRING_H -#define QSCRIPTSTRING_H - -#include <QtCore/qstring.h> - -#ifndef QT_NO_SCRIPT - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Script) - -class QScriptEngine; -class QScriptStringPrivate; - -class Q_SCRIPT_EXPORT QScriptString -{ -public: - QScriptString(); - QScriptString(const QScriptString &other); - ~QScriptString(); - - QScriptString &operator=(const QScriptString &other); - - bool isValid() const; - - bool operator==(const QScriptString &other) const; - bool operator!=(const QScriptString &other) const; - - QString toString() const; - operator QString() const; - -private: - QScriptStringPrivate *d_ptr; - - Q_DECLARE_PRIVATE(QScriptString) -}; - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif // QT_NO_SCRIPT -#endif // QSCRIPTSTRING_H diff --git a/src/script/qscriptstring_p.h b/src/script/qscriptstring_p.h deleted file mode 100644 index 34f9dec..0000000 --- a/src/script/qscriptstring_p.h +++ /dev/null @@ -1,86 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTSTRING_P_H -#define QSCRIPTSTRING_P_H - -#include <QtCore/qatomic.h> - -#ifndef QT_NO_SCRIPT - -QT_BEGIN_NAMESPACE - -// -// 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. -// - -class QScriptNameIdImpl; -class QScriptEnginePrivate; -class QScriptString; - -class QScriptStringPrivate -{ - Q_DECLARE_PUBLIC(QScriptString) -public: - QScriptStringPrivate(); - - static QScriptStringPrivate *create(); - static QScriptStringPrivate *get(const QScriptString &q); - static void init(QScriptString &q, QScriptStringPrivate *d); - - QBasicAtomicInt ref; - QScriptNameIdImpl *nameId; - QScriptEnginePrivate *engine; - QScriptString *q_ptr; -}; - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptsyntaxchecker_p.h b/src/script/qscriptsyntaxchecker_p.h deleted file mode 100644 index 18f0611..0000000 --- a/src/script/qscriptsyntaxchecker_p.h +++ /dev/null @@ -1,118 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTSYNTAXCHECKER_H -#define QSCRIPTSYNTAXCHECKER_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 <QtCore/qstring.h> - -#ifndef QT_NO_SCRIPT - -#include "qscriptgrammar_p.h" - -QT_BEGIN_NAMESPACE - -namespace QScript { - -class Lexer; - -class SyntaxChecker: protected QScriptGrammar -{ -public: - enum State { - Error, - Intermediate, - Valid - }; - - struct Result { - Result(State s, int ln, int col, const QString &msg) - : state(s), errorLineNumber(ln), errorColumnNumber(col), - errorMessage(msg) {} - State state; - int errorLineNumber; - int errorColumnNumber; - QString errorMessage; - }; - - SyntaxChecker(); - ~SyntaxChecker(); - - Result checkSyntax(const QString &code); - -protected: - bool automatic(QScript::Lexer *lexer, int token) const; - inline void reallocateStack(); - -protected: - int tos; - int stack_size; - int *state_stack; -}; - -inline void SyntaxChecker::reallocateStack() -{ - if (! stack_size) - stack_size = 128; - else - stack_size <<= 1; - - state_stack = reinterpret_cast<int*> (qRealloc(state_stack, stack_size * sizeof(int))); -} - -} // namespace QScript - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptsyntaxcheckresult_p.h b/src/script/qscriptsyntaxcheckresult_p.h deleted file mode 100644 index fc5cb42..0000000 --- a/src/script/qscriptsyntaxcheckresult_p.h +++ /dev/null @@ -1,80 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTSYNTAXCHECKRESULT_P_H -#define QSCRIPTSYNTAXCHECKRESULT_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. -// - -#ifndef QT_NO_SCRIPT - -#include <QtCore/qatomic.h> -#include <QtCore/qstring.h> - -QT_BEGIN_NAMESPACE - -class QScriptSyntaxCheckResultPrivate -{ -public: - QScriptSyntaxCheckResultPrivate() { ref = 0; } - ~QScriptSyntaxCheckResultPrivate() {} - - QScriptSyntaxCheckResult::State state; - int errorColumnNumber; - int errorLineNumber; - QString errorMessage; - QBasicAtomicInt ref; -}; - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptvalue_p.h b/src/script/qscriptvalue_p.h deleted file mode 100644 index 8463ed2..0000000 --- a/src/script/qscriptvalue_p.h +++ /dev/null @@ -1,108 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTVALUE_P_H -#define QSCRIPTVALUE_P_H - -#include "qscriptvaluefwd_p.h" - -QT_BEGIN_NAMESPACE - -#ifndef QT_NO_SCRIPT - -// -// 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. -// - -inline QScriptValuePrivate::QScriptValuePrivate() -{ - engine = 0; - ref = 0; -} - -inline QScriptValuePrivate::~QScriptValuePrivate() -{ - if (value.type() == QScript::LazyStringType) - delete value.m_lazy_string_value; -} - -inline QScriptValuePrivate *QScriptValuePrivate::create() -{ - return new QScriptValuePrivate(); -} - -inline QScriptValuePrivate *QScriptValuePrivate::get(const QScriptValue &value) -{ - return const_cast<QScriptValuePrivate*>(value.d_func()); -} - -inline QScriptValueImpl QScriptValuePrivate::valueOf(const QScriptValue &value) -{ - QScriptValuePrivate *p = const_cast<QScriptValuePrivate*>(value.d_func()); - if (!p) - return QScriptValueImpl(); - return p->value; -} - -inline void QScriptValuePrivate::init(QScriptValue &value, QScriptValuePrivate *p) -{ - value.d_ptr = p; - value.d_ptr->ref.ref(); -} - -inline void QScriptValuePrivate::invalidate() -{ - engine = 0; - value.invalidate(); -} - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptvaluefwd_p.h b/src/script/qscriptvaluefwd_p.h deleted file mode 100644 index d57786d..0000000 --- a/src/script/qscriptvaluefwd_p.h +++ /dev/null @@ -1,89 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTVALUEFWD_P_H -#define QSCRIPTVALUEFWD_P_H - -#include <QtCore/qatomic.h> - -#ifndef QT_NO_SCRIPT - -#include "qscriptvalueimplfwd_p.h" - -QT_BEGIN_NAMESPACE - -// -// 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. -// - -class QScriptValuePrivate -{ -public: - inline QScriptValuePrivate(); - inline ~QScriptValuePrivate(); - - static inline QScriptValuePrivate *create(); - - static inline QScriptValuePrivate *get(const QScriptValue &value); - - static inline QScriptValueImpl valueOf(const QScriptValue &value); - - static inline void init(QScriptValue &value, QScriptValuePrivate *p); - - inline void invalidate(); - - QScriptEngine *engine; - QScriptValueImpl value; - QBasicAtomicInt ref; -}; - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptvalueimpl.cpp b/src/script/qscriptvalueimpl.cpp deleted file mode 100644 index 7c7b711..0000000 --- a/src/script/qscriptvalueimpl.cpp +++ /dev/null @@ -1,450 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qscriptvalueimpl_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" - -QT_BEGIN_NAMESPACE - -static void dfs(QScriptObject *instance, QHash<QScriptObject*, int> &dfn, int n) -{ - bool found = dfn.contains(instance); - dfn[instance] = n; - - if (found) - return; - - if (instance->m_prototype.isObject()) - dfs (instance->m_prototype.m_object_value, dfn, n + 1); - - if (instance->m_scope.isObject()) - dfs (instance->m_scope.m_object_value, dfn, n + 1); -} - - -static bool checkCycle(QScriptObject *instance, const QHash<QScriptObject*, int> &dfn) -{ - int n = dfn.value(instance); - - if (instance->m_prototype.isObject()) { - if (n >= dfn.value(instance->m_prototype.m_object_value)) - return true; - } - - if (instance->m_scope.isObject()) { - if (n >= dfn.value(instance->m_scope.m_object_value)) - return true; - } - - return false; -} - -bool QScriptValueImpl::detectedCycle() const -{ - QHash<QScriptObject*, int> dfn; - dfs(m_object_value, dfn, 0); - return checkCycle(m_object_value, dfn); -} - -bool QScriptValueImpl::instanceOf(const QScriptValueImpl &value) const -{ - if (! isObject() || ! value.isObject() || !value.implementsHasInstance()) - return false; - return value.hasInstance(*this); -} - -bool QScriptValueImpl::implementsHasInstance() const -{ - Q_ASSERT(isObject()); - if (isFunction()) - return true; - if (QScriptClassData *odata = classInfo()->data()) { - return odata->implementsHasInstance(*this); - } - return false; -} - -bool QScriptValueImpl::hasInstance(const QScriptValueImpl &value) const -{ - Q_ASSERT(isObject()); - - if (QScriptClassData *odata = classInfo()->data()) { - if (odata->implementsHasInstance(*this)) - return odata->hasInstance(*this, value); - } - if (!isFunction()) - return false; - - // [[HasInstance] for function objects - - if (!value.isObject()) - return false; - - QScriptEnginePrivate *eng = engine(); - QScriptValueImpl proto = property(eng->idTable()->id_prototype); - if (!proto.isObject()) { - QScriptContextPrivate *ctx = eng->currentContext(); - ctx->throwTypeError(QLatin1String("instanceof: 'prototype' property is not an object")); - return false; - } - - QScriptObject *target = proto.m_object_value; - QScriptValueImpl v = value; - while (true) { - v = v.prototype(); - if (!v.isObject()) - break; - if (target == v.m_object_value) - return true; - } - return false; -} - -bool QScriptValueImpl::resolve_helper(QScriptNameIdImpl *nameId, QScript::Member *member, - QScriptValueImpl *object, QScriptValue::ResolveFlags mode, - QScript::AccessMode access) const -{ - QScriptObject *object_data = m_object_value; - - QScriptEnginePrivate *eng_p = engine(); - - if (nameId == eng_p->idTable()->id___proto__) { - member->native(nameId, /*id=*/0, QScriptValue::Undeletable); - *object = *this; - return true; - } - - // If not found anywhere else, search in the extra members. - if (QScriptClassData *odata = classInfo()->data()) { - *object = *this; - - if (odata->resolve(*this, nameId, member, object, access)) - return true; - } - - if (mode & QScriptValue::ResolvePrototype) { - // For values and other non object based types, search in class's prototype - const QScriptValueImpl &proto = object_data->m_prototype; - - if (proto.isObject() - && proto.resolve(nameId, member, object, mode, access)) { - return true; - } - } - - if ((mode & QScriptValue::ResolveScope) && object_data->m_scope.isValid()) - return object_data->m_scope.resolve(nameId, member, object, mode, access); - - return false; -} - -void QScriptValueImpl::setProperty(QScriptNameIdImpl *nameId, - const QScriptValueImpl &value, - const QScriptValue::PropertyFlags &flags) -{ - if (!isObject()) - return; - - QScriptValueImpl base; - QScript::Member member; - - QScriptValue::ResolveFlags mode = QScriptValue::ResolveLocal; - // if we are not setting a setter or getter, look in prototype too - if (!(flags & (QScriptValue::PropertyGetter | QScriptValue::PropertySetter))) - mode |= QScriptValue::ResolvePrototype; - - if (resolve(nameId, &member, &base, mode, QScript::ReadWrite)) { - // we resolved an existing property with that name - if (flags & (QScriptValue::PropertyGetter | QScriptValue::PropertySetter)) { - // setting the getter or setter of a property in this object - if (member.isNativeProperty()) { - if (value.isValid()) { - qWarning("QScriptValue::setProperty() failed: " - "cannot set getter or setter of native property `%s'", - qPrintable(nameId->s)); - } - return; - } - if (member.isSetter()) { - // the property we resolved is a setter - if (!(flags & QScriptValue::PropertySetter) && !member.isGetter()) { - // find the getter, if not, create one - if (!m_object_value->findGetter(&member)) { - if (!value.isValid()) - return; // don't create property for invalid value - createMember(nameId, &member, flags); - } - } - } else if (member.isGetter()) { - // the property we resolved is a getter - if (!(flags & QScriptValue::PropertyGetter)) { - // find the setter, if not, create one - if (!m_object_value->findSetter(&member)) { - if (!value.isValid()) - return; // don't create property for invalid value - createMember(nameId, &member, flags); - } - } - } else { - // the property is a normal property -- change the flags - uint newFlags = flags & ~QScript::Member::InternalRange; - newFlags |= QScript::Member::ObjectProperty; - member.resetFlags(newFlags); - base.m_object_value->m_members[member.id()].resetFlags(newFlags); - } - Q_ASSERT(member.isValid()); - if (!value.isValid()) { - // remove the property - removeMember(member); - return; - } - } else { - // setting the value - if (member.isGetterOrSetter()) { - // call the setter - QScriptValueImpl setter; - if (member.isObjectProperty() && !member.isSetter()) { - if (!base.m_object_value->findSetter(&member)) { - qWarning("QScriptValue::setProperty() failed: " - "property '%s' has a getter but no setter", - qPrintable(nameId->s)); - return; - } - } - base.get(member, &setter); - setter.call(*this, QScriptValueImplList() << value); - return; - } else { - if (base.m_object_value != m_object_value) { - if (!value.isValid()) - return; // don't create property for invalid value - createMember(nameId, &member, flags); - base = *this; - } else { - if (!value.isValid()) { - // remove the property - removeMember(member); - return; - } - } - if (flags != QScriptValue::KeepExistingFlags) { - // change flags - if (member.isNativeProperty()) { - qWarning("QScriptValue::setProperty(%s): " - "cannot change flags of a native property", - qPrintable(nameId->s)); - } else { - uint newFlags = member.flags() & QScript::Member::InternalRange; - newFlags |= flags & ~QScript::Member::InternalRange; - base.m_object_value->m_members[member.id()].resetFlags(newFlags); - } - } - } - } - } else { - // property does not exist - if (!value.isValid()) - return; // don't create property for invalid value - createMember(nameId, &member, flags & ~QScript::Member::InternalRange); - base = *this; - } - - base.put(member, value); -} - -QVariant QScriptValueImpl::toVariant() const -{ - switch (m_type) { - case QScript::InvalidType: - return QVariant(); - - case QScript::UndefinedType: - case QScript::NullType: - case QScript::PointerType: - case QScript::ReferenceType: - break; - - case QScript::BooleanType: - return QVariant(m_bool_value); - - case QScript::IntegerType: - return QVariant(m_int_value); - - case QScript::NumberType: - return QVariant(m_number_value); - - case QScript::StringType: - return QVariant(m_string_value->s); - - case QScript::LazyStringType: - return QVariant(*m_lazy_string_value); - - case QScript::ObjectType: - if (isDate()) - return QVariant(toDateTime()); - -#ifndef QT_NO_REGEXP - if (isRegExp()) - return QVariant(toRegExp()); -#endif - if (isVariant()) - return variantValue(); - -#ifndef QT_NO_QOBJECT - if (isQObject()) - return qVariantFromValue(toQObject()); -#endif - if (isArray()) - return QScriptEnginePrivate::variantListFromArray(*this); - - QScriptValueImpl v = engine()->toPrimitive(*this); - if (!v.isObject()) - return v.toVariant(); - break; - } // switch - return QVariant(); -} - -QDebug &operator<<(QDebug &d, const QScriptValueImpl &object) -{ - d.nospace() << "QScriptValue("; - - switch (object.type()) { - case QScript::InvalidType: - d.nospace() << "Invalid)"; - return d; - - case QScript::BooleanType: - d.nospace() << "bool=" << object.toBoolean(); - break; - - case QScript::IntegerType: - d.nospace() << "int=" << object.toInt32(); - break; - - case QScript::NumberType: - d.nospace() << "qsreal=" << object.toNumber(); - break; - - case QScript::LazyStringType: - case QScript::StringType: - d.nospace() << "string=" << object.toString(); - break; - - case QScript::ReferenceType: - d.nospace() << "reference"; - break; - - case QScript::NullType: - d.nospace() << "null"; - break; - - case QScript::UndefinedType: - d.nospace() << "undefined"; - break; - - case QScript::PointerType: - d.nospace() << "pointer"; - break; - - case QScript::ObjectType: - d.nospace() << object.classInfo()->name() << ",{"; - QScriptObject *od = object.objectValue(); - for (int i=0; i<od->memberCount(); ++i) { - if (i != 0) - d << ','; - - QScript::Member m; - od->member(i, &m); - - if (m.isValid() && m.isObjectProperty()) { - d << object.engine()->toString(m.nameId()); - QScriptValueImpl o; - od->get(m, &o); - d.nospace() << QLatin1Char(':') - << (o.classInfo() - ? o.classInfo()->name() - : QLatin1String("?")); - } - } - - d.nospace() << "} scope={"; - QScriptValueImpl scope = object.scope(); - while (scope.isValid()) { - Q_ASSERT(scope.isObject()); - d.nospace() << ' ' << scope.objectValue(); - scope = scope.scope(); - } - d.nospace() << '}'; - break; - } - - d << ')'; - return d; -} - -void QScriptValueImpl::destroyObjectData() -{ - Q_ASSERT(isObject()); - m_object_value->finalizeData(); -} - -bool QScriptValueImpl::isMarked(int generation) const -{ - if (isString()) - return (m_string_value->used != 0); - else if (isObject()) { - QScript::GCBlock *block = QScript::GCBlock::get(m_object_value); - return (block->generation == generation); - } - return false; -} - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT diff --git a/src/script/qscriptvalueimpl_p.h b/src/script/qscriptvalueimpl_p.h deleted file mode 100644 index 09dd6cd..0000000 --- a/src/script/qscriptvalueimpl_p.h +++ /dev/null @@ -1,786 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTVALUEIMPL_P_H -#define QSCRIPTVALUEIMPL_P_H - -#include "qscriptvalueimplfwd_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptclassinfo_p.h" -#include "qscriptecmaarray_p.h" -#include "qscriptecmadate_p.h" -#include "qscriptecmaerror_p.h" -#include "qscriptecmaregexp_p.h" -#include "qscriptextqobject_p.h" -#include "qscriptextvariant_p.h" -#include "qscriptvaluefwd_p.h" -#include "qscriptnameid_p.h" -#include "qscriptenginefwd_p.h" -#include "qscriptcontextfwd_p.h" - -#include <QtCore/QDateTime> - -QT_BEGIN_NAMESPACE - -// -// 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. -// - -inline QScriptValueImpl::QScriptValueImpl() - : m_type(QScript::InvalidType) {} - -inline QScriptValueImpl::QScriptValueImpl(QScriptValue::SpecialValue val) -{ - if (val == QScriptValue::NullValue) - m_type = QScript::NullType; - else if (val == QScriptValue::UndefinedValue) - m_type = QScript::UndefinedType; - else - m_type = QScript::InvalidType; -} - -inline QScriptValueImpl::QScriptValueImpl(bool val) - : m_type(QScript::BooleanType), m_bool_value(val) -{ -} - -inline QScriptValueImpl::QScriptValueImpl(int val) - : m_type(QScript::NumberType), m_number_value(val) -{ -} - -inline QScriptValueImpl::QScriptValueImpl(uint val) - : m_type(QScript::NumberType), m_number_value(val) -{ -} - -inline QScriptValueImpl::QScriptValueImpl(qsreal val) - : m_type(QScript::NumberType), m_number_value(val) -{ -} - -inline QScriptValueImpl::QScriptValueImpl(QScriptEnginePrivate *engine, const QString &val) -{ - engine->newString(this, val); -} - -inline QScriptValueImpl::QScriptValueImpl(QScriptNameIdImpl *val) - : m_type(QScript::StringType), m_string_value(val) -{ -} - -inline QScript::Type QScriptValueImpl::type() const -{ - return m_type; -} - -inline QScriptEnginePrivate *QScriptValueImpl::engine() const -{ - if (!isObject()) - return 0; - return m_object_value->m_class->engine(); -} - -inline QScriptClassInfo *QScriptValueImpl::classInfo() const -{ - if (!isObject()) - return 0; - return m_object_value->m_class; -} - -inline void QScriptValueImpl::setClassInfo(QScriptClassInfo *cls) -{ - Q_ASSERT(isObject()); - m_object_value->m_class = cls; -} - -inline QScriptNameIdImpl *QScriptValueImpl::stringValue() const -{ - Q_ASSERT(isString()); - return m_string_value; -} - -inline QScriptObject *QScriptValueImpl::objectValue() const -{ - Q_ASSERT(isObject()); - return m_object_value; -} - -inline void QScriptValueImpl::incr() -{ - ++m_number_value; -} - -inline void QScriptValueImpl::decr() -{ - --m_number_value; -} - -inline void QScriptValueImpl::invalidate() -{ - m_type = QScript::InvalidType; -} - -inline bool QScriptValueImpl::isValid() const -{ - return m_type != QScript::InvalidType; -} - -inline bool QScriptValueImpl::isUndefined() const -{ - return (m_type == QScript::UndefinedType); -} - -inline bool QScriptValueImpl::isNull() const -{ - return (m_type == QScript::NullType); -} - -inline bool QScriptValueImpl::isBoolean() const -{ - return (m_type == QScript::BooleanType); -} - -inline bool QScriptValueImpl::isNumber() const -{ - return (m_type == QScript::NumberType); -} - -inline bool QScriptValueImpl::isString() const -{ - return (m_type == QScript::StringType) - || (m_type == QScript::LazyStringType); -} - -inline bool QScriptValueImpl::isReference() const -{ - return (m_type == QScript::ReferenceType); -} - -inline bool QScriptValueImpl::isObject() const -{ - return (m_type == QScript::ObjectType); -} - -inline bool QScriptValueImpl::isFunction() const -{ - return (m_type == QScript::ObjectType) - && (classInfo()->type() & QScriptClassInfo::FunctionBased); -} - -inline bool QScriptValueImpl::isVariant() const -{ - return (m_type == QScript::ObjectType) - && (classInfo()->type() == QScriptClassInfo::VariantType); -} - -inline bool QScriptValueImpl::isQObject() const -{ - return (m_type == QScript::ObjectType) - && (classInfo()->type() == QScriptClassInfo::QObjectType); -} - -inline bool QScriptValueImpl::isQMetaObject() const -{ - return (m_type == QScript::ObjectType) - && (classInfo()->type() == QScriptClassInfo::QMetaObjectType); -} - -inline bool QScriptValueImpl::isArray() const -{ - if (!isObject()) - return false; - return classInfo() == engine()->arrayConstructor->classInfo(); -} - -inline bool QScriptValueImpl::isDate() const -{ - if (!isObject()) - return false; - return classInfo() == engine()->dateConstructor->classInfo(); -} - -inline bool QScriptValueImpl::isError() const -{ - if (!isObject()) - return false; - return classInfo() == engine()->errorConstructor->classInfo(); -} - -inline bool QScriptValueImpl::isRegExp() const -{ - if (!isObject()) - return false; - return classInfo() == engine()->regexpConstructor->classInfo(); -} - -inline qsreal QScriptValueImpl::toNumber() const -{ - if (!isValid()) - return 0; - return QScriptEnginePrivate::convertToNativeDouble(*this); -} - -inline bool QScriptValueImpl::toBoolean() const -{ - if (!isValid()) - return false; - return QScriptEnginePrivate::convertToNativeBoolean(*this); -} - -inline QString QScriptValueImpl::toString() const -{ - if (!isValid()) - return QString(); - return QScriptEnginePrivate::convertToNativeString(*this); -} - -inline qint32 QScriptValueImpl::toInt32() const -{ - if (!isValid()) - return 0; - double d = QScriptEnginePrivate::convertToNativeDouble(*this); - return QScriptEnginePrivate::toInt32(d); -} - -inline quint32 QScriptValueImpl::toUInt32() const -{ - if (!isValid()) - return 0; - double d = QScriptEnginePrivate::convertToNativeDouble(*this); - return QScriptEnginePrivate::toUint32(d); -} - -inline quint16 QScriptValueImpl::toUInt16() const -{ - if (!isValid()) - return 0; - double d = QScriptEnginePrivate::convertToNativeDouble(*this); - return QScriptEnginePrivate::toUint16(d); -} - -inline qsreal QScriptValueImpl::toInteger() const -{ - if (!isValid()) - return 0; - double d = QScriptEnginePrivate::convertToNativeDouble(*this); - return QScriptEnginePrivate::toInteger(d); -} - -inline QDateTime QScriptValueImpl::toDateTime() const -{ - if (!isDate()) - return QDateTime(); - return engine()->toDateTime(*this); -} - -#ifndef QT_NO_REGEXP -inline QRegExp QScriptValueImpl::toRegExp() const -{ - if (!isRegExp()) - return QRegExp(); - return engine()->regexpConstructor->toRegExp(*this); -} -#endif // QT_NO_REGEXP - -inline QObject *QScriptValueImpl::toQObject() const -{ -#ifndef QT_NO_QOBJECT - if (isQObject()) { - QScript::ExtQObject *ctor = engine()->qobjectConstructor; - Q_ASSERT(ctor != 0); - - QScript::ExtQObject::Instance *data = ctor->get(*this); - Q_ASSERT(data != 0); - - return data->value; - } else if (isVariant()) { - int type = variantValue().userType(); - if ((type == QMetaType::QObjectStar) || (type == QMetaType::QWidgetStar)) - return *reinterpret_cast<QObject* const *>(variantValue().constData()); - } -#endif - return 0; -} - -inline const QMetaObject *QScriptValueImpl::toQMetaObject() const -{ -#ifndef QT_NO_QOBJECT - if (isQMetaObject()) { - QScript::ExtQMetaObject *ctor = engine()->qmetaObjectConstructor; - Q_ASSERT(ctor != 0); - - QScript::ExtQMetaObject::Instance *data = ctor->get(*this); - Q_ASSERT(data != 0); - - return data->value; - } -#endif - return 0; -} - -inline QScriptValueImpl QScriptValueImpl::prototype() const -{ - if (!isObject()) - return QScriptValueImpl(); - return m_object_value->m_prototype; -} - -inline void QScriptValueImpl::setPrototype(const QScriptValueImpl &prototype) -{ - if (isObject()) - m_object_value->m_prototype = prototype; -} - -inline QScriptObjectData *QScriptValueImpl::objectData() const -{ - Q_ASSERT(isObject()); - return m_object_value->m_data; -} - -inline void QScriptValueImpl::setObjectData(QScriptObjectData *data) -{ - Q_ASSERT(isObject()); - m_object_value->m_data = data; -} - -inline bool QScriptValueImpl::resolve(QScriptNameIdImpl *nameId, QScript::Member *member, - QScriptValueImpl *object, QScriptValue::ResolveFlags mode, - QScript::AccessMode access) const -{ - Q_ASSERT(isValid()); - Q_ASSERT(isObject()); - Q_ASSERT(member); - Q_ASSERT(object); - - Q_ASSERT(nameId->unique); - - QScriptObject *object_data = m_object_value; - - // Search in properties... - if (object_data->findMember(nameId, member)) { - *object = *this; - return true; - } - - return resolve_helper(nameId, member, object, mode, access); -} - -inline void QScriptValueImpl::get(const QScript::Member &member, QScriptValueImpl *out) const -{ - Q_ASSERT(out); - Q_ASSERT(isObject()); - Q_ASSERT(member.isValid()); - - if (! member.isObjectProperty()) { - get_helper(member, out); - return; - } - - Q_ASSERT(member.id() >= 0); - Q_ASSERT(member.id() < m_object_value->memberCount()); - - m_object_value->get(member, out); -} - -inline void QScriptValueImpl::get(QScriptNameIdImpl *nameId, QScriptValueImpl *out) -{ - QScript::Member m; - QScriptValueImpl o; - if (resolve(nameId, &m, &o, QScriptValue::ResolvePrototype, QScript::Read)) - o.get(m, out); - else - *out = QScriptValueImpl(QScriptValue::UndefinedValue); -} - -inline void QScriptValueImpl::get_helper(const QScript::Member &member, QScriptValueImpl *out) const -{ - if (member.nameId() == engine()->idTable()->id___proto__) { - *out = prototype(); - - if (!out->isValid()) - *out = QScriptValueImpl(QScriptValue::UndefinedValue); - - return; - } - - if (QScriptClassData *data = classInfo()->data()) { - if (data->get(*this, member, out)) - return; - } - - out->invalidate(); -} - -inline void QScriptValueImpl::put(const QScript::Member &member, const QScriptValueImpl &value) -{ - Q_ASSERT(isObject()); - Q_ASSERT(member.isValid()); - // Q_ASSERT(member.isWritable()); - - QScriptEnginePrivate *eng_p = engine(); - - if (member.isObjectProperty()) { - Q_ASSERT(member.nameId()->unique); - Q_ASSERT(member.id() >= 0); - Q_ASSERT(member.id() < m_object_value->memberCount()); - m_object_value->put(member, value); - } - - else if (member.nameId() == eng_p->idTable()->id___proto__) { - if (value.isNull()) // only Object.prototype.__proto__ can be null - setPrototype(eng_p->undefinedValue()); - else { - QScriptValueImpl was = prototype(); - setPrototype(value); - if (detectedCycle()) { - eng_p->currentContext()->throwError(QLatin1String("cycle in prototype chain")); - setPrototype(was); - } - } - } - - else { - Q_ASSERT(classInfo()->data()); - classInfo()->data()->put(this, member, value); - } -} - -inline void QScriptValueImpl::setQObjectValue(QObject *object) -{ -#ifndef QT_NO_QOBJECT - Q_ASSERT(isQObject()); - - QScript::ExtQObject *ctor = engine()->qobjectConstructor; - Q_ASSERT(ctor != 0); - - QScript::ExtQObject::Instance *data = ctor->get(*this); - Q_ASSERT(data != 0); - - data->value = object; -#else - Q_UNUSED(object); -#endif -} - -inline QVariant &QScriptValueImpl::variantValue() const -{ - Q_ASSERT(isVariant()); - - QScript::Ext::Variant *ctor = engine()->variantConstructor; - Q_ASSERT(ctor != 0); - - QScript::Ext::Variant::Instance *data = ctor->get(*this); - Q_ASSERT(data != 0); - - return data->value; -} - -inline void QScriptValueImpl::setVariantValue(const QVariant &value) -{ - if (!isVariant()) - return; - - QScript::Ext::Variant *ctor = engine()->variantConstructor; - Q_ASSERT(ctor != 0); - - QScript::Ext::Variant::Instance *data = ctor->get(*this); - Q_ASSERT(data != 0); - - data->value = value; -} - -inline QScriptValueImpl QScriptValueImpl::internalValue() const -{ - Q_ASSERT(isObject()); - return m_object_value->m_internalValue; -} - -inline void QScriptValueImpl::setInternalValue(const QScriptValueImpl &internalValue) -{ - Q_ASSERT(isObject()); - m_object_value->m_internalValue = internalValue; -} - -inline void QScriptValueImpl::removeMember(const QScript::Member &member) -{ - if (member.isObjectProperty()) - m_object_value->removeMember(member); - - else if (QScriptClassData *data = classInfo()->data()) - data->removeMember(*this, member); -} - -inline void QScriptValueImpl::createMember(QScriptNameIdImpl *nameId, - QScript::Member *member, uint flags) -{ - Q_ASSERT(isObject()); - - QScriptObject *object_data = m_object_value; - object_data->createMember(nameId, member, flags); - Q_ASSERT(member->isObjectProperty()); -} - -inline QScriptValueImpl QScriptValueImpl::scope() const -{ - Q_ASSERT(isObject()); - return m_object_value->m_scope; -} - -inline void QScriptValueImpl::setScope(const QScriptValueImpl &scope) -{ - Q_ASSERT(isObject()); - m_object_value->m_scope = scope; -} - -inline int QScriptValueImpl::memberCount() const -{ - Q_ASSERT(isObject()); - return m_object_value->memberCount(); -} - -inline void QScriptValueImpl::member(int index, QScript::Member *member) const -{ - Q_ASSERT(isObject()); - Q_ASSERT(index >= 0); - Q_ASSERT(index < m_object_value->memberCount()); - m_object_value->member(index, member); -} - -inline QScriptFunction *QScriptValueImpl::toFunction() const -{ - if (!isFunction()) - return 0; - return engine()->convertToNativeFunction(*this); -} - -inline QScriptValueImpl QScriptValueImpl::property(QScriptNameIdImpl *nameId, - const QScriptValue::ResolveFlags &mode) const -{ - if (!isObject()) - return QScriptValueImpl(); - - QScriptValueImpl base; - QScript::Member member; - - if (! resolve(nameId, &member, &base, mode, QScript::Read)) - return QScriptValueImpl(); - - QScriptValueImpl value; - base.get(member, &value); - if (member.isGetterOrSetter()) { - QScriptValueImpl getter; - if (member.isObjectProperty() && !member.isGetter()) { - if (!base.m_object_value->findGetter(&member)) - return QScriptValueImpl(); - } - base.get(member, &getter); - value = getter.call(*this); - } - return value; -} - -inline void QScriptValueImpl::setProperty(const QString &name, const QScriptValueImpl &value, - const QScriptValue::PropertyFlags &flags) -{ - if (!isObject()) - return; - QScriptNameIdImpl *nameId = engine()->nameId(name); - setProperty(nameId, value, flags); -} - -inline QScriptValueImpl QScriptValueImpl::property(const QString &name, - const QScriptValue::ResolveFlags &mode) const -{ - if (!isObject()) - return QScriptValueImpl(); - QScriptNameIdImpl *nameId = engine()->nameId(name); - return property(nameId, mode); -} - -inline QScriptValueImpl QScriptValueImpl::property(quint32 arrayIndex, - const QScriptValue::ResolveFlags &mode) const -{ - if (!isObject()) - return QScriptValueImpl(); - - QScriptEnginePrivate *eng_p = engine(); - QScript::Ecma::Array::Instance *instance = eng_p->arrayConstructor->get(*this); - if (instance && (arrayIndex != 0xFFFFFFFF)) - return instance->value.at(arrayIndex); - - return property(QScriptValueImpl(arrayIndex).toString(), mode); -} - -inline void QScriptValueImpl::setProperty(quint32 arrayIndex, const QScriptValueImpl &value, - const QScriptValue::PropertyFlags &flags) -{ - if (!isObject()) - return; - - QScriptEnginePrivate *eng_p = engine(); - QScript::Ecma::Array::Instance *instance = eng_p->arrayConstructor->get(*this); - if (instance && (arrayIndex != 0xFFFFFFFF)) { - instance->value.assign(arrayIndex, value); - return; - } - - setProperty(QScriptValueImpl(arrayIndex).toString(), value, flags); -} - -inline QScriptValue::PropertyFlags QScriptValueImpl::propertyFlags(const QString &name, - const QScriptValue::ResolveFlags &mode) const -{ - QScriptNameIdImpl *nameId = engine()->nameId(name); - return propertyFlags(nameId, mode); -} - -inline QScriptValue::PropertyFlags QScriptValueImpl::propertyFlags(QScriptNameIdImpl *nameId, - const QScriptValue::ResolveFlags &mode) const -{ - if (!isObject()) - return 0; - - QScriptValueImpl base; - QScript::Member member; - if (! resolve(nameId, &member, &base, mode, QScript::ReadWrite)) - return 0; - - return QScriptValue::PropertyFlags(member.flags() & ~QScript::Member::InternalRange); -} - -inline bool QScriptValueImpl::deleteProperty(QScriptNameIdImpl *nameId, - const QScriptValue::ResolveFlags &mode) -{ - if (!isObject()) - return true; - QScript::Member member; - QScriptValueImpl base; - if (resolve(nameId, &member, &base, mode, QScript::Write)) { - if (!member.isDeletable()) - return false; - base.removeMember(member); - if (member.isGetterOrSetter() && (member.isGetter() != member.isSetter())) { - // delete the "other half" of the property too (getter or setter) - return deleteProperty(nameId, mode); - } - } - return true; -} - -inline QScriptValueImpl QScriptValueImpl::call(const QScriptValueImpl &thisObject, - const QScriptValueImplList &args) -{ - if (!isFunction()) - return QScriptValueImpl(); - - return engine()->call(*this, thisObject, args, /*asConstructor=*/false); -} - -inline QScriptValueImpl QScriptValueImpl::call(const QScriptValueImpl &thisObject, - const QScriptValueImpl &args) -{ - if (!isFunction()) - return QScriptValueImpl(); - - return engine()->call(*this, thisObject, args, /*asConstructor=*/false); -} - -inline QScriptValueImpl QScriptValueImpl::construct(const QScriptValueImplList &args) -{ - if (!isFunction()) - return QScriptValueImpl(); - - QScriptEnginePrivate *eng_p = engine(); - - QScriptValueImpl proto = property(QLatin1String("prototype"), QScriptValue::ResolveLocal); - QScriptValueImpl object; - eng_p->newObject(&object, proto); - - QScriptValueImpl result = eng_p->call(*this, object, args, /*asConstructor=*/true); - if (result.isObject()) - return result; - return object; -} - -inline QScriptValueImpl QScriptValueImpl::construct(const QScriptValueImpl &args) -{ - if (!isFunction()) - return QScriptValueImpl(); - - QScriptEnginePrivate *eng_p = engine(); - - QScriptValueImpl proto = property(QLatin1String("prototype"), QScriptValue::ResolveLocal); - QScriptValueImpl object; - eng_p->newObject(&object, proto); - - QScriptValueImpl result = eng_p->call(*this, object, args, /*asConstructor=*/true); - if (result.isObject()) - return result; - return object; -} - -inline void QScriptValueImpl::mark(int generation) const -{ - if (! isValid()) - return; - - else if (isString()) - engine()->markString(m_string_value, generation); - - else if (isObject()) - engine()->markObject(*this, generation); -} - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/qscriptvalueimplfwd_p.h b/src/script/qscriptvalueimplfwd_p.h deleted file mode 100644 index aa0c86f..0000000 --- a/src/script/qscriptvalueimplfwd_p.h +++ /dev/null @@ -1,237 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTVALUEIMPLFWD_P_H -#define QSCRIPTVALUEIMPLFWD_P_H - -#include "qscriptglobals_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptvalue.h" - -#include <QtCore/qstring.h> -#include <QtCore/qlist.h> - -QT_BEGIN_NAMESPACE - -// -// 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. -// - -class QScriptValueImpl; -typedef QList<QScriptValueImpl> QScriptValueImplList; - -class QScriptClassInfo; -class QScriptObject; -class QScriptObjectData; -class QScriptNameIdImpl; -class QScriptFunction; -class QScriptEnginePrivate; - -namespace QScript -{ - class Member; -} - -class QScriptValueImpl -{ -public: - enum TypeHint { - NoTypeHint, - NumberTypeHint, - StringTypeHint - }; - - inline QScriptValueImpl(); - inline QScriptValueImpl(QScriptValue::SpecialValue val); - inline QScriptValueImpl(bool val); - inline QScriptValueImpl(int val); - inline QScriptValueImpl(uint val); - inline QScriptValueImpl(qsreal val); - inline QScriptValueImpl(QScriptEnginePrivate *engine, const QString &val); - inline QScriptValueImpl(QScriptNameIdImpl *val); - - inline QScript::Type type() const; - inline QScriptEnginePrivate *engine() const; - inline QScriptClassInfo *classInfo() const; - inline void setClassInfo(QScriptClassInfo *cls); - inline QScriptNameIdImpl *stringValue() const; - inline QScriptObject *objectValue() const; - inline void incr(); - inline void decr(); - - inline void invalidate(); - inline bool isValid() const; - inline bool isBoolean() const; - inline bool isNumber() const; - inline bool isString() const; - inline bool isFunction() const; - inline bool isObject() const; - inline bool isUndefined() const; - inline bool isNull() const; - inline bool isVariant() const; - inline bool isQObject() const; - inline bool isQMetaObject() const; - inline bool isReference() const; - - inline bool isError() const; - inline bool isArray() const; - inline bool isDate() const; - inline bool isRegExp() const; - - inline QString toString() const; - inline qsreal toNumber() const; - inline bool toBoolean() const; - inline qsreal toInteger() const; - inline qint32 toInt32() const; - inline quint32 toUInt32() const; - inline quint16 toUInt16() const; - QVariant toVariant() const; - inline QObject *toQObject() const; - inline const QMetaObject *toQMetaObject() const; - inline QDateTime toDateTime() const; -#ifndef QT_NO_REGEXP - inline QRegExp toRegExp() const; -#endif - - inline QVariant &variantValue() const; - inline void setVariantValue(const QVariant &v); - - bool instanceOf(const QScriptValueImpl &value) const; - bool instanceOf_helper(const QScriptValueImpl &value) const; - - bool implementsHasInstance() const; - bool hasInstance(const QScriptValueImpl &value) const; - - inline QScriptValueImpl prototype() const; - inline void setPrototype(const QScriptValueImpl &prototype); - - inline QScriptValueImpl property(QScriptNameIdImpl *nameId, - const QScriptValue::ResolveFlags &mode = QScriptValue::ResolvePrototype) const; - void setProperty(QScriptNameIdImpl *nameId, const QScriptValueImpl &value, - const QScriptValue::PropertyFlags &flags = QScriptValue::KeepExistingFlags); - - inline QScriptValueImpl property(const QString &name, - const QScriptValue::ResolveFlags &mode = QScriptValue::ResolvePrototype) const; - inline void setProperty(const QString &name, const QScriptValueImpl &value, - const QScriptValue::PropertyFlags &flags = QScriptValue::KeepExistingFlags); - - inline QScriptValueImpl property(quint32 arrayIndex, - const QScriptValue::ResolveFlags &mode = QScriptValue::ResolvePrototype) const; - inline void setProperty(quint32 arrayIndex, const QScriptValueImpl &value, - const QScriptValue::PropertyFlags &flags = QScriptValue::KeepExistingFlags); - - inline QScriptValue::PropertyFlags propertyFlags(const QString &name, - const QScriptValue::ResolveFlags &mode = QScriptValue::ResolvePrototype) const; - inline QScriptValue::PropertyFlags propertyFlags(QScriptNameIdImpl *nameId, - const QScriptValue::ResolveFlags &mode = QScriptValue::ResolvePrototype) const; - - inline bool deleteProperty(QScriptNameIdImpl *nameId, - const QScriptValue::ResolveFlags &mode = QScriptValue::ResolveLocal); - - inline QScriptValueImpl call(const QScriptValueImpl &thisObject = QScriptValueImpl(), - const QScriptValueImplList &args = QScriptValueImplList()); - inline QScriptValueImpl call(const QScriptValueImpl &thisObject, - const QScriptValueImpl &arguments); - inline QScriptValueImpl construct(const QScriptValueImplList &args = QScriptValueImplList()); - inline QScriptValueImpl construct(const QScriptValueImpl &arguments); - - inline void mark(int) const; - bool isMarked(int) const; - - inline QScriptValueImpl internalValue() const; - inline void setInternalValue(const QScriptValueImpl &internalValue); - - inline void setQObjectValue(QObject *object); - - inline QScriptObjectData *objectData() const; - inline void setObjectData(QScriptObjectData *data); - void destroyObjectData(); - - inline void createMember(QScriptNameIdImpl *nameId, - QScript::Member *member, uint flags); // ### remove me - inline int memberCount() const; - inline void member(int index, QScript::Member *member) const; - - inline bool resolve(QScriptNameIdImpl *nameId, QScript::Member *member, - QScriptValueImpl *object, QScriptValue::ResolveFlags mode, - QScript::AccessMode access) const; - bool resolve_helper(QScriptNameIdImpl *nameId, QScript::Member *member, - QScriptValueImpl *object, QScriptValue::ResolveFlags mode, - QScript::AccessMode access) const; - inline void get(const QScript::Member &member, QScriptValueImpl *out) const; - inline void get_helper(const QScript::Member &member, QScriptValueImpl *out) const; - inline void get(QScriptNameIdImpl *nameId, QScriptValueImpl *out); - inline void put(const QScript::Member &member, const QScriptValueImpl &value); - inline void removeMember(const QScript::Member &member); - - inline QScriptValueImpl scope() const; - inline void setScope(const QScriptValueImpl &scope); - - inline QScriptFunction *toFunction() const; - - bool detectedCycle() const; - - QScript::Type m_type; - union { - bool m_bool_value; - int m_int_value; - qsreal m_number_value; - void *m_ptr_value; - QScriptObject *m_object_value; - QScriptNameIdImpl *m_string_value; - QString *m_lazy_string_value; - }; -}; - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif // QSCRIPTVALUEIMPLFWD_P_H diff --git a/src/script/qscriptvalueiterator.h b/src/script/qscriptvalueiterator.h deleted file mode 100644 index 91561e8..0000000 --- a/src/script/qscriptvalueiterator.h +++ /dev/null @@ -1,99 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTVALUEITERATOR_H -#define QSCRIPTVALUEITERATOR_H - -#include <QtScript/qscriptvalue.h> - -#ifndef QT_NO_SCRIPT - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Script) - -class QString; -class QScriptString; - -class QScriptValueIteratorPrivate; -class Q_SCRIPT_EXPORT QScriptValueIterator -{ -public: - QScriptValueIterator(const QScriptValue &value); - ~QScriptValueIterator(); - - bool hasNext() const; - void next(); - - bool hasPrevious() const; - void previous(); - - QString name() const; - QScriptString scriptName() const; - - QScriptValue value() const; - void setValue(const QScriptValue &value); - - QScriptValue::PropertyFlags flags() const; - - void remove(); - - void toFront(); - void toBack(); - - QScriptValueIterator& operator=(QScriptValue &value); - -private: - QScriptValueIteratorPrivate *d_ptr; - - Q_DECLARE_PRIVATE(QScriptValueIterator) - Q_DISABLE_COPY(QScriptValueIterator) -}; - -QT_END_NAMESPACE - -QT_END_HEADER - -#endif // QT_NO_SCRIPT - -#endif // QSCRIPTVALUEITERATOR_H diff --git a/src/script/qscriptvalueiterator_p.h b/src/script/qscriptvalueiterator_p.h deleted file mode 100644 index e1f2815..0000000 --- a/src/script/qscriptvalueiterator_p.h +++ /dev/null @@ -1,75 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTVALUEITERATOR_P_H -#define QSCRIPTVALUEITERATOR_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. -// - -QT_BEGIN_NAMESPACE - -class QScriptValueIteratorImpl; - -class QScriptValueIterator; -class QScriptValueIteratorPrivate -{ - Q_DECLARE_PUBLIC(QScriptValueIterator) -public: - QScriptValueIteratorPrivate(); - ~QScriptValueIteratorPrivate(); - - QScriptValueIterator *q_ptr; - - QScriptValueIteratorImpl *it; -}; - -QT_END_NAMESPACE - -#endif // QSCRIPTVALUEITERATOR_P_H diff --git a/src/script/qscriptvalueiteratorimpl.cpp b/src/script/qscriptvalueiteratorimpl.cpp deleted file mode 100644 index bfe3946..0000000 --- a/src/script/qscriptvalueiteratorimpl.cpp +++ /dev/null @@ -1,415 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qscriptvalueiteratorimpl_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptengine_p.h" -#include "qscriptcontext_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" - -QT_BEGIN_NAMESPACE - -namespace QScript { - -extern QString numberToString(qsreal value); - -} // namespace - -QScriptValueIteratorImpl::QScriptValueIteratorImpl(const QScriptValueImpl &obj) -{ - Q_ASSERT(obj.isObject()); - m_frontObject = obj; - m_member.invalidate(); - m_foundMember.invalidate(); - m_foundForward = false; - m_object = obj; - m_searchIndex = 0; - m_searchClassDataIterator = false; - m_classDataIterator = 0; - m_ignoresDontEnum = true; - m_enumerateProto = false; -} - -QScriptValueIteratorImpl::~QScriptValueIteratorImpl() -{ - if (m_classDataIterator) { - delete m_classDataIterator; - m_classDataIterator = 0; - } -} - -bool QScriptValueIteratorImpl::ignoresDontEnum() const -{ - return m_ignoresDontEnum; -} - -void QScriptValueIteratorImpl::setIgnoresDontEnum(bool ignore) -{ - m_ignoresDontEnum = ignore; -} - -bool QScriptValueIteratorImpl::enumeratePrototype() const -{ - return m_enumerateProto; -} - -void QScriptValueIteratorImpl::setEnumeratePrototype(bool enable) -{ - m_enumerateProto = enable; -} - -bool QScriptValueIteratorImpl::acceptsMember(const QScriptValueImpl &o, - const QScript::Member &m) const -{ - if (!m.isValid() || (!m_ignoresDontEnum && m.dontEnum()) - || (m.isSetter() && !m.isGetter())) { - return false; - } - - if (!m_enumerateProto || QScriptEnginePrivate::strictlyEquals(o, m_frontObject)) - return true; - - // make sure it's not a shadowed property - QScript::Member dummy; - QScriptValueImpl base; - QScriptNameIdImpl *id; - if (m.nameId()) { - id = m.nameId(); - } else { - QScriptEnginePrivate *eng_p = m_frontObject.engine(); - id = eng_p->nameId(QScript::numberToString(m.id())); - } - m_frontObject.resolve(id, &dummy, &base, QScriptValue::ResolvePrototype, QScript::Read); - return QScriptEnginePrivate::strictlyEquals(base, o); -} - -bool QScriptValueIteratorImpl::hasNext() -{ - if (m_foundMember.isValid() && m_foundForward) { - // we have the information about the next element already - return true; - } - - int idx, count; - QScriptValueImpl obj = m_object; - - if (m_searchClassDataIterator) { - Q_ASSERT(m_classDataIterator != 0); - if (m_foundMember.isValid()) { - // undo effect of hasPrevious() - m_foundMember.invalidate(); - QScript::Member dummy; - m_classDataIterator->next(&dummy); - } - goto LSearchClassData; - } - - idx = m_searchIndex; - if (m_foundMember.isValid()) { - // undo effect of hasPrevious() - m_foundMember.invalidate(); - ++idx; - } - - LSearchObjectData: - count = obj.memberCount(); - for (int i = idx; i < count; ++i) { - QScript::Member m; - obj.member(i, &m); - if (acceptsMember(obj, m)) { - m_foundObject = obj; - m_foundMember = m; - m_foundForward = true; - m_searchIndex = i + 1; - return true; - } - } - - if (!m_classDataIterator) { - QScriptClassData *data = obj.classInfo()->data(); - if (!data) - goto LNext; - m_classDataIterator = data->newIterator(obj); - if (!m_classDataIterator) - goto LNext; - } - m_searchClassDataIterator = true; - - LSearchClassData: - Q_ASSERT(m_classDataIterator != 0); - while (m_classDataIterator->hasNext()) { - QScript::Member m; - m_classDataIterator->next(&m); - if (acceptsMember(obj, m)) { - m_foundObject = obj; - m_foundMember = m; - m_foundForward = true; - return true; - } - } - - LNext: - if (!m_enumerateProto || !obj.prototype().isObject()) - return false; - - // look in prototype - obj = obj.prototype(); - idx = 0; - if (m_classDataIterator) { - delete m_classDataIterator; - m_classDataIterator = 0; - m_searchClassDataIterator = false; - } - goto LSearchObjectData; -} - -void QScriptValueIteratorImpl::next() -{ - (void)hasNext(); // sync the next-element info - m_object = m_foundObject; - m_member = m_foundMember; - m_foundObject = QScriptValueImpl(); - m_foundMember.invalidate(); -} - -bool QScriptValueIteratorImpl::hasPrevious() -{ - if (m_foundMember.isValid() && !m_foundForward) { - // we have the information about the previous element already - return true; - } - - QScriptValueImpl obj = m_object; - - if (m_searchClassDataIterator) { - Q_ASSERT(m_classDataIterator != 0); - if (m_foundMember.isValid()) { - // undo effect of hasNext() - m_foundMember.invalidate(); - QScript::Member dummy; - m_classDataIterator->previous(&dummy); - } - while (m_classDataIterator->hasPrevious()) { - QScript::Member m; - m_classDataIterator->previous(&m); - if (acceptsMember(obj, m)) { - m_foundObject = obj; - m_foundMember = m; - m_foundForward = false; - return true; - } - } - m_searchClassDataIterator = false; - m_searchIndex = obj.memberCount(); - m_foundMember.invalidate(); - } - - // search object members - int i = m_searchIndex - 1; - if (m_foundMember.isValid()) { - // undo effect of hasPrevious() - m_foundMember.invalidate(); - --i; - } - for ( ; i >= 0; --i) { - QScript::Member m; - obj.member(i, &m); - if (acceptsMember(obj, m)) { - m_foundObject = obj; - m_foundMember = m; - m_foundForward = false; - m_searchIndex = i; - return true; - } - } - - return false; -} - -void QScriptValueIteratorImpl::previous() -{ - (void)hasPrevious(); // sync the previous-element info - m_object = m_foundObject; - m_member = m_foundMember; - m_foundObject = QScriptValueImpl(); - m_foundMember.invalidate(); -} - -QScript::Member *QScriptValueIteratorImpl::member() -{ - return &m_member; -} - -QScriptNameIdImpl *QScriptValueIteratorImpl::nameId() const -{ - return m_member.nameId(); -} - -QString QScriptValueIteratorImpl::name() const -{ - if (!m_member.isValid()) - return QString(); - if (m_member.nameId()) - return m_member.nameId()->s; - else - return QScript::numberToString(m_member.id()); -} - -QScriptValueImpl QScriptValueIteratorImpl::value() const -{ - if (!m_member.isValid()) - return QScriptValueImpl(); - QScriptValueImpl result; - m_object.get(m_member, &result); - if (m_member.isGetterOrSetter()) { - // find and call the getter - QScriptValueImpl getter; - if (m_member.isObjectProperty() && !m_member.isGetter()) { - QScript::Member mb; - QScriptObject *obj = m_object.m_object_value; - mb.object(m_member.nameId(), obj->memberCount(), 0); - if (!obj->findGetter(&mb)) - return QScriptValueImpl(); - m_object.get(mb, &getter); - } else { - getter = result; - } - result = getter.call(m_object); - } - return result; -} - -void QScriptValueIteratorImpl::setValue(const QScriptValueImpl &value) -{ - if (!m_member.isValid()) - return; - if (m_member.isGetterOrSetter()) { - // find and call the setter - QScriptValueImpl setter; - if (m_member.isObjectProperty() && !m_member.isSetter()) { - QScript::Member mb; - QScriptObject *obj = m_object.m_object_value; - mb.object(m_member.nameId(), obj->memberCount(), 0); - if (!obj->findSetter(&mb)) - return; - m_object.get(mb, &setter); - } else { - m_object.get(m_member, &setter); - } - setter.call(m_object, QScriptValueImplList() << value); - } else { - m_object.put(m_member, value); - } -} - -uint QScriptValueIteratorImpl::flags() const -{ - return m_member.flags(); -} - -QScriptValueImpl QScriptValueIteratorImpl::object() const -{ - return m_object; -} - -void QScriptValueIteratorImpl::setObject(const QScriptValueImpl &obj) -{ - Q_ASSERT(obj.isObject()); - m_object = obj; - if (m_classDataIterator) { - delete m_classDataIterator; - m_classDataIterator = 0; - } - toFront(); -} - -void QScriptValueIteratorImpl::remove() -{ - if (m_member.isValid()) - m_object.removeMember(m_member); -} - -void QScriptValueIteratorImpl::toFront() -{ - if (m_classDataIterator) { - if (!m_enumerateProto || QScriptEnginePrivate::strictlyEquals(m_object, m_frontObject)) { - m_classDataIterator->toFront(); - } else { - delete m_classDataIterator; - m_classDataIterator = 0; - } - } - - m_member.invalidate(); - m_object = m_frontObject; - - m_foundObject = QScriptValueImpl(); - m_foundMember.invalidate(); - m_searchIndex = 0; - m_searchClassDataIterator = false; -} - -void QScriptValueIteratorImpl::toBack() -{ - m_member.invalidate(); - - m_foundObject = QScriptValueImpl(); - m_foundMember.invalidate(); - - if (!m_classDataIterator) { - QScriptClassData *data = m_object.classInfo()->data(); - if (data) - m_classDataIterator = data->newIterator(m_object); - } - if (m_classDataIterator) - m_classDataIterator->toBack(); - else - m_searchIndex = m_object.memberCount(); - m_searchClassDataIterator = (m_classDataIterator != 0); -} - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT diff --git a/src/script/qscriptvalueiteratorimpl_p.h b/src/script/qscriptvalueiteratorimpl_p.h deleted file mode 100644 index 4ee7b11..0000000 --- a/src/script/qscriptvalueiteratorimpl_p.h +++ /dev/null @@ -1,127 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QSCRIPTVALUEITERATORIMPL_P_H -#define QSCRIPTVALUEITERATORIMPL_P_H - -#include "qscriptvalueimplfwd_p.h" - -#ifndef QT_NO_SCRIPT - -#include "qscriptmemberfwd_p.h" - -QT_BEGIN_NAMESPACE - -// -// 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. -// - -class QScriptClassDataIterator; -class QScriptNameIdImpl; - -class QScriptValueIteratorImpl -{ -public: - QScriptValueIteratorImpl(const QScriptValueImpl &obj); - ~QScriptValueIteratorImpl(); - - bool ignoresDontEnum() const; - void setIgnoresDontEnum(bool ignore); - - bool enumeratePrototype() const; - void setEnumeratePrototype(bool enable); - - bool hasNext(); - void next(); - - bool hasPrevious(); - void previous(); - - QScript::Member *member(); - - QScriptNameIdImpl *nameId() const; - QString name() const; - - QScriptValueImpl value() const; - void setValue(const QScriptValueImpl &value); - - uint flags() const; - - void remove(); - - void toFront(); - void toBack(); - - QScriptValueImpl object() const; - void setObject(const QScriptValueImpl &obj); - -private: - bool acceptsMember(const QScriptValueImpl &o, const QScript::Member &m) const; - QScriptClassDataIterator *getClassDataIterator(); - - QScriptValueImpl m_frontObject; - - bool m_ignoresDontEnum; - bool m_enumerateProto; - - QScriptValueImpl m_object; - QScript::Member m_member; - - int m_searchIndex; - QScriptValueImpl m_foundObject; - QScript::Member m_foundMember; - bool m_foundForward; - QScriptClassDataIterator *m_classDataIterator; - bool m_searchClassDataIterator; -}; - -QT_END_NAMESPACE - -#endif // QT_NO_SCRIPT - -#endif diff --git a/src/script/script.pri b/src/script/script.pri index 15e68de..b064185 100644 --- a/src/script/script.pri +++ b/src/script/script.pri @@ -1,124 +1,35 @@ +# FIXME: shared the statically built JavaScriptCore +include($$PWD/../3rdparty/webkit/JavaScriptCore/JavaScriptCore.pri) -*-g++:DEFINES += Q_SCRIPT_DIRECT_CODE +include($$PWD/api/api.pri) +include($$PWD/bridge/bridge.pri) +include($$PWD/parser/parser.pri) +include($$PWD/visitors/visitors.pri) +include($$PWD/utils/utils.pri) -SOURCES += \ - $$PWD/qscriptasm.cpp \ - $$PWD/qscriptast.cpp \ - $$PWD/qscriptastvisitor.cpp \ - $$PWD/qscriptcompiler.cpp \ - $$PWD/qscriptecmaarray.cpp \ - $$PWD/qscriptecmaboolean.cpp \ - $$PWD/qscriptecmacore.cpp \ - $$PWD/qscriptecmadate.cpp \ - $$PWD/qscriptecmafunction.cpp \ - $$PWD/qscriptecmaglobal.cpp \ - $$PWD/qscriptecmamath.cpp \ - $$PWD/qscriptecmanumber.cpp \ - $$PWD/qscriptecmaobject.cpp \ - $$PWD/qscriptecmaregexp.cpp \ - $$PWD/qscriptecmastring.cpp \ - $$PWD/qscriptecmaerror.cpp \ - $$PWD/qscriptcontext_p.cpp \ - $$PWD/qscriptengine.cpp \ - $$PWD/qscriptengine_p.cpp \ - $$PWD/qscriptengineagent.cpp \ - $$PWD/qscriptextenumeration.cpp \ - $$PWD/qscriptextvariant.cpp \ - $$PWD/qscriptcontext.cpp \ - $$PWD/qscriptcontextinfo.cpp \ - $$PWD/qscriptfunction.cpp \ - $$PWD/qscriptgrammar.cpp \ - $$PWD/qscriptlexer.cpp \ - $$PWD/qscriptclassdata.cpp \ - $$PWD/qscriptparser.cpp \ - $$PWD/qscriptprettypretty.cpp \ - $$PWD/qscriptxmlgenerator.cpp \ - $$PWD/qscriptsyntaxchecker.cpp \ - $$PWD/qscriptstring.cpp \ - $$PWD/qscriptclass.cpp \ - $$PWD/qscriptclasspropertyiterator.cpp \ - $$PWD/qscriptvalueiteratorimpl.cpp \ - $$PWD/qscriptvalueiterator.cpp \ - $$PWD/qscriptvalueimpl.cpp \ - $$PWD/qscriptvalue.cpp +INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore +INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/parser +INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/bytecompiler +INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/debugger +INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/runtime +INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/wtf +INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/unicode +INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/interpreter +INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/jit +INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/profiler +INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/wrec +INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/API +INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/bytecode +INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/assembler +INCLUDEPATH += $$PWD/../3rdparty/webkit/JavaScriptCore/generated -HEADERS += \ - $$PWD/qscriptarray_p.h \ - $$PWD/qscriptasm_p.h \ - $$PWD/qscriptastfwd_p.h \ - $$PWD/qscriptast_p.h \ - $$PWD/qscriptastvisitor_p.h \ - $$PWD/qscriptbuffer_p.h \ - $$PWD/qscriptcompiler_p.h \ - $$PWD/qscriptcontext.h \ - $$PWD/qscriptcontextfwd_p.h \ - $$PWD/qscriptcontext_p.h \ - $$PWD/qscriptcontextinfo.h \ - $$PWD/qscriptcontextinfo_p.h \ - $$PWD/qscriptecmaarray_p.h \ - $$PWD/qscriptecmaboolean_p.h \ - $$PWD/qscriptecmacore_p.h \ - $$PWD/qscriptecmadate_p.h \ - $$PWD/qscriptecmafunction_p.h \ - $$PWD/qscriptecmaglobal_p.h \ - $$PWD/qscriptecmamath_p.h \ - $$PWD/qscriptecmanumber_p.h \ - $$PWD/qscriptecmaobject_p.h \ - $$PWD/qscriptecmaregexp_p.h \ - $$PWD/qscriptecmastring_p.h \ - $$PWD/qscriptecmaerror_p.h \ - $$PWD/qscriptengine.h \ - $$PWD/qscriptenginefwd_p.h \ - $$PWD/qscriptengine_p.h \ - $$PWD/qscriptengineagent.h \ - $$PWD/qscriptengineagent_p.h \ - $$PWD/qscriptable.h \ - $$PWD/qscriptable_p.h \ - $$PWD/qscriptextenumeration_p.h \ - $$PWD/qscriptextvariant_p.h \ - $$PWD/qscriptfunction_p.h \ - $$PWD/qscriptgc_p.h \ - $$PWD/qscriptglobals_p.h \ - $$PWD/qscriptgrammar_p.h \ - $$PWD/qscriptobjectdata_p.h \ - $$PWD/qscriptobjectfwd_p.h \ - $$PWD/qscriptobject_p.h \ - $$PWD/qscriptlexer_p.h \ - $$PWD/qscriptmemberfwd_p.h \ - $$PWD/qscriptmember_p.h \ - $$PWD/qscriptmemorypool_p.h \ - $$PWD/qscriptnodepool_p.h \ - $$PWD/qscriptclassinfo_p.h \ - $$PWD/qscriptparser_p.h \ - $$PWD/qscriptprettypretty_p.h \ - $$PWD/qscriptsyntaxcheckresult_p.h \ - $$PWD/qscriptxmlgenerator_p.h \ - $$PWD/qscriptrepository_p.h \ - $$PWD/qscriptsyntaxchecker_p.h \ - $$PWD/qscriptstring.h \ - $$PWD/qscriptstring_p.h \ - $$PWD/qscriptclass.h \ - $$PWD/qscriptclass_p.h \ - $$PWD/qscriptclasspropertyiterator.h \ - $$PWD/qscriptclasspropertyiterator_p.h \ - $$PWD/qscriptvalue.h \ - $$PWD/qscriptvaluefwd_p.h \ - $$PWD/qscriptvalue_p.h \ - $$PWD/qscriptvalueimplfwd_p.h \ - $$PWD/qscriptvalueimpl_p.h \ - $$PWD/qscriptvalueiteratorimpl_p.h \ - $$PWD/qscriptvalueiterator.h \ - $$PWD/qscriptvalueiterator_p.h \ - $$PWD/qscriptextensioninterface.h \ - $$PWD/qscriptextensionplugin.h \ - $$PWD/qscriptnameid_p.h \ - $$PWD/qscriptclassdata_p.h +# FIXME: not needed once JSCBISON works +# TODO: or leave it like this since the generated file is available anyway? +SOURCES += $$PWD/../3rdparty/webkit/JavaScriptCore/generated/Grammar.cpp + +DEFINES += BUILDING_QT__=1 +DEFINES += USE_SYSTEM_MALLOC +DEFINES += WTF_USE_JAVASCRIPTCORE_BINDINGS=1 +DEFINES += WTF_CHANGES=1 +DEFINES += NDEBUG -!contains(DEFINES, QT_NO_QOBJECT) { - HEADERS += $$PWD/qscriptextqobject_p.h - SOURCES += $$PWD/qscriptextqobject.cpp \ - $$PWD/qscriptable.cpp \ - $$PWD/qscriptextensionplugin.cpp -} else { - INCLUDEPATH += $$PWD -} diff --git a/src/script/utils/qscriptdate.cpp b/src/script/utils/qscriptdate.cpp new file mode 100644 index 0000000..43314c2 --- /dev/null +++ b/src/script/utils/qscriptdate.cpp @@ -0,0 +1,491 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +****************************************************************************/ + +#include "qscriptdate_p.h" + +#ifndef QT_NO_SCRIPT + +#include <QtCore/qnumeric.h> +#include <QtCore/qstringlist.h> + +#include <math.h> + +#ifndef Q_WS_WIN +# include <time.h> +# include <sys/time.h> +#else +# include <windows.h> +#endif + +QT_BEGIN_NAMESPACE + +namespace QScript { + +qsreal ToInteger(qsreal n); + +static const qsreal HoursPerDay = 24.0; +static const qsreal MinutesPerHour = 60.0; +static const qsreal SecondsPerMinute = 60.0; +static const qsreal msPerSecond = 1000.0; +static const qsreal msPerMinute = 60000.0; +static const qsreal msPerHour = 3600000.0; +static const qsreal msPerDay = 86400000.0; + +static qsreal LocalTZA = 0.0; // initialized at startup + +static inline qsreal TimeWithinDay(qsreal t) +{ + qsreal r = ::fmod(t, msPerDay); + return (r >= 0) ? r : r + msPerDay; +} + +static inline int HourFromTime(qsreal t) +{ + int r = int(::fmod(::floor(t / msPerHour), HoursPerDay)); + return (r >= 0) ? r : r + int(HoursPerDay); +} + +static inline int MinFromTime(qsreal t) +{ + int r = int(::fmod(::floor(t / msPerMinute), MinutesPerHour)); + return (r >= 0) ? r : r + int(MinutesPerHour); +} + +static inline int SecFromTime(qsreal t) +{ + int r = int(::fmod(::floor(t / msPerSecond), SecondsPerMinute)); + return (r >= 0) ? r : r + int(SecondsPerMinute); +} + +static inline int msFromTime(qsreal t) +{ + int r = int(::fmod(t, msPerSecond)); + return (r >= 0) ? r : r + int(msPerSecond); +} + +static inline qsreal Day(qsreal t) +{ + return ::floor(t / msPerDay); +} + +static inline qsreal DaysInYear(qsreal y) +{ + if (::fmod(y, 4)) + return 365; + + else if (::fmod(y, 100)) + return 366; + + else if (::fmod(y, 400)) + return 365; + + return 366; +} + +static inline qsreal DayFromYear(qsreal y) +{ + return 365 * (y - 1970) + + ::floor((y - 1969) / 4) + - ::floor((y - 1901) / 100) + + ::floor((y - 1601) / 400); +} + +static inline qsreal TimeFromYear(qsreal y) +{ + return msPerDay * DayFromYear(y); +} + +static inline qsreal YearFromTime(qsreal t) +{ + int y = 1970; + y += (int) ::floor(t / (msPerDay * 365.2425)); + + qsreal t2 = TimeFromYear(y); + return (t2 > t) ? y - 1 : ((t2 + msPerDay * DaysInYear(y)) <= t) ? y + 1 : y; +} + +static inline bool InLeapYear(qsreal t) +{ + qsreal x = DaysInYear(YearFromTime(t)); + if (x == 365) + return 0; + + Q_ASSERT (x == 366); + return 1; +} + +static inline qsreal DayWithinYear(qsreal t) +{ + return Day(t) - DayFromYear(YearFromTime(t)); +} + +static inline qsreal MonthFromTime(qsreal t) +{ + qsreal d = DayWithinYear(t); + qsreal l = InLeapYear(t); + + if (d < 31.0) + return 0; + + else if (d < 59.0 + l) + return 1; + + else if (d < 90.0 + l) + return 2; + + else if (d < 120.0 + l) + return 3; + + else if (d < 151.0 + l) + return 4; + + else if (d < 181.0 + l) + return 5; + + else if (d < 212.0 + l) + return 6; + + else if (d < 243.0 + l) + return 7; + + else if (d < 273.0 + l) + return 8; + + else if (d < 304.0 + l) + return 9; + + else if (d < 334.0 + l) + return 10; + + else if (d < 365.0 + l) + return 11; + + return qSNaN(); // ### assert? +} + +static inline qsreal DateFromTime(qsreal t) +{ + int m = (int) ToInteger(MonthFromTime(t)); + qsreal d = DayWithinYear(t); + qsreal l = InLeapYear(t); + + switch (m) { + case 0: return d + 1.0; + case 1: return d - 30.0; + case 2: return d - 58.0 - l; + case 3: return d - 89.0 - l; + case 4: return d - 119.0 - l; + case 5: return d - 150.0 - l; + case 6: return d - 180.0 - l; + case 7: return d - 211.0 - l; + case 8: return d - 242.0 - l; + case 9: return d - 272.0 - l; + case 10: return d - 303.0 - l; + case 11: return d - 333.0 - l; + } + + return qSNaN(); // ### assert +} + +static inline qsreal WeekDay(qsreal t) +{ + qsreal r = ::fmod (Day(t) + 4.0, 7.0); + return (r >= 0) ? r : r + 7.0; +} + + +static inline qsreal MakeTime(qsreal hour, qsreal min, qsreal sec, qsreal ms) +{ + return ((hour * MinutesPerHour + min) * SecondsPerMinute + sec) * msPerSecond + ms; +} + +static inline qsreal DayFromMonth(qsreal month, qsreal leap) +{ + switch ((int) month) { + case 0: return 0; + case 1: return 31.0; + case 2: return 59.0 + leap; + case 3: return 90.0 + leap; + case 4: return 120.0 + leap; + case 5: return 151.0 + leap; + case 6: return 181.0 + leap; + case 7: return 212.0 + leap; + case 8: return 243.0 + leap; + case 9: return 273.0 + leap; + case 10: return 304.0 + leap; + case 11: return 334.0 + leap; + } + + return qSNaN(); // ### assert? +} + +static qsreal MakeDay(qsreal year, qsreal month, qsreal day) +{ + year += ::floor(month / 12.0); + + month = ::fmod(month, 12.0); + if (month < 0) + month += 12.0; + + qsreal t = TimeFromYear(year); + qsreal leap = InLeapYear(t); + + day += ::floor(t / msPerDay); + day += DayFromMonth(month, leap); + + return day - 1; +} + +static inline qsreal MakeDate(qsreal day, qsreal time) +{ + return day * msPerDay + time; +} + +static inline qsreal DaylightSavingTA(double t) +{ +#ifndef Q_WS_WIN + long int tt = (long int)(t / msPerSecond); + struct tm *tmtm = localtime((const time_t*)&tt); + if (! tmtm) + return 0; + return (tmtm->tm_isdst > 0) ? msPerHour : 0; +#else + Q_UNUSED(t); + /// ### implement me + return 0; +#endif +} + +static inline qsreal LocalTime(qsreal t) +{ + return t + LocalTZA + DaylightSavingTA(t); +} + +static inline qsreal UTC(qsreal t) +{ + return t - LocalTZA - DaylightSavingTA(t - LocalTZA); +} + +static inline qsreal currentTime() +{ +#ifndef Q_WS_WIN + struct timeval tv; + + gettimeofday(&tv, 0); + return ::floor(tv.tv_sec * msPerSecond + (tv.tv_usec / 1000.0)); +#else + SYSTEMTIME st; + GetSystemTime(&st); + FILETIME ft; + SystemTimeToFileTime(&st, &ft); + LARGE_INTEGER li; + li.LowPart = ft.dwLowDateTime; + li.HighPart = ft.dwHighDateTime; + return double(li.QuadPart - Q_INT64_C(116444736000000000)) / 10000.0; +#endif +} + +static inline qsreal TimeClip(qsreal t) +{ + if (! qIsFinite(t) || fabs(t) > 8.64e15) + return qSNaN(); + return ToInteger(t); +} + +static inline qsreal ParseString(const QString &s) +{ + QDateTime dt = QDateTime::fromString(s, Qt::TextDate); + if (!dt.isValid()) + dt = QDateTime::fromString(s, Qt::ISODate); + if (!dt.isValid()) { + QStringList formats; + formats << QLatin1String("M/d/yyyy") + << QLatin1String("M/d/yyyy hh:mm") + << QLatin1String("M/d/yyyy hh:mm A") + + << QLatin1String("M/d/yyyy, hh:mm") + << QLatin1String("M/d/yyyy, hh:mm A") + + << QLatin1String("MMM d yyyy") + << QLatin1String("MMM d yyyy hh:mm") + << QLatin1String("MMM d yyyy hh:mm:ss") + << QLatin1String("MMM d yyyy, hh:mm") + << QLatin1String("MMM d yyyy, hh:mm:ss") + + << QLatin1String("MMMM d yyyy") + << QLatin1String("MMMM d yyyy hh:mm") + << QLatin1String("MMMM d yyyy hh:mm:ss") + << QLatin1String("MMMM d yyyy, hh:mm") + << QLatin1String("MMMM d yyyy, hh:mm:ss") + + << QLatin1String("MMM d, yyyy") + << QLatin1String("MMM d, yyyy hh:mm") + << QLatin1String("MMM d, yyyy hh:mm:ss") + + << QLatin1String("MMMM d, yyyy") + << QLatin1String("MMMM d, yyyy hh:mm") + << QLatin1String("MMMM d, yyyy hh:mm:ss") + + << QLatin1String("d MMM yyyy") + << QLatin1String("d MMM yyyy hh:mm") + << QLatin1String("d MMM yyyy hh:mm:ss") + << QLatin1String("d MMM yyyy, hh:mm") + << QLatin1String("d MMM yyyy, hh:mm:ss") + + << QLatin1String("d MMMM yyyy") + << QLatin1String("d MMMM yyyy hh:mm") + << QLatin1String("d MMMM yyyy hh:mm:ss") + << QLatin1String("d MMMM yyyy, hh:mm") + << QLatin1String("d MMMM yyyy, hh:mm:ss") + + << QLatin1String("d MMM, yyyy") + << QLatin1String("d MMM, yyyy hh:mm") + << QLatin1String("d MMM, yyyy hh:mm:ss") + + << QLatin1String("d MMMM, yyyy") + << QLatin1String("d MMMM, yyyy hh:mm") + << QLatin1String("d MMMM, yyyy hh:mm:ss"); + + for (int i = 0; i < formats.size(); ++i) { + dt = QDateTime::fromString(s, formats.at(i)); + if (dt.isValid()) + break; + } + } + return FromDateTime(dt); +} + +static inline QString ToString(qsreal t) +{ + if (qIsNaN(t)) + return QLatin1String("Invalid Date"); + QString str = ToDateTime(t, Qt::LocalTime).toString() + QLatin1String(" GMT"); + qsreal tzoffset = LocalTZA + DaylightSavingTA(t); + if (tzoffset) { + int hours = tzoffset / 1000 / 60 / 60; + int mins = int(tzoffset / 1000 / 60) % 60; + str.append(QLatin1Char((tzoffset > 0) ? '+' : '-')); + if (hours < 10) + str.append(QLatin1Char('0')); + str.append(QString::number(hours)); + if (mins < 10) + str.append(QLatin1Char('0')); + str.append(QString::number(mins)); + } + return str; +} + +static inline QString ToUTCString(qsreal t) +{ + if (qIsNaN(t)) + return QLatin1String("Invalid Date"); + return ToDateTime(t, Qt::UTC).toString() + QLatin1String(" GMT"); +} + +static inline QString ToDateString(qsreal t) +{ + return ToDateTime(t, Qt::LocalTime).date().toString(); +} + +static inline QString ToTimeString(qsreal t) +{ + return ToDateTime(t, Qt::LocalTime).time().toString(); +} + +static inline QString ToLocaleString(qsreal t) +{ + return ToDateTime(t, Qt::LocalTime).toString(Qt::LocaleDate); +} + +static inline QString ToLocaleDateString(qsreal t) +{ + return ToDateTime(t, Qt::LocalTime).date().toString(Qt::LocaleDate); +} + +static inline QString ToLocaleTimeString(qsreal t) +{ + return ToDateTime(t, Qt::LocalTime).time().toString(Qt::LocaleDate); +} + +static qsreal getLocalTZA() +{ +#ifndef Q_WS_WIN + struct tm* t; + time_t curr; + time(&curr); + t = localtime(&curr); + time_t locl = mktime(t); + t = gmtime(&curr); + time_t globl = mktime(t); + return double(locl - globl) * 1000.0; +#else + TIME_ZONE_INFORMATION tzInfo; + GetTimeZoneInformation(&tzInfo); + return -tzInfo.Bias * 60.0 * 1000.0; +#endif +} + +/*! + \internal + + Converts the QDateTime \dt to an ECMA Date value (in UTC form). +*/ +qsreal FromDateTime(const QDateTime &dt) +{ + if (!dt.isValid()) + return qSNaN(); + if (!LocalTZA) // ### move + LocalTZA = getLocalTZA(); + QDate date = dt.date(); + QTime taim = dt.time(); + int year = date.year(); + int month = date.month() - 1; + int day = date.day(); + int hours = taim.hour(); + int mins = taim.minute(); + int secs = taim.second(); + int ms = taim.msec(); + double t = MakeDate(MakeDay(year, month, day), + MakeTime(hours, mins, secs, ms)); + if (dt.timeSpec() == Qt::LocalTime) + t = UTC(t); + return TimeClip(t); +} + +/*! + \internal + + Converts the ECMA Date value \tt (in UTC form) to QDateTime + according to \a spec. +*/ +QDateTime ToDateTime(qsreal t, Qt::TimeSpec spec) +{ + if (qIsNaN(t)) + return QDateTime(); + if (!LocalTZA) // ### move + LocalTZA = getLocalTZA(); + if (spec == Qt::LocalTime) + t = LocalTime(t); + int year = int(YearFromTime(t)); + int month = int(MonthFromTime(t) + 1); + int day = int(DateFromTime(t)); + int hours = HourFromTime(t); + int mins = MinFromTime(t); + int secs = SecFromTime(t); + int ms = msFromTime(t); + return QDateTime(QDate(year, month, day), QTime(hours, mins, secs, ms), spec); +} + +} // namespace QScript + +QT_END_NAMESPACE + +#endif // QT_NO_SCRIPT diff --git a/src/script/utils/qscriptdate_p.h b/src/script/utils/qscriptdate_p.h new file mode 100644 index 0000000..94b30cb --- /dev/null +++ b/src/script/utils/qscriptdate_p.h @@ -0,0 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the $MODULE$ of the Qt Toolkit. +** +** $TROLLTECH_DUAL_LICENSE$ +** +****************************************************************************/ + +#ifndef QSCRIPTDATE_P_H +#define QSCRIPTDATE_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 <QtCore/qdatetime.h> + +#ifndef QT_NO_SCRIPT + +QT_BEGIN_NAMESPACE + +typedef double qsreal; + +namespace QScript +{ + qsreal FromDateTime(const QDateTime &dt); + QDateTime ToDateTime(qsreal t, Qt::TimeSpec spec); +} + +QT_END_NAMESPACE + +#endif // QT_NO_SCRIPT + +#endif diff --git a/src/script/utils/utils.pri b/src/script/utils/utils.pri new file mode 100644 index 0000000..d8302d5 --- /dev/null +++ b/src/script/utils/utils.pri @@ -0,0 +1,5 @@ +SOURCES += \ + $$PWD/qscriptdate.cpp + +HEADERS += \ + $$PWD/qscriptdate_p.h diff --git a/src/script/qscriptprettypretty.cpp b/src/script/visitors/qscriptprettypretty.cpp index b221b0a..06faac9 100644 --- a/src/script/qscriptprettypretty.cpp +++ b/src/script/visitors/qscriptprettypretty.cpp @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ @@ -43,12 +13,7 @@ #ifndef QT_NO_SCRIPT -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" -#include "qscriptast_p.h" +#include "../parser/qscriptast_p.h" #include <QtCore/QString> #include <QtCore/QTextStream> @@ -56,6 +21,8 @@ QT_BEGIN_NAMESPACE +typedef double qsreal; // ### + namespace QScript { QString numberToString(qsreal value); } @@ -182,7 +149,8 @@ void PrettyPretty::endVisit(AST::ThisExpression *node) bool PrettyPretty::visit(AST::IdentifierExpression *node) { - out << QScriptEnginePrivate::toString(node->name); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); +// out << QScriptEnginePrivate::toString(node->name); return true; } @@ -229,9 +197,10 @@ void PrettyPretty::endVisit(AST::FalseLiteral *node) bool PrettyPretty::visit(AST::StringLiteral *node) { - QString lit = QScriptEnginePrivate::toString(node->value); - lit.replace(QLatin1Char('\\'), QLatin1String("\\\\")); - out << '\"' << lit << '\"'; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); + QString lit = QString(); // QScriptEnginePrivate::toString(node->value); + lit.replace(QLatin1String("\\"), QLatin1String("\\\\")); + out << "\"" << lit << "\""; return false; } @@ -242,7 +211,8 @@ void PrettyPretty::endVisit(AST::StringLiteral *node) bool PrettyPretty::visit(AST::NumericLiteral *node) { - out << QScript::numberToString(node->value); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); +// out << QScript::numberToString(node->value); return true; } @@ -253,9 +223,10 @@ void PrettyPretty::endVisit(AST::NumericLiteral *node) bool PrettyPretty::visit(AST::RegExpLiteral *node) { - out << '/' << QScriptEnginePrivate::toString(node->pattern) << '/'; - if (node->flags) - out << QScript::Ecma::RegExp::flagsToString(node->flags); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); +// out << "/" << QScriptEnginePrivate::toString(node->pattern) << "/"; +// if (node->flags) +// out << QScript::Ecma::RegExp::flagsToString(node->flags); return true; } @@ -348,7 +319,8 @@ void PrettyPretty::endVisit(AST::PropertyNameAndValueList *node) bool PrettyPretty::visit(AST::IdentifierPropertyName *node) { - out << QScriptEnginePrivate::toString(node->id); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); +// out << QScriptEnginePrivate::toString(node->id); return false; } @@ -359,9 +331,10 @@ void PrettyPretty::endVisit(AST::IdentifierPropertyName *node) bool PrettyPretty::visit(AST::StringLiteralPropertyName *node) { - QString lit = QScriptEnginePrivate::toString(node->id); - lit.replace(QLatin1String("\\"), QLatin1String("\\\\")); - out << lit; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); +// QString lit = QScriptEnginePrivate::toString(node->id); +// lit.replace(QLatin1String("\\"), QLatin1String("\\\\")); +// out << lit; return false; } @@ -398,7 +371,8 @@ void PrettyPretty::endVisit(AST::ArrayMemberExpression *node) bool PrettyPretty::visit(AST::FieldMemberExpression *node) { accept(node->base); - out << '.' << QScriptEnginePrivate::toString(node->name); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); +// out << "." << QScriptEnginePrivate::toString(node->name); return false; } @@ -803,7 +777,8 @@ void PrettyPretty::endVisit(AST::VariableStatement *node) bool PrettyPretty::visit(AST::VariableDeclaration *node) { - out << QScriptEnginePrivate::toString(node->name); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); +// out << QScriptEnginePrivate::toString(node->name); if (node->expression) { out << " = "; accept(node->expression); @@ -959,7 +934,8 @@ bool PrettyPretty::visit(AST::ContinueStatement *node) { out << "continue"; if (node->label) { - out << ' ' << QScriptEnginePrivate::toString(node->label); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); +// out << " " << QScriptEnginePrivate::toString(node->label); } out << ';'; return false; @@ -974,7 +950,8 @@ bool PrettyPretty::visit(AST::BreakStatement *node) { out << "break"; if (node->label) { - out << ' ' << QScriptEnginePrivate::toString(node->label); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); +// out << " " << QScriptEnginePrivate::toString(node->label); } out << ';'; return false; @@ -1095,7 +1072,8 @@ void PrettyPretty::endVisit(AST::DefaultClause *node) bool PrettyPretty::visit(AST::LabelledStatement *node) { - out << QScriptEnginePrivate::toString(node->label) << ": "; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); +// out << QScriptEnginePrivate::toString(node->label) << ": "; return true; } @@ -1123,7 +1101,8 @@ bool PrettyPretty::visit(AST::TryStatement *node) out << "try "; acceptAsBlock(node->statement); if (node->catchExpression) { - out << " catch (" << QScriptEnginePrivate::toString(node->catchExpression->name) << ") "; + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); +// out << " catch (" << QScriptEnginePrivate::toString(node->catchExpression->name) << ") "; acceptAsBlock(node->catchExpression->statement); } if (node->finallyExpression) { @@ -1165,14 +1144,16 @@ bool PrettyPretty::visit(AST::FunctionDeclaration *node) { out << "function"; - if (node->name) - out << ' ' << QScriptEnginePrivate::toString(node->name); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); +// if (node->name) +// out << " " << QScriptEnginePrivate::toString(node->name); // the arguments out << '('; for (AST::FormalParameterList *it = node->formals; it; it = it->next) { - if (it->name) - out << QScriptEnginePrivate::toString(it->name); + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); +// if (it->name) +// out << QScriptEnginePrivate::toString(it->name); if (it->next) out << ", "; @@ -1202,16 +1183,17 @@ void PrettyPretty::endVisit(AST::FunctionDeclaration *node) bool PrettyPretty::visit(AST::FunctionExpression *node) { + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); out << "function"; - if (node->name) - out << ' ' << QScriptEnginePrivate::toString(node->name); +// if (node->name) +// out << " " << QScriptEnginePrivate::toString(node->name); // the arguments out << '('; for (AST::FormalParameterList *it = node->formals; it; it = it->next) { - if (it->name) - out << QScriptEnginePrivate::toString(it->name); +// if (it->name) +// out << QScriptEnginePrivate::toString(it->name); if (it->next) out << ", "; diff --git a/src/script/qscriptprettypretty_p.h b/src/script/visitors/qscriptprettypretty_p.h index b757cc0..eaa73cb 100644 --- a/src/script/qscriptprettypretty_p.h +++ b/src/script/visitors/qscriptprettypretty_p.h @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ @@ -55,7 +25,7 @@ #include <QtCore/qglobal.h> -#include "qscriptastvisitor_p.h" +#include "../parser/qscriptastvisitor_p.h" QT_BEGIN_NAMESPACE diff --git a/src/script/qscriptxmlgenerator.cpp b/src/script/visitors/qscriptxmlgenerator.cpp index 163b60c..c530d48 100644 --- a/src/script/qscriptxmlgenerator.cpp +++ b/src/script/visitors/qscriptxmlgenerator.cpp @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ @@ -43,20 +13,15 @@ #ifndef QT_NO_SCRIPT -#include "qscriptast_p.h" -#include "qscriptengine_p.h" -#include "qscriptvalueimpl_p.h" -#include "qscriptcontext_p.h" -#include "qscriptmember_p.h" -#include "qscriptobject_p.h" -#include "qscriptlexer_p.h" -#include "qscriptparser_p.h" +#include "../parser/qscriptast_p.h" #include <QtCore/qstring.h> #include <QtCore/qtextstream.h> QT_BEGIN_NAMESPACE +typedef double qsreal; // ### + namespace QScript { extern QString numberToString(qsreal value); @@ -91,21 +56,7 @@ XmlGenerator::~XmlGenerator() QTextStream &XmlGenerator::operator()(const QString &program, int lineNumber) { - QScriptEnginePrivate priv; - NodePool *pool = new NodePool(/*fileName=*/QString(), &priv); - priv.setNodePool(pool); - - Lexer lex(&priv); - priv.setLexer(&lex); - lex.setCode(program, lineNumber); - - QScriptParser parser; - if (parser.parse(&priv)) { - accept(priv.abstractSyntaxTree()); - } - - delete pool; - + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); return out; } @@ -156,8 +107,9 @@ void XmlGenerator::endVisit(AST::ThisExpression *) bool XmlGenerator::visit(AST::IdentifierExpression *node) { + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); startTag(QLatin1String("identifier")); - out << escape(QScriptEnginePrivate::toString(node->name)); +// out << escape(QScriptEnginePrivate::toString(node->name)); out << QLatin1String("</identifier>"); popIndentLevel(); return false; @@ -208,8 +160,9 @@ void XmlGenerator::endVisit(AST::FalseLiteral *) bool XmlGenerator::visit(AST::StringLiteral *node) { + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); startTag(QLatin1String("string")); - out << escape(QScriptEnginePrivate::toString(node->value)) << QLatin1String("</string>"); +// out << escape(QScriptEnginePrivate::toString(node->value)) << QLatin1String("</string>"); popIndentLevel(); return false; } @@ -232,10 +185,11 @@ void XmlGenerator::endVisit(AST::NumericLiteral *) bool XmlGenerator::visit(AST::RegExpLiteral *node) { + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); startTag(QLatin1String("regexp")); - out << QLatin1Char('/') << escape(QScriptEnginePrivate::toString(node->pattern)) << QLatin1Char('/'); - if (node->flags) - out << QScript::Ecma::RegExp::flagsToString(node->flags); +// out << QLatin1String("/") << escape(QScriptEnginePrivate::toString(node->pattern)) << QLatin1String("/"); +// if (node->flags) +// out << QScript::Ecma::RegExp::flagsToString(node->flags); out << QLatin1String("</regexp>"); popIndentLevel(); return false; @@ -302,8 +256,9 @@ void XmlGenerator::endVisit(AST::PropertyNameAndValueList *) bool XmlGenerator::visit(AST::IdentifierPropertyName *node) { + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); startTag(QLatin1String("identifier")); - out << escape(QScriptEnginePrivate::toString(node->id)) << QLatin1String("</identifier>"); +// out << escape(QScriptEnginePrivate::toString(node->id)) << QLatin1String("</identifier>"); popIndentLevel(); return false; } @@ -314,8 +269,9 @@ void XmlGenerator::endVisit(AST::IdentifierPropertyName *) bool XmlGenerator::visit(AST::StringLiteralPropertyName *node) { + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); startTag(QLatin1String("string")); - out << escape(QScriptEnginePrivate::toString(node->id)) << QLatin1String("</string>"); +// out << escape(QScriptEnginePrivate::toString(node->id)) << QLatin1String("</string>"); popIndentLevel(); return false; } @@ -326,8 +282,9 @@ void XmlGenerator::endVisit(AST::StringLiteralPropertyName *) bool XmlGenerator::visit(AST::NumericLiteralPropertyName *node) { + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); startTag(QLatin1String("number")); - out << escape(QScript::numberToString(node->id)) << QLatin1String("</number>"); +// out << escape(QScript::numberToString(node->id)) << QLatin1String("</number>"); popIndentLevel(); return false; } @@ -355,8 +312,9 @@ bool XmlGenerator::visit(AST::FieldMemberExpression *) void XmlGenerator::endVisit(AST::FieldMemberExpression *node) { + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); startTag(QLatin1String("identifier")); - out << escape(QScriptEnginePrivate::toString(node->name)); +// out << escape(QScriptEnginePrivate::toString(node->name)); out << QLatin1String("</identifier>"); popIndentLevel(); endTag(QLatin1String("field-member-expression")); @@ -683,9 +641,10 @@ void XmlGenerator::endVisit(AST::VariableStatement *) bool XmlGenerator::visit(AST::VariableDeclaration *node) { + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); startTag(QLatin1String("variable-declaration"), node); startTag(QLatin1String("name")); - out << escape(QScriptEnginePrivate::toString(node->name)); +// out << escape(QScriptEnginePrivate::toString(node->name)); out << QLatin1String("</name>"); popIndentLevel(); return true; @@ -797,10 +756,11 @@ void XmlGenerator::endVisit(AST::LocalForEachStatement *) bool XmlGenerator::visit(AST::ContinueStatement *node) { + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); startTag(QLatin1String("continue"), node); if (node->label) { startTag(QLatin1String("label")); - out << escape(QScriptEnginePrivate::toString(node->label)); +// out << escape(QScriptEnginePrivate::toString(node->label)); out << QLatin1String("</label>"); popIndentLevel(); } @@ -814,10 +774,11 @@ void XmlGenerator::endVisit(AST::ContinueStatement *) bool XmlGenerator::visit(AST::BreakStatement *node) { + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); startTag(QLatin1String("break"), node); if (node->label) { startTag(QLatin1String("label")); - out << escape(QScriptEnginePrivate::toString(node->label)); +// out << escape(QScriptEnginePrivate::toString(node->label)); out << QLatin1String("</label>"); popIndentLevel(); } @@ -908,9 +869,10 @@ void XmlGenerator::endVisit(AST::DefaultClause *) bool XmlGenerator::visit(AST::LabelledStatement *node) { + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); startTag(QLatin1String("labelled-statement"), node); startTag(QLatin1String("label")); - out << escape(QScriptEnginePrivate::toString(node->label)); +// out << escape(QScriptEnginePrivate::toString(node->label)); out << QLatin1String("</label>"); popIndentLevel(); return true; @@ -945,9 +907,10 @@ void XmlGenerator::endVisit(AST::TryStatement *) bool XmlGenerator::visit(AST::Catch *node) { + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); startTag(QLatin1String("catch")); startTag(QLatin1String("identifier")); - out << escape(QScriptEnginePrivate::toString(node->name)); +// out << escape(QScriptEnginePrivate::toString(node->name)); out << QLatin1String("</identifier>"); popIndentLevel(); return true; @@ -971,10 +934,11 @@ void XmlGenerator::endVisit(AST::Finally *) bool XmlGenerator::visit(AST::FunctionDeclaration *node) { + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); startTag(QLatin1String("function-declaration"), node); startTag(QLatin1String("name")); - if (node->name) - out << escape(QScriptEnginePrivate::toString(node->name)); +// if (node->name) +// out << escape(QScriptEnginePrivate::toString(node->name)); out << QLatin1String("</name>"); popIndentLevel(); if (!node->formals) { @@ -995,10 +959,11 @@ void XmlGenerator::endVisit(AST::FunctionDeclaration *) bool XmlGenerator::visit(AST::FunctionExpression *node) { + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); startTag(QLatin1String("function-expression"), node); startTag(QLatin1String("name")); - if (node->name) - out << escape(QScriptEnginePrivate::toString(node->name)); +// if (node->name) +// out << escape(QScriptEnginePrivate::toString(node->name)); out << QLatin1String("</name>"); if (!node->formals) { startTag(QLatin1String("formal-parameter-list")); @@ -1018,11 +983,12 @@ void XmlGenerator::endVisit(AST::FunctionExpression *) bool XmlGenerator::visit(AST::FormalParameterList *node) { + Q_ASSERT_X(false, Q_FUNC_INFO, "not implemented"); Q_UNUSED(node); startTag(QLatin1String("formal-parameter-list")); for (AST::FormalParameterList *it = node; it; it = it->next) { startTag(QLatin1String("identifier")); - out << escape(QScriptEnginePrivate::toString(it->name)); +// out << escape(QScriptEnginePrivate::toString(it->name)); out << QLatin1String("</identifier>"); popIndentLevel(); } diff --git a/src/script/qscriptxmlgenerator_p.h b/src/script/visitors/qscriptxmlgenerator_p.h index c496816..cb6c0f5 100644 --- a/src/script/qscriptxmlgenerator_p.h +++ b/src/script/visitors/qscriptxmlgenerator_p.h @@ -1,41 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). ** Contact: Qt Software Information (qt-info@nokia.com) ** -** This file is part of the QtScript module of the Qt Toolkit. +** This file is part of the $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 qt-sales@nokia.com. -** $QT_END_LICENSE$ +** $TROLLTECH_DUAL_LICENSE$ ** ****************************************************************************/ @@ -57,7 +27,7 @@ #ifndef QT_NO_SCRIPT -#include "qscriptastvisitor_p.h" +#include "../parser/qscriptastvisitor_p.h" QT_BEGIN_NAMESPACE |