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

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

Issue 1405253004: Precompilation: Including generative constructor entry points should mark a class as instantiated. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 2 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
« no previous file with comments | « runtime/vm/precompiler.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, 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/precompiler.h" 5 #include "vm/precompiler.h"
6 6
7 #include "vm/code_patcher.h" 7 #include "vm/code_patcher.h"
8 #include "vm/compiler.h" 8 #include "vm/compiler.h"
9 #include "vm/isolate.h" 9 #include "vm/isolate.h"
10 #include "vm/log.h" 10 #include "vm/log.h"
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 kCapabilityCid, 179 kCapabilityCid,
180 ReceivePort::kClassId, 180 ReceivePort::kClassId,
181 SendPort::kClassId, 181 SendPort::kClassId,
182 182
183 kIllegalCid 183 kIllegalCid
184 }; 184 };
185 185
186 Class& cls = Class::Handle(Z); 186 Class& cls = Class::Handle(Z);
187 for (intptr_t i = 0; kExternallyAllocatedCids[i] != kIllegalCid; i++) { 187 for (intptr_t i = 0; kExternallyAllocatedCids[i] != kIllegalCid; i++) {
188 cls = isolate()->class_table()->At(kExternallyAllocatedCids[i]); 188 cls = isolate()->class_table()->At(kExternallyAllocatedCids[i]);
189 AddClass(cls); 189 AddInstantiatedClass(cls);
190 } 190 }
191 191
192 Dart_QualifiedFunctionName vm_entry_points[] = { 192 Dart_QualifiedFunctionName vm_entry_points[] = {
193 { "dart:async", "::", "_setScheduleImmediateClosure" }, 193 { "dart:async", "::", "_setScheduleImmediateClosure" },
194 { "dart:core", "::", "_completeDeferredLoads"}, 194 { "dart:core", "::", "_completeDeferredLoads"},
195 { "dart:core", "AbstractClassInstantiationError", 195 { "dart:core", "AbstractClassInstantiationError",
196 "AbstractClassInstantiationError._create" }, 196 "AbstractClassInstantiationError._create" },
197 { "dart:core", "ArgumentError", "ArgumentError." }, 197 { "dart:core", "ArgumentError", "ArgumentError." },
198 { "dart:core", "AssertionError", "AssertionError." }, 198 { "dart:core", "AssertionError", "AssertionError." },
199 { "dart:core", "CyclicInitializationError", 199 { "dart:core", "CyclicInitializationError",
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 if (FLAG_trace_precompiler) { 275 if (FLAG_trace_precompiler) {
276 THR_Print("WARNING: Missing %s %s %s\n", 276 THR_Print("WARNING: Missing %s %s %s\n",
277 entry_points[i].library_uri, 277 entry_points[i].library_uri,
278 entry_points[i].class_name, 278 entry_points[i].class_name,
279 entry_points[i].function_name); 279 entry_points[i].function_name);
280 } 280 }
281 continue; 281 continue;
282 } 282 }
283 283
284 AddFunction(func); 284 AddFunction(func);
285 if (func.IsGenerativeConstructor()) {
286 // Allocation stubs are referenced from the call site of the constructor,
287 // not in the constructor itself. So compiling the constructor isn't
288 // enough for us to discover the class is instantiated if the class isn't
289 // otherwise instantiated from Dart code and only instantiated from C++.
290 AddInstantiatedClass(cls);
291 }
285 } 292 }
286 } 293 }
287 294
288 295
289 void Precompiler::Iterate() { 296 void Precompiler::Iterate() {
290 Function& function = Function::Handle(Z); 297 Function& function = Function::Handle(Z);
291 298
292 while (changed_) { 299 while (changed_) {
293 changed_ = false; 300 changed_ = false;
294 301
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 instance ^= entry.raw(); 395 instance ^= entry.raw();
389 AddConstObject(instance); 396 AddConstObject(instance);
390 } else if (entry.IsFunction()) { 397 } else if (entry.IsFunction()) {
391 // Local closure function. 398 // Local closure function.
392 target ^= entry.raw(); 399 target ^= entry.raw();
393 AddFunction(target); 400 AddFunction(target);
394 } else if (entry.IsCode()) { 401 } else if (entry.IsCode()) {
395 target_code ^= entry.raw(); 402 target_code ^= entry.raw();
396 if (target_code.IsAllocationStubCode()) { 403 if (target_code.IsAllocationStubCode()) {
397 cls ^= target_code.owner(); 404 cls ^= target_code.owner();
398 AddClass(cls); 405 AddInstantiatedClass(cls);
399 } 406 }
400 } 407 }
401 } 408 }
402 } 409 }
403 } 410 }
404 411
405 412
406 void Precompiler::AddConstObject(const Instance& instance) { 413 void Precompiler::AddConstObject(const Instance& instance) {
407 const Class& cls = Class::Handle(Z, instance.clazz()); 414 const Class& cls = Class::Handle(Z, instance.clazz());
408 AddClass(cls); 415 AddInstantiatedClass(cls);
409 416
410 if (instance.IsClosure()) { 417 if (instance.IsClosure()) {
411 // An implicit static closure. 418 // An implicit static closure.
412 const Function& func = Function::Handle(Z, Closure::function(instance)); 419 const Function& func = Function::Handle(Z, Closure::function(instance));
413 ASSERT(func.is_static()); 420 ASSERT(func.is_static());
414 AddFunction(func); 421 AddFunction(func);
415 return; 422 return;
416 } 423 }
417 424
418 // Can't ask immediate objects if they're canoncial. 425 // Can't ask immediate objects if they're canoncial.
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
523 530
524 if (FLAG_trace_precompiler) { 531 if (FLAG_trace_precompiler) {
525 THR_Print("Enqueueing selector %" Pd " %s\n", 532 THR_Print("Enqueueing selector %" Pd " %s\n",
526 selector_count_, 533 selector_count_,
527 selector.ToCString()); 534 selector.ToCString());
528 } 535 }
529 } 536 }
530 } 537 }
531 538
532 539
533 void Precompiler::AddClass(const Class& cls) { 540 void Precompiler::AddInstantiatedClass(const Class& cls) {
534 if (cls.is_allocated()) return; 541 if (cls.is_allocated()) return;
535 542
536 class_count_++; 543 class_count_++;
537 cls.set_is_allocated(); 544 cls.set_is_allocated();
538 changed_ = true; 545 changed_ = true;
539 546
540 if (FLAG_trace_precompiler) { 547 if (FLAG_trace_precompiler) {
541 THR_Print("Allocation %" Pd " %s\n", class_count_, cls.ToCString()); 548 THR_Print("Allocation %" Pd " %s\n", class_count_, cls.ToCString());
542 } 549 }
543 550
544 const Class& superclass = Class::Handle(cls.SuperClass()); 551 const Class& superclass = Class::Handle(cls.SuperClass());
545 if (!superclass.IsNull()) { 552 if (!superclass.IsNull()) {
546 AddClass(superclass); 553 AddInstantiatedClass(superclass);
547 } 554 }
548 } 555 }
549 556
550 557
551 void Precompiler::CheckForNewDynamicFunctions() { 558 void Precompiler::CheckForNewDynamicFunctions() {
552 Library& lib = Library::Handle(Z); 559 Library& lib = Library::Handle(Z);
553 Class& cls = Class::Handle(Z); 560 Class& cls = Class::Handle(Z);
554 Array& functions = Array::Handle(Z); 561 Array& functions = Array::Handle(Z);
555 Function& function = Function::Handle(Z); 562 Function& function = Function::Handle(Z);
556 Function& function2 = Function::Handle(Z); 563 Function& function2 = Function::Handle(Z);
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
866 continue; // class 'dynamic' is in the read-only VM isolate. 873 continue; // class 'dynamic' is in the read-only VM isolate.
867 } 874 }
868 cls.EnsureIsFinalized(T); 875 cls.EnsureIsFinalized(T);
869 } 876 }
870 } 877 }
871 I->set_all_classes_finalized(true); 878 I->set_all_classes_finalized(true);
872 } 879 }
873 880
874 881
875 } // namespace dart 882 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/precompiler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698