Record getter and setter names in the minified-name table

Change-Id: I373babecdf3ccece386483d5aa4fcde320675b80
Reviewed-on: https://dart-review.googlesource.com/c/87480
Commit-Queue: Sigmund Cherem <sigmund@google.com>
Reviewed-by: Stephen Adams <sra@google.com>
This commit is contained in:
Sigmund Cherem 2018-12-18 22:05:18 +00:00 committed by commit-bot@chromium.org
parent c52ff42c55
commit 6c2d8bc8c1
3 changed files with 81 additions and 21 deletions

View file

@ -522,22 +522,27 @@ class Namer {
final Map<Entity, jsAst.Name> userGlobalsSecondName = {};
final Map<String, jsAst.Name> internalGlobals = {};
_registerName(
Map<String, String> map, jsAst.Name jsName, String originalName) {
// Non-finalized names are not present in the output program
if (jsName is TokenName && !jsName.isFinalized) return;
map[jsName.name] = originalName;
var getterName = userGetters[jsName];
if (getterName != null) map[getterName.name] = originalName;
var setterName = userSetters[jsName];
if (setterName != null) map[setterName.name] = originalName;
}
Map<String, String> createMinifiedGlobalNameMap() {
var map = <String, String>{};
userGlobals.forEach((entity, jsName) {
// Non-finalized names are not present in the output program
if (jsName is TokenName && !jsName.isFinalized) return;
map[jsName.name] = entity.name;
_registerName(map, jsName, entity.name);
});
userGlobalsSecondName.forEach((entity, jsName) {
// Non-finalized names are not present in the output program
if (jsName is TokenName && !jsName.isFinalized) return;
map[jsName.name] = entity.name;
_registerName(map, jsName, entity.name);
});
internalGlobals.forEach((name, jsName) {
// Non-finalized names are not present in the output program
if (jsName is TokenName && !jsName.isFinalized) return;
map[jsName.name] = name;
_registerName(map, jsName, name);
});
return map;
}
@ -550,27 +555,22 @@ class Namer {
final Map<String, String> userInstanceMembersOriginalName = HashMap();
final Map<MemberEntity, jsAst.Name> internalInstanceMembers = HashMap();
final Map<String, jsAst.Name> userInstanceOperators = HashMap();
final Map<jsAst.Name, jsAst.Name> userGetters = HashMap();
final Map<jsAst.Name, jsAst.Name> userSetters = HashMap();
Map<String, String> createMinifiedInstanceNameMap() {
var map = <String, String>{};
internalInstanceMembers.forEach((entity, jsName) {
// Non-finalized names are not present in the output program
if (jsName is TokenName && !jsName.isFinalized) return;
map[jsName.name] = entity.name;
_registerName(map, jsName, entity.name);
});
userInstanceMembers.forEach((name, jsName) {
// Non-finalized names are not present in the output program
if (jsName is TokenName && !jsName.isFinalized) return;
var originalName = userInstanceMembersOriginalName[name];
map[jsName.name] = originalName ?? name;
_registerName(map, jsName, userInstanceMembersOriginalName[name] ?? name);
});
// TODO(sigmund): reverse the operator names back to the original Dart
// names.
userInstanceOperators.forEach((name, jsName) {
// Non-finalized names are not present in the output program
if (jsName is TokenName && !jsName.isFinalized) return;
map[jsName.name] = name;
_registerName(map, jsName, name);
});
return map;
}
@ -1067,14 +1067,16 @@ class Namer {
jsAst.Name deriveSetterName(jsAst.Name disambiguatedName) {
// We dynamically create setters from the field-name. The setter name must
// therefore be derived from the instance field-name.
return new SetterName(_literalSetterPrefix, disambiguatedName);
return userSetters[disambiguatedName] ??=
new SetterName(_literalSetterPrefix, disambiguatedName);
}
/// Annotated name for the setter of any member with [disambiguatedName].
jsAst.Name deriveGetterName(jsAst.Name disambiguatedName) {
// We dynamically create getters from the field-name. The getter name must
// therefore be derived from the instance field-name.
return new GetterName(_literalGetterPrefix, disambiguatedName);
return userGetters[disambiguatedName] ??=
new GetterName(_literalGetterPrefix, disambiguatedName);
}
/// Annotated name for the getter of [element].

View file

@ -0,0 +1,29 @@
// 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.
// Error pattern: NoSuchMethodError: method not found: '([^']*)' .*
// Kind of minified name: instance
// Expected deobfuscated name: g1
import 'package:expect/expect.dart';
main() {
try {
confuse(new A());
dynamic x = confuse(new B());
x.g1;
} catch (e) {
throw e;
}
}
@AssumeDynamic()
@NoInline()
confuse(x) => x;
class A {
int get g1 => 0;
}
class B {}

View file

@ -0,0 +1,29 @@
// 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.
// Error pattern: NoSuchMethodError: method not found: '([^']*)' .*
// Kind of minified name: instance
// Expected deobfuscated name: g1=
import 'package:expect/expect.dart';
main() {
try {
confuse(new A());
dynamic x = confuse(new B());
x.g1 = 0;
} catch (e) {
throw e;
}
}
@AssumeDynamic()
@NoInline()
confuse(x) => x;
class A {
set g1(int x) {}
}
class B {}