Version 1.4.0-dev.6.4

svn merge -c 35908 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 35962 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 35979 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 35980 https://dart.googlecode.com/svn/branches/bleeding_edge trunk
svn merge -c 35982 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@36015 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/runtime/lib/profiler.dart b/runtime/lib/profiler.dart
index c42e966..2c60141 100644
--- a/runtime/lib/profiler.dart
+++ b/runtime/lib/profiler.dart
@@ -15,7 +15,7 @@
 class _UserTag implements UserTag {
   factory _UserTag(String label) native "UserTag_new";
   String get label native "UserTag_label";
-  void makeCurrent() native "UserTag_makeCurrent";
+  UserTag makeCurrent() native "UserTag_makeCurrent";
 }
 
 patch UserTag getCurrentTag() => _getCurrentTag();
diff --git a/runtime/vm/intrinsifier.h b/runtime/vm/intrinsifier.h
index 69ca15d..5f68d68 100644
--- a/runtime/vm/intrinsifier.h
+++ b/runtime/vm/intrinsifier.h
@@ -135,7 +135,7 @@
 
 
 #define PROFILER_LIB_INTRINSIC_LIST(V)                                         \
-  V(_UserTag, makeCurrent, UserTag_makeCurrent, 1038211262)                    \
+  V(_UserTag, makeCurrent, UserTag_makeCurrent, 2084603703)                    \
   V(::, _getDefaultTag, UserTag_defaultTag, 624228668)                         \
   V(::, _getCurrentTag, Profiler_getCurrentTag, 1559793589)                    \
 
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
index 8229874..f7184d1 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
@@ -345,6 +345,12 @@
     if (member.isInstanceMember()) emitExtraAccessors(member, builder);
   }
 
+  bool _isOperator(FunctionElement member) {
+    // TODO(18740): there must be a better way to know if an element is an
+    // operator.
+    return Elements.operatorNameToIdentifier(member.name) != member.name;
+  }
+
   void addMemberMethod(FunctionElement member, ClassBuilder builder) {
     if (member.isAbstract) return;
     jsAst.Expression code = backend.generatedCode[member];
@@ -359,6 +365,9 @@
                             member.isConstructor() ||
                             member.isAccessor();
     String tearOffName;
+
+    final bool canBeReflected = backend.isAccessibleByReflection(member);
+
     if (isNotApplyTarget) {
       canTearOff = false;
     } else if (member.isInstanceMember()) {
@@ -367,19 +376,21 @@
         isClosure = true;
       } else {
         // Careful with operators.
-        canTearOff = compiler.codegenWorld.hasInvokedGetter(member, compiler);
+        canTearOff =
+            compiler.codegenWorld.hasInvokedGetter(member, compiler) ||
+            (canBeReflected && !_isOperator(member));
         assert(!needsSuperGetter(member) || canTearOff);
         tearOffName = namer.getterName(member);
       }
     } else {
       canTearOff =
-          compiler.codegenWorld.staticFunctionsNeedingGetter.contains(member);
+          compiler.codegenWorld.staticFunctionsNeedingGetter.contains(member) ||
+          canBeReflected;
       tearOffName = namer.getStaticClosureName(member);
     }
     final bool canBeApplied = compiler.enabledFunctionApply &&
                               compiler.world.getMightBePassedToApply(member);
 
-    final bool canBeReflected = backend.isAccessibleByReflection(member);
     final bool needStructuredInfo =
         canTearOff || canBeReflected || canBeApplied;
     if (!needStructuredInfo) {
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
index 7440372..a959146 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
@@ -108,6 +108,7 @@
       // Simple name is 'unary-'.
       simpleName = 'unary-';
     } else if (simpleName.startsWith('operator\$')) {
+      // TODO(18740, johnniwinther): this fails for methods like `operator$foo`.
       String str = simpleName.substring(9);
       simpleName = 'operator';
       kind = Dart2JsMethodKind.OPERATOR;
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index 2e6ae95..bf495e4 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -322,7 +322,14 @@
     while (!originParameters.isEmpty) {
       ParameterElementX originParameter = originParameters.head;
       ParameterElementX patchParameter = patchParameters.head;
-      originParameter.applyPatch(patchParameter);
+      // TODO(johnniwinther): Remove the conditional patching when we never
+      // resolve the same method twice.
+      if (!originParameter.isPatched) {
+        originParameter.applyPatch(patchParameter);
+      } else {
+        assert(invariant(origin, originParameter.patch == patchParameter,
+               message: "Inconsistent repatch of $originParameter."));
+      }
       DartType originParameterType = originParameter.computeType(compiler);
       DartType patchParameterType = patchParameter.computeType(compiler);
       if (originParameterType != patchParameterType) {
diff --git a/tests/lib/mirrors/get_field_test.dart b/tests/lib/mirrors/get_field_test.dart
new file mode 100644
index 0000000..c88841d
--- /dev/null
+++ b/tests/lib/mirrors/get_field_test.dart
@@ -0,0 +1,25 @@
+// 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.
+
+@MirrorsUsed(targets: "A")
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+class A {
+  foo(y, [x]) => y;
+  operator+(other) => null;
+  get bar => 499;
+  operator$foo([optional = 499]) => optional;
+}
+
+main() {
+  // We are using `getField` to tear off `foo`. We must make sure that all
+  // stub methods are installed.
+  var closure = reflect(new A()).getField(#foo).reflectee;
+  Expect.equals("b", closure("b"));
+
+  closure = reflect(new A()).getField(#operator$foo).reflectee;
+  Expect.equals(499, closure());
+}
diff --git a/tools/VERSION b/tools/VERSION
index f5bb2b3..962d60b 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
 MINOR 4
 PATCH 0
 PRERELEASE 6
-PRERELEASE_PATCH 3
+PRERELEASE_PATCH 4