Skip to content

Commit

Permalink
Workaround for bug in nsm-forwarders
Browse files Browse the repository at this point in the history
This lets dart2js correctly handle nsmForwarders with private names (see
#33665 for details).

Change-Id: Ic34bc8c2dbfd570f35f2f6a4c5a84b3da6ddb1f5
Reviewed-on: https://dart-review.googlesource.com/62711
Reviewed-by: Stephen Adams <sra@google.com>
Commit-Queue: Sigmund Cherem <sigmund@google.com>
  • Loading branch information
sigmundch authored and commit-bot@chromium.org committed Jun 28, 2018
1 parent c19233d commit 64553b6
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 2 deletions.
10 changes: 8 additions & 2 deletions pkg/compiler/lib/src/kernel/env.dart
Original file line number Diff line number Diff line change
Expand Up @@ -392,8 +392,14 @@ class ClassEnvImpl implements ClassEnv {
continue;
}
if (!includeStatic && member.isStatic) continue;
if (!includeNoSuchMethodForwarders && member.isNoSuchMethodForwarder) {
continue;
if (member.isNoSuchMethodForwarder) {
// TODO(sigmund): remove once #33665 is fixed.
if (!includeNoSuchMethodForwarders ||
member.name.isPrivate &&
member.name.libraryName !=
member.enclosingLibrary.reference) {
continue;
}
}
var name = member.name.name;
assert(!name.contains('#'));
Expand Down
11 changes: 11 additions & 0 deletions tests/compiler/dart2js_extra/no_such_method_strong11_lib.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// Copyright (c) 2018, 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.

abstract class I {
// ignore: unused_element
int _m1();

// ignore: unused_element
int _m2();
}
41 changes: 41 additions & 0 deletions tests/compiler/dart2js_extra/no_such_method_strong11_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// Copyright (c) 2018, 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.

// dart2jsOptions=--strong

// Regression test checking that nsm-forwarders do not get installed for private
// members of other libraries. See https://dartbug.com/33665

import 'package:expect/expect.dart';
import 'no_such_method_strong11_lib.dart';

abstract class J {
int _m3();
int _m4();
}

class A implements I, J {
int _m1() => 1;
int _m3() => 3;
noSuchMethod(Invocation m) => -1;
}

main() {
dynamic a = confuse(new A());
Expect.equals(1, a._m1());
Expect.equals(3, a._m3());
Expect.equals(1, (a._m1)());
Expect.equals(3, (a._m3)());

Expect.equals(-1, a._m2());
Expect.equals(-1, a._m4());
Expect.isFalse(a._m2 is Function);
Expect.equals(-1, a._m2);
Expect.isTrue(a._m4 is Function);
Expect.equals(-1, (a._m4)());
}

@NoInline()
@AssumeDynamic()
confuse(x) => x;

0 comments on commit 64553b6

Please sign in to comment.