Skip to content

Commit 0ebf221

Browse files
author
Dart CI
committed
Version 3.6.0-216.1.beta
Merge 3.6.0-216.0.dev into beta
2 parents c5264a1 + 1a62462 commit 0ebf221

File tree

1,588 files changed

+111836
-37473
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,588 files changed

+111836
-37473
lines changed

.github/workflows/issue-triage.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ permissions:
1919
jobs:
2020
triage_issues:
2121
runs-on: ubuntu-latest
22+
if: ${{ github.repository_owner == 'dart-lang' }}
2223
steps:
2324
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
2425
with:

.github/workflows/scorecards-analysis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,6 @@ jobs:
5252

5353
# Upload the results to GitHub's code scanning dashboard.
5454
- name: "Upload to code-scanning"
55-
uses: github/codeql-action/upload-sarif@eb055d739abdc2e8de2e5f4ba1a8b246daa779aa
55+
uses: github/codeql-action/upload-sarif@2c779ab0d087cd7fe7b826087247c2c81f27bfa6
5656
with:
5757
sarif_file: results.sarif

BUILD.gn

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ group("run_ffi_unit_tests") {
8484
}
8585

8686
group("runtime_precompiled") {
87+
import("runtime/runtime_args.gni")
8788
deps = [
8889
"runtime/bin:dart_precompiled_runtime",
8990
"runtime/bin:gen_snapshot",
@@ -94,6 +95,10 @@ group("runtime_precompiled") {
9495
if (is_linux || is_android) {
9596
deps += [ "runtime/bin:abstract_socket_test" ]
9697
}
98+
if (dart_dynamic_modules) {
99+
deps += [ "utils/dart2bytecode:dart2bytecode_snapshot" ]
100+
deps += [ "utils/dynamic_module_runner:dynamic_module_runner_snapshot" ]
101+
}
97102
}
98103

99104
group("create_sdk") {
@@ -188,6 +193,7 @@ if (is_fuchsia) {
188193
"tests/ffi/abi_specific_int_test.dart",
189194
"tests/ffi/abi_test.dart",
190195
"tests/ffi/address_of_array_generated_test.dart",
196+
"tests/ffi/address_of_cast_test.dart",
191197
"tests/ffi/address_of_struct_generated_test.dart",
192198
"tests/ffi/address_of_test.dart",
193199
"tests/ffi/address_of_typeddata_generated_test.dart",
@@ -294,6 +300,8 @@ if (is_fuchsia) {
294300
"tests/ffi/regress_51538_test.dart",
295301
"tests/ffi/regress_52298_test.dart",
296302
"tests/ffi/regress_52399_test.dart",
303+
"tests/ffi/regress_56412_2_test.dart",
304+
"tests/ffi/regress_56412_test.dart",
297305
"tests/ffi/regress_b_261224444_test.dart",
298306
"tests/ffi/regress_flutter79441_test.dart",
299307
"tests/ffi/regress_flutter97301_test.dart",

CHANGELOG.md

Lines changed: 151 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,12 @@ number, like `.`, `x`, or the `e` in scientific notation.
4141
- **Breaking Change** [#52444][]: Removed the `Platform()` constructor, which
4242
has been deprecated since Dart 3.1.
4343

44+
- **Breaking Change** [#53618][]: `HttpClient` now responds to a redirect
45+
that is missing a "Location" header by throwing `RedirectException`, instead
46+
of `StateError`.
47+
4448
[#52444]: https://github.com/dart-lang/sdk/issues/52444
49+
[#53618]: https://github.com/dart-lang/sdk/issues/53618
4550

4651
#### `dart:js_interop`
4752

@@ -51,7 +56,67 @@ number, like `.`, `x`, or the `e` in scientific notation.
5156
- Added `toJSCaptureThis` so `this` is passed in from JavaScript to the
5257
callback as the first parameter.
5358

54-
## 3.5.0
59+
### Tools
60+
61+
#### CFE
62+
63+
- **Breaking Change** [#56466][]: The implementation of the UP and
64+
DOWN algorithms in the CFE are changed to match the specification
65+
and the corresponding implementations in the Analyzer. The upper and
66+
lower closures of type schemas are now computed just before they are
67+
passed into the subtype testing procedure instead of at the very
68+
beginning of the UP and DOWN algorithms.
69+
70+
[#56466]: https://github.com/dart-lang/sdk/issues/56466
71+
72+
#### Wasm compiler (dart2wasm)
73+
74+
- The condition `dart.library.js` is now false on conditional imports in
75+
dart2wasm. Note that it was already a static error to import `dart:js`
76+
directly (see [#55266][]).
77+
78+
[#55266]: https://github.com/dart-lang/sdk/issues/55266
79+
80+
## 3.5.2 - 2024-08-28
81+
82+
- Fixes a bug where `ZLibDecoder` would incorrectly attempt to decompress data
83+
past the end of the zlib footer (issue [#56481][]).
84+
- Fixes issue where running `dart` from `PATH` could result in some commands not
85+
working as expected (issues [#56080][], [#56306][], [#56499][]).
86+
- Fixes analysis server plugins not receiving `setContextRoots` requests or
87+
being provided incorrect context roots in multi-package workspaces (issue
88+
[#56475][]).
89+
90+
[#56481]: https://github.com/dart-lang/sdk/issues/56481
91+
[#56080]: https://github.com/dart-lang/sdk/issues/56080
92+
[#56306]: https://github.com/dart-lang/sdk/issues/56306
93+
[#56499]: https://github.com/dart-lang/sdk/issues/56499
94+
[#56475]: https://github.com/dart-lang/sdk/issues/56475
95+
96+
## 3.5.1 - 2024-08-14
97+
98+
- Fixes resolving `include:` in `analysis_options.yaml` file in a nested
99+
folder in the workspace (issue[#56464][]).
100+
- Fixes source maps generated by `dart compile wasm` when optimizations are
101+
enabled (issue [#56423][]).
102+
- Fixes a bug in the `dart2wasm` compiler in unsound `-O3` / `-O4` modes where a
103+
implicit setter for a field of generic type will store `null` instead of the
104+
field value (issue [#56374][]).
105+
- Fixes a bug in the `dart2wasm` compiler that can trigger in certain situations
106+
when using partial instantiations of generic tear-offs (constructors or static
107+
methods) in constant expressions (issue [#56440][]).
108+
- The algorithm for computing the standard upper bound of two types,
109+
also known is UP, is provided the missing implementation for
110+
`StructuralParameterType` objects. In some corner cases cases the
111+
lacking implementation resulted in a crash of the compiler (issue [#56457][]).
112+
113+
[#56464]: https://github.com/dart-lang/sdk/issues/56464
114+
[#56423]: https://github.com/dart-lang/sdk/issues/56423
115+
[#56374]: https://github.com/dart-lang/sdk/issues/56374
116+
[#56440]: https://github.com/dart-lang/sdk/issues/56440
117+
[#56457]: https://github.com/dart-lang/sdk/issues/56457
118+
119+
## 3.5.0 - 2024-08-06
55120

56121
### Language
57122

@@ -173,7 +238,91 @@ number, like `.`, `x`, or the `e` in scientific notation.
173238

174239
- `Dart_DefaultCanonicalizeUrl` is removed from the Dart C API.
175240

176-
## 3.4.0
241+
## 3.4.4 - 2024-06-12
242+
243+
This is a patch release that:
244+
245+
- Fixes an issue where pub would crash when failing to fetch advisories from
246+
the server. (issue [pub#4269]).
247+
248+
- Fixes an issue where `const bool.fromEnvironment('dart.library.ffi')` is true
249+
and conditional import condition `dart.library.ffi` is true in dart2wasm.
250+
(issue [#55948]).
251+
252+
- Fixes an issue where FFI calls with variadic arguments on MacOS Arm64
253+
would mangle the arguments. (issue [#55943]).
254+
255+
[pub#4269]: https://github.com/dart-lang/pub/issues/4269
256+
[#55948]: https://github.com/dart-lang/sdk/issues/55948
257+
[#55943]: https://github.com/dart-lang/sdk/issues/55943
258+
259+
## 3.4.3 - 2024-06-05
260+
261+
This is a patch release that:
262+
263+
- Fixes an issue where `DART_VM_OPTIONS` were not correctly parsed for
264+
standalone Dart executables created with `dart compile exe` (issue
265+
[#55818]).
266+
267+
- Fixes a bug in dart2wasm that can result in a runtime error that says
268+
`array.new_fixed()` has a constant larger than 10000 (issue [#55873]).
269+
270+
- Adds support for `--enable-experiment` flag to `dart compile` wasm
271+
(issue [#55894]).
272+
273+
- Fixes an issue in dart2wasm compiler that can result in incorrect
274+
nullability of type parameter (see [#55895]).
275+
276+
- Disallows `dart:ffi` imports in user code in dart2wasm (e.g. issue
277+
[#53910]) as dart2wasm's currently only supports a small subset of
278+
`dart:ffi` (issue [#55890]).
279+
280+
[#55818]: https://github.com/dart-lang/sdk/issues/55818
281+
[#55873]: https://github.com/dart-lang/sdk/issues/55873
282+
[#55894]: https://github.com/dart-lang/sdk/issues/55894
283+
[#55895]: https://github.com/dart-lang/sdk/issues/55895
284+
[#55910]: https://github.com/dart-lang/sdk/issues/53910
285+
[#55890]: https://github.com/dart-lang/sdk/issues/55890
286+
287+
## 3.4.2 - 2024-05-29
288+
289+
This is a patch release that:
290+
291+
- Marks `dart compile wasm` as no longer experimental.
292+
293+
- Fixes two bugs in exception handling in `async` functions in dart2wasm
294+
(issues [#55347], [#55457]).
295+
296+
- Fixes restoration of `this` variable in `sync*` and `async` functions in
297+
dart2wasm.
298+
299+
- Implements missing control flow constructs (exceptions, switch/case with
300+
yields) in `sync*` in dart2wasm (issues [#51342], [#51343]).
301+
302+
- Fixes a bug dart2wasm compiler that surfaces as a compiler crash when indexing
303+
lists where the compiler proofs the list to be constant and the index is
304+
out-of-bounds (issue [#55817]).
305+
306+
[#55347]: https://github.com/dart-lang/sdk/issues/55347
307+
[#55457]: https://github.com/dart-lang/sdk/issues/55457
308+
[#51342]: https://github.com/dart-lang/sdk/issues/51342
309+
[#51343]: https://github.com/dart-lang/sdk/issues/51343
310+
[#55817]: https://github.com/dart-lang/sdk/issues/55817
311+
312+
## 3.4.1 - 2024-05-22
313+
314+
This is a patch release that:
315+
316+
- Fixes a bug in the CFE which could manifest as compilation errors of Flutter
317+
web apps when compiled with dart2wasm (issue [#55714]).
318+
319+
- Fixes a bug in the pub client, such that `dart run` will not interfere with
320+
Flutter l10n (at least for most cases) (issue [#55758]).
321+
322+
[#55714]: https://github.com/dart-lang/sdk/issues/55714
323+
[#55758]: https://github.com/dart-lang/sdk/issues/55758
324+
325+
## 3.4.0 - 2024-05-14
177326

178327
### Language
179328

DEPS

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ vars = {
5454

5555
# co19 is a cipd package automatically generated for each co19 commit.
5656
# Use tests/co19/update.sh to update this hash.
57-
"co19_rev": "246914feafde6a63bb7d259425a1159812b88d83",
57+
"co19_rev": "767bb1f623a4f005072224cd7a49726a5b644296",
5858

5959
# The internal benchmarks to use. See go/dart-benchmarks-internal
6060
"benchmarks_internal_rev": "3bd6bc6d207dfb7cf687537e819863cf9a8f2470",
@@ -73,10 +73,10 @@ vars = {
7373
"checkout_javascript_engines": False,
7474
"d8_tag": "version:12.9.98",
7575
"jsshell_tag": "version:127.0.2",
76-
"jsc_tag": "version:280364",
76+
"jsc_tag": "version:282418",
7777

7878
# https://chrome-infra-packages.appspot.com/p/fuchsia/third_party/clang
79-
"clang_version": "git_revision:3809e20afc68d7d03821f0ec59b928dcf9befbf4",
79+
"clang_version": "git_revision:0cfd03ac0d3f9713090a581bda07584754c73a49",
8080

8181
# https://chrome-infra-packages.appspot.com/p/gn/gn
8282
"gn_version": "git_revision:05eed8f6252e2dd6b555e0b65192ef03e2c4a276",
@@ -97,12 +97,12 @@ vars = {
9797
### /third_party/ dependencies
9898

9999
# Prefer to use hashes of binaryen that have been reviewed & rolled into g3.
100-
"binaryen_rev" : "654ee6e2504f11fb0e982a2cf276bafa750f694b",
100+
"binaryen_rev" : "459bc0797f67cb2a8fd4598bb7143b34036608d9",
101101
"boringssl_gen_rev": "fef055e8d2749b82c79c8f043be1cbe5e8e4b40c",
102102
"boringssl_rev": "2db0eb3f96a5756298dcd7f9319e56a98585bd10",
103103
"browser-compat-data_tag": "ac8cae697014da1ff7124fba33b0b4245cc6cd1b", # v1.0.22
104104
"cpu_features_rev": "936b9ab5515dead115606559502e3864958f7f6e",
105-
"devtools_rev": "14084d20946268f2d22c5ed55bd53e0176748368",
105+
"devtools_rev": "25053ae4af8f162188388c6f3786e03349652e51",
106106
"icu_rev": "43953f57b037778a1b8005564afabe214834f7bd",
107107
"jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
108108
"libcxx_rev": "44079a4cc04cdeffb9cfe8067bfb3c276fb2bab0",
@@ -125,13 +125,13 @@ vars = {
125125
"bazel_worker_rev": "02f190b88df771fc8e05c07d4b64ae942c02f456",
126126
"benchmark_harness_rev": "a06785cdfc51538e3556c1d59bb4f03426e9e1c5",
127127
"boolean_selector_rev": "c5468f44fd9ca0ea3435e1a0a84ff9b6fac38261",
128-
"browser_launcher_rev": "fe7ffa13ba59ec6f7d56256f79059344555fdaf2",
128+
"browser_launcher_rev": "fa98c77e7a2fee21a4ad3528dd79da0f4df6bd0f",
129129
"characters_rev": "7633a16a22c626e19ca750223237396315268a06",
130130
"cli_util_rev": "6a0bb9292ea4bb2c9e547af03da4c9948f9556a1",
131131
"clock_rev": "6e43768a0b135a0d36fc886907b70c4bf27117e6",
132132
"collection_rev": "0c1f829c29da1d63488be774f430b2035a565d6f",
133133
"convert_rev": "9035cafefc1da4315f26058734d0c2a19d5ab56a",
134-
"crypto_rev": "1216790ba704a0ab194f9cd0da2d65e1767f3342",
134+
"crypto_rev": "eede7d6918c51159c1422b7449f40dbac660ee57",
135135
"csslib_rev": "192d720f121792ab05ca157ea280edc7e0410e9c",
136136
# Note: Updates to dart_style have to be coordinated with the infrastructure
137137
# team so that the internal formatter `tools/sdks/dart-sdk/bin/dart format`
@@ -144,32 +144,32 @@ vars = {
144144
#
145145
# For more details, see https://github.com/dart-lang/sdk/issues/30164.
146146
"dart_style_rev": "f7bd4c42ad6015143f08931540631448048f692d", # disable tools/rev_sdk_deps.dart
147-
"dartdoc_rev": "ce098154b16255bbc9ddfa89e3f6141262645513",
148-
"ecosystem_rev": "2719d0c077d76da6fb996820393f3cd96bec6591",
147+
"dartdoc_rev": "b4449742c0f7d7fa0179897cac163388e03236c2",
148+
"ecosystem_rev": "8626bffad30d08792f0acbc813391800838e8207",
149149
"file_rev": "855831c242a17c2dee163828d52710d9043c7c8d",
150150
"fixnum_rev": "6c19e60366ce3d5edfaed51a7c12c98e7977977e",
151151
"flute_rev": "a531c96a8b43d015c6bfbbfe3ab54867b0763b8b",
152152
"glob_rev": "8b05be87f84f74d90dc0c15956f3ff95805322e5",
153153
"html_rev": "0da420ca1e196cda54ede476d0d8d3ecf55375ef",
154-
"http_rev": "76512c4cbf987361421030349fd1946e63e33359",
154+
"http_rev": "b97b8dc22ea808c4fbd63f73abd7af8ecf694323",
155155
"http_multi_server_rev": "8348be1bf8fd17881e2643086e68c9d2b28dd9ce",
156156
"http_parser_rev": "ce528cf82f3d26ac761e29b2494a9e0c270d4939",
157157
"intl_rev": "5d65e3808ce40e6282e40881492607df4e35669f",
158158
"json_rpc_2_rev": "b4810dc7bee5828f240586c81f3f34853cacdbce",
159159
"leak_tracker_rev": "f5620600a5ce1c44f65ddaa02001e200b096e14c", # manually rolled
160-
"lints_rev": "8f93c7998ac32bd07fcf4c4fdda60d164a2cb13a",
160+
"lints_rev": "894b5006c463d2e1967fba3a8c3540d8ae249061",
161161
"logging_rev": "8752902b75a476d2c7b64dcf01aaaee885f35c4c",
162162
"markdown_rev": "f6eaea38146d8901756418c4e7123eb7bd77249e",
163163
"matcher_rev": "d6d573d0f8d65b36550ce62aad3ce6b5e987b642",
164164
"material_color_utilities_rev": "799b6ba2f3f1c28c67cc7e0b4f18e0c7d7f3c03e",
165165
"mime_rev": "11fec7d6df509a4efd554051cc27e3bf82df9c96",
166166
"mockito_rev": "eb4d1daa20c105c94ac29689c1975f0850fa18f2",
167-
"native_rev": "b01a3f3ef5e3a219fefb182d4cfc41d2895f32ca", # mosum@ and dacoharkes@ are rolling breaking changes manually while the assets features are in experimental.
167+
"native_rev": "5e9e4795d1faa39efeb92ae42fc0fa353778308f", # dart-native-interop-team@ is rolling breaking changes manually while the assets features are in experimental.
168168
"package_config_rev": "76934c2ca25922ec72909bbff7dfbddaf0d02bd9",
169169
"path_rev": "e969f42ed112dd702a9453beb9df6c12ae2d3805",
170170
"pool_rev": "924fb04353cec915d927f9f1aed88e2eda92b98a",
171171
"protobuf_rev": "ccf104dbc36929c0f8708285d5f3a8fae206343e",
172-
"pub_rev": "570696dd6f7b1e0fb7516eacd197d31542d7168e", # disable tools/rev_sdk_deps.dart
172+
"pub_rev": "31fa75baa5872e7f094a554c0ec7741742889530", # disable tools/rev_sdk_deps.dart
173173
"pub_semver_rev": "d9e5ee68a350fbf4319bd4dfcb895fc016337d3a",
174174
"shelf_rev": "9f2dffecbe8f219146a077e401758602752d486a",
175175
"source_map_stack_trace_rev": "741b6ceb4b6cdb8ff620664337d7ecc63ca52cc1",
@@ -182,11 +182,11 @@ vars = {
182182
"sync_http_rev": "91c0dd5ef9a008f0277aadcfd83036f82e572d09",
183183
"tar_rev": "32ceb55e673141abff4e84b99483fe5eb881c291",
184184
"term_glyph_rev": "38a158f55006cf30942c928171ea601ee5e0308f",
185-
"test_rev": "8be3c948950c2c30e8f9c49d15ef6c04beb47238",
185+
"test_rev": "cd3dbd51fe765f7243ea51783318d82b4031fa7a",
186186
"test_descriptor_rev": "90743bc16bc00526a1b9a64f813614be9b2479d9",
187187
"test_process_rev": "6223572ca16d7585d5f08d9281de6a5734e45150",
188188
"test_reflective_loader_rev": "6e648863b39aab8d0204e769d25805eea9db0ac4",
189-
"tools_rev": "d563c38c7cfb03bbf5d1f9360b49c36ba45b97ef",
189+
"tools_rev": "5b15f8b60bf950a2f06dad3258dee61c153fdb44",
190190
"typed_data_rev": "365468a74251c930a463daf5b8f13227e269111a",
191191
"vector_math_rev": "2cfbe2c115a57b368ccbc3c89ebd38a06764d3d1",
192192
"watcher_rev": "0484625589d8512b36a7ad898a6cc6351d24c556",
@@ -207,7 +207,7 @@ vars = {
207207
# meant to be downloaded by users for local testing. You can self-service
208208
# update these by following the go/dart-engprod/browsers.md instructions.
209209
"download_chrome": False,
210-
"chrome_tag": "128.0.6613.5",
210+
"chrome_tag": "128.0.6613.36",
211211
"download_firefox": False,
212212
"firefox_tag": "129.0",
213213

@@ -701,7 +701,7 @@ Var("dart_root") + "/third_party/pkg/tar":
701701
"packages": [
702702
{
703703
"package": "chromium/fuchsia/test-scripts",
704-
"version": "8WCo7tLjg_GoImlj5eax_w-wxsvRPnmaChqN4ok-5rYC",
704+
"version": "oGxqx29_HA1eEBnt9pRiZYDa_BkzACC6l3_3xYYKLjYC",
705705
}
706706
],
707707
"condition": 'download_fuchsia_deps',
@@ -712,7 +712,7 @@ Var("dart_root") + "/third_party/pkg/tar":
712712
"packages": [
713713
{
714714
"package": "chromium/fuchsia/gn-sdk",
715-
"version": "sbh76PYVTMxav4ACTgA-TXWcbZTZcWWjsqATCxrGIvwC",
715+
"version": "OKGFjciA5Vd0TQks4ow7-ppfxy_Y6v5hSjjn2w6LWjwC",
716716
}
717717
],
718718
"condition": 'download_fuchsia_deps',

PRESUBMIT.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,30 @@ def _CheckNoNewObservatoryServiceTests(input_api, output_api):
513513
'not runtime/observatory/tests/service:\n' + '\n'.join(files))
514514
]
515515

516+
517+
def _CheckDevCompilerSync(input_api, output_api):
518+
"""Make sure that any changes in the original and the temporary forked
519+
version of the DDC compiler are kept in sync. If a CL touches the
520+
compiler.dart there should probably be in a change in compiler_new.dart
521+
as well.
522+
"""
523+
OLD = "pkg/dev_compiler/lib/src/kernel/compiler.dart"
524+
NEW = "pkg/dev_compiler/lib/src/kernel/compiler_new.dart"
525+
526+
files = [git_file.LocalPath() for git_file in input_api.AffectedTextFiles()]
527+
528+
if (OLD in files and NEW not in files):
529+
return [
530+
output_api.PresubmitPromptWarning(
531+
"Make sure to keep the original and temporary forked versions "
532+
"of compiler.dart in sync.\n"
533+
"You may need to copy or adapt changes between these files:\n" +
534+
"\n".join([OLD, NEW]))
535+
]
536+
537+
return []
538+
539+
516540
def _CommonChecks(input_api, output_api):
517541
results = []
518542
results.extend(_CheckValidHostsInDEPS(input_api, output_api))
@@ -527,6 +551,7 @@ def _CommonChecks(input_api, output_api):
527551
results.extend(_CheckCopyrightYear(input_api, output_api))
528552
results.extend(_CheckAnalyzerFiles(input_api, output_api))
529553
results.extend(_CheckNoNewObservatoryServiceTests(input_api, output_api))
554+
results.extend(_CheckDevCompilerSync(input_api, output_api))
530555
return results
531556

532557

0 commit comments

Comments
 (0)