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