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/cpu.h" | 10 #include "vm/cpu.h" |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
110 Instance* Object::sentinel_ = NULL; | 110 Instance* Object::sentinel_ = NULL; |
111 Instance* Object::transition_sentinel_ = NULL; | 111 Instance* Object::transition_sentinel_ = NULL; |
112 Instance* Object::unknown_constant_ = NULL; | 112 Instance* Object::unknown_constant_ = NULL; |
113 Instance* Object::non_constant_ = NULL; | 113 Instance* Object::non_constant_ = NULL; |
114 Bool* Object::bool_true_ = NULL; | 114 Bool* Object::bool_true_ = NULL; |
115 Bool* Object::bool_false_ = NULL; | 115 Bool* Object::bool_false_ = NULL; |
116 Smi* Object::smi_illegal_cid_ = NULL; | 116 Smi* Object::smi_illegal_cid_ = NULL; |
117 LanguageError* Object::snapshot_writer_error_ = NULL; | 117 LanguageError* Object::snapshot_writer_error_ = NULL; |
118 LanguageError* Object::branch_offset_error_ = NULL; | 118 LanguageError* Object::branch_offset_error_ = NULL; |
119 Array* Object::vm_isolate_snapshot_object_table_ = NULL; | 119 Array* Object::vm_isolate_snapshot_object_table_ = NULL; |
| 120 Type* Object::dynamic_type_ = NULL; |
| 121 Type* Object::void_type_ = NULL; |
120 | 122 |
121 RawObject* Object::null_ = reinterpret_cast<RawObject*>(RAW_NULL); | 123 RawObject* Object::null_ = reinterpret_cast<RawObject*>(RAW_NULL); |
122 RawClass* Object::class_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 124 RawClass* Object::class_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
123 RawClass* Object::dynamic_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 125 RawClass* Object::dynamic_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
124 RawClass* Object::void_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 126 RawClass* Object::void_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
125 RawType* Object::dynamic_type_ = reinterpret_cast<RawType*>(RAW_NULL); | |
126 RawType* Object::void_type_ = reinterpret_cast<RawType*>(RAW_NULL); | |
127 RawClass* Object::unresolved_class_class_ = | 127 RawClass* Object::unresolved_class_class_ = |
128 reinterpret_cast<RawClass*>(RAW_NULL); | 128 reinterpret_cast<RawClass*>(RAW_NULL); |
129 RawClass* Object::type_arguments_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 129 RawClass* Object::type_arguments_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
130 RawClass* Object::patch_class_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 130 RawClass* Object::patch_class_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
131 RawClass* Object::function_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 131 RawClass* Object::function_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
132 RawClass* Object::closure_data_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 132 RawClass* Object::closure_data_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
133 RawClass* Object::redirection_data_class_ = | 133 RawClass* Object::redirection_data_class_ = |
134 reinterpret_cast<RawClass*>(RAW_NULL); | 134 reinterpret_cast<RawClass*>(RAW_NULL); |
135 RawClass* Object::field_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 135 RawClass* Object::field_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
136 RawClass* Object::literal_token_class_ = reinterpret_cast<RawClass*>(RAW_NULL); | 136 RawClass* Object::literal_token_class_ = reinterpret_cast<RawClass*>(RAW_NULL); |
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
483 sentinel_ = Instance::ReadOnlyHandle(); | 483 sentinel_ = Instance::ReadOnlyHandle(); |
484 transition_sentinel_ = Instance::ReadOnlyHandle(); | 484 transition_sentinel_ = Instance::ReadOnlyHandle(); |
485 unknown_constant_ = Instance::ReadOnlyHandle(); | 485 unknown_constant_ = Instance::ReadOnlyHandle(); |
486 non_constant_ = Instance::ReadOnlyHandle(); | 486 non_constant_ = Instance::ReadOnlyHandle(); |
487 bool_true_ = Bool::ReadOnlyHandle(); | 487 bool_true_ = Bool::ReadOnlyHandle(); |
488 bool_false_ = Bool::ReadOnlyHandle(); | 488 bool_false_ = Bool::ReadOnlyHandle(); |
489 smi_illegal_cid_ = Smi::ReadOnlyHandle(); | 489 smi_illegal_cid_ = Smi::ReadOnlyHandle(); |
490 snapshot_writer_error_ = LanguageError::ReadOnlyHandle(); | 490 snapshot_writer_error_ = LanguageError::ReadOnlyHandle(); |
491 branch_offset_error_ = LanguageError::ReadOnlyHandle(); | 491 branch_offset_error_ = LanguageError::ReadOnlyHandle(); |
492 vm_isolate_snapshot_object_table_ = Array::ReadOnlyHandle(); | 492 vm_isolate_snapshot_object_table_ = Array::ReadOnlyHandle(); |
| 493 dynamic_type_ = Type::ReadOnlyHandle(); |
| 494 void_type_ = Type::ReadOnlyHandle(); |
493 | 495 |
494 *null_object_ = Object::null(); | 496 *null_object_ = Object::null(); |
495 *null_array_ = Array::null(); | 497 *null_array_ = Array::null(); |
496 *null_string_ = String::null(); | 498 *null_string_ = String::null(); |
497 *null_instance_ = Instance::null(); | 499 *null_instance_ = Instance::null(); |
498 *null_type_arguments_ = TypeArguments::null(); | 500 *null_type_arguments_ = TypeArguments::null(); |
499 | 501 |
500 // Initialize the empty and zero array handles to null_ in order to be able to | 502 // Initialize the empty and zero array handles to null_ in order to be able to |
501 // check if the empty and zero arrays were allocated (RAW_NULL is not | 503 // check if the empty and zero arrays were allocated (RAW_NULL is not |
502 // available). | 504 // available). |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
796 cls.set_num_own_type_arguments(0); | 798 cls.set_num_own_type_arguments(0); |
797 cls.set_is_type_finalized(); | 799 cls.set_is_type_finalized(); |
798 cls.set_is_finalized(); | 800 cls.set_is_finalized(); |
799 void_class_ = cls.raw(); | 801 void_class_ = cls.raw(); |
800 | 802 |
801 cls = Class::New<Type>(); | 803 cls = Class::New<Type>(); |
802 cls.set_is_type_finalized(); | 804 cls.set_is_type_finalized(); |
803 cls.set_is_finalized(); | 805 cls.set_is_finalized(); |
804 | 806 |
805 cls = dynamic_class_; | 807 cls = dynamic_class_; |
806 dynamic_type_ = Type::NewNonParameterizedType(cls); | 808 *dynamic_type_ = Type::NewNonParameterizedType(cls); |
807 | 809 |
808 cls = void_class_; | 810 cls = void_class_; |
809 void_type_ = Type::NewNonParameterizedType(cls); | 811 *void_type_ = Type::NewNonParameterizedType(cls); |
810 | 812 |
811 // Allocate and initialize singleton true and false boolean objects. | 813 // Allocate and initialize singleton true and false boolean objects. |
812 cls = Class::New<Bool>(); | 814 cls = Class::New<Bool>(); |
813 isolate->object_store()->set_bool_class(cls); | 815 isolate->object_store()->set_bool_class(cls); |
814 *bool_true_ = Bool::New(true); | 816 *bool_true_ = Bool::New(true); |
815 *bool_false_ = Bool::New(false); | 817 *bool_false_ = Bool::New(false); |
816 | 818 |
817 *smi_illegal_cid_ = Smi::New(kIllegalCid); | 819 *smi_illegal_cid_ = Smi::New(kIllegalCid); |
818 | 820 |
819 String& error_str = String::Handle(); | 821 String& error_str = String::Handle(); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
894 #define SET_CLASS_NAME(class_name, name) \ | 896 #define SET_CLASS_NAME(class_name, name) \ |
895 cls = class_name##_class(); \ | 897 cls = class_name##_class(); \ |
896 cls.set_name(Symbols::name()); \ | 898 cls.set_name(Symbols::name()); \ |
897 | 899 |
898 void Object::FinalizeVMIsolate(Isolate* isolate) { | 900 void Object::FinalizeVMIsolate(Isolate* isolate) { |
899 // Should only be run by the vm isolate. | 901 // Should only be run by the vm isolate. |
900 ASSERT(isolate == Dart::vm_isolate()); | 902 ASSERT(isolate == Dart::vm_isolate()); |
901 | 903 |
902 // Allocate the parameter arrays for method extractor types and names. | 904 // Allocate the parameter arrays for method extractor types and names. |
903 *extractor_parameter_types_ = Array::New(1, Heap::kOld); | 905 *extractor_parameter_types_ = Array::New(1, Heap::kOld); |
904 extractor_parameter_types_->SetAt(0, Type::Handle(Type::DynamicType())); | 906 extractor_parameter_types_->SetAt(0, Object::dynamic_type()); |
905 *extractor_parameter_names_ = Array::New(1, Heap::kOld); | 907 *extractor_parameter_names_ = Array::New(1, Heap::kOld); |
906 extractor_parameter_names_->SetAt(0, Symbols::This()); | 908 extractor_parameter_names_->SetAt(0, Symbols::This()); |
907 | 909 |
908 ASSERT(!extractor_parameter_types_->IsSmi()); | 910 ASSERT(!extractor_parameter_types_->IsSmi()); |
909 ASSERT(extractor_parameter_types_->IsArray()); | 911 ASSERT(extractor_parameter_types_->IsArray()); |
910 ASSERT(!extractor_parameter_names_->IsSmi()); | 912 ASSERT(!extractor_parameter_names_->IsSmi()); |
911 ASSERT(extractor_parameter_names_->IsArray()); | 913 ASSERT(extractor_parameter_names_->IsArray()); |
912 | 914 |
913 | 915 |
914 // Set up names for all VM singleton classes. | 916 // Set up names for all VM singleton classes. |
(...skipping 1822 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2737 0)); // No token position. | 2739 0)); // No token position. |
2738 ArgumentsDescriptor desc(args_desc); | 2740 ArgumentsDescriptor desc(args_desc); |
2739 invocation.set_num_fixed_parameters(desc.PositionalCount()); | 2741 invocation.set_num_fixed_parameters(desc.PositionalCount()); |
2740 invocation.SetNumOptionalParameters(desc.NamedCount(), | 2742 invocation.SetNumOptionalParameters(desc.NamedCount(), |
2741 false); // Not positional. | 2743 false); // Not positional. |
2742 invocation.set_parameter_types(Array::Handle(Array::New(desc.Count(), | 2744 invocation.set_parameter_types(Array::Handle(Array::New(desc.Count(), |
2743 Heap::kOld))); | 2745 Heap::kOld))); |
2744 invocation.set_parameter_names(Array::Handle(Array::New(desc.Count(), | 2746 invocation.set_parameter_names(Array::Handle(Array::New(desc.Count(), |
2745 Heap::kOld))); | 2747 Heap::kOld))); |
2746 // Receiver. | 2748 // Receiver. |
2747 invocation.SetParameterTypeAt(0, Type::Handle(Type::DynamicType())); | 2749 invocation.SetParameterTypeAt(0, Object::dynamic_type()); |
2748 invocation.SetParameterNameAt(0, Symbols::This()); | 2750 invocation.SetParameterNameAt(0, Symbols::This()); |
2749 // Remaining positional parameters. | 2751 // Remaining positional parameters. |
2750 intptr_t i = 1; | 2752 intptr_t i = 1; |
2751 for (; i < desc.PositionalCount(); i++) { | 2753 for (; i < desc.PositionalCount(); i++) { |
2752 invocation.SetParameterTypeAt(i, Type::Handle(Type::DynamicType())); | 2754 invocation.SetParameterTypeAt(i, Object::dynamic_type()); |
2753 char name[64]; | 2755 char name[64]; |
2754 OS::SNPrint(name, 64, ":p%" Pd, i); | 2756 OS::SNPrint(name, 64, ":p%" Pd, i); |
2755 invocation.SetParameterNameAt(i, String::Handle(Symbols::New(name))); | 2757 invocation.SetParameterNameAt(i, String::Handle(Symbols::New(name))); |
2756 } | 2758 } |
2757 | 2759 |
2758 // Named parameters. | 2760 // Named parameters. |
2759 for (; i < desc.Count(); i++) { | 2761 for (; i < desc.Count(); i++) { |
2760 invocation.SetParameterTypeAt(i, Type::Handle(Type::DynamicType())); | 2762 invocation.SetParameterTypeAt(i, Object::dynamic_type()); |
2761 intptr_t index = i - desc.PositionalCount(); | 2763 intptr_t index = i - desc.PositionalCount(); |
2762 invocation.SetParameterNameAt(i, String::Handle(desc.NameAt(index))); | 2764 invocation.SetParameterNameAt(i, String::Handle(desc.NameAt(index))); |
2763 } | 2765 } |
2764 invocation.set_result_type(Type::Handle(Type::DynamicType())); | 2766 invocation.set_result_type(Object::dynamic_type()); |
2765 invocation.set_is_debuggable(false); | 2767 invocation.set_is_debuggable(false); |
2766 invocation.set_is_visible(false); | 2768 invocation.set_is_visible(false); |
2767 invocation.set_is_reflectable(false); | 2769 invocation.set_is_reflectable(false); |
2768 invocation.set_saved_args_desc(args_desc); | 2770 invocation.set_saved_args_desc(args_desc); |
2769 | 2771 |
2770 return invocation.raw(); | 2772 return invocation.raw(); |
2771 } | 2773 } |
2772 | 2774 |
2773 | 2775 |
2774 // Method extractors are used to create implicit closures from methods. | 2776 // Method extractors are used to create implicit closures from methods. |
(...skipping 17 matching lines...) Expand all Loading... |
2792 false, // Not native. | 2794 false, // Not native. |
2793 owner, | 2795 owner, |
2794 0)); // No token position. | 2796 0)); // No token position. |
2795 | 2797 |
2796 // Initialize signature: receiver is a single fixed parameter. | 2798 // Initialize signature: receiver is a single fixed parameter. |
2797 const intptr_t kNumParameters = 1; | 2799 const intptr_t kNumParameters = 1; |
2798 extractor.set_num_fixed_parameters(kNumParameters); | 2800 extractor.set_num_fixed_parameters(kNumParameters); |
2799 extractor.SetNumOptionalParameters(0, 0); | 2801 extractor.SetNumOptionalParameters(0, 0); |
2800 extractor.set_parameter_types(Object::extractor_parameter_types()); | 2802 extractor.set_parameter_types(Object::extractor_parameter_types()); |
2801 extractor.set_parameter_names(Object::extractor_parameter_names()); | 2803 extractor.set_parameter_names(Object::extractor_parameter_names()); |
2802 extractor.set_result_type(Type::Handle(Type::DynamicType())); | 2804 extractor.set_result_type(Object::dynamic_type()); |
2803 | 2805 |
2804 extractor.set_extracted_method_closure(closure_function); | 2806 extractor.set_extracted_method_closure(closure_function); |
2805 extractor.set_is_debuggable(false); | 2807 extractor.set_is_debuggable(false); |
2806 extractor.set_is_visible(false); | 2808 extractor.set_is_visible(false); |
2807 | 2809 |
2808 owner.AddFunction(extractor); | 2810 owner.AddFunction(extractor); |
2809 | 2811 |
2810 return extractor.raw(); | 2812 return extractor.raw(); |
2811 } | 2813 } |
2812 | 2814 |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3075 RawScript::kEvaluateTag); | 3077 RawScript::kEvaluateTag); |
3076 // In order to tokenize the source, we need to get the key to mangle | 3078 // In order to tokenize the source, we need to get the key to mangle |
3077 // private names from the library from which the class originates. | 3079 // private names from the library from which the class originates. |
3078 const Library& lib = Library::Handle(cls.library()); | 3080 const Library& lib = Library::Handle(cls.library()); |
3079 ASSERT(!lib.IsNull()); | 3081 ASSERT(!lib.IsNull()); |
3080 const String& lib_key = String::Handle(lib.private_key()); | 3082 const String& lib_key = String::Handle(lib.private_key()); |
3081 script.Tokenize(lib_key); | 3083 script.Tokenize(lib_key); |
3082 | 3084 |
3083 const Function& func = Function::Handle( | 3085 const Function& func = Function::Handle( |
3084 Function::NewEvalFunction(cls, script, is_static)); | 3086 Function::NewEvalFunction(cls, script, is_static)); |
3085 func.set_result_type(Type::Handle(Type::DynamicType())); | 3087 func.set_result_type(Object::dynamic_type()); |
3086 const intptr_t num_implicit_params = is_static ? 0 : 1; | 3088 const intptr_t num_implicit_params = is_static ? 0 : 1; |
3087 func.set_num_fixed_parameters(num_implicit_params + param_names.Length()); | 3089 func.set_num_fixed_parameters(num_implicit_params + param_names.Length()); |
3088 func.SetNumOptionalParameters(0, true); | 3090 func.SetNumOptionalParameters(0, true); |
3089 func.SetIsOptimizable(false); | 3091 func.SetIsOptimizable(false); |
3090 return func.raw(); | 3092 return func.raw(); |
3091 } | 3093 } |
3092 | 3094 |
3093 | 3095 |
3094 RawObject* Class::Evaluate(const String& expr, | 3096 RawObject* Class::Evaluate(const String& expr, |
3095 const Array& param_names, | 3097 const Array& param_names, |
(...skipping 4584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7680 result = Object::Clone(result, Heap::kOld); | 7682 result = Object::Clone(result, Heap::kOld); |
7681 | 7683 |
7682 closure_field = Field::New(closure_name, | 7684 closure_field = Field::New(closure_name, |
7683 true, // is_static | 7685 true, // is_static |
7684 true, // is_final | 7686 true, // is_final |
7685 true, // is_const | 7687 true, // is_const |
7686 false, // is_reflectable | 7688 false, // is_reflectable |
7687 field_owner, | 7689 field_owner, |
7688 this->token_pos()); | 7690 this->token_pos()); |
7689 closure_field.SetStaticValue(Instance::Cast(result), true); | 7691 closure_field.SetStaticValue(Instance::Cast(result), true); |
7690 closure_field.set_type(Type::Handle(Type::DynamicType())); | 7692 closure_field.set_type(Object::dynamic_type()); |
7691 field_owner.AddField(closure_field); | 7693 field_owner.AddField(closure_field); |
7692 | 7694 |
7693 return Instance::RawCast(result.raw()); | 7695 return Instance::RawCast(result.raw()); |
7694 } | 7696 } |
7695 | 7697 |
7696 | 7698 |
7697 RawInstance* Field::GetterClosure() const { | 7699 RawInstance* Field::GetterClosure() const { |
7698 return AccessorClosure(false); | 7700 return AccessorClosure(false); |
7699 } | 7701 } |
7700 | 7702 |
(...skipping 1596 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9297 const String& name, | 9299 const String& name, |
9298 intptr_t token_pos) const { | 9300 intptr_t token_pos) const { |
9299 const String& metaname = String::Handle(Symbols::New(name)); | 9301 const String& metaname = String::Handle(Symbols::New(name)); |
9300 Field& field = Field::Handle(Field::New(metaname, | 9302 Field& field = Field::Handle(Field::New(metaname, |
9301 true, // is_static | 9303 true, // is_static |
9302 false, // is_final | 9304 false, // is_final |
9303 false, // is_const | 9305 false, // is_const |
9304 false, // is_reflectable | 9306 false, // is_reflectable |
9305 cls, | 9307 cls, |
9306 token_pos)); | 9308 token_pos)); |
9307 field.set_type(Type::Handle(Type::DynamicType())); | 9309 field.set_type(Object::dynamic_type()); |
9308 field.SetStaticValue(Array::empty_array(), true); | 9310 field.SetStaticValue(Array::empty_array(), true); |
9309 GrowableObjectArray& metadata = | 9311 GrowableObjectArray& metadata = |
9310 GrowableObjectArray::Handle(this->metadata()); | 9312 GrowableObjectArray::Handle(this->metadata()); |
9311 metadata.Add(field, Heap::kOld); | 9313 metadata.Add(field, Heap::kOld); |
9312 cls.AddField(field); | 9314 cls.AddField(field); |
9313 } | 9315 } |
9314 | 9316 |
9315 | 9317 |
9316 void Library::AddClassMetadata(const Class& cls, | 9318 void Library::AddClassMetadata(const Class& cls, |
9317 const Class& toplevel_class, | 9319 const Class& toplevel_class, |
(...skipping 1492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10810 | 10812 |
10811 void Namespace::AddMetadata(intptr_t token_pos, const Class& owner_class) { | 10813 void Namespace::AddMetadata(intptr_t token_pos, const Class& owner_class) { |
10812 ASSERT(Field::Handle(metadata_field()).IsNull()); | 10814 ASSERT(Field::Handle(metadata_field()).IsNull()); |
10813 Field& field = Field::Handle(Field::New(Symbols::TopLevel(), | 10815 Field& field = Field::Handle(Field::New(Symbols::TopLevel(), |
10814 true, // is_static | 10816 true, // is_static |
10815 false, // is_final | 10817 false, // is_final |
10816 false, // is_const | 10818 false, // is_const |
10817 false, // is_reflectable | 10819 false, // is_reflectable |
10818 owner_class, | 10820 owner_class, |
10819 token_pos)); | 10821 token_pos)); |
10820 field.set_type(Type::Handle(Type::DynamicType())); | 10822 field.set_type(Object::dynamic_type()); |
10821 field.SetStaticValue(Array::empty_array(), true); | 10823 field.SetStaticValue(Array::empty_array(), true); |
10822 set_metadata_field(field); | 10824 set_metadata_field(field); |
10823 owner_class.AddField(field); | 10825 owner_class.AddField(field); |
10824 } | 10826 } |
10825 | 10827 |
10826 | 10828 |
10827 RawObject* Namespace::GetMetadata() const { | 10829 RawObject* Namespace::GetMetadata() const { |
10828 Field& field = Field::Handle(metadata_field()); | 10830 Field& field = Field::Handle(metadata_field()); |
10829 if (field.IsNull()) { | 10831 if (field.IsNull()) { |
10830 // There is no metadata for this object. | 10832 // There is no metadata for this object. |
(...skipping 4685 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15516 UNREACHABLE(); | 15518 UNREACHABLE(); |
15517 } | 15519 } |
15518 | 15520 |
15519 | 15521 |
15520 RawType* Type::NullType() { | 15522 RawType* Type::NullType() { |
15521 return Isolate::Current()->object_store()->null_type(); | 15523 return Isolate::Current()->object_store()->null_type(); |
15522 } | 15524 } |
15523 | 15525 |
15524 | 15526 |
15525 RawType* Type::DynamicType() { | 15527 RawType* Type::DynamicType() { |
15526 return Object::dynamic_type(); | 15528 return Object::dynamic_type().raw(); |
15527 } | 15529 } |
15528 | 15530 |
15529 | 15531 |
15530 RawType* Type::VoidType() { | 15532 RawType* Type::VoidType() { |
15531 return Object::void_type(); | 15533 return Object::void_type().raw(); |
15532 } | 15534 } |
15533 | 15535 |
15534 | 15536 |
15535 RawType* Type::ObjectType() { | 15537 RawType* Type::ObjectType() { |
15536 return Isolate::Current()->object_store()->object_type(); | 15538 return Isolate::Current()->object_store()->object_type(); |
15537 } | 15539 } |
15538 | 15540 |
15539 | 15541 |
15540 RawType* Type::BoolType() { | 15542 RawType* Type::BoolType() { |
15541 return Isolate::Current()->object_store()->bool_type(); | 15543 return Isolate::Current()->object_store()->bool_type(); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15592 } | 15594 } |
15593 | 15595 |
15594 | 15596 |
15595 RawType* Type::Function() { | 15597 RawType* Type::Function() { |
15596 return Isolate::Current()->object_store()->function_type(); | 15598 return Isolate::Current()->object_store()->function_type(); |
15597 } | 15599 } |
15598 | 15600 |
15599 | 15601 |
15600 RawType* Type::NewNonParameterizedType(const Class& type_class) { | 15602 RawType* Type::NewNonParameterizedType(const Class& type_class) { |
15601 ASSERT(type_class.NumTypeArguments() == 0); | 15603 ASSERT(type_class.NumTypeArguments() == 0); |
15602 if (type_class.raw() == Object::dynamic_class()) { | |
15603 // If the dynamic type has not been setup in the VM isolate, then we need | |
15604 // to allocate it here. | |
15605 if (Object::dynamic_type() != reinterpret_cast<RawType*>(RAW_NULL)) { | |
15606 ASSERT(Type::Handle(Object::dynamic_type()).IsFinalized()); | |
15607 return Object::dynamic_type(); | |
15608 } | |
15609 ASSERT(Isolate::Current() == Dart::vm_isolate()); | |
15610 } | |
15611 Type& type = Type::Handle(type_class.CanonicalType()); | 15604 Type& type = Type::Handle(type_class.CanonicalType()); |
15612 if (type.IsNull()) { | 15605 if (type.IsNull()) { |
15613 const TypeArguments& no_type_arguments = TypeArguments::Handle(); | 15606 const TypeArguments& no_type_arguments = TypeArguments::Handle(); |
15614 type ^= Type::New(Object::Handle(type_class.raw()), | 15607 type ^= Type::New(Object::Handle(type_class.raw()), |
15615 no_type_arguments, | 15608 no_type_arguments, |
15616 Scanner::kNoSourcePos); | 15609 Scanner::kNoSourcePos); |
15617 type.SetIsFinalized(); | 15610 type.SetIsFinalized(); |
15618 type ^= type.Canonicalize(); | 15611 type ^= type.Canonicalize(); |
15619 } | 15612 } |
15620 ASSERT(type.IsFinalized()); | 15613 ASSERT(type.IsFinalized()); |
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15940 if (IsCanonical() || IsMalformed()) { | 15933 if (IsCanonical() || IsMalformed()) { |
15941 ASSERT(IsMalformed() || TypeArguments::Handle(arguments()).IsOld()); | 15934 ASSERT(IsMalformed() || TypeArguments::Handle(arguments()).IsOld()); |
15942 return this->raw(); | 15935 return this->raw(); |
15943 } | 15936 } |
15944 Thread* thread = Thread::Current(); | 15937 Thread* thread = Thread::Current(); |
15945 Zone* zone = thread->zone(); | 15938 Zone* zone = thread->zone(); |
15946 Isolate* isolate = thread->isolate(); | 15939 Isolate* isolate = thread->isolate(); |
15947 Type& type = Type::Handle(zone); | 15940 Type& type = Type::Handle(zone); |
15948 const Class& cls = Class::Handle(zone, type_class()); | 15941 const Class& cls = Class::Handle(zone, type_class()); |
15949 if (cls.raw() == Object::dynamic_class() && (isolate != Dart::vm_isolate())) { | 15942 if (cls.raw() == Object::dynamic_class() && (isolate != Dart::vm_isolate())) { |
15950 return Object::dynamic_type(); | 15943 return Object::dynamic_type().raw(); |
15951 } | 15944 } |
15952 // Fast canonical lookup/registry for simple types. | 15945 // Fast canonical lookup/registry for simple types. |
15953 if (cls.NumTypeArguments() == 0) { | 15946 if (cls.NumTypeArguments() == 0) { |
15954 type = cls.CanonicalType(); | 15947 type = cls.CanonicalType(); |
15955 if (type.IsNull()) { | 15948 if (type.IsNull()) { |
15956 ASSERT(!cls.raw()->IsVMHeapObject() || (isolate == Dart::vm_isolate())); | 15949 ASSERT(!cls.raw()->IsVMHeapObject() || (isolate == Dart::vm_isolate())); |
15957 cls.set_canonical_types(*this); | 15950 cls.set_canonical_types(*this); |
15958 SetCanonical(); | 15951 SetCanonical(); |
15959 return this->raw(); | 15952 return this->raw(); |
15960 } | 15953 } |
(...skipping 5802 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
21763 return tag_label.ToCString(); | 21756 return tag_label.ToCString(); |
21764 } | 21757 } |
21765 | 21758 |
21766 | 21759 |
21767 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 21760 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
21768 Instance::PrintJSONImpl(stream, ref); | 21761 Instance::PrintJSONImpl(stream, ref); |
21769 } | 21762 } |
21770 | 21763 |
21771 | 21764 |
21772 } // namespace dart | 21765 } // namespace dart |
OLD | NEW |