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 606 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
617 cls = Class::New<Bool>(); | 617 cls = Class::New<Bool>(); |
618 object_store->set_bool_class(cls); | 618 object_store->set_bool_class(cls); |
619 name = Symbols::Bool(); | 619 name = Symbols::Bool(); |
620 RegisterClass(cls, name, core_lib); | 620 RegisterClass(cls, name, core_lib); |
621 pending_classes.Add(cls, Heap::kOld); | 621 pending_classes.Add(cls, Heap::kOld); |
622 | 622 |
623 cls = object_store->array_class(); // Was allocated above. | 623 cls = object_store->array_class(); // Was allocated above. |
624 name = Symbols::ObjectArray(); | 624 name = Symbols::ObjectArray(); |
625 RegisterPrivateClass(cls, name, core_lib); | 625 RegisterPrivateClass(cls, name, core_lib); |
626 pending_classes.Add(cls, Heap::kOld); | 626 pending_classes.Add(cls, Heap::kOld); |
| 627 // We cannot use NewNonParameterizedType(cls), because Array is parameterized. |
| 628 type ^= Type::New(Object::Handle(cls.raw()), |
| 629 TypeArguments::Handle(), |
| 630 Scanner::kDummyTokenIndex); |
| 631 type.set_is_finalized_instantiated(); |
| 632 type ^= type.Canonicalize(); |
| 633 object_store->set_array_type(type); |
627 | 634 |
628 cls = object_store->growable_object_array_class(); // Was allocated above. | 635 cls = object_store->growable_object_array_class(); // Was allocated above. |
629 name = Symbols::GrowableObjectArray(); | 636 name = Symbols::GrowableObjectArray(); |
630 RegisterPrivateClass(cls, name, core_lib); | 637 RegisterPrivateClass(cls, name, core_lib); |
631 pending_classes.Add(cls, Heap::kOld); | 638 pending_classes.Add(cls, Heap::kOld); |
632 | 639 |
633 cls = Class::New<ImmutableArray>(); | 640 cls = Class::New<ImmutableArray>(); |
634 object_store->set_immutable_array_class(cls); | 641 object_store->set_immutable_array_class(cls); |
635 cls.set_type_arguments_instance_field_offset(Array::type_arguments_offset()); | 642 cls.set_type_arguments_instance_field_offset(Array::type_arguments_offset()); |
636 ASSERT(object_store->immutable_array_class() != object_store->array_class()); | 643 ASSERT(object_store->immutable_array_class() != object_store->array_class()); |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
874 | 881 |
875 name = Symbols::New("String"); | 882 name = Symbols::New("String"); |
876 cls = Class::New<Instance>(name, script, Scanner::kDummyTokenIndex); | 883 cls = Class::New<Instance>(name, script, Scanner::kDummyTokenIndex); |
877 RegisterClass(cls, name, core_lib); | 884 RegisterClass(cls, name, core_lib); |
878 pending_classes.Add(cls, Heap::kOld); | 885 pending_classes.Add(cls, Heap::kOld); |
879 type = Type::NewNonParameterizedType(cls); | 886 type = Type::NewNonParameterizedType(cls); |
880 object_store->set_string_type(type); | 887 object_store->set_string_type(type); |
881 | 888 |
882 cls = CreateAndRegisterInterface("List", script, core_lib); | 889 cls = CreateAndRegisterInterface("List", script, core_lib); |
883 pending_classes.Add(cls, Heap::kOld); | 890 pending_classes.Add(cls, Heap::kOld); |
884 type = Type::NewNonParameterizedType(cls); | 891 object_store->set_list_class(cls); |
885 object_store->set_list_interface(type); | |
886 | 892 |
887 cls = object_store->bool_class(); | 893 cls = object_store->bool_class(); |
888 type = Type::NewNonParameterizedType(cls); | 894 type = Type::NewNonParameterizedType(cls); |
889 object_store->set_bool_type(type); | 895 object_store->set_bool_type(type); |
890 | 896 |
891 cls = object_store->smi_class(); | 897 cls = object_store->smi_class(); |
892 type = Type::NewNonParameterizedType(cls); | 898 type = Type::NewNonParameterizedType(cls); |
893 object_store->set_smi_type(type); | 899 object_store->set_smi_type(type); |
894 | 900 |
895 cls = object_store->mint_class(); | 901 cls = object_store->mint_class(); |
(...skipping 7653 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8549 (type_class() == Type::Handle(Type::StringType()).type_class()); | 8555 (type_class() == Type::Handle(Type::StringType()).type_class()); |
8550 } | 8556 } |
8551 | 8557 |
8552 | 8558 |
8553 bool AbstractType::IsFunctionType() const { | 8559 bool AbstractType::IsFunctionType() const { |
8554 return HasResolvedTypeClass() && | 8560 return HasResolvedTypeClass() && |
8555 (type_class() == Type::Handle(Type::Function()).type_class()); | 8561 (type_class() == Type::Handle(Type::Function()).type_class()); |
8556 } | 8562 } |
8557 | 8563 |
8558 | 8564 |
8559 bool AbstractType::IsListInterface() const { | |
8560 return HasResolvedTypeClass() && | |
8561 (type_class() == Type::Handle(Type::ListInterface()).type_class()); | |
8562 } | |
8563 | |
8564 | |
8565 bool AbstractType::TypeTest(TypeTestKind test_kind, | 8565 bool AbstractType::TypeTest(TypeTestKind test_kind, |
8566 const AbstractType& other, | 8566 const AbstractType& other, |
8567 Error* malformed_error) const { | 8567 Error* malformed_error) const { |
8568 ASSERT(IsFinalized()); | 8568 ASSERT(IsFinalized()); |
8569 ASSERT(other.IsFinalized()); | 8569 ASSERT(other.IsFinalized()); |
8570 // In case the type checked in a type test is malformed, the code generator | 8570 // In case the type checked in a type test is malformed, the code generator |
8571 // may compile a throw instead of a run time call performing the type check. | 8571 // may compile a throw instead of a run time call performing the type check. |
8572 // However, in checked mode, a function type may include malformed result type | 8572 // However, in checked mode, a function type may include malformed result type |
8573 // and/or malformed parameter types, which will then be encountered here at | 8573 // and/or malformed parameter types, which will then be encountered here at |
8574 // run time. | 8574 // run time. |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8681 RawType* Type::Number() { | 8681 RawType* Type::Number() { |
8682 return Isolate::Current()->object_store()->number_type(); | 8682 return Isolate::Current()->object_store()->number_type(); |
8683 } | 8683 } |
8684 | 8684 |
8685 | 8685 |
8686 RawType* Type::StringType() { | 8686 RawType* Type::StringType() { |
8687 return Isolate::Current()->object_store()->string_type(); | 8687 return Isolate::Current()->object_store()->string_type(); |
8688 } | 8688 } |
8689 | 8689 |
8690 | 8690 |
| 8691 RawType* Type::ArrayType() { |
| 8692 return Isolate::Current()->object_store()->array_type(); |
| 8693 } |
| 8694 |
| 8695 |
8691 RawType* Type::Function() { | 8696 RawType* Type::Function() { |
8692 return Isolate::Current()->object_store()->function_type(); | 8697 return Isolate::Current()->object_store()->function_type(); |
8693 } | 8698 } |
8694 | 8699 |
8695 | 8700 |
8696 RawType* Type::ListInterface() { | |
8697 return Isolate::Current()->object_store()->list_interface(); | |
8698 } | |
8699 | |
8700 | |
8701 RawType* Type::NewNonParameterizedType(const Class& type_class) { | 8701 RawType* Type::NewNonParameterizedType(const Class& type_class) { |
8702 ASSERT(!type_class.HasTypeArguments()); | 8702 ASSERT(!type_class.HasTypeArguments()); |
8703 const TypeArguments& no_type_arguments = TypeArguments::Handle(); | 8703 const TypeArguments& no_type_arguments = TypeArguments::Handle(); |
8704 Type& type = Type::Handle(); | 8704 Type& type = Type::Handle(); |
8705 type ^= Type::New(Object::Handle(type_class.raw()), | 8705 type ^= Type::New(Object::Handle(type_class.raw()), |
8706 no_type_arguments, | 8706 no_type_arguments, |
8707 Scanner::kDummyTokenIndex); | 8707 Scanner::kDummyTokenIndex); |
8708 type.set_is_finalized_instantiated(); | 8708 type.set_is_finalized_instantiated(); |
8709 type ^= type.Canonicalize(); | 8709 type ^= type.Canonicalize(); |
8710 return type.raw(); | 8710 return type.raw(); |
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9129 | 9129 |
9130 void TypeParameter::set_type_state(int8_t state) const { | 9130 void TypeParameter::set_type_state(int8_t state) const { |
9131 ASSERT((state == RawTypeParameter::kAllocated) || | 9131 ASSERT((state == RawTypeParameter::kAllocated) || |
9132 (state == RawTypeParameter::kBeingFinalized) || | 9132 (state == RawTypeParameter::kBeingFinalized) || |
9133 (state == RawTypeParameter::kFinalizedUninstantiated)); | 9133 (state == RawTypeParameter::kFinalizedUninstantiated)); |
9134 raw_ptr()->type_state_ = state; | 9134 raw_ptr()->type_state_ = state; |
9135 } | 9135 } |
9136 | 9136 |
9137 | 9137 |
9138 const char* TypeParameter::ToCString() const { | 9138 const char* TypeParameter::ToCString() const { |
9139 const char* format = "TypeParameter: name %s; index: %d"; | 9139 const char* format = "TypeParameter: name %s; index: %d; class: %s"; |
9140 const char* name_cstr = String::Handle(Name()).ToCString(); | 9140 const char* name_cstr = String::Handle(Name()).ToCString(); |
9141 intptr_t len = OS::SNPrint(NULL, 0, format, name_cstr, index()) + 1; | 9141 const Class& cls = Class::Handle(parameterized_class()); |
| 9142 const char* cls_cstr = |
| 9143 cls.IsNull() ? " null" : String::Handle(cls.Name()).ToCString(); |
| 9144 intptr_t len = OS::SNPrint(NULL, 0, format, name_cstr, index(), cls_cstr) + 1; |
9142 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); | 9145 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); |
9143 OS::SNPrint(chars, len, format, name_cstr, index()); | 9146 OS::SNPrint(chars, len, format, name_cstr, index(), cls_cstr); |
9144 return chars; | 9147 return chars; |
9145 } | 9148 } |
9146 | 9149 |
9147 | 9150 |
9148 const char* Number::ToCString() const { | 9151 const char* Number::ToCString() const { |
9149 // Number is an interface. No instances of Number should exist. | 9152 // Number is an interface. No instances of Number should exist. |
9150 UNREACHABLE(); | 9153 UNREACHABLE(); |
9151 return "Number"; | 9154 return "Number"; |
9152 } | 9155 } |
9153 | 9156 |
(...skipping 2937 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12091 } | 12094 } |
12092 return result.raw(); | 12095 return result.raw(); |
12093 } | 12096 } |
12094 | 12097 |
12095 | 12098 |
12096 const char* WeakProperty::ToCString() const { | 12099 const char* WeakProperty::ToCString() const { |
12097 return "_WeakProperty"; | 12100 return "_WeakProperty"; |
12098 } | 12101 } |
12099 | 12102 |
12100 } // namespace dart | 12103 } // namespace dart |
OLD | NEW |