Changeset 56320 in webkit
- Timestamp:
- Mar 21, 2010 3:30:22 PM (14 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 2 added
- 7 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r56318 r56320 1 2010-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 1 48 2010-03-21 David Kilzer <ddkilzer@apple.com> 2 49 -
trunk/JavaScriptCore/qt/api/QtScript.pro
r55520 r56320 24 24 $$PWD/qscriptvalue.cpp \ 25 25 $$PWD/qscriptstring.cpp \ 26 $$PWD/qscriptprogram.cpp \ 26 27 27 28 HEADERS += $$PWD/qtscriptglobal.h \ … … 33 34 $$PWD/qscriptstring.h \ 34 35 $$PWD/qscriptstring_p.h \ 36 $$PWD/qscriptprogram.h \ 37 $$PWD/qscriptprogram_p.h \ 35 38 36 39 … … 38 41 39 42 DESTDIR = $$OUTPUT_DIR/lib 40 -
trunk/JavaScriptCore/qt/api/qscriptengine.cpp
r55426 r56320 23 23 24 24 #include "qscriptengine_p.h" 25 #include "qscriptprogram_p.h" 25 26 #include "qscriptvalue_p.h" 26 27 … … 70 71 { 71 72 return QScriptValuePrivate::get(d_ptr->evaluate(program, fileName, lineNumber)); 73 } 74 75 QScriptValue QScriptEngine::evaluate(const QScriptProgram& program) 76 { 77 return QScriptValuePrivate::get(d_ptr->evaluate(QScriptProgramPrivate::get(program))); 72 78 } 73 79 -
trunk/JavaScriptCore/qt/api/qscriptengine.h
r55426 r56320 21 21 #define qscriptengine_h 22 22 23 #include "qscriptprogram.h" 23 24 #include "qscriptstring.h" 24 25 #include <QtCore/qobject.h> … … 38 39 39 40 QScriptValue evaluate(const QString& program, const QString& fileName = QString(), int lineNumber = 1); 41 QScriptValue evaluate(const QScriptProgram& program); 40 42 void collectGarbage(); 41 43 -
trunk/JavaScriptCore/qt/api/qscriptengine_p.cpp
r53850 r56320 22 22 #include "qscriptengine_p.h" 23 23 24 #include "qscriptprogram_p.h" 24 25 #include "qscriptvalue_p.h" 25 26 … … 47 48 JSStringRef script = QScriptConverter::toString(program); 48 49 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)); 54 51 } 52 53 /*! 54 Evaluates program and returns the result of the evaluation. 55 \internal 56 */ 57 QScriptValuePrivate* 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 40 40 41 41 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); 42 44 inline void collectGarbage(); 43 45 … … 56 58 JSGlobalContextRef m_context; 57 59 }; 60 61 62 JSValueRef 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 } 58 70 59 71 void QScriptEnginePrivate::collectGarbage() -
trunk/JavaScriptCore/qt/api/qscriptprogram.h
r56318 r56320 1 1 /* 2 Copyright (C) 20 09Nokia Corporation and/or its subsidiary(-ies)2 Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 3 3 4 4 This library is free software; you can redistribute it and/or … … 18 18 */ 19 19 20 #ifndef qscript engine_h21 #define qscript engine_h20 #ifndef qscriptprogram_h 21 #define qscriptprogram_h 22 22 23 #include "qscriptstring.h" 24 #include <QtCore/qobject.h> 23 #include "qtscriptglobal.h" 25 24 #include <QtCore/qshareddata.h> 26 25 #include <QtCore/qstring.h> 27 26 28 class QScriptValue; 29 class QScriptEnginePrivate; 27 class QScriptProgramPrivate; 28 class Q_JAVASCRIPT_EXPORT QScriptProgram { 29 public: 30 QScriptProgram(); 31 QScriptProgram(const QString& sourceCode, 32 const QString fileName = QString(), 33 int firstLineNumber = 1); 34 QScriptProgram(const QScriptProgram& other); 35 ~QScriptProgram(); 30 36 31 // Internal typedef 32 typedef QExplicitlySharedDataPointer<QScriptEnginePrivate> QScriptEnginePtr; 37 QScriptProgram& operator=(const QScriptProgram& other); 33 38 34 class QScriptEngine : public QObject { 35 public: 36 QScriptEngine(); 37 ~QScriptEngine(); 39 bool isNull() const; 38 40 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; 41 44 42 QScriptString toStringHandle(const QString& str); 45 bool operator==(const QScriptProgram& other) const; 46 bool operator!=(const QScriptProgram& other) const; 43 47 44 QScriptValue nullValue();45 QScriptValue undefinedValue();46 48 private: 47 friend class QScriptEnginePrivate; 48 49 QScriptEnginePtr d_ptr; 49 QExplicitlySharedDataPointer<QScriptProgramPrivate> d_ptr; 50 Q_DECLARE_PRIVATE(QScriptProgram) 50 51 }; 51 52 52 #endif 53 #endif // qscriptprogram_h -
trunk/JavaScriptCore/qt/tests/qscriptengine/tst_qscriptengine.cpp
r54580 r56320 19 19 20 20 #include "qscriptengine.h" 21 #include "qscriptprogram.h" 21 22 #include "qscriptvalue.h" 22 23 #include <QtTest/qtest.h> … … 38 39 void nullValue(); 39 40 void undefinedValue(); 41 void evaluateProgram(); 40 42 }; 41 43 … … 74 76 } 75 77 78 void 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 76 178 QTEST_MAIN(tst_QScriptEngine) 77 179 #include "tst_qscriptengine.moc"
Note: See TracChangeset
for help on using the changeset viewer.