1d0825bca7fe65beaee391d30da42e937db621564Steve Block/*
2d0825bca7fe65beaee391d30da42e937db621564Steve Block    Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
3d0825bca7fe65beaee391d30da42e937db621564Steve Block
4d0825bca7fe65beaee391d30da42e937db621564Steve Block    This library is free software; you can redistribute it and/or
5d0825bca7fe65beaee391d30da42e937db621564Steve Block    modify it under the terms of the GNU Library General Public
6d0825bca7fe65beaee391d30da42e937db621564Steve Block    License as published by the Free Software Foundation; either
7d0825bca7fe65beaee391d30da42e937db621564Steve Block    version 2 of the License, or (at your option) any later version.
8d0825bca7fe65beaee391d30da42e937db621564Steve Block
9d0825bca7fe65beaee391d30da42e937db621564Steve Block    This library is distributed in the hope that it will be useful,
10d0825bca7fe65beaee391d30da42e937db621564Steve Block    but WITHOUT ANY WARRANTY; without even the implied warranty of
11d0825bca7fe65beaee391d30da42e937db621564Steve Block    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12d0825bca7fe65beaee391d30da42e937db621564Steve Block    Library General Public License for more details.
13d0825bca7fe65beaee391d30da42e937db621564Steve Block
14d0825bca7fe65beaee391d30da42e937db621564Steve Block    You should have received a copy of the GNU Library General Public License
15d0825bca7fe65beaee391d30da42e937db621564Steve Block    along with this library; see the file COPYING.LIB.  If not, write to
16d0825bca7fe65beaee391d30da42e937db621564Steve Block    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17d0825bca7fe65beaee391d30da42e937db621564Steve Block    Boston, MA 02110-1301, USA.
18d0825bca7fe65beaee391d30da42e937db621564Steve Block*/
19d0825bca7fe65beaee391d30da42e937db621564Steve Block
20d0825bca7fe65beaee391d30da42e937db621564Steve Block#ifndef qscriptengine_p_h
21d0825bca7fe65beaee391d30da42e937db621564Steve Block#define qscriptengine_p_h
22d0825bca7fe65beaee391d30da42e937db621564Steve Block
23d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "qscriptconverter_p.h"
24d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "qscriptengine.h"
25967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#include "qscriptoriginalglobalobject_p.h"
26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "qscriptstring_p.h"
27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "qscriptsyntaxcheckresult_p.h"
28d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "qscriptvalue.h"
29d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <JavaScriptCore/JavaScript.h>
30ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include <JavaScriptCore/JSRetainPtr.h>
31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <JSBasePrivate.h>
32d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <QtCore/qshareddata.h>
33d0825bca7fe65beaee391d30da42e937db621564Steve Block#include <QtCore/qstring.h>
34ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#include <QtCore/qstringlist.h>
35d0825bca7fe65beaee391d30da42e937db621564Steve Block
36d0825bca7fe65beaee391d30da42e937db621564Steve Blockclass QScriptEngine;
37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockclass QScriptSyntaxCheckResultPrivate;
38d0825bca7fe65beaee391d30da42e937db621564Steve Block
39d0825bca7fe65beaee391d30da42e937db621564Steve Blockclass QScriptEnginePrivate : public QSharedData {
40d0825bca7fe65beaee391d30da42e937db621564Steve Blockpublic:
4121939df44de1705786c545cd1bf519d47250322dBen Murdoch    static QScriptEnginePrivate* get(const QScriptEngine* q) { Q_ASSERT(q); return q->d_ptr.data(); }
42d0825bca7fe65beaee391d30da42e937db621564Steve Block    static QScriptEngine* get(const QScriptEnginePrivate* d) { Q_ASSERT(d); return d->q_ptr; }
43d0825bca7fe65beaee391d30da42e937db621564Steve Block
44d0825bca7fe65beaee391d30da42e937db621564Steve Block    QScriptEnginePrivate(const QScriptEngine*);
45d0825bca7fe65beaee391d30da42e937db621564Steve Block    ~QScriptEnginePrivate();
46d0825bca7fe65beaee391d30da42e937db621564Steve Block
47ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    enum SetExceptionFlag {
48ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        IgnoreNullException = 0x01,
49ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        NotNullException = 0x02,
50ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    };
51ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QScriptSyntaxCheckResultPrivate* checkSyntax(const QString& program);
53d0825bca7fe65beaee391d30da42e937db621564Steve Block    QScriptValuePrivate* evaluate(const QString& program, const QString& fileName, int lineNumber);
54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QScriptValuePrivate* evaluate(const QScriptProgramPrivate* program);
55dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    inline JSValueRef evaluate(JSStringRef program, JSStringRef fileName, int lineNumber);
56dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
57ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    inline bool hasUncaughtException() const;
58ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    QScriptValuePrivate* uncaughtException() const;
59ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    inline void clearExceptions();
60ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    inline void setException(JSValueRef exception, const /* SetExceptionFlags */ unsigned flags = IgnoreNullException);
61ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    inline int uncaughtExceptionLineNumber() const;
62ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    inline QStringList uncaughtExceptionBacktrace() const;
63ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
64d0825bca7fe65beaee391d30da42e937db621564Steve Block    inline void collectGarbage();
65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    inline void reportAdditionalMemoryCost(int cost);
66d0825bca7fe65beaee391d30da42e937db621564Steve Block
67d0825bca7fe65beaee391d30da42e937db621564Steve Block    inline JSValueRef makeJSValue(double number) const;
68d0825bca7fe65beaee391d30da42e937db621564Steve Block    inline JSValueRef makeJSValue(int number) const;
69d0825bca7fe65beaee391d30da42e937db621564Steve Block    inline JSValueRef makeJSValue(uint number) const;
70d0825bca7fe65beaee391d30da42e937db621564Steve Block    inline JSValueRef makeJSValue(const QString& string) const;
71d0825bca7fe65beaee391d30da42e937db621564Steve Block    inline JSValueRef makeJSValue(bool number) const;
72d0825bca7fe65beaee391d30da42e937db621564Steve Block    inline JSValueRef makeJSValue(QScriptValue::SpecialValue value) const;
73d0825bca7fe65beaee391d30da42e937db621564Steve Block
740617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    QScriptValuePrivate* newFunction(QScriptEngine::FunctionSignature fun, QScriptValuePrivate* prototype, int length);
750617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    QScriptValuePrivate* newFunction(QScriptEngine::FunctionWithArgSignature fun, void* arg);
760617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    QScriptValuePrivate* newFunction(JSObjectRef funObject, QScriptValuePrivate* prototype);
770617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
78545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QScriptValuePrivate* newObject() const;
79ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    QScriptValuePrivate* newArray(uint length);
80bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    QScriptValuePrivate* newDate(qsreal value);
81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QScriptValuePrivate* globalObject() const;
82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    inline QScriptStringPrivate* toStringHandle(const QString& str) const;
84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
85545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    inline operator JSGlobalContextRef() const;
86e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
87bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    inline bool isDate(JSValueRef value) const;
88e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke    inline bool isArray(JSValueRef value) const;
89967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    inline bool isError(JSValueRef value) const;
90967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    inline bool objectHasOwnProperty(JSObjectRef object, JSStringRef property) const;
91967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    inline QVector<JSStringRef> objectGetOwnPropertyNames(JSObjectRef object) const;
92bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
93d0825bca7fe65beaee391d30da42e937db621564Steve Blockprivate:
94d0825bca7fe65beaee391d30da42e937db621564Steve Block    QScriptEngine* q_ptr;
95d0825bca7fe65beaee391d30da42e937db621564Steve Block    JSGlobalContextRef m_context;
96ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    JSValueRef m_exception;
97e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
98967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    QScriptOriginalGlobalObject m_originalGlobalObject;
990617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
1000617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    JSClassRef m_nativeFunctionClass;
1010617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    JSClassRef m_nativeFunctionWithArgClass;
102d0825bca7fe65beaee391d30da42e937db621564Steve Block};
103d0825bca7fe65beaee391d30da42e937db621564Steve Block
104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/*!
106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  Evaluates given JavaScript program and returns result of the evaluation.
107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  \attention this function doesn't take ownership of the parameters.
108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block  \internal
109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block*/
110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockJSValueRef QScriptEnginePrivate::evaluate(JSStringRef program, JSStringRef fileName, int lineNumber)
111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    JSValueRef exception;
113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    JSValueRef result = JSEvaluateScript(m_context, program, /* Global Object */ 0, fileName, lineNumber, &exception);
114ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (!result) {
115ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        setException(exception, NotNullException);
116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return exception; // returns an exception
117ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    }
118ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    clearExceptions();
119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return result;
120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
122ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockbool QScriptEnginePrivate::hasUncaughtException() const
123ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
124ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return m_exception;
125ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
126ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
127ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockvoid QScriptEnginePrivate::clearExceptions()
128ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
129ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (m_exception)
130ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        JSValueUnprotect(m_context, m_exception);
131ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_exception = 0;
132ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
133ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
134ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockvoid QScriptEnginePrivate::setException(JSValueRef exception, const /* SetExceptionFlags */ unsigned flags)
135ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
136ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (!((flags & NotNullException) || exception))
137ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        return;
138ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    Q_ASSERT(exception);
139ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
140ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (m_exception)
141ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        JSValueUnprotect(m_context, m_exception);
142ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    JSValueProtect(m_context, exception);
143ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    m_exception = exception;
144ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
145ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
146ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockint QScriptEnginePrivate::uncaughtExceptionLineNumber() const
147ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
148ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (!hasUncaughtException() || !JSValueIsObject(m_context, m_exception))
149ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        return -1;
150ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
151ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    JSValueRef exception = 0;
152ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    JSRetainPtr<JSStringRef> lineNumberPropertyName(Adopt, QScriptConverter::toString("line"));
153ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    JSValueRef lineNumber = JSObjectGetProperty(m_context, const_cast<JSObjectRef>(m_exception), lineNumberPropertyName.get(), &exception);
154ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    int result = JSValueToNumber(m_context, lineNumber, &exception);
155ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return exception ? -1 : result;
156ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
157ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
158ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve BlockQStringList QScriptEnginePrivate::uncaughtExceptionBacktrace() const
159ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
160ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    if (!hasUncaughtException() || !JSValueIsObject(m_context, m_exception))
161ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block        return QStringList();
162ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
163ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    JSValueRef exception = 0;
164ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    JSRetainPtr<JSStringRef> fileNamePropertyName(Adopt, QScriptConverter::toString("sourceURL"));
165ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    JSRetainPtr<JSStringRef> lineNumberPropertyName(Adopt, QScriptConverter::toString("line"));
166ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    JSValueRef jsFileName = JSObjectGetProperty(m_context, const_cast<JSObjectRef>(m_exception), fileNamePropertyName.get(), &exception);
167ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    JSValueRef jsLineNumber = JSObjectGetProperty(m_context, const_cast<JSObjectRef>(m_exception), lineNumberPropertyName.get(), &exception);
168ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    JSRetainPtr<JSStringRef> fileName(Adopt, JSValueToStringCopy(m_context, jsFileName, &exception));
169ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    int lineNumber = JSValueToNumber(m_context, jsLineNumber, &exception);
170ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    return QStringList(QString::fromLatin1("<anonymous>()@%0:%1")
171ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            .arg(QScriptConverter::toString(fileName.get()))
172ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block            .arg(QScriptConverter::toString(exception ? -1 : lineNumber)));
173ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
174ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
175d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid QScriptEnginePrivate::collectGarbage()
176d0825bca7fe65beaee391d30da42e937db621564Steve Block{
177d0825bca7fe65beaee391d30da42e937db621564Steve Block    JSGarbageCollect(m_context);
178d0825bca7fe65beaee391d30da42e937db621564Steve Block}
179d0825bca7fe65beaee391d30da42e937db621564Steve Block
180dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid QScriptEnginePrivate::reportAdditionalMemoryCost(int cost)
181dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
182dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    if (cost > 0)
183dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        JSReportExtraMemoryCost(m_context, cost);
184dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
185dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
186d0825bca7fe65beaee391d30da42e937db621564Steve BlockJSValueRef QScriptEnginePrivate::makeJSValue(double number) const
187d0825bca7fe65beaee391d30da42e937db621564Steve Block{
188d0825bca7fe65beaee391d30da42e937db621564Steve Block    return JSValueMakeNumber(m_context, number);
189d0825bca7fe65beaee391d30da42e937db621564Steve Block}
190d0825bca7fe65beaee391d30da42e937db621564Steve Block
191d0825bca7fe65beaee391d30da42e937db621564Steve BlockJSValueRef QScriptEnginePrivate::makeJSValue(int number) const
192d0825bca7fe65beaee391d30da42e937db621564Steve Block{
193d0825bca7fe65beaee391d30da42e937db621564Steve Block    return JSValueMakeNumber(m_context, number);
194d0825bca7fe65beaee391d30da42e937db621564Steve Block}
195d0825bca7fe65beaee391d30da42e937db621564Steve Block
196d0825bca7fe65beaee391d30da42e937db621564Steve BlockJSValueRef QScriptEnginePrivate::makeJSValue(uint number) const
197d0825bca7fe65beaee391d30da42e937db621564Steve Block{
198d0825bca7fe65beaee391d30da42e937db621564Steve Block    return JSValueMakeNumber(m_context, number);
199d0825bca7fe65beaee391d30da42e937db621564Steve Block}
200d0825bca7fe65beaee391d30da42e937db621564Steve Block
201d0825bca7fe65beaee391d30da42e937db621564Steve BlockJSValueRef QScriptEnginePrivate::makeJSValue(const QString& string) const
202d0825bca7fe65beaee391d30da42e937db621564Steve Block{
203dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    JSStringRef tmp = QScriptConverter::toString(string);
204dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    JSValueRef result = JSValueMakeString(m_context, tmp);
205dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    JSStringRelease(tmp);
206dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return result;
207d0825bca7fe65beaee391d30da42e937db621564Steve Block}
208d0825bca7fe65beaee391d30da42e937db621564Steve Block
209d0825bca7fe65beaee391d30da42e937db621564Steve BlockJSValueRef QScriptEnginePrivate::makeJSValue(bool value) const
210d0825bca7fe65beaee391d30da42e937db621564Steve Block{
211d0825bca7fe65beaee391d30da42e937db621564Steve Block    return JSValueMakeBoolean(m_context, value);
212d0825bca7fe65beaee391d30da42e937db621564Steve Block}
213d0825bca7fe65beaee391d30da42e937db621564Steve Block
214d0825bca7fe65beaee391d30da42e937db621564Steve BlockJSValueRef QScriptEnginePrivate::makeJSValue(QScriptValue::SpecialValue value) const
215d0825bca7fe65beaee391d30da42e937db621564Steve Block{
216d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (value == QScriptValue::NullValue)
217d0825bca7fe65beaee391d30da42e937db621564Steve Block        return JSValueMakeNull(m_context);
218d0825bca7fe65beaee391d30da42e937db621564Steve Block    return JSValueMakeUndefined(m_context);
219d0825bca7fe65beaee391d30da42e937db621564Steve Block}
220d0825bca7fe65beaee391d30da42e937db621564Steve Block
221dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockQScriptStringPrivate* QScriptEnginePrivate::toStringHandle(const QString& str) const
222dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
223dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    return new QScriptStringPrivate(str);
224dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
225dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
226545e470e52f0ac6a3a072bf559c796b42c6066b6Ben MurdochQScriptEnginePrivate::operator JSGlobalContextRef() const
227d0825bca7fe65beaee391d30da42e937db621564Steve Block{
228545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    Q_ASSERT(this);
229d0825bca7fe65beaee391d30da42e937db621564Steve Block    return m_context;
230d0825bca7fe65beaee391d30da42e937db621564Steve Block}
231d0825bca7fe65beaee391d30da42e937db621564Steve Block
232bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenbool QScriptEnginePrivate::isDate(JSValueRef value) const
233bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
234bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return m_originalGlobalObject.isDate(value);
235bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
236bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
237e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarkebool QScriptEnginePrivate::isArray(JSValueRef value) const
238e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke{
239967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    return m_originalGlobalObject.isArray(value);
240967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
241967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
242967717af5423377c967781471ee106e2bb4e11c8Ben Murdochbool QScriptEnginePrivate::isError(JSValueRef value) const
243967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
244967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    return m_originalGlobalObject.isError(value);
245967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
246967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
247967717af5423377c967781471ee106e2bb4e11c8Ben Murdochinline bool QScriptEnginePrivate::objectHasOwnProperty(JSObjectRef object, JSStringRef property) const
248967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
249967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // FIXME We need a JSC C API function for this.
250967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    return m_originalGlobalObject.objectHasOwnProperty(object, property);
251967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
252967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
253967717af5423377c967781471ee106e2bb4e11c8Ben Murdochinline QVector<JSStringRef> QScriptEnginePrivate::objectGetOwnPropertyNames(JSObjectRef object) const
254967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
255967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    // FIXME We can't use C API function JSObjectGetPropertyNames as it returns only enumerable properties.
256967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    return m_originalGlobalObject.objectGetOwnPropertyNames(object);
257e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke}
258e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
259d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
260