bool _NPN_Construct(NPP npp, NPObject* npObject, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result) { if (!npObject) return false; if (npObject->_class == npScriptObjectClass) { V8NPObject* object = reinterpret_cast<V8NPObject*>(npObject); v8::HandleScope handleScope; v8::Handle<v8::Context> context = toV8Context(npp, npObject); if (context.IsEmpty()) return false; v8::Context::Scope scope(context); ExceptionCatcher exceptionCatcher; // Lookup the constructor function. v8::Handle<v8::Object> ctorObj(object->v8Object); if (!ctorObj->IsFunction()) return false; // Call the constructor. v8::Local<v8::Value> resultObject; v8::Handle<v8::Function> ctor(v8::Function::Cast(*ctorObj)); if (!ctor->IsNull()) { V8Proxy* proxy = toV8Proxy(npObject); ASSERT(proxy); OwnArrayPtr<v8::Handle<v8::Value> > argv(createValueListFromVariantArgs(arguments, argumentCount, npObject)); resultObject = proxy->newInstance(ctor, argumentCount, argv.get()); } if (resultObject.IsEmpty()) return false; convertV8ObjectToNPVariant(resultObject, npObject, result); return true; } if (NP_CLASS_STRUCT_VERSION_HAS_CTOR(npObject->_class) && npObject->_class->construct) return npObject->_class->construct(npObject, arguments, argumentCount, result); return false; }