1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/* 2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block This library is free software; you can redistribute it and/or 5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block modify it under the terms of the GNU Library General Public 6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block License as published by the Free Software Foundation; either 7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block version 2 of the License, or (at your option) any later version. 8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block This library is distributed in the hope that it will be useful, 10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block but WITHOUT ANY WARRANTY; without even the implied warranty of 11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Library General Public License for more details. 13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block You should have received a copy of the GNU Library General Public License 15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block along with this library; see the file COPYING.LIB. If not, write to 16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Boston, MA 02110-1301, USA. 18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block*/ 19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifndef qscriptprogram_p_h 21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#define qscriptprogram_p_h 22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "qscriptconverter_p.h" 24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "qscriptprogram.h" 25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <JavaScriptCore/JavaScript.h> 26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QtCore/qshareddata.h> 27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <QtCore/qstring.h> 28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/* 30dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block FIXME The QScriptProgramPrivate potentially could be much faster. In current implementation we 31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block gain CPU time only by avoiding QString -> JSStringRef conversion. In the ideal world we should 32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block have a function inside the JSC C API that could provide us "parse once, execute multiple times" 33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block functionality. 34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block*/ 35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass QScriptProgramPrivate : public QSharedData { 37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockpublic: 38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block inline static QScriptProgramPrivate* get(const QScriptProgram& program); 39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block inline QScriptProgramPrivate(); 40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block inline QScriptProgramPrivate(const QString& sourceCode, 41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block const QString fileName, 42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int firstLineNumber); 43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block inline ~QScriptProgramPrivate(); 45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block inline bool isNull() const; 47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block inline QString sourceCode() const; 49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block inline QString fileName() const; 50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block inline int firstLineNumber() const; 51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block inline bool operator==(const QScriptProgramPrivate& other) const; 53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block inline bool operator!=(const QScriptProgramPrivate& other) const; 54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 55545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch inline operator JSStringRef() const; 56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block inline JSStringRef file() const; 57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block inline int line() const; 58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockprivate: 59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block JSStringRef m_program; 60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block JSStringRef m_fileName; 61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int m_line; 62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}; 63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockQScriptProgramPrivate* QScriptProgramPrivate::get(const QScriptProgram& program) 65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return const_cast<QScriptProgramPrivate*>(program.d_ptr.constData()); 67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockQScriptProgramPrivate::QScriptProgramPrivate() 70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block : m_program(0) 71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block , m_fileName(0) 72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block , m_line(-1) 73dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{} 74dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockQScriptProgramPrivate::QScriptProgramPrivate(const QString& sourceCode, 76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block const QString fileName, 77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int firstLineNumber) 78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block : m_program(QScriptConverter::toString(sourceCode)) 79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block , m_fileName(QScriptConverter::toString(fileName)) 80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block , m_line(firstLineNumber) 81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{} 82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockQScriptProgramPrivate::~QScriptProgramPrivate() 84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!isNull()) { 86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block JSStringRelease(m_program); 87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block JSStringRelease(m_fileName); 88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool QScriptProgramPrivate::isNull() const 92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return !m_program; 94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockQString QScriptProgramPrivate::sourceCode() const 97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return QScriptConverter::toString(m_program); 99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockQString QScriptProgramPrivate::fileName() const 102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return QScriptConverter::toString(m_fileName); 104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockint QScriptProgramPrivate::firstLineNumber() const 107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return m_line; 109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool QScriptProgramPrivate::operator==(const QScriptProgramPrivate& other) const 112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return m_line == other.m_line 114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block && JSStringIsEqual(m_fileName, other.m_fileName) 115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block && JSStringIsEqual(m_program, other.m_program); 116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool QScriptProgramPrivate::operator!=(const QScriptProgramPrivate& other) const 119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return m_line != other.m_line 121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block || !JSStringIsEqual(m_fileName, other.m_fileName) 122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block || !JSStringIsEqual(m_program, other.m_program); 123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 125545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochQScriptProgramPrivate::operator JSStringRef() const 126545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{ 127545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch return m_program; 128545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch} 129545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch 130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockJSStringRef QScriptProgramPrivate::file() const {return m_fileName; } 131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockint QScriptProgramPrivate::line() const { return m_line; } 132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif // qscriptprogram_p_h 134