| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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/class_finalizer.h" | 5 #include "vm/class_finalizer.h" |
| 6 | 6 |
| 7 #include "vm/flags.h" | 7 #include "vm/flags.h" |
| 8 #include "vm/heap.h" | 8 #include "vm/heap.h" |
| 9 #include "vm/isolate.h" | 9 #include "vm/isolate.h" |
| 10 #include "vm/longjump.h" | 10 #include "vm/longjump.h" |
| (...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 389 const intptr_t num_type_params = cls.NumTypeParameters(); | 389 const intptr_t num_type_params = cls.NumTypeParameters(); |
| 390 const intptr_t offset = cls.NumTypeArguments() - num_type_params; | 390 const intptr_t offset = cls.NumTypeArguments() - num_type_params; |
| 391 Type& type = Type::Handle(); | 391 Type& type = Type::Handle(); |
| 392 Type& type_extends = Type::Handle(); | 392 Type& type_extends = Type::Handle(); |
| 393 const TypeArguments& extends_array = | 393 const TypeArguments& extends_array = |
| 394 TypeArguments::Handle(cls.type_parameter_extends()); | 394 TypeArguments::Handle(cls.type_parameter_extends()); |
| 395 ASSERT((extends_array.IsNull() && (num_type_params == 0)) || | 395 ASSERT((extends_array.IsNull() && (num_type_params == 0)) || |
| 396 (extends_array.Length() == num_type_params)); | 396 (extends_array.Length() == num_type_params)); |
| 397 for (intptr_t i = 0; i < num_type_params; i++) { | 397 for (intptr_t i = 0; i < num_type_params; i++) { |
| 398 type_extends = extends_array.TypeAt(i); | 398 type_extends = extends_array.TypeAt(i); |
| 399 if (!type_extends.IsVarType()) { | 399 if (!type_extends.IsDynamicType()) { |
| 400 type = arguments.TypeAt(offset + i); | 400 type = arguments.TypeAt(offset + i); |
| 401 if (type.IsInstantiated()) { | 401 if (type.IsInstantiated()) { |
| 402 if (!type_extends.IsInstantiated()) { | 402 if (!type_extends.IsInstantiated()) { |
| 403 type_extends = type_extends.InstantiateFrom(arguments, offset); | 403 type_extends = type_extends.InstantiateFrom(arguments, offset); |
| 404 } | 404 } |
| 405 // TODO(regis): Where do we check the constraints when the type is | 405 // TODO(regis): Where do we check the constraints when the type is |
| 406 // generic? | 406 // generic? |
| 407 if (!type.IsSubtypeOf(type_extends)) { | 407 if (!type.IsSubtypeOf(type_extends)) { |
| 408 const String& type_name = String::Handle(type.Name()); | 408 const String& type_name = String::Handle(type.Name()); |
| 409 const String& extends_name = String::Handle(type_extends.Name()); | 409 const String& extends_name = String::Handle(type_extends.Name()); |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 } | 489 } |
| 490 // The full type argument vector consists of the type arguments of the | 490 // The full type argument vector consists of the type arguments of the |
| 491 // super types of type_class, which may be initialized from the parsed | 491 // super types of type_class, which may be initialized from the parsed |
| 492 // type arguments, followed by the parsed type arguments. | 492 // type arguments, followed by the parsed type arguments. |
| 493 if (num_type_arguments > 0) { | 493 if (num_type_arguments > 0) { |
| 494 const TypeArguments& full_arguments = TypeArguments::Handle( | 494 const TypeArguments& full_arguments = TypeArguments::Handle( |
| 495 TypeArguments::NewTypeArray(num_type_arguments)); | 495 TypeArguments::NewTypeArray(num_type_arguments)); |
| 496 // Copy the parsed type arguments at the correct offset in the full type | 496 // Copy the parsed type arguments at the correct offset in the full type |
| 497 // argument vector. | 497 // argument vector. |
| 498 const intptr_t offset = num_type_arguments - num_type_parameters; | 498 const intptr_t offset = num_type_arguments - num_type_parameters; |
| 499 Type& type = Type::Handle(Type::VarType()); | 499 Type& type = Type::Handle(Type::DynamicType()); |
| 500 for (intptr_t i = 0; i < num_type_parameters; i++) { | 500 for (intptr_t i = 0; i < num_type_parameters; i++) { |
| 501 // If no type parameters were provided, a raw type is desired, so we | 501 // If no type parameters were provided, a raw type is desired, so we |
| 502 // create a vector of VarType. | 502 // create a vector of DynamicType. |
| 503 if (!arguments.IsNull()) { | 503 if (!arguments.IsNull()) { |
| 504 type = arguments.TypeAt(i); | 504 type = arguments.TypeAt(i); |
| 505 } | 505 } |
| 506 full_arguments.SetTypeAt(offset + i, type); | 506 full_arguments.SetTypeAt(offset + i, type); |
| 507 } | 507 } |
| 508 FinalizeTypeArguments(type_class, full_arguments); | 508 FinalizeTypeArguments(type_class, full_arguments); |
| 509 parameterized_type.set_arguments(full_arguments); | 509 parameterized_type.set_arguments(full_arguments); |
| 510 } | 510 } |
| 511 | 511 |
| 512 // If the type is a function type, finalize the result and parameter types. | 512 // If the type is a function type, finalize the result and parameter types. |
| (...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1012 ASSERT(msg_buffer != NULL); | 1012 ASSERT(msg_buffer != NULL); |
| 1013 va_list args; | 1013 va_list args; |
| 1014 va_start(args, format); | 1014 va_start(args, format); |
| 1015 OS::VSNPrint(msg_buffer, kBufferLength, format, args); | 1015 OS::VSNPrint(msg_buffer, kBufferLength, format, args); |
| 1016 va_end(args); | 1016 va_end(args); |
| 1017 isolate->long_jump_base()->Jump(1, msg_buffer); | 1017 isolate->long_jump_base()->Jump(1, msg_buffer); |
| 1018 UNREACHABLE(); | 1018 UNREACHABLE(); |
| 1019 } | 1019 } |
| 1020 | 1020 |
| 1021 } // namespace dart | 1021 } // namespace dart |
| OLD | NEW |