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

Unified Diff: runtime/vm/symbols.cc

Issue 1123813002: Move symbol table from per isolate snapshot to vm isolate snapshot, this reduces the per isolate in… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 5 years, 7 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 | « runtime/vm/symbols.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/symbols.cc
===================================================================
--- runtime/vm/symbols.cc (revision 45789)
+++ runtime/vm/symbols.cc (working copy)
@@ -39,58 +39,6 @@
DEFINE_FLAG(bool, dump_symbol_stats, false, "Dump symbol table statistics");
-const char* Symbols::Name(SymbolId symbol) {
- ASSERT((symbol > kIllegal) && (symbol < kNullCharId));
- return names[symbol];
-}
-
-
-const String& Symbols::Keyword(Token::Kind keyword) {
- const int kw_index = keyword - Token::kFirstKeyword;
- ASSERT((0 <= kw_index) && (kw_index < Token::kNumKeywords));
- // First keyword symbol is in symbol_handles_[kKwTableStart + 1].
- const intptr_t keyword_id = Symbols::kKwTableStart + 1 + kw_index;
- ASSERT(symbol_handles_[keyword_id] != NULL);
- return *symbol_handles_[keyword_id];
-}
-
-
-void Symbols::InitOnce(Isolate* isolate) {
- // Should only be run by the vm isolate.
- ASSERT(isolate == Dart::vm_isolate());
-
- // Create and setup a symbol table in the vm isolate.
- SetupSymbolTable(isolate);
-
- // Create all predefined symbols.
- ASSERT((sizeof(names) / sizeof(const char*)) == Symbols::kNullCharId);
-
- // Set up all the predefined string symbols and create symbols for language
- // keywords. We don't expect to find any overlaps between the predefined
- // string symbols and the language keywords. If an overlap is introduced
- // inadvertantly the ASSERT in AddToVMIsolate while fail.
- for (intptr_t i = 1; i < Symbols::kNullCharId; i++) {
- String* str = String::ReadOnlyHandle();
- *str = OneByteString::New(names[i], Heap::kOld);
- AddToVMIsolate(*str);
- symbol_handles_[i] = str;
- }
-
- // Add Latin1 characters as Symbols, so that Symbols::FromCharCode is fast.
- for (intptr_t c = 0; c < kNumberOfOneCharCodeSymbols; c++) {
- intptr_t idx = (kNullCharId + c);
- ASSERT(idx < kMaxPredefinedId);
- ASSERT(Utf::IsLatin1(c));
- uint8_t ch = static_cast<uint8_t>(c);
- String* str = String::ReadOnlyHandle();
- *str = OneByteString::New(&ch, 1, Heap::kOld);
- AddToVMIsolate(*str);
- predefined_[c] = str->raw();
- symbol_handles_[idx] = str;
- }
-}
-
-
RawString* StringFrom(const uint8_t* data, intptr_t len, Heap::Space space) {
return String::FromLatin1(data, len, space);
}
@@ -229,6 +177,144 @@
typedef UnorderedHashSet<SymbolTraits> SymbolTable;
+const char* Symbols::Name(SymbolId symbol) {
+ ASSERT((symbol > kIllegal) && (symbol < kNullCharId));
+ return names[symbol];
+}
+
+
+const String& Symbols::Keyword(Token::Kind keyword) {
+ const int kw_index = keyword - Token::kFirstKeyword;
+ ASSERT((0 <= kw_index) && (kw_index < Token::kNumKeywords));
+ // First keyword symbol is in symbol_handles_[kKwTableStart + 1].
+ const intptr_t keyword_id = Symbols::kKwTableStart + 1 + kw_index;
+ ASSERT(symbol_handles_[keyword_id] != NULL);
+ return *symbol_handles_[keyword_id];
+}
+
+
+void Symbols::InitOnce(Isolate* vm_isolate) {
+ // Should only be run by the vm isolate.
+ ASSERT(Isolate::Current() == Dart::vm_isolate());
+ ASSERT(vm_isolate == Dart::vm_isolate());
+
+ // Create and setup a symbol table in the vm isolate.
+ SetupSymbolTable(vm_isolate);
+
+ // Create all predefined symbols.
+ ASSERT((sizeof(names) / sizeof(const char*)) == Symbols::kNullCharId);
+
+ SymbolTable table(vm_isolate, vm_isolate->object_store()->symbol_table());
+
+ // First set up all the predefined string symbols.
+ // Create symbols for language keywords. Some keywords are equal to
+ // symbols we already created, so use New() instead of Add() to ensure
+ // that the symbols are canonicalized.
+ for (intptr_t i = 1; i < Symbols::kNullCharId; i++) {
+ String* str = String::ReadOnlyHandle();
+ *str = OneByteString::New(names[i], Heap::kOld);
+ str->Hash();
+ str->SetCanonical();
+ bool present = table.Insert(*str);
+ ASSERT(!present);
+ symbol_handles_[i] = str;
+ }
+
+ // Add Latin1 characters as Symbols, so that Symbols::FromCharCode is fast.
+ for (intptr_t c = 0; c < kNumberOfOneCharCodeSymbols; c++) {
+ intptr_t idx = (kNullCharId + c);
+ ASSERT(idx < kMaxPredefinedId);
+ ASSERT(Utf::IsLatin1(c));
+ uint8_t ch = static_cast<uint8_t>(c);
+ String* str = String::ReadOnlyHandle();
+ *str = OneByteString::New(&ch, 1, Heap::kOld);
+ str->Hash();
+ str->SetCanonical();
+ bool present = table.Insert(*str);
+ ASSERT(!present);
+ predefined_[c] = str->raw();
+ symbol_handles_[idx] = str;
+ }
+
+ vm_isolate->object_store()->set_symbol_table(table.Release());
+}
+
+
+void Symbols::InitOnceFromSnapshot(Isolate* vm_isolate) {
+ // Should only be run by the vm isolate.
+ ASSERT(Isolate::Current() == Dart::vm_isolate());
+ ASSERT(vm_isolate == Dart::vm_isolate());
+
+ SymbolTable table(vm_isolate, vm_isolate->object_store()->symbol_table());
+
+ // Lookup all the predefined string symbols and language keyword symbols
+ // and cache them in the read only handles for fast access.
+ for (intptr_t i = 1; i < Symbols::kNullCharId; i++) {
+ String* str = String::ReadOnlyHandle();
+ const unsigned char* name =
+ reinterpret_cast<const unsigned char*>(names[i]);
+ *str ^= table.GetOrNull(Latin1Array(name, strlen(names[i])));
+ ASSERT(!str->IsNull());
+ ASSERT(str->HasHash());
+ ASSERT(str->IsCanonical());
+ symbol_handles_[i] = str;
+ }
+
+ // Lookup Latin1 character Symbols and cache them in read only handles,
+ // so that Symbols::FromCharCode is fast.
+ for (intptr_t c = 0; c < kNumberOfOneCharCodeSymbols; c++) {
+ intptr_t idx = (kNullCharId + c);
+ ASSERT(idx < kMaxPredefinedId);
+ ASSERT(Utf::IsLatin1(c));
+ uint8_t ch = static_cast<uint8_t>(c);
+ String* str = String::ReadOnlyHandle();
+ *str ^= table.GetOrNull(Latin1Array(&ch, 1));
+ ASSERT(!str->IsNull());
+ ASSERT(str->HasHash());
+ ASSERT(str->IsCanonical());
+ predefined_[c] = str->raw();
+ symbol_handles_[idx] = str;
+ }
+
+ vm_isolate->object_store()->set_symbol_table(table.Release());
+}
+
+
+void Symbols::AddPredefinedSymbolsToIsolate() {
+ // Should only be run by regular Dart isolates.
+ Isolate* isolate = Isolate::Current();
+ ASSERT(isolate != Dart::vm_isolate());
+ String& str = String::Handle(isolate);
+
+ SymbolTable table(isolate, isolate->object_store()->symbol_table());
+
+ // Set up all the predefined string symbols and create symbols for
+ // language keywords.
+ for (intptr_t i = 1; i < Symbols::kNullCharId; i++) {
+ str = OneByteString::New(names[i], Heap::kOld);
+ str.Hash();
+ str.SetCanonical();
+ bool present = table.Insert(str);
+ ASSERT(!present);
+ }
+
+ // Add Latin1 characters as Symbols, so that Symbols::FromCharCode is fast.
+ for (intptr_t c = 0; c < kNumberOfOneCharCodeSymbols; c++) {
+ intptr_t idx = (kNullCharId + c);
+ ASSERT(idx < kMaxPredefinedId);
+ ASSERT(Utf::IsLatin1(c));
+ uint8_t ch = static_cast<uint8_t>(c);
+ str = OneByteString::New(&ch, 1, Heap::kOld);
+ str.Hash();
+ str.SetCanonical();
+ bool present = table.Insert(str);
+ ASSERT(!present);
+ }
+
+ isolate->object_store()->set_symbol_table(table.Release());
+}
+
+
void Symbols::SetupSymbolTable(Isolate* isolate) {
ASSERT(isolate != NULL);
@@ -250,18 +336,6 @@
}
-void Symbols::AddToVMIsolate(const String& str) {
- // Should only be run by the vm isolate.
- ASSERT(Isolate::Current() == Dart::vm_isolate());
- Isolate* isolate = Dart::vm_isolate();
- SymbolTable table(isolate, isolate->object_store()->symbol_table());
- bool present = table.Insert(str);
- str.SetCanonical();
- ASSERT(!present);
- isolate->object_store()->set_symbol_table(table.Release());
-}
-
-
RawString* Symbols::New(const char* cstr, intptr_t len) {
ASSERT((cstr != NULL) && (len >= 0));
const uint8_t* utf8_array = reinterpret_cast<const uint8_t*>(cstr);
« no previous file with comments | « runtime/vm/symbols.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698