bool supportsToArray(ObjectData* obj) { if (obj->isCollection()) { assertx(isValidCollection(obj->collectionType())); return true; } else if (UNLIKELY(obj->getAttribute(ObjectData::CallToImpl))) { return obj->instanceof(SimpleXMLElement_classof()); } else if (UNLIKELY(obj->instanceof(SystemLib::s_ArrayObjectClass))) { return true; } else if (UNLIKELY(obj->instanceof(SystemLib::s_ArrayIteratorClass))) { return true; } else if (UNLIKELY(obj->instanceof(c_Closure::classof()))) { return true; } else if (UNLIKELY(obj->instanceof(DateTimeData::getClass()))) { return true; } else { if (LIKELY(!obj->hasInstanceDtor())) { return true; } return false; } }
static void HHVM_METHOD(XSLTProcessor, importStylesheet, const Object& stylesheet) { SYNC_VM_REGS_SCOPED(); auto data = Native::data<XSLTProcessorData>(this_); xmlDocPtr doc = nullptr; if (stylesheet.instanceof(s_DOMDocument)) { auto domdoc = Native::data<DOMNode>(stylesheet); // This doc will be freed by xsltFreeStylesheet. doc = xmlCopyDoc((xmlDocPtr)domdoc->nodep(), /*recursive*/ 1); if (doc == nullptr) { raise_error("Unable to import stylesheet"); } } else if (stylesheet.instanceof(SimpleXMLElement_classof())) { auto ssNode = SimpleXMLElement_exportNode(stylesheet); // This doc will be freed by xsltFreeStylesheet. doc = xmlNewDoc((const xmlChar*)"1.0"); xmlNodePtr node = xmlCopyNode(ssNode, /*extended*/ 1); if (doc == nullptr || node == nullptr) { raise_error("Unable to import stylesheet"); } xmlDocSetRootElement(doc, node); } else { raise_error("Object must be an instance of DOMDocument or " "SimpleXMLElement"); } if (doc) { data->m_stylesheet = xsltParseStylesheetDoc(doc); if (data->m_stylesheet == nullptr) { xmlFreeDoc(doc); raise_error("Unable to import stylesheet"); } } }