Chromium Code Reviews| Index: runtime/vm/object.cc |
| =================================================================== |
| --- runtime/vm/object.cc (revision 32509) |
| +++ runtime/vm/object.cc (working copy) |
| @@ -6720,12 +6720,12 @@ |
| } |
| } else if (curr == Token::kINTERPOL_VAR) { |
| literals.Add(Symbols::Dollar()); |
| - if (literal.CharAt(0) == Scanner::kPrivateIdentifierStart) { |
| + if (literal.CharAt(0) == Library::kPrivateIdentifierStart) { |
| literal = String::SubString(literal, 0, literal.Length() - private_len); |
| } |
| literals.Add(literal); |
| } else if (curr == Token::kIDENT) { |
| - if (literal.CharAt(0) == Scanner::kPrivateIdentifierStart) { |
| + if (literal.CharAt(0) == Library::kPrivateIdentifierStart) { |
| literal = String::SubString(literal, 0, literal.Length() - private_len); |
| } |
| literals.Add(literal); |
| @@ -7848,6 +7848,7 @@ |
| if (!FLAG_use_lib_cache) { |
| return; |
| } |
| + ASSERT(!Field::IsGetterName(name) && !Field::IsSetterName(name)); |
|
hausner
2014/02/10 21:07:35
Unrelated but on purpose.
|
| const Array& cache = Array::Handle(resolved_names()); |
| // let N = cache.Length(); |
| // The entry cache[N-1] is used as a counter |
| @@ -8435,7 +8436,6 @@ |
| const Library& result = Library::Handle(Library::New()); |
| result.StorePointer(&result.raw_ptr()->name_, Symbols::Empty().raw()); |
| result.StorePointer(&result.raw_ptr()->url_, url.raw()); |
| - result.raw_ptr()->private_key_ = Scanner::AllocatePrivateKey(result); |
| result.raw_ptr()->resolved_names_ = Object::empty_array().raw(); |
| result.raw_ptr()->dictionary_ = Object::empty_array().raw(); |
| result.StorePointer(&result.raw_ptr()->metadata_, |
| @@ -8454,6 +8454,7 @@ |
| result.InitResolvedNamesCache(kInitialNameCacheSize); |
| result.InitClassDictionary(); |
| result.InitImportList(); |
| + result.AllocatePrivateKey(); |
| if (import_core_lib) { |
| const Library& core_lib = Library::Handle(Library::CoreLibrary()); |
| ASSERT(!core_lib.IsNull()); |
| @@ -8550,6 +8551,20 @@ |
| } |
| +bool Library::IsPrivate(const String& name) { |
| + if (ShouldBePrivate(name)) return true; |
| + // Factory names: List._fromLiteral. |
| + for (intptr_t i = 1; i < name.Length() - 1; i++) { |
| + if (name.CharAt(i) == '.') { |
| + if (name.CharAt(i + 1) == '_') { |
| + return true; |
| + } |
| + } |
| + } |
| + return false; |
| +} |
| + |
| + |
| bool Library::IsKeyUsed(intptr_t key) { |
| intptr_t lib_key; |
| const GrowableObjectArray& libs = GrowableObjectArray::Handle( |
| @@ -8568,17 +8583,16 @@ |
| } |
| -bool Library::IsPrivate(const String& name) { |
| - if (ShouldBePrivate(name)) return true; |
| - // Factory names: List._fromLiteral. |
| - for (intptr_t i = 1; i < name.Length() - 1; i++) { |
| - if (name.CharAt(i) == '.') { |
| - if (name.CharAt(i + 1) == '_') { |
| - return true; |
| - } |
| - } |
| +void Library::AllocatePrivateKey() const { |
| + const String& url = String::Handle(this->url()); |
| + intptr_t key_value = url.Hash(); |
| + while (Library::IsKeyUsed(key_value)) { |
| + key_value++; |
| } |
| - return false; |
| + char private_key[32]; |
| + OS::SNPrint(private_key, sizeof(private_key), |
| + "%c%#" Px "", kPrivateKeySeparator, key_value); |
| + StorePointer(&raw_ptr()->private_key_, String::New(private_key, Heap::kOld)); |
| } |
| @@ -8592,7 +8606,7 @@ |
| RawClass* Library::LookupCoreClass(const String& class_name) { |
| const Library& core_lib = Library::Handle(Library::CoreLibrary()); |
| String& name = String::Handle(class_name.raw()); |
| - if (class_name.CharAt(0) == Scanner::kPrivateIdentifierStart) { |
| + if (class_name.CharAt(0) == kPrivateIdentifierStart) { |
| // Private identifiers are mangled on a per library basis. |
| name = String::Concat(name, String::Handle(core_lib.private_key())); |
| name = Symbols::New(name); |
| @@ -15493,7 +15507,7 @@ |
| int32_t ch = T1::CharAt(str1, pos); |
| pos++; |
| - if (ch == Scanner::kPrivateKeySeparator) { |
| + if (ch == Library::kPrivateKeySeparator) { |
| // Consume a private key separator. |
| while ((pos < len) && (T1::CharAt(str1, pos) != '.')) { |
| pos++; |