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