Changeset 56320 in webkit


Ignore:
Timestamp:
Mar 21, 2010 3:30:22 PM (14 years ago)
Author:
eric@webkit.org
Message:

2010-03-21 Jedrzej Nowacki <jedrzej.nowacki@nokia.com>

Reviewed by Simon Hausmann.

New class; QScriptProgram.

The class should be used to evaluate the same script multiple times
more efficiently.

[Qt] QtScript should have QScriptProgram class
https://bugs.webkit.org/show_bug.cgi?id=36008

  • qt/api/QtScript.pro:
  • qt/api/qscriptengine.cpp: (QScriptEngine::evaluate):
  • qt/api/qscriptengine.h:
  • qt/api/qscriptengine_p.cpp: (QScriptEnginePrivate::evaluate):
  • qt/api/qscriptengine_p.h: (QScriptEnginePrivate::evaluate):
  • qt/api/qscriptprogram.cpp: Added. (QScriptProgram::QScriptProgram): (QScriptProgram::~QScriptProgram): (QScriptProgram::operator=): (QScriptProgram::isNull): (QScriptProgram::sourceCode): (QScriptProgram::fileName): (QScriptProgram::firstLineNumber): (QScriptProgram::operator==): (QScriptProgram::operator!=):
  • qt/api/qscriptprogram.h: Added.
  • qt/api/qscriptprogram_p.h: Added. (QScriptProgramPrivate::get): (QScriptProgramPrivate::QScriptProgramPrivate): (QScriptProgramPrivate::~QScriptProgramPrivate): (QScriptProgramPrivate::isNull): (QScriptProgramPrivate::sourceCode): (QScriptProgramPrivate::fileName): (QScriptProgramPrivate::firstLineNumber): (QScriptProgramPrivate::operator==): (QScriptProgramPrivate::operator!=): (QScriptProgramPrivate::program): (QScriptProgramPrivate::file): (QScriptProgramPrivate::line):
  • qt/tests/qscriptengine/tst_qscriptengine.cpp: (tst_QScriptEngine::evaluateProgram):
Location:
trunk/JavaScriptCore
Files:
2 added
7 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r56318 r56320  
     12010-03-21  Jedrzej Nowacki  <jedrzej.nowacki@nokia.com>
     2
     3        Reviewed by Simon Hausmann.
     4
     5        New class; QScriptProgram.
     6
     7        The class should be used to evaluate the same script multiple times
     8        more efficiently.
     9
     10        [Qt] QtScript should have QScriptProgram class
     11        https://bugs.webkit.org/show_bug.cgi?id=36008
     12
     13        * qt/api/QtScript.pro:
     14        * qt/api/qscriptengine.cpp:
     15        (QScriptEngine::evaluate):
     16        * qt/api/qscriptengine.h:
     17        * qt/api/qscriptengine_p.cpp:
     18        (QScriptEnginePrivate::evaluate):
     19        * qt/api/qscriptengine_p.h:
     20        (QScriptEnginePrivate::evaluate):
     21        * qt/api/qscriptprogram.cpp: Added.
     22        (QScriptProgram::QScriptProgram):
     23        (QScriptProgram::~QScriptProgram):
     24        (QScriptProgram::operator=):
     25        (QScriptProgram::isNull):
     26        (QScriptProgram::sourceCode):
     27        (QScriptProgram::fileName):
     28        (QScriptProgram::firstLineNumber):
     29        (QScriptProgram::operator==):
     30        (QScriptProgram::operator!=):
     31        * qt/api/qscriptprogram.h: Added.
     32        * qt/api/qscriptprogram_p.h: Added.
     33        (QScriptProgramPrivate::get):
     34        (QScriptProgramPrivate::QScriptProgramPrivate):
     35        (QScriptProgramPrivate::~QScriptProgramPrivate):
     36        (QScriptProgramPrivate::isNull):
     37        (QScriptProgramPrivate::sourceCode):
     38        (QScriptProgramPrivate::fileName):
     39        (QScriptProgramPrivate::firstLineNumber):
     40        (QScriptProgramPrivate::operator==):
     41        (QScriptProgramPrivate::operator!=):
     42        (QScriptProgramPrivate::program):
     43        (QScriptProgramPrivate::file):
     44        (QScriptProgramPrivate::line):
     45        * qt/tests/qscriptengine/tst_qscriptengine.cpp:
     46        (tst_QScriptEngine::evaluateProgram):
     47
    1482010-03-21  David Kilzer  <ddkilzer@apple.com>
    249
  • trunk/JavaScriptCore/qt/api/QtScript.pro

    r55520 r56320  
    2424            $$PWD/qscriptvalue.cpp \
    2525            $$PWD/qscriptstring.cpp \
     26            $$PWD/qscriptprogram.cpp \
    2627
    2728HEADERS +=  $$PWD/qtscriptglobal.h \
     
    3334            $$PWD/qscriptstring.h \
    3435            $$PWD/qscriptstring_p.h \
     36            $$PWD/qscriptprogram.h \
     37            $$PWD/qscriptprogram_p.h \
    3538
    3639
     
    3841
    3942DESTDIR = $$OUTPUT_DIR/lib
    40 
  • trunk/JavaScriptCore/qt/api/qscriptengine.cpp

    r55426 r56320  
    2323
    2424#include "qscriptengine_p.h"
     25#include "qscriptprogram_p.h"
    2526#include "qscriptvalue_p.h"
    2627
     
    7071{
    7172    return QScriptValuePrivate::get(d_ptr->evaluate(program, fileName, lineNumber));
     73}
     74
     75QScriptValue QScriptEngine::evaluate(const QScriptProgram& program)
     76{
     77    return QScriptValuePrivate::get(d_ptr->evaluate(QScriptProgramPrivate::get(program)));
    7278}
    7379
  • trunk/JavaScriptCore/qt/api/qscriptengine.h

    r55426 r56320  
    2121#define qscriptengine_h
    2222
     23#include "qscriptprogram.h"
    2324#include "qscriptstring.h"
    2425#include <QtCore/qobject.h>
     
    3839
    3940    QScriptValue evaluate(const QString& program, const QString& fileName = QString(), int lineNumber = 1);
     41    QScriptValue evaluate(const QScriptProgram& program);
    4042    void collectGarbage();
    4143
  • trunk/JavaScriptCore/qt/api/qscriptengine_p.cpp

    r53850 r56320  
    2222#include "qscriptengine_p.h"
    2323
     24#include "qscriptprogram_p.h"
    2425#include "qscriptvalue_p.h"
    2526
     
    4748    JSStringRef script = QScriptConverter::toString(program);
    4849    JSStringRef file = QScriptConverter::toString(fileName);
    49     JSValueRef exception;
    50     JSValueRef result = JSEvaluateScript(m_context, script, /* Global Object */ 0, file, lineNumber, &exception);
    51     if (!result)
    52         return new QScriptValuePrivate(this, exception); // returns an exception
    53     return new QScriptValuePrivate(this, result);
     50    return new QScriptValuePrivate(this, evaluate(script, file, lineNumber));
    5451}
     52
     53/*!
     54    Evaluates program and returns the result of the evaluation.
     55    \internal
     56*/
     57QScriptValuePrivate* QScriptEnginePrivate::evaluate(const QScriptProgramPrivate* program)
     58{
     59    if (program->isNull())
     60        return new QScriptValuePrivate;
     61    return new QScriptValuePrivate(this, evaluate(program->program(), program->file(), program->line()));
     62}
  • trunk/JavaScriptCore/qt/api/qscriptengine_p.h

    r55426 r56320  
    4040
    4141    QScriptValuePrivate* evaluate(const QString& program, const QString& fileName, int lineNumber);
     42    QScriptValuePrivate* evaluate(const QScriptProgramPrivate* program);
     43    inline JSValueRef evaluate(JSStringRef program, JSStringRef fileName, int lineNumber);
    4244    inline void collectGarbage();
    4345
     
    5658    JSGlobalContextRef m_context;
    5759};
     60
     61
     62JSValueRef QScriptEnginePrivate::evaluate(JSStringRef program, JSStringRef fileName, int lineNumber)
     63{
     64    JSValueRef exception;
     65    JSValueRef result = JSEvaluateScript(m_context, program, /* Global Object */ 0, fileName, lineNumber, &exception);
     66    if (!result)
     67        return exception; // returns an exception
     68    return result;
     69}
    5870
    5971void QScriptEnginePrivate::collectGarbage()
  • trunk/JavaScriptCore/qt/api/qscriptprogram.h

    r56318 r56320  
    11/*
    2     Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
     2    Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
    33
    44    This library is free software; you can redistribute it and/or
     
    1818*/
    1919
    20 #ifndef qscriptengine_h
    21 #define qscriptengine_h
     20#ifndef qscriptprogram_h
     21#define qscriptprogram_h
    2222
    23 #include "qscriptstring.h"
    24 #include <QtCore/qobject.h>
     23#include "qtscriptglobal.h"
    2524#include <QtCore/qshareddata.h>
    2625#include <QtCore/qstring.h>
    2726
    28 class QScriptValue;
    29 class QScriptEnginePrivate;
     27class QScriptProgramPrivate;
     28class Q_JAVASCRIPT_EXPORT QScriptProgram {
     29public:
     30    QScriptProgram();
     31    QScriptProgram(const QString& sourceCode,
     32                   const QString fileName = QString(),
     33                   int firstLineNumber = 1);
     34    QScriptProgram(const QScriptProgram& other);
     35    ~QScriptProgram();
    3036
    31 // Internal typedef
    32 typedef QExplicitlySharedDataPointer<QScriptEnginePrivate> QScriptEnginePtr;
     37    QScriptProgram& operator=(const QScriptProgram& other);
    3338
    34 class QScriptEngine : public QObject {
    35 public:
    36     QScriptEngine();
    37     ~QScriptEngine();
     39    bool isNull() const;
    3840
    39     QScriptValue evaluate(const QString& program, const QString& fileName = QString(), int lineNumber = 1);
    40     void collectGarbage();
     41    QString sourceCode() const;
     42    QString fileName() const;
     43    int firstLineNumber() const;
    4144
    42     QScriptString toStringHandle(const QString& str);
     45    bool operator==(const QScriptProgram& other) const;
     46    bool operator!=(const QScriptProgram& other) const;
    4347
    44     QScriptValue nullValue();
    45     QScriptValue undefinedValue();
    4648private:
    47     friend class QScriptEnginePrivate;
    48 
    49     QScriptEnginePtr d_ptr;
     49    QExplicitlySharedDataPointer<QScriptProgramPrivate> d_ptr;
     50    Q_DECLARE_PRIVATE(QScriptProgram)
    5051};
    5152
    52 #endif
     53#endif // qscriptprogram_h
  • trunk/JavaScriptCore/qt/tests/qscriptengine/tst_qscriptengine.cpp

    r54580 r56320  
    1919
    2020#include "qscriptengine.h"
     21#include "qscriptprogram.h"
    2122#include "qscriptvalue.h"
    2223#include <QtTest/qtest.h>
     
    3839    void nullValue();
    3940    void undefinedValue();
     41    void evaluateProgram();
    4042};
    4143
     
    7476}
    7577
     78void tst_QScriptEngine::evaluateProgram()
     79{
     80    QScriptEngine eng;
     81    {
     82        QString code("1 + 2");
     83        QString fileName("hello.js");
     84        int lineNumber = 123;
     85        QScriptProgram program(code, fileName, lineNumber);
     86        QVERIFY(!program.isNull());
     87        QCOMPARE(program.sourceCode(), code);
     88        QCOMPARE(program.fileName(), fileName);
     89        QCOMPARE(program.firstLineNumber(), lineNumber);
     90
     91        QScriptValue expected = eng.evaluate(code);
     92        for (int x = 0; x < 10; ++x) {
     93            QScriptValue ret = eng.evaluate(program);
     94            QVERIFY(ret.equals(expected));
     95        }
     96
     97        // operator=
     98        QScriptProgram sameProgram = program;
     99        QVERIFY(sameProgram == program);
     100        QVERIFY(eng.evaluate(sameProgram).equals(expected));
     101
     102        // copy constructor
     103        QScriptProgram sameProgram2(program);
     104        QVERIFY(sameProgram2 == program);
     105        QVERIFY(eng.evaluate(sameProgram2).equals(expected));
     106
     107        QScriptProgram differentProgram("2 + 3");
     108        QVERIFY(differentProgram != program);
     109        QVERIFY(!eng.evaluate(differentProgram).equals(expected));
     110    }
     111
     112    // Program that accesses variable in the scope
     113    {
     114        QScriptProgram program("a");
     115        QVERIFY(!program.isNull());
     116        {
     117            QScriptValue ret = eng.evaluate(program);
     118            QVERIFY(ret.isError());
     119            QCOMPARE(ret.toString(), QString::fromLatin1("ReferenceError: Can't find variable: a"));
     120        }
     121        {
     122            QScriptValue ret = eng.evaluate(program);
     123            QVERIFY(ret.isError());
     124        }
     125        eng.evaluate("a = 456");
     126        {
     127            QScriptValue ret = eng.evaluate(program);
     128            QVERIFY(!ret.isError());
     129            QCOMPARE(ret.toNumber(), 456.0);
     130        }
     131    }
     132
     133    // Program that creates closure
     134    {
     135        QScriptProgram program("(function() { var count = 0; return function() { return count++; }; })");
     136        QVERIFY(!program.isNull());
     137        QScriptValue createCounter = eng.evaluate(program);
     138        QVERIFY(createCounter.isFunction());
     139        QScriptValue counter = createCounter.call();
     140        QVERIFY(counter.isFunction());
     141        {
     142            QScriptValue ret = counter.call();
     143            QVERIFY(ret.isNumber());
     144        }
     145        QScriptValue counter2 = createCounter.call();
     146        QVERIFY(counter2.isFunction());
     147        QVERIFY(!counter2.equals(counter));
     148        {
     149            QScriptValue ret = counter2.call();
     150            QVERIFY(ret.isNumber());
     151        }
     152    }
     153
     154    // Same program run in different engines
     155    {
     156        QString code("1 + 2");
     157        QScriptProgram program(code);
     158        QVERIFY(!program.isNull());
     159        double expected = eng.evaluate(program).toNumber();
     160        for (int x = 0; x < 2; ++x) {
     161            QScriptEngine eng2;
     162            for (int y = 0; y < 2; ++y) {
     163                double ret = eng2.evaluate(program).toNumber();
     164                QCOMPARE(ret, expected);
     165            }
     166        }
     167    }
     168
     169    // No program
     170    {
     171        QScriptProgram program;
     172        QVERIFY(program.isNull());
     173        QScriptValue ret = eng.evaluate(program);
     174        QVERIFY(!ret.isValid());
     175    }
     176}
     177
    76178QTEST_MAIN(tst_QScriptEngine)
    77179#include "tst_qscriptengine.moc"
Note: See TracChangeset for help on using the changeset viewer.