912005267d
Change-Id: I46be49b2effec3e38a3dc44cd45cfe736f77fa78 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/182680 Commit-Queue: Sigmund Cherem <sigmund@google.com> Reviewed-by: Joshua Litt <joshualitt@google.com> Reviewed-by: Nicholas Shahan <nshahan@google.com> Reviewed-by: Stephen Adams <sra@google.com>
70 lines
2.5 KiB
Dart
70 lines
2.5 KiB
Dart
// Copyright (c) 2020, 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.
|
|
|
|
// Requirements=nnbd-strong
|
|
|
|
import 'package:expect/expect.dart';
|
|
import 'deferred_apply_lib.dart' deferred as lib;
|
|
|
|
// Test that the `_Required` sentinel in apply-metadata is initialized.
|
|
//
|
|
// This test is structured so that `Function.apply` is partioned out of the main
|
|
// unit into a 'part' file. `Function.apply` contains a reference to the
|
|
// `_Required` sentinel marker, which causes the marker to also be in that part.
|
|
// The apply-metadata for the functions [foo1] and [foo2] contains references to
|
|
// the sentinel that are in the main unit.
|
|
//
|
|
// This apparent reference to the deferred-loaded constant is not a problem
|
|
// because the apply-metadata is contained in a JavaScript function which is not
|
|
// called until the function is passed to `Function.apply`. The loading of the
|
|
// part containing `Function.apply` also loads the sentinel in advance of it
|
|
// being referenced.
|
|
//
|
|
// An implicit constraint here is that the apply-metadata must not be used
|
|
// outside of code that also references the sentinel.
|
|
//
|
|
// If the apply-metadata is created eagerly, or we add other uses of the
|
|
// apply-metadata, then we would need to ensure the constant is located to be
|
|
// available at that time.
|
|
|
|
main() {
|
|
lib.loadLibrary().then((_) {
|
|
Expect.equals('10', lib.apply1(foo1));
|
|
Expect.equals('10,$text1', lib.apply1(foo2));
|
|
Expect.throws(() => lib.apply2(foo2));
|
|
});
|
|
}
|
|
|
|
class Text {
|
|
final String string;
|
|
final String source;
|
|
const Text(this.string, [this.source = '']);
|
|
String toString() => string;
|
|
}
|
|
|
|
String foo1({required int req1}) {
|
|
return '$req1';
|
|
}
|
|
|
|
String foo2({required int req1, Text? text = text1}) {
|
|
return '$req1,$text';
|
|
}
|
|
|
|
const text1 = Text(r"""
|
|
Those lines that I before have writ do lie,
|
|
Even those that said I could not love you dearer:
|
|
Yet then my judgment knew no reason why
|
|
My most full flame should afterwards burn clearer.
|
|
But reckoning Time, whose million'd accidents
|
|
Creep in 'twixt vows, and change decrees of kings,
|
|
Tan sacred beauty, blunt the sharp'st intents,
|
|
Divert strong minds to the course of altering things;
|
|
Alas! why, fearing of Time's tyranny,
|
|
Might I not then say, 'Now I love you best,'
|
|
When I was certain o'er incertainty,
|
|
Crowning the present, doubting of the rest?
|
|
Love is a babe, then might I not say so,
|
|
To give full growth to that which still doth grow?
|
|
""");
|