From 56e581aa3415858bbaf22bee23be705a68f8a03e Mon Sep 17 00:00:00 2001 From: Daco Harkes Date: Fri, 9 Dec 2022 12:53:28 +0000 Subject: [PATCH] [3.0 alpha] Move `AbstractClassInstantiationError` to `dart:mirrors` Split off https://dart-review.googlesource.com/c/sdk/+/259041 so that the VM changes can be landed separately. TEST=tests/lib/mirrors/instantiate_abstract_class_test.dart Bug: https://github.com/dart-lang/sdk/issues/49529 Change-Id: Ic06dee0dfeaea64d9d9ffd9511ec66d9d0837e7e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/274383 Reviewed-by: Michael Thomsen Reviewed-by: Tess Strickland Commit-Queue: Daco Harkes Reviewed-by: Johnni Winther --- .../lib/src/fasta/source/source_loader.dart | 2 -- .../testcases/general/bad_setter_abstract.dart | 2 +- .../bad_setter_abstract.dart.weak.expect | 2 +- ...ad_setter_abstract.dart.weak.modular.expect | 2 +- ...etter_abstract.dart.weak.transformed.expect | 2 +- .../main.dart.weak.expect | 1 - .../main.dart.weak.outline.expect | 1 - .../main.dart.weak.transformed.expect | 1 - .../export_core.yaml.world.2.expect | 1 - .../export_core.yaml.world.3.expect | 1 - runtime/tests/vm/dart/regress_47010_test.dart | 5 +---- .../tests/vm/dart_2/regress_40462_test.dart | 3 +-- runtime/vm/exceptions.cc | 6 +++++- .../js_dev_runtime/patch/core_patch.dart | 6 ------ .../js_dev_runtime/private/js_helper.dart | 4 ---- .../_internal/js_runtime/lib/core_patch.dart | 6 ------ sdk/lib/_internal/vm/lib/errors_patch.dart | 18 ------------------ sdk/lib/_internal/vm/lib/mirrors_patch.dart | 18 ++++++++++++++++++ sdk/lib/core/errors.dart | 12 ------------ sdk/lib/mirrors/mirrors.dart | 9 +++++++-- 20 files changed, 36 insertions(+), 66 deletions(-) diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart index b899fb222f8..726ded7aad8 100644 --- a/pkg/front_end/lib/src/fasta/source/source_loader.dart +++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart @@ -2825,8 +2825,6 @@ abstract class pragma { Object options; } -class AbstractClassInstantiationError {} - class NoSuchMethodError { factory NoSuchMethodError.withInvocation(receiver, invocation) => throw ''; } diff --git a/pkg/front_end/testcases/general/bad_setter_abstract.dart b/pkg/front_end/testcases/general/bad_setter_abstract.dart index 30e02c2ca5d..7761f68a72c 100644 --- a/pkg/front_end/testcases/general/bad_setter_abstract.dart +++ b/pkg/front_end/testcases/general/bad_setter_abstract.dart @@ -65,7 +65,7 @@ test() { threw = true; new B(); threw = false; - } on AbstractClassInstantiationError catch (_) { + } on Error catch (_) { // Ignored. } if (!threw) { diff --git a/pkg/front_end/testcases/general/bad_setter_abstract.dart.weak.expect b/pkg/front_end/testcases/general/bad_setter_abstract.dart.weak.expect index d7a1bf27246..427098b5720 100644 --- a/pkg/front_end/testcases/general/bad_setter_abstract.dart.weak.expect +++ b/pkg/front_end/testcases/general/bad_setter_abstract.dart.weak.expect @@ -151,7 +151,7 @@ static method test() → dynamic { invalid-expression "The class 'B' is abstract and can't be instantiated."; threw = false; } - on core::AbstractClassInstantiationError catch(final core::AbstractClassInstantiationError _) { + on core::Error catch(final core::Error _) { } if(!threw) { throw "Expected an error above."; diff --git a/pkg/front_end/testcases/general/bad_setter_abstract.dart.weak.modular.expect b/pkg/front_end/testcases/general/bad_setter_abstract.dart.weak.modular.expect index d7a1bf27246..427098b5720 100644 --- a/pkg/front_end/testcases/general/bad_setter_abstract.dart.weak.modular.expect +++ b/pkg/front_end/testcases/general/bad_setter_abstract.dart.weak.modular.expect @@ -151,7 +151,7 @@ static method test() → dynamic { invalid-expression "The class 'B' is abstract and can't be instantiated."; threw = false; } - on core::AbstractClassInstantiationError catch(final core::AbstractClassInstantiationError _) { + on core::Error catch(final core::Error _) { } if(!threw) { throw "Expected an error above."; diff --git a/pkg/front_end/testcases/general/bad_setter_abstract.dart.weak.transformed.expect b/pkg/front_end/testcases/general/bad_setter_abstract.dart.weak.transformed.expect index d7a1bf27246..427098b5720 100644 --- a/pkg/front_end/testcases/general/bad_setter_abstract.dart.weak.transformed.expect +++ b/pkg/front_end/testcases/general/bad_setter_abstract.dart.weak.transformed.expect @@ -151,7 +151,7 @@ static method test() → dynamic { invalid-expression "The class 'B' is abstract and can't be instantiated."; threw = false; } - on core::AbstractClassInstantiationError catch(final core::AbstractClassInstantiationError _) { + on core::Error catch(final core::Error _) { } if(!threw) { throw "Expected an error above."; diff --git a/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.expect b/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.expect index 365fa6a0a8c..13a5eb4ed9f 100644 --- a/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.expect +++ b/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.expect @@ -111,7 +111,6 @@ additionalExports = (core::Deprecated, core::RangeError, core::IndexError, core::FallThroughError, - core::AbstractClassInstantiationError, core::NoSuchMethodError, core::UnsupportedError, core::UnimplementedError, diff --git a/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.outline.expect b/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.outline.expect index 6477bebbe81..f45eaef269f 100644 --- a/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.outline.expect +++ b/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.outline.expect @@ -46,7 +46,6 @@ additionalExports = (core::Deprecated, core::RangeError, core::IndexError, core::FallThroughError, - core::AbstractClassInstantiationError, core::NoSuchMethodError, core::UnsupportedError, core::UnimplementedError, diff --git a/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.transformed.expect b/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.transformed.expect index 60b94a5e340..8ce600294ac 100644 --- a/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.transformed.expect +++ b/pkg/front_end/testcases/general/error_export_from_dill/main.dart.weak.transformed.expect @@ -107,7 +107,6 @@ additionalExports = (core::Deprecated, core::RangeError, core::IndexError, core::FallThroughError, - core::AbstractClassInstantiationError, core::NoSuchMethodError, core::UnsupportedError, core::UnimplementedError, diff --git a/pkg/front_end/testcases/incremental/export_core.yaml.world.2.expect b/pkg/front_end/testcases/incremental/export_core.yaml.world.2.expect index fbc3d2670d5..b2c37d7a41a 100644 --- a/pkg/front_end/testcases/incremental/export_core.yaml.world.2.expect +++ b/pkg/front_end/testcases/incremental/export_core.yaml.world.2.expect @@ -11,7 +11,6 @@ additionalExports = (asy::Future, core::identityHashCode, core::print, core::Comparator, - core::AbstractClassInstantiationError, core::ArgumentError, core::AssertionError, core::BidirectionalIterator, diff --git a/pkg/front_end/testcases/incremental/export_core.yaml.world.3.expect b/pkg/front_end/testcases/incremental/export_core.yaml.world.3.expect index 14ed11eb69e..9f5ef78eba0 100644 --- a/pkg/front_end/testcases/incremental/export_core.yaml.world.3.expect +++ b/pkg/front_end/testcases/incremental/export_core.yaml.world.3.expect @@ -11,7 +11,6 @@ additionalExports = (asy::Future, core::identityHashCode, core::print, core::Comparator, - core::AbstractClassInstantiationError, core::ArgumentError, core::AssertionError, core::BidirectionalIterator, diff --git a/runtime/tests/vm/dart/regress_47010_test.dart b/runtime/tests/vm/dart/regress_47010_test.dart index b3545b67c25..5a1d3b0f3ca 100644 --- a/runtime/tests/vm/dart/regress_47010_test.dart +++ b/runtime/tests/vm/dart/regress_47010_test.dart @@ -67,9 +67,6 @@ IndexError? var51 = IndexError.withLength(14, 2, indexable: 36, name: 'V(', message: '9Jf!0\u2665'); FallThroughError var52 = FallThroughError(); FallThroughError? var53 = FallThroughError(); -AbstractClassInstantiationError var54 = AbstractClassInstantiationError('J!'); -AbstractClassInstantiationError? var55 = - AbstractClassInstantiationError('L48ynpV'); UnsupportedError var56 = UnsupportedError('5txzg'); UnsupportedError? var57 = UnsupportedError('W4vVdfv'); UnimplementedError var58 = UnimplementedError('pK00TI\u2665'); @@ -283,5 +280,5 @@ main() { foo1_Extension0(); print( - '$var0\n$var9\n$var11\n$var12\n$var13\n$var14\n$var15\n$var16\n$var17\n$var18\n$var19\n$var20\n$var21\n$var22\n$var23\n$var24\n$var25\n$var26\n$var27\n$var28\n$var29\n$var30\n$var31\n$var32\n$var33\n$var34\n$var35\n$var36\n$var37\n$var38\n$var39\n$var40\n$var41\n$var42\n$var43\n$var44\n$var45\n$var46\n$var47\n$var48\n$var49\n$var50\n$var51\n$var52\n$var53\n$var54\n$var55\n$var56\n$var57\n$var58\n$var59\n$var60\n$var61\n$var62\n$var63\n$var64\n$var65\n$var66\n$var67\n$var68\n$var69\n$var70\n$var71\n$var72\n$var73\n$var74\n$var75\n$var76\n$var77\n$var78\n$var79\n$var80\n$var81\n$var82\n$var83\n$var84\n$var85\n$var86\n$var87\n$var88\n$var89\n$var90\n$var91\n$var92\n$var93\n$var94\n$var95\n$var96\n$var97\n$var98\n$var99\n$var100\n$var101\n$var102\n$var103\n$var104\n$var105\n$var106\n$var107\n$var108\n$var109\n$var110\n$var111\n$var112\n$var113\n$var114\n$var115\n$var116\n$var117\n$var118\n$var119\n$var120\n$var121\n$var122\n$var123\n$var124\n$var125\n$var126\n$var127\n$var128\n$var129\n$var130\n$var131\n$var132\n'); + '$var0\n$var9\n$var11\n$var12\n$var13\n$var14\n$var15\n$var16\n$var17\n$var18\n$var19\n$var20\n$var21\n$var22\n$var23\n$var24\n$var25\n$var26\n$var27\n$var28\n$var29\n$var30\n$var31\n$var32\n$var33\n$var34\n$var35\n$var36\n$var37\n$var38\n$var39\n$var40\n$var41\n$var42\n$var43\n$var44\n$var45\n$var46\n$var47\n$var48\n$var49\n$var50\n$var51\n$var52\n$var53\n$var56\n$var57\n$var58\n$var59\n$var60\n$var61\n$var62\n$var63\n$var64\n$var65\n$var66\n$var67\n$var68\n$var69\n$var70\n$var71\n$var72\n$var73\n$var74\n$var75\n$var76\n$var77\n$var78\n$var79\n$var80\n$var81\n$var82\n$var83\n$var84\n$var85\n$var86\n$var87\n$var88\n$var89\n$var90\n$var91\n$var92\n$var93\n$var94\n$var95\n$var96\n$var97\n$var98\n$var99\n$var100\n$var101\n$var102\n$var103\n$var104\n$var105\n$var106\n$var107\n$var108\n$var109\n$var110\n$var111\n$var112\n$var113\n$var114\n$var115\n$var116\n$var117\n$var118\n$var119\n$var120\n$var121\n$var122\n$var123\n$var124\n$var125\n$var126\n$var127\n$var128\n$var129\n$var130\n$var131\n$var132\n'); } diff --git a/runtime/tests/vm/dart_2/regress_40462_test.dart b/runtime/tests/vm/dart_2/regress_40462_test.dart index 7e2c94bc465..6b582bb2238 100644 --- a/runtime/tests/vm/dart_2/regress_40462_test.dart +++ b/runtime/tests/vm/dart_2/regress_40462_test.dart @@ -56,7 +56,6 @@ RangeError var26 = IndexError var27 = IndexError.withLength(38, 13, indexable: 29, name: 'R1Z', message: 'VnR7'); FallThroughError var28 = new FallThroughError(); -AbstractClassInstantiationError var29 = AbstractClassInstantiationError('Sq'); UnsupportedError var30 = UnsupportedError('(OXv'); UnimplementedError var31 = UnimplementedError('Dt)F@\u2665'); StateError var32 = StateError('y'); @@ -1300,7 +1299,7 @@ main() { } try { print( - '$var0\n$var1\n$var2\n$var3\n$var4\n$var5\n$var6\n$var7\n$var8\n$var9\n$var10\n$var11\n$var12\n$var13\n$var14\n$var15\n$var16\n$var17\n$var18\n$var19\n$var20\n$var21\n$var22\n$var23\n$var24\n$var25\n$var26\n$var27\n$var28\n$var29\n$var30\n$var31\n$var32\n$var33\n$var34\n$var35\n$var36\n$var37\n$var38\n$var39\n$var40\n$var41\n$var42\n$var43\n$var44\n$var45\n$var46\n$var47\n$var48\n$var49\n$var50\n$var51\n$var52\n$var53\n$var54\n$var55\n$var56\n$var57\n$var58\n$var59\n$var60\n$var61\n$var62\n$var63\n$var64\n$var65\n$var66\n$var67\n$var68\n$var69\n$var70\n$var71\n$var72\n$var73\n$var74\n$var75\n'); + '$var0\n$var1\n$var2\n$var3\n$var4\n$var5\n$var6\n$var7\n$var8\n$var9\n$var10\n$var11\n$var12\n$var13\n$var14\n$var15\n$var16\n$var17\n$var18\n$var19\n$var20\n$var21\n$var22\n$var23\n$var24\n$var25\n$var26\n$var27\n$var28\n$var30\n$var31\n$var32\n$var33\n$var34\n$var35\n$var36\n$var37\n$var38\n$var39\n$var40\n$var41\n$var42\n$var43\n$var44\n$var45\n$var46\n$var47\n$var48\n$var49\n$var50\n$var51\n$var52\n$var53\n$var54\n$var55\n$var56\n$var57\n$var58\n$var59\n$var60\n$var61\n$var62\n$var63\n$var64\n$var65\n$var66\n$var67\n$var68\n$var69\n$var70\n$var71\n$var72\n$var73\n$var74\n$var75\n'); } on OutOfMemoryError { exit(254); } catch (e, st) { diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc index 16aa4749d46..219f1f206e2 100644 --- a/runtime/vm/exceptions.cc +++ b/runtime/vm/exceptions.cc @@ -1153,10 +1153,14 @@ ObjectPtr Exceptions::Create(ExceptionType type, const Array& arguments) { constructor_name = &Symbols::DotCreate(); break; case kAbstractClassInstantiation: - library = Library::CoreLibrary(); +#if defined(DART_PRECOMPILED_RUNTIME) + UNREACHABLE(); +#else + library = Library::MirrorsLibrary(); class_name = &Symbols::AbstractClassInstantiationError(); constructor_name = &Symbols::DotCreate(); break; +#endif case kCyclicInitializationError: library = Library::CoreLibrary(); class_name = &Symbols::CyclicInitializationError(); diff --git a/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart b/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart index 567e9f1adf4..140fa82be6f 100644 --- a/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart +++ b/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart @@ -366,12 +366,6 @@ class FallThroughError { String toString() => super.toString(); } -@patch -class AbstractClassInstantiationError { - @patch - String toString() => "Cannot instantiate abstract class: '$_className'"; -} - // Patch for DateTime implementation. @patch class DateTime { diff --git a/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart b/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart index b5bbc9eacc3..924a7d6c4bb 100644 --- a/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart +++ b/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart @@ -530,10 +530,6 @@ throwRuntimeError(message) { throw RuntimeError(message); } -throwAbstractClassInstantiationError(className) { - throw AbstractClassInstantiationError(className); -} - throwConcurrentModificationError(collection) { throw ConcurrentModificationError(collection); } diff --git a/sdk/lib/_internal/js_runtime/lib/core_patch.dart b/sdk/lib/_internal/js_runtime/lib/core_patch.dart index 396ab47f236..ee771f384c4 100644 --- a/sdk/lib/_internal/js_runtime/lib/core_patch.dart +++ b/sdk/lib/_internal/js_runtime/lib/core_patch.dart @@ -253,12 +253,6 @@ class FallThroughError { String toString() => super.toString(); } -@patch -class AbstractClassInstantiationError { - @patch - String toString() => "Cannot instantiate abstract class: '$_className'"; -} - // Patch for DateTime implementation. @patch class DateTime { diff --git a/sdk/lib/_internal/vm/lib/errors_patch.dart b/sdk/lib/_internal/vm/lib/errors_patch.dart index 30bf59fd285..8d7d289a6bf 100644 --- a/sdk/lib/_internal/vm/lib/errors_patch.dart +++ b/sdk/lib/_internal/vm/lib/errors_patch.dart @@ -176,24 +176,6 @@ class CyclicInitializationError { } } -@patch -class AbstractClassInstantiationError { - @pragma("vm:entry-point") - AbstractClassInstantiationError._create( - this._className, this._url, this._line); - - @patch - String toString() { - return "Cannot instantiate abstract class $_className: " - "_url '$_url' line $_line"; - } - - // These new fields cannot be declared final, because a constructor exists - // in the original version of this patched class. - String? _url; - int _line = 0; -} - @patch class NoSuchMethodError { final Object? _receiver; diff --git a/sdk/lib/_internal/vm/lib/mirrors_patch.dart b/sdk/lib/_internal/vm/lib/mirrors_patch.dart index cdae7a565c3..1bc23e67ea0 100644 --- a/sdk/lib/_internal/vm/lib/mirrors_patch.dart +++ b/sdk/lib/_internal/vm/lib/mirrors_patch.dart @@ -91,3 +91,21 @@ class MirrorSystem { @pragma("vm:external-name", "Mirrors_mangleName") external static _mangleName(String name, _MirrorReference lib); } + +@patch +class AbstractClassInstantiationError { + @pragma("vm:entry-point") + AbstractClassInstantiationError._create( + this._className, this._url, this._line); + + @patch + String toString() { + return "Cannot instantiate abstract class $_className: " + "_url '$_url' line $_line"; + } + + // These new fields cannot be declared final, because a constructor exists + // in the original version of this patched class. + String? _url; + int _line = 0; +} diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart index 1cf94943a01..fe68f1be03a 100644 --- a/sdk/lib/core/errors.dart +++ b/sdk/lib/core/errors.dart @@ -531,18 +531,6 @@ class FallThroughError extends Error { external String toString(); } -/// Error thrown when trying to instantiate an abstract class. -/// -/// No longer used in Dart 2 where it has become a compile-time error -/// to call the constructor of an abstract class. -@Deprecated("No longer relevant in Dart 2.0") -class AbstractClassInstantiationError extends Error { - final String _className; - AbstractClassInstantiationError(String className) : _className = className; - - external String toString(); -} - /// Error thrown when a particular method invocation is not possible. /// /// This error is thrown by the default implementation of `noSuchMethod` diff --git a/sdk/lib/mirrors/mirrors.dart b/sdk/lib/mirrors/mirrors.dart index 963319fecb6..dcddd4d6026 100644 --- a/sdk/lib/mirrors/mirrors.dart +++ b/sdk/lib/mirrors/mirrors.dart @@ -60,8 +60,13 @@ import "dart:core"; import 'dart:async' show Future; import "dart:_internal" show Since; -// TODO: Move AbstractClassInstantiationError here when removed from dart:core. -export "dart:core" show AbstractClassInstantiationError; +/// Error thrown when trying to instantiate an abstract class. +class AbstractClassInstantiationError extends Error { + final String _className; + AbstractClassInstantiationError(String className) : _className = className; + + external String toString(); +} /** * A [MirrorSystem] is the main interface used to reflect on a set of