Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: runtime/vm/object.h

Issue 11368138: Add some support for the code-point code-unit distinction. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: New version integrates feedback, adds less to standard String class. Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #ifndef VM_OBJECT_H_ 5 #ifndef VM_OBJECT_H_
6 #define VM_OBJECT_H_ 6 #define VM_OBJECT_H_
7 7
8 #include "include/dart_api.h" 8 #include "include/dart_api.h"
9 #include "platform/assert.h" 9 #include "platform/assert.h"
10 #include "platform/utils.h" 10 #include "platform/utils.h"
11 #include "vm/bitmap.h" 11 #include "vm/bitmap.h"
12 #include "vm/dart.h" 12 #include "vm/dart.h"
13 #include "vm/globals.h" 13 #include "vm/globals.h"
14 #include "vm/handles.h" 14 #include "vm/handles.h"
15 #include "vm/heap.h" 15 #include "vm/heap.h"
16 #include "vm/isolate.h" 16 #include "vm/isolate.h"
17 #include "vm/os.h" 17 #include "vm/os.h"
18 #include "vm/raw_object.h" 18 #include "vm/raw_object.h"
19 #include "vm/scanner.h" 19 #include "vm/scanner.h"
20 #include "vm/unicode.h"
20 21
21 namespace dart { 22 namespace dart {
22 23
23 // Forward declarations. 24 // Forward declarations.
24 #define DEFINE_FORWARD_DECLARATION(clazz) \ 25 #define DEFINE_FORWARD_DECLARATION(clazz) \
25 class clazz; 26 class clazz;
26 CLASS_LIST(DEFINE_FORWARD_DECLARATION) 27 CLASS_LIST(DEFINE_FORWARD_DECLARATION)
27 #undef DEFINE_FORWARD_DECLARATION 28 #undef DEFINE_FORWARD_DECLARATION
28 class Api; 29 class Api;
29 class Assembler; 30 class Assembler;
(...skipping 3681 matching lines...) Expand 10 before | Expand all | Expand 10 after
3711 intptr_t Length() const { return Smi::Value(raw_ptr()->length_); } 3712 intptr_t Length() const { return Smi::Value(raw_ptr()->length_); }
3712 static intptr_t length_offset() { return OFFSET_OF(RawString, length_); } 3713 static intptr_t length_offset() { return OFFSET_OF(RawString, length_); }
3713 3714
3714 virtual intptr_t Hash() const; 3715 virtual intptr_t Hash() const;
3715 static intptr_t hash_offset() { return OFFSET_OF(RawString, hash_); } 3716 static intptr_t hash_offset() { return OFFSET_OF(RawString, hash_); }
3716 static intptr_t Hash(const String& str, intptr_t begin_index, intptr_t len); 3717 static intptr_t Hash(const String& str, intptr_t begin_index, intptr_t len);
3717 static intptr_t Hash(const uint8_t* characters, intptr_t len); 3718 static intptr_t Hash(const uint8_t* characters, intptr_t len);
3718 static intptr_t Hash(const uint16_t* characters, intptr_t len); 3719 static intptr_t Hash(const uint16_t* characters, intptr_t len);
3719 static intptr_t Hash(const uint32_t* characters, intptr_t len); 3720 static intptr_t Hash(const uint32_t* characters, intptr_t len);
3720 3721
3721 int32_t CharAt(intptr_t index) const; 3722 // Returns the UTF-16 code unit at an index. UTF-16 is a superset of ASCII
3723 // so you can always use this if you are looking for ASCII. If you need to
3724 // support arbitrary Unicode characters then you should perhaps be using
3725 // Utf16::CharCodeAt(string, index) instead.
3726 uint32_t CodeUnitAt(intptr_t index) const;
3722 3727
3723 intptr_t CharSize() const; 3728 intptr_t CharSize() const;
3724 3729
3725 inline bool Equals(const String& str) const; 3730 inline bool Equals(const String& str) const;
3726 inline bool Equals(const String& str, 3731 inline bool Equals(const String& str,
3727 intptr_t begin_index, // begin index on 'str'. 3732 intptr_t begin_index, // begin index on 'str'.
3728 intptr_t len) const; // len on 'str'. 3733 intptr_t len) const; // len on 'str'.
3729 bool Equals(const char* str) const; 3734 bool Equals(const char* str) const;
3730 bool Equals(const uint8_t* characters, intptr_t len) const; 3735 bool Equals(const uint8_t* characters, intptr_t len) const;
3731 bool Equals(const uint16_t* characters, intptr_t len) const; 3736 bool Equals(const uint16_t* characters, intptr_t len) const;
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
3877 friend class Symbols; 3882 friend class Symbols;
3878 friend class OneByteString; 3883 friend class OneByteString;
3879 friend class TwoByteString; 3884 friend class TwoByteString;
3880 friend class ExternalOneByteString; 3885 friend class ExternalOneByteString;
3881 friend class ExternalTwoByteString; 3886 friend class ExternalTwoByteString;
3882 }; 3887 };
3883 3888
3884 3889
3885 class OneByteString : public AllStatic { 3890 class OneByteString : public AllStatic {
3886 public: 3891 public:
3887 static int32_t CharAt(const String& str, intptr_t index) { 3892 static uint32_t CodeUnitAt(const String& str, intptr_t index) {
cshapiro 2012/11/15 20:14:51 Why did the signedness of the return type change?
erikcorry 2012/11/15 23:47:05 There is a mixture in the VM of signed and unsigne
3888 return *CharAddr(str, index); 3893 return *CharAddr(str, index);
3889 } 3894 }
3890 3895
3891 static RawOneByteString* EscapeSpecialCharacters(const String& str, 3896 static RawOneByteString* EscapeSpecialCharacters(const String& str,
3892 bool raw_str); 3897 bool raw_str);
3893 3898
3894 static bool EqualsIgnoringPrivateKey(const String& str1, 3899 static bool EqualsIgnoringPrivateKey(const String& str1,
3895 const String& str2); 3900 const String& str2);
3896 3901
3897 // We use the same maximum elements for all strings. 3902 // We use the same maximum elements for all strings.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
3934 3939
3935 static RawOneByteString* Concat(const String& str1, 3940 static RawOneByteString* Concat(const String& str1,
3936 const String& str2, 3941 const String& str2,
3937 Heap::Space space); 3942 Heap::Space space);
3938 static RawOneByteString* ConcatAll(const Array& strings, 3943 static RawOneByteString* ConcatAll(const Array& strings,
3939 intptr_t len, 3944 intptr_t len,
3940 Heap::Space space); 3945 Heap::Space space);
3941 3946
3942 static RawOneByteString* Transform(int32_t (*mapping)(int32_t ch), 3947 static RawOneByteString* Transform(int32_t (*mapping)(int32_t ch),
3943 const String& str, 3948 const String& str,
3949 int out_length,
3944 Heap::Space space); 3950 Heap::Space space);
3945 3951
3946 static const ClassId kClassId = kOneByteStringCid; 3952 static const ClassId kClassId = kOneByteStringCid;
3947 3953
3948 static RawOneByteString* null() { 3954 static RawOneByteString* null() {
3949 return reinterpret_cast<RawOneByteString*>(Object::null()); 3955 return reinterpret_cast<RawOneByteString*>(Object::null());
3950 } 3956 }
3951 3957
3952 private: 3958 private:
3953 static RawOneByteString* raw(const String& str) { 3959 static RawOneByteString* raw(const String& str) {
(...skipping 17 matching lines...) Expand all
3971 Snapshot::Kind kind); 3977 Snapshot::Kind kind);
3972 3978
3973 friend class Class; 3979 friend class Class;
3974 friend class String; 3980 friend class String;
3975 friend class SnapshotReader; 3981 friend class SnapshotReader;
3976 }; 3982 };
3977 3983
3978 3984
3979 class TwoByteString : public AllStatic { 3985 class TwoByteString : public AllStatic {
3980 public: 3986 public:
3981 static int32_t CharAt(const String& str, intptr_t index) { 3987 static uint32_t CodeUnitAt(const String& str, intptr_t index) {
3982 return *CharAddr(str, index); 3988 return *CharAddr(str, index);
3983 } 3989 }
3984 3990
3985 static RawTwoByteString* EscapeSpecialCharacters(const String& str, 3991 static RawTwoByteString* EscapeSpecialCharacters(const String& str,
3986 bool raw_str); 3992 bool raw_str);
3987 3993
3988 // We use the same maximum elements for all strings. 3994 // We use the same maximum elements for all strings.
3989 static const intptr_t kBytesPerElement = 2; 3995 static const intptr_t kBytesPerElement = 2;
3990 static const intptr_t kMaxElements = String::kMaxElements; 3996 static const intptr_t kMaxElements = String::kMaxElements;
3991 3997
(...skipping 25 matching lines...) Expand all
4017 4023
4018 static RawTwoByteString* Concat(const String& str1, 4024 static RawTwoByteString* Concat(const String& str1,
4019 const String& str2, 4025 const String& str2,
4020 Heap::Space space); 4026 Heap::Space space);
4021 static RawTwoByteString* ConcatAll(const Array& strings, 4027 static RawTwoByteString* ConcatAll(const Array& strings,
4022 intptr_t len, 4028 intptr_t len,
4023 Heap::Space space); 4029 Heap::Space space);
4024 4030
4025 static RawTwoByteString* Transform(int32_t (*mapping)(int32_t ch), 4031 static RawTwoByteString* Transform(int32_t (*mapping)(int32_t ch),
4026 const String& str, 4032 const String& str,
4033 int out_length,
4027 Heap::Space space); 4034 Heap::Space space);
4028 4035
4029 static RawTwoByteString* null() { 4036 static RawTwoByteString* null() {
4030 return reinterpret_cast<RawTwoByteString*>(Object::null()); 4037 return reinterpret_cast<RawTwoByteString*>(Object::null());
4031 } 4038 }
4032 4039
4033 4040
4034 static const ClassId kClassId = kTwoByteStringCid; 4041 static const ClassId kClassId = kTwoByteStringCid;
4035 4042
4036 private: 4043 private:
(...skipping 18 matching lines...) Expand all
4055 Snapshot::Kind kind); 4062 Snapshot::Kind kind);
4056 4063
4057 friend class Class; 4064 friend class Class;
4058 friend class String; 4065 friend class String;
4059 friend class SnapshotReader; 4066 friend class SnapshotReader;
4060 }; 4067 };
4061 4068
4062 4069
4063 class ExternalOneByteString : public AllStatic { 4070 class ExternalOneByteString : public AllStatic {
4064 public: 4071 public:
4065 static int32_t CharAt(const String& str, intptr_t index) { 4072 static uint32_t CodeUnitAt(const String& str, intptr_t index) {
4066 return *CharAddr(str, index); 4073 return *CharAddr(str, index);
4067 } 4074 }
4068 4075
4069 static void* GetPeer(const String& str) { 4076 static void* GetPeer(const String& str) {
4070 return raw_ptr(str)->external_data_->peer(); 4077 return raw_ptr(str)->external_data_->peer();
4071 } 4078 }
4072 4079
4073 // We use the same maximum elements for all strings. 4080 // We use the same maximum elements for all strings.
4074 static const intptr_t kBytesPerElement = 1; 4081 static const intptr_t kBytesPerElement = 1;
4075 static const intptr_t kMaxElements = String::kMaxElements; 4082 static const intptr_t kMaxElements = String::kMaxElements;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
4121 Snapshot::Kind kind); 4128 Snapshot::Kind kind);
4122 4129
4123 friend class Class; 4130 friend class Class;
4124 friend class String; 4131 friend class String;
4125 friend class SnapshotReader; 4132 friend class SnapshotReader;
4126 }; 4133 };
4127 4134
4128 4135
4129 class ExternalTwoByteString : public AllStatic { 4136 class ExternalTwoByteString : public AllStatic {
4130 public: 4137 public:
4131 static int32_t CharAt(const String& str, intptr_t index) { 4138 static uint32_t CodeUnitAt(const String& str, intptr_t index) {
4132 return *CharAddr(str, index); 4139 return *CharAddr(str, index);
4133 } 4140 }
4134 4141
4135 static void* GetPeer(const String& str) { 4142 static void* GetPeer(const String& str) {
4136 return raw_ptr(str)->external_data_->peer(); 4143 return raw_ptr(str)->external_data_->peer();
4137 } 4144 }
4138 4145
4139 // We use the same maximum elements for all strings. 4146 // We use the same maximum elements for all strings.
4140 static const intptr_t kBytesPerElement = 2; 4147 static const intptr_t kBytesPerElement = 2;
4141 static const intptr_t kMaxElements = String::kMaxElements; 4148 static const intptr_t kMaxElements = String::kMaxElements;
(...skipping 1755 matching lines...) Expand 10 before | Expand all | Expand 10 after
5897 intptr_t begin_index, 5904 intptr_t begin_index,
5898 intptr_t len) const { 5905 intptr_t len) const {
5899 ASSERT(begin_index >= 0); 5906 ASSERT(begin_index >= 0);
5900 ASSERT((begin_index == 0) || (begin_index < str.Length())); 5907 ASSERT((begin_index == 0) || (begin_index < str.Length()));
5901 ASSERT(len >= 0); 5908 ASSERT(len >= 0);
5902 ASSERT(len <= str.Length()); 5909 ASSERT(len <= str.Length());
5903 if (len != this->Length()) { 5910 if (len != this->Length()) {
5904 return false; // Lengths don't match. 5911 return false; // Lengths don't match.
5905 } 5912 }
5906 for (intptr_t i = 0; i < len; i++) { 5913 for (intptr_t i = 0; i < len; i++) {
5907 if (this->CharAt(i) != str.CharAt(begin_index + i)) { 5914 if (this->CodeUnitAt(i) != str.CodeUnitAt(begin_index + i)) {
5908 return false; 5915 return false;
5909 } 5916 }
5910 } 5917 }
5911 return true; 5918 return true;
5912 } 5919 }
5913 5920
5914 } // namespace dart 5921 } // namespace dart
5915 5922
5916 #endif // VM_OBJECT_H_ 5923 #endif // VM_OBJECT_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698