[prev in list] [next in list] [prev in thread] [next in thread] 

List:       xerces-cvs
Subject:    svn commit: r798882 -
From:       amassari () apache ! org
Date:       2009-07-29 13:10:38
Message-ID: 20090729131038.33E77238886C () eris ! apache ! org
[Download RAW message or body]

Author: amassari
Date: Wed Jul 29 13:10:37 2009
New Revision: 798882

URL: http://svn.apache.org/viewvc?rev=798882&view=rev
Log:
When copying a context object, allocate new memory for fMatch and fOffsets only if \
the size of the data being copied is different, so that a user-provided fMatch object \
can be properly filled (XERCESC-1870)

Modified:
    xerces/c/trunk/src/xercesc/util/regx/RegularExpression.cpp

Modified: xerces/c/trunk/src/xercesc/util/regx/RegularExpression.cpp
URL: http://svn.apache.org/viewvc/xerces/c/trunk/src/xercesc/util/regx/RegularExpression.cpp?rev=798882&r1=798881&r2=798882&view=diff
 ==============================================================================
--- xerces/c/trunk/src/xercesc/util/regx/RegularExpression.cpp (original)
+++ xerces/c/trunk/src/xercesc/util/regx/RegularExpression.cpp Wed Jul 29 13:10:37 \
2009 @@ -140,7 +140,7 @@
     }
     if(src->fMatch)
     {
-        fMatch=new Match(*src->fMatch);
+        fMatch=new (fMemoryManager) Match(*src->fMatch);
         fAdoptMatch=true;
     }
 }
@@ -152,30 +152,46 @@
         fStart=other.fStart;
         fLimit=other.fLimit;
         fLength=other.fLength;
-        fSize=other.fSize;
         fStringMaxLen=other.fStringMaxLen;
         fString=other.fString;
         fOptions=other.fOptions;
-        if (fOffsets)
-            fMemoryManager->deallocate(fOffsets);//delete [] fOffsets;
-        fOffsets=0;
-        if (fAdoptMatch)
-            delete fMatch;
-        fMatch=0;
-        fAdoptMatch=false;
 
-        fMemoryManager=other.fMemoryManager;
-        if(other.fOffsets)
+        // if offset and match are already allocated with the right size, reuse them \
 +        // (fMatch can be provided by the user to get the data back)
+        if(fMatch && other.fMatch && \
fMatch->getNoGroups()==other.fMatch->getNoGroups()) +            \
*fMatch=*other.fMatch; +        else
+        {
+            if (fAdoptMatch)
+                delete fMatch;
+            fMatch=0;
+            if(other.fMatch)
+            {
+                fMatch=new (other.fMemoryManager) Match(*other.fMatch);
+                fAdoptMatch=true;
+            }
+        }
+
+        if (fOffsets && other.fOffsets && fSize==other.fSize)
         {
-            fOffsets = (int*) fMemoryManager->allocate(fSize* sizeof(int));
             for (int i = 0; i< fSize; i++)
                 fOffsets[i] = other.fOffsets[i];
         }
-        if(other.fMatch)
+        else
         {
-            fMatch=new Match(*other.fMatch);
-            fAdoptMatch=true;
+            if(fOffsets)
+                fMemoryManager->deallocate(fOffsets);//delete [] fOffsets;
+            fOffsets=0;
+            fSize=other.fSize;
+            if(other.fOffsets)
+            {
+                fOffsets = (int*) other.fMemoryManager->allocate(fSize* \
sizeof(int)); +                for (int i = 0; i< fSize; i++)
+                    fOffsets[i] = other.fOffsets[i];
+            }
         }
+
+        fMemoryManager=other.fMemoryManager;
     }
 
     return *this;



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xerces.apache.org
For additional commands, e-mail: commits-help@xerces.apache.org


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic