[dart2js] Handle super access in mixin declarations

This crashed because the canonical name for the replace procedure
was unbound before all references to it had been loaded, causing
subsequent reads of the canonical name to create reference without
a target.

This broke the flutter web smoke tests.

Change-Id: I6249cfda85ff76b5e2dd31bb0cf8d6312ad50c1d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/177861
Reviewed-by: Jens Johansen <jensj@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
Johnni Winther 2021-01-07 13:45:18 +00:00 committed by commit-bot@chromium.org
parent 5fac8d3d71
commit dd5b455a0c
13 changed files with 446 additions and 3 deletions

View file

@ -419,12 +419,15 @@ class KClassEnvImpl implements KClassEnv {
ir.Procedure existingSetter = existingSetters[field.name];
cls.addField(cloneVisitor.cloneField(
field, existingGetter?.reference, existingSetter?.reference));
// TODO(johnniwinther): We need to unbind the canonical names before
// serializing these references since the canonical names refer to
// @getters and @setters instead of @fields and @fields=. This will
// not be needed if stop using @fields/@fields= in favor of
// @getters/@setters in general.
if (existingGetter != null) {
existingGetter.reference.canonicalName?.unbind();
cls.procedures.remove(existingGetter);
}
if (existingSetter != null) {
existingSetter.reference.canonicalName?.unbind();
cls.procedures.remove(existingSetter);
}
continue;
@ -444,7 +447,6 @@ class KClassEnvImpl implements KClassEnv {
? existingSetters[procedure.name]
: existingNonSetters[procedure.name];
if (existingProcedure != null) {
existingProcedure.reference.canonicalName?.unbind();
cls.procedures.remove(existingProcedure);
}
cls.addProcedure(cloneVisitor.cloneProcedure(

View file

@ -606,6 +606,7 @@ scans
scheduler
screen
scripts
scroll
sdkroot
sdks
secondary

View file

@ -0,0 +1,34 @@
// Copyright (c) 2021, 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.md file.
mixin Diagnosticable {
void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
}
class DiagnosticPropertiesBuilder {}
abstract class PointerEvent with Diagnosticable {}
abstract class PointerSignalEvent extends PointerEvent {}
mixin _PointerEventDescription on PointerEvent {
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
super.debugFillProperties(properties);
}
}
mixin _CopyPointerScrollEvent on PointerEvent {}
class PointerScrollEvent extends PointerSignalEvent
with _PointerEventDescription, _CopyPointerScrollEvent {
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
super.debugFillProperties(properties);
}
}
main() {
new PointerScrollEvent()
.debugFillProperties(new DiagnosticPropertiesBuilder());
}

View file

@ -0,0 +1,61 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/ {
method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
;
}
class DiagnosticPropertiesBuilder extends core::Object {
synthetic constructor •() → self::DiagnosticPropertiesBuilder
;
}
abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable
: super core::Object::•()
;
mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
return super.{self::Diagnosticable::debugFillProperties}(properties);
}
abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable {
synthetic constructor •() → self::PointerEvent
;
}
abstract class PointerSignalEvent extends self::PointerEvent {
synthetic constructor •() → self::PointerSignalEvent
;
}
abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/ {
@core::override
method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
;
}
abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/ {
}
abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/ {
synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription
: super self::PointerSignalEvent::•()
;
mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
return super.{self::_PointerEventDescription::debugFillProperties}(properties);
}
abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/ {
synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent
: super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•()
;
}
class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent {
synthetic constructor •() → self::PointerScrollEvent
;
@core::override
method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
;
}
static method main() → dynamic
;
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///mixin_super.dart:16:4 -> InstanceConstant(const _Override{})
Evaluated: StaticGet @ org-dartlang-testcase:///mixin_super.dart:25:4 -> InstanceConstant(const _Override{})
Extra constant evaluation: evaluated: 6, effectively constant: 2

View file

@ -0,0 +1,65 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/ {
method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {}
}
class DiagnosticPropertiesBuilder extends core::Object {
synthetic constructor •() → self::DiagnosticPropertiesBuilder
: super core::Object::•()
;
}
abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable
: super core::Object::•()
;
mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
return super.{self::Diagnosticable::debugFillProperties}(properties);
}
abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable {
synthetic constructor •() → self::PointerEvent
: super self::_PointerEvent&Object&Diagnosticable::•()
;
}
abstract class PointerSignalEvent extends self::PointerEvent {
synthetic constructor •() → self::PointerSignalEvent
: super self::PointerEvent::•()
;
}
abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/ {
@#C1
method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
super.{self::_PointerEvent&Object&Diagnosticable::debugFillProperties}(properties);
}
}
abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/ {
}
abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/ {
synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription
: super self::PointerSignalEvent::•()
;
mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
return super.{self::_PointerEventDescription::debugFillProperties}(properties);
}
abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/ {
synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent
: super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•()
;
}
class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent {
synthetic constructor •() → self::PointerScrollEvent
: super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent::•()
;
@#C1
method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
super.{self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::debugFillProperties}(properties);
}
}
static method main() → dynamic {
new self::PointerScrollEvent::•().{self::PointerScrollEvent::debugFillProperties}(new self::DiagnosticPropertiesBuilder::•()){(self::DiagnosticPropertiesBuilder) → void};
}
constants {
#C1 = core::_Override {}
}

View file

@ -0,0 +1,65 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/ {
method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {}
}
class DiagnosticPropertiesBuilder extends core::Object {
synthetic constructor •() → self::DiagnosticPropertiesBuilder
: super core::Object::•()
;
}
abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable
: super core::Object::•()
;
mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
return super.{self::Diagnosticable::debugFillProperties}(properties);
}
abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable {
synthetic constructor •() → self::PointerEvent
: super self::_PointerEvent&Object&Diagnosticable::•()
;
}
abstract class PointerSignalEvent extends self::PointerEvent {
synthetic constructor •() → self::PointerSignalEvent
: super self::PointerEvent::•()
;
}
abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/ {
@#C1
method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
super.{self::_PointerEvent&Object&Diagnosticable::debugFillProperties}(properties);
}
}
abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/ {
}
abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/ {
synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription
: super self::PointerSignalEvent::•()
;
mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
return super.{self::_PointerEventDescription::debugFillProperties}(properties);
}
abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/ {
synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent
: super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•()
;
}
class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent {
synthetic constructor •() → self::PointerScrollEvent
: super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent::•()
;
@#C1
method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
super.{self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::debugFillProperties}(properties);
}
}
static method main() → dynamic {
new self::PointerScrollEvent::•().{self::PointerScrollEvent::debugFillProperties}(new self::DiagnosticPropertiesBuilder::•()){(self::DiagnosticPropertiesBuilder) → void};
}
constants {
#C1 = core::_Override {}
}

View file

@ -0,0 +1,23 @@
mixin Diagnosticable {
void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
}
class DiagnosticPropertiesBuilder {}
abstract class PointerEvent with Diagnosticable {}
abstract class PointerSignalEvent extends PointerEvent {}
mixin _PointerEventDescription on PointerEvent {
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
}
mixin _CopyPointerScrollEvent on PointerEvent {}
class PointerScrollEvent extends PointerSignalEvent
with _PointerEventDescription, _CopyPointerScrollEvent {
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
}
main() {}

View file

@ -0,0 +1,21 @@
abstract class PointerEvent with Diagnosticable {}
abstract class PointerSignalEvent extends PointerEvent {}
class DiagnosticPropertiesBuilder {}
class PointerScrollEvent extends PointerSignalEvent
with _PointerEventDescription, _CopyPointerScrollEvent {
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
}
main() {}
mixin Diagnosticable {
void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
}
mixin _CopyPointerScrollEvent on PointerEvent {}
mixin _PointerEventDescription on PointerEvent {
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
}

View file

@ -0,0 +1,65 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/ {
method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {}
}
class DiagnosticPropertiesBuilder extends core::Object {
synthetic constructor •() → self::DiagnosticPropertiesBuilder
: super core::Object::•()
;
}
abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable
: super core::Object::•()
;
mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
return super.{self::Diagnosticable::debugFillProperties}(properties);
}
abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable {
synthetic constructor •() → self::PointerEvent
: super self::_PointerEvent&Object&Diagnosticable::•()
;
}
abstract class PointerSignalEvent extends self::PointerEvent {
synthetic constructor •() → self::PointerSignalEvent
: super self::PointerEvent::•()
;
}
abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/ {
@#C1
method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
super.{self::_PointerEvent&Object&Diagnosticable::debugFillProperties}(properties);
}
}
abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/ {
}
abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/ {
synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription
: super self::PointerSignalEvent::•()
;
mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
return super.{self::_PointerEventDescription::debugFillProperties}(properties);
}
abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/ {
synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent
: super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•()
;
}
class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent {
synthetic constructor •() → self::PointerScrollEvent
: super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent::•()
;
@#C1
method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
super.{self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::debugFillProperties}(properties);
}
}
static method main() → dynamic {
new self::PointerScrollEvent::•().{self::PointerScrollEvent::debugFillProperties}(new self::DiagnosticPropertiesBuilder::•()){(self::DiagnosticPropertiesBuilder) → void};
}
constants {
#C1 = core::_Override {}
}

View file

@ -0,0 +1,65 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
abstract class Diagnosticable extends core::Object /*isMixinDeclaration*/ {
method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {}
}
class DiagnosticPropertiesBuilder extends core::Object {
synthetic constructor •() → self::DiagnosticPropertiesBuilder
: super core::Object::•()
;
}
abstract class _PointerEvent&Object&Diagnosticable = core::Object with self::Diagnosticable /*isAnonymousMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::_PointerEvent&Object&Diagnosticable
: super core::Object::•()
;
mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
return super.{self::Diagnosticable::debugFillProperties}(properties);
}
abstract class PointerEvent extends self::_PointerEvent&Object&Diagnosticable {
synthetic constructor •() → self::PointerEvent
: super self::_PointerEvent&Object&Diagnosticable::•()
;
}
abstract class PointerSignalEvent extends self::PointerEvent {
synthetic constructor •() → self::PointerSignalEvent
: super self::PointerEvent::•()
;
}
abstract class _PointerEventDescription extends self::PointerEvent /*isMixinDeclaration*/ {
@#C1
method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
super.{self::_PointerEvent&Object&Diagnosticable::debugFillProperties}(properties);
}
}
abstract class _CopyPointerScrollEvent extends self::PointerEvent /*isMixinDeclaration*/ {
}
abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription = self::PointerSignalEvent with self::_PointerEventDescription /*isAnonymousMixin*/ {
synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription
: super self::PointerSignalEvent::•()
;
mixin-super-stub method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void
return super.{self::_PointerEventDescription::debugFillProperties}(properties);
}
abstract class _PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent = self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription with self::_CopyPointerScrollEvent /*isAnonymousMixin*/ {
synthetic constructor •() → self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent
: super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::•()
;
}
class PointerScrollEvent extends self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent {
synthetic constructor •() → self::PointerScrollEvent
: super self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription&_CopyPointerScrollEvent::•()
;
@#C1
method debugFillProperties(self::DiagnosticPropertiesBuilder properties) → void {
super.{self::_PointerScrollEvent&PointerSignalEvent&_PointerEventDescription::debugFillProperties}(properties);
}
}
static method main() → dynamic {
new self::PointerScrollEvent::•().{self::PointerScrollEvent::debugFillProperties}(new self::DiagnosticPropertiesBuilder::•()){(self::DiagnosticPropertiesBuilder) → void};
}
constants {
#C1 = core::_Override {}
}

View file

@ -181,6 +181,7 @@ none/mixin_covariant: TextSerializationFailure
none/operator: TypeCheckError
none/property_get: TypeCheckError
none/property_set: TypeCheckError
none/mixin_super: TextSerializationFailure
none/tearoff_opt_out: TextSerializationFailure
rasta/abstract_constructor: RuntimeError
rasta/bad_constructor_redirection: RuntimeError

View file

@ -0,0 +1,34 @@
// Copyright (c) 2021, 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.md file.
mixin Diagnosticable {
void debugFillProperties(DiagnosticPropertiesBuilder properties) {}
}
class DiagnosticPropertiesBuilder {}
abstract class PointerEvent with Diagnosticable {}
abstract class PointerSignalEvent extends PointerEvent {}
mixin _PointerEventDescription on PointerEvent {
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
super.debugFillProperties(properties);
}
}
mixin _CopyPointerScrollEvent on PointerEvent {}
class PointerScrollEvent extends PointerSignalEvent
with _PointerEventDescription, _CopyPointerScrollEvent {
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
super.debugFillProperties(properties);
}
}
main() {
new PointerScrollEvent()
.debugFillProperties(new DiagnosticPropertiesBuilder());
}

View file

@ -0,0 +1,6 @@
# Copyright (c) 2021, 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.
dependencies:
main: []