Index: source/common/utext.cpp |
diff --git a/source/common/utext.cpp b/source/common/utext.cpp |
index 396ee0777df47c56b66ce3988de56e82875847a4..6dc31a0485d70e89e753f217137dddc4cacd1578 100644 |
--- a/source/common/utext.cpp |
+++ b/source/common/utext.cpp |
@@ -1,7 +1,7 @@ |
/* |
******************************************************************************* |
* |
-* Copyright (C) 2005-2012, International Business Machines |
+* Copyright (C) 2005-2014, International Business Machines |
* Corporation and others. All Rights Reserved. |
* |
******************************************************************************* |
@@ -516,8 +516,17 @@ utext_copy(UText *ut, |
U_CAPI UText * U_EXPORT2 |
utext_clone(UText *dest, const UText *src, UBool deep, UBool readOnly, UErrorCode *status) { |
- UText *result; |
- result = src->pFuncs->clone(dest, src, deep, status); |
+ if (U_FAILURE(*status)) { |
+ return dest; |
+ } |
+ UText *result = src->pFuncs->clone(dest, src, deep, status); |
+ if (U_FAILURE(*status)) { |
+ return result; |
+ } |
+ if (result == NULL) { |
+ *status = U_MEMORY_ALLOCATION_ERROR; |
+ return result; |
+ } |
if (readOnly) { |
utext_freeze(result); |
} |
@@ -806,6 +815,11 @@ shallowTextClone(UText * dest, const UText * src, UErrorCode * status) { |
adjustPointer(dest, &dest->r, src); |
adjustPointer(dest, (const void **)&dest->chunkContents, src); |
+ // The newly shallow-cloned UText does _not_ own the underlying storage for the text. |
+ // (The source for the clone may or may not have owned the text.) |
+ |
+ dest->providerProperties &= ~I32_FLAG(UTEXT_PROVIDER_OWNS_TEXT); |
+ |
return dest; |
} |
@@ -1575,7 +1589,7 @@ utf8TextClose(UText *ut) { |
U_CDECL_END |
-static const struct UTextFuncs utf8Funcs = |
+static const struct UTextFuncs utf8Funcs = |
{ |
sizeof(UTextFuncs), |
0, 0, 0, // Reserved alignment padding |
@@ -1862,7 +1876,7 @@ repTextExtract(UText *ut, |
UnicodeString buffer(dest, 0, destCapacity); // writable alias |
rep->extractBetween(start32, limit32, buffer); |
repTextAccess(ut, limit32, TRUE); |
- |
+ |
return u_terminateUChars(dest, destCapacity, length, status); |
} |
@@ -1984,7 +1998,7 @@ repTextCopy(UText *ut, |
repTextAccess(ut, nativeIterIndex, TRUE); |
} |
-static const struct UTextFuncs repFuncs = |
+static const struct UTextFuncs repFuncs = |
{ |
sizeof(UTextFuncs), |
0, 0, 0, // Reserved alignment padding |
@@ -1992,8 +2006,8 @@ static const struct UTextFuncs repFuncs = |
repTextLength, |
repTextAccess, |
repTextExtract, |
- repTextReplace, |
- repTextCopy, |
+ repTextReplace, |
+ repTextCopy, |
NULL, // MapOffsetToNative, |
NULL, // MapIndexToUTF16, |
repTextClose, |
@@ -2235,7 +2249,7 @@ unistrTextCopy(UText *ut, |
} |
-static const struct UTextFuncs unistrFuncs = |
+static const struct UTextFuncs unistrFuncs = |
{ |
sizeof(UTextFuncs), |
0, 0, 0, // Reserved alignment padding |
@@ -2243,8 +2257,8 @@ static const struct UTextFuncs unistrFuncs = |
unistrTextLength, |
unistrTextAccess, |
unistrTextExtract, |
- unistrTextReplace, |
- unistrTextCopy, |
+ unistrTextReplace, |
+ unistrTextCopy, |
NULL, // MapOffsetToNative, |
NULL, // MapIndexToUTF16, |
unistrTextClose, |
@@ -2548,7 +2562,7 @@ ucstrTextExtract(UText *ut, |
return di; |
} |
-static const struct UTextFuncs ucstrFuncs = |
+static const struct UTextFuncs ucstrFuncs = |
{ |
sizeof(UTextFuncs), |
0, 0, 0, // Reserved alignment padding |
@@ -2765,14 +2779,14 @@ charIterTextExtract(UText *ut, |
} |
srci += len; |
} |
- |
+ |
charIterTextAccess(ut, copyLimit, TRUE); |
u_terminateUChars(dest, destCapacity, desti, status); |
return desti; |
} |
-static const struct UTextFuncs charIterFuncs = |
+static const struct UTextFuncs charIterFuncs = |
{ |
sizeof(UTextFuncs), |
0, 0, 0, // Reserved alignment padding |
@@ -2832,6 +2846,3 @@ utext_openCharacterIterator(UText *ut, CharacterIterator *ci, UErrorCode *status |
} |
return ut; |
} |
- |
- |
- |