Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit c1ff1cb

Browse files
johnniwinthercommit-bot@chromium.org
authored andcommitted
[cfe] Merge clone with existing procedure in mixin transformation
This ensure that any existing references to the original procedure will correctly refer to the cloned procedure after transformation. Change-Id: I08f561f11e88d717041009e6a9bd9bb6e8054d88 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/137976 Reviewed-by: Jens Johansen <jensj@google.com> Commit-Queue: Johnni Winther <johnniwinther@google.com>
1 parent 817d065 commit c1ff1cb

6 files changed

+37
-32
lines changed

pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2784,11 +2784,7 @@ class InterfaceConflict extends DelayedMember {
27842784
}
27852785
debug?.log("Combined Member Signature of ${fullNameForErrors}: "
27862786
"added stub $stub");
2787-
if (classBuilder.isMixinApplication) {
2788-
return combinedMemberSignatureResult = bestMemberSoFar;
2789-
} else {
2790-
return combinedMemberSignatureResult = stub;
2791-
}
2787+
return combinedMemberSignatureResult = stub;
27922788
}
27932789
}
27942790

pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.strong.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class C = self::B with self::M implements self::I<core::int*> {
2828
return super.{self::B::f}(x);
2929
}
3030
static method g1(self::C* c) → void {
31-
c.{self::M::f}(1);
31+
c.{self::C::f}(1);
3232
}
3333
static method g2(self::I<core::num*>* i) → void {
3434
i.{self::I::f}(1.5);

pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.strong.transformed.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class C extends self::B implements self::I<core::int*>, self::M /*isEliminatedMi
2727
method f(generic-covariant-impl core::int* x) → void {}
2828
}
2929
static method g1(self::C* c) → void {
30-
c.{self::M::f}(1);
30+
c.{self::C::f}(1);
3131
}
3232
static method g2(self::I<core::num*>* i) → void {
3333
i.{self::I::f}(1.5);

pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.strong.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class C = self::B with self::M implements self::I<core::int*> {
2727
return super.{self::B::f}(x);
2828
}
2929
static method g1(self::C* c) → void {
30-
c.{self::B::f}(1);
30+
c.{self::C::f}(1);
3131
}
3232
static method g2(self::I<core::num*>* i) → void {
3333
i.{self::I::f}(1.5);

pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.strong.transformed.expect

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class C extends self::B implements self::I<core::int*>, self::M /*isEliminatedMi
2727
return super.{self::B::f}(x);
2828
}
2929
static method g1(self::C* c) → void {
30-
c.{self::B::f}(1);
30+
c.{self::C::f}(1);
3131
}
3232
static method g2(self::I<core::num*>* i) → void {
3333
i.{self::I::f}(1.5);

pkg/kernel/lib/transformations/mixin_full_resolution.dart

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -192,14 +192,15 @@ class MixinFullResolution {
192192
referenceFrom =
193193
indexedClass?.lookupProcedureNotSetter(procedure.name.name);
194194
}
195-
Procedure clone = cloner.cloneProcedure(procedure, referenceFrom);
195+
196196
// Linear search for a forwarding stub with the same name.
197+
int originalIndex;
197198
for (int i = 0; i < originalLength; ++i) {
198199
var originalProcedure = class_.procedures[i];
199-
if (originalProcedure.name == clone.name &&
200-
originalProcedure.kind == clone.kind) {
200+
if (originalProcedure.name == procedure.name &&
201+
originalProcedure.kind == procedure.kind) {
201202
FunctionNode src = originalProcedure.function;
202-
FunctionNode dst = clone.function;
203+
FunctionNode dst = procedure.function;
203204

204205
if (src.positionalParameters.length !=
205206
dst.positionalParameters.length ||
@@ -208,27 +209,35 @@ class MixinFullResolution {
208209
// and don't add several procedures with the same name to the class.
209210
continue outer;
210211
}
211-
212-
assert(src.typeParameters.length == dst.typeParameters.length);
213-
for (int j = 0; j < src.typeParameters.length; ++j) {
214-
dst.typeParameters[j].flags = src.typeParameters[j].flags;
215-
}
216-
for (int j = 0; j < src.positionalParameters.length; ++j) {
217-
dst.positionalParameters[j].flags =
218-
src.positionalParameters[j].flags;
219-
}
220-
// TODO(kernel team): The named parameters are not sorted,
221-
// this might not be correct.
222-
for (int j = 0; j < src.namedParameters.length; ++j) {
223-
dst.namedParameters[j].flags = src.namedParameters[j].flags;
224-
}
225-
226-
originalProcedure.canonicalName?.unbind();
227-
class_.procedures[i] = clone;
228-
continue outer;
212+
originalIndex = i;
213+
break;
229214
}
230215
}
231-
class_.addMember(clone);
216+
if (originalIndex != null) {
217+
referenceFrom ??= class_.procedures[originalIndex];
218+
}
219+
Procedure clone = cloner.cloneProcedure(procedure, referenceFrom);
220+
if (originalIndex != null) {
221+
Procedure originalProcedure = class_.procedures[originalIndex];
222+
FunctionNode src = originalProcedure.function;
223+
FunctionNode dst = clone.function;
224+
assert(src.typeParameters.length == dst.typeParameters.length);
225+
for (int j = 0; j < src.typeParameters.length; ++j) {
226+
dst.typeParameters[j].flags = src.typeParameters[j].flags;
227+
}
228+
for (int j = 0; j < src.positionalParameters.length; ++j) {
229+
dst.positionalParameters[j].flags = src.positionalParameters[j].flags;
230+
}
231+
// TODO(kernel team): The named parameters are not sorted,
232+
// this might not be correct.
233+
for (int j = 0; j < src.namedParameters.length; ++j) {
234+
dst.namedParameters[j].flags = src.namedParameters[j].flags;
235+
}
236+
237+
class_.procedures[originalIndex] = clone;
238+
} else {
239+
class_.addMember(clone);
240+
}
232241
}
233242
assert(class_.constructors.isNotEmpty);
234243

0 commit comments

Comments
 (0)