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

Unified Diff: vm/object.cc

Issue 11969029: Allow externalization of canonical strings also. Only restrict canonical strings (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 7 years, 11 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « vm/object.h ('k') | vm/object_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: vm/object.cc
===================================================================
--- vm/object.cc (revision 17180)
+++ vm/object.cc (working copy)
@@ -2265,7 +2265,6 @@
RawFunction* Class::LookupFunction(const String& name) const {
Isolate* isolate = Isolate::Current();
- ASSERT(name.IsOneByteString());
Array& funcs = Array::Handle(isolate, functions());
if (funcs.IsNull()) {
// This can occur, e.g., for Null classes.
@@ -2299,7 +2298,6 @@
RawFunction* Class::LookupFunctionAllowPrivate(const String& name) const {
Isolate* isolate = Isolate::Current();
- ASSERT(name.IsOneByteString());
Array& funcs = Array::Handle(isolate, functions());
if (funcs.IsNull()) {
// This can occur, e.g., for Null classes.
@@ -2311,8 +2309,8 @@
for (intptr_t i = 0; i < len; i++) {
function ^= funcs.At(i);
function_name ^= function.name();
- if (OneByteString::EqualsIgnoringPrivateKey(function_name, name)) {
- return function.raw();
+ if (String::EqualsIgnoringPrivateKey(function_name, name)) {
+ return function.raw();
}
}
// No function found.
@@ -2405,7 +2403,6 @@
RawField* Class::LookupField(const String& name) const {
Isolate* isolate = Isolate::Current();
- ASSERT(name.IsOneByteString());
const Array& flds = Array::Handle(isolate, fields());
Field& field = Field::Handle(isolate, Field::null());
String& field_name = String::Handle(isolate, String::null());
@@ -2413,8 +2410,8 @@
for (intptr_t i = 0; i < len; i++) {
field ^= flds.At(i);
field_name ^= field.name();
- if (OneByteString::EqualsIgnoringPrivateKey(field_name, name)) {
- return field.raw();
+ if (String::EqualsIgnoringPrivateKey(field_name, name)) {
+ return field.raw();
}
}
// No field found.
@@ -3967,7 +3964,6 @@
bool is_external,
const Object& owner,
intptr_t token_pos) {
- ASSERT(name.IsOneByteString());
ASSERT(!owner.IsNull());
const Function& result = Function::Handle(Function::New());
result.set_parameter_types(Object::empty_array());
@@ -4003,7 +3999,6 @@
RawFunction* Function::NewClosureFunction(const String& name,
const Function& parent,
intptr_t token_pos) {
- ASSERT(name.IsOneByteString());
ASSERT(!parent.IsNull());
// Use the owner defining the parent function and not the class containing it.
const Object& parent_owner = Object::Handle(parent.raw_ptr()->owner_);
@@ -4526,7 +4521,6 @@
bool is_const,
const Class& owner,
intptr_t token_pos) {
- ASSERT(name.IsOneByteString());
ASSERT(!owner.IsNull());
const Field& result = Field::Handle(Field::New());
result.set_name(name);
@@ -10860,7 +10854,7 @@
intptr_t original_size = 0;
uword tags = raw_ptr()->tags_;
- ASSERT(!IsCanonical());
+ ASSERT(!InVMHeap());
if (class_id == kOneByteStringCid) {
used_size = ExternalOneByteString::InstanceSize();
original_size = OneByteString::InstanceSize(str_length);
@@ -10957,6 +10951,104 @@
}
+// Check to see if 'str1' matches 'str2' as is or
+// once the private key separator is stripped from str2.
+//
+// Things are made more complicated by the fact that constructors are
+// added *after* the private suffix, so "foo@123.named" should match
+// "foo.named".
+//
+// Also, the private suffix can occur more than once in the name, as in:
+//
+// _ReceivePortImpl@6be832b._internal@6be832b
+//
+template<typename T1, typename T2>
+static bool EqualsIgnoringPrivateKey(const String& str1,
+ const String& str2) {
+ intptr_t len = str1.Length();
+ intptr_t str2_len = str2.Length();
+ if (len == str2_len) {
+ for (intptr_t i = 0; i < len; i++) {
+ if (T1::CharAt(str1, i) != T2::CharAt(str2, i)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ if (len < str2_len) {
+ return false; // No way they can match.
+ }
+ intptr_t pos = 0;
+ intptr_t str2_pos = 0;
+ while (pos < len) {
+ int32_t ch = T1::CharAt(str1, pos);
+ pos++;
+
+ if (ch == Scanner::kPrivateKeySeparator) {
+ // Consume a private key separator.
+ while ((pos < len) && (T1::CharAt(str1, pos) != '.')) {
+ pos++;
+ }
+ // Resume matching characters.
+ continue;
+ }
+ if ((str2_pos == str2_len) || (ch != T2::CharAt(str2, str2_pos))) {
+ return false;
+ }
+ str2_pos++;
+ }
+
+ // We have reached the end of mangled_name string.
+ ASSERT(pos == len);
+ return (str2_pos == str2_len);
+}
+
+
+#define EQUALS_IGNORING_PRIVATE_KEY(class_id, type, str1, str2) \
+ switch (class_id) { \
+ case kOneByteStringCid : \
+ return dart::EqualsIgnoringPrivateKey<type, OneByteString>(str1, str2); \
+ case kTwoByteStringCid : \
+ return dart::EqualsIgnoringPrivateKey<type, TwoByteString>(str1, str2); \
+ case kExternalOneByteStringCid : \
+ return dart::EqualsIgnoringPrivateKey<type, ExternalOneByteString>(str1, \
+ str2);\
+ case kExternalTwoByteStringCid : \
+ return dart::EqualsIgnoringPrivateKey<type, ExternalTwoByteString>(str1, \
+ str2);\
+ } \
+ UNREACHABLE(); \
+
+
+bool String::EqualsIgnoringPrivateKey(const String& str1,
+ const String& str2) {
+ if (str1.raw() == str2.raw()) {
+ return true; // Both handles point to the same raw instance.
+ }
+ NoGCScope no_gc;
+ intptr_t str1_class_id = str1.raw()->GetClassId();
+ intptr_t str2_class_id = str2.raw()->GetClassId();
+ switch (str1_class_id) {
+ case kOneByteStringCid :
+ EQUALS_IGNORING_PRIVATE_KEY(str2_class_id, OneByteString, str1, str2);
+ break;
+ case kTwoByteStringCid :
+ EQUALS_IGNORING_PRIVATE_KEY(str2_class_id, TwoByteString, str1, str2);
+ break;
+ case kExternalOneByteStringCid :
+ EQUALS_IGNORING_PRIVATE_KEY(str2_class_id,
+ ExternalOneByteString, str1, str2);
+ break;
+ case kExternalTwoByteStringCid :
+ EQUALS_IGNORING_PRIVATE_KEY(str2_class_id,
+ ExternalTwoByteString, str1, str2);
+ break;
+ }
+ UNREACHABLE();
+ return false;
+}
+
+
bool String::CodePointIterator::Next() {
ASSERT(index_ >= -1);
intptr_t length = Utf16::Length(ch_);
@@ -11010,63 +11102,6 @@
}
-// Check to see if 'str1' matches 'str2' as is or
-// once the private key separator is stripped from str2.
-//
-// Things are made more complicated by the fact that constructors are
-// added *after* the private suffix, so "foo@123.named" should match
-// "foo.named".
-//
-// Also, the private suffix can occur more than once in the name, as in:
-//
-// _ReceivePortImpl@6be832b._internal@6be832b
-//
-bool OneByteString::EqualsIgnoringPrivateKey(const String& str1,
- const String& str2) {
- ASSERT(str2.IsOneByteString());
- if (str1.raw() == str2.raw()) {
- return true; // Both handles point to the same raw instance.
- }
- NoGCScope no_gc;
- intptr_t len = str1.Length();
- intptr_t str2_len = str2.Length();
- if (len == str2_len) {
- for (intptr_t i = 0; i < len; i++) {
- if (*CharAddr(str1, i) != *CharAddr(str2, i)) {
- return false;
- }
- }
- return true;
- }
- if (len < str2_len) {
- return false; // No way they can match.
- }
- intptr_t pos = 0;
- intptr_t str2_pos = 0;
- while (pos < len) {
- int32_t ch = *CharAddr(str1, pos);
- pos++;
-
- if (ch == Scanner::kPrivateKeySeparator) {
- // Consume a private key separator.
- while ((pos < len) && (*CharAddr(str1, pos) != '.')) {
- pos++;
- }
- // Resume matching characters.
- continue;
- }
- if ((str2_pos == str2_len) || (ch != *CharAddr(str2, str2_pos))) {
- return false;
- }
- str2_pos++;
- }
-
- // We have reached the end of mangled_name string.
- ASSERT(pos == len);
- return (str2_pos == str2_len);
-}
-
-
RawOneByteString* OneByteString::New(intptr_t len,
Heap::Space space) {
ASSERT(Isolate::Current() == Dart::vm_isolate() ||
« no previous file with comments | « vm/object.h ('k') | vm/object_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698