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

Side by Side Diff: vm/object.cc

Issue 10834284: - Split Dart core libraries into shared sources and patch sources. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: Created 8 years, 4 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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/object.h" 5 #include "vm/object.h"
6 6
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/assembler.h" 9 #include "vm/assembler.h"
10 #include "vm/bigint_operations.h" 10 #include "vm/bigint_operations.h"
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after
423 const String& name = String::Handle(Symbols::New(cname)); 423 const String& name = String::Handle(Symbols::New(cname));
424 const Class& cls = Class::Handle( 424 const Class& cls = Class::Handle(
425 Class::NewInterface(name, script, Scanner::kDummyTokenIndex)); 425 Class::NewInterface(name, script, Scanner::kDummyTokenIndex));
426 lib.AddClass(cls); 426 lib.AddClass(cls);
427 return cls.raw(); 427 return cls.raw();
428 } 428 }
429 429
430 430
431 void Object::RegisterClass(const Class& cls, 431 void Object::RegisterClass(const Class& cls,
432 const char* cname, 432 const char* cname,
433 const Script& script,
434 const Library& lib) { 433 const Library& lib) {
435 const String& name = String::Handle(Symbols::New(cname)); 434 const String& name = String::Handle(Symbols::New(cname));
436 cls.set_name(name); 435 cls.set_name(name);
437 cls.set_script(script);
438 lib.AddClass(cls); 436 lib.AddClass(cls);
439 } 437 }
440 438
441 439
442 void Object::RegisterPrivateClass(const Class& cls, 440 void Object::RegisterPrivateClass(const Class& cls,
443 const char* public_class_name, 441 const char* public_class_name,
444 const Script& script, 442 const Script& script,
445 const Library& lib) { 443 const Library& lib) {
446 String& str = String::Handle(); 444 String& str = String::Handle();
447 str = Symbols::New(public_class_name); 445 str = Symbols::New(public_class_name);
448 str = lib.PrivateName(str); 446 str = lib.PrivateName(str);
449 cls.set_name(str); 447 cls.set_name(str);
450 cls.set_script(script); 448 cls.set_script(script);
siva 2012/08/13 18:46:12 Why is it ok to set the script here in the case of
Ivan Posva 2012/08/13 23:01:17 Done.
451 lib.AddClass(cls); 449 lib.AddClass(cls);
452 } 450 }
453 451
454 452
455 RawError* Object::Init(Isolate* isolate) { 453 RawError* Object::Init(Isolate* isolate) {
456 TIMERSCOPE(time_bootstrap); 454 TIMERSCOPE(time_bootstrap);
457 ObjectStore* object_store = isolate->object_store(); 455 ObjectStore* object_store = isolate->object_store();
458 456
459 Class& cls = Class::Handle(); 457 Class& cls = Class::Handle();
460 Type& type = Type::Handle(); 458 Type& type = Type::Handle();
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 const GrowableObjectArray& pending_classes = 502 const GrowableObjectArray& pending_classes =
505 GrowableObjectArray::Handle(GrowableObjectArray::New(Heap::kOld)); 503 GrowableObjectArray::Handle(GrowableObjectArray::New(Heap::kOld));
506 object_store->set_pending_classes(pending_classes); 504 object_store->set_pending_classes(pending_classes);
507 505
508 Context& context = Context::Handle(Context::New(0, Heap::kOld)); 506 Context& context = Context::Handle(Context::New(0, Heap::kOld));
509 object_store->set_empty_context(context); 507 object_store->set_empty_context(context);
510 508
511 // Now that the symbol table is initialized and that the core dictionary as 509 // Now that the symbol table is initialized and that the core dictionary as
512 // well as the core implementation dictionary have been setup, preallocate 510 // well as the core implementation dictionary have been setup, preallocate
513 // remaining classes and register them by name in the dictionaries. 511 // remaining classes and register them by name in the dictionaries.
514 const Script& impl_script = Script::Handle(Bootstrap::LoadImplScript()); 512 const Script& impl_script = Script::Handle(
513 Bootstrap::LoadCoreImplScript(false));
515 514
516 cls = Class::New<Integer>(); 515 cls = Class::New<Integer>();
517 object_store->set_integer_implementation_class(cls); 516 object_store->set_integer_implementation_class(cls);
518 RegisterClass(cls, "IntegerImplementation", impl_script, core_impl_lib); 517 RegisterClass(cls, "IntegerImplementation", core_impl_lib);
519 pending_classes.Add(cls, Heap::kOld); 518 pending_classes.Add(cls, Heap::kOld);
520 519
521 cls = Class::New<Smi>(); 520 cls = Class::New<Smi>();
522 object_store->set_smi_class(cls); 521 object_store->set_smi_class(cls);
523 RegisterClass(cls, "Smi", impl_script, core_impl_lib); 522 RegisterClass(cls, "Smi", core_impl_lib);
524 pending_classes.Add(cls, Heap::kOld); 523 pending_classes.Add(cls, Heap::kOld);
525 524
526 cls = Class::New<Mint>(); 525 cls = Class::New<Mint>();
527 object_store->set_mint_class(cls); 526 object_store->set_mint_class(cls);
528 RegisterClass(cls, "Mint", impl_script, core_impl_lib); 527 RegisterClass(cls, "Mint", core_impl_lib);
529 pending_classes.Add(cls, Heap::kOld); 528 pending_classes.Add(cls, Heap::kOld);
530 529
531 cls = Class::New<Bigint>(); 530 cls = Class::New<Bigint>();
532 object_store->set_bigint_class(cls); 531 object_store->set_bigint_class(cls);
533 RegisterClass(cls, "Bigint", impl_script, core_impl_lib); 532 RegisterClass(cls, "Bigint", core_impl_lib);
534 pending_classes.Add(cls, Heap::kOld); 533 pending_classes.Add(cls, Heap::kOld);
535 534
536 cls = Class::New<Double>(); 535 cls = Class::New<Double>();
537 object_store->set_double_class(cls); 536 object_store->set_double_class(cls);
538 RegisterClass(cls, "Double", impl_script, core_impl_lib); 537 RegisterClass(cls, "Double", core_impl_lib);
539 pending_classes.Add(cls, Heap::kOld); 538 pending_classes.Add(cls, Heap::kOld);
540 539
541 cls = Class::New<Bool>(); 540 cls = Class::New<Bool>();
542 object_store->set_bool_class(cls); 541 object_store->set_bool_class(cls);
543 RegisterClass(cls, "Bool", impl_script, core_impl_lib); 542 RegisterClass(cls, "Bool", core_impl_lib);
544 pending_classes.Add(cls, Heap::kOld); 543 pending_classes.Add(cls, Heap::kOld);
545 544
546 cls = object_store->array_class(); // Was allocated above. 545 cls = object_store->array_class(); // Was allocated above.
547 RegisterClass(cls, "ObjectArray", impl_script, core_impl_lib); 546 RegisterClass(cls, "ObjectArray", core_impl_lib);
548 pending_classes.Add(cls, Heap::kOld); 547 pending_classes.Add(cls, Heap::kOld);
549 548
550 cls = object_store->growable_object_array_class(); // Was allocated above. 549 cls = object_store->growable_object_array_class(); // Was allocated above.
551 RegisterClass(cls, "GrowableObjectArray", impl_script, core_impl_lib); 550 RegisterClass(cls, "GrowableObjectArray", core_impl_lib);
552 pending_classes.Add(cls, Heap::kOld); 551 pending_classes.Add(cls, Heap::kOld);
553 552
554 cls = Class::New<ImmutableArray>(); 553 cls = Class::New<ImmutableArray>();
555 object_store->set_immutable_array_class(cls); 554 object_store->set_immutable_array_class(cls);
556 cls.set_type_arguments_instance_field_offset(Array::type_arguments_offset()); 555 cls.set_type_arguments_instance_field_offset(Array::type_arguments_offset());
557 ASSERT(object_store->immutable_array_class() != object_store->array_class()); 556 ASSERT(object_store->immutable_array_class() != object_store->array_class());
558 RegisterClass(cls, "ImmutableArray", impl_script, core_impl_lib); 557 RegisterClass(cls, "ImmutableArray", core_impl_lib);
559 pending_classes.Add(cls, Heap::kOld); 558 pending_classes.Add(cls, Heap::kOld);
560 559
561 cls = object_store->one_byte_string_class(); // Was allocated above. 560 cls = object_store->one_byte_string_class(); // Was allocated above.
562 RegisterClass(cls, "OneByteString", impl_script, core_impl_lib); 561 RegisterClass(cls, "OneByteString", core_impl_lib);
563 pending_classes.Add(cls, Heap::kOld); 562 pending_classes.Add(cls, Heap::kOld);
564 563
565 cls = Class::New<TwoByteString>(); 564 cls = Class::New<TwoByteString>();
566 object_store->set_two_byte_string_class(cls); 565 object_store->set_two_byte_string_class(cls);
567 RegisterClass(cls, "TwoByteString", impl_script, core_impl_lib); 566 RegisterClass(cls, "TwoByteString", core_impl_lib);
568 pending_classes.Add(cls, Heap::kOld); 567 pending_classes.Add(cls, Heap::kOld);
569 568
570 cls = Class::New<FourByteString>(); 569 cls = Class::New<FourByteString>();
571 object_store->set_four_byte_string_class(cls); 570 object_store->set_four_byte_string_class(cls);
572 RegisterClass(cls, "FourByteString", impl_script, core_impl_lib); 571 RegisterClass(cls, "FourByteString", core_impl_lib);
573 pending_classes.Add(cls, Heap::kOld); 572 pending_classes.Add(cls, Heap::kOld);
574 573
575 cls = Class::New<ExternalOneByteString>(); 574 cls = Class::New<ExternalOneByteString>();
576 object_store->set_external_one_byte_string_class(cls); 575 object_store->set_external_one_byte_string_class(cls);
577 RegisterClass(cls, "ExternalOneByteString", impl_script, core_impl_lib); 576 RegisterClass(cls, "ExternalOneByteString", core_impl_lib);
578 pending_classes.Add(cls, Heap::kOld); 577 pending_classes.Add(cls, Heap::kOld);
579 578
580 cls = Class::New<ExternalTwoByteString>(); 579 cls = Class::New<ExternalTwoByteString>();
581 object_store->set_external_two_byte_string_class(cls); 580 object_store->set_external_two_byte_string_class(cls);
582 RegisterClass(cls, "ExternalTwoByteString", impl_script, core_impl_lib); 581 RegisterClass(cls, "ExternalTwoByteString", core_impl_lib);
583 pending_classes.Add(cls, Heap::kOld); 582 pending_classes.Add(cls, Heap::kOld);
584 583
585 cls = Class::New<ExternalFourByteString>(); 584 cls = Class::New<ExternalFourByteString>();
586 object_store->set_external_four_byte_string_class(cls); 585 object_store->set_external_four_byte_string_class(cls);
587 RegisterClass(cls, "ExternalFourByteString", impl_script, core_impl_lib); 586 RegisterClass(cls, "ExternalFourByteString", core_impl_lib);
588 pending_classes.Add(cls, Heap::kOld); 587 pending_classes.Add(cls, Heap::kOld);
589 588
590 cls = Class::New<Stacktrace>(); 589 cls = Class::New<Stacktrace>();
591 object_store->set_stacktrace_class(cls); 590 object_store->set_stacktrace_class(cls);
592 RegisterClass(cls, "Stacktrace", impl_script, core_impl_lib); 591 RegisterClass(cls, "Stacktrace", core_impl_lib);
593 pending_classes.Add(cls, Heap::kOld); 592 pending_classes.Add(cls, Heap::kOld);
594 // Super type set below, after Object is allocated. 593 // Super type set below, after Object is allocated.
595 594
596 cls = Class::New<JSRegExp>(); 595 cls = Class::New<JSRegExp>();
597 object_store->set_jsregexp_class(cls); 596 object_store->set_jsregexp_class(cls);
598 RegisterClass(cls, "JSSyntaxRegExp", impl_script, core_impl_lib); 597 RegisterClass(cls, "JSSyntaxRegExp", core_impl_lib);
599 pending_classes.Add(cls, Heap::kOld); 598 pending_classes.Add(cls, Heap::kOld);
600 599
601 // Initialize the base interfaces used by the core VM classes. 600 // Initialize the base interfaces used by the core VM classes.
602 const Script& script = Script::Handle(Bootstrap::LoadScript()); 601 const Script& script = Script::Handle(Bootstrap::LoadCoreScript(false));
603 602
604 // Allocate and initialize the Object class and type. The Object 603 // Allocate and initialize the Object class and type. The Object
605 // class and ByteArray subclasses are the only pre-allocated, 604 // class and ByteArray subclasses are the only pre-allocated,
606 // non-interface classes in the core library. 605 // non-interface classes in the core library.
607 cls = Class::New<Instance>(); 606 cls = Class::New<Instance>();
608 object_store->set_object_class(cls); 607 object_store->set_object_class(cls);
609 cls.set_name(String::Handle(Symbols::New("Object"))); 608 cls.set_name(String::Handle(Symbols::New("Object")));
610 cls.set_script(script); 609 cls.set_script(script);
611 cls.set_is_prefinalized(); 610 cls.set_is_prefinalized();
612 core_lib.AddClass(cls); 611 core_lib.AddClass(cls);
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
771 Library::InitNativeWrappersLibrary(isolate); 770 Library::InitNativeWrappersLibrary(isolate);
772 ASSERT(isolate->object_store()->native_wrappers_library() != Library::null()); 771 ASSERT(isolate->object_store()->native_wrappers_library() != Library::null());
773 772
774 // Finish the initialization by compiling the bootstrap scripts containing the 773 // Finish the initialization by compiling the bootstrap scripts containing the
775 // base interfaces and the implementation of the internal classes. 774 // base interfaces and the implementation of the internal classes.
776 Error& error = Error::Handle(); 775 Error& error = Error::Handle();
777 error = Bootstrap::Compile(core_lib, script); 776 error = Bootstrap::Compile(core_lib, script);
778 if (!error.IsNull()) { 777 if (!error.IsNull()) {
779 return error.raw(); 778 return error.raw();
780 } 779 }
780 Script& patch_script = Script::Handle(Bootstrap::LoadCoreScript(true));
781 error = core_lib.Patch(patch_script);
782 if (!error.IsNull()) {
783 return error.raw();
784 }
781 error = Bootstrap::Compile(core_impl_lib, impl_script); 785 error = Bootstrap::Compile(core_impl_lib, impl_script);
782 if (!error.IsNull()) { 786 if (!error.IsNull()) {
783 return error.raw(); 787 return error.raw();
784 } 788 }
785 const Script& math_script = Script::Handle(Bootstrap::LoadMathScript()); 789 patch_script = Bootstrap::LoadCoreImplScript(true);
790 error = core_impl_lib.Patch(patch_script);
791 if (!error.IsNull()) {
792 return error.raw();
793 }
794 const Script& math_script = Script::Handle(Bootstrap::LoadMathScript(false));
786 Library::InitMathLibrary(isolate); 795 Library::InitMathLibrary(isolate);
787 const Library& math_lib = Library::Handle(Library::MathLibrary()); 796 const Library& math_lib = Library::Handle(Library::MathLibrary());
788 ASSERT(!math_lib.IsNull()); 797 ASSERT(!math_lib.IsNull());
789 error = Bootstrap::Compile(math_lib, math_script); 798 error = Bootstrap::Compile(math_lib, math_script);
790 if (!error.IsNull()) { 799 if (!error.IsNull()) {
791 return error.raw(); 800 return error.raw();
792 } 801 }
793 const Script& isolate_script = Script::Handle(Bootstrap::LoadIsolateScript()); 802 patch_script = Bootstrap::LoadMathScript(true);
803 error = math_lib.Patch(patch_script);
804 if (!error.IsNull()) {
805 return error.raw();
806 }
807 const Script& isolate_script = Script::Handle(
808 Bootstrap::LoadIsolateScript(false));
794 Library::InitIsolateLibrary(isolate); 809 Library::InitIsolateLibrary(isolate);
795 const Library& isolate_lib = Library::Handle(Library::IsolateLibrary()); 810 const Library& isolate_lib = Library::Handle(Library::IsolateLibrary());
796 ASSERT(!isolate_lib.IsNull()); 811 ASSERT(!isolate_lib.IsNull());
797 error = Bootstrap::Compile(isolate_lib, isolate_script); 812 error = Bootstrap::Compile(isolate_lib, isolate_script);
798 if (!error.IsNull()) { 813 if (!error.IsNull()) {
799 return error.raw(); 814 return error.raw();
800 } 815 }
801 const Script& mirrors_script = Script::Handle(Bootstrap::LoadMirrorsScript()); 816 patch_script = Bootstrap::LoadIsolateScript(true);
817 error = isolate_lib.Patch(patch_script);
818 if (!error.IsNull()) {
819 return error.raw();
820 }
821 const Script& mirrors_script = Script::Handle(
822 Bootstrap::LoadMirrorsScript(false));
802 Library::InitMirrorsLibrary(isolate); 823 Library::InitMirrorsLibrary(isolate);
803 const Library& mirrors_lib = Library::Handle(Library::MirrorsLibrary()); 824 const Library& mirrors_lib = Library::Handle(Library::MirrorsLibrary());
804 ASSERT(!mirrors_lib.IsNull()); 825 ASSERT(!mirrors_lib.IsNull());
805 error = Bootstrap::Compile(mirrors_lib, mirrors_script); 826 error = Bootstrap::Compile(mirrors_lib, mirrors_script);
806 if (!error.IsNull()) { 827 if (!error.IsNull()) {
807 return error.raw(); 828 return error.raw();
808 } 829 }
830 patch_script = Bootstrap::LoadMirrorsScript(true);
831 error = mirrors_lib.Patch(patch_script);
832 if (!error.IsNull()) {
833 return error.raw();
834 }
809 Bootstrap::SetupNativeResolver(); 835 Bootstrap::SetupNativeResolver();
810 836
811 // Remove the Object superclass cycle by setting the super type to null (not 837 // Remove the Object superclass cycle by setting the super type to null (not
812 // to the type of null). 838 // to the type of null).
813 cls = object_store->object_class(); 839 cls = object_store->object_class();
814 cls.set_super_type(Type::Handle()); 840 cls.set_super_type(Type::Handle());
815 841
816 ClassFinalizer::VerifyBootstrapClasses(); 842 ClassFinalizer::VerifyBootstrapClasses();
817 return Error::null(); 843 return Error::null();
818 } 844 }
(...skipping 5343 matching lines...) Expand 10 before | Expand all | Expand 10 after
6162 lib ^= libs.At(i); 6188 lib ^= libs.At(i);
6163 error_message = lib.FindDuplicateDefinition(); 6189 error_message = lib.FindDuplicateDefinition();
6164 if (!error_message.IsNull()) { 6190 if (!error_message.IsNull()) {
6165 return error_message.raw(); 6191 return error_message.raw();
6166 } 6192 }
6167 } 6193 }
6168 return String::null(); 6194 return String::null();
6169 } 6195 }
6170 6196
6171 6197
6172 RawError* Library::Patch(const String& url, const String& source) const { 6198 RawError* Library::Patch(const Script& script) const {
6173 const Script& script = Script::Handle( 6199 ASSERT(script.kind() == RawScript::kPatchTag);
6174 Script::New(url, source, RawScript::kPatchTag));
6175 return Compiler::Compile(*this, script); 6200 return Compiler::Compile(*this, script);
6176 } 6201 }
6177 6202
6178 6203
6179 bool Library::IsKeyUsed(intptr_t key) { 6204 bool Library::IsKeyUsed(intptr_t key) {
6180 intptr_t lib_key; 6205 intptr_t lib_key;
6181 const GrowableObjectArray& libs = GrowableObjectArray::Handle( 6206 const GrowableObjectArray& libs = GrowableObjectArray::Handle(
6182 Isolate::Current()->object_store()->libraries()); 6207 Isolate::Current()->object_store()->libraries());
6183 Library& lib = Library::Handle(); 6208 Library& lib = Library::Handle();
6184 String& lib_url = String::Handle(); 6209 String& lib_url = String::Handle();
(...skipping 4843 matching lines...) Expand 10 before | Expand all | Expand 10 after
11028 const char* JSRegExp::ToCString() const { 11053 const char* JSRegExp::ToCString() const {
11029 const String& str = String::Handle(pattern()); 11054 const String& str = String::Handle(pattern());
11030 const char* format = "JSRegExp: pattern=%s flags=%s"; 11055 const char* format = "JSRegExp: pattern=%s flags=%s";
11031 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags()); 11056 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags());
11032 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1); 11057 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len + 1);
11033 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags()); 11058 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags());
11034 return chars; 11059 return chars;
11035 } 11060 }
11036 11061
11037 } // namespace dart 11062 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698