summaryrefslogtreecommitdiffstats
path: root/JavaScriptCore/qt/api/qscriptprogram_p.h
blob: 6e80e853b79d24407136c7be91891d1c3e79bd88 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
    Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public License
    along with this library; see the file COPYING.LIB.  If not, write to
    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.
*/

#ifndef qscriptprogram_p_h
#define qscriptprogram_p_h

#include "qscriptconverter_p.h"
#include "qscriptprogram.h"
#include <JavaScriptCore/JavaScript.h>
#include <QtCore/qshareddata.h>
#include <QtCore/qstring.h>

/*
   FIXME The QScriptProgramPrivate potentially could be much faster. In current implementation we
   gain CPU time only by avoiding QString -> JSStringRef conversion. In the ideal world we should
   have a function inside the JSC C API that could provide us "parse once, execute multiple times"
   functionality.
*/

class QScriptProgramPrivate : public QSharedData {
public:
    inline static QScriptProgramPrivate* get(const QScriptProgram& program);
    inline QScriptProgramPrivate();
    inline QScriptProgramPrivate(const QString& sourceCode,
                   const QString fileName,
                   int firstLineNumber);

    inline ~QScriptProgramPrivate();

    inline bool isNull() const;

    inline QString sourceCode() const;
    inline QString fileName() const;
    inline int firstLineNumber() const;

    inline bool operator==(const QScriptProgramPrivate& other) const;
    inline bool operator!=(const QScriptProgramPrivate& other) const;

    inline JSStringRef program() const;
    inline JSStringRef file() const;
    inline int line() const;
private:
    JSStringRef m_program;
    JSStringRef m_fileName;
    int m_line;
};

QScriptProgramPrivate* QScriptProgramPrivate::get(const QScriptProgram& program)
{
    return const_cast<QScriptProgramPrivate*>(program.d_ptr.constData());
}

QScriptProgramPrivate::QScriptProgramPrivate()
    : m_program(0)
    , m_fileName(0)
    , m_line(-1)
{}

QScriptProgramPrivate::QScriptProgramPrivate(const QString& sourceCode,
               const QString fileName,
               int firstLineNumber)
                   : m_program(QScriptConverter::toString(sourceCode))
                   , m_fileName(QScriptConverter::toString(fileName))
                   , m_line(firstLineNumber)
{}

QScriptProgramPrivate::~QScriptProgramPrivate()
{
    if (!isNull()) {
        JSStringRelease(m_program);
        JSStringRelease(m_fileName);
    }
}

bool QScriptProgramPrivate::isNull() const
{
    return !m_program;
}

QString QScriptProgramPrivate::sourceCode() const
{
    return QScriptConverter::toString(m_program);
}

QString QScriptProgramPrivate::fileName() const
{
    return QScriptConverter::toString(m_fileName);
}

int QScriptProgramPrivate::firstLineNumber() const
{
    return m_line;
}

bool QScriptProgramPrivate::operator==(const QScriptProgramPrivate& other) const
{
    return m_line == other.m_line
            && JSStringIsEqual(m_fileName, other.m_fileName)
            && JSStringIsEqual(m_program, other.m_program);
}

bool QScriptProgramPrivate::operator!=(const QScriptProgramPrivate& other) const
{
    return m_line != other.m_line
            || !JSStringIsEqual(m_fileName, other.m_fileName)
            || !JSStringIsEqual(m_program, other.m_program);
}

JSStringRef QScriptProgramPrivate::program() const { return m_program; }
JSStringRef QScriptProgramPrivate::file() const {return m_fileName; }
int QScriptProgramPrivate::line() const { return m_line; }

#endif // qscriptprogram_p_h