OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |