]> granicus.if.org Git - icu/commitdiff
ICU-11073 Fix the earlier fix for global new[].
authorSteven R. Loomis <srl@icu-project.org>
Sat, 6 Sep 2014 00:16:54 +0000 (00:16 +0000)
committerSteven R. Loomis <srl@icu-project.org>
Sat, 6 Sep 2014 00:16:54 +0000 (00:16 +0000)
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
icu4c/source/i18n/unicode/filteredbrk.h

index 7c070fde8c1aedcf56fc058cb8b45b4dfcf321d7..5270cb2a91a8e225db28f3931146db65e7daab06 100644 (file)
@@ -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 <unicode/ucharstriebuilder.h>
+#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<BreakIterator> 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<UnicodeString> ustrs;
-  ustrs.allocateInsteadAndReset(subCount);
+  LocalArray<UnicodeString> ustrs(ustrs_ptr);
 
   LocalMemory<int> partials;
   partials.allocateInsteadAndReset(subCount);
index 01117e500a23e4fe23daf4a2b70c21e515a78e5f..11ba4f6a228e0465537e78d976d564ea9fa30244 100644 (file)
@@ -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