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

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

Issue 2853423002: Move the Kernel canonical name table into the VM's heap (Closed)
Patch Set: Merge a bugfix Created 3 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 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 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 53
54 CacheConstantValue(offset, result_); 54 CacheConstantValue(offset, result_);
55 } 55 }
56 // We return a new `ZoneHandle` here on purpose: The intermediate language 56 // We return a new `ZoneHandle` here on purpose: The intermediate language
57 // instructions do not make a copy of the handle, so we do it. 57 // instructions do not make a copy of the handle, so we do it.
58 return dart::Instance::ZoneHandle(Z, result_.raw()); 58 return dart::Instance::ZoneHandle(Z, result_.raw());
59 } 59 }
60 60
61 void StreamingConstantEvaluator::EvaluateStaticGet() { 61 void StreamingConstantEvaluator::EvaluateStaticGet() {
62 builder_->ReadPosition(); 62 builder_->ReadPosition();
63 int canonical_name_index = builder_->ReadUInt(); 63 intptr_t target = builder_->ReadUInt() - 1;
Vyacheslav Egorov (Google) 2017/05/03 06:28:48 might be worth having a helper called ReadCanonica
64 CanonicalName* target = builder_->GetCanonicalName(canonical_name_index);
65 64
66 if (H.IsField(target)) { 65 if (H.IsField(target)) {
67 const dart::Field& field = 66 const dart::Field& field =
68 dart::Field::Handle(Z, H.LookupFieldByKernelField(target)); 67 dart::Field::Handle(Z, H.LookupFieldByKernelField(target));
69 if (field.StaticValue() == Object::sentinel().raw() || 68 if (field.StaticValue() == Object::sentinel().raw() ||
70 field.StaticValue() == Object::transition_sentinel().raw()) { 69 field.StaticValue() == Object::transition_sentinel().raw()) {
71 field.EvaluateInitializer(); 70 field.EvaluateInitializer();
72 result_ = field.StaticValue(); 71 result_ = field.StaticValue();
73 result_ = H.Canonicalize(result_); 72 result_ = H.Canonicalize(result_);
74 field.SetStaticValue(result_, true); 73 field.SetStaticValue(result_, true);
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 case kNullLiteral: 303 case kNullLiteral:
305 return BuildNullLiteral(); 304 return BuildNullLiteral();
306 default: 305 default:
307 UNREACHABLE(); 306 UNREACHABLE();
308 } 307 }
309 308
310 return Fragment(); 309 return Fragment();
311 } 310 }
312 311
313 312
314 CanonicalName* StreamingFlowGraphBuilder::GetCanonicalName(intptr_t index) {
315 if (index == 0) return NULL;
316 --index;
317
318 if (canonical_names_ != NULL && canonical_names_entries_read_ > index) {
319 return canonical_names_[index];
320 }
321
322 intptr_t saved_offset = ReaderOffset();
323 if (canonical_names_ == NULL) {
324 // Find offset from where to read canonical names table.
325
326 // Skip the magic number.
327 reader_->set_offset(4);
328
329 // Skip the string table. The last offset is the end offset of the last
330 // string which gives the length of the string data.
331 intptr_t list_length = ReadListLength();
332 intptr_t end_offset = 0;
333 for (intptr_t i = 0; i < list_length; ++i) {
334 end_offset = ReadUInt();
335 }
336 SkipBytes(end_offset);
337
338 // There is another string table for the source URIs. Skip it as well.
339 list_length = ReadListLength();
340 end_offset = 0;
341 for (intptr_t i = 0; i < list_length; ++i) {
342 end_offset = ReadUInt();
343 }
344 SkipBytes(end_offset);
345
346 // Source code table
347 for (intptr_t i = 0; i < list_length; ++i) {
348 // Source code
349 intptr_t bytes = ReadUInt();
350 SkipBytes(bytes);
351
352 // Line starts table
353 intptr_t line_count = ReadUInt();
354 for (intptr_t j = 0; j < line_count; ++j) {
355 ReadUInt();
356 }
357 }
358
359 // Now at canonical names table.
360 canonical_names_size_ = ReadUInt();
361 canonical_names_ = new CanonicalName*[canonical_names_size_];
362 canonical_names_next_offset_ = ReaderOffset();
363 }
364
365 SetOffset(canonical_names_next_offset_);
366 for (; canonical_names_entries_read_ <= index;
367 ++canonical_names_entries_read_) {
368 intptr_t biased_parent_index = ReadUInt();
369 CanonicalName* parent;
370 if (biased_parent_index != 0) {
371 parent = canonical_names_[biased_parent_index - 1];
372 } else {
373 if (canonical_names_entries_read_ == 0) {
374 parent = CanonicalName::NewRoot();
375 } else {
376 parent = canonical_names_[0]->parent();
377 }
378 }
379 ASSERT(parent != NULL);
380 intptr_t name_index = ReadUInt();
381 CanonicalName* canonical_name = parent->AddChild(name_index);
382 canonical_names_[canonical_names_entries_read_] = canonical_name;
383 }
384
385 canonical_names_next_offset_ = ReaderOffset();
386
387 SetOffset(saved_offset);
388 return canonical_names_[index];
389 }
390
391
392 intptr_t StreamingFlowGraphBuilder::ReaderOffset() { 313 intptr_t StreamingFlowGraphBuilder::ReaderOffset() {
393 return reader_->offset(); 314 return reader_->offset();
394 } 315 }
395 316
396 317
397 void StreamingFlowGraphBuilder::SetOffset(intptr_t offset) { 318 void StreamingFlowGraphBuilder::SetOffset(intptr_t offset) {
398 reader_->set_offset(offset); 319 reader_->set_offset(offset);
399 } 320 }
400 321
401 322
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 // The frontend will take care of emitting normal errors (like 412 // The frontend will take care of emitting normal errors (like
492 // [NoSuchMethodError]s) and only emit [InvalidExpression]s in very special 413 // [NoSuchMethodError]s) and only emit [InvalidExpression]s in very special
493 // situations (e.g. an invalid annotation). 414 // situations (e.g. an invalid annotation).
494 return ThrowNoSuchMethodError(); 415 return ThrowNoSuchMethodError();
495 } 416 }
496 417
497 418
498 Fragment StreamingFlowGraphBuilder::BuildStaticGet() { 419 Fragment StreamingFlowGraphBuilder::BuildStaticGet() {
499 intptr_t saved_offset = ReaderOffset() - 1; // Include the tag. 420 intptr_t saved_offset = ReaderOffset() - 1; // Include the tag.
500 TokenPosition position = ReadPosition(); 421 TokenPosition position = ReadPosition();
501 int canonical_name_index = ReadUInt(); 422 intptr_t target = ReadUInt() - 1;
Vyacheslav Egorov (Google) 2017/05/03 06:28:48 ditto
502 CanonicalName* target = GetCanonicalName(canonical_name_index);
503 423
504 if (H.IsField(target)) { 424 if (H.IsField(target)) {
505 const dart::Field& field = 425 const dart::Field& field =
506 dart::Field::ZoneHandle(Z, H.LookupFieldByKernelField(target)); 426 dart::Field::ZoneHandle(Z, H.LookupFieldByKernelField(target));
507 if (field.is_const()) { 427 if (field.is_const()) {
508 SetOffset(saved_offset); // EvaluateExpression needs the tag. 428 SetOffset(saved_offset); // EvaluateExpression needs the tag.
509 return Constant(constant_evaluator_.EvaluateExpression()); 429 return Constant(constant_evaluator_.EvaluateExpression());
510 } else { 430 } else {
511 const dart::Class& owner = dart::Class::Handle(Z, field.Owner()); 431 const dart::Class& owner = dart::Class::Handle(Z, field.Owner());
512 const dart::String& getter_name = H.DartGetterName(target); 432 const dart::String& getter_name = H.DartGetterName(target);
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
598 518
599 Fragment StreamingFlowGraphBuilder::BuildNullLiteral() { 519 Fragment StreamingFlowGraphBuilder::BuildNullLiteral() {
600 return Constant(Instance::ZoneHandle(Z, Instance::null())); 520 return Constant(Instance::ZoneHandle(Z, Instance::null()));
601 } 521 }
602 522
603 523
604 } // namespace kernel 524 } // namespace kernel
605 } // namespace dart 525 } // namespace dart
606 526
607 #endif // !defined(DART_PRECOMPILED_RUNTIME) 527 #endif // !defined(DART_PRECOMPILED_RUNTIME)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698