Version 2.14.0-183.0.dev
Merge commit '80160d3efb1cdb4f011b2f2675cab4b5a9646ab7' into 'dev'
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index c53d050..745683b 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -43,6 +43,7 @@
import 'package:analyzer/src/summary/package_bundle_reader.dart';
import 'package:analyzer/src/summary2/ast_binary_flags.dart';
import 'package:analyzer/src/util/file_paths.dart' as file_paths;
+import 'package:analyzer/src/workspace/pub.dart';
import 'package:meta/meta.dart';
/// This class computes [AnalysisResult]s for Dart files.
@@ -142,6 +143,7 @@
/// The salt to mix into all hashes used as keys for linked data.
final Uint32List _saltForResolution = Uint32List(3 +
AnalysisOptionsImpl.signatureLength +
+ AnalysisOptionsImpl.signatureLength +
_declaredVariablesSignatureLength);
/// The set of priority files, that should be analyzed sooner.
@@ -1899,6 +1901,25 @@
_saltForResolution[index] = enableDebugResolutionMarkers ? 1 : 0;
index++;
+ // TODO(scheglov) Just combine everything into one signature.
+ {
+ var buffer = ApiSignature();
+
+ var workspace = analysisContext?.contextRoot.workspace;
+ // TODO(scheglov) Generalize?
+ if (workspace is PubWorkspace) {
+ buffer.addString(workspace.pubspecContent ?? '');
+ }
+
+ var bytes = buffer.toByteList();
+ _saltForResolution.setAll(
+ index,
+ // TODO(scheglov) Add a special method to ApiSignature?
+ Uint8List.fromList(bytes).buffer.asUint32List(),
+ );
+ index += AnalysisOptionsImpl.signatureLength;
+ }
+
_saltForResolution.setAll(index, _analysisOptions.signature);
index += AnalysisOptionsImpl.signatureLength;
diff --git a/pkg/analyzer/lib/src/dart/error/lint_codes.dart b/pkg/analyzer/lib/src/dart/error/lint_codes.dart
index d2c467a..536a0cb 100644
--- a/pkg/analyzer/lib/src/dart/error/lint_codes.dart
+++ b/pkg/analyzer/lib/src/dart/error/lint_codes.dart
@@ -39,13 +39,6 @@
other is LintCode && uniqueName == other.uniqueName;
}
-@Deprecated('Use SecurityLintCode and its uniqueName')
-class LintCodeWithUniqueName extends LintCode {
- const LintCodeWithUniqueName(String name, String uniqueName, String message,
- {String? correction})
- : super(name, message, uniqueName: uniqueName, correction: correction);
-}
-
/// Defines security-related best practice recommendations.
///
/// The primary difference from [LintCode]s is that these codes cannot be
@@ -59,11 +52,3 @@
@override
bool get isIgnorable => false;
}
-
-@Deprecated('Use SecurityLintCode and its uniqueName')
-class SecurityLintCodeWithUniqueName extends SecurityLintCode {
- const SecurityLintCodeWithUniqueName(
- String name, String uniqueName, String message,
- {String? correction})
- : super(name, message, uniqueName: uniqueName, correction: correction);
-}
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index 638fe05..c2b43c0 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -345,11 +345,7 @@
_linker.elementNodes[element] = node;
_enclosingContext.addParameter(null, element);
}
-
- // TODO(scheglov) https://github.com/dart-lang/sdk/issues/46039
- // element.hasImplicitType = node.type == null && node.parameters == null;
- element.hasImplicitType = false;
-
+ element.hasImplicitType = node.type == null && node.parameters == null;
element.isExplicitlyCovariant = node.covariantKeyword != null;
element.isFinal = node.isFinal;
element.metadata = _buildAnnotations(node.metadata);
diff --git a/pkg/analyzer/lib/src/summary2/link.dart b/pkg/analyzer/lib/src/summary2/link.dart
index f9bf281..5f82cce 100644
--- a/pkg/analyzer/lib/src/summary2/link.dart
+++ b/pkg/analyzer/lib/src/summary2/link.dart
@@ -251,12 +251,6 @@
required this.units,
});
- @Deprecated('Use LinkInputLibrary() with instead')
- LinkInputLibrary.tmp1({
- required this.source,
- required this.units,
- });
-
Uri get uri => source.uri;
String get uriStr => '$uri';
@@ -277,15 +271,6 @@
required this.unit,
});
- @Deprecated('Use LinkInputUnit() with instead')
- LinkInputUnit.tmp1({
- required this.partDirectiveIndex,
- this.partUriStr,
- required this.source,
- required this.isSynthetic,
- required this.unit,
- });
-
Uri get uri => source.uri;
String get uriStr => '$uri';
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
index 5d76afe..2dd428d 100644
--- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -7,7 +7,6 @@
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/scope.dart';
import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/ast/ast.dart';
import 'package:analyzer/src/dart/ast/extensions.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/element/type.dart';
@@ -153,7 +152,7 @@
_ConstructorInferenceNode(this._walker, this._constructor) {
for (var parameter in _constructor.parameters) {
if (parameter is FieldFormalParameterElementImpl) {
- if (_hasImplicitType(parameter)) {
+ if (parameter.hasImplicitType) {
var field = parameter.field;
if (field != null) {
_parameters.add(
@@ -234,18 +233,6 @@
}
isEvaluated = true;
}
-
- /// TODO(scheglov) https://github.com/dart-lang/sdk/issues/46039
- bool _hasImplicitType(FieldFormalParameterElementImpl parameter) {
- var parameterNode = _walker._linker.getLinkingNode(parameter);
- if (parameterNode is DefaultFormalParameter) {
- parameterNode = parameterNode.parameter;
- }
- return parameterNode is FieldFormalParameterImpl &&
- parameterNode.type == null &&
- parameterNode.parameters == null;
- // return parameter.hasImplicitType;
- }
}
/// A field formal parameter with a non-nullable field.
diff --git a/pkg/analyzer/lib/src/workspace/package_build.dart b/pkg/analyzer/lib/src/workspace/package_build.dart
index 94716f7..fc64f2a 100644
--- a/pkg/analyzer/lib/src/workspace/package_build.dart
+++ b/pkg/analyzer/lib/src/workspace/package_build.dart
@@ -190,6 +190,13 @@
UriResolver get packageUriResolver => PackageBuildPackageUriResolver(
this, PackageMapUriResolver(provider, packageMap));
+ @override
+ String? get pubspecContent {
+ try {
+ return _pubspecFile.readAsStringSync();
+ } catch (_) {}
+ }
+
/// For some package file, which may or may not be a package source (it could
/// be in `bin/`, `web/`, etc), find where its built counterpart will exist if
/// its a generated source.
diff --git a/pkg/analyzer/lib/src/workspace/pub.dart b/pkg/analyzer/lib/src/workspace/pub.dart
index 9ec1ee7..76b85c1 100644
--- a/pkg/analyzer/lib/src/workspace/pub.dart
+++ b/pkg/analyzer/lib/src/workspace/pub.dart
@@ -31,6 +31,13 @@
_theOnlyPackage = PubWorkspacePackage(root, this);
}
+ /// Return the content of the pubspec file, `null` if cannot be read.
+ String? get pubspecContent {
+ try {
+ return _pubspecFile.readAsStringSync();
+ } catch (_) {}
+ }
+
@override
WorkspacePackage? findPackageFor(String filePath) {
final Folder folder = provider.getFolder(filePath);
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart
index ac0dca1..621c1a4 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_caching_test.dart
@@ -2,6 +2,7 @@
// 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 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/error/error.dart';
import 'package:analyzer/src/dart/error/lint_codes.dart';
import 'package:test/test.dart';
@@ -144,6 +145,66 @@
_assertNoLinkedCycles();
}
+ test_lint_dependOnReferencedPackage_update_pubspec_addDependency() async {
+ useEmptyByteStore();
+
+ var aaaPackageRootPath = '$packagesRootPath/aaa';
+ newFile('$aaaPackageRootPath/lib/a.dart', content: '');
+
+ writeTestPackageConfig(
+ PackageConfigFileBuilder()
+ ..add(name: 'aaa', rootPath: aaaPackageRootPath),
+ );
+
+ // Configure with the lint.
+ writeTestPackageAnalysisOptionsFile(
+ AnalysisOptionsFileConfig(lints: ['depend_on_referenced_packages']),
+ );
+
+ // Configure without dependencies, but with a (required) name.
+ // So, the lint rule will be activated.
+ writeTestPackagePubspecYamlFile(
+ PubspecYamlFileConfig(
+ name: 'my_test',
+ dependencies: [],
+ ),
+ );
+
+ newFile(testFilePath, content: r'''
+// ignore:unused_import
+import 'package:aaa/a.dart';
+''');
+
+ // We don't have a dependency on `package:aaa`, so there is a lint.
+ _assertHasLintReported(
+ await _computeTestFileErrors(),
+ 'depend_on_referenced_packages',
+ );
+
+ // The summary for the library was linked.
+ _assertContainsLinkedCycle({testFilePath}, andClear: true);
+
+ // We will recreate it with new pubspec.yaml content.
+ // But we will reuse the byte store, so can reuse summaries.
+ disposeAnalysisContextCollection();
+
+ // Add dependency on `package:aaa`.
+ writeTestPackagePubspecYamlFile(
+ PubspecYamlFileConfig(
+ name: 'my_test',
+ dependencies: [
+ PubspecYamlFileDependency(name: 'aaa'),
+ ],
+ ),
+ );
+
+ // With dependency on `package:aaa` added, no lint is reported.
+ expect(await _computeTestFileErrors(), isEmpty);
+
+ // Lints don't affect summaries, nothing should be linked.
+ _assertNoLinkedCycles();
+ }
+
test_lints() async {
useEmptyByteStore();
@@ -204,4 +265,17 @@
void _assertNoLinkedCycles() {
expect(_linkedCycles, isEmpty);
}
+
+ /// Note that we intentionally use this method, we don't want to use
+ /// [resolveFile] instead. Resolving a file will force to produce its
+ /// resolved AST, and as a result to recompute the errors.
+ ///
+ /// But this method is used to check returning errors from the cache, or
+ /// recomputing when the cache key is expected to be different.
+ Future<List<AnalysisError>> _computeTestFileErrors() async {
+ var errorsResult = await contextFor(testFilePath)
+ .currentSession
+ .getErrors2(testFilePath) as ErrorsResult;
+ return errorsResult.errors;
+ }
}
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index c8ffb4d..bfbaa94 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -347,22 +347,49 @@
}
class PubspecYamlFileConfig {
+ final String? name;
final String? sdkVersion;
+ final List<PubspecYamlFileDependency> dependencies;
- PubspecYamlFileConfig({this.sdkVersion});
+ PubspecYamlFileConfig({
+ this.name,
+ this.sdkVersion,
+ this.dependencies = const [],
+ });
String toContent() {
var buffer = StringBuffer();
+ if (name != null) {
+ buffer.writeln('name: $name');
+ }
+
if (sdkVersion != null) {
buffer.writeln('environment:');
buffer.writeln(" sdk: '$sdkVersion'");
}
+ if (dependencies.isNotEmpty) {
+ buffer.writeln('dependencies:');
+ for (var dependency in dependencies) {
+ buffer.writeln(' ${dependency.name}: ${dependency.version}');
+ }
+ }
+
return buffer.toString();
}
}
+class PubspecYamlFileDependency {
+ final String name;
+ final String version;
+
+ PubspecYamlFileDependency({
+ required this.name,
+ this.version = 'any',
+ });
+}
+
mixin WithNoImplicitCastsMixin on PubPackageResolutionTest {
Future<void> assertErrorsWithNoImplicitCasts(
String code,
diff --git a/pkg/analyzer/test/src/diagnostics/avoid_types_as_parameter_names_test.dart b/pkg/analyzer/test/src/diagnostics/avoid_types_as_parameter_names_test.dart
deleted file mode 100644
index f6563a0..0000000
--- a/pkg/analyzer/test/src/diagnostics/avoid_types_as_parameter_names_test.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-// 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.
-
-import 'package:analyzer/src/dart/error/lint_codes.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../dart/resolution/context_collection_resolution.dart';
-
-/// TODO(scheglov) Remove the file after fixing the linter.
-/// https://github.com/dart-lang/sdk/issues/46039
-main() {
- defineReflectiveSuite(() {
- defineReflectiveTests(AvoidTypesAsParameterNamesTest);
- });
-}
-
-@reflectiveTest
-class AvoidTypesAsParameterNamesTest extends PubPackageResolutionTest {
- @override
- void setUp() {
- super.setUp();
- writeTestPackageAnalysisOptionsFile(
- AnalysisOptionsFileConfig(
- lints: [
- 'avoid_types_as_parameter_names',
- ],
- ),
- );
- }
-
- test_fieldFormalParameter() async {
- await assertNoErrorsInCode(r'''
-class A {
- final int num;
- const A(this.num);
-}
-''');
- }
-
- test_simpleFormalParameter_function() async {
- await assertErrorsInCode(r'''
-void f(int) {}
-''', [
- error(LintCode('avoid_types_as_parameter_names', ''), 7, 3),
- ]);
- }
-}
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_declares_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_declares_constructor_test.dart
index 89c5750..00b7f90 100644
--- a/pkg/analyzer/test/src/diagnostics/mixin_declares_constructor_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/mixin_declares_constructor_test.dart
@@ -4,7 +4,6 @@
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/dart/error/syntactic_errors.dart';
-import 'package:analyzer/src/error/codes.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../dart/resolution/context_collection_resolution.dart';
@@ -25,10 +24,6 @@
}
''', [
error(ParserErrorCode.MIXIN_DECLARES_CONSTRUCTOR, 27, 1),
- // TODO(srawlins): Don't report this from within a mixin.
- // TODO(scheglov) https://github.com/dart-lang/sdk/issues/46039
- error(
- CompileTimeErrorCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, 29, 6),
]);
var element = findElement.mixin('M');
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 97e5005..0625bd7 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -35,8 +35,6 @@
import 'async_for_in_wrong_context_test.dart' as async_for_in_wrong_context;
import 'async_keyword_used_as_identifier_test.dart'
as async_keyword_used_as_identifier;
-import 'avoid_types_as_parameter_names_test.dart'
- as avoid_types_as_parameter_names;
import 'await_in_late_local_variable_initializer_test.dart'
as await_in_late_local_variable_initializer;
import 'await_in_wrong_context_test.dart' as await_in_wrong_context;
@@ -728,7 +726,6 @@
assignment_to_type.main();
async_for_in_wrong_context.main();
async_keyword_used_as_identifier.main();
- avoid_types_as_parameter_names.main();
await_in_late_local_variable_initializer.main();
await_in_wrong_context.main();
binary_operator_written_out.main();
diff --git a/runtime/vm/compiler/asm_intrinsifier_x64.cc b/runtime/vm/compiler/asm_intrinsifier_x64.cc
index eb5b694..da97a49 100644
--- a/runtime/vm/compiler/asm_intrinsifier_x64.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_x64.cc
@@ -243,13 +243,13 @@
__ movq(RDI, Address(RSP, 4 * target::kWordSize)); // x_digits
__ movq(R8, Address(RSP, 3 * target::kWordSize)); // x_used is Smi
#if defined(DART_COMPRESSED_POINTERS)
- __ movsxw(R8, R8);
+ __ movsxd(R8, R8);
#endif
__ subq(R8, Immediate(2)); // x_used > 0, Smi. R8 = x_used - 1, round up.
__ sarq(R8, Immediate(2)); // R8 + 1 = number of digit pairs to read.
__ movq(RCX, Address(RSP, 2 * target::kWordSize)); // n is Smi
#if defined(DART_COMPRESSED_POINTERS)
- __ movsxw(RCX, RCX);
+ __ movsxd(RCX, RCX);
#endif
__ SmiUntag(RCX);
__ movq(RBX, Address(RSP, 1 * target::kWordSize)); // r_digits
@@ -289,7 +289,7 @@
__ movq(RDI, Address(RSP, 4 * target::kWordSize)); // x_digits
__ movq(RCX, Address(RSP, 2 * target::kWordSize)); // n is Smi
#if defined(DART_COMPRESSED_POINTERS)
- __ movsxw(RCX, RCX);
+ __ movsxd(RCX, RCX);
#endif
__ SmiUntag(RCX);
__ movq(RBX, Address(RSP, 1 * target::kWordSize)); // r_digits
@@ -297,7 +297,7 @@
__ sarq(RDX, Immediate(6)); // RDX = n ~/ (2*_DIGIT_BITS).
__ movq(RSI, Address(RSP, 3 * target::kWordSize)); // x_used is Smi
#if defined(DART_COMPRESSED_POINTERS)
- __ movsxw(RSI, RSI);
+ __ movsxd(RSI, RSI);
#endif
__ subq(RSI, Immediate(2)); // x_used > 0, Smi. RSI = x_used - 1, round up.
__ sarq(RSI, Immediate(2));
@@ -335,14 +335,14 @@
__ movq(RDI, Address(RSP, 5 * target::kWordSize)); // digits
__ movq(R8, Address(RSP, 4 * target::kWordSize)); // used is Smi
#if defined(DART_COMPRESSED_POINTERS)
- __ movsxw(R8, R8);
+ __ movsxd(R8, R8);
#endif
__ addq(R8, Immediate(2)); // used > 0, Smi. R8 = used + 1, round up.
__ sarq(R8, Immediate(2)); // R8 = number of digit pairs to process.
__ movq(RSI, Address(RSP, 3 * target::kWordSize)); // a_digits
__ movq(RCX, Address(RSP, 2 * target::kWordSize)); // a_used is Smi
#if defined(DART_COMPRESSED_POINTERS)
- __ movsxw(RCX, RCX);
+ __ movsxd(RCX, RCX);
#endif
__ addq(RCX, Immediate(2)); // a_used > 0, Smi. R8 = a_used + 1, round up.
__ sarq(RCX, Immediate(2)); // R8 = number of digit pairs to process.
@@ -402,14 +402,14 @@
__ movq(RDI, Address(RSP, 5 * target::kWordSize)); // digits
__ movq(R8, Address(RSP, 4 * target::kWordSize)); // used is Smi
#if defined(DART_COMPRESSED_POINTERS)
- __ movsxw(R8, R8);
+ __ movsxd(R8, R8);
#endif
__ addq(R8, Immediate(2)); // used > 0, Smi. R8 = used + 1, round up.
__ sarq(R8, Immediate(2)); // R8 = number of digit pairs to process.
__ movq(RSI, Address(RSP, 3 * target::kWordSize)); // a_digits
__ movq(RCX, Address(RSP, 2 * target::kWordSize)); // a_used is Smi
#if defined(DART_COMPRESSED_POINTERS)
- __ movsxw(RCX, RCX);
+ __ movsxd(RCX, RCX);
#endif
__ addq(RCX, Immediate(2)); // a_used > 0, Smi. R8 = a_used + 1, round up.
__ sarq(RCX, Immediate(2)); // R8 = number of digit pairs to process.
@@ -489,7 +489,7 @@
__ movq(RCX, Address(RSP, 7 * target::kWordSize)); // x_digits
__ movq(RAX, Address(RSP, 6 * target::kWordSize)); // xi is Smi
#if defined(DART_COMPRESSED_POINTERS)
- __ movsxw(RAX, RAX);
+ __ movsxd(RAX, RAX);
#endif
__ movq(RBX,
FieldAddress(RCX, RAX, TIMES_2, target::TypedData::data_offset()));
@@ -499,7 +499,7 @@
// R8 = (SmiUntag(n) + 1)/2, no_op if n == 0
__ movq(R8, Address(RSP, 1 * target::kWordSize)); // n is Smi
#if defined(DART_COMPRESSED_POINTERS)
- __ movsxw(R8, R8);
+ __ movsxd(R8, R8);
#endif
__ addq(R8, Immediate(2));
__ sarq(R8, Immediate(2)); // R8 = number of digit pairs to process.
@@ -509,7 +509,7 @@
__ movq(RDI, Address(RSP, 5 * target::kWordSize)); // m_digits
__ movq(RAX, Address(RSP, 4 * target::kWordSize)); // i is Smi
#if defined(DART_COMPRESSED_POINTERS)
- __ movsxw(RAX, RAX);
+ __ movsxd(RAX, RAX);
#endif
__ leaq(RDI,
FieldAddress(RDI, RAX, TIMES_2, target::TypedData::data_offset()));
@@ -518,7 +518,7 @@
__ movq(RSI, Address(RSP, 3 * target::kWordSize)); // a_digits
__ movq(RAX, Address(RSP, 2 * target::kWordSize)); // j is Smi
#if defined(DART_COMPRESSED_POINTERS)
- __ movsxw(RAX, RAX);
+ __ movsxd(RAX, RAX);
#endif
__ leaq(RSI,
FieldAddress(RSI, RAX, TIMES_2, target::TypedData::data_offset()));
@@ -609,7 +609,7 @@
__ movq(RDI, Address(RSP, 4 * target::kWordSize)); // x_digits
__ movq(RAX, Address(RSP, 3 * target::kWordSize)); // i is Smi
#if defined(DART_COMPRESSED_POINTERS)
- __ movsxw(RAX, RAX);
+ __ movsxd(RAX, RAX);
#endif
__ leaq(RDI,
FieldAddress(RDI, RAX, TIMES_2, target::TypedData::data_offset()));
@@ -730,7 +730,7 @@
__ movq(RBX, Address(RSP, 2 * target::kWordSize)); // digits
__ movq(RAX, Address(RSP, 1 * target::kWordSize)); // i is Smi and odd.
#if defined(DART_COMPRESSED_POINTERS)
- __ movsxw(RAX, RAX);
+ __ movsxd(RAX, RAX);
#endif
__ leaq(RBX, FieldAddress(
RBX, RAX, TIMES_2,
@@ -785,7 +785,7 @@
__ movq(RBX, Address(RSP, 2 * target::kWordSize)); // digits
__ movq(RAX, Address(RSP, 1 * target::kWordSize)); // i is Smi
#if defined(DART_COMPRESSED_POINTERS)
- __ movsxw(RAX, RAX);
+ __ movsxd(RAX, RAX);
#endif
__ movq(RAX,
FieldAddress(RBX, RAX, TIMES_2, target::TypedData::data_offset()));
diff --git a/sdk/lib/html/doc/WORKAROUNDS.md b/sdk/lib/html/doc/WORKAROUNDS.md
index d3d8456..39a1c06 100644
--- a/sdk/lib/html/doc/WORKAROUNDS.md
+++ b/sdk/lib/html/doc/WORKAROUNDS.md
@@ -26,7 +26,7 @@
missing the API `readAsBinaryString` ([#42834][]). We can work around this by
doing something like the following:
-```
+```dart
import 'dart:html';
import 'dart:js_util' as js_util;
@@ -50,7 +50,7 @@
`callConstructor`. For example, instead of using the factory constructor for
`KeyboardEvent`, we can do the following:
-```
+```dart
import 'dart:html';
import 'dart:js_util' as js_util;
@@ -77,7 +77,7 @@
again to circumvent this issue. For example, we can manipulate a
`_SubtleCrypto` object:
-```
+```dart
import 'dart:html';
import 'dart:js_util' as js_util;
import 'dart:typed_data';
@@ -99,7 +99,7 @@
What you shouldn’t do is attempt to cast these native objects using your own JS
interop types, e.g.
-```
+```dart
import 'dart:html';
import 'package:js/js.dart';
diff --git a/tests/corelib/very_big_integer_test.dart b/tests/corelib/very_big_integer_test.dart
new file mode 100644
index 0000000..cbfc609
--- /dev/null
+++ b/tests/corelib/very_big_integer_test.dart
@@ -0,0 +1,18 @@
+// 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.
+
+import "package:expect/expect.dart";
+
+main() {
+ // x and y have lengths in 32-bit digits that overflow 16 bits.
+ var x = new BigInt.from(13) << (65000 * 32);
+ var y = new BigInt.from(42) << (65000 * 32);
+ print(x.bitLength);
+ Expect.equals(x, (x + y) - y);
+ Expect.equals(x, -((-x + y) - y));
+ Expect.equals(x, (x << 2) >> 2);
+ Expect.equals(x, (x >> 3) << 3);
+ Expect.equals(0, (x ^ x).toInt());
+ Expect.equals(0, (y ^ y).toInt());
+}
diff --git a/tests/corelib_2/very_big_integer_test.dart b/tests/corelib_2/very_big_integer_test.dart
new file mode 100644
index 0000000..11465f9
--- /dev/null
+++ b/tests/corelib_2/very_big_integer_test.dart
@@ -0,0 +1,20 @@
+// 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.
+
+// @dart = 2.9
+
+import "package:expect/expect.dart";
+
+main() {
+ // x and y have lengths in 32-bit digits that overflow 16 bits.
+ var x = new BigInt.from(13) << (65000 * 32);
+ var y = new BigInt.from(42) << (65000 * 32);
+ print(x.bitLength);
+ Expect.equals(x, (x + y) - y);
+ Expect.equals(x, -((-x + y) - y));
+ Expect.equals(x, (x << 2) >> 2);
+ Expect.equals(x, (x >> 3) << 3);
+ Expect.equals(0, (x ^ x).toInt());
+ Expect.equals(0, (y ^ y).toInt());
+}
diff --git a/tools/VERSION b/tools/VERSION
index addd689..8d3dadb 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 14
PATCH 0
-PRERELEASE 182
+PRERELEASE 183
PRERELEASE_PATCH 0
\ No newline at end of file