| Index: src/unicode-inl.h
 | 
| ===================================================================
 | 
| --- src/unicode-inl.h	(revision 10944)
 | 
| +++ src/unicode-inl.h	(working copy)
 | 
| @@ -78,7 +78,7 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| -unsigned Utf8::Encode(char* str, uchar c) {
 | 
| +unsigned Utf8::Encode(char* str, uchar c, int previous) {
 | 
|    static const int kMask = ~(1 << 6);
 | 
|    if (c <= kMaxOneByteChar) {
 | 
|      str[0] = c;
 | 
| @@ -88,6 +88,13 @@
 | 
|      str[1] = 0x80 | (c & kMask);
 | 
|      return 2;
 | 
|    } else if (c <= kMaxThreeByteChar) {
 | 
| +    if (Utf16::IsTrailSurrogate(c) &&
 | 
| +        Utf16::IsLeadSurrogate(previous)) {
 | 
| +      const int kUnmatchedSize = kSizeOfUnmatchedSurrogate;
 | 
| +      return Encode(str - kUnmatchedSize,
 | 
| +                    Utf16::CombineSurrogatePair(previous, c),
 | 
| +                    Utf16::kNoPreviousCharacter) - kUnmatchedSize;
 | 
| +    }
 | 
|      str[0] = 0xE0 | (c >> 12);
 | 
|      str[1] = 0x80 | ((c >> 6) & kMask);
 | 
|      str[2] = 0x80 | (c & kMask);
 | 
| @@ -113,12 +120,16 @@
 | 
|    return CalculateValue(bytes, length, cursor);
 | 
|  }
 | 
|  
 | 
| -unsigned Utf8::Length(uchar c) {
 | 
| +unsigned Utf8::Length(uchar c, int previous) {
 | 
|    if (c <= kMaxOneByteChar) {
 | 
|      return 1;
 | 
|    } else if (c <= kMaxTwoByteChar) {
 | 
|      return 2;
 | 
|    } else if (c <= kMaxThreeByteChar) {
 | 
| +    if (Utf16::IsTrailSurrogate(c) &&
 | 
| +        Utf16::IsLeadSurrogate(previous)) {
 | 
| +      return kSizeOfUnmatchedSurrogate - kBytesSavedByCombiningSurrogates;
 | 
| +    }
 | 
|      return 3;
 | 
|    } else {
 | 
|      return 4;
 | 
| 
 |