JSValue* CInstance::invokeMethod(ExecState* exec, const MethodList& methodList, const List& args) { // Overloading methods are not allowed by NPObjects. Should only be one // name match for a particular method. assert(methodList.length() == 1); CMethod* method = static_cast<CMethod*>(methodList.methodAt(0)); NPIdentifier ident = _NPN_GetStringIdentifier(method->name()); if (!_object->_class->hasMethod(_object, ident)) return jsUndefined(); unsigned count = args.size(); Vector<NPVariant, 128> cArgs(count); unsigned i; for (i = 0; i < count; i++) convertValueToNPVariant(exec, args.at(i), &cArgs[i]); // Invoke the 'C' method. NPVariant resultVariant; VOID_TO_NPVARIANT(resultVariant); _object->_class->invoke(_object, ident, cArgs, count, &resultVariant); for (i = 0; i < count; i++) _NPN_ReleaseVariantValue(&cArgs[i]); JSValue* resultValue = convertNPVariantToValue(exec, &resultVariant); _NPN_ReleaseVariantValue(&resultVariant); return resultValue; }
JSValue* CInstance::invokeConstruct(ExecState* exec, const ArgList& args) { if (!_object->_class->construct) return jsUndefined(); unsigned count = args.size(); Vector<NPVariant, 8> cArgs(count); unsigned i; for (i = 0; i < count; i++) convertValueToNPVariant(exec, args.at(exec, i), &cArgs[i]); // Invoke the 'C' method. NPVariant resultVariant; VOID_TO_NPVARIANT(resultVariant); { JSLock::DropAllLocks dropAllLocks(false); _object->_class->construct(_object, cArgs.data(), count, &resultVariant); } for (i = 0; i < count; i++) _NPN_ReleaseVariantValue(&cArgs[i]); JSValue* resultValue = convertNPVariantToValue(exec, &resultVariant, _rootObject.get()); _NPN_ReleaseVariantValue(&resultVariant); return resultValue; }
JSValue* CField::valueFromInstance(ExecState* exec, const Instance* inst) const { const CInstance* instance = static_cast<const CInstance*>(inst); NPObject* obj = instance->getObject(); if (obj->_class->getProperty) { NPVariant property; VOID_TO_NPVARIANT(property); #ifdef ANDROID_NPN_SETEXCEPTION SetGlobalException(0); #endif // ANDROID_NPN_SETEXCEPTION bool result; { JSLock::DropAllLocks dropAllLocks(false); result = obj->_class->getProperty(obj, _fieldIdentifier, &property); } #ifdef ANDROID_NPN_SETEXCEPTION MoveGlobalExceptionToExecState(exec); #endif // ANDROID_NPN_SETEXCEPTION if (result) { JSValue* result = convertNPVariantToValue(exec, &property, instance->rootObject()); _NPN_ReleaseVariantValue(&property); return result; } } return jsUndefined(); }
JSValue* CField::valueFromInstance(ExecState* exec, const Instance* inst) const { const CInstance* instance = static_cast<const CInstance*>(inst); NPObject* obj = instance->getObject(); if (obj->_class->getProperty) { NPVariant property; VOID_TO_NPVARIANT(property); bool result; { JSLock::DropAllLocks dropAllLocks; result = obj->_class->getProperty(obj, _fieldIdentifier, &property); } if (result) { JSValue* result = convertNPVariantToValue(exec, &property, instance->rootObject()); _NPN_ReleaseVariantValue(&property); return result; } } return jsUndefined(); }
JSValue* CInstance::invokeDefaultMethod(ExecState* exec, const List& args) { if (!_object->_class->invokeDefault) return jsUndefined(); unsigned count = args.size(); Vector<NPVariant, 128> cArgs(count); unsigned i; for (i = 0; i < count; i++) convertValueToNPVariant(exec, args.at(i), &cArgs[i]); // Invoke the 'C' method. NPVariant resultVariant; VOID_TO_NPVARIANT(resultVariant); _object->_class->invokeDefault(_object, cArgs, count, &resultVariant); for (i = 0; i < count; i++) _NPN_ReleaseVariantValue(&cArgs[i]); JSValue* resultValue = convertNPVariantToValue(exec, &resultVariant); _NPN_ReleaseVariantValue(&resultVariant); return resultValue; }