Version 0.7.6.4 .

svn merge -c 28079 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 28107 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@28108 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 285f385..dff2717 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -504,13 +504,9 @@
 
 void ClassFinalizer::FinalizeTypeParameters(const Class& cls) {
   if (cls.IsMixinApplication()) {
-    // Copy the type parameters to the mixin application.
+    // Setup the type parameters of the mixin application and finalize the
+    // mixin type.
     ApplyMixinType(cls);
-    // Finalize the mixin type.
-    Type& mixin_type = Type::Handle(cls.mixin());
-    mixin_type ^= FinalizeType(cls, mixin_type, kCanonicalizeWellFormed);
-    // TODO(regis): Check for a malbounded mixin_type.
-    cls.set_mixin(mixin_type);
   }
   // The type parameter bounds are not finalized here.
   const TypeArguments& type_parameters =
@@ -743,8 +739,14 @@
     // parameterized class.
     const intptr_t offset = parameterized_class.NumTypeArguments() -
                             parameterized_class.NumTypeParameters();
-    type_parameter.set_index(type_parameter.index() + offset);
-    type_parameter.set_is_finalized();
+    // Calling NumTypeParameters() may finalize this type parameter if it
+    // belongs to a mixin application class.
+    if (!type_parameter.IsFinalized()) {
+      type_parameter.set_index(type_parameter.index() + offset);
+      type_parameter.set_is_finalized();
+    } else {
+      ASSERT(cls.IsMixinApplication());
+    }
     // We do not canonicalize type parameters.
     return type_parameter.raw();
   }
@@ -1682,7 +1684,17 @@
                   mixin_app_class.type_parameters()).ToCString(),
               AbstractType::Handle(mixin_app_class.super_type()).ToCString());
   }
+  // Mark the application class as having been applied its mixin type in order
+  // to avoid cycles while finalizing its mixin type.
   mixin_app_class.set_is_mixin_type_applied();
+  // Finalize the mixin type, which may have been changed in case
+  // mixin_app_class is a typedef.
+  mixin_type = mixin_app_class.mixin();
+  ASSERT(!mixin_type.IsBeingFinalized());
+  mixin_type ^=
+      FinalizeType(mixin_app_class, mixin_type, kCanonicalizeWellFormed);
+  // TODO(regis): Check for a malbounded mixin_type.
+  mixin_app_class.set_mixin(mixin_type);
 }
 
 
@@ -2130,6 +2142,8 @@
     if (num_type_arguments == num_type_parameters) {
       for (intptr_t i = 0; i < num_type_arguments; i++) {
         arg = type_args.TypeAt(i);
+        arg = arg.CloneUnfinalized();
+        ASSERT(!arg.IsBeingFinalized());
         collected_args.Add(arg);
       }
       return;
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index d7ad1f5..421ff4a 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -1706,16 +1706,15 @@
   // resolved, which is checked by the type_class() call on the super type.
   // Note that calling type_class() on a MixinAppType fails.
   Isolate* isolate = Isolate::Current();
-  ReusableHandleScope reused_handles(isolate);
-  Class& cls = reused_handles.ClassHandle();
-  TypeArguments& type_params = reused_handles.TypeArgumentsHandle();
-  AbstractType& sup_type = reused_handles.AbstractTypeHandle();
+  Class& cls = Class::Handle(isolate);
+  TypeArguments& type_params = TypeArguments::Handle(isolate);
+  AbstractType& sup_type = AbstractType::Handle(isolate);
   cls ^= raw();
   intptr_t num_type_args = 0;
 
   do {
     if (cls.IsSignatureClass()) {
-      Function& signature_fun = reused_handles.FunctionHandle();
+      Function& signature_fun = Function::Handle(isolate);
       signature_fun ^= cls.signature_function();
       if (!signature_fun.is_static() &&
           !signature_fun.HasInstantiatedSignature()) {
@@ -3426,6 +3425,20 @@
 }
 
 
+bool TypeArguments::IsFinalized() const {
+  ASSERT(!IsNull());
+  AbstractType& type = AbstractType::Handle();
+  const intptr_t num_types = Length();
+  for (intptr_t i = 0; i < num_types; i++) {
+    type = TypeAt(i);
+    if (!type.IsFinalized()) {
+      return false;
+    }
+  }
+  return true;
+}
+
+
 bool TypeArguments::IsBounded() const {
   AbstractType& type = AbstractType::Handle();
   const intptr_t num_types = Length();
@@ -3582,6 +3595,23 @@
 }
 
 
+RawAbstractTypeArguments* TypeArguments::CloneUnfinalized() const {
+  if (IsFinalized()) {
+    return raw();
+  }
+  AbstractType& type = AbstractType::Handle();
+  const intptr_t num_types = Length();
+  const TypeArguments& clone = TypeArguments::Handle(
+      TypeArguments::New(num_types));
+  for (intptr_t i = 0; i < num_types; i++) {
+    type = TypeAt(i);
+    type = type.CloneUnfinalized();
+    clone.SetTypeAt(i, type);
+  }
+  return clone.raw();
+}
+
+
 RawAbstractTypeArguments* TypeArguments::Canonicalize() const {
   if (IsNull() || IsCanonical()) {
     ASSERT(IsOld());
@@ -10824,6 +10854,13 @@
 }
 
 
+RawAbstractType* AbstractType::CloneUnfinalized() const {
+  // AbstractType is an abstract class.
+  UNREACHABLE();
+  return NULL;
+}
+
+
 RawAbstractType* AbstractType::Canonicalize() const {
   // AbstractType is an abstract class.
   UNREACHABLE();
@@ -11353,6 +11390,20 @@
 }
 
 
+RawAbstractType* Type::CloneUnfinalized() const {
+  ASSERT(IsResolved());
+  if (IsFinalized()) {
+    return raw();
+  }
+  ASSERT(!IsMalformed());  // Malformed types are finalized.
+  ASSERT(!IsBeingFinalized());  // Cloning must occur prior to finalization.
+  AbstractTypeArguments& type_args = AbstractTypeArguments::Handle(arguments());
+  type_args = type_args.CloneUnfinalized();
+  const Class& type_cls = Class::Handle(type_class());
+  return Type::New(type_cls, type_args, token_pos());
+}
+
+
 RawAbstractType* Type::Canonicalize() const {
   ASSERT(IsFinalized());
   if (IsCanonical() || IsMalformed()) {
@@ -11642,6 +11693,19 @@
 }
 
 
+RawAbstractType* TypeParameter::CloneUnfinalized() const {
+  if (IsFinalized()) {
+    return raw();
+  }
+  // No need to clone bound, as it is not part of the finalization state.
+  return TypeParameter::New(Class::Handle(parameterized_class()),
+                            index(),
+                            String::Handle(name()),
+                            AbstractType::Handle(bound()),
+                            token_pos());
+}
+
+
 intptr_t TypeParameter::Hash() const {
   ASSERT(IsFinalized());
   uword result = 0;
@@ -11821,6 +11885,21 @@
 }
 
 
+RawAbstractType* BoundedType::CloneUnfinalized() const {
+  if (IsFinalized()) {
+    return raw();
+  }
+  AbstractType& bounded_type = AbstractType::Handle(type());
+
+  bounded_type = bounded_type.CloneUnfinalized();
+  // No need to clone bound or type parameter, as they are not part of the
+  // finalization state of this bounded type.
+  return BoundedType::New(bounded_type,
+                          AbstractType::Handle(bound()),
+                          TypeParameter::Handle(type_parameter()));
+}
+
+
 intptr_t BoundedType::Hash() const {
   uword result = 0;
   result += AbstractType::Handle(type()).Hash();
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index ffceea0..2caf67d 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1136,6 +1136,9 @@
 // InstantiatedTypeArguments.
 class AbstractTypeArguments : public Object {
  public:
+  // Returns true if all types of this vector are finalized.
+  virtual bool IsFinalized() const { return true; }
+
   // Returns true if both arguments represent vectors of equal types.
   static bool AreEqual(const AbstractTypeArguments& arguments,
                        const AbstractTypeArguments& other_arguments);
@@ -1149,7 +1152,13 @@
       const AbstractTypeArguments& instantiator_type_arguments,
       Error* bound_error) const;
 
-  // Do not canonicalize InstantiatedTypeArguments or NULL objects
+  // Do not clone InstantiatedTypeArguments or null vectors, since they are
+  // considered finalized.
+  virtual RawAbstractTypeArguments* CloneUnfinalized() const {
+    return this->raw();
+  }
+
+  // Do not canonicalize InstantiatedTypeArguments or null vectors.
   virtual RawAbstractTypeArguments* Canonicalize() const { return this->raw(); }
 
   // The name of this type argument vector, e.g. "<T, dynamic, List<T>, Smi>".
@@ -1248,7 +1257,9 @@
   virtual bool IsUninstantiatedIdentity() const;
   virtual bool CanShareInstantiatorTypeArguments(
       const Class& instantiator_class) const;
+  virtual bool IsFinalized() const;
   virtual bool IsBounded() const;
+  virtual RawAbstractTypeArguments* CloneUnfinalized() const;
   // Canonicalize only if instantiated, otherwise returns 'this'.
   virtual RawAbstractTypeArguments* Canonicalize() const;
 
@@ -3852,6 +3863,11 @@
       const AbstractTypeArguments& instantiator_type_arguments,
       Error* bound_error) const;
 
+  // Return a clone of this unfinalized type or the type itself if it is
+  // already finalized. Apply recursively to type arguments, i.e. finalized
+  // type arguments of an unfinalized type are not cloned, but shared.
+  virtual RawAbstractType* CloneUnfinalized() const;
+
   virtual RawInstance* CheckAndCanonicalize(const char** error_str) const {
     return Canonicalize();
   }
@@ -3989,6 +4005,7 @@
   virtual RawAbstractType* InstantiateFrom(
       const AbstractTypeArguments& instantiator_type_arguments,
       Error* malformed_error) const;
+  virtual RawAbstractType* CloneUnfinalized() const;
   virtual RawAbstractType* Canonicalize() const;
 
   virtual intptr_t Hash() const;
@@ -4103,6 +4120,7 @@
   virtual RawAbstractType* InstantiateFrom(
       const AbstractTypeArguments& instantiator_type_arguments,
       Error* bound_error) const;
+  virtual RawAbstractType* CloneUnfinalized() const;
   virtual RawAbstractType* Canonicalize() const { return raw(); }
 
   virtual intptr_t Hash() const;
@@ -4175,6 +4193,7 @@
   virtual RawAbstractType* InstantiateFrom(
       const AbstractTypeArguments& instantiator_type_arguments,
       Error* bound_error) const;
+  virtual RawAbstractType* CloneUnfinalized() const;
   virtual RawAbstractType* Canonicalize() const { return raw(); }
 
   virtual intptr_t Hash() const;
diff --git a/sdk/lib/_internal/compiler/implementation/library_loader.dart b/sdk/lib/_internal/compiler/implementation/library_loader.dart
index be9e3b7..1342ce8 100644
--- a/sdk/lib/_internal/compiler/implementation/library_loader.dart
+++ b/sdk/lib/_internal/compiler/implementation/library_loader.dart
@@ -421,15 +421,6 @@
           if (loadedLibrary == null) return;
           compiler.withCurrentElement(library, () {
             handler.registerDependency(library, tag, loadedLibrary);
-
-            if (!loadedLibrary.hasLibraryName()) {
-              compiler.reportFatalError(
-                  tag == null ? null : tag.uri,
-                  MessageKind.GENERIC,
-                  {'text':
-                   'Error: No library name found in '
-                      '${loadedLibrary.canonicalUri}.'});
-            }
           });
         });
   }
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index 94ab233..788a3df 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -98,6 +98,12 @@
 LibTest/core/double/round_A01_t02: Fail # truncate/ceil/floor/round returns ints, issue 389
 LibTest/core/double/round_A01_t04: Fail # truncate/ceil/floor/round returns ints, issue 389
 
+Language/14_Libraries_and_Scripts/1_Imports_A01_t17: Fail # co19 Issue 603
+Language/14_Libraries_and_Scripts/1_Imports_A04_t01: Fail # co19 Issue 603
+
+Language/14_Libraries_and_Scripts/2_Exports_A05_t01: Fail # co19 Issue 604
+
+
 # co19-roll r546 (11.08.2013) caused these failures
 [ $compiler == dart2dart ]
 Language/03_Overview/1_Scoping_A02_t28: Fail # co19-roll r559: Please triage this failure
@@ -220,7 +226,6 @@
 Language/14_Libraries_and_Scripts/1_Imports_A03_t29: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/1_Imports_A03_t30: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/1_Imports_A03_t65: pass, fail, ok # co19 issue 560
-Language/14_Libraries_and_Scripts/1_Imports_A04_t03: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t01: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/5_URIs_A01_t01: fail # co19-roll r546: Please triage this failure
@@ -251,5 +256,5 @@
 Language/13_Statements/11_Try_A06_t01: fail # co19-roll r546: Please triage this failure
 LibTest/json/stringify_A02_t01: fail # co19-roll r587: Please triage this failure
 LibTest/json/stringify_A03_t02: fail # co19-roll r587: Please triage this failure
-
-
+LibTest/json/printOn_A02_t01: fail # co19-roll r587: Please triage this failure
+LibTest/json/printOn_A03_t02: fail # co19-roll r587: Please triage this failure
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 2860893..9bc5de1 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -229,6 +229,10 @@
 LibTest/typed_data/Uint32x4/toFloat32x4_A01_t02: RuntimeError # co19 Issue 601
 LibTest/typed_data/Float32x4/clamp_A02_t01: RuntimeError # co19 Issue 600
 
+Language/14_Libraries_and_Scripts/1_Imports_A01_t17: Fail # co19 Issue 603
+Language/14_Libraries_and_Scripts/1_Imports_A04_t01: Fail # co19 Issue 603
+
+Language/14_Libraries_and_Scripts/2_Exports_A05_t01: Fail # co19 Issue 604
 
 [ $compiler == dart2js && $jscl ]
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterClassEscape_A04_t01: Fail, Pass # issue 3333
@@ -459,7 +463,6 @@
 Language/14_Libraries_and_Scripts/1_Imports_A03_t28: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/1_Imports_A03_t29: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/1_Imports_A03_t30: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/1_Imports_A04_t03: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t01: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/5_URIs_A01_t01: fail # co19-roll r546: Please triage this failure
@@ -624,21 +627,14 @@
 Language/07_Classes/6_Constructors/2_Factories_A10_t02: fail # co19-roll r587: Please triage this failure
 Language/07_Classes/6_Constructors/2_Factories_A10_t03: fail # co19-roll r587: Please triage this failure
 Language/10_Generics/09_Generics_A01_t17: fail # co19-roll r587: Please triage this failure
-LibTest/json/parse_A01_t01: fail # co19-roll r587: Please triage this failure
-LibTest/json/parse_A02_t01: fail # co19-roll r587: Please triage this failure
-LibTest/json/printOn_A01_t01: fail # co19-roll r587: Please triage this failure
-LibTest/json/printOn_A02_t01: fail # co19-roll r587: Please triage this failure
-LibTest/json/printOn_A03_t01: fail # co19-roll r587: Please triage this failure
-LibTest/json/printOn_A03_t02: fail # co19-roll r587: Please triage this failure
-LibTest/json/printOn_A03_t03: fail # co19-roll r587: Please triage this failure
-LibTest/json/printOn_A04_t01: fail # co19-roll r587: Please triage this failure
 
 [ $compiler == dart2js ]
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t04: fail # co19-roll r587: Please triage this failure
 Language/07_Classes/6_Constructors/3_Constant_Constructors_A05_t04: fail # co19-roll r587: Please triage this failure
 LibTest/json/stringify_A01_t01: fail # co19-roll r587: Please triage this failure
 LibTest/json/stringify_A02_t01: fail # co19-roll r587: Please triage this failure
+LibTest/json/printOn_A01_t01: fail # co19-roll r587: Please triage this failure
+LibTest/json/printOn_A02_t01: fail # co19-roll r587: Please triage this failure
 LibTest/math/pow_A04_t01: fail # co19-roll r587: Please triage this failure
 LibTest/math/pow_A14_t01: fail # co19-roll r587: Please triage this failure
 LibTest/math/pow_A16_t01: fail # co19-roll r587: Please triage this failure
-
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 499ad55..4bb4278 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -121,6 +121,7 @@
 mixin_mixin2_test: RuntimeError # Issue 13109.
 mixin_mixin3_test: RuntimeError # Issue 13109.
 mixin_mixin7_test: RuntimeError # Issue 13109.
+mixin_regress_13688_test: RuntimeError # Issue 13109.
 
 # Compilation errors.
 const_var_test: CompileTimeError # Issue 12793
diff --git a/tests/language/mixin_regress_13688_test.dart b/tests/language/mixin_regress_13688_test.dart
new file mode 100644
index 0000000..0011539
--- /dev/null
+++ b/tests/language/mixin_regress_13688_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class ComparableMixin<E> {
+  e() {
+    return E;
+  }
+}
+
+class KUID extends Object with ComparableMixin<KUID> { }
+
+main() {
+  var kuid = new KUID();
+  Expect.equals(kuid.runtimeType.toString(), kuid.e().toString());
+}
diff --git a/tools/VERSION b/tools/VERSION
index c1958e4..7dc526d 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -1,4 +1,4 @@
 MAJOR 0
 MINOR 7
 BUILD 6
-PATCH 3
+PATCH 4