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

Unified Diff: runtime/vm/object.cc

Issue 75713002: Distinguish between malformed and malbounded types more efficiently using the (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 1 month 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/parser.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/object.cc
===================================================================
--- runtime/vm/object.cc (revision 30381)
+++ runtime/vm/object.cc (working copy)
@@ -62,7 +62,6 @@
DECLARE_FLAG(bool, eliminate_type_checks);
DECLARE_FLAG(bool, enable_type_checks);
DECLARE_FLAG(bool, error_on_bad_override);
-DECLARE_FLAG(bool, error_on_bad_type);
DECLARE_FLAG(bool, trace_compiler);
DECLARE_FLAG(bool, trace_deoptimization);
DECLARE_FLAG(bool, trace_deoptimization_verbose);
@@ -2853,12 +2852,10 @@
thsi, interface, ClassFinalizer::kCanonicalize);
interfaces.SetAt(i, interface);
}
- error = Error::null();
- if (interface.IsMalboundedWithError(&error)) {
+ if (interface.IsMalbounded()) {
// Return the first bound error to the caller if it requests it.
if ((bound_error != NULL) && bound_error->IsNull()) {
- ASSERT(!error.IsNull());
- *bound_error = error.raw();
+ *bound_error = interface.error();
}
continue; // Another interface may work better.
}
@@ -11412,26 +11409,33 @@
}
-bool AbstractType::IsMalboundedWithError(Error* bound_error) const {
+bool AbstractType::IsMalbounded() const {
// AbstractType is an abstract class.
UNREACHABLE();
return false;
}
-RawError* AbstractType::malformed_error() const {
+bool AbstractType::IsMalformedOrMalbounded() const {
// AbstractType is an abstract class.
UNREACHABLE();
- return Error::null();
+ return false;
}
-void AbstractType::set_malformed_error(const Error& value) const {
+RawLanguageError* AbstractType::error() const {
// AbstractType is an abstract class.
UNREACHABLE();
+ return LanguageError::null();
}
+void AbstractType::set_error(const LanguageError& value) const {
+ // AbstractType is an abstract class.
+ UNREACHABLE();
+}
+
+
bool AbstractType::Equals(const Instance& other) const {
// AbstractType is an abstract class.
ASSERT(raw() == AbstractType::null());
@@ -11655,16 +11659,14 @@
if (IsMalbounded()) {
ASSERT(FLAG_enable_type_checks);
if ((bound_error != NULL) && bound_error->IsNull()) {
- const bool is_malbounded = IsMalboundedWithError(bound_error);
- ASSERT(is_malbounded);
+ *bound_error = error();
}
return false;
}
if (other.IsMalbounded()) {
ASSERT(FLAG_enable_type_checks);
if ((bound_error != NULL) && bound_error->IsNull()) {
- const bool other_is_malbounded = other.IsMalboundedWithError(bound_error);
- ASSERT(other_is_malbounded);
+ *bound_error = other.error();
}
return false;
}
@@ -11843,42 +11845,41 @@
bool Type::IsMalformed() const {
- return raw_ptr()->malformed_error_ != Error::null();
+ if (raw_ptr()->error_ == LanguageError::null()) {
+ return false;
+ }
+ const LanguageError& type_error = LanguageError::Handle(error());
+ return type_error.kind() == LanguageError::kMalformedType;
}
-bool Type::IsMalboundedWithError(Error* bound_error) const {
- if (!FLAG_enable_type_checks && !FLAG_error_on_bad_type) {
+bool Type::IsMalbounded() const {
+ if (!FLAG_enable_type_checks) {
return false;
}
- ASSERT(IsResolved());
- ASSERT(!IsMalformed()); // Must be checked first.
- if (arguments() == AbstractTypeArguments::null()) {
+ if (raw_ptr()->error_ == LanguageError::null()) {
return false;
}
- const AbstractTypeArguments& type_arguments =
- AbstractTypeArguments::Handle(arguments());
- const intptr_t num_type_args = type_arguments.Length();
- AbstractType& type_arg = AbstractType::Handle();
- for (intptr_t i = 0; i < num_type_args; i++) {
- type_arg = type_arguments.TypeAt(i);
- ASSERT(!type_arg.IsNull());
- if (type_arg.IsMalboundedWithError(bound_error)) {
- return true;
- }
- }
- return false;
+ const LanguageError& type_error = LanguageError::Handle(error());
+ return type_error.kind() == LanguageError::kMalboundedType;
}
-void Type::set_malformed_error(const Error& value) const {
- StorePointer(&raw_ptr()->malformed_error_, value.raw());
+bool Type::IsMalformedOrMalbounded() const {
+ if (raw_ptr()->error_ == LanguageError::null()) {
+ return false;
+ }
+ const LanguageError& type_error = LanguageError::Handle(error());
+ if (type_error.kind() == LanguageError::kMalformedType) {
+ return true;
+ }
+ ASSERT(type_error.kind() == LanguageError::kMalboundedType);
+ return FLAG_enable_type_checks;
}
-RawError* Type::malformed_error() const {
- ASSERT(IsMalformed());
- return raw_ptr()->malformed_error_;
+void Type::set_error(const LanguageError& value) const {
+ StorePointer(&raw_ptr()->error_, value.raw());
}
@@ -12382,26 +12383,21 @@
}
-bool BoundedType::IsMalboundedWithError(Error* bound_error) const {
- if (FLAG_enable_type_checks || FLAG_error_on_bad_type) {
- const AbstractType& upper_bound = AbstractType::Handle(bound());
- if (upper_bound.IsMalformed()) {
- if (bound_error != NULL) {
- *bound_error = upper_bound.malformed_error();
- ASSERT(!bound_error->IsNull());
- }
- return true;
- }
- }
- return AbstractType::Handle(type()).IsMalboundedWithError(bound_error);
+bool BoundedType::IsMalbounded() const {
+ return AbstractType::Handle(type()).IsMalbounded();
}
-RawError* BoundedType::malformed_error() const {
- return AbstractType::Handle(type()).malformed_error();
+bool BoundedType::IsMalformedOrMalbounded() const {
+ return AbstractType::Handle(type()).IsMalformedOrMalbounded();
}
+RawLanguageError* BoundedType::error() const {
+ return AbstractType::Handle(type()).error();
+}
+
+
bool BoundedType::Equals(const Instance& other) const {
// BoundedType are not canonicalized, because their bound may get finalized
// after the BoundedType is created and initialized.
@@ -12545,28 +12541,20 @@
const char* BoundedType::ToCString() const {
- const char* format = "BoundedType: type %s; bound: %s; type param: %s%s%s";
+ const char* format = "BoundedType: type %s; bound: %s; type param: %s of %s";
const char* type_cstr = String::Handle(AbstractType::Handle(
type()).Name()).ToCString();
const char* bound_cstr = String::Handle(AbstractType::Handle(
bound()).Name()).ToCString();
const TypeParameter& type_param = TypeParameter::Handle(type_parameter());
- const char* type_param_cstr = "null";
- const char* of_cstr = "";
- const char* cls_cstr = "";
- if (!type_param.IsNull()) {
- type_param_cstr = String::Handle(type_param.name()).ToCString();
- const Class& cls = Class::Handle(type_param.parameterized_class());
- if (!cls.IsNull()) {
- of_cstr = " of ";
- cls_cstr = String::Handle(cls.Name()).ToCString();
- }
- }
- intptr_t len = OS::SNPrint(NULL, 0, format, type_cstr, bound_cstr,
- type_param_cstr, of_cstr, cls_cstr) + 1;
+ const char* type_param_cstr = String::Handle(type_param.name()).ToCString();
+ const Class& cls = Class::Handle(type_param.parameterized_class());
+ const char* cls_cstr = String::Handle(cls.Name()).ToCString();
+ intptr_t len = OS::SNPrint(
+ NULL, 0, format, type_cstr, bound_cstr, type_param_cstr, cls_cstr) + 1;
char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
- OS::SNPrint(chars, len, format, type_cstr, bound_cstr, type_param_cstr,
- of_cstr, cls_cstr);
+ OS::SNPrint(
+ chars, len, format, type_cstr, bound_cstr, type_param_cstr, cls_cstr);
return chars;
}
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698