From 0617145a89917ae7735fe1c9538688ab9a577df5 Mon Sep 17 00:00:00 2001 From: Kristian Monsen Date: Fri, 30 Jul 2010 10:46:49 +0100 Subject: Merge WebKit at r64264 : Initial merge by git. Change-Id: Ic42bef02efef8217a0f84c47176a9c617c28d1f1 --- JavaScriptCore/qt/api/qscriptengine_p.cpp | 36 +++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'JavaScriptCore/qt/api/qscriptengine_p.cpp') diff --git a/JavaScriptCore/qt/api/qscriptengine_p.cpp b/JavaScriptCore/qt/api/qscriptengine_p.cpp index e3311ed..a708a34 100644 --- a/JavaScriptCore/qt/api/qscriptengine_p.cpp +++ b/JavaScriptCore/qt/api/qscriptengine_p.cpp @@ -21,6 +21,7 @@ #include "qscriptengine_p.h" +#include "qscriptfunction_p.h" #include "qscriptprogram_p.h" #include "qscriptvalue_p.h" @@ -33,11 +34,15 @@ QScriptEnginePrivate::QScriptEnginePrivate(const QScriptEngine* engine) , m_context(JSGlobalContextCreate(0)) , m_exception(0) , m_originalGlobalObject(m_context) + , m_nativeFunctionClass(JSClassCreate(&qt_NativeFunctionClass)) + , m_nativeFunctionWithArgClass(JSClassCreate(&qt_NativeFunctionWithArgClass)) { } QScriptEnginePrivate::~QScriptEnginePrivate() { + JSClassRelease(m_nativeFunctionClass); + JSClassRelease(m_nativeFunctionWithArgClass); if (m_exception) JSValueUnprotect(m_context, m_exception); JSGlobalContextRelease(m_context); @@ -86,6 +91,37 @@ QScriptValuePrivate* QScriptEnginePrivate::uncaughtException() const return m_exception ? new QScriptValuePrivate(this, m_exception) : new QScriptValuePrivate(); } +QScriptValuePrivate* QScriptEnginePrivate::newFunction(QScriptEngine::FunctionSignature fun, QScriptValuePrivate* prototype, int length) +{ + // Note that this private data will be deleted in the object finalize function. + QNativeFunctionData* data = new QNativeFunctionData(this, fun); + JSObjectRef funJS = JSObjectMake(m_context, m_nativeFunctionClass, reinterpret_cast(data)); + QScriptValuePrivate* proto = prototype ? prototype : newObject(); + return newFunction(funJS, proto); +} + +QScriptValuePrivate* QScriptEnginePrivate::newFunction(QScriptEngine::FunctionWithArgSignature fun, void* arg) +{ + // Note that this private data will be deleted in the object finalize function. + QNativeFunctionWithArgData* data = new QNativeFunctionWithArgData(this, fun, arg); + JSObjectRef funJS = JSObjectMake(m_context, m_nativeFunctionWithArgClass, reinterpret_cast(data)); + QScriptValuePrivate* proto = newObject(); + return newFunction(funJS, proto); +} + +QScriptValuePrivate* QScriptEnginePrivate::newFunction(JSObjectRef funJS, QScriptValuePrivate* prototype) +{ + JSObjectSetPrototype(m_context, funJS, m_originalGlobalObject.functionPrototype()); + + QScriptValuePrivate* result = new QScriptValuePrivate(this, funJS); + static JSStringRef protoName = QScriptConverter::toString("prototype"); + static JSStringRef constructorName = QScriptConverter::toString("constructor"); + result->setProperty(protoName, prototype, QScriptValue::Undeletable); + prototype->setProperty(constructorName, result, QScriptValue::PropertyFlags(QScriptValue::Undeletable | QScriptValue::SkipInEnumeration)); + + return result; +} + QScriptValuePrivate* QScriptEnginePrivate::newObject() const { return new QScriptValuePrivate(this, JSObjectMake(m_context, /* jsClass */ 0, /* userData */ 0)); -- cgit v1.1