Index: runtime/vm/object.h |
diff --git a/runtime/vm/object.h b/runtime/vm/object.h |
index 2836dda969ab3435a680294b02d436ae91c882f3..97d4f5c708d0d5e7ec5f4fee602326794fa4f2ed 100644 |
--- a/runtime/vm/object.h |
+++ b/runtime/vm/object.h |
@@ -17,6 +17,7 @@ |
#include "vm/os.h" |
#include "vm/raw_object.h" |
#include "vm/scanner.h" |
+#include "vm/unicode.h" |
namespace dart { |
@@ -3684,7 +3685,8 @@ class String : public Instance { |
static intptr_t Hash(const uint16_t* characters, intptr_t len); |
static intptr_t Hash(const uint32_t* characters, intptr_t len); |
- int32_t CharAt(intptr_t index) const; |
+ uint32_t CharAt(intptr_t index) const; |
+ uint32_t CodeUnitAt(intptr_t index) const; |
intptr_t CharSize() const; |
@@ -3850,7 +3852,11 @@ class String : public Instance { |
class OneByteString : public AllStatic { |
public: |
- static int32_t CharAt(const String& str, intptr_t index) { |
+ static uint32_t CharAt(const String& str, intptr_t index) { |
+ return *CharAddr(str, index); |
+ } |
+ |
+ static uint32_t CodeUnitAt(const String& str, intptr_t index) { |
return *CharAddr(str, index); |
} |
@@ -3907,6 +3913,7 @@ class OneByteString : public AllStatic { |
static RawOneByteString* Transform(int32_t (*mapping)(int32_t ch), |
const String& str, |
+ int out_length, |
Heap::Space space); |
static const ClassId kClassId = kOneByteStringCid; |
@@ -3944,7 +3951,19 @@ class OneByteString : public AllStatic { |
class TwoByteString : public AllStatic { |
public: |
- static int32_t CharAt(const String& str, intptr_t index) { |
+ static uint32_t CharAt(const String& str, intptr_t index) { |
+ int32_t unit = *CharAddr(str, index); |
+ // For non-surrogate values or incorrect trailing surrogates we just return |
+ // the value. |
+ if (!Utf16::IsLeadSurrogate(unit)) return unit; |
+ |
+ // If the string ends with a lead surrogate we just return that. |
+ if (index + 1 >= str.Length()) return unit; |
+ |
+ return Utf16::CodePointFromCodeUnits(unit, *CharAddr(str, index + 1)); |
+ } |
+ |
+ static uint32_t CodeUnitAt(const String& str, intptr_t index) { |
return *CharAddr(str, index); |
} |
siva
2012/11/08 19:06:47
I don't mind changing the name 'CharAt' to 'CodeU
erikcorry
2012/11/08 22:09:34
Do you want to move the C++ support for toUpperCas
siva
2012/11/09 02:40:42
We could fix String::Transform/TwoByteString::Tran
erikcorry
2012/11/15 13:28:25
I have fixed the UTF8 and the Transform (toUpper/L
|
@@ -3990,6 +4009,7 @@ class TwoByteString : public AllStatic { |
static RawTwoByteString* Transform(int32_t (*mapping)(int32_t ch), |
const String& str, |
+ int out_length, |
Heap::Space space); |
static RawTwoByteString* null() { |
@@ -4028,7 +4048,11 @@ class TwoByteString : public AllStatic { |
class ExternalOneByteString : public AllStatic { |
public: |
- static int32_t CharAt(const String& str, intptr_t index) { |
+ static uint32_t CharAt(const String& str, intptr_t index) { |
+ return *CharAddr(str, index); |
+ } |
+ |
+ static uint32_t CodeUnitAt(const String& str, intptr_t index) { |
return *CharAddr(str, index); |
} |
@@ -4094,7 +4118,19 @@ class ExternalOneByteString : public AllStatic { |
class ExternalTwoByteString : public AllStatic { |
public: |
- static int32_t CharAt(const String& str, intptr_t index) { |
+ static uint32_t CharAt(const String& str, intptr_t index) { |
+ int32_t unit = *CharAddr(str, index); |
floitsch
2012/11/08 15:28:21
uint32_t unit =
erikcorry
2012/11/15 13:28:25
This code is gone.
|
+ // For non-surrogate values or incorrect trailing surrogates we just return |
+ // the value. |
+ if (!Utf16::IsLeadSurrogate(unit)) return unit; |
+ |
+ // If the string ends with a lead surrogate we just return that. |
+ if (index + 1 >= str.Length()) return unit; |
+ |
+ return Utf16::CodePointFromCodeUnits(unit, *CharAddr(str, index + 1)); |
+ } |
+ |
+ static uint32_t CodeUnitAt(const String& str, intptr_t index) { |
return *CharAddr(str, index); |
} |
@@ -5858,7 +5894,7 @@ bool String::Equals(const String& str, |
return false; // Lengths don't match. |
} |
for (intptr_t i = 0; i < len; i++) { |
- if (this->CharAt(i) != str.CharAt(begin_index + i)) { |
+ if (this->CodeUnitAt(i) != str.CodeUnitAt(begin_index + i)) { |
return false; |
} |
} |