summaryrefslogtreecommitdiffstats
path: root/src/script
diff options
context:
space:
mode:
Diffstat (limited to 'src/script')
-rw-r--r--src/script/api/api.pri32
-rw-r--r--src/script/api/qscriptable.cpp (renamed from src/script/qscriptable.cpp)44
-rw-r--r--src/script/api/qscriptable.h59
-rw-r--r--src/script/api/qscriptable_p.h53
-rw-r--r--src/script/api/qscriptclass.cpp (renamed from src/script/qscriptclass.cpp)333
-rw-r--r--src/script/api/qscriptclass.h (renamed from src/script/qscriptclass.h)36
-rw-r--r--src/script/api/qscriptclasspropertyiterator.cpp (renamed from src/script/qscriptclasspropertyiterator.cpp)55
-rw-r--r--src/script/api/qscriptclasspropertyiterator.h66
-rw-r--r--src/script/api/qscriptcontext.cpp (renamed from src/script/qscriptcontext.cpp)303
-rw-r--r--src/script/api/qscriptcontext.h (renamed from src/script/qscriptcontext.h)36
-rw-r--r--src/script/api/qscriptcontext_p.h67
-rw-r--r--src/script/api/qscriptcontextinfo.cpp (renamed from src/script/qscriptcontextinfo.cpp)237
-rw-r--r--src/script/api/qscriptcontextinfo.h (renamed from src/script/qscriptcontextinfo.h)36
-rw-r--r--src/script/api/qscriptengine.cpp (renamed from src/script/qscriptengine.cpp)1206
-rw-r--r--src/script/api/qscriptengine.h (renamed from src/script/qscriptengine.h)42
-rw-r--r--src/script/api/qscriptengine_p.h157
-rw-r--r--src/script/api/qscriptengineagent.cpp (renamed from src/script/qscriptengineagent.cpp)62
-rw-r--r--src/script/api/qscriptengineagent.h (renamed from src/script/qscriptengineagent.h)36
-rw-r--r--src/script/api/qscriptengineagent_p.h51
-rw-r--r--src/script/api/qscriptextensioninterface.h43
-rw-r--r--src/script/api/qscriptextensionplugin.cpp (renamed from src/script/qscriptextensionplugin.cpp)36
-rw-r--r--src/script/api/qscriptextensionplugin.h49
-rw-r--r--src/script/api/qscriptstring.cpp (renamed from src/script/qscriptstring.cpp)80
-rw-r--r--src/script/api/qscriptstring.h56
-rw-r--r--src/script/api/qscriptstring_p.h51
-rw-r--r--src/script/api/qscriptvalue.cpp (renamed from src/script/qscriptvalue.cpp)1225
-rw-r--r--src/script/api/qscriptvalue.h (renamed from src/script/qscriptvalue.h)42
-rw-r--r--src/script/api/qscriptvalue_p.h78
-rw-r--r--src/script/api/qscriptvalueiterator.cpp (renamed from src/script/qscriptvalueiterator.cpp)139
-rw-r--r--src/script/api/qscriptvalueiterator.h69
-rw-r--r--src/script/bridge/bridge.pri9
-rw-r--r--src/script/bridge/qscriptfunction.cpp137
-rw-r--r--src/script/bridge/qscriptfunction_p.h92
-rw-r--r--src/script/bridge/qscriptqobject.cpp1338
-rw-r--r--src/script/bridge/qscriptqobject_p.h134
-rw-r--r--src/script/bridge/qscriptvariant.cpp102
-rw-r--r--src/script/bridge/qscriptvariant_p.h72
-rw-r--r--src/script/instruction.table87
-rw-r--r--src/script/parser/parser.pri16
-rw-r--r--src/script/parser/qscript.g (renamed from src/script/qscript.g)112
-rw-r--r--src/script/parser/qscriptast.cpp (renamed from src/script/qscriptast.cpp)36
-rw-r--r--src/script/parser/qscriptast_p.h (renamed from src/script/qscriptast_p.h)36
-rw-r--r--src/script/parser/qscriptastfwd_p.h (renamed from src/script/qscriptastfwd_p.h)36
-rw-r--r--src/script/parser/qscriptastvisitor.cpp28
-rw-r--r--src/script/parser/qscriptastvisitor_p.h (renamed from src/script/qscriptastvisitor_p.h)36
-rw-r--r--src/script/parser/qscriptgrammar.cpp (renamed from src/script/qscriptgrammar.cpp)36
-rw-r--r--src/script/parser/qscriptgrammar_p.h (renamed from src/script/qscriptgrammar_p.h)36
-rw-r--r--src/script/parser/qscriptlexer.cpp (renamed from src/script/qscriptlexer.cpp)89
-rw-r--r--src/script/parser/qscriptlexer_p.h (renamed from src/script/qscriptlexer_p.h)36
-rw-r--r--src/script/parser/qscriptparser.cpp (renamed from src/script/qscriptparser.cpp)48
-rw-r--r--src/script/parser/qscriptparser_p.h (renamed from src/script/qscriptparser_p.h)36
-rw-r--r--src/script/parser/qscriptsyntaxchecker.cpp (renamed from src/script/qscriptsyntaxchecker.cpp)36
-rw-r--r--src/script/parser/qscriptsyntaxchecker_p.h88
-rw-r--r--src/script/qscriptable.h89
-rw-r--r--src/script/qscriptable_p.h84
-rw-r--r--src/script/qscriptarray_p.h428
-rw-r--r--src/script/qscriptasm.cpp108
-rw-r--r--src/script/qscriptasm_p.h183
-rw-r--r--src/script/qscriptastvisitor.cpp58
-rw-r--r--src/script/qscriptbuffer_p.h206
-rw-r--r--src/script/qscriptclass_p.h91
-rw-r--r--src/script/qscriptclassdata.cpp117
-rw-r--r--src/script/qscriptclassdata_p.h119
-rw-r--r--src/script/qscriptclassinfo_p.h122
-rw-r--r--src/script/qscriptclasspropertyiterator.h96
-rw-r--r--src/script/qscriptclasspropertyiterator_p.h81
-rw-r--r--src/script/qscriptcompiler.cpp2111
-rw-r--r--src/script/qscriptcompiler_p.h377
-rw-r--r--src/script/qscriptcontext_p.cpp2598
-rw-r--r--src/script/qscriptcontext_p.h361
-rw-r--r--src/script/qscriptcontextfwd_p.h257
-rw-r--r--src/script/qscriptcontextinfo_p.h99
-rw-r--r--src/script/qscriptecmaarray.cpp777
-rw-r--r--src/script/qscriptecmaarray_p.h141
-rw-r--r--src/script/qscriptecmaboolean.cpp137
-rw-r--r--src/script/qscriptecmaboolean_p.h89
-rw-r--r--src/script/qscriptecmacore.cpp120
-rw-r--r--src/script/qscriptecmacore_p.h115
-rw-r--r--src/script/qscriptecmadate.cpp1281
-rw-r--r--src/script/qscriptecmadate_p.h234
-rw-r--r--src/script/qscriptecmaerror.cpp368
-rw-r--r--src/script/qscriptecmaerror_p.h121
-rw-r--r--src/script/qscriptecmafunction.cpp459
-rw-r--r--src/script/qscriptecmafunction_p.h105
-rw-r--r--src/script/qscriptecmaglobal.cpp572
-rw-r--r--src/script/qscriptecmaglobal_p.h141
-rw-r--r--src/script/qscriptecmamath.cpp391
-rw-r--r--src/script/qscriptecmamath_p.h158
-rw-r--r--src/script/qscriptecmanumber.cpp268
-rw-r--r--src/script/qscriptecmanumber_p.h89
-rw-r--r--src/script/qscriptecmaobject.cpp238
-rw-r--r--src/script/qscriptecmaobject_p.h109
-rw-r--r--src/script/qscriptecmaregexp.cpp339
-rw-r--r--src/script/qscriptecmaregexp_p.h142
-rw-r--r--src/script/qscriptecmastring.cpp778
-rw-r--r--src/script/qscriptecmastring_p.h128
-rw-r--r--src/script/qscriptengine_p.cpp2729
-rw-r--r--src/script/qscriptengine_p.h828
-rw-r--r--src/script/qscriptengineagent_p.h81
-rw-r--r--src/script/qscriptenginefwd_p.h560
-rw-r--r--src/script/qscriptextensioninterface.h73
-rw-r--r--src/script/qscriptextensionplugin.h79
-rw-r--r--src/script/qscriptextenumeration.cpp209
-rw-r--r--src/script/qscriptextenumeration_p.h126
-rw-r--r--src/script/qscriptextqobject.cpp2241
-rw-r--r--src/script/qscriptextqobject_p.h447
-rw-r--r--src/script/qscriptextvariant.cpp169
-rw-r--r--src/script/qscriptextvariant_p.h106
-rw-r--r--src/script/qscriptfunction.cpp171
-rw-r--r--src/script/qscriptfunction_p.h219
-rw-r--r--src/script/qscriptgc_p.h317
-rw-r--r--src/script/qscriptglobals_p.h104
-rw-r--r--src/script/qscriptmember_p.h191
-rw-r--r--src/script/qscriptmemberfwd_p.h126
-rw-r--r--src/script/qscriptmemorypool_p.h130
-rw-r--r--src/script/qscriptnameid_p.h77
-rw-r--r--src/script/qscriptnodepool_p.h139
-rw-r--r--src/script/qscriptobject_p.h188
-rw-r--r--src/script/qscriptobjectdata_p.h81
-rw-r--r--src/script/qscriptobjectfwd_p.h112
-rw-r--r--src/script/qscriptrepository_p.h91
-rw-r--r--src/script/qscriptstring.h86
-rw-r--r--src/script/qscriptstring_p.h86
-rw-r--r--src/script/qscriptsyntaxchecker_p.h118
-rw-r--r--src/script/qscriptsyntaxcheckresult_p.h80
-rw-r--r--src/script/qscriptvalue_p.h108
-rw-r--r--src/script/qscriptvaluefwd_p.h89
-rw-r--r--src/script/qscriptvalueimpl.cpp450
-rw-r--r--src/script/qscriptvalueimpl_p.h786
-rw-r--r--src/script/qscriptvalueimplfwd_p.h237
-rw-r--r--src/script/qscriptvalueiterator.h99
-rw-r--r--src/script/qscriptvalueiterator_p.h75
-rw-r--r--src/script/qscriptvalueiteratorimpl.cpp415
-rw-r--r--src/script/qscriptvalueiteratorimpl_p.h127
-rw-r--r--src/script/script.pri151
-rw-r--r--src/script/utils/qscriptdate.cpp491
-rw-r--r--src/script/utils/qscriptdate_p.h44
-rw-r--r--src/script/utils/utils.pri5
-rw-r--r--src/script/visitors/qscriptprettypretty.cpp (renamed from src/script/qscriptprettypretty.cpp)112
-rw-r--r--src/script/visitors/qscriptprettypretty_p.h (renamed from src/script/qscriptprettypretty_p.h)38
-rw-r--r--src/script/visitors/qscriptxmlgenerator.cpp (renamed from src/script/qscriptxmlgenerator.cpp)116
-rw-r--r--src/script/visitors/qscriptxmlgenerator_p.h (renamed from src/script/qscriptxmlgenerator_p.h)38
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 = &dd;
+ 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 &regexp)
{
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 &regexp)
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