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