[cfe,vm,wasm] Handle private injected members like augmentations

This changes the way the CFE handled private injected members. Previously
these were "hidden" within the patch library in which they were declared.
Now they are, like with members injected in augmentation libraries, fully
integrated and accessible within the origin library and all its patches.

This change revealed that the vm and wasm platforms had some
inconsistently declared classes in which injected private members that
were not implemented by all implementing classes. For these, throwing
stubs have been added.

Cq-Include-Trybots: luci.dart.try:dart2wasm-linux-x64-d8-try
Change-Id: I330eade944964ef43b83aa416baef75e3649d023
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/262340
Reviewed-by: Jens Johansen <jensj@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Daco Harkes <dacoharkes@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
Johnni Winther 2022-10-04 14:43:43 +00:00 committed by Commit Queue
parent b7debf00f7
commit 5b2e23eab0
20 changed files with 813 additions and 61 deletions

View file

@ -1282,8 +1282,8 @@ abstract class MergedScope<T extends Builder> {
void _addBuilderToMergedScope(T parentBuilder, String name,
Builder newBuilder, Builder? existingBuilder,
{required bool setter}) {
if (parentBuilder.isAugmentation) {
if (existingBuilder != null) {
if (existingBuilder != null) {
if (parentBuilder.isAugmentation) {
if (newBuilder.isAugmentation) {
existingBuilder.applyPatch(newBuilder);
} else {
@ -1322,24 +1322,33 @@ abstract class MergedScope<T extends Builder> {
]);
}
} else {
if (newBuilder.isAugmentation) {
Message message;
if (newBuilder is SourceMemberBuilder) {
if (_origin is SourceLibraryBuilder) {
message = templateUnmatchedAugmentationLibraryMember
.withArguments(name);
} else {
message =
templateUnmatchedAugmentationClassMember.withArguments(name);
}
} else if (newBuilder is SourceClassBuilder) {
message = templateUnmatchedAugmentationClass.withArguments(name);
// Patch libraries implicitly assume matching members are patch
// members.
existingBuilder.applyPatch(newBuilder);
}
} else {
if (newBuilder.isAugmentation) {
Message message;
if (newBuilder is SourceMemberBuilder) {
if (_origin is SourceLibraryBuilder) {
message =
templateUnmatchedAugmentationLibraryMember.withArguments(name);
} else {
message =
templateUnmatchedAugmentationDeclaration.withArguments(name);
templateUnmatchedAugmentationClassMember.withArguments(name);
}
originLibrary.addProblem(
message, newBuilder.charOffset, name.length, newBuilder.fileUri);
} else if (newBuilder is SourceClassBuilder) {
message = templateUnmatchedAugmentationClass.withArguments(name);
} else {
message =
templateUnmatchedAugmentationDeclaration.withArguments(name);
}
originLibrary.addProblem(
message, newBuilder.charOffset, name.length, newBuilder.fileUri);
} else {
if (!parentBuilder.isAugmentation && !name.startsWith('_')) {
// We special-case public members injected in patch libraries.
_addInjectedPatchMember(name, newBuilder);
} else {
_originScope.addLocalMember(name, newBuilder, setter: setter);
for (Scope augmentationScope in _augmentationScopes.values) {
@ -1348,14 +1357,6 @@ abstract class MergedScope<T extends Builder> {
}
}
}
} else {
if (existingBuilder != null) {
// Patch libraries implicitly assume matching members are patch
// members.
existingBuilder.applyPatch(newBuilder);
} else {
_addInjectedPatchMember(name, newBuilder);
}
}
}
@ -1419,29 +1420,8 @@ class MergedLibraryScope extends MergedScope<SourceLibraryBuilder> {
@override
void _addInjectedPatchMember(String name, Builder newBuilder) {
if (name.startsWith('_')) {
injectMemberFromPatch(name, newBuilder);
} else {
exportMemberFromPatch(name, newBuilder);
}
}
void injectMemberFromPatch(String name, Builder member) {
if (member.isSetter) {
assert(
_originScope.lookupLocalMember(name, setter: true) == null,
"Setter $name already bound to "
"${_originScope.lookupLocalMember(name, setter: true)}, "
"trying to add $member.");
_originScope.addLocalMember(name, member as MemberBuilder, setter: true);
} else {
assert(
_originScope.lookupLocalMember(name, setter: false) == null,
"Member $name already bound to "
"${_originScope.lookupLocalMember(name, setter: false)}, "
"trying to add $member.");
_originScope.addLocalMember(name, member, setter: false);
}
assert(!name.startsWith('_'), "Unexpected private member $newBuilder");
exportMemberFromPatch(name, newBuilder);
}
void exportMemberFromPatch(String name, Builder member) {

View file

@ -7,9 +7,9 @@
/*class: PatchedClass:
kernel-members=[
PatchedClass.,
_field
]
PatchedClass.,
_field],
scope=[_field]
*/
class PatchedClass {
external const PatchedClass({int field});

View file

@ -10,7 +10,9 @@
PatchedClass.,
_privateField,
publicField],
scope=[publicField]
scope=[
_privateField,
publicField]
*/
class PatchedClass {
int publicField;

View file

@ -0,0 +1,13 @@
{
"none": {
"libraries": {
"test": {
"patches": [
"patch_lib1.dart",
"patch_lib2.dart"
],
"uri": "origin_lib.dart"
}
}
}
}

View file

@ -0,0 +1,7 @@
// Copyright (c) 2022, 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.
import 'dart:test';
main() {}

View file

@ -0,0 +1,3 @@
import 'dart:test';
main() {}

View file

@ -0,0 +1,3 @@
import 'dart:test';
main() {}

View file

@ -0,0 +1,144 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:test";
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/general/inject_private_patch/origin_lib.dart:35:7: Error: The non-abstract class 'ClassImplements' is missing implementations for these members:
// - Class._privateInjectedInstanceMember1
// - Class._privateInjectedInstanceMember2
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
// - mark the class as abstract, or
// - provide a 'noSuchMethod' implementation.
//
// class ClassImplements
// ^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/inject_private_patch/patch_lib1.dart:10:8: Context: 'Class._privateInjectedInstanceMember1' is defined here.
// void _privateInjectedInstanceMember1(Class c) {
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/inject_private_patch/patch_lib2.dart:10:8: Context: 'Class._privateInjectedInstanceMember2' is defined here.
// void _privateInjectedInstanceMember2(Class c) {
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/inject_private_patch/origin_lib.dart:32:8: Error: The method 'ClassExtends._privateInstanceMember' has fewer positional arguments than those of overridden method 'Class._privateInstanceMember'.
// void _privateInstanceMember() {}
// ^
// pkg/front_end/testcases/general/inject_private_patch/origin_lib.dart:6:8: Context: This is the overridden method ('_privateInstanceMember').
// void _privateInstanceMember(Class c) {
// ^
//
// pkg/front_end/testcases/general/inject_private_patch/origin_lib.dart:37:8: Error: The method 'ClassImplements._privateInstanceMember' has fewer positional arguments than those of overridden method 'Class._privateInstanceMember'.
// void _privateInstanceMember() {}
// ^
// pkg/front_end/testcases/general/inject_private_patch/origin_lib.dart:6:8: Context: This is the overridden method ('_privateInstanceMember').
// void _privateInstanceMember(Class c) {
// ^
//
import self as self2;
import "dart:_internal" as _in;
import "dart:core" as core;
import "dart:_internal";
import "dart:_internal";
@#C1
@#C1
class Class extends core::Object {
synthetic constructor •() → self2::Class
: super core::Object::•()
;
method _privateInstanceMember(self2::Class c) → void {
this.{self2::Class::_privateInstanceMember}(c){(self2::Class) → void};
this.{self2::Class::_privateInjectedInstanceMember1}(c){(self2::Class) → void};
this.{self2::Class::_privateInjectedInstanceMember2}(c){(self2::Class) → void};
c.{self2::Class::_privateInstanceMember}(c){(self2::Class) → void};
c.{self2::Class::_privateInjectedInstanceMember1}(c){(self2::Class) → void};
c.{self2::Class::_privateInjectedInstanceMember2}(c){(self2::Class) → void};
}
static method _privateStaticMember() → void {
self2::Class::_privateStaticMember();
self2::Class::_privateInjectedStaticMember1();
self2::Class::_privateInjectedStaticMember2();
self2::Class::_privateStaticMember();
self2::Class::_privateInjectedStaticMember1();
self2::Class::_privateInjectedStaticMember2();
}
method /* from org-dartlang-testcase:///patch_lib1.dart */ _privateInjectedInstanceMember1(self2::Class c) → void {
this.{self2::Class::_privateInstanceMember}(c){(self2::Class) → void};
this.{self2::Class::_privateInjectedInstanceMember1}(c){(self2::Class) → void};
this.{self2::Class::_privateInjectedInstanceMember2}(c){(self2::Class) → void};
c.{self2::Class::_privateInstanceMember}(c){(self2::Class) → void};
c.{self2::Class::_privateInjectedInstanceMember1}(c){(self2::Class) → void};
c.{self2::Class::_privateInjectedInstanceMember2}(c){(self2::Class) → void};
}
static method /* from org-dartlang-testcase:///patch_lib1.dart */ _privateInjectedStaticMember1() → void {
self2::Class::_privateStaticMember();
self2::Class::_privateInjectedStaticMember1();
self2::Class::_privateInjectedStaticMember2();
self2::Class::_privateStaticMember();
self2::Class::_privateInjectedStaticMember1();
self2::Class::_privateInjectedStaticMember2();
}
method /* from org-dartlang-testcase:///patch_lib2.dart */ _privateInjectedInstanceMember2(self2::Class c) → void {
this.{self2::Class::_privateInstanceMember}(c){(self2::Class) → void};
this.{self2::Class::_privateInjectedInstanceMember1}(c){(self2::Class) → void};
this.{self2::Class::_privateInjectedInstanceMember2}(c){(self2::Class) → void};
c.{self2::Class::_privateInstanceMember}(c){(self2::Class) → void};
c.{self2::Class::_privateInjectedInstanceMember1}(c){(self2::Class) → void};
c.{self2::Class::_privateInjectedInstanceMember2}(c){(self2::Class) → void};
}
static method /* from org-dartlang-testcase:///patch_lib2.dart */ _privateInjectedStaticMember2() → void {
self2::Class::_privateStaticMember();
self2::Class::_privateInjectedStaticMember1();
self2::Class::_privateInjectedStaticMember2();
self2::Class::_privateStaticMember();
self2::Class::_privateInjectedStaticMember1();
self2::Class::_privateInjectedStaticMember2();
}
}
class ClassExtends extends self2::Class {
synthetic constructor •() → self2::ClassExtends
: super self2::Class::•()
;
method _privateInstanceMember() → void {}
}
class ClassImplements extends core::Object implements self2::Class {
synthetic constructor •() → self2::ClassImplements
: super core::Object::•()
;
method _privateInstanceMember() → void {}
no-such-method-forwarder method _privateInjectedInstanceMember1(self2::Class c) → void
return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[c]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic};
no-such-method-forwarder method _privateInjectedInstanceMember2(self2::Class c) → void
return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[c]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic};
}
static method _privateTopLevelMember() → void {
self2::_privateTopLevelMember();
self2::_privateInjectedTopLevelMember1();
self2::_privateInjectedTopLevelMember2();
}
static method /* from org-dartlang-testcase:///patch_lib1.dart */ _privateInjectedTopLevelMember1() → void {
self2::_privateTopLevelMember();
self2::_privateInjectedTopLevelMember1();
self2::_privateInjectedTopLevelMember2();
}
static method /* from org-dartlang-testcase:///patch_lib2.dart */ _privateInjectedTopLevelMember2() → void {
self2::_privateTopLevelMember();
self2::_privateInjectedTopLevelMember1();
self2::_privateInjectedTopLevelMember2();
}
constants {
#C1 = _in::_Patch {}
#C2 = #dart:test::_privateInjectedInstanceMember1
#C3 = <core::Type*>[]
#C4 = <core::Symbol*, dynamic>{)
#C5 = #dart:test::_privateInjectedInstanceMember2
}

View file

@ -0,0 +1,144 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:test";
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/general/inject_private_patch/origin_lib.dart:35:7: Error: The non-abstract class 'ClassImplements' is missing implementations for these members:
// - Class._privateInjectedInstanceMember1
// - Class._privateInjectedInstanceMember2
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
// - mark the class as abstract, or
// - provide a 'noSuchMethod' implementation.
//
// class ClassImplements
// ^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/inject_private_patch/patch_lib1.dart:10:8: Context: 'Class._privateInjectedInstanceMember1' is defined here.
// void _privateInjectedInstanceMember1(Class c) {
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/inject_private_patch/patch_lib2.dart:10:8: Context: 'Class._privateInjectedInstanceMember2' is defined here.
// void _privateInjectedInstanceMember2(Class c) {
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/inject_private_patch/origin_lib.dart:32:8: Error: The method 'ClassExtends._privateInstanceMember' has fewer positional arguments than those of overridden method 'Class._privateInstanceMember'.
// void _privateInstanceMember() {}
// ^
// pkg/front_end/testcases/general/inject_private_patch/origin_lib.dart:6:8: Context: This is the overridden method ('_privateInstanceMember').
// void _privateInstanceMember(Class c) {
// ^
//
// pkg/front_end/testcases/general/inject_private_patch/origin_lib.dart:37:8: Error: The method 'ClassImplements._privateInstanceMember' has fewer positional arguments than those of overridden method 'Class._privateInstanceMember'.
// void _privateInstanceMember() {}
// ^
// pkg/front_end/testcases/general/inject_private_patch/origin_lib.dart:6:8: Context: This is the overridden method ('_privateInstanceMember').
// void _privateInstanceMember(Class c) {
// ^
//
import self as self2;
import "dart:_internal" as _in;
import "dart:core" as core;
import "dart:_internal";
import "dart:_internal";
@#C1
@#C1
class Class extends core::Object {
synthetic constructor •() → self2::Class
: super core::Object::•()
;
method _privateInstanceMember(self2::Class c) → void {
this.{self2::Class::_privateInstanceMember}(c){(self2::Class) → void};
this.{self2::Class::_privateInjectedInstanceMember1}(c){(self2::Class) → void};
this.{self2::Class::_privateInjectedInstanceMember2}(c){(self2::Class) → void};
c.{self2::Class::_privateInstanceMember}(c){(self2::Class) → void};
c.{self2::Class::_privateInjectedInstanceMember1}(c){(self2::Class) → void};
c.{self2::Class::_privateInjectedInstanceMember2}(c){(self2::Class) → void};
}
static method _privateStaticMember() → void {
self2::Class::_privateStaticMember();
self2::Class::_privateInjectedStaticMember1();
self2::Class::_privateInjectedStaticMember2();
self2::Class::_privateStaticMember();
self2::Class::_privateInjectedStaticMember1();
self2::Class::_privateInjectedStaticMember2();
}
method /* from org-dartlang-testcase:///patch_lib1.dart */ _privateInjectedInstanceMember1(self2::Class c) → void {
this.{self2::Class::_privateInstanceMember}(c){(self2::Class) → void};
this.{self2::Class::_privateInjectedInstanceMember1}(c){(self2::Class) → void};
this.{self2::Class::_privateInjectedInstanceMember2}(c){(self2::Class) → void};
c.{self2::Class::_privateInstanceMember}(c){(self2::Class) → void};
c.{self2::Class::_privateInjectedInstanceMember1}(c){(self2::Class) → void};
c.{self2::Class::_privateInjectedInstanceMember2}(c){(self2::Class) → void};
}
static method /* from org-dartlang-testcase:///patch_lib1.dart */ _privateInjectedStaticMember1() → void {
self2::Class::_privateStaticMember();
self2::Class::_privateInjectedStaticMember1();
self2::Class::_privateInjectedStaticMember2();
self2::Class::_privateStaticMember();
self2::Class::_privateInjectedStaticMember1();
self2::Class::_privateInjectedStaticMember2();
}
method /* from org-dartlang-testcase:///patch_lib2.dart */ _privateInjectedInstanceMember2(self2::Class c) → void {
this.{self2::Class::_privateInstanceMember}(c){(self2::Class) → void};
this.{self2::Class::_privateInjectedInstanceMember1}(c){(self2::Class) → void};
this.{self2::Class::_privateInjectedInstanceMember2}(c){(self2::Class) → void};
c.{self2::Class::_privateInstanceMember}(c){(self2::Class) → void};
c.{self2::Class::_privateInjectedInstanceMember1}(c){(self2::Class) → void};
c.{self2::Class::_privateInjectedInstanceMember2}(c){(self2::Class) → void};
}
static method /* from org-dartlang-testcase:///patch_lib2.dart */ _privateInjectedStaticMember2() → void {
self2::Class::_privateStaticMember();
self2::Class::_privateInjectedStaticMember1();
self2::Class::_privateInjectedStaticMember2();
self2::Class::_privateStaticMember();
self2::Class::_privateInjectedStaticMember1();
self2::Class::_privateInjectedStaticMember2();
}
}
class ClassExtends extends self2::Class {
synthetic constructor •() → self2::ClassExtends
: super self2::Class::•()
;
method _privateInstanceMember() → void {}
}
class ClassImplements extends core::Object implements self2::Class {
synthetic constructor •() → self2::ClassImplements
: super core::Object::•()
;
method _privateInstanceMember() → void {}
no-such-method-forwarder method _privateInjectedInstanceMember1(self2::Class c) → void
return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[c]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic};
no-such-method-forwarder method _privateInjectedInstanceMember2(self2::Class c) → void
return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[c]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic};
}
static method _privateTopLevelMember() → void {
self2::_privateTopLevelMember();
self2::_privateInjectedTopLevelMember1();
self2::_privateInjectedTopLevelMember2();
}
static method /* from org-dartlang-testcase:///patch_lib1.dart */ _privateInjectedTopLevelMember1() → void {
self2::_privateTopLevelMember();
self2::_privateInjectedTopLevelMember1();
self2::_privateInjectedTopLevelMember2();
}
static method /* from org-dartlang-testcase:///patch_lib2.dart */ _privateInjectedTopLevelMember2() → void {
self2::_privateTopLevelMember();
self2::_privateInjectedTopLevelMember1();
self2::_privateInjectedTopLevelMember2();
}
constants {
#C1 = _in::_Patch {}
#C2 = #dart:test::_privateInjectedInstanceMember1
#C3 = <core::Type*>[]
#C4 = <core::Symbol*, dynamic>{)
#C5 = #dart:test::_privateInjectedInstanceMember2
}

View file

@ -0,0 +1,103 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:test";
static method main() → dynamic
;
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/general/inject_private_patch/origin_lib.dart:35:7: Error: The non-abstract class 'ClassImplements' is missing implementations for these members:
// - Class._privateInjectedInstanceMember1
// - Class._privateInjectedInstanceMember2
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
// - mark the class as abstract, or
// - provide a 'noSuchMethod' implementation.
//
// class ClassImplements
// ^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/inject_private_patch/patch_lib1.dart:10:8: Context: 'Class._privateInjectedInstanceMember1' is defined here.
// void _privateInjectedInstanceMember1(Class c) {
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/inject_private_patch/patch_lib2.dart:10:8: Context: 'Class._privateInjectedInstanceMember2' is defined here.
// void _privateInjectedInstanceMember2(Class c) {
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/inject_private_patch/origin_lib.dart:32:8: Error: The method 'ClassExtends._privateInstanceMember' has fewer positional arguments than those of overridden method 'Class._privateInstanceMember'.
// void _privateInstanceMember() {}
// ^
// pkg/front_end/testcases/general/inject_private_patch/origin_lib.dart:6:8: Context: This is the overridden method ('_privateInstanceMember').
// void _privateInstanceMember(Class c) {
// ^
//
// pkg/front_end/testcases/general/inject_private_patch/origin_lib.dart:37:8: Error: The method 'ClassImplements._privateInstanceMember' has fewer positional arguments than those of overridden method 'Class._privateInstanceMember'.
// void _privateInstanceMember() {}
// ^
// pkg/front_end/testcases/general/inject_private_patch/origin_lib.dart:6:8: Context: This is the overridden method ('_privateInstanceMember').
// void _privateInstanceMember(Class c) {
// ^
//
import self as self2;
import "dart:_internal" as _in;
import "dart:core" as core;
import "dart:_internal";
import "dart:_internal";
@_in::patch
@_in::patch
class Class extends core::Object {
synthetic constructor •() → self2::Class
;
method _privateInstanceMember(self2::Class c) → void
;
static method _privateStaticMember() → void
;
method /* from org-dartlang-testcase:///patch_lib1.dart */ _privateInjectedInstanceMember1(self2::Class c) → void
;
static method /* from org-dartlang-testcase:///patch_lib1.dart */ _privateInjectedStaticMember1() → void
;
method /* from org-dartlang-testcase:///patch_lib2.dart */ _privateInjectedInstanceMember2(self2::Class c) → void
;
static method /* from org-dartlang-testcase:///patch_lib2.dart */ _privateInjectedStaticMember2() → void
;
}
class ClassExtends extends self2::Class {
synthetic constructor •() → self2::ClassExtends
;
method _privateInstanceMember() → void
;
}
class ClassImplements extends core::Object implements self2::Class {
synthetic constructor •() → self2::ClassImplements
;
method _privateInstanceMember() → void
;
no-such-method-forwarder method _privateInjectedInstanceMember1(self2::Class c) → void
return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_privateInjectedInstanceMember1, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[c]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))){(core::Invocation) → dynamic};
no-such-method-forwarder method _privateInjectedInstanceMember2(self2::Class c) → void
return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_privateInjectedInstanceMember2, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[c]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))){(core::Invocation) → dynamic};
}
static method _privateTopLevelMember() → void
;
static method /* from org-dartlang-testcase:///patch_lib1.dart */ _privateInjectedTopLevelMember1() → void
;
static method /* from org-dartlang-testcase:///patch_lib2.dart */ _privateInjectedTopLevelMember2() → void
;
Extra constant evaluation status:
Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:7:8 -> InstanceConstant(const _Patch{})
Evaluated: StaticGet @ org-dartlang-testcase:///origin_lib.dart:7:8 -> InstanceConstant(const _Patch{})
Evaluated: SymbolLiteral @ org-dartlang-testcase:///origin_lib.dart:35:7 -> SymbolConstant(#_privateInjectedInstanceMember1)
Evaluated: ListLiteral @ org-dartlang-testcase:///origin_lib.dart:35:7 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///origin_lib.dart:35:7 -> MapConstant(const <Symbol*, dynamic>{})
Evaluated: SymbolLiteral @ org-dartlang-testcase:///origin_lib.dart:35:7 -> SymbolConstant(#_privateInjectedInstanceMember2)
Evaluated: ListLiteral @ org-dartlang-testcase:///origin_lib.dart:35:7 -> ListConstant(const <Type*>[])
Evaluated: MapLiteral @ org-dartlang-testcase:///origin_lib.dart:35:7 -> MapConstant(const <Symbol*, dynamic>{})
Extra constant evaluation: evaluated: 22, effectively constant: 8

View file

@ -0,0 +1,144 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:test";
static method main() → dynamic {}
library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/general/inject_private_patch/origin_lib.dart:35:7: Error: The non-abstract class 'ClassImplements' is missing implementations for these members:
// - Class._privateInjectedInstanceMember1
// - Class._privateInjectedInstanceMember2
// Try to either
// - provide an implementation,
// - inherit an implementation from a superclass or mixin,
// - mark the class as abstract, or
// - provide a 'noSuchMethod' implementation.
//
// class ClassImplements
// ^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/inject_private_patch/patch_lib1.dart:10:8: Context: 'Class._privateInjectedInstanceMember1' is defined here.
// void _privateInjectedInstanceMember1(Class c) {
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// pkg/front_end/testcases/general/inject_private_patch/patch_lib2.dart:10:8: Context: 'Class._privateInjectedInstanceMember2' is defined here.
// void _privateInjectedInstanceMember2(Class c) {
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/general/inject_private_patch/origin_lib.dart:32:8: Error: The method 'ClassExtends._privateInstanceMember' has fewer positional arguments than those of overridden method 'Class._privateInstanceMember'.
// void _privateInstanceMember() {}
// ^
// pkg/front_end/testcases/general/inject_private_patch/origin_lib.dart:6:8: Context: This is the overridden method ('_privateInstanceMember').
// void _privateInstanceMember(Class c) {
// ^
//
// pkg/front_end/testcases/general/inject_private_patch/origin_lib.dart:37:8: Error: The method 'ClassImplements._privateInstanceMember' has fewer positional arguments than those of overridden method 'Class._privateInstanceMember'.
// void _privateInstanceMember() {}
// ^
// pkg/front_end/testcases/general/inject_private_patch/origin_lib.dart:6:8: Context: This is the overridden method ('_privateInstanceMember').
// void _privateInstanceMember(Class c) {
// ^
//
import self as self2;
import "dart:_internal" as _in;
import "dart:core" as core;
import "dart:_internal";
import "dart:_internal";
@#C1
@#C1
class Class extends core::Object {
synthetic constructor •() → self2::Class
: super core::Object::•()
;
method _privateInstanceMember(self2::Class c) → void {
this.{self2::Class::_privateInstanceMember}(c){(self2::Class) → void};
this.{self2::Class::_privateInjectedInstanceMember1}(c){(self2::Class) → void};
this.{self2::Class::_privateInjectedInstanceMember2}(c){(self2::Class) → void};
c.{self2::Class::_privateInstanceMember}(c){(self2::Class) → void};
c.{self2::Class::_privateInjectedInstanceMember1}(c){(self2::Class) → void};
c.{self2::Class::_privateInjectedInstanceMember2}(c){(self2::Class) → void};
}
static method _privateStaticMember() → void {
self2::Class::_privateStaticMember();
self2::Class::_privateInjectedStaticMember1();
self2::Class::_privateInjectedStaticMember2();
self2::Class::_privateStaticMember();
self2::Class::_privateInjectedStaticMember1();
self2::Class::_privateInjectedStaticMember2();
}
method /* from org-dartlang-testcase:///patch_lib1.dart */ _privateInjectedInstanceMember1(self2::Class c) → void {
this.{self2::Class::_privateInstanceMember}(c){(self2::Class) → void};
this.{self2::Class::_privateInjectedInstanceMember1}(c){(self2::Class) → void};
this.{self2::Class::_privateInjectedInstanceMember2}(c){(self2::Class) → void};
c.{self2::Class::_privateInstanceMember}(c){(self2::Class) → void};
c.{self2::Class::_privateInjectedInstanceMember1}(c){(self2::Class) → void};
c.{self2::Class::_privateInjectedInstanceMember2}(c){(self2::Class) → void};
}
static method /* from org-dartlang-testcase:///patch_lib1.dart */ _privateInjectedStaticMember1() → void {
self2::Class::_privateStaticMember();
self2::Class::_privateInjectedStaticMember1();
self2::Class::_privateInjectedStaticMember2();
self2::Class::_privateStaticMember();
self2::Class::_privateInjectedStaticMember1();
self2::Class::_privateInjectedStaticMember2();
}
method /* from org-dartlang-testcase:///patch_lib2.dart */ _privateInjectedInstanceMember2(self2::Class c) → void {
this.{self2::Class::_privateInstanceMember}(c){(self2::Class) → void};
this.{self2::Class::_privateInjectedInstanceMember1}(c){(self2::Class) → void};
this.{self2::Class::_privateInjectedInstanceMember2}(c){(self2::Class) → void};
c.{self2::Class::_privateInstanceMember}(c){(self2::Class) → void};
c.{self2::Class::_privateInjectedInstanceMember1}(c){(self2::Class) → void};
c.{self2::Class::_privateInjectedInstanceMember2}(c){(self2::Class) → void};
}
static method /* from org-dartlang-testcase:///patch_lib2.dart */ _privateInjectedStaticMember2() → void {
self2::Class::_privateStaticMember();
self2::Class::_privateInjectedStaticMember1();
self2::Class::_privateInjectedStaticMember2();
self2::Class::_privateStaticMember();
self2::Class::_privateInjectedStaticMember1();
self2::Class::_privateInjectedStaticMember2();
}
}
class ClassExtends extends self2::Class {
synthetic constructor •() → self2::ClassExtends
: super self2::Class::•()
;
method _privateInstanceMember() → void {}
}
class ClassImplements extends core::Object implements self2::Class {
synthetic constructor •() → self2::ClassImplements
: super core::Object::•()
;
method _privateInstanceMember() → void {}
no-such-method-forwarder method _privateInjectedInstanceMember1(self2::Class c) → void
return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 0, #C3, core::List::unmodifiable<dynamic>(core::_GrowableList::_literal1<dynamic>(c)), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic};
no-such-method-forwarder method _privateInjectedInstanceMember2(self2::Class c) → void
return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 0, #C3, core::List::unmodifiable<dynamic>(core::_GrowableList::_literal1<dynamic>(c)), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))){(core::Invocation) → dynamic};
}
static method _privateTopLevelMember() → void {
self2::_privateTopLevelMember();
self2::_privateInjectedTopLevelMember1();
self2::_privateInjectedTopLevelMember2();
}
static method /* from org-dartlang-testcase:///patch_lib1.dart */ _privateInjectedTopLevelMember1() → void {
self2::_privateTopLevelMember();
self2::_privateInjectedTopLevelMember1();
self2::_privateInjectedTopLevelMember2();
}
static method /* from org-dartlang-testcase:///patch_lib2.dart */ _privateInjectedTopLevelMember2() → void {
self2::_privateTopLevelMember();
self2::_privateInjectedTopLevelMember1();
self2::_privateInjectedTopLevelMember2();
}
constants {
#C1 = _in::_Patch {}
#C2 = #dart:test::_privateInjectedInstanceMember1
#C3 = <core::Type*>[]
#C4 = <core::Symbol*, dynamic>{)
#C5 = #dart:test::_privateInjectedInstanceMember2
}

View file

@ -0,0 +1,38 @@
// Copyright (c) 2022, 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.
class Class {
void _privateInstanceMember(Class c) {
_privateInstanceMember(c);
_privateInjectedInstanceMember1(c);
_privateInjectedInstanceMember2(c);
c._privateInstanceMember(c);
c._privateInjectedInstanceMember1(c);
c._privateInjectedInstanceMember2(c);
}
static void _privateStaticMember() {
_privateStaticMember();
_privateInjectedStaticMember1();
_privateInjectedStaticMember2();
Class._privateStaticMember();
Class._privateInjectedStaticMember1();
Class._privateInjectedStaticMember2();
}
}
void _privateTopLevelMember() {
_privateTopLevelMember();
_privateInjectedTopLevelMember1();
_privateInjectedTopLevelMember2();
}
class ClassExtends extends Class /* Ok */ {
void _privateInstanceMember() {}
}
class ClassImplements
implements Class /* // Error, missing (injected) members. */ {
void _privateInstanceMember() {}
}

View file

@ -0,0 +1,33 @@
// Copyright (c) 2022, 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.
// ignore: import_internal_library
import 'dart:_internal';
@patch
class Class {
void _privateInjectedInstanceMember1(Class c) {
_privateInstanceMember(c);
_privateInjectedInstanceMember1(c);
_privateInjectedInstanceMember2(c);
c._privateInstanceMember(c);
c._privateInjectedInstanceMember1(c);
c._privateInjectedInstanceMember2(c);
}
static void _privateInjectedStaticMember1() {
_privateStaticMember();
_privateInjectedStaticMember1();
_privateInjectedStaticMember2();
Class._privateStaticMember();
Class._privateInjectedStaticMember1();
Class._privateInjectedStaticMember2();
}
}
void _privateInjectedTopLevelMember1() {
_privateTopLevelMember();
_privateInjectedTopLevelMember1();
_privateInjectedTopLevelMember2();
}

View file

@ -0,0 +1,33 @@
// Copyright (c) 2022, 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.
// ignore: import_internal_library
import 'dart:_internal';
@patch
class Class {
void _privateInjectedInstanceMember2(Class c) {
_privateInstanceMember(c);
_privateInjectedInstanceMember1(c);
_privateInjectedInstanceMember2(c);
c._privateInstanceMember(c);
c._privateInjectedInstanceMember1(c);
c._privateInjectedInstanceMember2(c);
}
static void _privateInjectedStaticMember2() {
_privateStaticMember();
_privateInjectedStaticMember1();
_privateInjectedStaticMember2();
Class._privateStaticMember();
Class._privateInjectedStaticMember1();
Class._privateInjectedStaticMember2();
}
}
void _privateInjectedTopLevelMember2() {
_privateTopLevelMember();
_privateInjectedTopLevelMember1();
_privateInjectedTopLevelMember2();
}

View file

@ -517,3 +517,33 @@ class _DuplicatedFieldInitializerError extends Error {
toString() => "Error: field '$_name' is already initialized.";
}
// Implementations needed to implement the `_stackTrace` member added
// in the @patch class of [Error].
@patch
class OutOfMemoryError {
StackTrace? get _stackTrace =>
throw UnsupportedError('OutOfMemoryError._stackTrace');
void set _stackTrace(StackTrace? _) {
throw UnsupportedError('OutOfMemoryError._stackTrace');
}
}
@patch
class StackOverflowError {
StackTrace? get _stackTrace =>
throw UnsupportedError('StackOverflowError._stackTrace');
void set _stackTrace(StackTrace? _) {
throw UnsupportedError('StackOverflowError._stackTrace');
}
}
@patch
class IntegerDivisionByZeroException {
StackTrace? get _stackTrace =>
throw UnsupportedError('IntegerDivisionByZeroException._stackTrace');
void set _stackTrace(StackTrace? _) {
throw UnsupportedError('IntegerDivisionByZeroException._stackTrace');
}
}

View file

@ -1076,3 +1076,49 @@ abstract class NativeApi {
static Pointer<Void> get initializeApiDLData =>
Pointer.fromAddress(_initializeApiDLData());
}
// Implementations needed to implement the private member added in the
// patch class of [Array].
@patch
class _ArraySize<T extends NativeType> implements Array<T> {
_checkIndex(int index) => throw UnsupportedError('_ArraySize._checkIndex');
List<int> get _nestedDimensions =>
throw UnsupportedError('_ArraySize._nestedDimensions');
int get _nestedDimensionsFirst =>
throw UnsupportedError('_ArraySize._nestedDimensionsFirst');
int? get _nestedDimensionsFirstCache =>
throw UnsupportedError('_ArraySize._nestedDimensionsFirstCache');
void set _nestedDimensionsFirstCache(int? _) {
throw UnsupportedError('_ArraySize._nestedDimensionsFirstCache');
}
int get _nestedDimensionsFlattened =>
throw UnsupportedError('_ArraySize._nestedDimensionsFlattened');
int? get _nestedDimensionsFlattenedCache =>
throw UnsupportedError('_ArraySize._nestedDimensionsFlattenedCache');
void set _nestedDimensionsFlattenedCache(int? _) {
throw UnsupportedError('_ArraySize._nestedDimensionsFlattenedCache');
}
List<int> get _nestedDimensionsRest =>
throw UnsupportedError('_ArraySize._nestedDimensionsRest');
List<int>? get _nestedDimensionsRestCache =>
throw UnsupportedError('_ArraySize._nestedDimensionsRestCache');
void set _nestedDimensionsRestCache(List<int>? _) {
throw UnsupportedError('_ArraySize._nestedDimensionsRestCache');
}
int get _size => throw UnsupportedError('_ArraySize._size');
Object get _typedDataBase =>
throw UnsupportedError('_ArraySize._typedDataBase');
}

View file

@ -12,7 +12,6 @@ class int {
external const factory int.fromEnvironment(String name,
{int defaultValue = 0});
int _bitAndFromSmi(_Smi other);
int _bitAndFromInteger(int other);
int _bitOrFromInteger(int other);
int _bitXorFromInteger(int other);

View file

@ -31,6 +31,14 @@ class _DeferredNotLoadedError extends Error implements NoSuchMethodError {
String toString() {
return "Deferred library $prefix was not loaded.";
}
// Implementations needed to implement the `_receiver` and `_invocation`
// members added in the @patch class of [NoSuchMethodError].
Object? get _receiver =>
throw UnsupportedError('_DeferredNotLoadedError._receiver');
Invocation get _invocation =>
throw UnsupportedError('_DeferredNotLoadedError._invocation');
}
@pragma("vm:entry-point")

View file

@ -167,3 +167,33 @@ class StateError {
throw new StateError(msg);
}
}
// Implementations needed to implement the `_stackTrace` member added
// in the @patch class of [Error].
@patch
class OutOfMemoryError {
StackTrace? get _stackTrace =>
throw UnsupportedError('OutOfMemoryError._stackTrace');
void set _stackTrace(StackTrace? _) {
throw UnsupportedError('OutOfMemoryError._stackTrace');
}
}
@patch
class StackOverflowError {
StackTrace? get _stackTrace =>
throw UnsupportedError('StackOverflowError._stackTrace');
void set _stackTrace(StackTrace? _) {
throw UnsupportedError('StackOverflowError._stackTrace');
}
}
@patch
class IntegerDivisionByZeroException {
StackTrace? get _stackTrace =>
throw UnsupportedError('IntegerDivisionByZeroException._stackTrace');
void set _stackTrace(StackTrace? _) {
throw UnsupportedError('IntegerDivisionByZeroException._stackTrace');
}
}

View file

@ -12,14 +12,6 @@ class int {
external const factory int.fromEnvironment(String name,
{int defaultValue = 0});
int _bitAndFromSmi(_Smi other);
int _bitAndFromInteger(int other);
int _bitOrFromInteger(int other);
int _bitXorFromInteger(int other);
int _shlFromInteger(int other);
int _shrFromInteger(int other);
int _ushrFromInteger(int other);
static int? _tryParseSmi(String str, int first, int last) {
assert(first <= last);
var ix = first;