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

Unified Diff: runtime/vm/code_generator.cc

Issue 12473002: Complete implementation of bounds checking in the vm, by introducing a vm object (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/class_finalizer.cc ('k') | runtime/vm/flow_graph_builder.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/code_generator.cc
===================================================================
--- runtime/vm/code_generator.cc (revision 19513)
+++ runtime/vm/code_generator.cc (working copy)
@@ -181,7 +181,6 @@
AbstractTypeArguments::CheckedHandle(arguments.ArgAt(1));
ASSERT(type_arguments.IsNull() ||
(type_arguments.Length() == cls.NumTypeArguments()));
- AbstractTypeArguments& bounds_instantiator = AbstractTypeArguments::Handle();
if (Object::Handle(arguments.ArgAt(2)).IsSmi()) {
ASSERT(Smi::CheckedHandle(arguments.ArgAt(2)).Value() ==
StubCode::kNoInstantiator);
@@ -190,36 +189,29 @@
const AbstractTypeArguments& instantiator =
AbstractTypeArguments::CheckedHandle(arguments.ArgAt(2));
ASSERT(instantiator.IsNull() || instantiator.IsInstantiated());
+ Error& malformed_error = Error::Handle();
if (instantiator.IsNull()) {
- type_arguments =
- InstantiatedTypeArguments::New(type_arguments, instantiator);
+ type_arguments = type_arguments.InstantiateFrom(instantiator,
+ &malformed_error);
} else if (instantiator.IsTypeArguments()) {
// Code inlined in the caller should have optimized the case where the
// instantiator is a TypeArguments and can be used as type argument
// vector.
ASSERT(!type_arguments.IsUninstantiatedIdentity() ||
(instantiator.Length() != type_arguments.Length()));
- type_arguments =
- InstantiatedTypeArguments::New(type_arguments, instantiator);
+ type_arguments = type_arguments.InstantiateFrom(instantiator,
+ &malformed_error);
} else {
// If possible, use the instantiator as the type argument vector.
if (type_arguments.IsUninstantiatedIdentity() &&
(instantiator.Length() == type_arguments.Length())) {
type_arguments = instantiator.raw();
} else {
- type_arguments =
- InstantiatedTypeArguments::New(type_arguments, instantiator);
+ type_arguments = type_arguments.InstantiateFrom(instantiator,
+ &malformed_error);
}
}
- bounds_instantiator = instantiator.raw();
- }
- if (!type_arguments.IsNull()) {
- ASSERT(type_arguments.IsInstantiated());
- Error& malformed_error = Error::Handle();
- if (!type_arguments.IsWithinBoundsOf(cls,
- bounds_instantiator,
- &malformed_error)) {
- ASSERT(!malformed_error.IsNull());
+ if (!malformed_error.IsNull()) {
// Throw a dynamic type error.
const intptr_t location = GetCallerLocation();
String& malformed_error_message = String::Handle(
@@ -230,6 +222,7 @@
UNREACHABLE();
}
}
+ ASSERT(type_arguments.IsNull() || type_arguments.IsInstantiated());
instance.SetTypeArguments(type_arguments);
}
@@ -373,8 +366,9 @@
caller_frame->pc());
} else {
// Instantiate type before printing.
- const AbstractType& instantiated_type =
- AbstractType::Handle(type.InstantiateFrom(instantiator_type_arguments));
+ Error& malformed_error = Error::Handle();
+ const AbstractType& instantiated_type = AbstractType::Handle(
+ type.InstantiateFrom(instantiator_type_arguments, &malformed_error));
OS::PrintErr("%s: '%s' %s '%s' instantiated from '%s' (pc: %#"Px").\n",
message,
String::Handle(instance_type.Name()).ToCString(),
@@ -382,6 +376,9 @@
String::Handle(instantiated_type.Name()).ToCString(),
String::Handle(type.Name()).ToCString(),
caller_frame->pc());
+ if (!malformed_error.IsNull()) {
+ OS::Print(" malformed error: %s\n", malformed_error.ToErrorCString());
+ }
}
const Function& function = Function::Handle(
caller_frame->LookupDartFunction());
@@ -413,7 +410,10 @@
uninstantiated =
instantiated_type_arguments.uninstantiated_type_arguments();
instantiator = instantiated_type_arguments.instantiator_type_arguments();
- type_arguments = uninstantiated.InstantiateFrom(instantiator);
+ Error& malformed_error = Error::Handle();
+ type_arguments = uninstantiated.InstantiateFrom(instantiator,
+ &malformed_error);
+ ASSERT(malformed_error.IsNull()); // Malformed types are not optimized.
} while (type_arguments.IsInstantiatedTypeArguments());
AbstractTypeArguments& new_type_arguments = AbstractTypeArguments::Handle();
new_type_arguments = type_arguments.Canonicalize();
@@ -516,7 +516,10 @@
if (FLAG_trace_type_checks) {
AbstractType& test_type = AbstractType::Handle(type.raw());
if (!test_type.IsInstantiated()) {
- test_type = type.InstantiateFrom(instantiator_type_arguments);
+ Error& malformed_error = Error::Handle();
+ test_type = type.InstantiateFrom(instantiator_type_arguments,
+ &malformed_error);
+ ASSERT(malformed_error.IsNull()); // Malformed types are not optimized.
}
OS::PrintErr(" Updated test cache %p ix: %"Pd" with (%"Pd", %p, %p, %s)\n"
" [%p %s %"Pd", %p %s]\n"
@@ -631,7 +634,8 @@
if (!dst_type.IsInstantiated()) {
// Instantiate dst_type before reporting the error.
const AbstractType& instantiated_dst_type = AbstractType::Handle(
- dst_type.InstantiateFrom(instantiator_type_arguments));
+ dst_type.InstantiateFrom(instantiator_type_arguments, NULL));
+ // Note that instantiated_dst_type may be malformed.
dst_type_name = instantiated_dst_type.UserVisibleName();
} else {
dst_type_name = dst_type.UserVisibleName();
« no previous file with comments | « runtime/vm/class_finalizer.cc ('k') | runtime/vm/flow_graph_builder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698