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

Side by Side Diff: runtime/vm/kernel_binary_flowgraph.cc

Issue 2790073004: Restructure the Kernel string table. (Closed)
Patch Set: Created 3 years, 8 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 #include "vm/kernel_binary_flowgraph.h" 5 #include "vm/kernel_binary_flowgraph.h"
6 6
7 #include "vm/object_store.h" 7 #include "vm/object_store.h"
8 8
9 #if !defined(DART_PRECOMPILED_RUNTIME) 9 #if !defined(DART_PRECOMPILED_RUNTIME)
10 10
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 return BuildBoolLiteral(false); 300 return BuildBoolLiteral(false);
301 case kNullLiteral: 301 case kNullLiteral:
302 return BuildNullLiteral(); 302 return BuildNullLiteral();
303 default: 303 default:
304 UNREACHABLE(); 304 UNREACHABLE();
305 } 305 }
306 306
307 return Fragment(); 307 return Fragment();
308 } 308 }
309 309
310 intptr_t StreamingFlowGraphBuilder::GetStringTableOffset(intptr_t index) { 310 intptr_t StreamingFlowGraphBuilder::GetStringOffset(intptr_t index) {
311 if (string_table_offsets_ != NULL && string_table_entries_read_ > index) { 311 if (string_offsets_ == NULL) {
312 return string_table_offsets_[index]; 312 intptr_t saved_offset = ReaderOffset();
313 reader_->set_offset(4); // Skip kMagicProgramFile to the string table.
314 string_offset_count_ = ReadListLength() + 1;
315 string_offsets_ = new intptr_t[string_offset_count_];
316
317 // Build a table of the 0-based string start and end offsets.
318 string_offsets_[0] = 0;
319 for (intptr_t i = 1; i < string_offset_count_; ++i) {
320 string_offsets_[i] = ReadUInt();
321 }
322 // And adjust the offsets now that we know the start offset of the first
323 // string relative to the start of the binary.
324 intptr_t base = ReaderOffset();
jensj 2017/04/04 09:42:16 One could also save the base as a class variable a
325 for (intptr_t i = 0; i < string_offset_count_; ++i) {
326 string_offsets_[i] += base;
327 }
328
329 SetOffset(saved_offset);
313 } 330 }
314 331 return string_offsets_[index];
315 intptr_t saved_offset = ReaderOffset();
316 if (string_table_offsets_ == NULL) {
317 reader_->set_offset(4); // Skip kMagicProgramFile - now at string table.
318 string_table_size_ = ReadListLength();
319 string_table_offsets_ = new intptr_t[string_table_size_];
320 string_table_offsets_[0] = ReaderOffset();
321 string_table_entries_read_ = 1;
322 }
323
324 ASSERT(string_table_size_ > index);
325 --string_table_entries_read_;
326 reader_->set_offset(string_table_offsets_[string_table_entries_read_]);
327 for (; string_table_entries_read_ < index; ++string_table_entries_read_) {
328 string_table_offsets_[string_table_entries_read_] = ReaderOffset();
329 uint32_t bytes = ReadUInt();
330 SkipBytes(bytes);
331 }
332 string_table_offsets_[string_table_entries_read_] = ReaderOffset();
333 ++string_table_entries_read_;
334
335 SetOffset(saved_offset);
336 return string_table_offsets_[index];
337 } 332 }
338 333
339 CanonicalName* StreamingFlowGraphBuilder::GetCanonicalName(intptr_t index) { 334 CanonicalName* StreamingFlowGraphBuilder::GetCanonicalName(intptr_t index) {
340 if (index == 0) return NULL; 335 if (index == 0) return NULL;
341 --index; 336 --index;
342 337
343 if (canonical_names_ != NULL && canonical_names_entries_read_ > index) { 338 if (canonical_names_ != NULL && canonical_names_entries_read_ > index) {
344 return canonical_names_[index]; 339 return canonical_names_[index];
345 } 340 }
346 341
347 intptr_t saved_offset = ReaderOffset(); 342 intptr_t saved_offset = ReaderOffset();
348 if (canonical_names_ == NULL) { 343 if (canonical_names_ == NULL) {
349 // Find offset from where to read canonical names table. 344 // Find offset from where to read canonical names table.
350 345
351 // First skip the string table: 346 // First skip the string table. The last offset is the end offset of the
352 // Get first string to make sure we have the table size, get last string and 347 // last string.
353 // read it to get past the string table. 348 if (string_offsets_ == NULL) {
354 // Note that this will also cache all string positions. 349 // Ensure that the length and all the offsets are available.
355 GetStringTableOffset(0); 350 GetStringOffset(0);
356 SetOffset(GetStringTableOffset(string_table_size_ - 1)); 351 }
357 uint32_t bytes = ReadUInt(); 352 SetOffset(GetStringOffset(string_offset_count_ - 1));
358 SkipBytes(bytes);
359 353
360 // Another string table (source URIs) 354 // There is another string table for the source URIs. Skip it as well.
361 intptr_t list_length = ReadListLength(); 355 intptr_t list_length = ReadListLength();
356 intptr_t end_offset = 0;
362 for (intptr_t i = 0; i < list_length; ++i) { 357 for (intptr_t i = 0; i < list_length; ++i) {
363 uint32_t bytes = ReadUInt(); 358 end_offset = ReadUInt();
jensj 2017/04/04 09:42:16 Should this be "+=", or should the SkipBytes be ca
jensj 2017/04/04 09:52:59 Ignore that comment... The string table starts wit
364 SkipBytes(bytes);
365 } 359 }
360 SkipBytes(end_offset);
366 361
367 // Source code table 362 // Source code table
368 for (intptr_t i = 0; i < list_length; ++i) { 363 for (intptr_t i = 0; i < list_length; ++i) {
369 // Source code 364 // Source code
370 intptr_t bytes = ReadUInt(); 365 intptr_t bytes = ReadUInt();
371 SkipBytes(bytes); 366 SkipBytes(bytes);
372 367
373 // Line starts table 368 // Line starts table
374 intptr_t line_count = ReadUInt(); 369 intptr_t line_count = ReadUInt();
375 for (intptr_t j = 0; j < line_count; ++j) { 370 for (intptr_t j = 0; j < line_count; ++j) {
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 } 438 }
444 439
445 ScopeBuildingResult* StreamingFlowGraphBuilder::scopes() { 440 ScopeBuildingResult* StreamingFlowGraphBuilder::scopes() {
446 return flow_graph_builder_->scopes_; 441 return flow_graph_builder_->scopes_;
447 } 442 }
448 443
449 ParsedFunction* StreamingFlowGraphBuilder::parsed_function() { 444 ParsedFunction* StreamingFlowGraphBuilder::parsed_function() {
450 return flow_graph_builder_->parsed_function_; 445 return flow_graph_builder_->parsed_function_;
451 } 446 }
452 447
453 dart::String& StreamingFlowGraphBuilder::DartSymbol(intptr_t str_index) { 448 dart::String& StreamingFlowGraphBuilder::DartSymbol(intptr_t index) {
454 intptr_t saved_offset = ReaderOffset(); 449 intptr_t start = GetStringOffset(index);
455 450 intptr_t end = GetStringOffset(index + 1);
456 SetOffset(GetStringTableOffset(str_index)); 451 return H.DartSymbol(reader_->buffer() + start, end - start);
457 uint32_t bytes = ReadUInt();
458 const uint8_t* data = &reader_->buffer()[ReaderOffset()];
459
460 SetOffset(saved_offset);
461 return H.DartSymbol(data, bytes);
462 } 452 }
463 453
464 dart::String& StreamingFlowGraphBuilder::DartString(intptr_t str_index) { 454 dart::String& StreamingFlowGraphBuilder::DartString(intptr_t index) {
465 intptr_t saved_offset = ReaderOffset(); 455 intptr_t start = GetStringOffset(index);
466 456 intptr_t end = GetStringOffset(index + 1);
467 SetOffset(GetStringTableOffset(str_index)); 457 return H.DartString(reader_->buffer() + start, end - start);
468 uint32_t bytes = ReadUInt();
469 const uint8_t* data = &reader_->buffer()[ReaderOffset()];
470
471 SetOffset(saved_offset);
472 return H.DartString(data, bytes);
473 } 458 }
474 459
475 String* StreamingFlowGraphBuilder::KernelString(intptr_t str_index) { 460 String* StreamingFlowGraphBuilder::KernelString(intptr_t index) {
476 intptr_t savedOffset = ReaderOffset(); 461 intptr_t start = GetStringOffset(index);
477 462 intptr_t end = GetStringOffset(index + 1);
478 SetOffset(GetStringTableOffset(str_index)); 463 return new String(reader_->buffer() + start, end - start);
479 uint32_t bytes = ReadUInt();
480 const uint8_t* data = &reader_->buffer()[ReaderOffset()];
481
482 SetOffset(savedOffset);
483 return new String(data, bytes);
484 } 464 }
485 465
486 Fragment StreamingFlowGraphBuilder::DebugStepCheck(TokenPosition position) { 466 Fragment StreamingFlowGraphBuilder::DebugStepCheck(TokenPosition position) {
487 return flow_graph_builder_->DebugStepCheck(position); 467 return flow_graph_builder_->DebugStepCheck(position);
488 } 468 }
489 469
490 Fragment StreamingFlowGraphBuilder::LoadLocal(LocalVariable* variable) { 470 Fragment StreamingFlowGraphBuilder::LoadLocal(LocalVariable* variable) {
491 return flow_graph_builder_->LoadLocal(variable); 471 return flow_graph_builder_->LoadLocal(variable);
492 } 472 }
493 473
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
621 } 601 }
622 602
623 Fragment StreamingFlowGraphBuilder::BuildNullLiteral() { 603 Fragment StreamingFlowGraphBuilder::BuildNullLiteral() {
624 return Constant(Instance::ZoneHandle(Z, Instance::null())); 604 return Constant(Instance::ZoneHandle(Z, Instance::null()));
625 } 605 }
626 606
627 } // namespace kernel 607 } // namespace kernel
628 } // namespace dart 608 } // namespace dart
629 609
630 #endif // !defined(DART_PRECOMPILED_RUNTIME) 610 #endif // !defined(DART_PRECOMPILED_RUNTIME)
OLDNEW
« pkg/kernel/lib/binary/ast_from_binary.dart ('K') | « runtime/vm/kernel_binary_flowgraph.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698