peiyongz 2004/01/06 10:12:31 Modified: c/src/xercesc/util/regx RegularExpression.hpp RegularExpression.cpp Log: using ctor/setPattern to avoid exception thrown from ctor Revision Changes Path 1.16 +34 -10 xml-xerces/c/src/xercesc/util/regx/RegularExpression.hpp Index: RegularExpression.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/regx/RegularExpression.hpp,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- RegularExpression.hpp 24 Dec 2003 15:24:15 -0000 1.15 +++ RegularExpression.hpp 6 Jan 2004 18:12:31 -0000 1.16 @@ -113,6 +113,16 @@ ); ~RegularExpression(); + RegularExpression + ( + MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager + ); + + // ----------------------------------------------------------------------- + // Setter methods + // ----------------------------------------------------------------------- + void setPattern(const XMLCh* const pattern, const XMLCh* const options=0); + // ----------------------------------------------------------------------- // Public Constants // ----------------------------------------------------------------------- @@ -220,11 +230,6 @@ void cleanUp(); // ----------------------------------------------------------------------- - // Setter methods - // ----------------------------------------------------------------------- - void setPattern(const XMLCh* const pattern, const XMLCh* const options=0); - - // ----------------------------------------------------------------------- // Private Helper methods // ----------------------------------------------------------------------- void prepare(); @@ -341,10 +346,29 @@ // --------------------------------------------------------------------------- inline void RegularExpression::cleanUp() { - fMemoryManager->deallocate(fPattern);//delete [] fPattern; - fMemoryManager->deallocate(fFixedString);//delete [] fFixedString; - delete fBMPattern; - delete fTokenFactory; + if (fPattern) + { + fMemoryManager->deallocate(fPattern);//delete [] fPattern; + fPattern = 0; + } + + if (fFixedString) + { + fMemoryManager->deallocate(fFixedString);//delete [] fFixedString; + fFixedString = 0; + } + + if (fBMPattern) + { + delete fBMPattern; + fBMPattern = 0; + } + + if (fTokenFactory) + { + delete fTokenFactory; + fTokenFactory = 0; + } } // --------------------------------------------------------------------------- 1.20 +68 -81 xml-xerces/c/src/xercesc/util/regx/RegularExpression.cpp Index: RegularExpression.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/regx/RegularExpression.cpp,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- RegularExpression.cpp 24 Dec 2003 15:24:15 -0000 1.19 +++ RegularExpression.cpp 6 Jan 2004 18:12:31 -0000 1.20 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.20 2004/01/06 18:12:31 peiyongz + * using ctor/setPattern to avoid exception thrown from ctor + * * Revision 1.19 2003/12/24 15:24:15 cargilld * More updates to memory management so that the static memory manager. * @@ -299,21 +302,9 @@ fTokenFactory(0), fMemoryManager(manager) { - try { - - XMLCh* tmpBuf = XMLString::transcode(pattern, fMemoryManager); - ArrayJanitor<XMLCh> janBuf(tmpBuf, fMemoryManager); - setPattern(tmpBuf); - } - catch(const OutOfMemoryException&) - { - throw; - } - catch (...) { - - cleanUp(); - throw; - } + XMLCh* tmpBuf = XMLString::transcode(pattern, fMemoryManager); + ArrayJanitor<XMLCh> janBuf(tmpBuf, fMemoryManager); + setPattern(tmpBuf); } RegularExpression::RegularExpression(const char* const pattern, @@ -335,23 +326,11 @@ fTokenFactory(0), fMemoryManager(manager) { - try { - - XMLCh* tmpBuf = XMLString::transcode(pattern, fMemoryManager); - ArrayJanitor<XMLCh> janBuf(tmpBuf, fMemoryManager); - XMLCh* tmpOptions = XMLString::transcode(options, fMemoryManager); - ArrayJanitor<XMLCh> janOps(tmpOptions, fMemoryManager); - setPattern(tmpBuf, tmpOptions); - } - catch(const OutOfMemoryException&) - { - throw; - } - catch (...) { - - cleanUp(); - throw; - } + XMLCh* tmpBuf = XMLString::transcode(pattern, fMemoryManager); + ArrayJanitor<XMLCh> janBuf(tmpBuf, fMemoryManager); + XMLCh* tmpOptions = XMLString::transcode(options, fMemoryManager); + ArrayJanitor<XMLCh> janOps(tmpOptions, fMemoryManager); + setPattern(tmpBuf, tmpOptions); } @@ -373,19 +352,7 @@ fTokenFactory(0), fMemoryManager(manager) { - try { - - setPattern(pattern); - } - catch(const OutOfMemoryException&) - { - throw; - } - catch (...) { - - cleanUp(); - throw; - } + setPattern(pattern); } RegularExpression::RegularExpression(const XMLCh* const pattern, @@ -407,19 +374,7 @@ fTokenFactory(0), fMemoryManager(manager) { - try { - - setPattern(pattern, options); - } - catch(const OutOfMemoryException&) - { - throw; - } - catch (...) { - - cleanUp(); - throw; - } + setPattern(pattern, options); } RegularExpression::~RegularExpression() { @@ -427,38 +382,70 @@ cleanUp(); } +RegularExpression::RegularExpression(MemoryManager* const manager) + :fHasBackReferences(false), + fFixedStringOnly(false), + fNoGroups(0), + fMinLength(0), + fNoClosures(0), + fOptions(0), + fBMPattern(0), + fPattern(0), + fFixedString(0), + fOperations(0), + fTokenTree(0), + fFirstChar(0), + fOpFactory(manager), + fTokenFactory(0), + fMemoryManager(manager) +{ +} + // --------------------------------------------------------------------------- // RegularExpression: Setter methods // --------------------------------------------------------------------------- void RegularExpression::setPattern(const XMLCh* const pattern, const XMLCh* const options) { - fTokenFactory = new (fMemoryManager) TokenFactory(fMemoryManager); - fOptions = parseOptions(options); - fPattern = XMLString::replicate(pattern, fMemoryManager); - - // the following construct causes an error in an Intel 7.1 32 bit compiler for - // red hat linux 7.2 - // (when an exception is thrown the wrong object is deleted) - //RegxParser* regxParser = isSet(fOptions, XMLSCHEMA_MODE) - // ? new (fMemoryManager) ParserForXMLSchema(fMemoryManager) - // : new (fMemoryManager) RegxParser(fMemoryManager); - RegxParser* regxParser; - if (isSet(fOptions, XMLSCHEMA_MODE)) { - regxParser = new (fMemoryManager) ParserForXMLSchema(fMemoryManager); - } - else { - regxParser = new (fMemoryManager) RegxParser(fMemoryManager); - } + try { - if (regxParser) { - regxParser->setTokenFactory(fTokenFactory); + fTokenFactory = new (fMemoryManager) TokenFactory(fMemoryManager); + fOptions = parseOptions(options); + fPattern = XMLString::replicate(pattern, fMemoryManager); + + // the following construct causes an error in an Intel 7.1 32 bit compiler for + // red hat linux 7.2 + // (when an exception is thrown the wrong object is deleted) + //RegxParser* regxParser = isSet(fOptions, XMLSCHEMA_MODE) + // ? new (fMemoryManager) ParserForXMLSchema(fMemoryManager) + // : new (fMemoryManager) RegxParser(fMemoryManager); + + RegxParser* regxParser; + if (isSet(fOptions, XMLSCHEMA_MODE)) { + regxParser = new (fMemoryManager) ParserForXMLSchema(fMemoryManager); + } + else { + regxParser = new (fMemoryManager) RegxParser(fMemoryManager); + } + + if (regxParser) { + regxParser->setTokenFactory(fTokenFactory); + } + + Janitor<RegxParser> janRegxParser(regxParser); + fTokenTree = regxParser->parse(fPattern, fOptions); + fNoGroups = regxParser->getNoParen(); + fHasBackReferences = regxParser->hasBackReferences(); + } + catch(const OutOfMemoryException&) + { + throw; } + catch (...) { - Janitor<RegxParser> janRegxParser(regxParser); - fTokenTree = regxParser->parse(fPattern, fOptions); - fNoGroups = regxParser->getNoParen(); - fHasBackReferences = regxParser->hasBackReferences(); + cleanUp(); + throw; + } } // ---------------------------------------------------------------------------
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]