From 51d9432671c77d905a1471d11cef3cf6b027110a Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Sat, 6 Sep 2014 00:16:54 +0000 Subject: [PATCH] ICU-11073 Fix the earlier fix for global new[]. Had to move "new UnicodeString[]" into a function ala ICU-2974 to prevent global new[] from being called. Also, some general cleanup. X-SVN-Rev: 36371 --- icu4c/source/i18n/filteredbrk.cpp | 33 +++++++++++++++++++------ icu4c/source/i18n/unicode/filteredbrk.h | 3 ++- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/icu4c/source/i18n/filteredbrk.cpp b/icu4c/source/i18n/filteredbrk.cpp index 7c070fde8c1..5270cb2a91a 100644 --- a/icu4c/source/i18n/filteredbrk.cpp +++ b/icu4c/source/i18n/filteredbrk.cpp @@ -5,15 +5,20 @@ ******************************************************************************* */ -#include "unicode/filteredbrk.h" +#include "unicode/utypes.h" +#if !UCONFIG_NO_BREAK_ITERATION && !UCONFIG_NO_FILTERED_BREAK_ITERATION -#if !UCONFIG_NO_BREAK_ITERATION && U_HAVE_STD_STRING && !UCONFIG_NO_FILTERED_BREAK_ITERATION +#include "cmemory.h" -#include +#include "unicode/filteredbrk.h" +#include "unicode/ucharstriebuilder.h" +#include "unicode/ures.h" -#include "uresimp.h" -#include "ubrkimpl.h" +#include "uresimp.h" // ures_getByKeyWithFallback +#include "ubrkimpl.h" // U_ICUDATA_BRKITR #include "uvector.h" +#include "cmemory.h" + U_NAMESPACE_BEGIN #ifndef FB_DEBUG @@ -291,7 +296,7 @@ int32_t SimpleFilteredSentenceBreakIterator::next() { /** * Concrete implementation of builder class. */ -class SimpleFilteredBreakIteratorBuilder : public FilteredBreakIteratorBuilder { +class U_I18N_API SimpleFilteredBreakIteratorBuilder : public FilteredBreakIteratorBuilder { public: virtual ~SimpleFilteredBreakIteratorBuilder(); SimpleFilteredBreakIteratorBuilder(const Locale &fromLocale, UErrorCode &status); @@ -352,6 +357,17 @@ SimpleFilteredBreakIteratorBuilder::unsuppressBreakAfter(const UnicodeString& ex return r; } +/** + * Jitterbug 2974: MSVC has a bug whereby new X[0] behaves badly. + * Work around this. + * + * Note: "new UnicodeString[subCount]" ends up calling global operator new + * on MSVC2012 for some reason. + */ +static inline UnicodeString* newUnicodeStringArray(size_t count) { + return new UnicodeString[count ? count : 1]; +} + BreakIterator * SimpleFilteredBreakIteratorBuilder::build(BreakIterator* adoptBreakIterator, UErrorCode& status) { LocalPointer adopt(adoptBreakIterator); @@ -367,9 +383,10 @@ SimpleFilteredBreakIteratorBuilder::build(BreakIterator* adoptBreakIterator, UEr int32_t fwdCount = 0; int32_t subCount = fSet.size(); + + UnicodeString *ustrs_ptr = newUnicodeStringArray(subCount); - LocalMemory ustrs; - ustrs.allocateInsteadAndReset(subCount); + LocalArray ustrs(ustrs_ptr); LocalMemory partials; partials.allocateInsteadAndReset(subCount); diff --git a/icu4c/source/i18n/unicode/filteredbrk.h b/icu4c/source/i18n/unicode/filteredbrk.h index 01117e500a2..11ba4f6a228 100644 --- a/icu4c/source/i18n/unicode/filteredbrk.h +++ b/icu4c/source/i18n/unicode/filteredbrk.h @@ -8,6 +8,7 @@ #ifndef FILTEREDBRK_H #define FILTEREDBRK_H +#include "unicode/utypes.h" #include "unicode/brkiter.h" #if !UCONFIG_NO_BREAK_ITERATION && !UCONFIG_NO_FILTERED_BREAK_ITERATION @@ -111,6 +112,6 @@ class U_I18N_API FilteredBreakIteratorBuilder : public UObject { U_NAMESPACE_END -#endif // #if !UCONFIG_NO_BREAK_ITERATION && U_HAVE_STD_STRING && !UCONFIG_NO_FILTERED_BREAK_ITERATION +#endif // #if !UCONFIG_NO_BREAK_ITERATION && !UCONFIG_NO_FILTERED_BREAK_ITERATION #endif // #ifndef FILTEREDBRK_H -- 2.40.0