req::ptr<StreamFilter> createInstance(const char* php_func, req::ptr<File> stream, const String& filter, const Variant& params) { auto class_name = m_registeredFilters.rvalAt(filter).asCStrRef(); Class* class_ = Unit::getClass(class_name.get(), true); Object obj = Object(); if (LIKELY(class_ != nullptr)) { PackedArrayInit ctor_args(3); ctor_args.append(Variant(stream)); ctor_args.append(filter); ctor_args.append(params); obj = Object::attach( g_context->createObject(class_name.get(), ctor_args.toArray()) ); auto created = obj->o_invoke(s_onCreate, Array::Create()); /* - true: documented value for success * - null: undocumented default successful value * - false: documented value for failure */ if (!(created.isNull() || created.toBoolean())) { obj.reset(); } } else { raise_warning("%s: user-filter \"%s\" requires class \"%s\", but that " "class " "is not defined", php_func, filter.data(), class_name.data()); // Fall through, as to match Zend, the warning below should also be raised } if (obj.isNull()) { raise_warning("%s: unable to create or locate filter \"%s\"", php_func, filter.data()); return nullptr; } return req::make<StreamFilter>(obj, stream); }
Resource createInstance(const char* php_func, const Resource& stream, const String& filter, CVarRef params) { auto class_name = m_registeredFilters.rvalAt(filter).asCStrRef(); Class* class_ = Unit::lookupClass(class_name.get()); Object obj = null_object; if (LIKELY(class_ != nullptr)) { ArrayInit ctor_args(3); ctor_args.set(stream); ctor_args.set(filter); ctor_args.set(params); obj = g_context->createObject(class_name.get(), ctor_args.toArray()); auto created = obj->o_invoke(s_onCreate, Array::Create()); /* - true: documented value for success * - null: undocumented default successful value * - false: documented value for failure */ if (!(created.isNull() || created.toBoolean())) { obj = null_object; } } else { raise_warning("%s: user-filter \"%s\" requires class \"%s\", but that " "class " "is not defined", php_func, filter->data(), class_name->data()); // Fall through, as to match Zend, the warning below should also be raised } if (obj.isNull()) { raise_warning("%s: unable to create or locate filter \"%s\"", php_func, filter->data()); return null_resource; } return Resource(NEWOBJ(StreamFilter)(obj)); }