On 10/15/2010 18:25, Adam Martinson wrote:
Implemented on top of libxml's hash table.
dlls/msxml3/schema.c | 376 +++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 326 insertions(+), 50 deletions(-) +static LONG cache_entry_release(cache_entry* entry) {
- schema_t *This = impl_from_IXMLDOMSchemaCollection( iface );
 
- LONG ref = InterlockedDecrement(&entry->ref);
 - TRACE("%p new ref %d\n", entry, ref);
 
- TRACE("(%p)->(%s %p)\n", This, debugstr_guid( riid ), ppvObject );
 
- if (ref == 0)
 - {
 if (entry->type == SCHEMA_TYPE_XSD){xmldoc_release(entry->doc);entry->schema->doc = NULL;xmlSchemaFree(entry->schema);heap_free(entry);}else /* SCHEMA_TYPE_XDR */{xmldoc_release(entry->doc);heap_free(entry);}- }
 - return ref;
 +}
Looks a but redundant. xmldoc_release() and heap_free(entry) are always used, so only xmlSchemaFree() and doc reset before it should be under condition.
- xmlNodePtr root;
 - if (schema)
 root = xmlDocGetRootElement(schema);- if (root&& root->ns)
 - {
 
root uninitialized? If this never happens practically then remove if (schema) condition.
- IXMLDOMSchemaCollection_AddRef( iface );
 
IXMLDOMSchemaCollection_AddRef(iface);
return S_OK; }
-static ULONG WINAPI schema_cache_AddRef( IXMLDOMSchemaCollection *iface ) +static ULONG WINAPI schema_cache_AddRef(IXMLDOMSchemaCollection *iface)
No need for such changes here and later in this patch, even some new added lines use white-spaces in such cases.
IXMLDOMNode* domnode = NULL;IDispatch_QueryInterface(V_DISPATCH(&var),&IID_IXMLDOMNode, (void**)&domnode);if (domnode)doc = xmlNodePtr_from_domnode(domnode, XML_DOCUMENT_NODE)->doc;
Not sure about that, I'd say it's better to test for hr == S_OK and return value from QueryInterface, is this branch tested?