/* 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. */ // Contains the necessary helper structures to make possible expose // C/C++ functions to JavaScript environment. #include "config.h" #include "qscriptfunction_p.h" static void qt_NativeFunction_finalize(JSObjectRef object) { void* priv = JSObjectGetPrivate(object); delete reinterpret_cast(priv); } static JSValueRef qt_NativeFunction_callAsFunction(JSContextRef context, JSObjectRef object, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { QNativeFunctionData* data = reinterpret_cast(JSObjectGetPrivate(object)); // TODO: build a QScriptContext and use it in the native call. QScriptContext* scriptContext = 0; Q_UNUSED(context); Q_UNUSED(thisObject); Q_UNUSED(argumentCount); Q_UNUSED(arguments); Q_UNUSED(exception); QScriptEnginePrivate* engine = data->engine; QScriptValuePrivate* result = QScriptValuePrivate::get(data->fun(scriptContext, QScriptEnginePrivate::get(engine))); if (!result->isValid()) { qWarning("Invalid value returned from native function, returning undefined value instead."); return engine->makeJSValue(QScriptValue::UndefinedValue); } // Make sure that the result will be assigned to the correct engine. if (!result->engine()) { Q_ASSERT(result->isValid()); result->assignEngine(engine); } else if (result->engine() != engine) { qWarning("Value from different engine returned from native function, returning undefined value instead."); return engine->makeJSValue(QScriptValue::UndefinedValue); } return *result; } JSClassDefinition qt_NativeFunctionClass = { 0, // version kJSClassAttributeNoAutomaticPrototype, // attributes "", // className 0, // parentClass 0, // staticValues 0, // staticFunctions 0, // initialize qt_NativeFunction_finalize, // finalize 0, // hasProperty 0, // getProperty 0, // setProperty 0, // deleteProperty 0, // getPropertyNames qt_NativeFunction_callAsFunction, // callAsFunction 0, // callAsConstructor 0, // hasInstance 0 // convertToType }; static void qt_NativeFunctionWithArg_finalize(JSObjectRef object) { void* priv = JSObjectGetPrivate(object); delete reinterpret_cast(priv); } static JSValueRef qt_NativeFunctionWithArg_callAsFunction(JSContextRef context, JSObjectRef object, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception) { QNativeFunctionWithArgData* data = reinterpret_cast(JSObjectGetPrivate(object)); // TODO: build a QScriptContext and use it in the native call. QScriptContext* scriptContext = 0; Q_UNUSED(context); Q_UNUSED(thisObject); Q_UNUSED(argumentCount); Q_UNUSED(arguments); Q_UNUSED(exception); QScriptEnginePrivate* engine = data->engine; QScriptValuePrivate* result = QScriptValuePrivate::get(data->fun(scriptContext, QScriptEnginePrivate::get(engine), data->arg)); if (!result->isValid()) { qWarning("Invalid value returned from native function, returning undefined value instead."); return engine->makeJSValue(QScriptValue::UndefinedValue); } // Make sure that the result will be assigned to the correct engine. if (!result->engine()) { Q_ASSERT(result->isValid()); result->assignEngine(engine); } else if (result->engine() != engine) { qWarning("Value from different engine returned from native function, returning undefined value instead."); return engine->makeJSValue(QScriptValue::UndefinedValue); } return *result; } JSClassDefinition qt_NativeFunctionWithArgClass = { 0, // version kJSClassAttributeNoAutomaticPrototype, // attributes "", // className 0, // parentClass 0, // staticValues 0, // staticFunctions 0, // initialize qt_NativeFunctionWithArg_finalize, // finalize 0, // hasProperty 0, // getProperty 0, // setProperty 0, // deleteProperty 0, // getPropertyNames qt_NativeFunctionWithArg_callAsFunction, // callAsFunction 0, // callAsConstructor 0, // hasInstance 0 // convertToType };