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

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

Issue 8329005: Replace calls to Class::IsParameterized() by either (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 9 years, 2 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
OLDNEW
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/object.h" 5 #include "vm/object.h"
6 6
7 #include "vm/assembler.h" 7 #include "vm/assembler.h"
8 #include "vm/assert.h" 8 #include "vm/assert.h"
9 #include "vm/bigint_operations.h" 9 #include "vm/bigint_operations.h"
10 #include "vm/bootstrap.h" 10 #include "vm/bootstrap.h"
(...skipping 820 matching lines...) Expand 10 before | Expand all | Expand 10 after
831 const Array& type_params = Array::Handle(type_parameters()); 831 const Array& type_params = Array::Handle(type_parameters());
832 if (type_params.IsNull()) { 832 if (type_params.IsNull()) {
833 return 0; 833 return 0;
834 } else { 834 } else {
835 return type_params.Length(); 835 return type_params.Length();
836 } 836 }
837 } 837 }
838 838
839 839
840 intptr_t Class::NumTypeArguments() const { 840 intptr_t Class::NumTypeArguments() const {
841 // To work properly, this call requires the super class of this class to be
842 // resolved, which is checked by the SuperClass() call.
841 intptr_t num_type_args = NumTypeParameters(); 843 intptr_t num_type_args = NumTypeParameters();
842 const Class& superclass = Class::Handle(SuperClass()); 844 const Class& superclass = Class::Handle(SuperClass());
843 // Object is its own super class during bootstrap. 845 // Object is its own super class during bootstrap.
844 if (!superclass.IsNull() && (superclass.raw() != raw())) { 846 if (!superclass.IsNull() && (superclass.raw() != raw())) {
845 num_type_args += superclass.NumTypeArguments(); 847 num_type_args += superclass.NumTypeArguments();
846 } 848 }
847 return num_type_args; 849 return num_type_args;
848 } 850 }
849 851
850 852
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
1014 const Function& signature_function, 1016 const Function& signature_function,
1015 const Script& script, 1017 const Script& script,
1016 intptr_t token_index) { 1018 intptr_t token_index) {
1017 ASSERT(!signature_function.IsNull()); 1019 ASSERT(!signature_function.IsNull());
1018 Type& super_type = Type::Handle(Type::ObjectType()); 1020 Type& super_type = Type::Handle(Type::ObjectType());
1019 const Class& owner_class = Class::Handle(signature_function.owner()); 1021 const Class& owner_class = Class::Handle(signature_function.owner());
1020 ASSERT(!owner_class.IsNull()); 1022 ASSERT(!owner_class.IsNull());
1021 Array& type_parameters = Array::Handle(); 1023 Array& type_parameters = Array::Handle();
1022 TypeArray& type_parameter_extends = TypeArray::Handle(); 1024 TypeArray& type_parameter_extends = TypeArray::Handle();
1023 if (!signature_function.is_static()) { 1025 if (!signature_function.is_static()) {
1024 if (owner_class.IsParameterized() && 1026 if ((owner_class.NumTypeParameters() > 0) &&
1025 !signature_function.HasInstantiatedSignature()) { 1027 !signature_function.HasInstantiatedSignature()) {
1026 // Share the function owner super class as the super class of the 1028 // Share the function owner super class as the super class of the
1027 // signature class, so that the type argument vector of the closure at 1029 // signature class, so that the type argument vector of the closure at
1028 // run time matches the type argument vector of the closure instantiator. 1030 // run time matches the type argument vector of the closure instantiator.
1029 type_parameters = owner_class.type_parameters(); 1031 type_parameters = owner_class.type_parameters();
1030 type_parameter_extends = owner_class.type_parameter_extends(); 1032 type_parameter_extends = owner_class.type_parameter_extends();
1031 if (!owner_class.is_interface()) { 1033 if (!owner_class.is_interface()) {
1032 super_type = owner_class.super_type(); 1034 super_type = owner_class.super_type();
1033 } 1035 }
1034 } 1036 }
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
1207 const TypeArguments& other_type_arguments) const { 1209 const TypeArguments& other_type_arguments) const {
1208 // Check for VarType. 1210 // Check for VarType.
1209 // The VarType on the lefthand side is replaced by the bottom type, which is 1211 // The VarType on the lefthand side is replaced by the bottom type, which is
1210 // more specific than any type. 1212 // more specific than any type.
1211 // Any type is more specific than the VarType on the righthand side. 1213 // Any type is more specific than the VarType on the righthand side.
1212 if (IsVarClass() || other.IsVarClass()) { 1214 if (IsVarClass() || other.IsVarClass()) {
1213 return true; 1215 return true;
1214 } 1216 }
1215 // Check for reflexivity. 1217 // Check for reflexivity.
1216 if (raw() == other.raw()) { 1218 if (raw() == other.raw()) {
1217 if (!IsParameterized()) { 1219 const intptr_t len = NumTypeArguments();
1220 if (len == 0) {
1218 return true; 1221 return true;
1219 } 1222 }
1220 // Since we do not truncate the type argument vector of a subclass (see 1223 // Since we do not truncate the type argument vector of a subclass (see
1221 // below), we only check a prefix of the proper length. 1224 // below), we only check a prefix of the proper length.
1222 const intptr_t len = NumTypeArguments();
1223 // Check for covariance. 1225 // Check for covariance.
1224 if (type_arguments.IsNull() || 1226 if (type_arguments.IsNull() ||
1225 other_type_arguments.IsNull() || 1227 other_type_arguments.IsNull() ||
1226 type_arguments.IsVarTypes(len) || 1228 type_arguments.IsVarTypes(len) ||
1227 other_type_arguments.IsVarTypes(len)) { 1229 other_type_arguments.IsVarTypes(len)) {
1228 return true; 1230 return true;
1229 } 1231 }
1230 return type_arguments.IsMoreSpecificThan(other_type_arguments, len); 1232 return type_arguments.IsMoreSpecificThan(other_type_arguments, len);
1231 } 1233 }
1232 // Check for 'direct super type' in the case of an interface and check for 1234 // Check for 'direct super type' in the case of an interface and check for
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
1329 } 1331 }
1330 // TODO(regis): Merge IsMoreSpecificThan here after type checks for 1332 // TODO(regis): Merge IsMoreSpecificThan here after type checks for
1331 // function types are finalized and implemented. 1333 // function types are finalized and implemented.
1332 // For now, keep the assert below. 1334 // For now, keep the assert below.
1333 1335
1334 // The optionality and dubious bliss rules described in the guide have 1336 // The optionality and dubious bliss rules described in the guide have
1335 // already been checked in IsMoreSpecificThan call above. 1337 // already been checked in IsMoreSpecificThan call above.
1336 if (raw() != other.raw()) { 1338 if (raw() != other.raw()) {
1337 return false; 1339 return false;
1338 } 1340 }
1339 ASSERT(IsParameterized()); // Otherwise IsMoreSpecificThan would be true. 1341 ASSERT(NumTypeArguments() > 0); // Or IsMoreSpecificThan would be true.
1340 return false; 1342 return false;
1341 } 1343 }
1342 1344
1343 1345
1344 RawFunction* Class::LookupDynamicFunction(const String& name) const { 1346 RawFunction* Class::LookupDynamicFunction(const String& name) const {
1345 Function& function = Function::Handle(LookupFunction(name)); 1347 Function& function = Function::Handle(LookupFunction(name));
1346 if (function.IsNull() || function.is_static()) { 1348 if (function.IsNull() || function.is_static()) {
1347 return Function::null(); 1349 return Function::null();
1348 } 1350 }
1349 switch (function.kind()) { 1351 switch (function.kind()) {
(...skipping 3121 matching lines...) Expand 10 before | Expand all | Expand 10 after
4471 return this->raw(); 4473 return this->raw();
4472 } 4474 }
4473 4475
4474 4476
4475 RawType* Instance::GetType() const { 4477 RawType* Instance::GetType() const {
4476 if (IsNull()) { 4478 if (IsNull()) {
4477 return Type::NullType(); 4479 return Type::NullType();
4478 } 4480 }
4479 const Class& cls = Class::Handle(clazz()); 4481 const Class& cls = Class::Handle(clazz());
4480 TypeArguments& type_arguments = TypeArguments::Handle(); 4482 TypeArguments& type_arguments = TypeArguments::Handle();
4481 if (cls.IsParameterized()) { 4483 if (cls.NumTypeArguments() > 0) {
4482 type_arguments = GetTypeArguments(); 4484 type_arguments = GetTypeArguments();
4483 } 4485 }
4484 return Type::NewParameterizedType(cls, type_arguments); 4486 return Type::NewParameterizedType(cls, type_arguments);
4485 } 4487 }
4486 4488
4487 4489
4488 RawTypeArguments* Instance::GetTypeArguments() const { 4490 RawTypeArguments* Instance::GetTypeArguments() const {
4489 const Class& cls = Class::Handle(clazz()); 4491 const Class& cls = Class::Handle(clazz());
4490 intptr_t field_offset = cls.type_arguments_instance_field_offset(); 4492 intptr_t field_offset = cls.type_arguments_instance_field_offset();
4491 ASSERT(field_offset != Class::kNoTypeArguments); 4493 ASSERT(field_offset != Class::kNoTypeArguments);
(...skipping 27 matching lines...) Expand all
4519 return true; 4521 return true;
4520 } 4522 }
4521 return false; 4523 return false;
4522 } else { 4524 } else {
4523 ASSERT(test == Type::kIsAssignableTo); 4525 ASSERT(test == Type::kIsAssignableTo);
4524 return true; 4526 return true;
4525 } 4527 }
4526 } 4528 }
4527 const Class& cls = Class::Handle(clazz()); 4529 const Class& cls = Class::Handle(clazz());
4528 TypeArguments& type_arguments = TypeArguments::Handle(); 4530 TypeArguments& type_arguments = TypeArguments::Handle();
4529 if (cls.IsParameterized()) { 4531 const intptr_t num_type_arguments = cls.NumTypeArguments();
4532 if (num_type_arguments > 0) {
4530 type_arguments = GetTypeArguments(); 4533 type_arguments = GetTypeArguments();
4531 // Verify that the number of type arguments in the instance matches the 4534 // Verify that the number of type arguments in the instance matches the
4532 // number of type arguments expected by the instance class. 4535 // number of type arguments expected by the instance class.
4533 // A discrepancy is allowed for closures, which borrow the type argument 4536 // A discrepancy is allowed for closures, which borrow the type argument
4534 // vector of their instantiator, which may be of a super class of the class 4537 // vector of their instantiator, which may be of a super class of the class
4535 // defining the closure. Truncating the vector to the correct length on 4538 // defining the closure. Truncating the vector to the correct length on
4536 // instantiation is unnecessary. The vector may therefore be longer. 4539 // instantiation is unnecessary. The vector may therefore be longer.
4537 ASSERT(type_arguments.IsNull() || 4540 ASSERT(type_arguments.IsNull() ||
4538 (type_arguments.Length() == cls.NumTypeArguments()) || 4541 (type_arguments.Length() == num_type_arguments) ||
4539 (cls.IsSignatureClass() && 4542 (cls.IsSignatureClass() &&
4540 (type_arguments.Length() > cls.NumTypeArguments()))); 4543 (type_arguments.Length() > num_type_arguments)));
4541 } 4544 }
4542 Class& other_class = Class::Handle(); 4545 Class& other_class = Class::Handle();
4543 TypeArguments& other_type_arguments = TypeArguments::Handle(); 4546 TypeArguments& other_type_arguments = TypeArguments::Handle();
4544 // In case 'other' is not instantiated, we could simply call 4547 // In case 'other' is not instantiated, we could simply call
4545 // other.InstantiateFrom(other_instantiator, 0), however, we can save the 4548 // other.InstantiateFrom(other_instantiator, 0), however, we can save the
4546 // allocation of a new Type by inlining the code. 4549 // allocation of a new Type by inlining the code.
4547 if (other.IsTypeParameter()) { 4550 if (other.IsTypeParameter()) {
4548 Type& instantiated_other = Type::Handle(); 4551 Type& instantiated_other = Type::Handle();
4549 if (!other_instantiator.IsNull()) { 4552 if (!other_instantiator.IsNull()) {
4550 instantiated_other = other_instantiator.TypeAt(other.Index()); 4553 instantiated_other = other_instantiator.TypeAt(other.Index());
(...skipping 1904 matching lines...) Expand 10 before | Expand all | Expand 10 after
6455 const String& str = String::Handle(pattern()); 6458 const String& str = String::Handle(pattern());
6456 const char* format = "JSRegExp: pattern=%s flags=%s"; 6459 const char* format = "JSRegExp: pattern=%s flags=%s";
6457 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags()); 6460 intptr_t len = OS::SNPrint(NULL, 0, format, str.ToCString(), Flags());
6458 char* chars = reinterpret_cast<char*>( 6461 char* chars = reinterpret_cast<char*>(
6459 Isolate::Current()->current_zone()->Allocate(len + 1)); 6462 Isolate::Current()->current_zone()->Allocate(len + 1));
6460 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags()); 6463 OS::SNPrint(chars, (len + 1), format, str.ToCString(), Flags());
6461 return chars; 6464 return chars;
6462 } 6465 }
6463 6466
6464 } // namespace dart 6467 } // namespace dart
OLDNEW
« runtime/vm/object.h ('K') | « runtime/vm/object.h ('k') | runtime/vm/parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698