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

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: 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 3647 matching lines...) Expand 10 before | Expand all | Expand 10 after
3677 intptr_t Length() const { return Smi::Value(raw_ptr()->length_); } 3678 intptr_t Length() const { return Smi::Value(raw_ptr()->length_); }
3678 static intptr_t length_offset() { return OFFSET_OF(RawString, length_); } 3679 static intptr_t length_offset() { return OFFSET_OF(RawString, length_); }
3679 3680
3680 virtual intptr_t Hash() const; 3681 virtual intptr_t Hash() const;
3681 static intptr_t hash_offset() { return OFFSET_OF(RawString, hash_); } 3682 static intptr_t hash_offset() { return OFFSET_OF(RawString, hash_); }
3682 static intptr_t Hash(const String& str, intptr_t begin_index, intptr_t len); 3683 static intptr_t Hash(const String& str, intptr_t begin_index, intptr_t len);
3683 static intptr_t Hash(const uint8_t* characters, intptr_t len); 3684 static intptr_t Hash(const uint8_t* characters, intptr_t len);
3684 static intptr_t Hash(const uint16_t* characters, intptr_t len); 3685 static intptr_t Hash(const uint16_t* characters, intptr_t len);
3685 static intptr_t Hash(const uint32_t* characters, intptr_t len); 3686 static intptr_t Hash(const uint32_t* characters, intptr_t len);
3686 3687
3687 int32_t CharAt(intptr_t index) const; 3688 uint32_t CharAt(intptr_t index) const;
3689 uint32_t CodeUnitAt(intptr_t index) const;
3688 3690
3689 intptr_t CharSize() const; 3691 intptr_t CharSize() const;
3690 3692
3691 inline bool Equals(const String& str) const; 3693 inline bool Equals(const String& str) const;
3692 inline bool Equals(const String& str, 3694 inline bool Equals(const String& str,
3693 intptr_t begin_index, // begin index on 'str'. 3695 intptr_t begin_index, // begin index on 'str'.
3694 intptr_t len) const; // len on 'str'. 3696 intptr_t len) const; // len on 'str'.
3695 bool Equals(const char* str) const; 3697 bool Equals(const char* str) const;
3696 bool Equals(const uint8_t* characters, intptr_t len) const; 3698 bool Equals(const uint8_t* characters, intptr_t len) const;
3697 bool Equals(const uint16_t* characters, intptr_t len) const; 3699 bool Equals(const uint16_t* characters, intptr_t len) const;
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
3843 friend class Symbols; 3845 friend class Symbols;
3844 friend class OneByteString; 3846 friend class OneByteString;
3845 friend class TwoByteString; 3847 friend class TwoByteString;
3846 friend class ExternalOneByteString; 3848 friend class ExternalOneByteString;
3847 friend class ExternalTwoByteString; 3849 friend class ExternalTwoByteString;
3848 }; 3850 };
3849 3851
3850 3852
3851 class OneByteString : public AllStatic { 3853 class OneByteString : public AllStatic {
3852 public: 3854 public:
3853 static int32_t CharAt(const String& str, intptr_t index) { 3855 static uint32_t CharAt(const String& str, intptr_t index) {
3854 return *CharAddr(str, index); 3856 return *CharAddr(str, index);
3855 } 3857 }
3856 3858
3859 static uint32_t CodeUnitAt(const String& str, intptr_t index) {
3860 return *CharAddr(str, index);
3861 }
3862
3857 static RawOneByteString* EscapeSpecialCharacters(const String& str, 3863 static RawOneByteString* EscapeSpecialCharacters(const String& str,
3858 bool raw_str); 3864 bool raw_str);
3859 3865
3860 static bool EqualsIgnoringPrivateKey(const String& str1, 3866 static bool EqualsIgnoringPrivateKey(const String& str1,
3861 const String& str2); 3867 const String& str2);
3862 3868
3863 // We use the same maximum elements for all strings. 3869 // We use the same maximum elements for all strings.
3864 static const intptr_t kBytesPerElement = 1; 3870 static const intptr_t kBytesPerElement = 1;
3865 static const intptr_t kMaxElements = String::kMaxElements; 3871 static const intptr_t kMaxElements = String::kMaxElements;
3866 3872
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
3900 3906
3901 static RawOneByteString* Concat(const String& str1, 3907 static RawOneByteString* Concat(const String& str1,
3902 const String& str2, 3908 const String& str2,
3903 Heap::Space space); 3909 Heap::Space space);
3904 static RawOneByteString* ConcatAll(const Array& strings, 3910 static RawOneByteString* ConcatAll(const Array& strings,
3905 intptr_t len, 3911 intptr_t len,
3906 Heap::Space space); 3912 Heap::Space space);
3907 3913
3908 static RawOneByteString* Transform(int32_t (*mapping)(int32_t ch), 3914 static RawOneByteString* Transform(int32_t (*mapping)(int32_t ch),
3909 const String& str, 3915 const String& str,
3916 int out_length,
3910 Heap::Space space); 3917 Heap::Space space);
3911 3918
3912 static const ClassId kClassId = kOneByteStringCid; 3919 static const ClassId kClassId = kOneByteStringCid;
3913 3920
3914 static RawOneByteString* null() { 3921 static RawOneByteString* null() {
3915 return reinterpret_cast<RawOneByteString*>(Object::null()); 3922 return reinterpret_cast<RawOneByteString*>(Object::null());
3916 } 3923 }
3917 3924
3918 private: 3925 private:
3919 static RawOneByteString* raw(const String& str) { 3926 static RawOneByteString* raw(const String& str) {
(...skipping 17 matching lines...) Expand all
3937 Snapshot::Kind kind); 3944 Snapshot::Kind kind);
3938 3945
3939 friend class Class; 3946 friend class Class;
3940 friend class String; 3947 friend class String;
3941 friend class SnapshotReader; 3948 friend class SnapshotReader;
3942 }; 3949 };
3943 3950
3944 3951
3945 class TwoByteString : public AllStatic { 3952 class TwoByteString : public AllStatic {
3946 public: 3953 public:
3947 static int32_t CharAt(const String& str, intptr_t index) { 3954 static uint32_t CharAt(const String& str, intptr_t index) {
3955 int32_t unit = *CharAddr(str, index);
3956 // For non-surrogate values or incorrect trailing surrogates we just return
3957 // the value.
3958 if (!Utf16::IsLeadSurrogate(unit)) return unit;
3959
3960 // If the string ends with a lead surrogate we just return that.
3961 if (index + 1 >= str.Length()) return unit;
3962
3963 return Utf16::CodePointFromCodeUnits(unit, *CharAddr(str, index + 1));
3964 }
3965
3966 static uint32_t CodeUnitAt(const String& str, intptr_t index) {
3948 return *CharAddr(str, index); 3967 return *CharAddr(str, index);
3949 } 3968 }
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
3950 3969
3951 static RawTwoByteString* EscapeSpecialCharacters(const String& str, 3970 static RawTwoByteString* EscapeSpecialCharacters(const String& str,
3952 bool raw_str); 3971 bool raw_str);
3953 3972
3954 // We use the same maximum elements for all strings. 3973 // We use the same maximum elements for all strings.
3955 static const intptr_t kBytesPerElement = 2; 3974 static const intptr_t kBytesPerElement = 2;
3956 static const intptr_t kMaxElements = String::kMaxElements; 3975 static const intptr_t kMaxElements = String::kMaxElements;
3957 3976
3958 static intptr_t data_offset() { return OFFSET_OF(RawTwoByteString, data_); } 3977 static intptr_t data_offset() { return OFFSET_OF(RawTwoByteString, data_); }
3959 3978
(...skipping 23 matching lines...) Expand all
3983 4002
3984 static RawTwoByteString* Concat(const String& str1, 4003 static RawTwoByteString* Concat(const String& str1,
3985 const String& str2, 4004 const String& str2,
3986 Heap::Space space); 4005 Heap::Space space);
3987 static RawTwoByteString* ConcatAll(const Array& strings, 4006 static RawTwoByteString* ConcatAll(const Array& strings,
3988 intptr_t len, 4007 intptr_t len,
3989 Heap::Space space); 4008 Heap::Space space);
3990 4009
3991 static RawTwoByteString* Transform(int32_t (*mapping)(int32_t ch), 4010 static RawTwoByteString* Transform(int32_t (*mapping)(int32_t ch),
3992 const String& str, 4011 const String& str,
4012 int out_length,
3993 Heap::Space space); 4013 Heap::Space space);
3994 4014
3995 static RawTwoByteString* null() { 4015 static RawTwoByteString* null() {
3996 return reinterpret_cast<RawTwoByteString*>(Object::null()); 4016 return reinterpret_cast<RawTwoByteString*>(Object::null());
3997 } 4017 }
3998 4018
3999 4019
4000 static const ClassId kClassId = kTwoByteStringCid; 4020 static const ClassId kClassId = kTwoByteStringCid;
4001 4021
4002 private: 4022 private:
(...skipping 18 matching lines...) Expand all
4021 Snapshot::Kind kind); 4041 Snapshot::Kind kind);
4022 4042
4023 friend class Class; 4043 friend class Class;
4024 friend class String; 4044 friend class String;
4025 friend class SnapshotReader; 4045 friend class SnapshotReader;
4026 }; 4046 };
4027 4047
4028 4048
4029 class ExternalOneByteString : public AllStatic { 4049 class ExternalOneByteString : public AllStatic {
4030 public: 4050 public:
4031 static int32_t CharAt(const String& str, intptr_t index) { 4051 static uint32_t CharAt(const String& str, intptr_t index) {
4032 return *CharAddr(str, index); 4052 return *CharAddr(str, index);
4033 } 4053 }
4034 4054
4055 static uint32_t CodeUnitAt(const String& str, intptr_t index) {
4056 return *CharAddr(str, index);
4057 }
4058
4035 static void* GetPeer(const String& str) { 4059 static void* GetPeer(const String& str) {
4036 return raw_ptr(str)->external_data_->peer(); 4060 return raw_ptr(str)->external_data_->peer();
4037 } 4061 }
4038 4062
4039 // We use the same maximum elements for all strings. 4063 // We use the same maximum elements for all strings.
4040 static const intptr_t kBytesPerElement = 1; 4064 static const intptr_t kBytesPerElement = 1;
4041 static const intptr_t kMaxElements = String::kMaxElements; 4065 static const intptr_t kMaxElements = String::kMaxElements;
4042 4066
4043 static intptr_t InstanceSize() { 4067 static intptr_t InstanceSize() {
4044 return String::RoundedAllocationSize(sizeof(RawExternalOneByteString)); 4068 return String::RoundedAllocationSize(sizeof(RawExternalOneByteString));
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
4087 Snapshot::Kind kind); 4111 Snapshot::Kind kind);
4088 4112
4089 friend class Class; 4113 friend class Class;
4090 friend class String; 4114 friend class String;
4091 friend class SnapshotReader; 4115 friend class SnapshotReader;
4092 }; 4116 };
4093 4117
4094 4118
4095 class ExternalTwoByteString : public AllStatic { 4119 class ExternalTwoByteString : public AllStatic {
4096 public: 4120 public:
4097 static int32_t CharAt(const String& str, intptr_t index) { 4121 static uint32_t CharAt(const String& str, intptr_t index) {
4122 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.
4123 // For non-surrogate values or incorrect trailing surrogates we just return
4124 // the value.
4125 if (!Utf16::IsLeadSurrogate(unit)) return unit;
4126
4127 // If the string ends with a lead surrogate we just return that.
4128 if (index + 1 >= str.Length()) return unit;
4129
4130 return Utf16::CodePointFromCodeUnits(unit, *CharAddr(str, index + 1));
4131 }
4132
4133 static uint32_t CodeUnitAt(const String& str, intptr_t index) {
4098 return *CharAddr(str, index); 4134 return *CharAddr(str, index);
4099 } 4135 }
4100 4136
4101 static void* GetPeer(const String& str) { 4137 static void* GetPeer(const String& str) {
4102 return raw_ptr(str)->external_data_->peer(); 4138 return raw_ptr(str)->external_data_->peer();
4103 } 4139 }
4104 4140
4105 // We use the same maximum elements for all strings. 4141 // We use the same maximum elements for all strings.
4106 static const intptr_t kBytesPerElement = 2; 4142 static const intptr_t kBytesPerElement = 2;
4107 static const intptr_t kMaxElements = String::kMaxElements; 4143 static const intptr_t kMaxElements = String::kMaxElements;
(...skipping 1743 matching lines...) Expand 10 before | Expand all | Expand 10 after
5851 intptr_t begin_index, 5887 intptr_t begin_index,
5852 intptr_t len) const { 5888 intptr_t len) const {
5853 ASSERT(begin_index >= 0); 5889 ASSERT(begin_index >= 0);
5854 ASSERT((begin_index == 0) || (begin_index < str.Length())); 5890 ASSERT((begin_index == 0) || (begin_index < str.Length()));
5855 ASSERT(len >= 0); 5891 ASSERT(len >= 0);
5856 ASSERT(len <= str.Length()); 5892 ASSERT(len <= str.Length());
5857 if (len != this->Length()) { 5893 if (len != this->Length()) {
5858 return false; // Lengths don't match. 5894 return false; // Lengths don't match.
5859 } 5895 }
5860 for (intptr_t i = 0; i < len; i++) { 5896 for (intptr_t i = 0; i < len; i++) {
5861 if (this->CharAt(i) != str.CharAt(begin_index + i)) { 5897 if (this->CodeUnitAt(i) != str.CodeUnitAt(begin_index + i)) {
5862 return false; 5898 return false;
5863 } 5899 }
5864 } 5900 }
5865 return true; 5901 return true;
5866 } 5902 }
5867 5903
5868 } // namespace dart 5904 } // namespace dart
5869 5905
5870 #endif // VM_OBJECT_H_ 5906 #endif // VM_OBJECT_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698