summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/script/context2d/environment.cpp17
-rw-r--r--examples/script/context2d/environment.h2
-rw-r--r--examples/scroller/scroller.pro6
-rw-r--r--src/corelib/io/qprocess_unix.cpp30
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp18
-rw-r--r--src/corelib/kernel/qcoreapplication.h1
-rw-r--r--src/corelib/kernel/qcoreapplication_p.h2
-rw-r--r--src/gui/gui.pro7
-rw-r--r--src/gui/image/qnativeimage.cpp8
-rw-r--r--src/gui/kernel/qt_cocoa_helpers_mac.mm74
-rw-r--r--src/gui/painting/qwindowsurface_raster.cpp29
-rw-r--r--src/gui/painting/qwindowsurface_raster_p.h3
-rw-r--r--src/opengl/qglshaderprogram.cpp4
-rw-r--r--src/plugins/bearer/icd/dbusdispatcher.cpp2
-rw-r--r--src/script/api/qscriptengine.cpp18
-rw-r--r--tests/auto/qscriptcontext/tst_qscriptcontext.cpp71
-rw-r--r--tests/auto/qscriptengine/tst_qscriptengine.cpp13
-rw-r--r--tests/benchmarks/script/context2d/context2d.pro22
-rw-r--r--tests/benchmarks/script/context2d/tst_context2d.cpp177
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.pro10
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.qrc5
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/tests/construct-copy.js3
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/tests/construct.js2
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/tests/for-in.js3
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/tests/get-element.js3
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/tests/get-length.js3
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/tests/mid.js3
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/tests/set-element.js3
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/tests/set-length.js3
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/tests/sum.js8
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/tests/trimmed.js3
-rw-r--r--tests/benchmarks/script/qscriptclass_bytearray/tst_qscriptclass_bytearray.cpp109
-rw-r--r--tests/benchmarks/script/script.pro4
33 files changed, 555 insertions, 111 deletions
diff --git a/examples/script/context2d/environment.cpp b/examples/script/context2d/environment.cpp
index 7d6d6f8..e68c1ca 100644
--- a/examples/script/context2d/environment.cpp
+++ b/examples/script/context2d/environment.cpp
@@ -363,6 +363,23 @@ QScriptValue Environment::evaluate(const QString &code, const QString &fileName)
return m_engine->evaluate(code, fileName);
}
+bool Environment::hasIntervalTimers() const
+{
+ return !m_intervalHash.isEmpty();
+}
+
+// This is used by the Context2D QtScript benchmark.
+void Environment::triggerTimers()
+{
+ for (int x = 0; x < 2; ++x) {
+ QList<int> timerIds = x ? m_intervalHash.keys() : m_timeoutHash.keys();
+ for (int i = 0; i < timerIds.size(); ++i) {
+ QTimerEvent fakeEvent(timerIds.at(i));
+ timerEvent(&fakeEvent);
+ }
+ }
+}
+
//! [2]
QScriptValue Environment::toWrapper(QObject *object)
{
diff --git a/examples/script/context2d/environment.h b/examples/script/context2d/environment.h
index dd92e85..221875f 100644
--- a/examples/script/context2d/environment.h
+++ b/examples/script/context2d/environment.h
@@ -78,6 +78,8 @@ public:
//! [0]
QScriptEngine *engine() const;
+ bool hasIntervalTimers() const;
+ void triggerTimers();
//! [1]
public slots:
diff --git a/examples/scroller/scroller.pro b/examples/scroller/scroller.pro
index e830745..9a9991a 100644
--- a/examples/scroller/scroller.pro
+++ b/examples/scroller/scroller.pro
@@ -1,7 +1,7 @@
TEMPLATE = subdirs
-SUBDIRS = graphicsview \
- plot \
- wheel
+SUBDIRS = graphicsview
+
+contains(QT_CONFIG, webkit):SUBDIRS += plot wheel
# install
sources.files = *.pro
diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp
index b120f7f..f9f5362 100644
--- a/src/corelib/io/qprocess_unix.cpp
+++ b/src/corelib/io/qprocess_unix.cpp
@@ -169,27 +169,17 @@ private:
Q_GLOBAL_STATIC(QMutex, processManagerGlobalMutex)
-static QProcessManager *processManagerInstance = 0;
-
-static QProcessManager *processManager()
-{
+static QProcessManager *processManager() {
// The constructor of QProcessManager should be called only once
// so we cannot use Q_GLOBAL_STATIC directly for QProcessManager
QMutex *mutex = processManagerGlobalMutex();
QMutexLocker locker(mutex);
-
- if (!processManagerInstance)
- QProcessPrivate::initializeProcessManager();
-
- Q_ASSERT(processManagerInstance);
- return processManagerInstance;
+ static QProcessManager processManager;
+ return &processManager;
}
QProcessManager::QProcessManager()
{
- // can only be called from main thread
- Q_ASSERT(!qApp || qApp->thread() == QThread::currentThread());
-
#if defined (QPROCESS_DEBUG)
qDebug() << "QProcessManager::QProcessManager()";
#endif
@@ -208,8 +198,6 @@ QProcessManager::QProcessManager()
::sigaction(SIGCHLD, &action, &oldAction);
if (oldAction.sa_handler != qt_sa_sigchld_handler)
qt_sa_old_sigchld_handler = oldAction.sa_handler;
-
- processManagerInstance = this;
}
QProcessManager::~QProcessManager()
@@ -238,8 +226,6 @@ QProcessManager::~QProcessManager()
if (oldAction.sa_handler != qt_sa_sigchld_handler) {
::sigaction(SIGCHLD, &oldAction, 0);
}
-
- processManagerInstance = 0;
}
void QProcessManager::run()
@@ -1306,15 +1292,7 @@ bool QProcessPrivate::startDetached(const QString &program, const QStringList &a
void QProcessPrivate::initializeProcessManager()
{
- if (qApp && qApp->thread() != QThread::currentThread()) {
- // The process manager must be initialized in the main thread
- // Note: The call below will re-enter this function, but in the right thread,
- // so the else statement below will be executed.
- QMetaObject::invokeMethod(qApp, "_q_initializeProcessManager", Qt::BlockingQueuedConnection);
- } else {
- static QProcessManager processManager;
- Q_UNUSED(processManager);
- }
+ (void) processManager();
}
QT_END_NAMESPACE
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp
index 9bd32d1..26a398e 100644
--- a/src/corelib/kernel/qcoreapplication.cpp
+++ b/src/corelib/kernel/qcoreapplication.cpp
@@ -392,16 +392,6 @@ void QCoreApplicationPrivate::createEventDispatcher()
#endif
}
-void QCoreApplicationPrivate::_q_initializeProcessManager()
-{
-#ifndef QT_NO_PROCESS
-# ifdef Q_OS_UNIX
- QProcessPrivate::initializeProcessManager();
-# endif
-#endif
-}
-
-
QThread *QCoreApplicationPrivate::theMainThread = 0;
QThread *QCoreApplicationPrivate::mainThread()
{
@@ -666,6 +656,12 @@ void QCoreApplication::init()
}
#endif
+#if defined(Q_OS_UNIX) && !(defined(QT_NO_PROCESS))
+ // Make sure the process manager thread object is created in the main
+ // thread.
+ QProcessPrivate::initializeProcessManager();
+#endif
+
#ifdef QT_EVAL
extern void qt_core_eval_init(uint);
qt_core_eval_init(d->application_type);
@@ -2732,5 +2728,3 @@ int QCoreApplication::loopLevel()
*/
QT_END_NAMESPACE
-
-#include "moc_qcoreapplication.cpp"
diff --git a/src/corelib/kernel/qcoreapplication.h b/src/corelib/kernel/qcoreapplication.h
index 024c509..3957158 100644
--- a/src/corelib/kernel/qcoreapplication.h
+++ b/src/corelib/kernel/qcoreapplication.h
@@ -205,7 +205,6 @@ protected:
QCoreApplication(QCoreApplicationPrivate &p);
private:
- Q_PRIVATE_SLOT(d_func(), void _q_initializeProcessManager())
static bool sendSpontaneousEvent(QObject *receiver, QEvent *event);
bool notifyInternal(QObject *receiver, QEvent *event);
diff --git a/src/corelib/kernel/qcoreapplication_p.h b/src/corelib/kernel/qcoreapplication_p.h
index fdceab4..add2a35 100644
--- a/src/corelib/kernel/qcoreapplication_p.h
+++ b/src/corelib/kernel/qcoreapplication_p.h
@@ -85,8 +85,6 @@ public:
bool sendThroughObjectEventFilters(QObject *, QEvent *);
bool notify_helper(QObject *, QEvent *);
- void _q_initializeProcessManager();
-
virtual QString appName() const;
virtual void createEventDispatcher();
static void removePostedEvent(QEvent *);
diff --git a/src/gui/gui.pro b/src/gui/gui.pro
index fe1a595..076fe0a 100644
--- a/src/gui/gui.pro
+++ b/src/gui/gui.pro
@@ -65,15 +65,14 @@ symbian {
neon:*-g++* {
DEFINES += QT_HAVE_NEON
HEADERS += $$NEON_HEADERS
- SOURCES += $$NEON_SOURCES
DRAWHELPER_NEON_ASM_FILES = $$NEON_ASM
- neon_compiler.commands = $$QMAKE_CXX -c -mfpu=neon
- neon_compiler.commands += $(CXXFLAGS) $(INCPATH) ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
+ neon_compiler.commands = $$QMAKE_CXX -c
+ neon_compiler.commands += $(CXXFLAGS) -mfpu=neon $(INCPATH) ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
neon_compiler.dependency_type = TYPE_C
neon_compiler.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_OBJ)}
- neon_compiler.input = DRAWHELPER_NEON_ASM_FILES
+ neon_compiler.input = DRAWHELPER_NEON_ASM_FILES NEON_SOURCES
neon_compiler.variable_out = OBJECTS
neon_compiler.name = compiling[neon] ${QMAKE_FILE_IN}
silent:neon_compiler.commands = @echo compiling[neon] ${QMAKE_FILE_IN} && $$neon_compiler.commands
diff --git a/src/gui/image/qnativeimage.cpp b/src/gui/image/qnativeimage.cpp
index 01baa36..8face87 100644
--- a/src/gui/image/qnativeimage.cpp
+++ b/src/gui/image/qnativeimage.cpp
@@ -181,15 +181,17 @@ QNativeImage::QNativeImage(int width, int height, QImage::Format format,bool /*
if (ok) {
xshmimg->data = (char*)shmat(xshminfo.shmid, 0, 0);
xshminfo.shmaddr = xshmimg->data;
- if (shmctl(xshminfo.shmid, IPC_RMID, 0) == -1)
- qWarning() << "Error while marking the shared memory segment to be destroyed";
ok = (xshminfo.shmaddr != (char*)-1);
if (ok)
image = QImage((uchar *)xshmimg->data, width, height, format);
}
xshminfo.readOnly = false;
- if (ok)
+ if (ok) {
ok = XShmAttach(X11->display, &xshminfo);
+ XSync(X11->display, False);
+ if (shmctl(xshminfo.shmid, IPC_RMID, 0) == -1)
+ qWarning() << "Error while marking the shared memory segment to be destroyed";
+ }
if (!ok) {
qWarning() << "QNativeImage: Unable to attach to shared memory segment.";
if (xshmimg->data) {
diff --git a/src/gui/kernel/qt_cocoa_helpers_mac.mm b/src/gui/kernel/qt_cocoa_helpers_mac.mm
index ddbf53f..e50bdd3 100644
--- a/src/gui/kernel/qt_cocoa_helpers_mac.mm
+++ b/src/gui/kernel/qt_cocoa_helpers_mac.mm
@@ -1060,30 +1060,26 @@ QWidget *qt_mac_getTargetForMouseEvent(
returnGlobalPoint = flipPoint([NSEvent mouseLocation]).toPoint();
QWidget *mouseGrabber = QWidget::mouseGrabber();
bool buttonDownNotBlockedByModal = qt_button_down && !QApplicationPrivate::isBlockedByModal(qt_button_down);
+ QWidget *popup = QApplication::activePopupWidget();
// Resolve the widget under the mouse:
QWidget *widgetUnderMouse = 0;
- if (nativeWidget) {
+ if (popup || qt_button_down || !nativeWidget) {
+ // Using QApplication::widgetAt for finding the widget under the mouse
+ // is most safe, since it ignores cocoas own mouse down redirections (which
+ // we need to be prepared for when using nativeWidget as starting point).
+ // (the only exception is for QMacNativeWidget, where QApplication::widgetAt fails).
+ // But it is also slower (I guess), so we try to avoid it and use nativeWidget if we can:
+ widgetUnderMouse = QApplication::widgetAt(returnGlobalPoint);
+ }
+
+ if (!widgetUnderMouse && nativeWidget) {
+ // Entering here should be the common case. We
+ // also handle the QMacNativeWidget fallback case.
QPoint p = nativeWidget->mapFromGlobal(returnGlobalPoint);
widgetUnderMouse = nativeWidget->childAt(p);
- if (!widgetUnderMouse){
- // Cocoa will redirct mouse event to the current
- // mouse down widget, which is not what we want for our
- // widgetUnderMouse assignment. So we need to check
- // if we are actually inside nativeView:
- if (nativeWidget->rect().contains(p)) {
- widgetUnderMouse = nativeWidget;
- } else {
- // Ok, fallback to find the widget under mouse ourselves.
- widgetUnderMouse = QApplication::widgetAt(returnGlobalPoint);
- }
- }
- } else {
- // Calling QApplication::widgetAt is potentially slow, hence the
- // reason we avoid it if we can. So supplying a nativeWidget to
- // this function is mostly an optimization. But at the same time,
- // calling QApplication::widgetAt fails for QMacNativeWidget...
- widgetUnderMouse = QApplication::widgetAt(returnGlobalPoint);
+ if (!widgetUnderMouse && nativeWidget->rect().contains(p))
+ widgetUnderMouse = nativeWidget;
}
if (widgetUnderMouse) {
@@ -1107,23 +1103,27 @@ QWidget *qt_mac_getTargetForMouseEvent(
if (returnWidgetUnderMouse)
*returnWidgetUnderMouse = widgetUnderMouse;
- // Resolve the target for the mouse event. Default will be widgetUnderMouse, except
- // if there is a popup-"grab", mousegrab, or button-down-"grab":
- QWidget *popup = QApplication::activePopupWidget();
+ // Resolve the target for the mouse event. Default will be
+ // widgetUnderMouse, except if there is a grab (popup/mouse/button-down):
if (popup && !mouseGrabber) {
- if (!popup->isAncestorOf(widgetUnderMouse)) {
- // The popup will always grab the mouse unless the
- // mouse is over a child, or the user scrolls:
+ // We special case handling of popups, since they have an implicitt mouse grab.
+ QWidget *candidate = buttonDownNotBlockedByModal ? qt_button_down : widgetUnderMouse;
+ if (!popup->isAncestorOf(candidate)) {
+ // INVARIANT: we have a popup, but the candidate is not
+ // in it. But the popup will grab the mouse anyway,
+ // except if the user scrolls:
if (eventType == QEvent::Wheel)
return 0;
returnLocalPoint = popup->mapFromGlobal(returnGlobalPoint);
return popup;
- } else if (popup == widgetUnderMouse) {
+ } else if (popup == candidate) {
+ // INVARIANT: The candidate is the popup itself, and not a child:
returnLocalPoint = popup->mapFromGlobal(returnGlobalPoint);
return popup;
} else {
- returnLocalPoint = widgetUnderMouse->mapFromGlobal(returnGlobalPoint);
- return widgetUnderMouse;
+ // INVARIANT: The candidate is a child inside the popup:
+ returnLocalPoint = candidate->mapFromGlobal(returnGlobalPoint);
+ return candidate;
}
}
@@ -1192,16 +1192,14 @@ bool qt_mac_handleMouseEvent(NSEvent *event, QEvent::Type eventType, Qt::MouseBu
if (!widgetToGetMouse)
return false;
- if (!nativeWidget) {
- // Path typically taken for mouse moves (send
- // directly from [QCocoaWindow sendEvent]
- if (!widgetUnderMouse)
- return false;
- nativeWidget = widgetUnderMouse->internalWinId() ?
- widgetUnderMouse : widgetUnderMouse->nativeParentWidget();
- if (!nativeWidget)
- return false;
- }
+ // From here on, we let nativeWidget actually be the native widget under widgetUnderMouse. The reason
+ // for this, is that qt_mac_getTargetForMouseEvent will set cocoa's mouse event redirection aside when
+ // determining which widget is under the mouse (in other words, it will usually ignore nativeWidget).
+ // nativeWidget will be used in QApplicationPrivate::sendMouseEvent to correctly dispatch enter/leave events.
+ if (widgetUnderMouse)
+ nativeWidget = widgetUnderMouse->internalWinId() ? widgetUnderMouse : widgetUnderMouse->nativeParentWidget();
+ if (!nativeWidget)
+ return false;
NSView *view = qt_mac_effectiveview_for(nativeWidget);
// Handle tablet events (if any) first.
diff --git a/src/gui/painting/qwindowsurface_raster.cpp b/src/gui/painting/qwindowsurface_raster.cpp
index 843c9ff..419518ac 100644
--- a/src/gui/painting/qwindowsurface_raster.cpp
+++ b/src/gui/painting/qwindowsurface_raster.cpp
@@ -78,6 +78,9 @@ public:
#ifdef Q_WS_X11
GC gc;
+#ifndef QT_NO_MITSHM
+ uint needsSync : 1;
+#endif
#ifndef QT_NO_XRENDER
uint translucentBackground : 1;
#endif
@@ -94,6 +97,9 @@ QRasterWindowSurface::QRasterWindowSurface(QWidget *window, bool setDefaultSurfa
d_ptr->translucentBackground = X11->use_xrender
&& window->x11Info().depth() == 32;
#endif
+#ifndef QT_NO_MITHSM
+ d_ptr->needsSync = false;
+#endif
#endif
d_ptr->image = 0;
d_ptr->inSetGeometry = false;
@@ -116,8 +122,23 @@ QPaintDevice *QRasterWindowSurface::paintDevice()
return &d_ptr->image->image;
}
+#if defined(Q_WS_X11) && !defined(QT_NO_MITSHM)
+void QRasterWindowSurface::syncX()
+{
+ // delay writing to the backbuffer until we know for sure X is done reading from it
+ if (d_ptr->needsSync) {
+ XSync(X11->display, false);
+ d_ptr->needsSync = false;
+ }
+}
+#endif
+
void QRasterWindowSurface::beginPaint(const QRegion &rgn)
{
+#if defined(Q_WS_X11) && !defined(QT_NO_MITSHM)
+ syncX();
+#endif
+
#if (defined(Q_WS_X11) && !defined(QT_NO_XRENDER)) || (defined(Q_WS_WIN) && !defined(Q_WS_WINCE))
if (!qt_widget_private(window())->isOpaque && window()->testAttribute(Qt::WA_TranslucentBackground)) {
#if defined(Q_WS_WIN) && !defined(Q_WS_WINCE)
@@ -217,13 +238,13 @@ void QRasterWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoi
if (d_ptr->image->xshmpm) {
XCopyArea(X11->display, d_ptr->image->xshmpm, widget->handle(), d_ptr->gc,
br.x(), br.y(), br.width(), br.height(), wbr.x(), wbr.y());
- XSync(X11->display, False);
+ d_ptr->needsSync = true;
} else if (d_ptr->image->xshmimg) {
const QImage &src = d->image->image;
br = br.intersected(src.rect());
XShmPutImage(X11->display, widget->handle(), d_ptr->gc, d_ptr->image->xshmimg,
br.x(), br.y(), wbr.x(), wbr.y(), br.width(), br.height(), False);
- XSync(X11->display, False);
+ d_ptr->needsSync = true;
} else
#endif
{
@@ -392,6 +413,10 @@ bool QRasterWindowSurface::scroll(const QRegion &area, int dx, int dy)
if (!d->image || d->image->image.isNull())
return false;
+#if defined(Q_WS_X11) && !defined(QT_NO_MITSHM)
+ syncX();
+#endif
+
const QVector<QRect> rects = area.rects();
for (int i = 0; i < rects.size(); ++i)
qt_scrollRectInImage(d->image->image, rects.at(i), QPoint(dx, dy));
diff --git a/src/gui/painting/qwindowsurface_raster_p.h b/src/gui/painting/qwindowsurface_raster_p.h
index b6e61e1..903810b 100644
--- a/src/gui/painting/qwindowsurface_raster_p.h
+++ b/src/gui/painting/qwindowsurface_raster_p.h
@@ -107,6 +107,9 @@ public:
bool scroll(const QRegion &area, int dx, int dy);
private:
+#if defined(Q_WS_X11) && !defined(QT_NO_MITSHM)
+ void syncX();
+#endif
void prepareBuffer(QImage::Format format, QWidget *widget);
Q_DECLARE_PRIVATE(QRasterWindowSurface)
QScopedPointer<QRasterWindowSurfacePrivate> d_ptr;
diff --git a/src/opengl/qglshaderprogram.cpp b/src/opengl/qglshaderprogram.cpp
index 7f41339..4598bff 100644
--- a/src/opengl/qglshaderprogram.cpp
+++ b/src/opengl/qglshaderprogram.cpp
@@ -261,14 +261,14 @@ bool QGLShaderPrivate::compile(QGLShader *q)
log = QString::fromLatin1(logbuf);
QString name = q->objectName();
- char *types[] = {
+ const char *types[] = {
"Fragment",
"Vertex",
"Geometry",
""
};
- char *type = types[3];
+ const char *type = types[3];
if (shaderType == QGLShader::Fragment)
type = types[0];
else if (shaderType == QGLShader::Vertex)
diff --git a/src/plugins/bearer/icd/dbusdispatcher.cpp b/src/plugins/bearer/icd/dbusdispatcher.cpp
index 5fc2a38..f100a48 100644
--- a/src/plugins/bearer/icd/dbusdispatcher.cpp
+++ b/src/plugins/bearer/icd/dbusdispatcher.cpp
@@ -468,7 +468,7 @@ void DBusDispatcher::setupDBus()
d_ptr->signal_vtable.message_function = signalHandler;
dbus_connection_set_exit_on_disconnect(d_ptr->connection, FALSE);
- dbus_connection_setup_with_g_main(d_ptr->connection, NULL);
+ dbus_connection_setup_with_g_main(d_ptr->connection, g_main_context_get_thread_default());
dbus_connection_register_object_path(d_ptr->connection,
d_ptr->signalPath.toLatin1(),
&d_ptr->signal_vtable,
diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp
index e3291e0..76d9ab2 100644
--- a/src/script/api/qscriptengine.cpp
+++ b/src/script/api/qscriptengine.cpp
@@ -2087,10 +2087,10 @@ QScriptValue QScriptEngine::newFunction(QScriptEngine::FunctionSignature fun,
JSC::ExecState* exec = d->currentFrame;
JSC::JSValue function = new (exec)QScript::FunctionWrapper(exec, length, JSC::Identifier(exec, ""), fun);
QScriptValue result = d->scriptValueFromJSCValue(function);
- result.setProperty(QLatin1String("prototype"), prototype, QScriptValue::Undeletable);
+ result.setProperty(QLatin1String("prototype"), prototype,
+ QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
const_cast<QScriptValue&>(prototype)
- .setProperty(QLatin1String("constructor"), result,
- QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
+ .setProperty(QLatin1String("constructor"), result, QScriptValue::SkipInEnumeration);
return result;
}
@@ -2356,9 +2356,9 @@ QScriptValue QScriptEngine::newFunction(QScriptEngine::FunctionSignature fun, in
JSC::JSValue function = new (exec)QScript::FunctionWrapper(exec, 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);
+ result.setProperty(QLatin1String("prototype"), proto,
+ QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
+ proto.setProperty(QLatin1String("constructor"), result, QScriptValue::SkipInEnumeration);
return result;
}
@@ -2374,9 +2374,9 @@ QScriptValue QScriptEngine::newFunction(QScriptEngine::FunctionWithArgSignature
JSC::JSValue function = new (exec)QScript::FunctionWithArgWrapper(exec, /*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);
+ result.setProperty(QLatin1String("prototype"), proto,
+ QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
+ proto.setProperty(QLatin1String("constructor"), result, QScriptValue::SkipInEnumeration);
return result;
}
diff --git a/tests/auto/qscriptcontext/tst_qscriptcontext.cpp b/tests/auto/qscriptcontext/tst_qscriptcontext.cpp
index eee67df..1332a22 100644
--- a/tests/auto/qscriptcontext/tst_qscriptcontext.cpp
+++ b/tests/auto/qscriptcontext/tst_qscriptcontext.cpp
@@ -91,6 +91,11 @@ private slots:
void pushAndPopScope_globalContext();
void pushAndPopScope_globalContext2();
void getSetActivationObject_globalContext();
+ void pushScopeEvaluate();
+ void pushScopeCall();
+ void popScopeSimple();
+ void pushAndPopGlobalObjectSimple();
+ void pushAndPopIterative();
void getSetActivationObject_customContext();
void inheritActivationAndThisObject();
void toString();
@@ -1006,6 +1011,72 @@ void tst_QScriptContext::scopeChain_withStatement()
}
}
+void tst_QScriptContext::pushScopeEvaluate()
+{
+ QScriptEngine engine;
+ QScriptValue object = engine.newObject();
+ object.setProperty("foo", 1234);
+ object.setProperty(1, 1234);
+ engine.currentContext()->pushScope(object);
+ object.setProperty("bar", 4321);
+ object.setProperty(2, 4321);
+ QVERIFY(engine.evaluate("foo").equals(1234));
+ QVERIFY(engine.evaluate("bar").equals(4321));
+}
+
+void tst_QScriptContext::pushScopeCall()
+{
+ QScriptEngine engine;
+ QScriptValue object = engine.globalObject();
+ QScriptValue thisObject = engine.newObject();
+ QScriptValue function = engine.evaluate("(function(property){return this[property]; })");
+ QVERIFY(function.isFunction());
+ object.setProperty("foo", 1234);
+ thisObject.setProperty("foo", "foo");
+ engine.currentContext()->pushScope(object);
+ object.setProperty("bar", 4321);
+ thisObject.setProperty("bar", "bar");
+ QVERIFY(function.call(QScriptValue(), QScriptValueList() << "foo").equals(1234));
+ QVERIFY(function.call(QScriptValue(), QScriptValueList() << "bar").equals(4321));
+ QVERIFY(function.call(thisObject, QScriptValueList() << "foo").equals("foo"));
+ QVERIFY(function.call(thisObject, QScriptValueList() << "bar").equals("bar"));
+}
+
+void tst_QScriptContext::popScopeSimple()
+{
+ QScriptEngine engine;
+ QScriptValue object = engine.newObject();
+ QScriptValue globalObject = engine.globalObject();
+ engine.currentContext()->pushScope(object);
+ QVERIFY(engine.currentContext()->popScope().strictlyEquals(object));
+ QVERIFY(engine.globalObject().strictlyEquals(globalObject));
+}
+
+void tst_QScriptContext::pushAndPopGlobalObjectSimple()
+{
+ QScriptEngine engine;
+ QScriptValue globalObject = engine.globalObject();
+ engine.currentContext()->pushScope(globalObject);
+ QVERIFY(engine.currentContext()->popScope().strictlyEquals(globalObject));
+ QVERIFY(engine.globalObject().strictlyEquals(globalObject));
+}
+
+void tst_QScriptContext::pushAndPopIterative()
+{
+ QScriptEngine engine;
+ for (uint repeat = 0; repeat < 2; ++repeat) {
+ for (uint i = 1; i < 11; ++i) {
+ QScriptValue object = engine.newObject();
+ object.setProperty("x", i + 10 * repeat);
+ engine.currentContext()->pushScope(object);
+ }
+ for (uint i = 10; i > 0; --i) {
+ QScriptValue object = engine.currentContext()->popScope();
+ QVERIFY(object.property("x").equals(i + 10 * repeat));
+ }
+ }
+}
+
void tst_QScriptContext::pushAndPopScope_globalContext()
{
QScriptEngine eng;
diff --git a/tests/auto/qscriptengine/tst_qscriptengine.cpp b/tests/auto/qscriptengine/tst_qscriptengine.cpp
index 2f7e0b5..b609d8c 100644
--- a/tests/auto/qscriptengine/tst_qscriptengine.cpp
+++ b/tests/auto/qscriptengine/tst_qscriptengine.cpp
@@ -344,8 +344,8 @@ void tst_QScriptEngine::newFunction()
QScriptValue prot = fun.property("prototype", QScriptValue::ResolveLocal);
QVERIFY(prot.isObject());
QVERIFY(prot.property("constructor").strictlyEquals(fun));
- QCOMPARE(fun.propertyFlags("prototype"), QScriptValue::Undeletable);
- QCOMPARE(prot.propertyFlags("constructor"), QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
+ QCOMPARE(fun.propertyFlags("prototype"), QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
+ QCOMPARE(prot.propertyFlags("constructor"), QScriptValue::SkipInEnumeration);
}
// prototype should be Function.prototype
QCOMPARE(fun.prototype().isValid(), true);
@@ -369,8 +369,8 @@ void tst_QScriptEngine::newFunctionWithArg()
QScriptValue prot = fun.property("prototype", QScriptValue::ResolveLocal);
QVERIFY(prot.isObject());
QVERIFY(prot.property("constructor").strictlyEquals(fun));
- QCOMPARE(fun.propertyFlags("prototype"), QScriptValue::Undeletable);
- QCOMPARE(prot.propertyFlags("constructor"), QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
+ QCOMPARE(fun.propertyFlags("prototype"), QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
+ QCOMPARE(prot.propertyFlags("constructor"), QScriptValue::SkipInEnumeration);
}
// prototype should be Function.prototype
QCOMPARE(fun.prototype().isValid(), true);
@@ -397,10 +397,9 @@ void tst_QScriptEngine::newFunctionWithProto()
QCOMPARE(fun.prototype().strictlyEquals(eng.evaluate("Function.prototype")), true);
// public prototype should be the one we passed
QCOMPARE(fun.property("prototype").strictlyEquals(proto), true);
- QCOMPARE(fun.propertyFlags("prototype"), QScriptValue::Undeletable);
+ QCOMPARE(fun.propertyFlags("prototype"), QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
QCOMPARE(proto.property("constructor").strictlyEquals(fun), true);
- QCOMPARE(proto.propertyFlags("constructor"),
- QScriptValue::Undeletable | QScriptValue::SkipInEnumeration);
+ QCOMPARE(proto.propertyFlags("constructor"), QScriptValue::SkipInEnumeration);
QCOMPARE(fun.call().isNull(), true);
QCOMPARE(fun.construct().isObject(), true);
diff --git a/tests/benchmarks/script/context2d/context2d.pro b/tests/benchmarks/script/context2d/context2d.pro
new file mode 100644
index 0000000..bc94c4f
--- /dev/null
+++ b/tests/benchmarks/script/context2d/context2d.pro
@@ -0,0 +1,22 @@
+load(qttest_p4)
+TEMPLATE = app
+TARGET = tst_bench_context2d
+
+SOURCES += tst_context2d.cpp
+
+CONTEXT2D_EXAMPLE_DIR = $$QT_SOURCE_TREE/examples/script/context2d
+INCLUDEPATH += $$CONTEXT2D_EXAMPLE_DIR
+
+HEADERS += $$CONTEXT2D_EXAMPLE_DIR/qcontext2dcanvas.h \
+ $$CONTEXT2D_EXAMPLE_DIR/context2d.h \
+ $$CONTEXT2D_EXAMPLE_DIR/domimage.h \
+ $$CONTEXT2D_EXAMPLE_DIR/environment.h
+
+SOURCES += $$CONTEXT2D_EXAMPLE_DIR/qcontext2dcanvas.cpp \
+ $$CONTEXT2D_EXAMPLE_DIR/context2d.cpp \
+ $$CONTEXT2D_EXAMPLE_DIR/domimage.cpp \
+ $$CONTEXT2D_EXAMPLE_DIR/environment.cpp
+
+RESOURCES += $$CONTEXT2D_EXAMPLE_DIR/context2d.qrc
+
+QT += script
diff --git a/tests/benchmarks/script/context2d/tst_context2d.cpp b/tests/benchmarks/script/context2d/tst_context2d.cpp
new file mode 100644
index 0000000..8401590
--- /dev/null
+++ b/tests/benchmarks/script/context2d/tst_context2d.cpp
@@ -0,0 +1,177 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite 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 Technology Preview License Agreement accompanying
+** this package.
+**
+** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qtest.h>
+#include <QtCore/qdir.h>
+#include <QtCore/qfile.h>
+#include <QtCore/qtextstream.h>
+#include <QtScript/qscriptengine.h>
+#include <QtScript/qscriptvalue.h>
+#include "context2d.h"
+#include "environment.h"
+#include "qcontext2dcanvas.h"
+
+static QString readFile(const QString &filename)
+{
+ QFile file(filename);
+ if (!file.open(QFile::ReadOnly))
+ return QString();
+ QTextStream stream(&file);
+ stream.setCodec("UTF-8");
+ return stream.readAll();
+}
+
+class tst_Context2D : public QObject
+{
+ Q_OBJECT
+
+public:
+ tst_Context2D();
+ ~tst_Context2D();
+
+private slots:
+ void singleExecution_data();
+ void singleExecution();
+ void repeatedExecution_data();
+ void repeatedExecution();
+
+private:
+ void newEnvironment();
+
+private:
+ QDir testsDir;
+ Environment *m_env;
+ QContext2DCanvas *m_canvas;
+};
+
+tst_Context2D::tst_Context2D()
+ : m_env(0), m_canvas(0)
+{
+ testsDir = QDir(":/scripts");
+ if (!testsDir.exists())
+ qWarning("*** no scripts/ dir!");
+}
+
+tst_Context2D::~tst_Context2D()
+{
+ delete m_canvas;
+ delete m_env;
+}
+
+void tst_Context2D::newEnvironment()
+{
+ delete m_canvas;
+ delete m_env;
+ m_env = new Environment();
+ Context2D *context = new Context2D(m_env);
+ context->setSize(150, 150); // Hard-coded in many of the scripts.
+ m_canvas = new QContext2DCanvas(context, m_env);
+ m_canvas->setFixedSize(context->size());
+ m_canvas->setObjectName("tutorial"); // Acts as the DOM element ID.
+ m_env->addCanvas(m_canvas);
+}
+
+void tst_Context2D::singleExecution_data()
+{
+ QTest::addColumn<QString>("testName");
+ QFileInfoList testFileInfos = testsDir.entryInfoList(QStringList() << "*.js", QDir::Files);
+ foreach (QFileInfo tfi, testFileInfos) {
+ QString name = tfi.baseName();
+ QTest::newRow(name.toLatin1().constData()) << name;
+ }
+}
+
+void tst_Context2D::singleExecution()
+{
+ QFETCH(QString, testName);
+ QString script = readFile(testsDir.absoluteFilePath(testName + ".js"));
+ QVERIFY(!script.isEmpty());
+
+ newEnvironment();
+ QBENCHMARK {
+ m_env->evaluate(script, testName);
+ // Some of the scripts (e.g. plasma.js) merely start a timer and do
+ // the actual drawing in the timer event. Trigger the timers now to
+ // ensure that the real work is done.
+ m_env->triggerTimers();
+ }
+ QVERIFY(!m_env->engine()->hasUncaughtException());
+}
+
+void tst_Context2D::repeatedExecution_data()
+{
+ // We look for scripts that register an interval timer.
+ // Such scripts run a function every n milliseconds to update the canvas.
+ // The benchmark will execute this function repeatedly, which can allow
+ // us to observe potential effects of profiling-based JIT optimizations.
+ QTest::addColumn<QString>("testName");
+ QTest::addColumn<QString>("script");
+ QFileInfoList testFileInfos = testsDir.entryInfoList(QStringList() << "*.js", QDir::Files);
+ foreach (QFileInfo tfi, testFileInfos) {
+ QString script = readFile(tfi.absoluteFilePath());
+ QString name = tfi.baseName();
+ newEnvironment();
+ m_env->evaluate(script, name);
+ if (m_env->engine()->hasUncaughtException())
+ continue;
+ if (m_env->hasIntervalTimers())
+ QTest::newRow(name.toLatin1().constData()) << name << script;
+ }
+}
+
+void tst_Context2D::repeatedExecution()
+{
+ QFETCH(QString, testName);
+ QFETCH(QString, script);
+
+ newEnvironment();
+ m_env->evaluate(script, testName);
+ QBENCHMARK {
+ // Trigger the update function repeatedly, effectively
+ // performing several frames of animation.
+ for (int i = 0; i < 16; ++i)
+ m_env->triggerTimers();
+ }
+ QVERIFY(!m_env->engine()->hasUncaughtException());
+}
+
+QTEST_MAIN(tst_Context2D)
+#include "tst_context2d.moc"
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.pro b/tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.pro
new file mode 100644
index 0000000..d64f705
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.pro
@@ -0,0 +1,10 @@
+load(qttest_p4)
+TEMPLATE = app
+TARGET = tst_bench_qscriptclass_bytearray
+
+SOURCES += tst_qscriptclass_bytearray.cpp
+RESOURCES += qscriptclass_bytearray.qrc
+
+include($$QT_SOURCE_TREE/examples/script/customclass/bytearrayclass.pri)
+
+QT = core script
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.qrc b/tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.qrc
new file mode 100644
index 0000000..a894ee5
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/qscriptclass_bytearray.qrc
@@ -0,0 +1,5 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+ <file>tests</file>
+</qresource>
+</RCC>
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/construct-copy.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/construct-copy.js
new file mode 100644
index 0000000..9c03871
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/construct-copy.js
@@ -0,0 +1,3 @@
+ba = new ByteArray(123);
+for (i = 0; i < 5000; ++i)
+ new ByteArray(ba);
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/construct.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/construct.js
new file mode 100644
index 0000000..2c2bbf5
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/construct.js
@@ -0,0 +1,2 @@
+for (i = 0; i < 5000; ++i)
+ new ByteArray(123);
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/for-in.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/for-in.js
new file mode 100644
index 0000000..46bc9f3
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/for-in.js
@@ -0,0 +1,3 @@
+ba = new ByteArray(8000);
+for (var p in ba)
+ ;
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/get-element.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/get-element.js
new file mode 100644
index 0000000..9f6a503
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/get-element.js
@@ -0,0 +1,3 @@
+ba = new ByteArray(123);
+for (i = 0; i < 10000; ++i)
+ ba[10];
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/get-length.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/get-length.js
new file mode 100644
index 0000000..5de2f58
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/get-length.js
@@ -0,0 +1,3 @@
+ba = new ByteArray(123);
+for (i = 0; i < 10000; ++i)
+ ba.length;
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/mid.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/mid.js
new file mode 100644
index 0000000..752d875
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/mid.js
@@ -0,0 +1,3 @@
+ba = new ByteArray(123);
+for (i = 0; i < 3000; ++i)
+ ba.mid(50);
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/set-element.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/set-element.js
new file mode 100644
index 0000000..4883765
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/set-element.js
@@ -0,0 +1,3 @@
+ba = new ByteArray(123);
+for (i = 0; i < 10000; ++i)
+ ba[10] = 123;
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/set-length.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/set-length.js
new file mode 100644
index 0000000..18c9f59
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/set-length.js
@@ -0,0 +1,3 @@
+ba = new ByteArray();
+for (i = 0; i < 10000; ++i)
+ ba.length = 123;
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/sum.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/sum.js
new file mode 100644
index 0000000..096937d
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/sum.js
@@ -0,0 +1,8 @@
+function sum(ba) {
+ var result = 0;
+ for (var i = 0; i < ba.length; ++i)
+ result += ba[i];
+ return result;
+}
+
+sum(new ByteArray(10000));
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tests/trimmed.js b/tests/benchmarks/script/qscriptclass_bytearray/tests/trimmed.js
new file mode 100644
index 0000000..967dba6
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/tests/trimmed.js
@@ -0,0 +1,3 @@
+ba = new ByteArray(123);
+for (i = 0; i < 3000; ++i)
+ ba.trimmed();
diff --git a/tests/benchmarks/script/qscriptclass_bytearray/tst_qscriptclass_bytearray.cpp b/tests/benchmarks/script/qscriptclass_bytearray/tst_qscriptclass_bytearray.cpp
new file mode 100644
index 0000000..351adc8
--- /dev/null
+++ b/tests/benchmarks/script/qscriptclass_bytearray/tst_qscriptclass_bytearray.cpp
@@ -0,0 +1,109 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite 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 Technology Preview License Agreement accompanying
+** this package.
+**
+** 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.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qtest.h>
+#include <QtCore/qdir.h>
+#include <QtCore/qfile.h>
+#include <QtCore/qtextstream.h>
+#include <QtScript/qscriptengine.h>
+#include <QtScript/qscriptvalue.h>
+#include "bytearrayclass.h"
+
+static QString readFile(const QString &filename)
+{
+ QFile file(filename);
+ if (!file.open(QFile::ReadOnly))
+ return QString();
+ QTextStream stream(&file);
+ stream.setCodec("UTF-8");
+ return stream.readAll();
+}
+
+class tst_QScriptClass_ByteArray : public QObject
+{
+ Q_OBJECT
+
+public:
+ tst_QScriptClass_ByteArray();
+
+private slots:
+ void benchmark_data();
+ void benchmark();
+
+private:
+ QDir testsDir;
+};
+
+tst_QScriptClass_ByteArray::tst_QScriptClass_ByteArray()
+{
+ testsDir = QDir(":/tests");
+ if (!testsDir.exists())
+ qWarning("*** no tests/ dir!");
+}
+
+void tst_QScriptClass_ByteArray::benchmark_data()
+{
+ QTest::addColumn<QString>("testName");
+ QFileInfoList testFileInfos = testsDir.entryInfoList(QStringList() << "*.js", QDir::Files);
+ foreach (QFileInfo tfi, testFileInfos) {
+ QString name = tfi.baseName();
+ QTest::newRow(name.toLatin1().constData()) << name;
+ }
+}
+
+void tst_QScriptClass_ByteArray::benchmark()
+{
+ QFETCH(QString, testName);
+ QString testContents = readFile(testsDir.absoluteFilePath(testName + ".js"));
+ QVERIFY(!testContents.isEmpty());
+
+ QScriptEngine eng;
+ ByteArrayClass *baClass = new ByteArrayClass(&eng);
+ eng.globalObject().setProperty("ByteArray", baClass->constructor());
+
+ QBENCHMARK {
+ eng.evaluate(testContents);
+ }
+ QVERIFY(!eng.hasUncaughtException());
+}
+
+QTEST_MAIN(tst_QScriptClass_ByteArray)
+#include "tst_qscriptclass_bytearray.moc"
diff --git a/tests/benchmarks/script/script.pro b/tests/benchmarks/script/script.pro
index b0770ca..d4fc822 100644
--- a/tests/benchmarks/script/script.pro
+++ b/tests/benchmarks/script/script.pro
@@ -1,6 +1,8 @@
TEMPLATE = subdirs
SUBDIRS = \
+ context2d \
qscriptclass \
+ qscriptclass_bytearray \
qscriptengine \
qscriptvalue \
sunspider \
@@ -13,4 +15,4 @@ TRUSTED_BENCHMARKS += \
qscriptvalue \
qscriptengine
-include(../trusted-benchmarks.pri) \ No newline at end of file
+include(../trusted-benchmarks.pri)