moduleNokogirimoduleLibXML# :nodoc:moduleXmlDocumentMixin# :nodoc:defself.included(base)base.class_evaldolayout(:_private,:pointer,:type,:int,:name,:string,:children,:pointer,:last,:pointer,:parent,:pointer,:next,:pointer,:prev,:pointer,:doc,:pointer,:compression,:int,:standalone,:int,:intSubset,:pointer,:extSubset,:pointer,:oldNs,:pointer,:version,:string,:encoding,:pointer,:ids,:pointer,:refs,:pointer,:URL,:string)endenddefdocumentp=self[:doc]p.null??nil:LibXML::XmlDocumentCast.new(p)enddefruby_node_pointertuple=self[:_private]tuple.null??0:tuple.get_long(0)enddefruby_node_pointer=(value)self[:_private].put_long(0,value)enddefruby_docNokogiri::WeakBucket.get_object(self)enddefruby_doc=(object)Nokogiri::WeakBucket.set_object(self,object)enddefunlinked_nodesLibXML::XmlNodeSetCast.new(self[:_private].get_pointer(LibXML.pointer_offset(1)))enddefalloc_tupleself[:_private]=LibXML.calloc(LibXML::POINTER_SIZE,2)self[:_private].put_pointer(LibXML.pointer_offset(1),LibXML.xmlXPathNodeSetCreate(nil))endend## use at the point of creation, so we can be sure the document will be GCed properly#classXmlDocument<FFI::ManagedStruct# :nodoc:includeXmlDocumentMixindefinitialize(ptr)super(ptr)self.alloc_tupleenddefself.releaseptrdoc=LibXML::XmlDocumentCast.new(ptr)func=LibXML.xmlDeregisterNodeDefault(nil)beginns=LibXML::XmlNodeSetCast.new(doc[:_private].get_pointer(LibXML.pointer_offset(1)))ns[:nodeNr].timesdo|j|node_cstruct=LibXML::XmlNode.new(ns[:nodeTab].get_pointer(LibXML.pointer_offset(j)))casenode_cstruct[:type]whenNokogiri::XML::Node::ATTRIBUTE_NODELibXML.xmlFreePropList(node_cstruct)whenNokogiri::XML::Node::NAMESPACE_DECLLibXML.xmlFree(node_cstruct)elseLibXML.xmlAddChild(doc,node_cstruct)ifnode_cstruct[:parent].null?endendLibXML::XmlNodeSet.release(ns.pointer)LibXML.free(doc[:_private])rescueputs"Nokogiri::LibXML::XmlDocument.release: exception: '#{$!}'"ensureLibXML.xmlFreeDoc(ptr)LibXML.xmlDeregisterNodeDefault(func)endendend## use when we don't want to cause the doc to be GCed#classXmlDocumentCast<FFI::Struct# :nodoc:includeXmlDocumentMixinendHtmlDocument=XmlDocument# implemented identically in libxml2.6HtmlDocumentCast=XmlDocumentCast# implemented identically in libxml2.6endend