diff options
author | Rob Richards <rrichards@php.net> | 2003-07-05 23:43:10 +0000 |
---|---|---|
committer | Rob Richards <rrichards@php.net> | 2003-07-05 23:43:10 +0000 |
commit | 1688895f6b68bd7c4930004bd0efb54f6dee6308 (patch) | |
tree | 666526f6d474d0c9d88e4020bcc3f4928fb50730 /ext/xsl/xsltprocessor.c | |
parent | f145b163a8281298872a73856238bc5ed0a14713 (diff) | |
download | php-git-1688895f6b68bd7c4930004bd0efb54f6dee6308.tar.gz |
use common doc with ref counting rather than copy
Diffstat (limited to 'ext/xsl/xsltprocessor.c')
-rw-r--r-- | ext/xsl/xsltprocessor.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/ext/xsl/xsltprocessor.c b/ext/xsl/xsltprocessor.c index cfe4fa3dc3..ad1ad7f4ca 100644 --- a/ext/xsl/xsltprocessor.c +++ b/ext/xsl/xsltprocessor.c @@ -126,7 +126,6 @@ PHP_FUNCTION(xsl_xsltprocessor_import_stylesheet) zval *id, *docp = NULL; xmlDoc *doc = NULL; xsltStylesheetPtr sheetp, oldsheetp; - xmlDocPtr newdocp; xsl_object *intern; node_object *docobj; @@ -135,15 +134,12 @@ PHP_FUNCTION(xsl_xsltprocessor_import_stylesheet) if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &docp) == FAILURE) { RETURN_FALSE; } + DOC_GET_OBJ(doc, docp, xmlDocPtr, docobj); - /* copy the doc, so that it's not accessable from outside - FIXME: and doubling memory consumption... - */ - newdocp = xmlCopyDoc(doc, 1); - sheetp = xsltParseStylesheetDoc(newdocp); + + sheetp = xsltParseStylesheetDoc(doc); if (!sheetp) { - xmlFreeDoc(newdocp); RETURN_FALSE; } @@ -154,10 +150,21 @@ PHP_FUNCTION(xsl_xsltprocessor_import_stylesheet) efree(((xsltStylesheetPtr) intern->ptr)->_private); ((xsltStylesheetPtr) intern->ptr)->_private = NULL; } - //FIXME: more non-thread safe stuff + if (intern->document != NULL) { + if (--intern->document->refcount == 0) { + xmlFreeDoc((xmlDocPtr) intern->document->ptr); + efree(intern->document); + } + ((xsltStylesheetPtr) intern->ptr)->doc = NULL; + intern->document = NULL; + } xsltFreeStylesheet((xsltStylesheetPtr) intern->ptr); intern->ptr = NULL; - } + } + + intern->document = docobj->document; + intern->document->refcount++; + php_xsl_set_object(id, sheetp TSRMLS_CC); } /* }}} end xsl_xsltprocessor_import_stylesheet */ |