From 7b89d982e42e1c043ea049d80859d9c0b5d54b95 Mon Sep 17 00:00:00 2001 From: "William M. Brack" Date: Sat, 12 Jul 2003 12:35:37 +0000 Subject: [PATCH] Fixed bug 114764 --- ChangeLog | 7 +++++++ libxslt/transform.c | 11 +++++++++-- libxslt/variables.c | 7 ++++--- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6b45ef8..6c3b608 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Sat Jul 12 20:35:28 HKT 2003 William Brack + + * fixed bug 114764, trouble with globals and RVT's + with minor changes in variables.c and transform.c + so that any global instantiated with an RVT gets + uninitialized when the RVT is destroyed. + Thu Jul 10 15:47:33 CEST 2003 Daniel Veillard * libxslt/transform.c: simple cast missing Peter Breitenlohner diff --git a/libxslt/transform.c b/libxslt/transform.c index 713c4bb..ae800a4 100644 --- a/libxslt/transform.c +++ b/libxslt/transform.c @@ -1688,11 +1688,18 @@ xsltApplyOneTemplate(xsltTransformContextPtr ctxt, xmlNodePtr node, templPop(ctxt); /* * Free up all the unreferenced RVT + * Also set any global variables instantiated + * using them, to be "not yet computed". */ if (ctxt->tmpRVT != NULL) { + xsltStackElemPtr elem; xmlDocPtr tmp = ctxt->tmpRVT, next; - while (tmp != NULL) { + elem = (xsltStackElemPtr)tmp->_private; + if (elem != NULL) { + elem->computed = 0; + xmlXPathFreeObject(elem->value); + } next = (xmlDocPtr) tmp->next; xmlFreeDoc(tmp); tmp = next; @@ -2328,7 +2335,7 @@ xsltCopy(xsltTransformContextPtr ctxt, xmlNodePtr node, xsltGenericDebug(xsltGenericDebugContext, "xsltCopy: namespace declaration\n"); #endif - xsltCopyNamespace(ctxt, ctxt->insert, (xmlNsPtr) node); + xsltCopyNamespace(ctxt, ctxt->insert, (xmlNsPtr)node); break; default: break; diff --git a/libxslt/variables.c b/libxslt/variables.c index 76e9158..6186082 100644 --- a/libxslt/variables.c +++ b/libxslt/variables.c @@ -39,7 +39,6 @@ * Result Value Tree interfaces * * * ************************************************************************/ - /** * xsltCreateRVT: * @ctxt: an XSLT transformation context @@ -471,7 +470,6 @@ xsltEvalVariable(xsltTransformContextPtr ctxt, xsltStackElemPtr elem, * Tag the subtree for removal once consumed */ xsltRegisterTmpRVT(ctxt, container); - oldoutput = ctxt->output; ctxt->output = container; oldInsert = ctxt->insert; @@ -606,7 +604,10 @@ xsltEvalGlobalVariable(xsltStackElemPtr elem, xsltTransformContextPtr ctxt) { * Tag the subtree for removal once consumed */ xsltRegisterTmpRVT(ctxt, container); - + /* + * Save a pointer to the global variable for later cleanup + */ + container->_private = elem; oldoutput = ctxt->output; ctxt->output = container; oldInsert = ctxt->insert; -- 2.7.4