You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by sh...@apache.org on 2009/12/16 06:29:07 UTC

svn commit: r891127 - in /webservices/axis2/trunk/c/axiom/src/xpath: xpath.c xpath_internals_engine.c xpath_internals_iterators.c

Author: shankar
Date: Wed Dec 16 05:29:06 2009
New Revision: 891127

URL: http://svn.apache.org/viewvc?rev=891127&view=rev
Log:
Fixing issue AXIS2C-1366

Modified:
    webservices/axis2/trunk/c/axiom/src/xpath/xpath.c
    webservices/axis2/trunk/c/axiom/src/xpath/xpath_internals_engine.c
    webservices/axis2/trunk/c/axiom/src/xpath/xpath_internals_iterators.c

Modified: webservices/axis2/trunk/c/axiom/src/xpath/xpath.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/src/xpath/xpath.c?rev=891127&r1=891126&r2=891127&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/xpath/xpath.c (original)
+++ webservices/axis2/trunk/c/axiom/src/xpath/xpath.c Wed Dec 16 05:29:06 2009
@@ -72,7 +72,9 @@
         return NULL;
     }
     else
+    {
         return expr;
+    }
 }
 
 /* Evaluate compiled XPath expression */
@@ -375,6 +377,25 @@
             context->expr = NULL;
         }
 
+        if (context->root_node)
+        {
+            axiom_node_detach(axiom_node_get_first_child(context->root_node, context->env), context->env);
+            axiom_node_free_tree(context->root_node, context->env);
+            context->root_node = NULL;
+        }
+
+        if (context->functions)
+        {
+            axutil_hash_free(context->functions, context->env);
+            context->functions = NULL;
+        }
+
+        if(context->namespaces)
+        {
+            axiom_xpath_clear_namespaces(context);
+            context->namespaces = NULL;
+        }
+
         AXIS2_FREE(env->allocator, context);
     }
 }
@@ -394,6 +415,12 @@
             xpath_expr->expr_str = NULL;
         }
 
+        if (xpath_expr->operations)
+        {
+            axutil_array_list_free(xpath_expr->operations, env);
+            xpath_expr->operations = NULL;
+        }
+
         AXIS2_FREE(env->allocator, xpath_expr);
     }
 }

Modified: webservices/axis2/trunk/c/axiom/src/xpath/xpath_internals_engine.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/src/xpath/xpath_internals_engine.c?rev=891127&r1=891126&r2=891127&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/xpath/xpath_internals_engine.c (original)
+++ webservices/axis2/trunk/c/axiom/src/xpath/xpath_internals_engine.c Wed Dec 16 05:29:06 2009
@@ -34,23 +34,25 @@
 
     res->nodes = axutil_array_list_create(context->env, 0);
 
-    context->stack = axutil_stack_create(context->env);
-
     /* Expression is empty */
     if(context->expr->start == AXIOM_XPATH_PARSE_END)
     {
         return res;
     }
 
+    context->stack = axutil_stack_create(context->env);
+
     axiom_xpath_evaluate_operation(context, context->expr->start);
 
     /* Add nodes to the result set from the stack */
     while(axutil_stack_size(context->stack, context->env) > 0)
     {
-        axutil_array_list_add(res->nodes, context->env, axutil_stack_pop(context->stack,
-            context->env));
+        axutil_array_list_add(res->nodes, context->env,
+            axutil_stack_pop(context->stack, context->env));
     }
 
+    axutil_stack_free(context->stack, context->env);
+
     return res;
 }
 
@@ -256,18 +258,20 @@
     {
         res_node = (axiom_xpath_result_node_t *)axutil_array_list_get(arr, context->env, i);
 
-        if(res_node->type != AXIOM_XPATH_TYPE_NODE)
+        if(res_node->type == AXIOM_XPATH_TYPE_NODE)
         {
-            continue;
-        }
+            context->node = (axiom_node_t *)res_node->value;
+            context->position = i + 1;
+            context->size = filter_res_n;
 
-        context->node = (axiom_node_t *)res_node->value;
-        context->position = i + 1;
-        context->size = filter_res_n;
+            n_nodes += rel_loc_func(context, rel_loc_op);
+        }
 
-        n_nodes += rel_loc_func(context, rel_loc_op);
+        AXIS2_FREE(context->env->allocator, res_node);
     }
 
+    axutil_array_list_free(arr, context->env);
+
     return n_nodes;
 }
 
@@ -278,6 +282,7 @@
     axiom_xpath_operation_t * op)
 {
     axiom_xpath_result_node_t *node;
+    axiom_xpath_result_node_t *res_node;
     int n_nodes[2];
     int i, j;
     int op12[2];
@@ -330,8 +335,16 @@
         axutil_stack_push(context->stack, context->env, node);
     }
 
-    axutil_array_list_free(arr[0], context->env);
-    axutil_array_list_free(arr[1], context->env);
+    for (i = 1; i >= 0; i--)
+    {
+        for (j = 0; j < n_nodes[i]; j++)
+        {
+            res_node = (axiom_xpath_result_node_t *)axutil_array_list_get(arr[i], context->env, j);
+            AXIS2_FREE(context->env->allocator, res_node);
+        }
+
+        axutil_array_list_free(arr[i], context->env);
+    }
 
     return 1;
 }
@@ -343,6 +356,7 @@
     axiom_xpath_operation_t * op)
 {
     axiom_xpath_result_node_t *node;
+    axiom_xpath_result_node_t *res_node;
     int n_nodes[2];
     int i, j;
     int op12[2];
@@ -395,8 +409,16 @@
         axutil_stack_push(context->stack, context->env, node);
     }
 
-    axutil_array_list_free(arr[0], context->env);
-    axutil_array_list_free(arr[1], context->env);
+    for (i = 1; i >= 0; i--)
+    {
+        for (j = 0; j < n_nodes[i]; j++)
+        {
+            res_node = (axiom_xpath_result_node_t *)axutil_array_list_get(arr[i], context->env, j);
+            AXIS2_FREE(context->env->allocator, res_node);
+        }
+
+        axutil_array_list_free(arr[i], context->env);
+    }
 
     return 1;
 }
@@ -408,6 +430,7 @@
     axiom_xpath_operation_t * op)
 {
     axiom_xpath_result_node_t *node;
+    axiom_xpath_result_node_t *res_node;
     int n_nodes[2];
     int i, j;
     int op12[2];
@@ -474,8 +497,16 @@
         axutil_stack_push(context->stack, context->env, node);
     }
 
-    axutil_array_list_free(arr[0], context->env);
-    axutil_array_list_free(arr[1], context->env);
+    for (i = 1; i >= 0; i--)
+    {
+        for (j = 0; j < n_nodes[i]; j++)
+        {
+            res_node =(axiom_xpath_result_node_t *)axutil_array_list_get(arr[i], context->env, j);
+            AXIS2_FREE(context->env->allocator, res_node);
+        }
+
+        axutil_array_list_free(arr[i], context->env);
+    }
 
     return 1;
 }
@@ -592,7 +623,14 @@
     {
         for(i = 0; i < n_nodes; i++)
         {
-            axutil_stack_pop(context->stack, context->env);
+            res = (axiom_xpath_result_node_t *)axutil_stack_pop(context->stack, context->env);
+
+            if (res->type > AXIOM_XPATH_TYPE_NAMESPACE)
+            {
+                AXIS2_FREE(context->env->allocator, res->value);
+            }
+
+            AXIS2_FREE(context->env->allocator, res);
         }
 
         return AXIS2_TRUE;
@@ -605,19 +643,31 @@
         {
             if(*(double *)(res->value) == context->position)
             {
+                AXIS2_FREE(context->env->allocator, res);
                 return AXIS2_TRUE;
             }
             else
             {
-                return AXIS2_FAILURE;
+                AXIS2_FREE(context->env->allocator, res);
+                return AXIS2_FALSE;
             }
         }
         else if(res->type == AXIOM_XPATH_TYPE_BOOLEAN)
         {
-            return *(axis2_bool_t *)(res->value);
+            if(*(axis2_bool_t *)(res->value))
+            {
+                AXIS2_FREE(context->env->allocator, res);
+                return AXIS2_TRUE;
+            }
+            else
+            {
+                AXIS2_FREE(context->env->allocator, res);
+                return AXIS2_FALSE;
+            }
         }
         else
         {
+            AXIS2_FREE(context->env->allocator, res);
             return AXIS2_TRUE;
         }
     }

Modified: webservices/axis2/trunk/c/axiom/src/xpath/xpath_internals_iterators.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/src/xpath/xpath_internals_iterators.c?rev=891127&r1=891126&r2=891127&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/xpath/xpath_internals_iterators.c (original)
+++ webservices/axis2/trunk/c/axiom/src/xpath/xpath_internals_iterators.c Wed Dec 16 05:29:06 2009
@@ -36,7 +36,6 @@
     axiom_node_t *context_node = NULL;
     /* For streaming */
     axiom_node_t *prev = NULL;
-    /*axiom_xpath_operation_t * next_operation = NULL;*/
 
     AXIOM_XPATH_ITERATOR_INITIALIZE;
     cur = axiom_node_get_first_child(context->node, context->env);
@@ -52,22 +51,6 @@
             n_nodes = axiom_xpath_evaluate_predicate(context, op_next, op_predicate);
             n_nodes_tot += n_nodes;
         }
-        /*
-         if (context->streaming)
-         {
-         if (n_nodes)
-         {
-         next_operation = AXIOM_XPATH_OPR_GET(op_next);
-         }
-
-         if (!n_nodes
-         || next_operation->opr != AXIOM_XPATH_OPERATION_RESULT)
-         {
-         axiom_node_detach(prev, context->env);
-         axiom_node_free_tree(prev, context->env);
-         }
-         }
-         */
     }
 
     /* Change the context node back to what it was */
@@ -123,6 +106,8 @@
 
     context->node = context_node;
 
+    axutil_stack_free(stack, context->env);
+
     return n_nodes;
 }
 
@@ -308,6 +293,8 @@
     /* Change the context node back to what it was */
     context->node = context_node;
 
+    axutil_stack_free(stack, context->env);
+
     return n_nodes;
 }
 
@@ -362,6 +349,8 @@
     /* Change the context node back to what it was */
     context->node = context_node;
 
+    axutil_stack_free(stack, context->env);
+
     return n_nodes;
 }
 
@@ -554,6 +543,8 @@
     /* Change the context node back to what it was */
     context->node = context_node;
 
+    axutil_stack_free(stack, context->env);
+
     return n_nodes;
 }