Version 1.10.1

svn merge -c 45598 https://dart.googlecode.com/svn/branches/bleeding_edge 1.10
svn merge -c 45617 https://dart.googlecode.com/svn/branches/bleeding_edge 1.10
svn merge -c 45620 https://dart.googlecode.com/svn/branches/bleeding_edge 1.10
svn merge -c 45626 https://dart.googlecode.com/svn/branches/bleeding_edge 1.10


git-svn-id: http://dart.googlecode.com/svn/branches/1.10@45692 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 1ea33f3..906375a 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -1683,6 +1683,13 @@
           param ^= mixin_type_args.TypeAt(i);
           param_bound = param.bound();
           if (!param_bound.IsInstantiated()) {
+            // Make sure the bound is finalized before instantiating it.
+            if (!param_bound.IsFinalized() &&
+                !param_bound.IsBeingFinalized()) {
+              param_bound =
+                  FinalizeType(mixin_app_class, param_bound, kCanonicalize);
+              param.set_bound(param_bound);  // In case part of recursive type.
+            }
             param_bound = param_bound.InstantiateFrom(mixin_type_args,
                                                       &bound_error);
             // The instantiator contains only TypeParameter objects and no
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index f80f10b..c8b4c55 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -15043,41 +15043,39 @@
 
 
 const char* Type::ToCString() const {
-  if (IsResolved()) {
-    const TypeArguments& type_arguments = TypeArguments::Handle(arguments());
-    const char* class_name;
-    if (HasResolvedTypeClass()) {
-      class_name = String::Handle(
-          Class::Handle(type_class()).Name()).ToCString();
-    } else {
-      class_name = UnresolvedClass::Handle(unresolved_class()).ToCString();
-    }
-    if (type_arguments.IsNull()) {
-      const char* format = "Type: class '%s'";
-      const intptr_t len = OS::SNPrint(NULL, 0, format, class_name) + 1;
-      char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
-      OS::SNPrint(chars, len, format, class_name);
-      return chars;
-    } else if (IsFinalized() && IsRecursive()) {
-      const char* format = "Type: (@%" Px " H%" Px ") class '%s', args:[%s]";
-      const intptr_t hash = Hash();
-      const char* args_cstr = TypeArguments::Handle(arguments()).ToCString();
-      const intptr_t len =
-          OS::SNPrint(NULL, 0, format, raw(), hash, class_name, args_cstr) + 1;
-      char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
-      OS::SNPrint(chars, len, format, raw(), hash, class_name, args_cstr);
-      return chars;
-    } else {
-      const char* format = "Type: class '%s', args:[%s]";
-      const char* args_cstr = TypeArguments::Handle(arguments()).ToCString();
-      const intptr_t len =
-          OS::SNPrint(NULL, 0, format, class_name, args_cstr) + 1;
-      char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
-      OS::SNPrint(chars, len, format, class_name, args_cstr);
-      return chars;
-    }
+  const char* unresolved = IsResolved() ? "" : "Unresolved ";
+  const TypeArguments& type_arguments = TypeArguments::Handle(arguments());
+  const char* class_name;
+  if (HasResolvedTypeClass()) {
+    class_name = String::Handle(
+        Class::Handle(type_class()).Name()).ToCString();
   } else {
-    return "Unresolved Type";
+    class_name = UnresolvedClass::Handle(unresolved_class()).ToCString();
+  }
+  if (type_arguments.IsNull()) {
+    const char* format = "%sType: class '%s'";
+    const intptr_t len =
+        OS::SNPrint(NULL, 0, format, unresolved, class_name) + 1;
+    char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
+    OS::SNPrint(chars, len, format, unresolved, class_name);
+    return chars;
+  } else if (IsResolved() && IsFinalized() && IsRecursive()) {
+    const char* format = "Type: (@%" Px " H%" Px ") class '%s', args:[%s]";
+    const intptr_t hash = Hash();
+    const char* args_cstr = TypeArguments::Handle(arguments()).ToCString();
+    const intptr_t len =
+        OS::SNPrint(NULL, 0, format, raw(), hash, class_name, args_cstr) + 1;
+    char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
+    OS::SNPrint(chars, len, format, raw(), hash, class_name, args_cstr);
+    return chars;
+  } else {
+    const char* format = "%sType: class '%s', args:[%s]";
+    const char* args_cstr = TypeArguments::Handle(arguments()).ToCString();
+    const intptr_t len =
+        OS::SNPrint(NULL, 0, format, unresolved, class_name, args_cstr) + 1;
+    char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
+    OS::SNPrint(chars, len, format, unresolved, class_name, args_cstr);
+    return chars;
   }
 }
 
diff --git a/tools/VERSION b/tools/VERSION
index 58e7d4f..846932b 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -26,6 +26,6 @@
 CHANNEL stable
 MAJOR 1
 MINOR 10
-PATCH 0
+PATCH 1
 PRERELEASE 0
 PRERELEASE_PATCH 0