Qt 4.8
qdeclarativejsengine_p.cpp
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
5 **
6 ** This file is part of the QtDeclarative module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia. For licensing terms and
14 ** conditions see http://qt.digia.com/licensing. For further information
15 ** use the contact form at http://qt.digia.com/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 **
25 ** In addition, as a special exception, Digia gives you certain additional
26 ** rights. These rights are described in the Digia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 **
29 ** GNU General Public License Usage
30 ** Alternatively, this file may be used under the terms of the GNU
31 ** General Public License version 3.0 as published by the Free Software
32 ** Foundation and appearing in the file LICENSE.GPL included in the
33 ** packaging of this file. Please review the following information to
34 ** ensure the GNU General Public License version 3.0 requirements will be
35 ** met: http://www.gnu.org/copyleft/gpl.html.
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41 
42 #include "private/qdeclarativejsengine_p.h"
43 
44 #include "private/qdeclarativejsglobal_p.h"
45 #include "private/qdeclarativejsnodepool_p.h"
46 
47 #include <qnumeric.h>
48 #include <QHash>
49 
51 
52 namespace QDeclarativeJS {
53 
55 { return qHash(id.asString()); }
56 
57 QString numberToString(double value)
58 { return QString::number(value); }
59 
61 {
62  static QHash<QChar, int> flagsHash;
63  if (flagsHash.isEmpty()) {
64  flagsHash[QLatin1Char('g')] = Global;
65  flagsHash[QLatin1Char('i')] = IgnoreCase;
66  flagsHash[QLatin1Char('m')] = Multiline;
67  }
69  it = flagsHash.constFind(ch);
70  if (it == flagsHash.constEnd())
71  return 0;
72  return it.value();
73 }
74 
76 {
77  QString result;
78  if (flags & Global)
79  result += QLatin1Char('g');
80  if (flags & IgnoreCase)
81  result += QLatin1Char('i');
82  if (flags & Multiline)
83  result += QLatin1Char('m');
84  return result;
85 }
86 
88  : m_fileName(fileName), m_engine(engine)
89 {
90  m_engine->setNodePool(this);
91 }
92 
94 {
95 }
96 
97 Code *NodePool::createCompiledCode(AST::Node *, CompilationUnit &)
98 {
99  Q_ASSERT(0);
100  return 0;
101 }
102 
103 static int toDigit(char c)
104 {
105  if ((c >= '0') && (c <= '9'))
106  return c - '0';
107  else if ((c >= 'a') && (c <= 'z'))
108  return 10 + c - 'a';
109  else if ((c >= 'A') && (c <= 'Z'))
110  return 10 + c - 'A';
111  return -1;
112 }
113 
114 double integerFromString(const char *buf, int size, int radix)
115 {
116  if (size == 0)
117  return qSNaN();
118 
119  double sign = 1.0;
120  int i = 0;
121  if (buf[0] == '+') {
122  ++i;
123  } else if (buf[0] == '-') {
124  sign = -1.0;
125  ++i;
126  }
127 
128  if (((size-i) >= 2) && (buf[i] == '0')) {
129  if (((buf[i+1] == 'x') || (buf[i+1] == 'X'))
130  && (radix < 34)) {
131  if ((radix != 0) && (radix != 16))
132  return 0;
133  radix = 16;
134  i += 2;
135  } else {
136  if (radix == 0) {
137  radix = 8;
138  ++i;
139  }
140  }
141  } else if (radix == 0) {
142  radix = 10;
143  }
144 
145  int j = i;
146  for ( ; i < size; ++i) {
147  int d = toDigit(buf[i]);
148  if ((d == -1) || (d >= radix))
149  break;
150  }
151  double result;
152  if (j == i) {
153  if (!qstrcmp(buf, "Infinity"))
154  result = qInf();
155  else
156  result = qSNaN();
157  } else {
158  result = 0;
159  double multiplier = 1;
160  for (--i ; i >= j; --i, multiplier *= radix)
161  result += toDigit(buf[i]) * multiplier;
162  }
163  result *= sign;
164  return result;
165 }
166 
167 double integerFromString(const QString &str, int radix)
168 {
169  QByteArray ba = str.trimmed().toLatin1();
170  return integerFromString(ba.constData(), ba.size(), radix);
171 }
172 
173 
175  : _lexer(0), _nodePool(0)
176 { }
177 
179 { }
180 
182 { return _literals; }
183 
184 void Engine::addComment(int pos, int len, int line, int col)
185 { if (len > 0) _comments.append(QDeclarativeJS::AST::SourceLocation(pos, len, line, col)); }
186 
188 { return _comments; }
189 
190 NameId *Engine::intern(const QChar *u, int s)
191 { return const_cast<NameId *>(&*_literals.insert(NameId(u, s))); }
192 
194 { return id->asString(); }
195 
197 { return _lexer; }
198 
200 { _lexer = lexer; }
201 
203 { return _nodePool; }
204 
206 { _nodePool = nodePool; }
207 
208 
209 
210 } // end of namespace QDeclarativeJS
211 
static QString number(int, int base=10)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: qstring.cpp:6448
double d
Definition: qnumeric_p.h:62
The QHash::const_iterator class provides an STL-style const iterator for QHash and QMultiHash...
Definition: qhash.h:395
unsigned char c[8]
Definition: qnumeric_p.h:62
static int flagFromChar(const QChar &)
#define it(className, varName)
void setNodePool(NodePool *nodePool)
The QByteArray class provides an array of bytes.
Definition: qbytearray.h:135
NameId * intern(const QChar *u, int s)
quint16 u
The QString class provides a Unicode character string.
Definition: qstring.h:83
The QHash class is a template class that provides a hash-table-based dictionary.
Definition: qdatastream.h:66
#define Q_ASSERT(cond)
Definition: qglobal.h:1823
The QChar class provides a 16-bit Unicode character.
Definition: qchar.h:72
QString numberToString(double value)
Code * createCompiledCode(AST::Node *node, CompilationUnit &compilation)
static int sign(int x)
void append(const T &t)
Inserts value at the end of the list.
Definition: qlist.h:507
static QString flagsToString(int flags)
QString trimmed() const Q_REQUIRED_RESULT
Returns a string that has whitespace removed from the start and the end.
Definition: qstring.cpp:4506
QList< QDeclarativeJS::AST::SourceLocation > comments() const
bool isEmpty() const
Returns true if the hash contains no items; otherwise returns false.
Definition: qhash.h:297
const T & value() const
Returns the current item&#39;s value.
Definition: qhash.h:420
#define QT_QML_END_NAMESPACE
unsigned int uint
Definition: qglobal.h:996
const_iterator constFind(const Key &key) const
Returns an iterator pointing to the item with the key in the hash.
Definition: qhash.h:859
NodePool(const QString &fileName, Engine *engine)
QByteArray toLatin1() const Q_REQUIRED_RESULT
Returns a Latin-1 representation of the string as a QByteArray.
Definition: qstring.cpp:3993
#define QT_QML_BEGIN_NAMESPACE
Q_CORE_EXPORT double qSNaN()
Returns the bit pattern of a signalling NaN as a double.
Definition: qnumeric.cpp:80
const char * constData() const
Returns a pointer to the data stored in the byte array.
Definition: qbytearray.h:433
const_iterator constEnd() const
Returns a const STL-style iterator pointing to the imaginary item after the last item in the hash...
Definition: qhash.h:469
Q_CORE_EXPORT double qInf()
Returns the bit pattern for an infinite number as a double.
Definition: qnumeric.cpp:90
static int toDigit(char c)
void addComment(int pos, int len, int line, int col)
int size() const
Returns the number of bytes in this byte array.
Definition: qbytearray.h:402
uint qHash(const QDeclarativeJS::NameId &id)
int qstrcmp(const QByteArray &str1, const char *str2)
Definition: qbytearray.cpp:336
double integerFromString(const char *buf, int size, int radix)
QSet< NameId > literals() const
static QString fileName(const QString &fileUrl)
The QLatin1Char class provides an 8-bit ASCII/Latin-1 character.
Definition: qchar.h:55
QList< QDeclarativeJS::AST::SourceLocation > _comments
static QString toString(NameId *id)