Skip to content

Commit 79de274

Browse files
johnniwinthercommit-bot@chromium.org
authored andcommitted
Revert "[cfe] Encode field references as @getterS and @setters"
This reverts commit 3892e95. Reason for revert: Breaks Flutter web Original change's description: > [cfe] Encode field references as @getterS and @setters > > This removes the @fields and @=fields canonical name > encodings that allowed for encoding of conflicting members > and didn't support field<->getter/setter conversion > between dills or between outline and full dill. > > TEST=existing tests > > Change-Id: Id15e58ad4d1847d2c98a688705e5945196146c6d > Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/184783 > Commit-Queue: Johnni Winther <[email protected]> > Reviewed-by: Jens Johansen <[email protected]> > Reviewed-by: Alexander Markov <[email protected]> Change-Id: I744e284b16e097fa0833c5bdf1bc7653f13bdf63 No-Presubmit: true No-Tree-Checks: true No-Try: true Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/186147 Reviewed-by: Jens Johansen <[email protected]> Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent ae81a3c commit 79de274

20 files changed

+102
-122
lines changed

pkg/front_end/testcases/incremental/changing_modules_2.yaml.world.1.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ library from "package:example/a.dart" as a {
66
}
77
library from "package:foo/foo.dart" as foo {
88
additionalExports = (a::example,
9-
a::a,
10-
a::example)
9+
a::example,
10+
a::a)
1111

1212
export "package:example/a.dart";
1313

pkg/front_end/testcases/incremental/changing_modules_2.yaml.world.2.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ library from "package:example/a.dart" as a {
66
}
77
library from "package:foo/foo.dart" as foo {
88
additionalExports = (a::example,
9-
a::a,
10-
a::example)
9+
a::example,
10+
a::a)
1111

1212
export "package:example/a.dart";
1313

pkg/front_end/testcases/incremental/no_outline_change_43.yaml.world.1.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ library from "org-dartlang-test:///lib.dart" as lib {
1010
}
1111
library from "org-dartlang-test:///libExporter.dart" as lib2 {
1212
additionalExports = (lib::libField,
13-
lib::requireStuffFromLibExporter,
14-
lib::libField)
13+
lib::libField,
14+
lib::requireStuffFromLibExporter)
1515

1616
export "org-dartlang-test:///lib.dart";
1717

pkg/front_end/testcases/incremental/no_outline_change_43.yaml.world.2.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ library from "org-dartlang-test:///lib.dart" as lib {
1010
}
1111
library from "org-dartlang-test:///libExporter.dart" as lib2 {
1212
additionalExports = (lib::libField,
13-
lib::requireStuffFromLibExporter,
14-
lib::libField)
13+
lib::libField,
14+
lib::requireStuffFromLibExporter)
1515

1616
export "org-dartlang-test:///lib.dart";
1717

pkg/front_end/testcases/incremental/no_outline_change_43.yaml.world.3.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ library from "org-dartlang-test:///lib.dart" as lib {
1010
}
1111
library from "org-dartlang-test:///libExporter.dart" as lib2 {
1212
additionalExports = (lib::libField,
13-
lib::requireStuffFromLibExporter,
14-
lib::libField)
13+
lib::libField,
14+
lib::requireStuffFromLibExporter)
1515

1616
export "org-dartlang-test:///lib.dart";
1717

pkg/front_end/testcases/incremental/no_outline_change_43.yaml.world.4.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ library from "org-dartlang-test:///lib.dart" as lib {
1010
}
1111
library from "org-dartlang-test:///libExporter.dart" as lib2 {
1212
additionalExports = (lib::libField,
13-
lib::requireStuffFromLibExporter,
14-
lib::libField)
13+
lib::libField,
14+
lib::requireStuffFromLibExporter)
1515

1616
export "org-dartlang-test:///lib.dart";
1717

pkg/kernel/binary.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ type CanonicalName {
147147

148148
type ComponentFile {
149149
UInt32 magic = 0x90ABCDEF;
150-
UInt32 formatVersion = 56;
150+
UInt32 formatVersion = 55;
151151
Byte[10] shortSdkHash;
152152
List<String> problemsAsJson; // Described in problems.md.
153153
Library[] libraries;

pkg/kernel/lib/binary/ast_from_binary.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,8 @@ class BinaryBuilder {
678678
for (CanonicalName child in parentChildren) {
679679
if (child.name != '@methods' &&
680680
child.name != '@typedefs' &&
681+
child.name != '@fields' &&
682+
child.name != '@=fields' &&
681683
child.name != '@getters' &&
682684
child.name != '@setters' &&
683685
child.name != '@factories' &&

pkg/kernel/lib/binary/tag.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ class Tag {
173173
/// Internal version of kernel binary format.
174174
/// Bump it when making incompatible changes in kernel binaries.
175175
/// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md.
176-
static const int BinaryFormatVersion = 56;
176+
static const int BinaryFormatVersion = 55;
177177
}
178178

179179
abstract class ConstantTag {

pkg/kernel/lib/canonical_name.dart

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,9 @@ import 'ast.dart';
3030
/// "@constructors"
3131
/// Qualified name
3232
///
33-
/// Field or the implicit getter of a field:
33+
/// Field:
3434
/// Canonical name of enclosing class or library
35-
/// "@getters"
36-
/// Qualified name
37-
///
38-
/// Implicit setter of a field:
39-
/// Canonical name of enclosing class or library
40-
/// "@setters"
35+
/// "@fields"
4136
/// Qualified name
4237
///
4338
/// Typedef:
@@ -137,11 +132,11 @@ class CanonicalName {
137132
}
138133

139134
CanonicalName getChildFromField(Field field) {
140-
return getChild('@getters').getChildFromQualifiedName(field.name!);
135+
return getChild('@fields').getChildFromQualifiedName(field.name!);
141136
}
142137

143138
CanonicalName getChildFromFieldSetter(Field field) {
144-
return getChild('@setters').getChildFromQualifiedName(field.name!);
139+
return getChild('@=fields').getChildFromQualifiedName(field.name!);
145140
}
146141

147142
CanonicalName getChildFromConstructor(Constructor constructor) {
@@ -156,11 +151,11 @@ class CanonicalName {
156151
}
157152

158153
CanonicalName getChildFromFieldWithName(Name name) {
159-
return getChild('@getters').getChildFromQualifiedName(name);
154+
return getChild('@fields').getChildFromQualifiedName(name);
160155
}
161156

162157
CanonicalName getChildFromFieldSetterWithName(Name name) {
163-
return getChild('@setters').getChildFromQualifiedName(name);
158+
return getChild('@=fields').getChildFromQualifiedName(name);
164159
}
165160

166161
CanonicalName getChildFromTypedef(Typedef typedef_) {

pkg/kernel/test/convert_field_to_setter_getter.dart

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,12 @@ main() {
3737
List<int> writtenBytesFieldOriginal = serialize(lib1, lib2);
3838
// Canonical names are now set: Verify that the field is marked as such,
3939
// canonical-name-wise.
40-
String getterCanonicalName = '${field.getterCanonicalName}';
41-
if (field.getterCanonicalName.parent.name != "@getters") {
42-
throw "Expected @getters parent, but had "
40+
if (field.getterCanonicalName.parent.name != "@fields") {
41+
throw "Expected @fields parent, but had "
4342
"${field.getterCanonicalName.parent.name}";
4443
}
45-
String setterCanonicalName = '${field.setterCanonicalName}';
46-
if (field.setterCanonicalName.parent.name != "@setters") {
47-
throw "Expected @setters parent, but had "
44+
if (field.setterCanonicalName.parent.name != "@=fields") {
45+
throw "Expected @=fields parent, but had "
4846
"${field.setterCanonicalName.parent.name}";
4947
}
5048

@@ -82,18 +80,10 @@ main() {
8280
throw "Expected @getters parent, but had "
8381
"${getter.canonicalName.parent.name}";
8482
}
85-
if ('${getter.canonicalName}' != getterCanonicalName) {
86-
throw "Unexpected getter canonical name. "
87-
"Expected $getterCanonicalName, actual ${getter.canonicalName}.";
88-
}
8983
if (setter.canonicalName.parent.name != "@setters") {
9084
throw "Expected @setters parent, but had "
9185
"${setter.canonicalName.parent.name}";
9286
}
93-
if ('${setter.canonicalName}' != setterCanonicalName) {
94-
throw "Unexpected setter canonical name. "
95-
"Expected $setterCanonicalName, actual ${setter.canonicalName}.";
96-
}
9787

9888
// Replace getter/setter with field.
9989
lib1.procedures.remove(getter);
@@ -111,12 +101,12 @@ main() {
111101
List<int> writtenBytesFieldNew = serialize(lib1, lib2);
112102
// Canonical names are now set: Verify that the field is marked as such,
113103
// canonical-name-wise.
114-
if (fieldReplacement.getterCanonicalName.parent.name != "@getters") {
115-
throw "Expected @getters parent, but had "
104+
if (fieldReplacement.getterCanonicalName.parent.name != "@fields") {
105+
throw "Expected @fields parent, but had "
116106
"${fieldReplacement.getterCanonicalName.parent.name}";
117107
}
118-
if (fieldReplacement.setterCanonicalName.parent.name != "@setters") {
119-
throw "Expected @setters parent, but had "
108+
if (fieldReplacement.setterCanonicalName.parent.name != "@=fields") {
109+
throw "Expected @=fields parent, but had "
120110
"${fieldReplacement.setterCanonicalName.parent.name}";
121111
}
122112

pkg/kernel/test/text_serializer_from_kernel_nodes_test.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ void test() {
133133
name: '/* suppose top-level: dynamic field; */ field;',
134134
node: new ExpressionStatement(new StaticGet(field)),
135135
expectation: ''
136-
'(expr (get-static "package:foo/bar.dart::@getters::field"))',
136+
'(expr (get-static "package:foo/bar.dart::@fields::field"))',
137137
makeSerializationState: () => new SerializationState(null),
138138
makeDeserializationState: () =>
139139
new DeserializationState(null, component.root),
@@ -151,7 +151,7 @@ void test() {
151151
name: '/* suppose top-level: dynamic field; */ field;',
152152
node: new ExpressionStatement(new StaticGet(field)),
153153
expectation: ''
154-
'(expr (get-static "package:foo/bar.dart::@getters::field"))',
154+
'(expr (get-static "package:foo/bar.dart::@fields::field"))',
155155
makeSerializationState: () => new SerializationState(null),
156156
makeDeserializationState: () =>
157157
new DeserializationState(null, component.root),
@@ -171,7 +171,7 @@ void test() {
171171
new ExpressionStatement(new StaticSet(field, new IntLiteral(1))),
172172
expectation: ''
173173
'(expr'
174-
' (set-static "package:foo/bar.dart::@setters::field" (int 1)))',
174+
' (set-static "package:foo/bar.dart::@=fields::field" (int 1)))',
175175
makeSerializationState: () => new SerializationState(null),
176176
makeDeserializationState: () =>
177177
new DeserializationState(null, component.root),

pkg/vm/lib/transformations/ffi_definitions.dart

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -510,29 +510,17 @@ class _FfiDefinitionTransformer extends FfiTransformer {
510510

511511
List<Procedure> _generateMethodsForField(Field field, NativeTypeCfe type,
512512
Map<Abi, int> offsets, IndexedClass indexedClass) {
513-
// TODO(johnniwinther): Avoid passing [indexedClass]. When compiling
514-
// incrementally, [field] should already carry the references from
515-
// [indexedClass].
516513
final getterStatement = type.generateGetterStatement(
517514
field.type, field.fileOffset, offsets, this);
518-
Reference getterReference =
519-
indexedClass?.lookupGetterReference(field.name) ??
520-
field.getterReference;
521-
assert(getterReference == field.getterReference,
522-
"Unexpected getter reference for ${field}, found $getterReference.");
523515
final Procedure getter = Procedure(field.name, ProcedureKind.Getter,
524516
FunctionNode(getterStatement, returnType: field.type),
525-
fileUri: field.fileUri, reference: getterReference)
517+
fileUri: field.fileUri,
518+
reference: indexedClass?.lookupGetterReference(field.name))
526519
..fileOffset = field.fileOffset
527520
..isNonNullableByDefault = field.isNonNullableByDefault;
528521

529522
Procedure setter = null;
530523
if (!field.isFinal) {
531-
Reference setterReference =
532-
indexedClass?.lookupSetterReference(field.name) ??
533-
field.setterReference;
534-
assert(setterReference == field.setterReference,
535-
"Unexpected setter reference for ${field}, found $setterReference.");
536524
final VariableDeclaration argument =
537525
VariableDeclaration('#v', type: field.type)
538526
..fileOffset = field.fileOffset;
@@ -544,7 +532,7 @@ class _FfiDefinitionTransformer extends FfiTransformer {
544532
FunctionNode(setterStatement,
545533
returnType: VoidType(), positionalParameters: [argument]),
546534
fileUri: field.fileUri,
547-
reference: setterReference)
535+
reference: indexedClass?.lookupSetterReference(field.name))
548536
..fileOffset = field.fileOffset
549537
..isNonNullableByDefault = field.isNonNullableByDefault;
550538
}

pkg/vm/lib/transformations/type_flow/transformer.dart

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1324,12 +1324,7 @@ class _TreeShakerPass2 extends RemovingTransformer {
13241324
if (!shaker.isMemberUsed(node) && !_preserveSpecialMember(node)) {
13251325
// Ensure that kernel file writer will not be able to
13261326
// write a dangling reference to the deleted member.
1327-
if (node is Field) {
1328-
node.getterCanonicalName?.reference = null;
1329-
node.setterCanonicalName?.reference = null;
1330-
} else {
1331-
node.canonicalName?.reference = null;
1332-
}
1327+
node.reference.canonicalName = null;
13331328
Statistics.membersDropped++;
13341329
return removalSentinel;
13351330
}

runtime/vm/compiler/frontend/constant_reader.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,8 +264,7 @@ InstancePtr ConstantReader::ReadConstantInternal(intptr_t constant_offset) {
264264
Field& field = Field::Handle(Z);
265265
Instance& constant = Instance::Handle(Z);
266266
for (intptr_t j = 0; j < number_of_fields; ++j) {
267-
field = H.LookupFieldByKernelGetterOrSetter(
268-
reader.ReadCanonicalNameReference());
267+
field = H.LookupFieldByKernelField(reader.ReadCanonicalNameReference());
269268
// Recurse into lazily evaluating all "sub" constants
270269
// needed to evaluate the current constant.
271270
const intptr_t entry_offset = reader.ReadUInt();

runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ Fragment StreamingFlowGraphBuilder::BuildInitializers(
237237
ReadBool();
238238
const NameIndex field_name = ReadCanonicalNameReference();
239239
const Field& field =
240-
Field::Handle(Z, H.LookupFieldByKernelGetterOrSetter(field_name));
240+
Field::Handle(Z, H.LookupFieldByKernelField(field_name));
241241
initializer_fields[i] = &field;
242242
SkipExpression();
243243
continue;
@@ -2180,7 +2180,8 @@ Fragment StreamingFlowGraphBuilder::BuildPropertyGet(TokenPosition* p) {
21802180
const Function* tearoff_interface_target = &Function::null_function();
21812181
const NameIndex itarget_name =
21822182
ReadInterfaceMemberNameReference(); // read interface_target_reference.
2183-
if (!H.IsRoot(itarget_name) && H.IsGetter(itarget_name)) {
2183+
if (!H.IsRoot(itarget_name) &&
2184+
(H.IsGetter(itarget_name) || H.IsField(itarget_name))) {
21842185
interface_target = &Function::ZoneHandle(
21852186
Z,
21862187
H.LookupMethodByMember(itarget_name, H.DartGetterName(itarget_name)));
@@ -2548,11 +2549,10 @@ Fragment StreamingFlowGraphBuilder::BuildStaticGet(TokenPosition* p) {
25482549
inferred_type_metadata_helper_.GetInferredType(offset);
25492550

25502551
NameIndex target = ReadCanonicalNameReference(); // read target_reference.
2551-
ASSERT(H.IsGetter(target));
25522552

2553-
const Field& field = Field::ZoneHandle(
2554-
Z, H.LookupFieldByKernelGetterOrSetter(target, /*required=*/false));
2555-
if (!field.IsNull()) {
2553+
if (H.IsField(target)) {
2554+
const Field& field =
2555+
Field::ZoneHandle(Z, H.LookupFieldByKernelField(target));
25562556
if (field.is_const()) {
25572557
// Since the CFE inlines all references to const variables and fields,
25582558
// it never emits a StaticGet of a const field.
@@ -2605,39 +2605,44 @@ Fragment StreamingFlowGraphBuilder::BuildStaticSet(TokenPosition* p) {
26052605
if (p != NULL) *p = position;
26062606

26072607
NameIndex target = ReadCanonicalNameReference(); // read target_reference.
2608-
ASSERT(H.IsSetter(target));
2609-
2610-
// Evaluate the expression on the right hand side.
2611-
Fragment instructions = BuildExpression(); // read expression.
26122608

2613-
// Look up the target as a setter first and, if not present, as a field
2614-
// second. This order is needed to avoid looking up a final field as the
2615-
// target.
2616-
const Function& function = Function::ZoneHandle(
2617-
Z, H.LookupStaticMethodByKernelProcedure(target, /*required=*/false));
2609+
if (H.IsField(target)) {
2610+
const Field& field =
2611+
Field::ZoneHandle(Z, H.LookupFieldByKernelField(target));
2612+
const Class& owner = Class::Handle(Z, field.Owner());
2613+
const String& setter_name = H.DartSetterName(target);
2614+
const Function& setter =
2615+
Function::ZoneHandle(Z, owner.LookupStaticFunction(setter_name));
2616+
Fragment instructions = BuildExpression(); // read expression.
2617+
if (NeedsDebugStepCheck(stack(), position)) {
2618+
instructions = DebugStepCheck(position) + instructions;
2619+
}
2620+
LocalVariable* variable = MakeTemporary();
2621+
instructions += LoadLocal(variable);
2622+
if (!setter.IsNull() && field.NeedsSetter()) {
2623+
instructions += StaticCall(position, setter, 1, ICData::kStatic);
2624+
instructions += Drop();
2625+
} else {
2626+
instructions += StoreStaticField(position, field);
2627+
}
2628+
return instructions;
2629+
} else {
2630+
ASSERT(H.IsProcedure(target));
26182631

2619-
if (!function.IsNull()) {
2632+
// Evaluate the expression on the right hand side.
2633+
Fragment instructions = BuildExpression(); // read expression.
26202634
LocalVariable* variable = MakeTemporary();
26212635

26222636
// Prepare argument.
26232637
instructions += LoadLocal(variable);
26242638

26252639
// Invoke the setter function.
2640+
const Function& function =
2641+
Function::ZoneHandle(Z, H.LookupStaticMethodByKernelProcedure(target));
26262642
instructions += StaticCall(position, function, 1, ICData::kStatic);
26272643

26282644
// Drop the unused result & leave the stored value on the stack.
26292645
return instructions + Drop();
2630-
} else {
2631-
const Field& field =
2632-
Field::ZoneHandle(Z, H.LookupFieldByKernelGetterOrSetter(target));
2633-
ASSERT(!field.NeedsSetter());
2634-
if (NeedsDebugStepCheck(stack(), position)) {
2635-
instructions = DebugStepCheck(position) + instructions;
2636-
}
2637-
LocalVariable* variable = MakeTemporary();
2638-
instructions += LoadLocal(variable);
2639-
instructions += StoreStaticField(position, field);
2640-
return instructions;
26412646
}
26422647
}
26432648

@@ -2765,7 +2770,8 @@ Fragment StreamingFlowGraphBuilder::BuildMethodInvocation(TokenPosition* p) {
27652770
// TODO(dartbug.com/34497): Once front-end desugars calls via
27662771
// fields/getters, filtering of field and getter interface targets here
27672772
// can be turned into assertions.
2768-
if (!H.IsRoot(itarget_name) && !H.IsGetter(itarget_name)) {
2773+
if (!H.IsRoot(itarget_name) && !H.IsField(itarget_name) &&
2774+
!H.IsGetter(itarget_name)) {
27692775
interface_target = &Function::ZoneHandle(
27702776
Z, H.LookupMethodByMember(itarget_name,
27712777
H.DartProcedureName(itarget_name)));

0 commit comments

Comments
 (0)