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

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

Issue 10380019: Stop postponing instantiation of Type and remove InstantiatedType VM class. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 7 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
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/raw_object.h » ('j') | 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) 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 "platform/assert.h" 7 #include "platform/assert.h"
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/bigint_operations.h" 9 #include "vm/bigint_operations.h"
10 #include "vm/bootstrap.h" 10 #include "vm/bootstrap.h"
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 RawInstance* Object::transition_sentinel_ = 55 RawInstance* Object::transition_sentinel_ =
56 reinterpret_cast<RawInstance*>(RAW_NULL); 56 reinterpret_cast<RawInstance*>(RAW_NULL);
57 RawClass* Object::class_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 57 RawClass* Object::class_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
58 RawClass* Object::null_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 58 RawClass* Object::null_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
59 RawClass* Object::dynamic_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 59 RawClass* Object::dynamic_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
60 RawClass* Object::void_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 60 RawClass* Object::void_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
61 RawClass* Object::unresolved_class_class_ = 61 RawClass* Object::unresolved_class_class_ =
62 reinterpret_cast<RawClass*>(RAW_NULL); 62 reinterpret_cast<RawClass*>(RAW_NULL);
63 RawClass* Object::type_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 63 RawClass* Object::type_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
64 RawClass* Object::type_parameter_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 64 RawClass* Object::type_parameter_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
65 RawClass* Object::instantiated_type_class_ =
66 reinterpret_cast<RawClass*>(RAW_NULL);
67 RawClass* Object::abstract_type_arguments_class_ =
68 reinterpret_cast<RawClass*>(RAW_NULL);
69 RawClass* Object::type_arguments_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 65 RawClass* Object::type_arguments_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
70 RawClass* Object::instantiated_type_arguments_class_ = 66 RawClass* Object::instantiated_type_arguments_class_ =
71 reinterpret_cast<RawClass*>(RAW_NULL); 67 reinterpret_cast<RawClass*>(RAW_NULL);
72 RawClass* Object::function_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 68 RawClass* Object::function_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
73 RawClass* Object::field_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 69 RawClass* Object::field_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
74 RawClass* Object::literal_token_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 70 RawClass* Object::literal_token_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
75 RawClass* Object::token_stream_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 71 RawClass* Object::token_stream_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
76 RawClass* Object::script_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 72 RawClass* Object::script_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
77 RawClass* Object::library_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 73 RawClass* Object::library_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
78 RawClass* Object::library_prefix_class_ = reinterpret_cast<RawClass*>(RAW_NULL); 74 RawClass* Object::library_prefix_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
(...skipping 26 matching lines...) Expand all
105 } else if (raw_class == dynamic_class()) { 101 } else if (raw_class == dynamic_class()) {
106 return kDynamicClass; 102 return kDynamicClass;
107 } else if (raw_class == void_class()) { 103 } else if (raw_class == void_class()) {
108 return kVoidClass; 104 return kVoidClass;
109 } else if (raw_class == unresolved_class_class()) { 105 } else if (raw_class == unresolved_class_class()) {
110 return kUnresolvedClassClass; 106 return kUnresolvedClassClass;
111 } else if (raw_class == type_class()) { 107 } else if (raw_class == type_class()) {
112 return kTypeClass; 108 return kTypeClass;
113 } else if (raw_class == type_parameter_class()) { 109 } else if (raw_class == type_parameter_class()) {
114 return kTypeParameterClass; 110 return kTypeParameterClass;
115 } else if (raw_class == instantiated_type_class()) {
116 return kInstantiatedTypeClass;
117 } else if (raw_class == abstract_type_arguments_class()) {
118 return kAbstractTypeArgumentsClass;
119 } else if (raw_class == type_arguments_class()) { 111 } else if (raw_class == type_arguments_class()) {
120 return kTypeArgumentsClass; 112 return kTypeArgumentsClass;
121 } else if (raw_class == instantiated_type_arguments_class()) { 113 } else if (raw_class == instantiated_type_arguments_class()) {
122 return kInstantiatedTypeArgumentsClass; 114 return kInstantiatedTypeArgumentsClass;
123 } else if (raw_class == function_class()) { 115 } else if (raw_class == function_class()) {
124 return kFunctionClass; 116 return kFunctionClass;
125 } else if (raw_class == field_class()) { 117 } else if (raw_class == field_class()) {
126 return kFieldClass; 118 return kFieldClass;
127 } else if (raw_class == literal_token_class()) { 119 } else if (raw_class == literal_token_class()) {
128 return kLiteralTokenClass; 120 return kLiteralTokenClass;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 161
170 RawClass* Object::GetSingletonClass(int index) { 162 RawClass* Object::GetSingletonClass(int index) {
171 switch (index) { 163 switch (index) {
172 case kClassClass: return class_class(); 164 case kClassClass: return class_class();
173 case kNullClass: return null_class(); 165 case kNullClass: return null_class();
174 case kDynamicClass: return dynamic_class(); 166 case kDynamicClass: return dynamic_class();
175 case kVoidClass: return void_class(); 167 case kVoidClass: return void_class();
176 case kUnresolvedClassClass: return unresolved_class_class(); 168 case kUnresolvedClassClass: return unresolved_class_class();
177 case kTypeClass: return type_class(); 169 case kTypeClass: return type_class();
178 case kTypeParameterClass: return type_parameter_class(); 170 case kTypeParameterClass: return type_parameter_class();
179 case kInstantiatedTypeClass: return instantiated_type_class();
180 case kAbstractTypeArgumentsClass: return abstract_type_arguments_class();
181 case kTypeArgumentsClass: return type_arguments_class(); 171 case kTypeArgumentsClass: return type_arguments_class();
182 case kInstantiatedTypeArgumentsClass: 172 case kInstantiatedTypeArgumentsClass:
183 return instantiated_type_arguments_class(); 173 return instantiated_type_arguments_class();
184 case kFunctionClass: return function_class(); 174 case kFunctionClass: return function_class();
185 case kFieldClass: return field_class(); 175 case kFieldClass: return field_class();
186 case kLiteralTokenClass: return literal_token_class(); 176 case kLiteralTokenClass: return literal_token_class();
187 case kTokenStreamClass: return token_stream_class(); 177 case kTokenStreamClass: return token_stream_class();
188 case kScriptClass: return script_class(); 178 case kScriptClass: return script_class();
189 case kLibraryClass: return library_class(); 179 case kLibraryClass: return library_class();
190 case kLibraryPrefixClass: return library_prefix_class(); 180 case kLibraryPrefixClass: return library_prefix_class();
(...skipping 20 matching lines...) Expand all
211 201
212 const char* Object::GetSingletonClassName(int index) { 202 const char* Object::GetSingletonClassName(int index) {
213 switch (index) { 203 switch (index) {
214 case kClassClass: return "Class"; 204 case kClassClass: return "Class";
215 case kNullClass: return "Null"; 205 case kNullClass: return "Null";
216 case kDynamicClass: return "Dynamic"; 206 case kDynamicClass: return "Dynamic";
217 case kVoidClass: return "void"; 207 case kVoidClass: return "void";
218 case kUnresolvedClassClass: return "UnresolvedClass"; 208 case kUnresolvedClassClass: return "UnresolvedClass";
219 case kTypeClass: return "Type"; 209 case kTypeClass: return "Type";
220 case kTypeParameterClass: return "TypeParameter"; 210 case kTypeParameterClass: return "TypeParameter";
221 case kInstantiatedTypeClass: return "InstantiatedType";
222 case kAbstractTypeArgumentsClass: return "AbstractTypeArguments";
223 case kTypeArgumentsClass: return "TypeArguments"; 211 case kTypeArgumentsClass: return "TypeArguments";
224 case kInstantiatedTypeArgumentsClass: return "InstantiatedTypeArguments"; 212 case kInstantiatedTypeArgumentsClass: return "InstantiatedTypeArguments";
225 case kFunctionClass: return "Function"; 213 case kFunctionClass: return "Function";
226 case kFieldClass: return "Field"; 214 case kFieldClass: return "Field";
227 case kLiteralTokenClass: return "LiteralToken"; 215 case kLiteralTokenClass: return "LiteralToken";
228 case kTokenStreamClass: return "TokenStream"; 216 case kTokenStreamClass: return "TokenStream";
229 case kScriptClass: return "Script"; 217 case kScriptClass: return "Script";
230 case kLibraryClass: return "Library"; 218 case kLibraryClass: return "Library";
231 case kLibraryPrefixClass: return "LibraryPrefix"; 219 case kLibraryPrefixClass: return "LibraryPrefix";
232 case kCodeClass: return "Code"; 220 case kCodeClass: return "Code";
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 cls = Class::New<Instance>(kVoidClassIndex); 333 cls = Class::New<Instance>(kVoidClassIndex);
346 cls.set_is_finalized(); 334 cls.set_is_finalized();
347 void_class_ = cls.raw(); 335 void_class_ = cls.raw();
348 336
349 cls = Class::New<Type>(); 337 cls = Class::New<Type>();
350 type_class_ = cls.raw(); 338 type_class_ = cls.raw();
351 339
352 cls = Class::New<TypeParameter>(); 340 cls = Class::New<TypeParameter>();
353 type_parameter_class_ = cls.raw(); 341 type_parameter_class_ = cls.raw();
354 342
355 cls = Class::New<InstantiatedType>();
356 instantiated_type_class_ = cls.raw();
357
358 cls = Class::New<AbstractTypeArguments>();
359 abstract_type_arguments_class_ = cls.raw();
360
361 cls = Class::New<TypeArguments>(); 343 cls = Class::New<TypeArguments>();
362 type_arguments_class_ = cls.raw(); 344 type_arguments_class_ = cls.raw();
363 345
364 cls = Class::New<InstantiatedTypeArguments>(); 346 cls = Class::New<InstantiatedTypeArguments>();
365 instantiated_type_arguments_class_ = cls.raw(); 347 instantiated_type_arguments_class_ = cls.raw();
366 348
367 cls = Class::New<Function>(); 349 cls = Class::New<Function>();
368 function_class_ = cls.raw(); 350 function_class_ = cls.raw();
369 351
370 cls = Class::New<Field>(); 352 cls = Class::New<Field>();
(...skipping 2064 matching lines...) Expand 10 before | Expand all | Expand 10 after
2435 } 2417 }
2436 2418
2437 RawAbstractType* AbstractType::NewTypeParameter(const Class& clazz, 2419 RawAbstractType* AbstractType::NewTypeParameter(const Class& clazz,
2438 intptr_t index, 2420 intptr_t index,
2439 const String& name, 2421 const String& name,
2440 intptr_t token_index) { 2422 intptr_t token_index) {
2441 return TypeParameter::New(clazz, index, name, token_index); 2423 return TypeParameter::New(clazz, index, name, token_index);
2442 } 2424 }
2443 2425
2444 2426
2445 RawAbstractType* AbstractType::NewInstantiatedType(
2446 const AbstractType& uninstantiated_type,
2447 const AbstractTypeArguments& instantiator_type_arguments) {
2448 return InstantiatedType::New(uninstantiated_type,
2449 instantiator_type_arguments);
2450 }
2451
2452
2453 const char* AbstractType::ToCString() const { 2427 const char* AbstractType::ToCString() const {
2454 // AbstractType is an abstract class. 2428 // AbstractType is an abstract class.
2455 UNREACHABLE(); 2429 UNREACHABLE();
2456 return "AbstractType"; 2430 return "AbstractType";
2457 } 2431 }
2458 2432
2459 2433
2460 RawType* Type::NullType() { 2434 RawType* Type::NullType() {
2461 return Isolate::Current()->object_store()->null_type(); 2435 return Isolate::Current()->object_store()->null_type();
2462 } 2436 }
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
2641 instantiated_type.set_is_finalized_instantiated(); 2615 instantiated_type.set_is_finalized_instantiated();
2642 return instantiated_type.raw(); 2616 return instantiated_type.raw();
2643 } 2617 }
2644 2618
2645 2619
2646 bool Type::Equals(const AbstractType& other) const { 2620 bool Type::Equals(const AbstractType& other) const {
2647 ASSERT(IsFinalized() && other.IsFinalized()); 2621 ASSERT(IsFinalized() && other.IsFinalized());
2648 if (raw() == other.raw()) { 2622 if (raw() == other.raw()) {
2649 return true; 2623 return true;
2650 } 2624 }
2651 if (IsMalformed() || other.IsMalformed() || 2625 if (IsMalformed() || !other.IsType() || other.IsMalformed()) {
2652 (!other.IsType() && !other.IsInstantiatedType())) {
2653 return false; 2626 return false;
2654 } 2627 }
2655 if (type_class() != other.type_class()) { 2628 if (type_class() != other.type_class()) {
2656 return false; 2629 return false;
2657 } 2630 }
2658 return AbstractTypeArguments::AreEqual( 2631 return AbstractTypeArguments::AreEqual(
2659 AbstractTypeArguments::Handle(arguments()), 2632 AbstractTypeArguments::Handle(arguments()),
2660 AbstractTypeArguments::Handle(other.arguments())); 2633 AbstractTypeArguments::Handle(other.arguments()));
2661 } 2634 }
2662 2635
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
2929 const char* format = "TypeParameter: name %s; index: %d"; 2902 const char* format = "TypeParameter: name %s; index: %d";
2930 const char* name_cstr = String::Handle(Name()).ToCString(); 2903 const char* name_cstr = String::Handle(Name()).ToCString();
2931 intptr_t len = OS::SNPrint(NULL, 0, format, name_cstr, Index()) + 1; 2904 intptr_t len = OS::SNPrint(NULL, 0, format, name_cstr, Index()) + 1;
2932 char* chars = reinterpret_cast<char*>( 2905 char* chars = reinterpret_cast<char*>(
2933 Isolate::Current()->current_zone()->Allocate(len)); 2906 Isolate::Current()->current_zone()->Allocate(len));
2934 OS::SNPrint(chars, len, format, name_cstr, Index()); 2907 OS::SNPrint(chars, len, format, name_cstr, Index());
2935 return chars; 2908 return chars;
2936 } 2909 }
2937 2910
2938 2911
2939 RawClass* InstantiatedType::type_class() const {
2940 return AbstractType::Handle(uninstantiated_type()).type_class();
2941 }
2942
2943
2944 RawAbstractTypeArguments* InstantiatedType::arguments() const {
2945 return InstantiatedTypeArguments::New(
2946 AbstractTypeArguments::Handle(AbstractType::Handle(
2947 uninstantiated_type()).arguments()),
2948 AbstractTypeArguments::Handle(instantiator_type_arguments()));
2949 }
2950
2951
2952 intptr_t InstantiatedType::token_index() const {
2953 return AbstractType::Handle(uninstantiated_type()).token_index();
2954 }
2955
2956
2957 void InstantiatedType::set_uninstantiated_type(
2958 const AbstractType& value) const {
2959 StorePointer(&raw_ptr()->uninstantiated_type_, value.raw());
2960 }
2961
2962
2963 void InstantiatedType::set_instantiator_type_arguments(
2964 const AbstractTypeArguments& value) const {
2965 StorePointer(&raw_ptr()->instantiator_type_arguments_, value.raw());
2966 }
2967
2968
2969 RawInstantiatedType* InstantiatedType::New() {
2970 const Class& instantiated_type_class =
2971 Class::Handle(Object::instantiated_type_class());
2972 RawObject* raw = Object::Allocate(instantiated_type_class,
2973 InstantiatedType::InstanceSize(),
2974 Heap::kOld);
2975 return reinterpret_cast<RawInstantiatedType*>(raw);
2976 }
2977
2978
2979 RawInstantiatedType* InstantiatedType::New(
2980 const AbstractType& uninstantiated_type,
2981 const AbstractTypeArguments& instantiator_type_arguments) {
2982 const InstantiatedType& result =
2983 InstantiatedType::Handle(InstantiatedType::New());
2984 result.set_uninstantiated_type(uninstantiated_type);
2985 result.set_instantiator_type_arguments(instantiator_type_arguments);
2986 return result.raw();
2987 }
2988
2989
2990 bool InstantiatedType::Equals(const AbstractType& other) const {
2991 ASSERT(IsFinalized() && other.IsFinalized());
2992 if (raw() == other.raw()) {
2993 return true;
2994 }
2995 if (IsMalformed() || other.IsMalformed() ||
2996 (!other.IsType() && !other.IsInstantiatedType())) {
2997 return false;
2998 }
2999 if (type_class() != other.type_class()) {
3000 return false;
3001 }
3002 return AbstractTypeArguments::AreEqual(
3003 AbstractTypeArguments::Handle(arguments()),
3004 AbstractTypeArguments::Handle(other.arguments()));
3005 }
3006
3007
3008 const char* InstantiatedType::ToCString() const {
3009 return "InstantiatedType";
3010 }
3011
3012
3013 intptr_t AbstractTypeArguments::Length() const { 2912 intptr_t AbstractTypeArguments::Length() const {
3014 // AbstractTypeArguments is an abstract class. 2913 // AbstractTypeArguments is an abstract class.
3015 UNREACHABLE(); 2914 UNREACHABLE();
3016 return -1; 2915 return -1;
3017 } 2916 }
3018 2917
3019 2918
3020 RawAbstractType* AbstractTypeArguments::TypeAt(intptr_t index) const { 2919 RawAbstractType* AbstractTypeArguments::TypeAt(intptr_t index) const {
3021 // AbstractTypeArguments is an abstract class. 2920 // AbstractTypeArguments is an abstract class.
3022 UNREACHABLE(); 2921 UNREACHABLE();
(...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after
3460 intptr_t InstantiatedTypeArguments::Length() const { 3359 intptr_t InstantiatedTypeArguments::Length() const {
3461 return AbstractTypeArguments::Handle( 3360 return AbstractTypeArguments::Handle(
3462 uninstantiated_type_arguments()).Length(); 3361 uninstantiated_type_arguments()).Length();
3463 } 3362 }
3464 3363
3465 3364
3466 RawAbstractType* InstantiatedTypeArguments::TypeAt(intptr_t index) const { 3365 RawAbstractType* InstantiatedTypeArguments::TypeAt(intptr_t index) const {
3467 const AbstractType& type = AbstractType::Handle( 3366 const AbstractType& type = AbstractType::Handle(
3468 AbstractTypeArguments::Handle( 3367 AbstractTypeArguments::Handle(
3469 uninstantiated_type_arguments()).TypeAt(index)); 3368 uninstantiated_type_arguments()).TypeAt(index));
3470 if (type.IsTypeParameter()) { 3369 if (!type.IsInstantiated()) {
3471 AbstractTypeArguments& instantiator = 3370 const AbstractTypeArguments& instantiator_type_args =
3472 AbstractTypeArguments::Handle(instantiator_type_arguments()); 3371 AbstractTypeArguments::Handle(instantiator_type_arguments());
3473 if (instantiator.IsNull()) { 3372 return type.InstantiateFrom(instantiator_type_args);
3474 return Type::DynamicType();
3475 }
3476 return instantiator.TypeAt(type.Index());
3477 }
3478 if (!type.IsInstantiated()) {
3479 return InstantiatedType::New(
3480 type, AbstractTypeArguments::Handle(instantiator_type_arguments()));
3481 } 3373 }
3482 return type.raw(); 3374 return type.raw();
3483 } 3375 }
3484 3376
3485 3377
3486 void InstantiatedTypeArguments::SetTypeAt(intptr_t index, 3378 void InstantiatedTypeArguments::SetTypeAt(intptr_t index,
3487 const AbstractType& value) const { 3379 const AbstractType& value) const {
3488 // We only replace individual argument types during resolution at compile 3380 // We only replace individual argument types during resolution at compile
3489 // time, when no type parameters are instantiated yet. 3381 // time, when no type parameters are instantiated yet.
3490 UNREACHABLE(); 3382 UNREACHABLE();
(...skipping 6501 matching lines...) Expand 10 before | Expand all | Expand 10 after
9992 const String& str = String::Handle(pattern()); 9884 const String& str = String::Handle(pattern());
9993 const char* format = "JSRegExp: pattern=%s flags=%s"; 9885 const char* format = "JSRegExp: pattern=%s flags=%s";
9994 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags()); 9886 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags());
9995 char* chars = reinterpret_cast<char*>( 9887 char* chars = reinterpret_cast<char*>(
9996 Isolate::Current()->current_zone()->Allocate(len + 1)); 9888 Isolate::Current()->current_zone()->Allocate(len + 1));
9997 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags()); 9889 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags());
9998 return chars; 9890 return chars;
9999 } 9891 }
10000 9892
10001 } // namespace dart 9893 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/raw_object.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698