ICU-5560 Fix UText bug with deep clone buffer pointer handling.

X-SVN-Rev: 20993
This commit is contained in:
Andy Heninger 2007-01-30 01:38:16 +00:00
parent acc3a3e636
commit 5a8ece1c9e
3 changed files with 47 additions and 6 deletions

View File

@ -1,7 +1,7 @@
/*
*******************************************************************************
*
* Copyright (C) 2005-2006, International Business Machines
* Copyright (C) 2005-2007, International Business Machines
* Corporation and others. All Rights Reserved.
*
*******************************************************************************
@ -578,8 +578,6 @@ utext_setup(UText *ut, int32_t extraSpace, UErrorCode *status) {
if (spaceRequired>0) {
ut->extraSize = extraSpace;
ut->pExtra = &((ExtendedUText *)ut)->extension;
uprv_memset(ut->pExtra, 0, extraSpace); // Purify whines about copying untouched extra [buffer]
// space when cloning, so init it now.
}
}
} else {
@ -611,7 +609,6 @@ utext_setup(UText *ut, int32_t extraSpace, UErrorCode *status) {
} else {
ut->extraSize = extraSpace;
ut->flags |= UTEXT_EXTRA_HEAP_ALLOCATED;
uprv_memset(ut->pExtra, 0, extraSpace);
}
}
}
@ -638,6 +635,9 @@ utext_setup(UText *ut, int32_t extraSpace, UErrorCode *status) {
ut->privB = 0;
ut->privC = 0;
ut->privP = NULL;
if (ut->pExtra!=NULL && ut->extraSize>0)
uprv_memset(ut->pExtra, 0, ut->extraSize);
}
return ut;
}
@ -799,6 +799,7 @@ shallowTextClone(UText * dest, const UText * src, UErrorCode * status) {
adjustPointer(dest, &dest->p, src);
adjustPointer(dest, &dest->q, src);
adjustPointer(dest, &dest->r, src);
adjustPointer(dest, (const void **)&dest->chunkContents, src);
return dest;
}

View File

@ -1,6 +1,6 @@
/********************************************************************
* COPYRIGHT:
* Copyright (c) 2005-2006, International Business Machines Corporation and
* Copyright (c) 2005-2007, International Business Machines Corporation and
* others. All Rights Reserved.
********************************************************************/
/************************************************************************
@ -54,6 +54,8 @@ UTextTest::runIndexedTest(int32_t index, UBool exec,
if (exec) ErrorTest(); break;
case 2: name = "FreezeTest";
if (exec) FreezeTest(); break;
case 3: name = "Ticket5560";
if (exec) Ticket5560(); break;
default: name = ""; break;
}
}
@ -1350,3 +1352,40 @@ openFragmentedUnicodeString(UText *ut, UnicodeString *s, UErrorCode *status) {
return ut;
}
// Regression test for Ticket 5560
// Clone fails to update chunkContentPointer in the cloned copy.
// This is only an issue for UText types that work in a local buffer,
// (UTF-8 wrapper, for example)
//
// The test:
// 1. Create an inital UText
// 2. Deep clone it. Contents should match original.
// 3. Reset original to something different.
// 4. Check that clone contents did not change.
//
void UTextTest::Ticket5560() {
char *s1 = "ABCDEF";
char *s2 = "123456";
UErrorCode status = U_ZERO_ERROR;
UText ut1 = UTEXT_INITIALIZER;
UText ut2 = UTEXT_INITIALIZER;
utext_openUTF8(&ut1, s1, -1, &status);
UChar c = utext_next32(&ut1);
TEST_ASSERT(c == 0x41); // c == 'A'
utext_clone(&ut2, &ut1, TRUE, FALSE, &status);
TEST_SUCCESS(status);
c = utext_next32(&ut2);
TEST_ASSERT(c == 0x42); // c == 'B'
c = utext_next32(&ut1);
TEST_ASSERT(c == 0x42); // c == 'B'
utext_openUTF8(&ut1, s2, -1, &status);
c = utext_next32(&ut1);
TEST_ASSERT(c == 0x31); // c == '1'
c = utext_next32(&ut2);
TEST_ASSERT(c == 0x43); // c == 'C'
}

View File

@ -1,6 +1,6 @@
/********************************************************************
* COPYRIGHT:
* Copyright (c) 2005-2006, International Business Machines Corporation and
* Copyright (c) 2005-2007, International Business Machines Corporation and
* others. All Rights Reserved.
********************************************************************/
/************************************************************************
@ -31,6 +31,7 @@ public:
void TextTest();
void ErrorTest();
void FreezeTest();
void Ticket5560();
private:
struct m { // Map between native indices & code points.