Version 2.11.0-264.0.dev
Merge commit '6cee3b5fe121039aa4f6bd9b9a9a50c74a2c06bd' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index 03a17e0a..b2ba0d5 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
"constraint, update this by running tools/generate_package_config.dart."
],
"configVersion": 2,
- "generated": "2020-10-20T23:33:25.579167",
+ "generated": "2020-10-26T09:42:07.748397",
"generator": "tools/generate_package_config.dart",
"packages": [
{
@@ -151,6 +151,12 @@
"languageVersion": "2.0"
},
{
+ "name": "clock",
+ "rootUri": "../third_party/pkg/clock",
+ "packageUri": "lib/",
+ "languageVersion": "2.10"
+ },
+ {
"name": "collection",
"rootUri": "../third_party/pkg/collection",
"packageUri": "lib/",
@@ -332,7 +338,7 @@
"name": "intl",
"rootUri": "../third_party/pkg/intl",
"packageUri": "lib/",
- "languageVersion": "2.5"
+ "languageVersion": "2.11"
},
{
"name": "js",
@@ -510,12 +516,6 @@
"languageVersion": "2.0"
},
{
- "name": "quiver",
- "rootUri": "../third_party/pkg/quiver",
- "packageUri": "lib/",
- "languageVersion": "2.0"
- },
- {
"name": "resource",
"rootUri": "../third_party/pkg/resource",
"packageUri": "lib/",
diff --git a/.packages b/.packages
index ebac358..831d0f3 100644
--- a/.packages
+++ b/.packages
@@ -79,7 +79,6 @@
protobuf:third_party/pkg/protobuf/protobuf/lib
pub:third_party/pkg/pub/lib
pub_semver:third_party/pkg/pub_semver/lib
-quiver:third_party/pkg/quiver/lib
resource:third_party/pkg/resource/lib
sdk_library_metadata:sdk/lib/_internal/sdk_library_metadata/lib
shelf:third_party/pkg/shelf/lib
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 28b2ea5..c513296 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,8 +4,14 @@
#### `dart:io`
-* `HttpRequest` will now correctly follow HTTP 308 redirects
- (`HttpStatus.permanentRedirect`).
+* `HttpRequest` will now correctly follow HTTP 308 redirects
+ (`HttpStatus.permanentRedirect`).
+
+#### `dart:isolate`
+
+* Added `debugName` positional parameter to `ReceivePort` and `RawReceivePort`
+ constructors, a name which can be associated with the port and displayed in
+ tooling.
### Dart VM
diff --git a/DEPS b/DEPS
index bab0f51..8d3fa01 100644
--- a/DEPS
+++ b/DEPS
@@ -76,6 +76,7 @@
"charcode_rev": "bcd8a12c315b7a83390e4865ad847ecd9344cba2",
"chrome_rev" : "19997",
"cli_util_rev" : "335ed165887d0ec97c2a09173ebf22dcf56a6c4e",
+ "clock_rev" : "a494269254ba978e7ef8f192c5f7fec3fc05b9d3",
"collection_rev": "60e6ee2228586980826b07ec1df633bd879f42ea",
"convert_rev": "c1b01f832835d3d8a06b0b246a361c0eaab35d3c",
"crypto_rev": "f7c48b334b1386bc5ab0f706fbcd6df8496a87fc",
@@ -110,7 +111,7 @@
"http_throttle_tag" : "1.0.2",
"icu_rev" : "79326efe26e5440f530963704c3c0ff965b3a4ac",
"idl_parser_rev": "5fb1ebf49d235b5a70c9f49047e83b0654031eb7",
- "intl_tag": "0.16.1",
+ "intl_tag": "0.17.0-nullsafety",
"jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
"json_rpc_2_rev": "8f189db8f0c299187a0e8fa959dba7e9b0254be5",
"linter_tag": "0.1.121",
@@ -312,6 +313,8 @@
Var("dart_git") + "charcode.git" + "@" + Var("charcode_rev"),
Var("dart_root") + "/third_party/pkg/cli_util":
Var("dart_git") + "cli_util.git" + "@" + Var("cli_util_rev"),
+ Var("dart_root") + "/third_party/pkg/clock":
+ Var("dart_git") + "clock.git" + "@" + Var("clock_rev"),
Var("dart_root") + "/third_party/pkg/collection":
Var("dart_git") + "collection.git" + "@" + Var("collection_rev"),
Var("dart_root") + "/third_party/pkg/convert":
diff --git a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
index b70e8a4..9e9b8a6 100644
--- a/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
+++ b/pkg/analyzer/lib/src/pubspec/pubspec_validator.dart
@@ -5,6 +5,7 @@
import 'package:analyzer/error/error.dart';
import 'package:analyzer/error/listener.dart';
import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/src/pubspec/pubspec_warning_code.dart';
import 'package:path/path.dart' as path;
@@ -204,6 +205,12 @@
}
/// Validate that `path` entries reference valid paths.
+ ///
+ /// Valid paths are directories that:
+ ///
+ /// 1. exist,
+ /// 2. contain a pubspec.yaml file, and
+ /// 3. `lib` dir
void _validatePathEntries(ErrorReporter reporter, YamlNode dependency) {
if (dependency is YamlMap) {
for (var node in dependency.nodes.entries) {
@@ -214,9 +221,18 @@
var packageRoot = context.dirname(source.fullName);
var dependencyPath =
path.canonicalize(context.join(packageRoot, normalizedPath));
- if (!provider.getFolder(dependencyPath).exists) {
+ var packageFolder = provider.getFolder(dependencyPath);
+ if (!packageFolder.exists) {
_reportErrorForNode(reporter, node.value,
PubspecWarningCode.PATH_DOES_NOT_EXIST, [pathEntry]);
+ } else {
+ if (!packageFolder
+ .getChild(AnalysisEngine.PUBSPEC_YAML_FILE)
+ .exists) {
+ _reportErrorForNode(reporter, node.value,
+ PubspecWarningCode.PATH_PUBSPEC_DOES_NOT_EXIST, [pathEntry]);
+ }
+ // todo (pq): test for presence of a lib dir.
}
}
}
diff --git a/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart b/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart
index 5e68c9b..ecc7124 100644
--- a/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart
+++ b/pkg/analyzer/lib/src/pubspec/pubspec_warning_code.dart
@@ -72,6 +72,17 @@
correction:
"Try creating the referenced path or using a path that exists.");
+ /// A code indicating that a specified path dependency points to a directory
+ /// that does not contain a pubspec.
+ ///
+ /// Parameters:
+ /// 0: the path to the dependency as given in the file.
+ static const PubspecWarningCode PATH_PUBSPEC_DOES_NOT_EXIST = PubspecWarningCode(
+ 'PATH_PUBSPEC_DOES_NOT_EXIST',
+ "The directory {0} does not contain a pubspec.",
+ correction:
+ "Try creating a pubspec in the referenced directory or using a path that has a pubspec.");
+
/// A code indicating that a package listed as a dev dependency is also listed
/// as a normal dependency.
///
diff --git a/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart b/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
index 161046c..32f7cf3 100644
--- a/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
+++ b/pkg/analyzer/test/src/pubspec/pubspec_validator_test.dart
@@ -49,7 +49,7 @@
validator = PubspecValidator(resourceProvider, source);
}
- test_assetDirectoryDoesExists_noError() {
+ test_assetDirectoryDoesExist_noError() {
newFolder('/sample/assets/logos');
assertNoErrors('''
name: sample
@@ -208,17 +208,21 @@
''');
}
- test_dependencyPathDoesNotExist_path_error() {
+ test_dependencyPath_pubspecDoesNotExist() {
+ newFolder('/foo');
assertErrors('''
name: sample
dependencies:
foo:
- path: does/not/exist
-''', [PubspecWarningCode.PATH_DOES_NOT_EXIST]);
+ path: /foo
+''', [PubspecWarningCode.PATH_PUBSPEC_DOES_NOT_EXIST]);
}
- test_dependencyPathExists() {
+ test_dependencyPath_pubspecExists() {
newFolder('/foo');
+ newFile('/foo/pubspec.yaml', content: '''
+name: foo
+''');
assertNoErrors('''
name: sample
dependencies:
@@ -227,8 +231,24 @@
''');
}
- test_dependencyPathRelativeExists() {
+ test_dependencyPath_valid_absolute() {
newFolder('/foo');
+ newFile('/foo/pubspec.yaml', content: '''
+name: foo
+''');
+ assertNoErrors('''
+name: sample
+dependencies:
+ foo:
+ path: /foo
+''');
+ }
+
+ test_dependencyPath_valid_relative() {
+ newFolder('/foo');
+ newFile('/foo/pubspec.yaml', content: '''
+name: foo
+''');
assertNoErrors('''
name: sample
dependencies:
@@ -237,6 +257,15 @@
''');
}
+ test_dependencyPathDoesNotExist_path_error() {
+ assertErrors('''
+name: sample
+dependencies:
+ foo:
+ path: does/not/exist
+''', [PubspecWarningCode.PATH_DOES_NOT_EXIST]);
+ }
+
test_devDependenciesField_empty() {
assertNoErrors('''
name: sample
@@ -270,6 +299,9 @@
test_devDependencyPathExists() {
newFolder('/foo');
+ newFile('/foo/pubspec.yaml', content: '''
+name: foo
+''');
assertNoErrors('''
name: sample
dev_dependencies:
diff --git a/pkg/analyzer_cli/pubspec.yaml b/pkg/analyzer_cli/pubspec.yaml
index 7fb1c29..4a8c027 100644
--- a/pkg/analyzer_cli/pubspec.yaml
+++ b/pkg/analyzer_cli/pubspec.yaml
@@ -6,8 +6,9 @@
environment:
sdk: "^2.7.0"
+
dependencies:
- analyzer: ^0.37.0
+ analyzer: any
args: '>=0.13.0 <2.0.0'
bazel_worker: ^0.1.0
collection: ^1.14.1
@@ -17,8 +18,13 @@
path: any
pub_semver: ^1.4.2
yaml: ^2.1.2
+
dev_dependencies:
pedantic: ^1.9.0
protobuf: ^0.13.0
test_reflective_loader: ^0.1.8
test: ^1.0.0
+
+dependency_overrides:
+ analyzer:
+ path: ../analyzer
diff --git a/pkg/async_helper/pubspec.yaml b/pkg/async_helper/pubspec.yaml
index 817b5fe..202f86b 100644
--- a/pkg/async_helper/pubspec.yaml
+++ b/pkg/async_helper/pubspec.yaml
@@ -1,11 +1,17 @@
name: async_helper
# This package is not intended for consumption on pub.dev. DO NOT publish.
publish_to: none
+
description: >-
Async_helper is used for asynchronous tests that do not want to
make use of the Dart unittest library - for example, the core
language tests.
Third parties are discouraged from using this, and should use
the facilities provided in package:test.
+
+environment:
+ sdk: '>=2.0.0'
+
dependencies:
- expect: any
+ expect:
+ path: ../expect
diff --git a/pkg/build_integration/pubspec.yaml b/pkg/build_integration/pubspec.yaml
index 7bef2ba..b741a4b 100644
--- a/pkg/build_integration/pubspec.yaml
+++ b/pkg/build_integration/pubspec.yaml
@@ -9,7 +9,11 @@
sdk: '>=2.1.0 <3.0.0'
dependencies:
- front_end: ^0.1.0
+ front_end: any
dev_dependencies:
test: any
+
+dependency_overrides:
+ front_end:
+ path: ../front_end
diff --git a/pkg/dartfix/pubspec.yaml b/pkg/dartfix/pubspec.yaml
index 8f39796..8b764a6 100644
--- a/pkg/dartfix/pubspec.yaml
+++ b/pkg/dartfix/pubspec.yaml
@@ -21,6 +21,6 @@
pub_semver: ^1.4.4
dev_dependencies:
- analyzer: ^0.39.0
+ analyzer: ^0.40.0
pedantic: ^1.8.0
test: ^1.14.2
diff --git a/pkg/expect/pubspec.yaml b/pkg/expect/pubspec.yaml
index 60226bb..b1b5bd1 100644
--- a/pkg/expect/pubspec.yaml
+++ b/pkg/expect/pubspec.yaml
@@ -1,11 +1,15 @@
name: expect
# This package is not intended for consumption on pub.dev. DO NOT publish.
publish_to: none
-description: >
+description: >-
Expect is used for tests that do not want to make use of the
Dart unit test library - for example, the core language tests.
Third parties are discouraged from using this, and should use
the expect() function in the unit test library instead for
test assertions.
+
+environment:
+ sdk: '>=2.0.0'
+
dependencies:
meta: any
diff --git a/pkg/front_end/pubspec.yaml b/pkg/front_end/pubspec.yaml
index f81b308..3f3905b 100644
--- a/pkg/front_end/pubspec.yaml
+++ b/pkg/front_end/pubspec.yaml
@@ -7,15 +7,14 @@
environment:
sdk: '>=2.2.2 <3.0.0'
+
dependencies:
- _fe_analyzer_shared:
- path: ../_fe_analyzer_shared/
- kernel:
- path: ../kernel/
- package_config:
- path: ../../third_party/pkg_tested/package_config/
+ _fe_analyzer_shared: any
+ kernel: any
+ package_config: any
+
dev_dependencies:
- analyzer: 0.39.1
+ analyzer: any
args: '>=0.13.0 <2.0.0'
async_helper:
path: ../async_helper
@@ -40,3 +39,13 @@
path: ../vm_service
web_socket_channel: ^1.0.4
yaml: '^2.1.12'
+
+dependency_overrides:
+ _fe_analyzer_shared:
+ path: ../_fe_analyzer_shared/
+ analyzer:
+ path: ../analyzer
+ kernel:
+ path: ../kernel/
+ package_config:
+ path: ../../third_party/pkg_tested/package_config/
diff --git a/pkg/vm/pubspec.yaml b/pkg/vm/pubspec.yaml
index 26d0bc7..9a2d487 100644
--- a/pkg/vm/pubspec.yaml
+++ b/pkg/vm/pubspec.yaml
@@ -11,7 +11,7 @@
build_integration:
path: ../build_integration
crypto: any
- front_end: ^0.1.6
+ front_end: any
kernel: ^0.3.6
meta: any
package_config: any
@@ -23,3 +23,7 @@
path: any
test: any
web_socket_channel: any
+
+dependency_overrides:
+ front_end:
+ path: ../front_end
diff --git a/pkg/vm/test/incremental_compiler_test.dart b/pkg/vm/test/incremental_compiler_test.dart
index 298e92e..588b90c 100644
--- a/pkg/vm/test/incremental_compiler_test.dart
+++ b/pkg/vm/test/incremental_compiler_test.dart
@@ -642,7 +642,7 @@
"}\n");
var fileBar = new File('${mytest.path}/bar.dart')..createSync();
- fileBar.writeAsStringSync("class A<T> { int _a; }\n");
+ fileBar.writeAsStringSync("class A<T> { int _a = 0; }\n");
var fileBaz = new File('${mytest.path}/baz.dart')..createSync();
fileBaz.writeAsStringSync("import 'dart:isolate';\n"
@@ -703,7 +703,7 @@
expect(reloadResult['details']['loadedLibraryCount'], equals(0));
// Introduce a change that force VM to reject the change.
- fileBar.writeAsStringSync("class A<T,U> { int _a; }\n");
+ fileBar.writeAsStringSync("class A<T,U> { int _a = 0; }\n");
compiler.invalidate(fileBar.uri);
component = await compiler.compile();
await _writeProgramToFile(component, outputFile);
@@ -711,7 +711,7 @@
expect(reloadResult['success'], isFalse);
// Fix a change so VM is happy to accept the change.
- fileBar.writeAsStringSync("class A<T> { int _a; hi() => _a; }\n");
+ fileBar.writeAsStringSync("class A<T> { int _a = 0; hi() => _a; }\n");
compiler.invalidate(fileBar.uri);
component = await compiler.compile();
await _writeProgramToFile(component, outputFile);
@@ -1057,7 +1057,7 @@
import 'dart:async';
import 'helper.dart';
main() {
- int latestReloadTime;
+ int latestReloadTime = -1;
int noChangeCount = 0;
int numChanges = 0;
new Timer.periodic(new Duration(milliseconds: 5), (timer) async {
diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md
index ca07f4f..5efe660 100644
--- a/pkg/vm_service/CHANGELOG.md
+++ b/pkg/vm_service/CHANGELOG.md
@@ -1,4 +1,15 @@
# Changelog
+## 5.4.0
+- Added support for `dart:io` extensions version 1.5.
+- Added combination getter/setter `socketProfilingEnabled`.
+- Deprecated `startSocketProfiling` and `pauseSocketProfiling`.
+
+## 5.4.0
+- Update to version `3.41.0` of the spec.
+- Added `PortList` class.
+- Added `getPorts` RPC.
+- Added optional properties `portId`, `allocationLocation`, and `debugName` to
+ `InstanceRef` and `Instance`.
## 5.3.0
- Added support for `dart:io` extensions version 1.4.
diff --git a/pkg/vm_service/example/vm_service_assert.dart b/pkg/vm_service/example/vm_service_assert.dart
index e2ae6d1..617bd7c 100644
--- a/pkg/vm_service/example/vm_service_assert.dart
+++ b/pkg/vm_service/example/vm_service_assert.dart
@@ -192,6 +192,7 @@
if (obj == "MirrorReference") return obj;
if (obj == "Null") return obj;
if (obj == "PlainInstance") return obj;
+ if (obj == "ReceivePort") return obj;
if (obj == "RegExp") return obj;
if (obj == "StackTrace") return obj;
if (obj == "String") return obj;
@@ -912,6 +913,13 @@
return obj;
}
+vms.PortList assertPortList(vms.PortList obj) {
+ assertNotNull(obj);
+ assertString(obj.type);
+ assertListOfInstanceRef(obj.ports);
+ return obj;
+}
+
vms.ProfileFunction assertProfileFunction(vms.ProfileFunction obj) {
assertNotNull(obj);
assertString(obj.kind);
diff --git a/pkg/vm_service/java/.gitignore b/pkg/vm_service/java/.gitignore
index ae6691f..8803d45 100644
--- a/pkg/vm_service/java/.gitignore
+++ b/pkg/vm_service/java/.gitignore
@@ -25,6 +25,7 @@
src/org/dartlang/vm/service/consumer/InvokeConsumer.java
src/org/dartlang/vm/service/consumer/KillConsumer.java
src/org/dartlang/vm/service/consumer/PauseConsumer.java
+src/org/dartlang/vm/service/consumer/PortListConsumer.java
src/org/dartlang/vm/service/consumer/ProcessMemoryUsageConsumer.java
src/org/dartlang/vm/service/consumer/ProtocolListConsumer.java
src/org/dartlang/vm/service/consumer/ReloadSourcesConsumer.java
@@ -95,6 +96,7 @@
src/org/dartlang/vm/service/element/NullRef.java
src/org/dartlang/vm/service/element/Obj.java
src/org/dartlang/vm/service/element/ObjRef.java
+src/org/dartlang/vm/service/element/PortList.java
src/org/dartlang/vm/service/element/ProcessMemoryItem.java
src/org/dartlang/vm/service/element/ProcessMemoryUsage.java
src/org/dartlang/vm/service/element/ProfileFunction.java
diff --git a/pkg/vm_service/java/version.properties b/pkg/vm_service/java/version.properties
index d0564a6..ae41aeb 100644
--- a/pkg/vm_service/java/version.properties
+++ b/pkg/vm_service/java/version.properties
@@ -1 +1 @@
-version=3.40
+version=3.41
diff --git a/pkg/vm_service/lib/src/dart_io_extensions.dart b/pkg/vm_service/lib/src/dart_io_extensions.dart
index 886b947..6dbca6f4 100644
--- a/pkg/vm_service/lib/src/dart_io_extensions.dart
+++ b/pkg/vm_service/lib/src/dart_io_extensions.dart
@@ -7,6 +7,7 @@
import 'dart:collection';
import 'package:meta/meta.dart';
+import 'package:vm_service/vm_service.dart';
import 'vm_service.dart';
@@ -28,14 +29,29 @@
/// Start profiling new socket connections. Statistics for sockets created
/// before profiling was enabled will not be recorded.
+ @Deprecated('Use socketProfilingEnabled instead')
Future<Success> startSocketProfiling(String isolateId) =>
_callHelper('ext.dart.io.startSocketProfiling', isolateId);
/// Pause recording socket statistics. [clearSocketProfile] must be called in
/// order for collected statistics to be cleared.
+ @Deprecated('Use socketProfilingEnabled instead')
Future<Success> pauseSocketProfiling(String isolateId) =>
_callHelper('ext.dart.io.pauseSocketProfiling', isolateId);
+ /// The _socketProfilingEnabled_ RPC is used to enable/disable the socket profiler
+ /// and query its current state. If `enabled` is provided, the profiler state will
+ /// be updated to reflect the value of `enabled`.
+ ///
+ /// If the state of the socket profiler is changed, a `SocketProfilingStateChange`
+ /// event will be sent on the `Extension` stream.
+ Future<SocketProfilingState> socketProfilingEnabled(String isolateId,
+ [bool enabled]) async {
+ return _callHelper('ext.dart.io.socketProfilingEnabled', isolateId, args: {
+ if (enabled != null) 'enabled': enabled,
+ });
+ }
+
/// Removes all statistics associated with prior and current sockets.
Future<Success> clearSocketProfile(String isolateId) =>
_callHelper('ext.dart.io.clearSocketProfile', isolateId);
@@ -148,6 +164,7 @@
addTypeFactory('@SpawnedProcess', SpawnedProcessRef.parse);
addTypeFactory('SocketProfile', SocketProfile.parse);
addTypeFactory('SocketStatistic', SocketStatistic.parse);
+ addTypeFactory('SocketProfilingState', SocketProfilingState.parse);
_factoriesRegistered = true;
}
}
@@ -219,25 +236,43 @@
}
}
-/// A [HttpTimelineLoggingState] provides information about the current state of HTTP
-/// request logging for a given isolate.
-class HttpTimelineLoggingState extends Response {
- static HttpTimelineLoggingState parse(Map json) =>
- json == null ? null : HttpTimelineLoggingState._fromJson(json);
-
- HttpTimelineLoggingState({@required this.enabled});
+/// A [Response] containing the enabled state of a service extension.
+abstract class State extends Response {
+ State({@required this.enabled});
// TODO(bkonyi): make this part of the vm_service.dart library so we can
// call super._fromJson.
- HttpTimelineLoggingState._fromJson(Map<String, dynamic> json)
- : enabled = json['enabled'] {
+ State._fromJson(Map<String, dynamic> json) : enabled = json['enabled'] {
type = json['type'];
}
- /// Whether or not HttpClient.enableTimelineLogging is set to true for a given isolate.
final bool enabled;
}
+/// A [HttpTimelineLoggingState] provides information about the current state of HTTP
+/// request logging for a given isolate.
+class HttpTimelineLoggingState extends State {
+ static HttpTimelineLoggingState parse(Map json) =>
+ json == null ? null : HttpTimelineLoggingState._fromJson(json);
+
+ HttpTimelineLoggingState({@required bool enabled}) : super(enabled: enabled);
+
+ HttpTimelineLoggingState._fromJson(Map<String, dynamic> json)
+ : super._fromJson(json);
+}
+
+/// A [SocketProfilingState] provides information about the current state of
+/// socket profiling for a given isolate.
+class SocketProfilingState extends State {
+ static SocketProfilingState parse(Map json) =>
+ json == null ? null : SocketProfilingState._fromJson(json);
+
+ SocketProfilingState({@required bool enabled}) : super(enabled: enabled);
+
+ SocketProfilingState._fromJson(Map<String, dynamic> json)
+ : super._fromJson(json);
+}
+
/// A [SpawnedProcessRef] contains identifying information about a spawned process.
class SpawnedProcessRef {
static SpawnedProcessRef parse(Map json) =>
diff --git a/pkg/vm_service/lib/src/vm_service.dart b/pkg/vm_service/lib/src/vm_service.dart
index fd20c5b..4dfc752 100644
--- a/pkg/vm_service/lib/src/vm_service.dart
+++ b/pkg/vm_service/lib/src/vm_service.dart
@@ -28,7 +28,7 @@
HeapSnapshotObjectNoData,
HeapSnapshotObjectNullData;
-const String vmServiceVersion = '3.40.0';
+const String vmServiceVersion = '3.41.0';
/// @optional
const String optional = 'optional';
@@ -157,6 +157,7 @@
'Null': NullVal.parse,
'@Object': ObjRef.parse,
'Object': Obj.parse,
+ 'PortList': PortList.parse,
'ProfileFunction': ProfileFunction.parse,
'ProtocolList': ProtocolList.parse,
'Protocol': Protocol.parse,
@@ -209,6 +210,7 @@
'getIsolateGroupMemoryUsage': const ['MemoryUsage'],
'getScripts': const ['ScriptList'],
'getObject': const ['Obj'],
+ 'getPorts': const ['PortList'],
'getRetainingPath': const ['RetainingPath'],
'getProcessMemoryUsage': const ['ProcessMemoryUsage'],
'getStack': const ['Stack'],
@@ -688,6 +690,12 @@
int count,
});
+ /// The `getPorts` RPC is used to retrieve the list of `ReceivePort` instances
+ /// for a given isolate.
+ ///
+ /// See [PortList].
+ Future<PortList> getPorts(String isolateId);
+
/// The `getRetainingPath` RPC is used to lookup a path from an object
/// specified by `targetId` to a GC root (i.e., the object which is preventing
/// this object from being garbage collected).
@@ -1318,6 +1326,11 @@
count: params['count'],
);
break;
+ case 'getPorts':
+ response = await _serviceImplementation.getPorts(
+ params['isolateId'],
+ );
+ break;
case 'getRetainingPath':
response = await _serviceImplementation.getRetainingPath(
params['isolateId'],
@@ -1771,6 +1784,10 @@
});
@override
+ Future<PortList> getPorts(String isolateId) =>
+ _call('getPorts', {'isolateId': isolateId});
+
+ @override
Future<RetainingPath> getRetainingPath(
String isolateId, String targetId, int limit) =>
_call('getRetainingPath',
@@ -2432,6 +2449,9 @@
/// An instance of the Dart class BoundedType.
static const String kBoundedType = 'BoundedType';
+
+ /// An instance of the Dart class ReceivePort.
+ static const String kReceivePort = 'ReceivePort';
}
/// A `SentinelKind` is used to distinguish different kinds of `Sentinel`
@@ -4239,6 +4259,27 @@
@optional
ContextRef closureContext;
+ /// The port ID for a ReceivePort.
+ ///
+ /// Provided for instance kinds:
+ /// - ReceivePort
+ @optional
+ int portId;
+
+ /// The stack trace associated with the allocation of a ReceivePort.
+ ///
+ /// Provided for instance kinds:
+ /// - ReceivePort
+ @optional
+ InstanceRef allocationLocation;
+
+ /// A name associated with a ReceivePort used for debugging purposes.
+ ///
+ /// Provided for instance kinds:
+ /// - ReceivePort
+ @optional
+ String debugName;
+
InstanceRef({
@required this.kind,
@required this.classRef,
@@ -4252,6 +4293,9 @@
this.pattern,
this.closureFunction,
this.closureContext,
+ this.portId,
+ this.allocationLocation,
+ this.debugName,
}) : super(id: id);
InstanceRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
@@ -4269,6 +4313,10 @@
createServiceObject(json['closureFunction'], const ['FuncRef']);
closureContext =
createServiceObject(json['closureContext'], const ['ContextRef']);
+ portId = json['portId'];
+ allocationLocation =
+ createServiceObject(json['allocationLocation'], const ['InstanceRef']);
+ debugName = json['debugName'];
}
@override
@@ -4288,6 +4336,9 @@
_setIfNotNull(json, 'pattern', pattern?.toJson());
_setIfNotNull(json, 'closureFunction', closureFunction?.toJson());
_setIfNotNull(json, 'closureContext', closureContext?.toJson());
+ _setIfNotNull(json, 'portId', portId);
+ _setIfNotNull(json, 'allocationLocation', allocationLocation?.toJson());
+ _setIfNotNull(json, 'debugName', debugName);
return json;
}
@@ -4318,6 +4369,7 @@
/// - Double (suitable for passing to Double.parse())
/// - Int (suitable for passing to int.parse())
/// - String (value may be truncated)
+ /// - StackTrace
@optional
String valueAsString;
@@ -4554,6 +4606,27 @@
@optional
InstanceRef bound;
+ /// The port ID for a ReceivePort.
+ ///
+ /// Provided for instance kinds:
+ /// - ReceivePort
+ @optional
+ int portId;
+
+ /// The stack trace associated with the allocation of a ReceivePort.
+ ///
+ /// Provided for instance kinds:
+ /// - ReceivePort
+ @optional
+ InstanceRef allocationLocation;
+
+ /// A name associated with a ReceivePort used for debugging purposes.
+ ///
+ /// Provided for instance kinds:
+ /// - ReceivePort
+ @optional
+ String debugName;
+
Instance({
@required this.kind,
@required this.classRef,
@@ -4582,6 +4655,9 @@
this.parameterIndex,
this.targetType,
this.bound,
+ this.portId,
+ this.allocationLocation,
+ this.debugName,
}) : super(id: id);
Instance._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
@@ -4627,6 +4703,10 @@
parameterIndex = json['parameterIndex'];
targetType = createServiceObject(json['targetType'], const ['InstanceRef']);
bound = createServiceObject(json['bound'], const ['InstanceRef']);
+ portId = json['portId'];
+ allocationLocation =
+ createServiceObject(json['allocationLocation'], const ['InstanceRef']);
+ debugName = json['debugName'];
}
@override
@@ -4663,6 +4743,9 @@
_setIfNotNull(json, 'parameterIndex', parameterIndex);
_setIfNotNull(json, 'targetType', targetType?.toJson());
_setIfNotNull(json, 'bound', bound?.toJson());
+ _setIfNotNull(json, 'portId', portId);
+ _setIfNotNull(json, 'allocationLocation', allocationLocation?.toJson());
+ _setIfNotNull(json, 'debugName', debugName);
return json;
}
@@ -5743,6 +5826,37 @@
String toString() => '[Obj type: ${type}, id: ${id}]';
}
+/// A `PortList` contains a list of ports associated with some isolate.
+///
+/// See [getPort].
+class PortList extends Response {
+ static PortList parse(Map<String, dynamic> json) =>
+ json == null ? null : PortList._fromJson(json);
+
+ List<InstanceRef> ports;
+
+ PortList({
+ @required this.ports,
+ });
+
+ PortList._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+ ports = List<InstanceRef>.from(
+ createServiceObject(json['ports'], const ['InstanceRef']) ?? []);
+ }
+
+ @override
+ Map<String, dynamic> toJson() {
+ var json = <String, dynamic>{};
+ json['type'] = 'PortList';
+ json.addAll({
+ 'ports': ports.map((f) => f.toJson()).toList(),
+ });
+ return json;
+ }
+
+ String toString() => '[PortList type: ${type}, ports: ${ports}]';
+}
+
/// A `ProfileFunction` contains profiling information about a Dart or native
/// function.
///
diff --git a/pkg/vm_service/pubspec.yaml b/pkg/vm_service/pubspec.yaml
index 690f8b6..0c77a68 100644
--- a/pkg/vm_service/pubspec.yaml
+++ b/pkg/vm_service/pubspec.yaml
@@ -2,7 +2,7 @@
description: >-
A library to communicate with a service implementing the Dart VM
service protocol.
-version: 5.3.0
+version: 5.4.0
homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_service
diff --git a/pkg/vm_service/test/network_profiling_test.dart b/pkg/vm_service/test/network_profiling_test.dart
index ecbad0d..bdb22a1 100644
--- a/pkg/vm_service/test/network_profiling_test.dart
+++ b/pkg/vm_service/test/network_profiling_test.dart
@@ -19,8 +19,36 @@
const String kGetVersionRPC = 'ext.dart.io.getVersion';
const String kPauseSocketProfilingRPC = 'ext.dart.io.pauseSocketProfiling';
const String kStartSocketProfilingRPC = 'ext.dart.io.startSocketProfiling';
+const String kSocketProfilingEnabledRPC = 'ext.dart.io.socketProfilingEnabled';
const String localhost = '127.0.0.1';
+Future<void> waitForStreamEvent(
+ VmService service, IsolateRef isolateRef, bool state,
+ {bool useSetter = true}) async {
+ final completer = Completer<void>();
+ final isolateId = isolateRef.id;
+ StreamSubscription sub;
+ sub = service.onExtensionEvent.listen((event) {
+ expect(event.extensionKind, 'SocketProfilingStateChange');
+ expect(event.extensionData.data['isolateId'], isolateRef.id);
+ expect(event.extensionData.data['enabled'], state);
+ sub.cancel();
+ completer.complete();
+ });
+ await service.streamListen(EventStreams.kExtension);
+
+ if (useSetter) {
+ // ignore: deprecated_member_use_from_same_package
+ state
+ ? await service.startSocketProfiling(isolateId)
+ : await service.pauseSocketProfiling(isolateId);
+ } else {
+ await service.socketProfilingEnabled(isolateId, state);
+ }
+ await completer.future;
+ await service.streamCancel(EventStreams.kExtension);
+}
+
Future<void> setup() async {}
Future<void> socketTest() async {
@@ -63,6 +91,7 @@
expect(isolate.extensionRPCs.contains(kPauseSocketProfilingRPC), isTrue);
expect(isolate.extensionRPCs.contains(kStartSocketProfilingRPC), isTrue);
expect(isolate.extensionRPCs.contains(kPauseSocketProfilingRPC), isTrue);
+ expect(isolate.extensionRPCs.contains(kSocketProfilingEnabledRPC), isTrue);
},
// Test getSocketProfiler
@@ -70,16 +99,34 @@
final socketProfile = await service.getSocketProfile(isolateRef.id);
expect(socketProfile.sockets.isEmpty, isTrue);
},
- // Exercise all methods naively
+ // Exercise methods naively
(VmService service, IsolateRef isolateRef) async {
final version = await service.getDartIOVersion(isolateRef.id);
expect(version.major >= 1, true);
expect(version.minor >= 0, true);
- await service.startSocketProfiling(isolateRef.id);
- await service.pauseSocketProfiling(isolateRef.id);
await service.clearSocketProfile(isolateRef.id);
await service.getSocketProfile(isolateRef.id);
},
+ (VmService service, IsolateRef isolateRef) async {
+ final initial =
+ (await service.socketProfilingEnabled(isolateRef.id)).enabled;
+ await waitForStreamEvent(service, isolateRef, !initial);
+ expect((await service.socketProfilingEnabled(isolateRef.id)).enabled,
+ !initial);
+ await waitForStreamEvent(service, isolateRef, initial);
+ expect(
+ (await service.socketProfilingEnabled(isolateRef.id)).enabled, initial);
+ },
+ (VmService service, IsolateRef isolateRef) async {
+ final initial =
+ (await service.socketProfilingEnabled(isolateRef.id)).enabled;
+ await waitForStreamEvent(service, isolateRef, !initial, useSetter: false);
+ expect((await service.socketProfilingEnabled(isolateRef.id)).enabled,
+ !initial);
+ await waitForStreamEvent(service, isolateRef, initial, useSetter: false);
+ expect(
+ (await service.socketProfilingEnabled(isolateRef.id)).enabled, initial);
+ }
// TODO(bkonyi): fully port observatory test for socket profiling.
];
diff --git a/runtime/lib/function.cc b/runtime/lib/function.cc
index 7113f26..1ea506c 100644
--- a/runtime/lib/function.cc
+++ b/runtime/lib/function.cc
@@ -71,27 +71,4 @@
return Smi::New(receiver.ComputeHash());
}
-DEFINE_NATIVE_ENTRY(Closure_clone, 0, 1) {
- const Closure& receiver =
- Closure::CheckedHandle(zone, arguments->NativeArgAt(0));
- const TypeArguments& instantiator_type_arguments =
- TypeArguments::Handle(zone, receiver.instantiator_type_arguments());
- const TypeArguments& function_type_arguments =
- TypeArguments::Handle(zone, receiver.function_type_arguments());
- const Function& function = Function::Handle(zone, receiver.function());
- const Context& context = Context::Handle(zone, receiver.context());
- Context& cloned_context = Context::Handle(zone);
- if (!context.IsNull()) {
- cloned_context = Context::New(context.num_variables());
- cloned_context.set_parent(Context::Handle(zone, context.parent()));
- Object& instance = Object::Handle(zone);
- for (int i = 0; i < context.num_variables(); i++) {
- instance = context.At(i);
- cloned_context.SetAt(i, instance);
- }
- }
- return Closure::New(instantiator_type_arguments, function_type_arguments,
- function, cloned_context);
-}
-
} // namespace dart
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index 4b381cb..905cb26 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -51,11 +51,12 @@
return Smi::New(hash);
}
-DEFINE_NATIVE_ENTRY(RawReceivePortImpl_factory, 0, 1) {
+DEFINE_NATIVE_ENTRY(RawReceivePortImpl_factory, 0, 2) {
ASSERT(
TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
+ GET_NON_NULL_NATIVE_ARGUMENT(String, debug_name, arguments->NativeArgAt(1));
Dart_Port port_id = PortMap::CreatePort(isolate->message_handler());
- return ReceivePort::New(port_id, false /* not control port */);
+ return ReceivePort::New(port_id, debug_name, false /* not control port */);
}
DEFINE_NATIVE_ENTRY(RawReceivePortImpl_get_id, 0, 1) {
diff --git a/runtime/lib/stacktrace.cc b/runtime/lib/stacktrace.cc
index c2d8657..4b2afb9 100644
--- a/runtime/lib/stacktrace.cc
+++ b/runtime/lib/stacktrace.cc
@@ -224,4 +224,12 @@
return stacktrace;
}
+bool HasStack() {
+ Thread* thread = Thread::Current();
+ StackFrameIterator frames(ValidationPolicy::kDontValidateFrames, thread,
+ StackFrameIterator::kNoCrossThreadIteration);
+ StackFrame* frame = frames.NextFrame();
+ return frame != nullptr;
+}
+
} // namespace dart
diff --git a/runtime/lib/stacktrace.h b/runtime/lib/stacktrace.h
index 9c8abae..a804d62 100644
--- a/runtime/lib/stacktrace.h
+++ b/runtime/lib/stacktrace.h
@@ -21,6 +21,9 @@
// Creates a StackTrace object to be attached to an exception.
StackTracePtr GetStackTraceForException();
+// Returns false if there is no Dart stack available.
+bool HasStack();
+
} // namespace dart
#endif // RUNTIME_LIB_STACKTRACE_H_
diff --git a/runtime/observatory/lib/src/models/objects/instance.dart b/runtime/observatory/lib/src/models/objects/instance.dart
index ab8d6d6..a0400c5 100644
--- a/runtime/observatory/lib/src/models/objects/instance.dart
+++ b/runtime/observatory/lib/src/models/objects/instance.dart
@@ -120,6 +120,9 @@
/// An instance of the Dart class TypeRef.
typeRef,
+
+ /// An instance of the Dart class RawReceivePort
+ receivePort,
}
bool isTypedData(InstanceKind? kind) {
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index 7215ef7..8352f38 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -2781,6 +2781,8 @@
return M.InstanceKind.typeParameter;
case 'TypeRef':
return M.InstanceKind.typeRef;
+ case 'ReceivePort':
+ return M.InstanceKind.receivePort;
}
var message = 'Unrecognized instance kind: $s';
Logger.root.severe(message);
diff --git a/runtime/observatory/tests/service/get_ports_public_rpc_test.dart b/runtime/observatory/tests/service/get_ports_public_rpc_test.dart
new file mode 100644
index 0000000..cc511f7
--- /dev/null
+++ b/runtime/observatory/tests/service/get_ports_public_rpc_test.dart
@@ -0,0 +1,50 @@
+// 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.
+
+import 'dart:isolate' hide Isolate;
+import 'package:observatory/service_io.dart';
+import 'package:test/test.dart';
+
+import 'test_helper.dart';
+
+var port1;
+var port2;
+var port3;
+
+void warmup() {
+ port1 = RawReceivePort(null, 'port1');
+ port2 = RawReceivePort((_) {});
+ port3 = RawReceivePort((_) {}, 'port3');
+ port3.close();
+ RawReceivePort((_) {}, 'port4');
+}
+
+int countNameMatches(ports, name) {
+ var matches = 0;
+ for (var port in ports) {
+ if (port['debugName'] == name) {
+ matches++;
+ }
+ }
+ return matches;
+}
+
+final tests = <IsolateTest>[
+ (Isolate isolate) async {
+ dynamic result = await isolate.invokeRpcNoUpgrade('getPorts', {});
+ expect(result['type'], 'PortList');
+ expect(result['ports'], isList);
+ final ports = result['ports'];
+ // There are at least three ports: the three created in warm up that
+ // weren't closed. Some OSes will have other ports open but we do not try
+ // and test for these.
+ expect(ports.length, greaterThanOrEqualTo(3));
+ expect(countNameMatches(ports, 'port1'), 1);
+ expect(countNameMatches(ports, 'port3'), 0);
+ expect(countNameMatches(ports, 'port4'), 1);
+ expect(countNameMatches(ports, ''), greaterThanOrEqualTo(1));
+ },
+];
+
+main(args) async => runIsolateTests(args, tests, testeeBefore: warmup);
diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart
index 8b56393..c8b0244 100644
--- a/runtime/observatory/tests/service/get_version_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_version_rpc_test.dart
@@ -9,12 +9,12 @@
var tests = <VMTest>[
(VM vm) async {
- var result = await vm.invokeRpcNoUpgrade('getVersion', {});
- expect(result['type'], equals('Version'));
- expect(result['major'], equals(3));
- expect(result['minor'], equals(40));
- expect(result['_privateMajor'], equals(0));
- expect(result['_privateMinor'], equals(0));
+ final result = await vm.invokeRpcNoUpgrade('getVersion', {});
+ expect(result['type'], 'Version');
+ expect(result['major'], 3);
+ expect(result['minor'], 41);
+ expect(result['_privateMajor'], 0);
+ expect(result['_privateMinor'], 0);
},
];
diff --git a/runtime/observatory_2/lib/src/models/objects/instance.dart b/runtime/observatory_2/lib/src/models/objects/instance.dart
index 66965e9..e52cdd7 100644
--- a/runtime/observatory_2/lib/src/models/objects/instance.dart
+++ b/runtime/observatory_2/lib/src/models/objects/instance.dart
@@ -120,6 +120,9 @@
/// An instance of the Dart class TypeRef.
typeRef,
+
+ /// An instance of the Dart class RawReceivePort
+ receivePort,
}
bool isTypedData(InstanceKind kind) {
diff --git a/runtime/observatory_2/lib/src/service/object.dart b/runtime/observatory_2/lib/src/service/object.dart
index 046513d..9b6ac2d 100644
--- a/runtime/observatory_2/lib/src/service/object.dart
+++ b/runtime/observatory_2/lib/src/service/object.dart
@@ -2790,6 +2790,8 @@
return M.InstanceKind.typeParameter;
case 'TypeRef':
return M.InstanceKind.typeRef;
+ case 'ReceivePort':
+ return M.InstanceKind.receivePort;
}
var message = 'Unrecognized instance kind: $s';
Logger.root.severe(message);
diff --git a/runtime/observatory_2/tests/service_2/get_ports_public_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_ports_public_rpc_test.dart
new file mode 100644
index 0000000..179823f
--- /dev/null
+++ b/runtime/observatory_2/tests/service_2/get_ports_public_rpc_test.dart
@@ -0,0 +1,50 @@
+// 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.
+
+import 'dart:isolate' hide Isolate;
+import 'package:observatory_2/service_io.dart';
+import 'package:test/test.dart';
+
+import 'test_helper.dart';
+
+var port1;
+var port2;
+var port3;
+
+void warmup() {
+ port1 = RawReceivePort(null, 'port1');
+ port2 = RawReceivePort((_) {});
+ port3 = RawReceivePort((_) {}, 'port3');
+ port3.close();
+ RawReceivePort((_) {}, 'port4');
+}
+
+int countNameMatches(ports, name) {
+ var matches = 0;
+ for (var port in ports) {
+ if (port['debugName'] == name) {
+ matches++;
+ }
+ }
+ return matches;
+}
+
+final tests = <IsolateTest>[
+ (Isolate isolate) async {
+ dynamic result = await isolate.invokeRpcNoUpgrade('getPorts', {});
+ expect(result['type'], 'PortList');
+ expect(result['ports'], isList);
+ final ports = result['ports'];
+ // There are at least three ports: the three created in warm up that
+ // weren't closed. Some OSes will have other ports open but we do not try
+ // and test for these.
+ expect(ports.length, greaterThanOrEqualTo(3));
+ expect(countNameMatches(ports, 'port1'), 1);
+ expect(countNameMatches(ports, 'port3'), 0);
+ expect(countNameMatches(ports, 'port4'), 1);
+ expect(countNameMatches(ports, ''), greaterThanOrEqualTo(1));
+ },
+];
+
+main(args) async => runIsolateTests(args, tests, testeeBefore: warmup);
diff --git a/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart b/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
index d5450e5..df37cb9 100644
--- a/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
+++ b/runtime/observatory_2/tests/service_2/get_version_rpc_test.dart
@@ -12,7 +12,7 @@
var result = await vm.invokeRpcNoUpgrade('getVersion', {});
expect(result['type'], equals('Version'));
expect(result['major'], equals(3));
- expect(result['minor'], equals(40));
+ expect(result['minor'], equals(41));
expect(result['_privateMajor'], equals(0));
expect(result['_privateMinor'], equals(0));
},
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index a9e7f65..8b15f7b 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -27,7 +27,6 @@
V(Function_apply, 2) \
V(Closure_equals, 2) \
V(Closure_computeHash, 1) \
- V(Closure_clone, 1) \
V(AbstractType_toString, 1) \
V(Type_getHashCode, 1) \
V(Type_equality, 2) \
@@ -55,7 +54,7 @@
V(CapabilityImpl_factory, 1) \
V(CapabilityImpl_equals, 2) \
V(CapabilityImpl_get_hashcode, 1) \
- V(RawReceivePortImpl_factory, 1) \
+ V(RawReceivePortImpl_factory, 2) \
V(RawReceivePortImpl_get_id, 1) \
V(RawReceivePortImpl_get_sendport, 1) \
V(RawReceivePortImpl_closeInternal, 1) \
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 475ad93..7af21bf 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -847,6 +847,7 @@
type_param.set_default_argument(finalized_type);
}
}
+ function.UpdateCachedDefaultTypeArguments(Thread::Current());
}
// Finalize result type.
type = function.result_type();
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 07e9e02..e32e798 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -289,7 +289,7 @@
class ClassDeserializationCluster : public DeserializationCluster {
public:
- ClassDeserializationCluster() {}
+ ClassDeserializationCluster() : DeserializationCluster("Class") {}
~ClassDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -463,7 +463,8 @@
class TypeArgumentsDeserializationCluster : public DeserializationCluster {
public:
- TypeArgumentsDeserializationCluster() {}
+ TypeArgumentsDeserializationCluster()
+ : DeserializationCluster("TypeArguments") {}
~TypeArgumentsDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -556,7 +557,7 @@
class PatchClassDeserializationCluster : public DeserializationCluster {
public:
- PatchClassDeserializationCluster() {}
+ PatchClassDeserializationCluster() : DeserializationCluster("PatchClass") {}
~PatchClassDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -671,7 +672,7 @@
class FunctionDeserializationCluster : public DeserializationCluster {
public:
- FunctionDeserializationCluster() {}
+ FunctionDeserializationCluster() : DeserializationCluster("Function") {}
~FunctionDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -790,6 +791,8 @@
s->Push(data->ptr()->parent_function_);
s->Push(data->ptr()->signature_type_);
s->Push(data->ptr()->closure_);
+ s->Push(data->ptr()->default_type_arguments_);
+ s->Push(data->ptr()->default_type_arguments_info_);
}
void WriteAlloc(Serializer* s) {
@@ -813,6 +816,8 @@
WriteField(data, parent_function_);
WriteField(data, signature_type_);
WriteField(data, closure_);
+ WriteField(data, default_type_arguments_);
+ WriteField(data, default_type_arguments_info_);
}
}
@@ -823,7 +828,7 @@
class ClosureDataDeserializationCluster : public DeserializationCluster {
public:
- ClosureDataDeserializationCluster() {}
+ ClosureDataDeserializationCluster() : DeserializationCluster("ClosureData") {}
~ClosureDataDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -851,6 +856,10 @@
data->ptr()->parent_function_ = static_cast<FunctionPtr>(d->ReadRef());
data->ptr()->signature_type_ = static_cast<TypePtr>(d->ReadRef());
data->ptr()->closure_ = static_cast<InstancePtr>(d->ReadRef());
+ data->ptr()->default_type_arguments_ =
+ static_cast<TypeArgumentsPtr>(d->ReadRef());
+ data->ptr()->default_type_arguments_info_ =
+ static_cast<SmiPtr>(d->ReadRef());
}
}
};
@@ -893,7 +902,8 @@
class SignatureDataDeserializationCluster : public DeserializationCluster {
public:
- SignatureDataDeserializationCluster() {}
+ SignatureDataDeserializationCluster()
+ : DeserializationCluster("SignatureData") {}
~SignatureDataDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -962,7 +972,8 @@
class FfiTrampolineDataDeserializationCluster : public DeserializationCluster {
public:
- FfiTrampolineDataDeserializationCluster() {}
+ FfiTrampolineDataDeserializationCluster()
+ : DeserializationCluster("FfiTrampolineData") {}
~FfiTrampolineDataDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -1027,7 +1038,8 @@
class RedirectionDataDeserializationCluster : public DeserializationCluster {
public:
- RedirectionDataDeserializationCluster() {}
+ RedirectionDataDeserializationCluster()
+ : DeserializationCluster("RedirectionData") {}
~RedirectionDataDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -1164,7 +1176,7 @@
class FieldDeserializationCluster : public DeserializationCluster {
public:
- FieldDeserializationCluster() {}
+ FieldDeserializationCluster() : DeserializationCluster("Field") {}
~FieldDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -1286,7 +1298,7 @@
class ScriptDeserializationCluster : public DeserializationCluster {
public:
- ScriptDeserializationCluster() {}
+ ScriptDeserializationCluster() : DeserializationCluster("Script") {}
~ScriptDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -1359,7 +1371,7 @@
class LibraryDeserializationCluster : public DeserializationCluster {
public:
- LibraryDeserializationCluster() {}
+ LibraryDeserializationCluster() : DeserializationCluster("Library") {}
~LibraryDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -1431,7 +1443,7 @@
class NamespaceDeserializationCluster : public DeserializationCluster {
public:
- NamespaceDeserializationCluster() {}
+ NamespaceDeserializationCluster() : DeserializationCluster("Namespace") {}
~NamespaceDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -1496,7 +1508,8 @@
// one will never need to read them from a full AOT snapshot.
class KernelProgramInfoDeserializationCluster : public DeserializationCluster {
public:
- KernelProgramInfoDeserializationCluster() {}
+ KernelProgramInfoDeserializationCluster()
+ : DeserializationCluster("KernelProgramInfo") {}
~KernelProgramInfoDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -1857,7 +1870,7 @@
class CodeDeserializationCluster : public DeserializationCluster {
public:
- CodeDeserializationCluster() {}
+ CodeDeserializationCluster() : DeserializationCluster("Code") {}
~CodeDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2009,7 +2022,7 @@
class BytecodeDeserializationCluster : public DeserializationCluster {
public:
- BytecodeDeserializationCluster() {}
+ BytecodeDeserializationCluster() : DeserializationCluster("Bytecode") {}
virtual ~BytecodeDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2147,7 +2160,7 @@
class ObjectPoolDeserializationCluster : public DeserializationCluster {
public:
- ObjectPoolDeserializationCluster() {}
+ ObjectPoolDeserializationCluster() : DeserializationCluster("ObjectPool") {}
~ObjectPoolDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2311,7 +2324,8 @@
class WeakSerializationReferenceDeserializationCluster
: public DeserializationCluster {
public:
- WeakSerializationReferenceDeserializationCluster() {}
+ WeakSerializationReferenceDeserializationCluster()
+ : DeserializationCluster("WeakSerializationReference") {}
~WeakSerializationReferenceDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2383,7 +2397,8 @@
class PcDescriptorsDeserializationCluster : public DeserializationCluster {
public:
- PcDescriptorsDeserializationCluster() {}
+ PcDescriptorsDeserializationCluster()
+ : DeserializationCluster("PcDescriptors") {}
~PcDescriptorsDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2476,7 +2491,7 @@
class RODataDeserializationCluster : public DeserializationCluster {
public:
- RODataDeserializationCluster() {}
+ RODataDeserializationCluster() : DeserializationCluster("ROData") {}
~RODataDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2546,7 +2561,8 @@
class ExceptionHandlersDeserializationCluster : public DeserializationCluster {
public:
- ExceptionHandlersDeserializationCluster() {}
+ ExceptionHandlersDeserializationCluster()
+ : DeserializationCluster("ExceptionHandlers") {}
~ExceptionHandlersDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2634,7 +2650,7 @@
class ContextDeserializationCluster : public DeserializationCluster {
public:
- ContextDeserializationCluster() {}
+ ContextDeserializationCluster() : DeserializationCluster("Context") {}
~ContextDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2710,7 +2726,8 @@
class ContextScopeDeserializationCluster : public DeserializationCluster {
public:
- ContextScopeDeserializationCluster() {}
+ ContextScopeDeserializationCluster()
+ : DeserializationCluster("ContextScope") {}
~ContextScopeDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2777,7 +2794,8 @@
class ParameterTypeCheckDeserializationCluster : public DeserializationCluster {
public:
- ParameterTypeCheckDeserializationCluster() {}
+ ParameterTypeCheckDeserializationCluster()
+ : DeserializationCluster("ParameterTypeCheck") {}
~ParameterTypeCheckDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2842,7 +2860,8 @@
class UnlinkedCallDeserializationCluster : public DeserializationCluster {
public:
- UnlinkedCallDeserializationCluster() {}
+ UnlinkedCallDeserializationCluster()
+ : DeserializationCluster("UnlinkedCall") {}
~UnlinkedCallDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2910,7 +2929,7 @@
class ICDataDeserializationCluster : public DeserializationCluster {
public:
- ICDataDeserializationCluster() {}
+ ICDataDeserializationCluster() : DeserializationCluster("ICData") {}
~ICDataDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -2974,7 +2993,8 @@
class MegamorphicCacheDeserializationCluster : public DeserializationCluster {
public:
- MegamorphicCacheDeserializationCluster() {}
+ MegamorphicCacheDeserializationCluster()
+ : DeserializationCluster("MegamorphicCache") {}
~MegamorphicCacheDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3064,7 +3084,8 @@
class SubtypeTestCacheDeserializationCluster : public DeserializationCluster {
public:
- SubtypeTestCacheDeserializationCluster() {}
+ SubtypeTestCacheDeserializationCluster()
+ : DeserializationCluster("SubtypeTestCache") {}
~SubtypeTestCacheDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3127,7 +3148,7 @@
class LoadingUnitDeserializationCluster : public DeserializationCluster {
public:
- LoadingUnitDeserializationCluster() {}
+ LoadingUnitDeserializationCluster() : DeserializationCluster("LoadingUnit") {}
~LoadingUnitDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3196,7 +3217,8 @@
class LanguageErrorDeserializationCluster : public DeserializationCluster {
public:
- LanguageErrorDeserializationCluster() {}
+ LanguageErrorDeserializationCluster()
+ : DeserializationCluster("LanguageError") {}
~LanguageErrorDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3262,7 +3284,8 @@
class UnhandledExceptionDeserializationCluster : public DeserializationCluster {
public:
- UnhandledExceptionDeserializationCluster() {}
+ UnhandledExceptionDeserializationCluster()
+ : DeserializationCluster("UnhandledException") {}
~UnhandledExceptionDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3386,7 +3409,8 @@
class InstanceDeserializationCluster : public DeserializationCluster {
public:
- explicit InstanceDeserializationCluster(intptr_t cid) : cid_(cid) {}
+ explicit InstanceDeserializationCluster(intptr_t cid)
+ : DeserializationCluster("Instance"), cid_(cid) {}
~InstanceDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3483,7 +3507,8 @@
class LibraryPrefixDeserializationCluster : public DeserializationCluster {
public:
- LibraryPrefixDeserializationCluster() {}
+ LibraryPrefixDeserializationCluster()
+ : DeserializationCluster("LibraryPrefix") {}
~LibraryPrefixDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3577,7 +3602,7 @@
class TypeDeserializationCluster : public DeserializationCluster {
public:
- TypeDeserializationCluster() {}
+ TypeDeserializationCluster() : DeserializationCluster("Type") {}
~TypeDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3676,7 +3701,7 @@
class TypeRefDeserializationCluster : public DeserializationCluster {
public:
- TypeRefDeserializationCluster() {}
+ TypeRefDeserializationCluster() : DeserializationCluster("TypeRef") {}
~TypeRefDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3774,7 +3799,8 @@
class TypeParameterDeserializationCluster : public DeserializationCluster {
public:
- TypeParameterDeserializationCluster() {}
+ TypeParameterDeserializationCluster()
+ : DeserializationCluster("TypeParameter") {}
~TypeParameterDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3878,7 +3904,7 @@
class ClosureDeserializationCluster : public DeserializationCluster {
public:
- ClosureDeserializationCluster() {}
+ ClosureDeserializationCluster() : DeserializationCluster("Closure") {}
~ClosureDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -3945,7 +3971,7 @@
class MintDeserializationCluster : public DeserializationCluster {
public:
- MintDeserializationCluster() {}
+ MintDeserializationCluster() : DeserializationCluster("int") {}
~MintDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4025,7 +4051,7 @@
class DoubleDeserializationCluster : public DeserializationCluster {
public:
- DoubleDeserializationCluster() {}
+ DoubleDeserializationCluster() : DeserializationCluster("double") {}
~DoubleDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4088,7 +4114,8 @@
class GrowableObjectArrayDeserializationCluster
: public DeserializationCluster {
public:
- GrowableObjectArrayDeserializationCluster() {}
+ GrowableObjectArrayDeserializationCluster()
+ : DeserializationCluster("GrowableObjectArray") {}
~GrowableObjectArrayDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4160,7 +4187,8 @@
class TypedDataDeserializationCluster : public DeserializationCluster {
public:
- explicit TypedDataDeserializationCluster(intptr_t cid) : cid_(cid) {}
+ explicit TypedDataDeserializationCluster(intptr_t cid)
+ : DeserializationCluster("TypedData"), cid_(cid) {}
~TypedDataDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4237,7 +4265,8 @@
class TypedDataViewDeserializationCluster : public DeserializationCluster {
public:
- explicit TypedDataViewDeserializationCluster(intptr_t cid) : cid_(cid) {}
+ explicit TypedDataViewDeserializationCluster(intptr_t cid)
+ : DeserializationCluster("TypedDataView"), cid_(cid) {}
~TypedDataViewDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4316,7 +4345,8 @@
class ExternalTypedDataDeserializationCluster : public DeserializationCluster {
public:
- explicit ExternalTypedDataDeserializationCluster(intptr_t cid) : cid_(cid) {}
+ explicit ExternalTypedDataDeserializationCluster(intptr_t cid)
+ : DeserializationCluster("ExternalTypedData"), cid_(cid) {}
~ExternalTypedDataDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4388,7 +4418,7 @@
class StackTraceDeserializationCluster : public DeserializationCluster {
public:
- StackTraceDeserializationCluster() {}
+ StackTraceDeserializationCluster() : DeserializationCluster("StackTrace") {}
~StackTraceDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4453,7 +4483,7 @@
class RegExpDeserializationCluster : public DeserializationCluster {
public:
- RegExpDeserializationCluster() {}
+ RegExpDeserializationCluster() : DeserializationCluster("RegExp") {}
~RegExpDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4517,7 +4547,8 @@
class WeakPropertyDeserializationCluster : public DeserializationCluster {
public:
- WeakPropertyDeserializationCluster() {}
+ WeakPropertyDeserializationCluster()
+ : DeserializationCluster("WeakProperty") {}
~WeakPropertyDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4611,7 +4642,8 @@
class LinkedHashMapDeserializationCluster : public DeserializationCluster {
public:
- LinkedHashMapDeserializationCluster() {}
+ LinkedHashMapDeserializationCluster()
+ : DeserializationCluster("LinkedHashMap") {}
~LinkedHashMapDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4716,7 +4748,8 @@
class ArrayDeserializationCluster : public DeserializationCluster {
public:
- explicit ArrayDeserializationCluster(intptr_t cid) : cid_(cid) {}
+ explicit ArrayDeserializationCluster(intptr_t cid)
+ : DeserializationCluster("Array"), cid_(cid) {}
~ArrayDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4793,7 +4826,8 @@
class OneByteStringDeserializationCluster : public DeserializationCluster {
public:
- OneByteStringDeserializationCluster() {}
+ OneByteStringDeserializationCluster()
+ : DeserializationCluster("OneByteString") {}
~OneByteStringDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
@@ -4885,7 +4919,8 @@
class TwoByteStringDeserializationCluster : public DeserializationCluster {
public:
- TwoByteStringDeserializationCluster() {}
+ TwoByteStringDeserializationCluster()
+ : DeserializationCluster("TwoByteString") {}
~TwoByteStringDeserializationCluster() {}
void ReadAlloc(Deserializer* d, bool is_canonical) {
diff --git a/runtime/vm/clustered_snapshot.h b/runtime/vm/clustered_snapshot.h
index 535163d..c02f85f 100644
--- a/runtime/vm/clustered_snapshot.h
+++ b/runtime/vm/clustered_snapshot.h
@@ -110,7 +110,8 @@
class DeserializationCluster : public ZoneAllocated {
public:
- DeserializationCluster() : start_index_(-1), stop_index_(-1) {}
+ explicit DeserializationCluster(const char* name)
+ : name_(name), start_index_(-1), stop_index_(-1) {}
virtual ~DeserializationCluster() {}
// Allocate memory for all objects in the cluster and write their addresses
@@ -126,7 +127,10 @@
const Array& refs,
bool is_canonical) {}
+ const char* name() const { return name_; }
+
protected:
+ const char* name_;
// The range of the ref array that belongs to this cluster.
intptr_t start_index_;
intptr_t stop_index_;
diff --git a/runtime/vm/code_patcher_arm64_test.cc b/runtime/vm/code_patcher_arm64_test.cc
index 135452e..61767d8 100644
--- a/runtime/vm/code_patcher_arm64_test.cc
+++ b/runtime/vm/code_patcher_arm64_test.cc
@@ -50,8 +50,7 @@
const intptr_t stub_index =
op.AddObject(stub, ObjectPool::Patchability::kPatchable);
ASSERT((ic_data_index + 1) == stub_index);
- __ LoadDoubleWordFromPoolOffset(R5, CODE_REG,
- ObjectPool::element_offset(ic_data_index));
+ __ LoadDoubleWordFromPoolIndex(R5, CODE_REG, ic_data_index);
__ ldr(LR, compiler::FieldAddress(
CODE_REG,
Code::entry_point_offset(Code::EntryKind::kMonomorphic)));
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 9b963b6..b047850 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -796,6 +796,14 @@
type = function.ParameterTypeAt(i);
AddType(type);
}
+ // At this point, ensure any cached default type arguments are canonicalized.
+ function.UpdateCachedDefaultTypeArguments(thread());
+ if (function.CachesDefaultTypeArguments()) {
+ const auto& defaults = TypeArguments::Handle(
+ Z, function.default_type_arguments(/*kind_out=*/nullptr));
+ ASSERT(defaults.IsCanonical());
+ AddTypeArguments(defaults);
+ }
Code& code = Code::Handle(Z, function.CurrentCode());
if (code.IsNull()) {
ASSERT(function.kind() == FunctionLayout::kSignatureFunction);
@@ -834,18 +842,17 @@
if (abstype.IsNull()) return;
if (abstype.IsTypeParameter()) {
- if (typeparams_to_retain_.HasKey(&TypeParameter::Cast(abstype))) return;
- typeparams_to_retain_.Insert(
- &TypeParameter::ZoneHandle(Z, TypeParameter::Cast(abstype).raw()));
+ const auto& param = TypeParameter::Cast(abstype);
+ if (typeparams_to_retain_.HasKey(¶m)) return;
+ typeparams_to_retain_.Insert(&TypeParameter::ZoneHandle(Z, param.raw()));
- const AbstractType& type =
- AbstractType::Handle(Z, TypeParameter::Cast(abstype).bound());
+ auto& type = AbstractType::Handle(Z, param.bound());
AddType(type);
- const auto& function = Function::Handle(
- Z, TypeParameter::Cast(abstype).parameterized_function());
+ type = param.default_argument();
+ AddType(type);
+ const auto& function = Function::Handle(Z, param.parameterized_function());
AddTypesOf(function);
- const Class& cls =
- Class::Handle(Z, TypeParameter::Cast(abstype).parameterized_class());
+ const Class& cls = Class::Handle(Z, param.parameterized_class());
AddTypesOf(cls);
return;
}
diff --git a/runtime/vm/compiler/assembler/assembler_arm.cc b/runtime/vm/compiler/assembler/assembler_arm.cc
index f1997a9..4b84af62 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm.cc
@@ -1514,12 +1514,15 @@
}
// Uses a code sequence that can easily be decoded.
-void Assembler::LoadWordFromPoolOffset(Register rd,
- int32_t offset,
- Register pp,
- Condition cond) {
+void Assembler::LoadWordFromPoolIndex(Register rd,
+ intptr_t index,
+ Register pp,
+ Condition cond) {
ASSERT((pp != PP) || constant_pool_allowed());
ASSERT(rd != pp);
+ // PP is tagged on ARM.
+ const int32_t offset =
+ target::ObjectPool::element_offset(index) - kHeapObjectTag;
int32_t offset_mask = 0;
if (Address::CanHoldLoadOffset(kWord, offset, &offset_mask)) {
ldr(rd, Address(pp, offset), cond);
@@ -1632,8 +1635,7 @@
// object pool.
const auto index = is_unique ? object_pool_builder().AddObject(object)
: object_pool_builder().FindObject(object);
- const int32_t offset = target::ObjectPool::element_offset(index);
- LoadWordFromPoolOffset(rd, offset - kHeapObjectTag, pp, cond);
+ LoadWordFromPoolIndex(rd, index, pp, cond);
}
void Assembler::LoadObject(Register rd, const Object& object, Condition cond) {
@@ -1650,9 +1652,9 @@
const ExternalLabel* label,
ObjectPoolBuilderEntry::Patchability patchable,
Condition cond) {
- const int32_t offset = target::ObjectPool::element_offset(
- object_pool_builder().FindNativeFunction(label, patchable));
- LoadWordFromPoolOffset(rd, offset - kHeapObjectTag, PP, cond);
+ const intptr_t index =
+ object_pool_builder().FindNativeFunction(label, patchable);
+ LoadWordFromPoolIndex(rd, index, PP, cond);
}
void Assembler::PushObject(const Object& object) {
@@ -2207,6 +2209,7 @@
switch (cid) {
case kArrayCid:
case kImmutableArrayCid:
+ case kTypeArgumentsCid:
return kWord;
case kOneByteStringCid:
case kExternalOneByteStringCid:
@@ -2580,9 +2583,9 @@
ObjectPoolBuilderEntry::Patchability patchable,
Register pp,
Condition cond) {
- const int32_t offset = target::ObjectPool::element_offset(
- object_pool_builder().FindObject(ToObject(target), patchable));
- LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag, pp, cond);
+ const intptr_t index =
+ object_pool_builder().FindObject(ToObject(target), patchable);
+ LoadWordFromPoolIndex(CODE_REG, index, pp, cond);
Branch(FieldAddress(CODE_REG, target::Code::entry_point_offset()), cond);
}
@@ -2597,9 +2600,9 @@
// to by this code sequence.
// For added code robustness, use 'blx lr' in a patchable sequence and
// use 'blx ip' in a non-patchable sequence (see other BranchLink flavors).
- const int32_t offset = target::ObjectPool::element_offset(
- object_pool_builder().FindObject(ToObject(target), patchable));
- LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag, PP, AL);
+ const intptr_t index =
+ object_pool_builder().FindObject(ToObject(target), patchable);
+ LoadWordFromPoolIndex(CODE_REG, index, PP, AL);
ldr(LR, FieldAddress(CODE_REG, target::Code::entry_point_offset(entry_kind)));
blx(LR); // Use blx instruction so that the return branch prediction works.
}
@@ -2621,9 +2624,9 @@
// to by this code sequence.
// For added code robustness, use 'blx lr' in a patchable sequence and
// use 'blx ip' in a non-patchable sequence (see other BranchLink flavors).
- const int32_t offset = target::ObjectPool::element_offset(
- object_pool_builder().FindObject(ToObject(target), equivalence));
- LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag, PP, AL);
+ const intptr_t index =
+ object_pool_builder().FindObject(ToObject(target), equivalence);
+ LoadWordFromPoolIndex(CODE_REG, index, PP, AL);
ldr(LR, FieldAddress(CODE_REG, target::Code::entry_point_offset(entry_kind)));
blx(LR); // Use blx instruction so that the return branch prediction works.
}
diff --git a/runtime/vm/compiler/assembler/assembler_arm.h b/runtime/vm/compiler/assembler/assembler_arm.h
index 9707e07..1e9d2ff 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.h
+++ b/runtime/vm/compiler/assembler/assembler_arm.h
@@ -835,10 +835,10 @@
// Load word from pool from the given offset using encoding that
// InstructionPattern::DecodeLoadWordFromPool can decode.
- void LoadWordFromPoolOffset(Register rd,
- int32_t offset,
- Register pp,
- Condition cond = AL);
+ void LoadWordFromPoolIndex(Register rd,
+ intptr_t index,
+ Register pp = PP,
+ Condition cond = AL);
void LoadObject(Register rd, const Object& object, Condition cond = AL);
void LoadUniqueObject(Register rd, const Object& object, Condition cond = AL);
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index 9e3c425..f8089ac 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -344,12 +344,14 @@
set_constant_pool_allowed(pp == PP);
}
-void Assembler::LoadWordFromPoolOffset(Register dst,
- uint32_t offset,
- Register pp) {
+void Assembler::LoadWordFromPoolIndex(Register dst,
+ intptr_t index,
+ Register pp) {
ASSERT((pp != PP) || constant_pool_allowed());
ASSERT(dst != pp);
Operand op;
+ // PP is _un_tagged on ARM64.
+ const uint32_t offset = target::ObjectPool::element_offset(index);
const uint32_t upper20 = offset & 0xfffff000;
if (Address::CanHoldOffset(offset)) {
ldr(dst, Address(pp, offset));
@@ -370,10 +372,12 @@
}
}
-void Assembler::LoadWordFromPoolOffsetFixed(Register dst, uint32_t offset) {
+void Assembler::LoadWordFromPoolIndexFixed(Register dst, intptr_t index) {
ASSERT(constant_pool_allowed());
ASSERT(dst != PP);
Operand op;
+ // PP is _un_tagged on ARM64.
+ const uint32_t offset = target::ObjectPool::element_offset(index);
const uint32_t upper20 = offset & 0xfffff000;
const uint32_t lower12 = offset & 0x00000fff;
const Operand::OperandType ot =
@@ -384,16 +388,18 @@
ldr(dst, Address(dst, lower12));
}
-void Assembler::LoadDoubleWordFromPoolOffset(Register lower,
- Register upper,
- uint32_t offset) {
+void Assembler::LoadDoubleWordFromPoolIndex(Register lower,
+ Register upper,
+ intptr_t index) {
// This implementation needs to be kept in sync with
// [InstructionPattern::DecodeLoadDoubleWordFromPool].
ASSERT(constant_pool_allowed());
ASSERT(lower != PP && upper != PP);
- ASSERT(offset < (1 << 24));
Operand op;
+ // PP is _un_tagged on ARM64.
+ const uint32_t offset = target::ObjectPool::element_offset(index);
+ ASSERT(offset < (1 << 24));
const uint32_t upper20 = offset & 0xfffff000;
const uint32_t lower12 = offset & 0x00000fff;
if (Address::CanHoldOffset(offset, Address::PairOffset)) {
@@ -450,9 +456,9 @@
Register dst,
const ExternalLabel* label,
ObjectPoolBuilderEntry::Patchability patchable) {
- const int32_t offset = target::ObjectPool::element_offset(
- object_pool_builder().FindNativeFunction(label, patchable));
- LoadWordFromPoolOffset(dst, offset);
+ const intptr_t index =
+ object_pool_builder().FindNativeFunction(label, patchable);
+ LoadWordFromPoolIndex(dst, index);
}
void Assembler::LoadIsolate(Register dst) {
@@ -485,10 +491,9 @@
}
}
if (CanLoadFromObjectPool(object)) {
- const int32_t offset = target::ObjectPool::element_offset(
- is_unique ? object_pool_builder().AddObject(object)
- : object_pool_builder().FindObject(object));
- LoadWordFromPoolOffset(dst, offset);
+ const intptr_t index = is_unique ? object_pool_builder().AddObject(object)
+ : object_pool_builder().FindObject(object);
+ LoadWordFromPoolIndex(dst, index);
return;
}
ASSERT(target::IsSmi(object));
@@ -570,9 +575,8 @@
// Use constant pool if allowed, unless we can load imm with 2 instructions.
if ((w1 != 0) && constant_pool_allowed()) {
- const int32_t offset =
- target::ObjectPool::element_offset(FindImmediate(imm));
- LoadWordFromPoolOffset(reg, offset);
+ const intptr_t index = FindImmediate(imm);
+ LoadWordFromPoolIndex(reg, index);
return;
}
@@ -617,9 +621,9 @@
void Assembler::Branch(const Code& target,
Register pp,
ObjectPoolBuilderEntry::Patchability patchable) {
- const int32_t offset = target::ObjectPool::element_offset(
- object_pool_builder().FindObject(ToObject(target), patchable));
- LoadWordFromPoolOffset(CODE_REG, offset, pp);
+ const intptr_t index =
+ object_pool_builder().FindObject(ToObject(target), patchable);
+ LoadWordFromPoolIndex(CODE_REG, index, pp);
ldr(TMP, FieldAddress(CODE_REG, target::Code::entry_point_offset()));
br(TMP);
}
@@ -627,9 +631,9 @@
void Assembler::BranchLink(const Code& target,
ObjectPoolBuilderEntry::Patchability patchable,
CodeEntryKind entry_kind) {
- const int32_t offset = target::ObjectPool::element_offset(
- object_pool_builder().FindObject(ToObject(target), patchable));
- LoadWordFromPoolOffset(CODE_REG, offset);
+ const intptr_t index =
+ object_pool_builder().FindObject(ToObject(target), patchable);
+ LoadWordFromPoolIndex(CODE_REG, index);
ldr(TMP,
FieldAddress(CODE_REG, target::Code::entry_point_offset(entry_kind)));
blr(TMP);
@@ -643,9 +647,9 @@
void Assembler::BranchLinkWithEquivalence(const Code& target,
const Object& equivalence,
CodeEntryKind entry_kind) {
- const int32_t offset = target::ObjectPool::element_offset(
- object_pool_builder().FindObject(ToObject(target), equivalence));
- LoadWordFromPoolOffset(CODE_REG, offset);
+ const intptr_t index =
+ object_pool_builder().FindObject(ToObject(target), equivalence);
+ LoadWordFromPoolIndex(CODE_REG, index);
ldr(TMP,
FieldAddress(CODE_REG, target::Code::entry_point_offset(entry_kind)));
blr(TMP);
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index b60f259..b74553e 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -266,6 +266,7 @@
switch (cid) {
case kArrayCid:
case kImmutableArrayCid:
+ case kTypeArgumentsCid:
return kWord;
case kOneByteStringCid:
case kExternalOneByteStringCid:
@@ -1597,11 +1598,11 @@
// InstructionPattern::DecodeLoadWordFromPool can decode.
//
// Note: the function never clobbers TMP, TMP2 scratch registers.
- void LoadWordFromPoolOffset(Register dst, uint32_t offset, Register pp = PP);
+ void LoadWordFromPoolIndex(Register dst, intptr_t index, Register pp = PP);
- void LoadDoubleWordFromPoolOffset(Register lower,
- Register upper,
- uint32_t offset);
+ void LoadDoubleWordFromPoolIndex(Register lower,
+ Register upper,
+ intptr_t index);
void PushObject(const Object& object) {
if (IsSameObject(compiler::NullObject(), object)) {
@@ -1839,7 +1840,7 @@
bool constant_pool_allowed_;
- void LoadWordFromPoolOffsetFixed(Register dst, uint32_t offset);
+ void LoadWordFromPoolIndexFixed(Register dst, intptr_t index);
// Note: the function never clobbers TMP, TMP2 scratch registers.
void LoadObjectHelper(Register dst, const Object& obj, bool is_unique);
diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc
index b84015a..0a833cf 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64.cc
@@ -48,9 +48,9 @@
Register dst,
const ExternalLabel* label,
ObjectPoolBuilderEntry::Patchability patchable) {
- const int32_t offset = target::ObjectPool::element_offset(
- object_pool_builder().FindNativeFunction(label, patchable));
- LoadWordFromPoolOffset(dst, offset - kHeapObjectTag);
+ const intptr_t index =
+ object_pool_builder().FindNativeFunction(label, patchable);
+ LoadWordFromPoolIndex(dst, index);
}
void Assembler::call(const ExternalLabel* label) {
@@ -67,8 +67,7 @@
ASSERT(constant_pool_allowed());
const intptr_t idx = object_pool_builder().AddObject(
ToObject(target), ObjectPoolBuilderEntry::kPatchable);
- const int32_t offset = target::ObjectPool::element_offset(idx);
- LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag);
+ LoadWordFromPoolIndex(CODE_REG, idx);
call(FieldAddress(CODE_REG, target::Code::entry_point_offset(entry_kind)));
}
@@ -78,8 +77,7 @@
ASSERT(constant_pool_allowed());
const intptr_t idx =
object_pool_builder().FindObject(ToObject(target), equivalence);
- const int32_t offset = target::ObjectPool::element_offset(idx);
- LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag);
+ LoadWordFromPoolIndex(CODE_REG, idx);
call(FieldAddress(CODE_REG, target::Code::entry_point_offset(entry_kind)));
}
@@ -87,8 +85,7 @@
ASSERT(constant_pool_allowed());
const intptr_t idx = object_pool_builder().FindObject(
ToObject(target), ObjectPoolBuilderEntry::kNotPatchable);
- const int32_t offset = target::ObjectPool::element_offset(idx);
- LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag);
+ LoadWordFromPoolIndex(CODE_REG, idx);
call(FieldAddress(CODE_REG, target::Code::entry_point_offset()));
}
@@ -1210,9 +1207,12 @@
return true;
}
-void Assembler::LoadWordFromPoolOffset(Register dst, int32_t offset) {
+void Assembler::LoadWordFromPoolIndex(Register dst, intptr_t idx) {
ASSERT(constant_pool_allowed());
ASSERT(dst != PP);
+ // PP is tagged on X64.
+ const int32_t offset =
+ target::ObjectPool::element_offset(idx) - kHeapObjectTag;
// This sequence must be decodable by code_patcher_x64.cc.
movq(dst, Address(PP, offset));
}
@@ -1239,10 +1239,9 @@
}
}
if (CanLoadFromObjectPool(object)) {
- const int32_t offset = target::ObjectPool::element_offset(
- is_unique ? object_pool_builder().AddObject(object)
- : object_pool_builder().FindObject(object));
- LoadWordFromPoolOffset(dst, offset - kHeapObjectTag);
+ const intptr_t index = is_unique ? object_pool_builder().AddObject(object)
+ : object_pool_builder().FindObject(object);
+ LoadWordFromPoolIndex(dst, index);
return;
}
ASSERT(target::IsSmi(object));
@@ -1315,9 +1314,8 @@
} else if (imm.is_int32() || !constant_pool_allowed()) {
movq(reg, imm);
} else {
- int32_t offset =
- target::ObjectPool::element_offset(FindImmediate(imm.value()));
- LoadWordFromPoolOffset(reg, offset - kHeapObjectTag);
+ const intptr_t idx = FindImmediate(imm.value());
+ LoadWordFromPoolIndex(reg, idx);
}
}
diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h
index 5667c65..19bf03f 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.h
+++ b/runtime/vm/compiler/assembler/assembler_x64.h
@@ -1033,7 +1033,7 @@
intptr_t FindImmediate(int64_t imm);
bool CanLoadFromObjectPool(const Object& object) const;
void LoadObjectHelper(Register dst, const Object& obj, bool is_unique);
- void LoadWordFromPoolOffset(Register dst, int32_t offset);
+ void LoadWordFromPoolIndex(Register dst, intptr_t index);
void AluL(uint8_t modrm_opcode, Register dst, const Immediate& imm);
void AluB(uint8_t modrm_opcode, const Address& dst, const Immediate& imm);
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index fc4cfbf..4cc16cf 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -1056,10 +1056,13 @@
InstantiateTypeArgumentsInstr* instr) {
const auto& type_arguments_obj =
instr->type_arguments()->definition()->constant_value();
- ASSERT(!type_arguments_obj.IsNull());
if (IsUnknown(type_arguments_obj)) {
return;
}
+ if (type_arguments_obj.IsNull()) {
+ SetValue(instr, type_arguments_obj);
+ return;
+ }
if (!type_arguments_obj.IsTypeArguments()) {
SetValue(instr, non_constant_);
return;
@@ -1078,14 +1081,13 @@
if (IsUnknown(instantiator_type_args_obj)) {
return;
}
- if (!instantiator_type_args_obj.IsTypeArguments()) {
+ if (!instantiator_type_args_obj.IsNull() &&
+ !instantiator_type_args_obj.IsTypeArguments()) {
SetValue(instr, non_constant_);
return;
}
instantiator_type_args ^= instantiator_type_args_obj.raw();
- ASSERT(!instr->instantiator_class().IsNull());
- if (type_arguments.CanShareInstantiatorTypeArguments(
- instr->instantiator_class())) {
+ if (instr->CanShareInstantiatorTypeArguments()) {
SetValue(instr, instantiator_type_args);
return;
}
@@ -1098,13 +1100,13 @@
if (IsUnknown(function_type_args_obj)) {
return;
}
- if (!function_type_args_obj.IsTypeArguments()) {
+ if (!function_type_args_obj.IsNull() &&
+ !function_type_args_obj.IsTypeArguments()) {
SetValue(instr, non_constant_);
return;
}
function_type_args ^= function_type_args_obj.raw();
- ASSERT(!instr->function().IsNull());
- if (type_arguments.CanShareFunctionTypeArguments(instr->function())) {
+ if (instr->CanShareFunctionTypeArguments()) {
SetValue(instr, function_type_args);
return;
}
@@ -1424,6 +1426,11 @@
SetValue(instr, non_constant_);
}
+void ConstantPropagator::VisitBoxUint8(BoxUint8Instr* instr) {
+ // TODO(kmillikin): Handle box operation.
+ SetValue(instr, non_constant_);
+}
+
void ConstantPropagator::VisitBoxUint32(BoxUint32Instr* instr) {
// TODO(kmillikin): Handle box operation.
SetValue(instr, non_constant_);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index 6a01f8a..2290612 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -2303,29 +2303,178 @@
: kTestTypeSixArgs;
}
-void FlowGraphCompiler::GenerateAssertAssignableViaTypeTestingStub(
+#if !defined(TARGET_ARCH_IA32)
+// Generates an assignable check for a given object. Emits no code if the
+// destination type is known at compile time and is a top type. See
+// GenerateCallerChecksForAssertAssignable for other optimized cases.
+//
+// Inputs (preserved for successful checks):
+// - TypeTestABI::kInstanceReg: object.
+// - TypeTestABI::kDstTypeReg: destination type (if non-constant).
+// - TypeTestABI::kInstantiatorTypeArgumentsReg: instantiator type arguments.
+// - TypeTestABI::kFunctionTypeArgumentsReg: function type arguments.
+//
+// Throws:
+// - TypeError (on unsuccessful assignable checks)
+//
+// Performance notes: positive checks must be quick, negative checks can be slow
+// as they throw an exception.
+void FlowGraphCompiler::GenerateAssertAssignable(CompileType* receiver_type,
+ TokenPosition token_pos,
+ intptr_t deopt_id,
+ const String& dst_name,
+ LocationSummary* locs) {
+ ASSERT(!token_pos.IsClassifying());
+ ASSERT(CheckAssertAssignableTypeTestingABILocations(*locs));
+
+ if (!locs->in(1).IsConstant()) {
+ // TODO(dartbug.com/40813): Handle setting up the non-constant case.
+ UNREACHABLE();
+ }
+ const auto& dst_type = AbstractType::Cast(locs->in(1).constant());
+ ASSERT(dst_type.IsFinalized());
+
+ if (dst_type.IsTopTypeForSubtyping()) return; // No code needed.
+
+ compiler::Label done;
+
+ GenerateCallerChecksForAssertAssignable(receiver_type, dst_type, &done);
+
+ GenerateTTSCall(token_pos, deopt_id,
+ dst_type.IsTypeParameter() ? TypeTestABI::kScratchReg
+ : TypeTestABI::kDstTypeReg,
+ dst_type, dst_name, locs);
+ __ Bind(&done);
+}
+
+// Generates a call to the type testing stub for the type in [reg_with_type].
+// Provide a non-null [dst_type] and [dst_name] if they are known at compile
+// time.
+void FlowGraphCompiler::GenerateTTSCall(TokenPosition token_pos,
+ intptr_t deopt_id,
+ Register reg_with_type,
+ const AbstractType& dst_type,
+ const String& dst_name,
+ LocationSummary* locs) {
+ // For now, we don't allow dynamic (non-compile-time) dst_type/dst_name.
+ ASSERT(!dst_type.IsNull() && !dst_name.IsNull());
+ // We use 2 consecutive entries in the pool for the subtype cache and the
+ // destination name. The second entry, namely [dst_name] seems to be unused,
+ // but it will be used by the code throwing a TypeError if the type test fails
+ // (see runtime/vm/runtime_entry.cc:TypeCheck). It will use pattern matching
+ // on the call site to find out at which pool index the destination name is
+ // located.
+ const intptr_t sub_type_cache_index = __ object_pool_builder().AddObject(
+ Object::null_object(), compiler::ObjectPoolBuilderEntry::kPatchable);
+ const intptr_t dst_name_index = __ object_pool_builder().AddObject(
+ dst_name, compiler::ObjectPoolBuilderEntry::kPatchable);
+ ASSERT((sub_type_cache_index + 1) == dst_name_index);
+ ASSERT(__ constant_pool_allowed());
+
+ // If the dst_type is known at compile time and instantiated, we know the
+ // target TTS stub and so can use a PC-relative call when available.
+ if (dst_type.IsInstantiated() && CanPcRelativeCall(dst_type)) {
+ __ LoadWordFromPoolIndex(TypeTestABI::kSubtypeTestCacheReg,
+ sub_type_cache_index);
+ __ GenerateUnRelocatedPcRelativeCall();
+ AddPcRelativeTTSCallTypeTarget(dst_type);
+ } else {
+ GenerateIndirectTTSCall(reg_with_type, sub_type_cache_index);
+ }
+ EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kOther, locs);
+}
+
+// Optimize assignable type check by adding inlined tests for:
+// - non-null object -> return object (only if in null safe mode and type is
+// non-nullable Object).
+// - Smi -> compile time subtype check (only if dst class is not parameterized).
+// - Class equality (only if class is not parameterized).
+//
+// Inputs (preserved):
+// - TypeTestABI::kInstanceReg: object.
+// - TypeTestABI::kInstantiatorTypeArgumentsReg: instantiator type arguments.
+// - TypeTestABI::kFunctionTypeArgumentsReg: function type arguments.
+//
+// Assumes:
+// - Destination type is not a top type.
+// - Object to check is not null, unless in null safe mode and destination type
+// is not a nullable type.
+//
+// Outputs:
+// - TypeTestABI::kDstTypeReg: destination type
+// Additional output if dst_type is a TypeParameter:
+// - TypeTestABI::kScratchReg: type on which to call TTS stub.
+//
+// Performance notes: positive checks must be quick, negative checks can be slow
+// as they throw an exception.
+void FlowGraphCompiler::GenerateCallerChecksForAssertAssignable(
CompileType* receiver_type,
const AbstractType& dst_type,
- const String& dst_name,
- const Register dst_type_reg_to_call,
- const Register scratch_reg,
compiler::Label* done) {
-#if defined(TARGET_ARCH_IA32)
- // ia32 does not have support for TypeTestingStubs.
- UNREACHABLE();
-#else
- TypeUsageInfo* type_usage_info = thread()->type_usage_info();
-
- // Special case: non-nullable Object.
// Top types should be handled by the caller and cannot reach here.
ASSERT(!dst_type.IsTopTypeForSubtyping());
+
+ // Set this to avoid marking the type testing stub for optimization.
+ bool elide_info = false;
+ // Call before any return points to set the destination type register and
+ // mark the destination type TTS as needing optimization, unless it is
+ // unlikely to be called.
+ auto output_dst_type = [&]() -> void {
+ // If we haven't handled the positive case of the type check on the call
+ // site and we'll be using the TTS of the destination type, we want an
+ // optimized type testing stub and thus record it in the [TypeUsageInfo].
+ if (!elide_info) {
+ if (auto const type_usage_info = thread()->type_usage_info()) {
+ type_usage_info->UseTypeInAssertAssignable(dst_type);
+ } else {
+ ASSERT(!FLAG_precompiled_mode);
+ }
+ }
+ __ LoadObject(TypeTestABI::kDstTypeReg, dst_type);
+ };
+
+ // We can handle certain types and checks very efficiently on the call site,
+ // meaning those need not be checked within the stubs (which may involve
+ // a runtime call).
+
if (dst_type.IsObjectType()) {
+ // Special case: non-nullable Object.
ASSERT(dst_type.IsNonNullable() && isolate()->null_safety());
__ CompareObject(TypeTestABI::kInstanceReg, Object::null_object());
__ BranchIf(NOT_EQUAL, done);
- // Fall back to type testing stub.
- __ LoadObject(TypeTestABI::kDstTypeReg, dst_type);
- return;
+ // Fall back to type testing stub in caller to throw the exception.
+ return output_dst_type();
+ }
+
+ if (dst_type.IsTypeParameter()) {
+ // Special case: Instantiate the type parameter on the caller side, invoking
+ // the TTS of the corresponding type parameter in the caller.
+ const TypeParameter& type_param = TypeParameter::Cast(dst_type);
+ if (isolate()->null_safety() && !type_param.IsNonNullable()) {
+ // If the type parameter is nullable when running in strong mode, we need
+ // to handle null before calling the TTS because the type parameter may be
+ // instantiated with a non-nullable type, where the TTS rejects null.
+ __ CompareObject(TypeTestABI::kInstanceReg, Object::null_object());
+ __ BranchIf(EQUAL, done);
+ }
+ const Register kTypeArgumentsReg =
+ type_param.IsClassTypeParameter()
+ ? TypeTestABI::kInstantiatorTypeArgumentsReg
+ : TypeTestABI::kFunctionTypeArgumentsReg;
+
+ // Check if type arguments are null, i.e. equivalent to vector of dynamic.
+ // If so, then the value is guaranteed assignable as dynamic is a top type.
+ __ CompareObject(kTypeArgumentsReg, Object::null_object());
+ __ BranchIf(EQUAL, done);
+ // Put the instantiated type parameter into the scratch register, so its
+ // TTS can be called by the caller.
+ __ LoadField(
+ TypeTestABI::kScratchReg,
+ compiler::FieldAddress(kTypeArgumentsReg,
+ compiler::target::TypeArguments::type_at_offset(
+ type_param.index())));
+ elide_info = true;
+ return output_dst_type();
}
// If the int type is assignable to [dst_type] we special case it on the
@@ -2339,93 +2488,34 @@
is_non_smi = true;
}
- // We use two type registers iff the dst type is a type parameter.
- // We "dereference" the type parameter for the TTS call but leave the type
- // parameter in the TypeTestABI::kDstTypeReg for fallback into
- // SubtypeTestCache.
- ASSERT(dst_type_reg_to_call == kNoRegister ||
- (dst_type.IsTypeParameter() ==
- (TypeTestABI::kDstTypeReg != dst_type_reg_to_call)));
+ if (auto const hi = thread()->hierarchy_info()) {
+ const Class& type_class = Class::Handle(zone(), dst_type.type_class());
- // We can handle certain types very efficiently on the call site (with a
- // bailout to the normal stub, which will do a runtime call).
- if (dst_type.IsTypeParameter()) {
- // In NNBD strong mode we need to handle null instance before calling TTS
- // if type parameter is nullable or legacy because type parameter can be
- // instantiated with a non-nullable type which rejects null.
- // In NNBD weak mode or if type parameter is non-nullable or has
- // undetermined nullability null instance is correctly handled by TTS.
- if (isolate()->null_safety() &&
- (dst_type.IsNullable() || dst_type.IsLegacy())) {
- __ CompareObject(TypeTestABI::kInstanceReg, Object::null_object());
- __ BranchIf(EQUAL, done);
- }
- const TypeParameter& type_param = TypeParameter::Cast(dst_type);
- const Register kTypeArgumentsReg =
- type_param.IsClassTypeParameter()
- ? TypeTestABI::kInstantiatorTypeArgumentsReg
- : TypeTestABI::kFunctionTypeArgumentsReg;
-
- // Check if type arguments are null, i.e. equivalent to vector of dynamic.
- __ CompareObject(kTypeArgumentsReg, Object::null_object());
- __ BranchIf(EQUAL, done);
- __ LoadField(
- dst_type_reg_to_call,
- compiler::FieldAddress(kTypeArgumentsReg,
- compiler::target::TypeArguments::type_at_offset(
- type_param.index())));
- __ LoadObject(TypeTestABI::kDstTypeReg, type_param);
- if (type_usage_info != NULL) {
- type_usage_info->UseTypeInAssertAssignable(dst_type);
- }
- } else {
- HierarchyInfo* hi = Thread::Current()->hierarchy_info();
- if (hi != NULL) {
- const Class& type_class = Class::Handle(zone(), dst_type.type_class());
-
- bool check_handled_at_callsite = false;
- bool used_cid_range_check = false;
- const bool can_use_simple_cid_range_test =
- hi->CanUseSubtypeRangeCheckFor(dst_type);
- if (can_use_simple_cid_range_test) {
- const CidRangeVector& ranges = hi->SubtypeRangesForClass(
- type_class,
- /*include_abstract=*/false,
- /*exclude_null=*/!Instance::NullIsAssignableTo(dst_type));
- if (ranges.length() <= kMaxNumberOfCidRangesToTest) {
- if (is_non_smi) {
- __ LoadClassId(scratch_reg, TypeTestABI::kInstanceReg);
- } else {
- __ LoadClassIdMayBeSmi(scratch_reg, TypeTestABI::kInstanceReg);
- }
- GenerateCidRangesCheck(assembler(), scratch_reg, ranges, done);
- used_cid_range_check = true;
- check_handled_at_callsite = true;
- }
- }
-
- if (!used_cid_range_check && can_use_simple_cid_range_test &&
- IsListClass(type_class)) {
- __ LoadClassIdMayBeSmi(scratch_reg, TypeTestABI::kInstanceReg);
- GenerateListTypeCheck(scratch_reg, done);
- used_cid_range_check = true;
- }
-
- // If we haven't handled the positive case of the type check on the
- // call-site, we want an optimized type testing stub and therefore record
- // it in the [TypeUsageInfo].
- if (!check_handled_at_callsite) {
- if (type_usage_info != NULL) {
- type_usage_info->UseTypeInAssertAssignable(dst_type);
+ if (hi->CanUseSubtypeRangeCheckFor(dst_type)) {
+ const CidRangeVector& ranges = hi->SubtypeRangesForClass(
+ type_class,
+ /*include_abstract=*/false,
+ /*exclude_null=*/!Instance::NullIsAssignableTo(dst_type));
+ if (ranges.length() <= kMaxNumberOfCidRangesToTest) {
+ if (is_non_smi) {
+ __ LoadClassId(TypeTestABI::kScratchReg, TypeTestABI::kInstanceReg);
} else {
- ASSERT(!FLAG_precompiled_mode);
+ __ LoadClassIdMayBeSmi(TypeTestABI::kScratchReg,
+ TypeTestABI::kInstanceReg);
}
+ GenerateCidRangesCheck(assembler(), TypeTestABI::kScratchReg, ranges,
+ done);
+ elide_info = true;
+ } else if (IsListClass(type_class)) {
+ __ LoadClassIdMayBeSmi(TypeTestABI::kScratchReg,
+ TypeTestABI::kInstanceReg);
+ GenerateListTypeCheck(TypeTestABI::kScratchReg, done);
}
}
- __ LoadObject(TypeTestABI::kDstTypeReg, dst_type);
}
-#endif // defined(TARGET_ARCH_IA32)
+ output_dst_type();
}
+#endif // !defined(TARGET_ARCH_IA32)
#undef __
@@ -2470,14 +2560,16 @@
rep = kTagged;
}
ASSERT(!is_optimizing());
- ASSERT((rep == kTagged) || (rep == kUntagged) || (rep == kUnboxedUint32));
+ ASSERT((rep == kTagged) || (rep == kUntagged) || (rep == kUnboxedUint32) ||
+ (rep == kUnboxedUint8));
ASSERT(rep != kUntagged || flow_graph_.IsIrregexpFunction());
const auto& function = flow_graph_.parsed_function().function();
- // Currently, we only allow unboxed uint32 on the stack in unoptimized code
- // when building a dynamic closure call dispatcher, where any unboxed values
- // on the stack are consumed before possible FrameStateIsSafeToCall() checks.
+ // Currently, we only allow unboxed uint8 and uint32 on the stack in
+ // unoptimized code when building a dynamic closure call dispatcher, where
+ // any unboxed values on the stack are consumed before possible
+ // FrameStateIsSafeToCall() checks.
// See FlowGraphBuilder::BuildDynamicCallVarsInit().
- ASSERT(rep != kUnboxedUint32 ||
+ ASSERT((rep != kUnboxedUint32 && rep != kUnboxedUint8) ||
function.IsDynamicClosureCallDispatcher(thread()));
frame_state_.Add(rep);
}
@@ -2512,8 +2604,11 @@
}
const bool use_shared_stub =
instruction()->UseSharedSlowPathStub(compiler->is_optimizing());
+ ASSERT(use_shared_stub == instruction()->locs()->call_on_shared_slow_path());
const bool live_fpu_registers =
instruction()->locs()->live_registers()->FpuRegisterCount() > 0;
+ const intptr_t num_args =
+ use_shared_stub ? 0 : GetNumberOfArgumentsForRuntimeCall();
__ Bind(entry_label());
EmitCodeAtSlowPathEntry(compiler);
LocationSummary* locs = instruction()->locs();
@@ -2522,26 +2617,19 @@
EmitSharedStubCall(compiler, live_fpu_registers);
} else {
compiler->SaveLiveRegisters(locs);
- intptr_t i = 0;
- if (num_args_ % 2 != 0) {
- __ PushRegister(locs->in(i).reg());
- ++i;
- }
- for (; i < num_args_; i += 2) {
- __ PushRegisterPair(locs->in(i + 1).reg(), locs->in(i).reg());
- }
- __ CallRuntime(runtime_entry_, num_args_);
+ PushArgumentsForRuntimeCall(compiler);
+ __ CallRuntime(runtime_entry_, num_args);
}
const intptr_t deopt_id = instruction()->deopt_id();
compiler->AddDescriptor(PcDescriptorsLayout::kOther,
compiler->assembler()->CodeSize(), deopt_id,
instruction()->token_pos(), try_index_);
AddMetadataForRuntimeCall(compiler);
- compiler->RecordSafepoint(locs, num_args_);
+ compiler->RecordSafepoint(locs, num_args);
if ((try_index_ != kInvalidTryIndex) ||
(compiler->CurrentTryIndex() != kInvalidTryIndex)) {
Environment* env =
- compiler->SlowPathEnvironmentFor(instruction(), num_args_);
+ compiler->SlowPathEnvironmentFor(instruction(), num_args);
if (FLAG_precompiled_mode) {
compiler->RecordCatchEntryMoves(env, try_index_);
} else if (env != nullptr) {
@@ -2611,6 +2699,42 @@
#endif
}
+void RangeErrorSlowPath::PushArgumentsForRuntimeCall(
+ FlowGraphCompiler* compiler) {
+ LocationSummary* locs = instruction()->locs();
+ __ PushRegisterPair(locs->in(CheckBoundBase::kIndexPos).reg(),
+ locs->in(CheckBoundBase::kLengthPos).reg());
+}
+
+void LateInitializationErrorSlowPath::PushArgumentsForRuntimeCall(
+ FlowGraphCompiler* compiler) {
+ const Field& original_field = Field::ZoneHandle(
+ instruction()->AsLoadField()->slot().field().Original());
+ __ PushObject(original_field);
+}
+
+void LateInitializationErrorSlowPath::EmitSharedStubCall(
+ FlowGraphCompiler* compiler,
+ bool save_fpu_registers) {
+#if defined(TARGET_ARCH_IA32)
+ UNREACHABLE();
+#else
+ ASSERT(instruction()->locs()->temp(0).reg() ==
+ LateInitializationErrorABI::kFieldReg);
+ const Field& original_field = Field::ZoneHandle(
+ instruction()->AsLoadField()->slot().field().Original());
+ __ LoadObject(LateInitializationErrorABI::kFieldReg, original_field);
+ auto object_store = compiler->isolate()->object_store();
+ const auto& stub = Code::ZoneHandle(
+ compiler->zone(),
+ save_fpu_registers
+ ? object_store->late_initialization_error_stub_with_fpu_regs_stub()
+ : object_store
+ ->late_initialization_error_stub_without_fpu_regs_stub());
+ compiler->EmitCallToStub(stub);
+#endif
+}
+
void FlowGraphCompiler::EmitNativeMove(
const compiler::ffi::NativeLocation& destination,
const compiler::ffi::NativeLocation& source,
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.h b/runtime/vm/compiler/backend/flow_graph_compiler.h
index cff19a26..1965d97 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.h
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.h
@@ -283,11 +283,9 @@
public:
ThrowErrorSlowPathCode(Instruction* instruction,
const RuntimeEntry& runtime_entry,
- intptr_t num_args,
intptr_t try_index)
: TemplateSlowPathCode(instruction),
runtime_entry_(runtime_entry),
- num_args_(num_args),
try_index_(try_index) {}
// This name appears in disassembly.
@@ -296,6 +294,10 @@
// Subclasses can override these methods to customize slow path code.
virtual void EmitCodeAtSlowPathEntry(FlowGraphCompiler* compiler) {}
virtual void AddMetadataForRuntimeCall(FlowGraphCompiler* compiler) {}
+ virtual void PushArgumentsForRuntimeCall(FlowGraphCompiler* compiler) {}
+
+ // Returns number of arguments for runtime call (if shared stub is not used).
+ virtual intptr_t GetNumberOfArgumentsForRuntimeCall() { return 0; }
virtual void EmitSharedStubCall(FlowGraphCompiler* compiler,
bool save_fpu_registers) {
@@ -306,18 +308,14 @@
private:
const RuntimeEntry& runtime_entry_;
- const intptr_t num_args_;
const intptr_t try_index_;
};
class NullErrorSlowPath : public ThrowErrorSlowPathCode {
public:
- static const intptr_t kNumberOfArguments = 0;
-
NullErrorSlowPath(CheckNullInstr* instruction, intptr_t try_index)
: ThrowErrorSlowPathCode(instruction,
GetRuntimeEntry(instruction->exception_type()),
- kNumberOfArguments,
try_index) {}
CheckNullInstr::ExceptionType exception_type() const {
@@ -345,16 +343,38 @@
class RangeErrorSlowPath : public ThrowErrorSlowPathCode {
public:
- static const intptr_t kNumberOfArguments = 0;
-
RangeErrorSlowPath(GenericCheckBoundInstr* instruction, intptr_t try_index)
: ThrowErrorSlowPathCode(instruction,
kRangeErrorRuntimeEntry,
- kNumberOfArguments,
try_index) {}
virtual const char* name() { return "check bound"; }
- virtual void EmitSharedStubCall(FlowGraphCompiler* compielr,
+ virtual intptr_t GetNumberOfArgumentsForRuntimeCall() {
+ return 2; // length and index
+ }
+
+ virtual void PushArgumentsForRuntimeCall(FlowGraphCompiler* compiler);
+
+ virtual void EmitSharedStubCall(FlowGraphCompiler* compiler,
+ bool save_fpu_registers);
+};
+
+class LateInitializationErrorSlowPath : public ThrowErrorSlowPathCode {
+ public:
+ LateInitializationErrorSlowPath(LoadFieldInstr* instruction,
+ intptr_t try_index)
+ : ThrowErrorSlowPathCode(instruction,
+ kLateInitializationErrorRuntimeEntry,
+ try_index) {}
+ virtual const char* name() { return "late initialization error"; }
+
+ virtual intptr_t GetNumberOfArgumentsForRuntimeCall() {
+ return 1; // field
+ }
+
+ virtual void PushArgumentsForRuntimeCall(FlowGraphCompiler* compiler);
+
+ virtual void EmitSharedStubCall(FlowGraphCompiler* compiler,
bool save_fpu_registers);
};
@@ -568,19 +588,21 @@
const String& dst_name,
LocationSummary* locs);
- void GenerateAssertAssignableViaTypeTestingStub(CompileType* receiver_type,
- TokenPosition token_pos,
- intptr_t deopt_id,
- const String& dst_name,
- LocationSummary* locs);
+#if !defined(TARGET_ARCH_IA32)
+ void GenerateCallerChecksForAssertAssignable(CompileType* receiver_type,
+ const AbstractType& dst_type,
+ compiler::Label* done);
- void GenerateAssertAssignableViaTypeTestingStub(
- CompileType* receiver_type,
- const AbstractType& dst_type,
- const String& dst_name,
- const Register dst_type_reg_to_call,
- const Register scratch_reg,
- compiler::Label* done);
+ void GenerateTTSCall(TokenPosition token_pos,
+ intptr_t deopt_id,
+ Register reg_with_type,
+ const AbstractType& dst_type,
+ const String& dst_name,
+ LocationSummary* locs);
+
+ void GenerateIndirectTTSCall(Register reg_with_type,
+ intptr_t sub_type_cache_index);
+#endif
void GenerateRuntimeCall(TokenPosition token_pos,
intptr_t deopt_id,
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index 465352b..d1de64a 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -682,100 +682,16 @@
__ Drop(2);
}
-// Optimize assignable type check by adding inlined tests for:
-// - NULL -> return NULL.
-// - Smi -> compile time subtype check (only if dst class is not parameterized).
-// - Class equality (only if class is not parameterized).
-// Inputs:
-// - R0: instance being type checked.
-// - R8: destination type (if non-constant).
-// - R2: instantiator type arguments or raw_null.
-// - R1: function type arguments or raw_null.
-// Returns:
-// - object in R0 for successful assignable check (or throws TypeError).
-// Performance notes: positive checks must be quick, negative checks can be slow
-// as they throw an exception.
-void FlowGraphCompiler::GenerateAssertAssignable(CompileType* receiver_type,
- TokenPosition token_pos,
- intptr_t deopt_id,
- const String& dst_name,
- LocationSummary* locs) {
- ASSERT(!token_pos.IsClassifying());
- ASSERT(CheckAssertAssignableTypeTestingABILocations(*locs));
-
- if (locs->in(1).IsConstant()) {
- const auto& dst_type = AbstractType::Cast(locs->in(1).constant());
- ASSERT(dst_type.IsFinalized());
-
- if (dst_type.IsTopTypeForSubtyping()) return; // No code needed.
-
- GenerateAssertAssignableViaTypeTestingStub(receiver_type, token_pos,
- deopt_id, dst_name, locs);
- return;
- } else {
- // TODO(dartbug.com/40813): Handle setting up the non-constant case.
- UNREACHABLE();
- }
-}
-
-void FlowGraphCompiler::GenerateAssertAssignableViaTypeTestingStub(
- CompileType* receiver_type,
- TokenPosition token_pos,
- intptr_t deopt_id,
- const String& dst_name,
- LocationSummary* locs) {
- ASSERT(CheckAssertAssignableTypeTestingABILocations(*locs));
- // We must have a constant dst_type for generating a call to the stub.
- ASSERT(locs->in(1).IsConstant());
- const auto& dst_type = AbstractType::Cast(locs->in(1).constant());
-
- // If the dst_type is instantiated we know the target TTS stub at
- // compile-time and can therefore use a pc-relative call.
- const bool use_pc_relative_call =
- dst_type.IsInstantiated() && CanPcRelativeCall(dst_type);
-
- const Register kRegToCall =
- use_pc_relative_call
- ? kNoRegister
- : (dst_type.IsTypeParameter() ? R9 : TypeTestABI::kDstTypeReg);
- const Register kScratchReg = R4;
-
- compiler::Label done;
-
- GenerateAssertAssignableViaTypeTestingStub(receiver_type, dst_type, dst_name,
- kRegToCall, kScratchReg, &done);
-
- // We use 2 consecutive entries in the pool for the subtype cache and the
- // destination name. The second entry, namely [dst_name] seems to be unused,
- // but it will be used by the code throwing a TypeError if the type test fails
- // (see runtime/vm/runtime_entry.cc:TypeCheck). It will use pattern matching
- // on the call site to find out at which pool index the destination name is
- // located.
- const intptr_t sub_type_cache_index = __ object_pool_builder().AddObject(
- Object::null_object(), ObjectPool::Patchability::kPatchable);
- const intptr_t sub_type_cache_offset =
- compiler::target::ObjectPool::element_offset(sub_type_cache_index) -
- kHeapObjectTag;
- const intptr_t dst_name_index = __ object_pool_builder().AddObject(
- dst_name, ObjectPool::Patchability::kPatchable);
- ASSERT((sub_type_cache_index + 1) == dst_name_index);
- ASSERT(__ constant_pool_allowed());
-
- if (use_pc_relative_call) {
- __ LoadWordFromPoolOffset(TypeTestABI::kSubtypeTestCacheReg,
- sub_type_cache_offset, PP);
- __ GenerateUnRelocatedPcRelativeCall();
- AddPcRelativeTTSCallTypeTarget(dst_type);
- } else {
- __ LoadField(R9, compiler::FieldAddress(
- kRegToCall, compiler::target::AbstractType::
- type_test_stub_entry_point_offset()));
- __ LoadWordFromPoolOffset(TypeTestABI::kSubtypeTestCacheReg,
- sub_type_cache_offset, PP);
- __ blx(R9);
- }
- EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kOther, locs);
- __ Bind(&done);
+void FlowGraphCompiler::GenerateIndirectTTSCall(Register reg_to_call,
+ intptr_t sub_type_cache_index) {
+ __ LoadField(
+ R9,
+ compiler::FieldAddress(
+ reg_to_call,
+ compiler::target::AbstractType::type_test_stub_entry_point_offset()));
+ __ LoadWordFromPoolIndex(TypeTestABI::kSubtypeTestCacheReg,
+ sub_type_cache_index);
+ __ blx(R9);
}
void FlowGraphCompiler::EmitInstructionEpilogue(Instruction* instr) {
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index bc6983e..4ed5b4a 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -648,99 +648,16 @@
__ Drop(2);
}
-// Optimize assignable type check by adding inlined tests for:
-// - NULL -> return NULL.
-// - Smi -> compile time subtype check (only if dst class is not parameterized).
-// - Class equality (only if class is not parameterized).
-// Inputs:
-// - R0: instance being type checked.
-// - R8: destination type (if non-constant).
-// - R2: instantiator type arguments or raw_null.
-// - R1: function type arguments or raw_null.
-// Returns:
-// - object in R0 for successful assignable check (or throws TypeError).
-// Performance notes: positive checks must be quick, negative checks can be slow
-// as they throw an exception.
-void FlowGraphCompiler::GenerateAssertAssignable(CompileType* receiver_type,
- TokenPosition token_pos,
- intptr_t deopt_id,
- const String& dst_name,
- LocationSummary* locs) {
- ASSERT(!TokenPosition(token_pos).IsClassifying());
- ASSERT(CheckAssertAssignableTypeTestingABILocations(*locs));
-
- if (locs->in(1).IsConstant()) {
- const auto& dst_type = AbstractType::Cast(locs->in(1).constant());
- ASSERT(dst_type.IsFinalized());
-
- if (dst_type.IsTopTypeForSubtyping()) return; // No code needed.
-
- GenerateAssertAssignableViaTypeTestingStub(receiver_type, token_pos,
- deopt_id, dst_name, locs);
- return;
- } else {
- // TODO(dartbug.com/40813): Handle setting up the non-constant case.
- UNREACHABLE();
- }
-}
-
-void FlowGraphCompiler::GenerateAssertAssignableViaTypeTestingStub(
- CompileType* receiver_type,
- TokenPosition token_pos,
- intptr_t deopt_id,
- const String& dst_name,
- LocationSummary* locs) {
- ASSERT(CheckAssertAssignableTypeTestingABILocations(*locs));
- // We must have a constant dst_type for generating a call to the stub.
- ASSERT(locs->in(1).IsConstant());
- const auto& dst_type = AbstractType::Cast(locs->in(1).constant());
-
- // If the dst_type is instantiated we know the target TTS stub at
- // compile-time and can therefore use a pc-relative call.
- const bool use_pc_relative_call =
- dst_type.IsInstantiated() && CanPcRelativeCall(dst_type);
-
- const Register kRegToCall =
- use_pc_relative_call
- ? kNoRegister
- : (dst_type.IsTypeParameter() ? R9 : TypeTestABI::kDstTypeReg);
- const Register kScratchReg = R4;
-
- compiler::Label done;
-
- GenerateAssertAssignableViaTypeTestingStub(receiver_type, dst_type, dst_name,
- kRegToCall, kScratchReg, &done);
-
- // We use 2 consecutive entries in the pool for the subtype cache and the
- // destination name. The second entry, namely [dst_name] seems to be unused,
- // but it will be used by the code throwing a TypeError if the type test fails
- // (see runtime/vm/runtime_entry.cc:TypeCheck). It will use pattern matching
- // on the call site to find out at which pool index the destination name is
- // located.
- const intptr_t sub_type_cache_index = __ object_pool_builder().AddObject(
- Object::null_object(), ObjectPool::Patchability::kPatchable);
- const intptr_t sub_type_cache_offset =
- ObjectPool::element_offset(sub_type_cache_index);
- const intptr_t dst_name_index = __ object_pool_builder().AddObject(
- dst_name, ObjectPool::Patchability::kPatchable);
- ASSERT((sub_type_cache_index + 1) == dst_name_index);
- ASSERT(__ constant_pool_allowed());
-
- if (use_pc_relative_call) {
- __ LoadWordFromPoolOffset(TypeTestABI::kSubtypeTestCacheReg,
- sub_type_cache_offset);
- __ GenerateUnRelocatedPcRelativeCall();
- AddPcRelativeTTSCallTypeTarget(dst_type);
- } else {
- __ LoadField(
- R9, compiler::FieldAddress(
- kRegToCall, AbstractType::type_test_stub_entry_point_offset()));
- __ LoadWordFromPoolOffset(TypeTestABI::kSubtypeTestCacheReg,
- sub_type_cache_offset);
- __ blr(R9);
- }
- EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kOther, locs);
- __ Bind(&done);
+void FlowGraphCompiler::GenerateIndirectTTSCall(Register reg_to_call,
+ intptr_t sub_type_cache_index) {
+ __ LoadField(
+ R9,
+ compiler::FieldAddress(
+ reg_to_call,
+ compiler::target::AbstractType::type_test_stub_entry_point_offset()));
+ __ LoadWordFromPoolIndex(TypeTestABI::kSubtypeTestCacheReg,
+ sub_type_cache_index);
+ __ blr(R9);
}
void FlowGraphCompiler::EmitInstructionEpilogue(Instruction* instr) {
@@ -1027,8 +944,7 @@
const intptr_t stub_index =
op.AddObject(stub, ObjectPool::Patchability::kPatchable);
ASSERT((ic_data_index + 1) == stub_index);
- __ LoadDoubleWordFromPoolOffset(R5, CODE_REG,
- ObjectPool::element_offset(ic_data_index));
+ __ LoadDoubleWordFromPoolIndex(R5, CODE_REG, ic_data_index);
const intptr_t entry_point_offset =
entry_kind == Code::EntryKind::kNormal
? Code::entry_point_offset(Code::EntryKind::kMonomorphic)
@@ -1068,11 +984,9 @@
if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
// The AOT runtime will replace the slot in the object pool with the
// entrypoint address - see clustered_snapshot.cc.
- __ LoadDoubleWordFromPoolOffset(R5, LR,
- ObjectPool::element_offset(data_index));
+ __ LoadDoubleWordFromPoolIndex(R5, LR, data_index);
} else {
- __ LoadDoubleWordFromPoolOffset(R5, CODE_REG,
- ObjectPool::element_offset(data_index));
+ __ LoadDoubleWordFromPoolIndex(R5, CODE_REG, data_index);
__ ldr(LR, compiler::FieldAddress(
CODE_REG,
Code::entry_point_offset(Code::EntryKind::kMonomorphic)));
@@ -1139,11 +1053,9 @@
if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
// The AOT runtime will replace the slot in the object pool with the
// entrypoint address - see clustered_snapshot.cc.
- __ LoadDoubleWordFromPoolOffset(R5, LR,
- ObjectPool::element_offset(data_index));
+ __ LoadDoubleWordFromPoolIndex(R5, LR, data_index);
} else {
- __ LoadDoubleWordFromPoolOffset(R5, CODE_REG,
- ObjectPool::element_offset(data_index));
+ __ LoadDoubleWordFromPoolIndex(R5, CODE_REG, data_index);
const intptr_t entry_point_offset =
entry_kind == Code::EntryKind::kNormal
? compiler::target::Code::entry_point_offset(
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index 3f867c5..72a326f 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -663,93 +663,13 @@
__ Bind(&done);
}
-// Optimize assignable type check by adding inlined tests for:
-// - NULL -> return NULL.
-// - Smi -> compile time subtype check (only if dst class is not parameterized).
-// - Class equality (only if class is not parameterized).
-// Inputs:
-// - RAX: object.
-// - RBX: destination type (if non-constant).
-// - RDX: instantiator type arguments or raw_null.
-// - RCX: function type arguments or raw_null.
-// Returns:
-// - object in RAX for successful assignable check (or throws TypeError).
-// Performance notes: positive checks must be quick, negative checks can be slow
-// as they throw an exception.
-void FlowGraphCompiler::GenerateAssertAssignable(CompileType* receiver_type,
- TokenPosition token_pos,
- intptr_t deopt_id,
- const String& dst_name,
- LocationSummary* locs) {
- ASSERT(!token_pos.IsClassifying());
- ASSERT(CheckAssertAssignableTypeTestingABILocations(*locs));
-
- if (locs->in(1).IsConstant()) {
- const auto& dst_type = AbstractType::Cast(locs->in(1).constant());
- ASSERT(dst_type.IsFinalized());
-
- if (dst_type.IsTopTypeForSubtyping()) return; // No code needed.
-
- GenerateAssertAssignableViaTypeTestingStub(receiver_type, token_pos,
- deopt_id, dst_name, locs);
- return;
- } else {
- // TODO(dartbug.com/40813): Handle setting up the non-constant case.
- UNREACHABLE();
- }
-}
-
-void FlowGraphCompiler::GenerateAssertAssignableViaTypeTestingStub(
- CompileType* receiver_type,
- TokenPosition token_pos,
- intptr_t deopt_id,
- const String& dst_name,
- LocationSummary* locs) {
- ASSERT(CheckAssertAssignableTypeTestingABILocations(*locs));
- // We must have a constant dst_type for generating a call to the stub.
- ASSERT(locs->in(1).IsConstant());
- const auto& dst_type = AbstractType::Cast(locs->in(1).constant());
-
- // If the dst_type is instantiated we know the target TTS stub at
- // compile-time and can therefore use a pc-relative call.
- const bool use_pc_relative_call =
- dst_type.IsInstantiated() && CanPcRelativeCall(dst_type);
- const Register kScratchReg =
- dst_type.IsTypeParameter() ? RSI : TypeTestABI::kDstTypeReg;
-
- const Register kRegToCall = use_pc_relative_call ? kNoRegister : kScratchReg;
-
- compiler::Label done;
-
- GenerateAssertAssignableViaTypeTestingStub(receiver_type, dst_type, dst_name,
- kRegToCall, kScratchReg, &done);
-
- // We use 2 consecutive entries in the pool for the subtype cache and the
- // destination name. The second entry, namely [dst_name] seems to be unused,
- // but it will be used by the code throwing a TypeError if the type test fails
- // (see runtime/vm/runtime_entry.cc:TypeCheck). It will use pattern matching
- // on the call site to find out at which pool index the destination name is
- // located.
- const intptr_t sub_type_cache_index = __ object_pool_builder().AddObject(
- Object::null_object(), compiler::ObjectPoolBuilderEntry::kPatchable);
- const intptr_t sub_type_cache_offset =
- ObjectPool::element_offset(sub_type_cache_index) - kHeapObjectTag;
- const intptr_t dst_name_index = __ object_pool_builder().AddObject(
- dst_name, compiler::ObjectPoolBuilderEntry::kPatchable);
- ASSERT((sub_type_cache_index + 1) == dst_name_index);
- ASSERT(__ constant_pool_allowed());
-
- __ movq(TypeTestABI::kSubtypeTestCacheReg,
- compiler::Address(PP, sub_type_cache_offset));
- if (use_pc_relative_call) {
- __ GenerateUnRelocatedPcRelativeCall();
- AddPcRelativeTTSCallTypeTarget(dst_type);
- } else {
- __ call(compiler::FieldAddress(
- kRegToCall, AbstractType::type_test_stub_entry_point_offset()));
- }
- EmitCallsiteMetadata(token_pos, deopt_id, PcDescriptorsLayout::kOther, locs);
- __ Bind(&done);
+void FlowGraphCompiler::GenerateIndirectTTSCall(Register reg_to_call,
+ intptr_t sub_type_cache_index) {
+ __ LoadWordFromPoolIndex(TypeTestABI::kSubtypeTestCacheReg,
+ sub_type_cache_index);
+ __ Call(compiler::FieldAddress(
+ reg_to_call,
+ compiler::target::AbstractType::type_test_stub_entry_point_offset()));
}
void FlowGraphCompiler::EmitInstructionEpilogue(Instruction* instr) {
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index 93da803..43937b0 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -2719,6 +2719,7 @@
case Slot::Kind::kArgumentsDescriptor_positional_count:
case Slot::Kind::kArgumentsDescriptor_count:
case Slot::Kind::kArgumentsDescriptor_size:
+ case Slot::Kind::kArrayElement:
case Slot::Kind::kTypeArguments:
case Slot::Kind::kTypedDataView_offset_in_bytes:
case Slot::Kind::kTypedDataView_data:
@@ -2730,8 +2731,12 @@
case Slot::Kind::kClosure_function_type_arguments:
case Slot::Kind::kClosure_instantiator_type_arguments:
case Slot::Kind::kClosure_hash:
+ case Slot::Kind::kClosureData_default_type_arguments:
+ case Slot::Kind::kClosureData_default_type_arguments_info:
case Slot::Kind::kCapturedVariable:
case Slot::Kind::kDartField:
+ case Slot::Kind::kFunction_data:
+ case Slot::Kind::kFunction_kind_tag:
case Slot::Kind::kFunction_packed_fields:
case Slot::Kind::kFunction_parameter_names:
case Slot::Kind::kFunction_parameter_types:
@@ -2739,7 +2744,9 @@
case Slot::Kind::kPointerBase_data_field:
case Slot::Kind::kType_arguments:
case Slot::Kind::kTypeArgumentsIndex:
- case Slot::Kind::kArrayElement:
+ case Slot::Kind::kTypeParameter_bound:
+ case Slot::Kind::kTypeParameter_flags:
+ case Slot::Kind::kTypeParameter_name:
case Slot::Kind::kUnhandledException_exception:
case Slot::Kind::kUnhandledException_stacktrace:
return false;
@@ -2756,6 +2763,7 @@
switch (cid) {
case kArrayCid:
case kImmutableArrayCid:
+ case kTypeArgumentsCid:
return true;
default:
return false;
@@ -3779,6 +3787,9 @@
BoxInstr* BoxInstr::Create(Representation from, Value* value) {
switch (from) {
+ case kUnboxedUint8:
+ return new BoxUint8Instr(value);
+
case kUnboxedInt32:
return new BoxInt32Instr(value);
@@ -4310,6 +4321,18 @@
void LoadFieldInstr::EmitNativeCodeForInitializerCall(
FlowGraphCompiler* compiler) {
ASSERT(calls_initializer());
+
+ if (throw_exception_on_initialization()) {
+ ThrowErrorSlowPathCode* slow_path =
+ new LateInitializationErrorSlowPath(this, compiler->CurrentTryIndex());
+ compiler->AddSlowPathCode(slow_path);
+
+ const Register result_reg = locs()->out(0).reg();
+ __ CompareObject(result_reg, Object::sentinel());
+ __ BranchIf(EQUAL, slow_path->entry_label());
+ return;
+ }
+
ASSERT(locs()->in(0).reg() == InitInstanceFieldABI::kInstanceReg);
ASSERT(locs()->out(0).reg() == InitInstanceFieldABI::kResultReg);
ASSERT(slot().IsDartField());
@@ -5267,36 +5290,40 @@
LocationSummary* AssertSubtypeInstr::MakeLocationSummary(Zone* zone,
bool opt) const {
- if (!sub_type()->BindsToConstant() || !super_type()->BindsToConstant()) {
- // TODO(dartbug.com/40813): Handle setting up the non-constant case.
- UNREACHABLE();
- }
- const intptr_t kNumInputs = 4;
+ const intptr_t kNumInputs = 5;
const intptr_t kNumTemps = 0;
LocationSummary* summary = new (zone)
LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
- summary->set_in(0, Location::RegisterLocation(
- TypeTestABI::kInstantiatorTypeArgumentsReg));
+ summary->set_in(kInstantiatorTAVPos,
+ Location::RegisterLocation(
+ AssertSubtypeABI::kInstantiatorTypeArgumentsReg));
summary->set_in(
- 1, Location::RegisterLocation(TypeTestABI::kFunctionTypeArgumentsReg));
- summary->set_in(2,
- Location::Constant(sub_type()->definition()->AsConstant()));
- summary->set_in(3,
- Location::Constant(super_type()->definition()->AsConstant()));
+ kFunctionTAVPos,
+ Location::RegisterLocation(AssertSubtypeABI::kFunctionTypeArgumentsReg));
+ summary->set_in(kSubTypePos,
+ Location::RegisterLocation(AssertSubtypeABI::kSubTypeReg));
+ summary->set_in(kSuperTypePos,
+ Location::RegisterLocation(AssertSubtypeABI::kSuperTypeReg));
+ summary->set_in(kDstNamePos,
+ Location::RegisterLocation(AssertSubtypeABI::kDstNameReg));
return summary;
}
void AssertSubtypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
- __ PushRegister(locs()->in(0).reg());
- __ PushRegister(locs()->in(1).reg());
- __ PushObject(locs()->in(2).constant());
- __ PushObject(locs()->in(3).constant());
- __ PushObject(dst_name());
-
+#if defined(TARGET_ARCH_IA32)
+ __ PushRegister(AssertSubtypeABI::kInstantiatorTypeArgumentsReg);
+ __ PushRegister(AssertSubtypeABI::kFunctionTypeArgumentsReg);
+ __ PushRegister(AssertSubtypeABI::kSubTypeReg);
+ __ PushRegister(AssertSubtypeABI::kSuperTypeReg);
+ __ PushRegister(AssertSubtypeABI::kDstNameReg);
compiler->GenerateRuntimeCall(token_pos(), deopt_id(),
kSubtypeCheckRuntimeEntry, 5, locs());
__ Drop(5);
+#else
+ compiler->GenerateStubCall(token_pos(), StubCode::AssertSubtype(),
+ PcDescriptorsLayout::kOther, locs());
+#endif
}
LocationSummary* DeoptimizeInstr::MakeLocationSummary(Zone* zone,
@@ -5358,7 +5385,9 @@
const intptr_t kNumInputs = 2;
const intptr_t kNumTemps = 0;
LocationSummary* locs = new (zone) LocationSummary(
- zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSharedSlowPath);
+ zone, kNumInputs, kNumTemps,
+ UseSharedSlowPathStub(opt) ? LocationSummary::kCallOnSharedSlowPath
+ : LocationSummary::kCallOnSlowPath);
locs->set_in(kLengthPos,
Location::RegisterLocation(RangeErrorABI::kLengthReg));
locs->set_in(kIndexPos, Location::RegisterLocation(RangeErrorABI::kIndexReg));
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index a6b4115..6e4fe72 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -504,6 +504,7 @@
M(UnboxUint32, kNoGC) \
M(BoxInt32, _) \
M(UnboxInt32, kNoGC) \
+ M(BoxUint8, _) \
M(IntConverter, _) \
M(BitCast, _) \
M(Deoptimize, kNoGC) \
@@ -3549,34 +3550,42 @@
// Checks that one type is a subtype of another (e.g. for type parameter bounds
// checking). Throws a TypeError otherwise. Both types are instantiated at
// runtime as necessary.
-class AssertSubtypeInstr : public TemplateInstruction<4, Throws, Pure> {
+class AssertSubtypeInstr : public TemplateInstruction<5, Throws, Pure> {
public:
+ enum {
+ kInstantiatorTAVPos = 0,
+ kFunctionTAVPos = 1,
+ kSubTypePos = 2,
+ kSuperTypePos = 3,
+ kDstNamePos = 4,
+ };
+
AssertSubtypeInstr(TokenPosition token_pos,
Value* instantiator_type_arguments,
Value* function_type_arguments,
Value* sub_type,
Value* super_type,
- const String& dst_name,
+ Value* dst_name,
intptr_t deopt_id)
- : TemplateInstruction(deopt_id),
- token_pos_(token_pos),
- dst_name_(String::ZoneHandle(dst_name.raw())) {
- ASSERT(!dst_name.IsNull());
- SetInputAt(0, instantiator_type_arguments);
- SetInputAt(1, function_type_arguments);
- SetInputAt(2, sub_type);
- SetInputAt(3, super_type);
+ : TemplateInstruction(deopt_id), token_pos_(token_pos) {
+ SetInputAt(kInstantiatorTAVPos, instantiator_type_arguments);
+ SetInputAt(kFunctionTAVPos, function_type_arguments);
+ SetInputAt(kSubTypePos, sub_type);
+ SetInputAt(kSuperTypePos, super_type);
+ SetInputAt(kDstNamePos, dst_name);
}
DECLARE_INSTRUCTION(AssertSubtype);
- Value* instantiator_type_arguments() const { return inputs_[0]; }
- Value* function_type_arguments() const { return inputs_[1]; }
- Value* sub_type() const { return inputs_[2]; }
- Value* super_type() const { return inputs_[3]; }
+ Value* instantiator_type_arguments() const {
+ return inputs_[kInstantiatorTAVPos];
+ }
+ Value* function_type_arguments() const { return inputs_[kFunctionTAVPos]; }
+ Value* sub_type() const { return inputs_[kSubTypePos]; }
+ Value* super_type() const { return inputs_[kSuperTypePos]; }
+ Value* dst_name() const { return inputs_[kDstNamePos]; }
virtual TokenPosition token_pos() const { return token_pos_; }
- const String& dst_name() const { return dst_name_; }
virtual bool ComputeCanDeoptimize() const {
return !CompilerState::Current().is_aot();
@@ -3592,7 +3601,6 @@
private:
const TokenPosition token_pos_;
- const String& dst_name_;
DISALLOW_COPY_AND_ASSIGN(AssertSubtypeInstr);
};
@@ -6439,10 +6447,17 @@
: TemplateDefinition(deopt_id),
slot_(slot),
token_pos_(token_pos),
- calls_initializer_(calls_initializer) {
+ calls_initializer_(calls_initializer),
+ throw_exception_on_initialization_(false) {
ASSERT(!calls_initializer || (deopt_id != DeoptId::kNone));
ASSERT(!calls_initializer || slot.IsDartField());
SetInputAt(0, instance);
+ if (calls_initializer_) {
+ const Field& field = slot.field();
+ throw_exception_on_initialization_ = !field.needs_load_guard() &&
+ field.is_late() &&
+ !field.has_initializer();
+ }
}
Value* instance() const { return inputs_[0]; }
@@ -6453,6 +6468,15 @@
bool calls_initializer() const { return calls_initializer_; }
void set_calls_initializer(bool value) { calls_initializer_ = value; }
+ bool throw_exception_on_initialization() const {
+ return throw_exception_on_initialization_;
+ }
+
+ // Slow path is used if load throws exception on initialization.
+ virtual bool UseSharedSlowPathStub(bool is_optimizing) const {
+ return SlowPathSharingSupported(is_optimizing);
+ }
+
virtual Representation representation() const;
// Returns whether this instruction is an unboxed load from a _boxed_ Dart
@@ -6470,11 +6494,7 @@
virtual bool ComputeCanDeoptimize() const { return calls_initializer(); }
virtual bool HasUnknownSideEffects() const {
- if (calls_initializer()) {
- const Field& field = slot().field();
- return field.needs_load_guard() || field.has_initializer();
- }
- return false;
+ return calls_initializer() && !throw_exception_on_initialization();
}
virtual bool CanTriggerGC() const { return calls_initializer(); }
@@ -6522,6 +6542,7 @@
const Slot& slot_;
const TokenPosition token_pos_;
bool calls_initializer_;
+ bool throw_exception_on_initialization_;
DISALLOW_COPY_AND_ASSIGN(LoadFieldInstr);
};
@@ -6574,15 +6595,9 @@
token_pos_(token_pos),
instantiator_class_(instantiator_class),
function_(function) {
- // These asserts hold for current uses.
- ASSERT(type_arguments->BindsToConstant());
- // Note: Non-dynamic uses never provide a null TypeArguments value.
- ASSERT(!type_arguments->BoundConstant().IsNull());
- ASSERT(type_arguments->BoundConstant().IsTypeArguments());
- ASSERT(instantiator_class.IsZoneHandle());
- ASSERT(!instantiator_class.IsNull());
- ASSERT(function.IsZoneHandle());
- ASSERT(!function.IsNull());
+ ASSERT(instantiator_class.IsReadOnlyHandle() ||
+ instantiator_class.IsZoneHandle());
+ ASSERT(function.IsReadOnlyHandle() || function.IsZoneHandle());
SetInputAt(0, instantiator_type_arguments);
SetInputAt(1, function_type_arguments);
SetInputAt(2, type_arguments);
@@ -6605,20 +6620,35 @@
virtual Definition* Canonicalize(FlowGraph* flow_graph);
- const Code& GetStub() const {
- bool with_runtime_check;
- ASSERT(!instantiator_class().IsNull());
- ASSERT(!function().IsNull());
- ASSERT(type_arguments()->BindsToConstant());
- ASSERT(type_arguments()->BoundConstant().IsTypeArguments());
+ bool CanShareInstantiatorTypeArguments(
+ bool* with_runtime_check = nullptr) const {
+ if (instantiator_class().IsNull() || !type_arguments()->BindsToConstant() ||
+ !type_arguments()->BoundConstant().IsTypeArguments()) {
+ return false;
+ }
const auto& type_args =
TypeArguments::Cast(type_arguments()->BoundConstant());
- if (type_args.CanShareInstantiatorTypeArguments(instantiator_class(),
- &with_runtime_check)) {
+ return type_args.CanShareInstantiatorTypeArguments(instantiator_class(),
+ with_runtime_check);
+ }
+
+ bool CanShareFunctionTypeArguments(bool* with_runtime_check = nullptr) const {
+ if (function().IsNull() || !type_arguments()->BindsToConstant() ||
+ !type_arguments()->BoundConstant().IsTypeArguments()) {
+ return false;
+ }
+ const auto& type_args =
+ TypeArguments::Cast(type_arguments()->BoundConstant());
+ return type_args.CanShareFunctionTypeArguments(function(),
+ with_runtime_check);
+ }
+
+ const Code& GetStub() const {
+ bool with_runtime_check;
+ if (CanShareInstantiatorTypeArguments(&with_runtime_check)) {
ASSERT(with_runtime_check);
return StubCode::InstantiateTypeArgumentsMayShareInstantiatorTA();
- } else if (type_args.CanShareFunctionTypeArguments(function(),
- &with_runtime_check)) {
+ } else if (CanShareFunctionTypeArguments(&with_runtime_check)) {
ASSERT(with_runtime_check);
return StubCode::InstantiateTypeArgumentsMayShareFunctionTA();
}
@@ -6816,6 +6846,18 @@
DISALLOW_COPY_AND_ASSIGN(BoxIntegerInstr);
};
+class BoxUint8Instr : public BoxIntegerInstr {
+ public:
+ explicit BoxUint8Instr(Value* value)
+ : BoxIntegerInstr(kUnboxedUint8, value) {}
+
+ virtual bool ValueFitsSmi() const { return true; }
+
+ DECLARE_INSTRUCTION(BoxUint8)
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(BoxUint8Instr);
+};
class BoxInteger32Instr : public BoxIntegerInstr {
public:
BoxInteger32Instr(Representation representation, Value* value)
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index a91b6e3..cbedc5b 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -1717,6 +1717,7 @@
switch (class_id_) {
case kArrayCid:
case kImmutableArrayCid:
+ case kTypeArgumentsCid:
return kTagged;
case kOneByteStringCid:
case kTwoByteStringCid:
@@ -2012,7 +2013,8 @@
default: {
const Register result = locs()->out(0).reg();
ASSERT(representation() == kTagged);
- ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid));
+ ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid) ||
+ (class_id() == kTypeArgumentsCid));
__ ldr(result, element_address);
break;
}
@@ -3197,35 +3199,17 @@
LocationSummary* LoadFieldInstr::MakeLocationSummary(Zone* zone,
bool opt) const {
const intptr_t kNumInputs = 1;
-
- const intptr_t kNumTemps =
- (slot().representation() != kTagged)
- ? 0
- : ((IsUnboxedDartFieldLoad() && opt)
- ? (FLAG_precompiled_mode ? 0 : 1)
- : (IsPotentialUnboxedDartFieldLoad() ? 3 : 0));
-
- const auto contains_call =
- (slot().representation() != kTagged)
- ? LocationSummary::kNoCall
- : ((IsUnboxedDartFieldLoad() && opt)
- ? LocationSummary::kNoCall
- : (IsPotentialUnboxedDartFieldLoad()
- ? LocationSummary::kCallOnSlowPath
- : (calls_initializer() ? LocationSummary::kCall
- : LocationSummary::kNoCall)));
-
- LocationSummary* locs =
- new (zone) LocationSummary(zone, kNumInputs, kNumTemps, contains_call);
-
- locs->set_in(0, calls_initializer() ? Location::RegisterLocation(
- InitInstanceFieldABI::kInstanceReg)
- : Location::RequiresRegister());
-
+ LocationSummary* locs = nullptr;
if (slot().representation() != kTagged) {
+ ASSERT(!calls_initializer());
ASSERT(RepresentationUtils::IsUnboxedInteger(slot().representation()));
const size_t value_size =
RepresentationUtils::ValueSize(slot().representation());
+
+ const intptr_t kNumTemps = 0;
+ locs = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ locs->set_in(0, Location::RequiresRegister());
if (value_size <= compiler::target::kWordSize) {
locs->set_out(0, Location::RequiresRegister());
} else {
@@ -3233,23 +3217,60 @@
locs->set_out(0, Location::Pair(Location::RequiresRegister(),
Location::RequiresRegister()));
}
+
} else if (IsUnboxedDartFieldLoad() && opt) {
ASSERT(!calls_initializer());
+ ASSERT(!slot().field().is_non_nullable_integer());
+
+ const intptr_t kNumTemps = FLAG_precompiled_mode ? 0 : 1;
+ locs = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ locs->set_in(0, Location::RequiresRegister());
if (!FLAG_precompiled_mode) {
locs->set_temp(0, Location::RequiresRegister());
}
locs->set_out(0, Location::RequiresFpuRegister());
+
} else if (IsPotentialUnboxedDartFieldLoad()) {
ASSERT(!calls_initializer());
+ const intptr_t kNumTemps = 3;
+ locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps,
+ LocationSummary::kCallOnSlowPath);
+ locs->set_in(0, Location::RequiresRegister());
locs->set_temp(0, opt ? Location::RequiresFpuRegister()
: Location::FpuRegisterLocation(Q1));
locs->set_temp(1, Location::RequiresRegister());
locs->set_temp(2, Location::RequiresRegister());
locs->set_out(0, Location::RequiresRegister());
+
} else if (calls_initializer()) {
- locs->set_out(0,
- Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+ if (throw_exception_on_initialization()) {
+ const bool using_shared_stub = UseSharedSlowPathStub(opt);
+ const intptr_t kNumTemps = using_shared_stub ? 1 : 0;
+ locs = new (zone) LocationSummary(
+ zone, kNumInputs, kNumTemps,
+ using_shared_stub ? LocationSummary::kCallOnSharedSlowPath
+ : LocationSummary::kCallOnSlowPath);
+ if (using_shared_stub) {
+ locs->set_temp(0, Location::RegisterLocation(
+ LateInitializationErrorABI::kFieldReg));
+ }
+ locs->set_in(0, Location::RequiresRegister());
+ locs->set_out(0, Location::RequiresRegister());
+ } else {
+ const intptr_t kNumTemps = 0;
+ locs = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+ locs->set_in(
+ 0, Location::RegisterLocation(InitInstanceFieldABI::kInstanceReg));
+ locs->set_out(
+ 0, Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+ }
} else {
+ const intptr_t kNumTemps = 0;
+ locs = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ locs->set_in(0, Location::RequiresRegister());
locs->set_out(0, Location::RequiresRegister());
}
return locs;
@@ -3281,6 +3302,13 @@
__ LoadFieldFromOffset(kWord, result, instance_reg, OffsetInBytes());
break;
}
+ case kUnboxedUint8: {
+ const Register result = locs()->out(0).reg();
+ __ Comment("UnboxedUint8LoadFieldInstr");
+ __ LoadFieldFromOffset(kUnsignedByte, result, instance_reg,
+ OffsetInBytes());
+ break;
+ }
default:
UNIMPLEMENTED();
break;
@@ -3483,27 +3511,34 @@
void InstantiateTypeArgumentsInstr::EmitNativeCode(
FlowGraphCompiler* compiler) {
- const Register instantiator_type_args_reg = locs()->in(0).reg();
- const Register function_type_args_reg = locs()->in(1).reg();
- const Register result_reg = locs()->out(0).reg();
-
- // 'instantiator_type_args_reg' is a TypeArguments object (or null).
- // 'function_type_args_reg' is a TypeArguments object (or null).
-
- compiler::Label type_arguments_instantiated;
- ASSERT(!instantiator_class().IsNull());
- ASSERT(type_arguments()->BindsToConstant());
+ // We should never try and instantiate a TAV known at compile time to be null,
+ // so we can use a null value below for the dynamic case.
+ ASSERT(!type_arguments()->BindsToConstant() ||
+ !type_arguments()->BoundConstant().IsNull());
const auto& type_args =
- TypeArguments::Cast(type_arguments()->BoundConstant());
-
- // If both the instantiator and function type arguments are null and if the
- // type argument vector instantiated from null becomes a vector of dynamic,
- // then use null as the type arguments.
+ type_arguments()->BindsToConstant()
+ ? TypeArguments::Cast(type_arguments()->BoundConstant())
+ : Object::null_type_arguments();
+ const intptr_t len = type_args.Length();
const bool can_function_type_args_be_null =
function_type_arguments()->CanBe(Object::null_object());
- const intptr_t len = type_args.Length();
- if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
- can_function_type_args_be_null) {
+
+ compiler::Label type_arguments_instantiated;
+ if (type_args.IsNull()) {
+ // Currently we only create dynamic InstantiateTypeArguments instructions
+ // in cases where we know the type argument is uninstantiated at runtime,
+ // so there are no extra checks needed to call the stub successfully.
+ } else if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
+ can_function_type_args_be_null) {
+ // If both the instantiator and function type arguments are null and if the
+ // type argument vector instantiated from null becomes a vector of dynamic,
+ // then use null as the type arguments.
+ //
+ // 'instantiator_type_args_reg' is a TypeArguments object (or null).
+ // 'function_type_args_reg' is a TypeArguments object (or null).
+ const Register instantiator_type_args_reg = locs()->in(0).reg();
+ const Register function_type_args_reg = locs()->in(1).reg();
+ const Register result_reg = locs()->out(0).reg();
ASSERT(result_reg != instantiator_type_args_reg &&
result_reg != function_type_args_reg);
__ LoadObject(result_reg, Object::null_object());
@@ -4907,6 +4942,26 @@
__ Bind(&done);
}
+LocationSummary* BoxUint8Instr::MakeLocationSummary(Zone* zone,
+ bool opt) const {
+ ASSERT(from_representation() == kUnboxedUint8);
+ const intptr_t kNumInputs = 1;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::RequiresRegister());
+ summary->set_out(0, Location::RequiresRegister());
+ return summary;
+}
+
+void BoxUint8Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ const Register value = locs()->in(0).reg();
+ const Register out = locs()->out(0).reg();
+
+ __ AndImmediate(out, value, 0xff);
+ __ SmiTag(out);
+}
+
LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
bool opt) const {
ASSERT((from_representation() == kUnboxedInt32) ||
@@ -6888,12 +6943,9 @@
class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
public:
- static const intptr_t kNumberOfArguments = 0;
-
ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
: ThrowErrorSlowPathCode(instruction,
kArgumentErrorUnboxedInt64RuntimeEntry,
- kNumberOfArguments,
try_index) {}
const char* name() override { return "int64 shift"; }
@@ -7051,12 +7103,9 @@
class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
public:
- static const intptr_t kNumberOfArguments = 0;
-
ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
: ThrowErrorSlowPathCode(instruction,
kArgumentErrorUnboxedInt64RuntimeEntry,
- kNumberOfArguments,
try_index) {}
const char* name() override { return "uint32 shift"; }
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 7ab2f6d..7cb909a 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -1556,6 +1556,7 @@
switch (class_id_) {
case kArrayCid:
case kImmutableArrayCid:
+ case kTypeArgumentsCid:
return kTagged;
case kOneByteStringCid:
case kTwoByteStringCid:
@@ -1712,7 +1713,8 @@
break;
default:
ASSERT(representation() == kTagged);
- ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid));
+ ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid) ||
+ (class_id() == kTypeArgumentsCid));
__ ldr(result, element_address);
break;
}
@@ -2733,50 +2735,69 @@
LocationSummary* LoadFieldInstr::MakeLocationSummary(Zone* zone,
bool opt) const {
const intptr_t kNumInputs = 1;
- const intptr_t kNumTemps =
- (slot().representation() != kTagged)
- ? 0
- : ((IsUnboxedDartFieldLoad() && opt)
- ? (FLAG_precompiled_mode ? 0 : 1)
- : (IsPotentialUnboxedDartFieldLoad() ? 1 : 0));
- const auto contains_call =
- (slot().representation() != kTagged)
- ? LocationSummary::kNoCall
- : ((IsUnboxedDartFieldLoad() && opt)
- ? LocationSummary::kNoCall
- : (IsPotentialUnboxedDartFieldLoad()
- ? LocationSummary::kCallOnSlowPath
- : (calls_initializer() ? LocationSummary::kCall
- : LocationSummary::kNoCall)));
-
- LocationSummary* locs =
- new (zone) LocationSummary(zone, kNumInputs, kNumTemps, contains_call);
-
- locs->set_in(0, calls_initializer() ? Location::RegisterLocation(
- InitInstanceFieldABI::kInstanceReg)
- : Location::RequiresRegister());
-
+ LocationSummary* locs = nullptr;
if (slot().representation() != kTagged) {
ASSERT(!calls_initializer());
ASSERT(RepresentationUtils::IsUnboxedInteger(slot().representation()));
ASSERT(RepresentationUtils::ValueSize(slot().representation()) <=
compiler::target::kWordSize);
+
+ const intptr_t kNumTemps = 0;
+ locs = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ locs->set_in(0, Location::RequiresRegister());
locs->set_out(0, Location::RequiresRegister());
+
} else if (IsUnboxedDartFieldLoad() && opt) {
ASSERT(!calls_initializer());
ASSERT(!slot().field().is_non_nullable_integer());
+
+ const intptr_t kNumTemps = FLAG_precompiled_mode ? 0 : 1;
+ locs = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ locs->set_in(0, Location::RequiresRegister());
if (!FLAG_precompiled_mode) {
locs->set_temp(0, Location::RequiresRegister());
}
locs->set_out(0, Location::RequiresFpuRegister());
+
} else if (IsPotentialUnboxedDartFieldLoad()) {
ASSERT(!calls_initializer());
+ const intptr_t kNumTemps = 1;
+ locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps,
+ LocationSummary::kCallOnSlowPath);
+ locs->set_in(0, Location::RequiresRegister());
locs->set_temp(0, Location::RequiresRegister());
locs->set_out(0, Location::RequiresRegister());
+
} else if (calls_initializer()) {
- locs->set_out(0,
- Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+ if (throw_exception_on_initialization()) {
+ const bool using_shared_stub = UseSharedSlowPathStub(opt);
+ const intptr_t kNumTemps = using_shared_stub ? 1 : 0;
+ locs = new (zone) LocationSummary(
+ zone, kNumInputs, kNumTemps,
+ using_shared_stub ? LocationSummary::kCallOnSharedSlowPath
+ : LocationSummary::kCallOnSlowPath);
+ if (using_shared_stub) {
+ locs->set_temp(0, Location::RegisterLocation(
+ LateInitializationErrorABI::kFieldReg));
+ }
+ locs->set_in(0, Location::RequiresRegister());
+ locs->set_out(0, Location::RequiresRegister());
+ } else {
+ const intptr_t kNumTemps = 0;
+ locs = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+ locs->set_in(
+ 0, Location::RegisterLocation(InitInstanceFieldABI::kInstanceReg));
+ locs->set_out(
+ 0, Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+ }
} else {
+ const intptr_t kNumTemps = 0;
+ locs = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ locs->set_in(0, Location::RequiresRegister());
locs->set_out(0, Location::RequiresRegister());
}
return locs;
@@ -2800,6 +2821,11 @@
__ LoadFieldFromOffset(result_reg, instance_reg, OffsetInBytes(),
kUnsignedWord);
break;
+ case kUnboxedUint8:
+ __ Comment("UnboxedUint8LoadFieldInstr");
+ __ LoadFieldFromOffset(result_reg, instance_reg, OffsetInBytes(),
+ kUnsignedByte);
+ break;
default:
UNIMPLEMENTED();
break;
@@ -2984,27 +3010,34 @@
void InstantiateTypeArgumentsInstr::EmitNativeCode(
FlowGraphCompiler* compiler) {
- const Register instantiator_type_args_reg = locs()->in(0).reg();
- const Register function_type_args_reg = locs()->in(1).reg();
- const Register result_reg = locs()->out(0).reg();
-
- compiler::Label type_arguments_instantiated;
- ASSERT(!instantiator_class().IsNull());
- ASSERT(type_arguments()->BindsToConstant());
+ // We should never try and instantiate a TAV known at compile time to be null,
+ // so we can use a null value below for the dynamic case.
+ ASSERT(!type_arguments()->BindsToConstant() ||
+ !type_arguments()->BoundConstant().IsNull());
const auto& type_args =
- TypeArguments::Cast(type_arguments()->BoundConstant());
- // 'instantiator_type_args_reg' is a TypeArguments object (or null).
- // 'function_type_args_reg' is a TypeArguments object (or null).
-
- // If both the instantiator and function type arguments are null and if the
- // type argument vector instantiated from null becomes a vector of dynamic,
- // then use null as the type arguments.
+ type_arguments()->BindsToConstant()
+ ? TypeArguments::Cast(type_arguments()->BoundConstant())
+ : Object::null_type_arguments();
const intptr_t len = type_args.Length();
const bool can_function_type_args_be_null =
function_type_arguments()->CanBe(Object::null_object());
- if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
- can_function_type_args_be_null) {
+
+ compiler::Label type_arguments_instantiated;
+ if (type_args.IsNull()) {
+ // Currently we only create dynamic InstantiateTypeArguments instructions
+ // in cases where we know the type argument is uninstantiated at runtime,
+ // so there are no extra checks needed to call the stub successfully.
+ } else if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
+ can_function_type_args_be_null) {
+ // If both the instantiator and function type arguments are null and if the
+ // type argument vector instantiated from null becomes a vector of dynamic,
+ // then use null as the type arguments.
compiler::Label non_null_type_args;
+ // 'instantiator_type_args_reg' is a TypeArguments object (or null).
+ // 'function_type_args_reg' is a TypeArguments object (or null).
+ const Register instantiator_type_args_reg = locs()->in(0).reg();
+ const Register function_type_args_reg = locs()->in(1).reg();
+ const Register result_reg = locs()->out(0).reg();
ASSERT(result_reg != instantiator_type_args_reg &&
result_reg != function_type_args_reg);
__ LoadObject(result_reg, Object::null_object());
@@ -3017,6 +3050,7 @@
__ Bind(&non_null_type_args);
}
// Lookup cache in stub before calling runtime.
+
compiler->GenerateStubCall(token_pos(), GetStub(),
PcDescriptorsLayout::kOther, locs());
__ Bind(&type_arguments_instantiated);
@@ -4140,6 +4174,30 @@
__ Bind(&done);
}
+LocationSummary* BoxUint8Instr::MakeLocationSummary(Zone* zone,
+ bool opt) const {
+ ASSERT(from_representation() == kUnboxedUint8);
+ const intptr_t kNumInputs = 1;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::RequiresRegister());
+ summary->set_out(0, Location::RequiresRegister());
+ return summary;
+}
+
+void BoxUint8Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ const Register value = locs()->in(0).reg();
+ const Register out = locs()->out(0).reg();
+ ASSERT(value != out);
+
+ ASSERT(kSmiTagSize == 1);
+ const intptr_t shift = kBitsPerWord - kBitsPerByte;
+ // TODO(vegorov) implement and use UBFM/SBFM for this.
+ __ LslImmediate(out, value, shift);
+ __ LsrImmediate(out, out, shift - kSmiTagSize);
+}
+
LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
bool opt) const {
ASSERT((from_representation() == kUnboxedInt32) ||
@@ -5638,8 +5696,6 @@
class Int64DivideSlowPath : public ThrowErrorSlowPathCode {
public:
- static const intptr_t kNumberOfArguments = 0;
-
Int64DivideSlowPath(BinaryInt64OpInstr* instruction,
Register divisor,
Range* divisor_range,
@@ -5648,7 +5704,6 @@
intptr_t try_index)
: ThrowErrorSlowPathCode(instruction,
kIntegerDivisionByZeroExceptionRuntimeEntry,
- kNumberOfArguments,
try_index),
is_mod_(instruction->op_kind() == Token::kMOD),
divisor_(divisor),
@@ -5992,12 +6047,9 @@
class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
public:
- static const intptr_t kNumberOfArguments = 0;
-
ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
: ThrowErrorSlowPathCode(instruction,
kArgumentErrorUnboxedInt64RuntimeEntry,
- kNumberOfArguments,
try_index) {}
const char* name() override { return "int64 shift"; }
@@ -6124,12 +6176,9 @@
class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
public:
- static const intptr_t kNumberOfArguments = 0;
-
ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
: ThrowErrorSlowPathCode(instruction,
kArgumentErrorUnboxedInt64RuntimeEntry,
- kNumberOfArguments,
try_index) {}
const char* name() override { return "uint32 shift"; }
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index 8344e7a..54356ba 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -1419,6 +1419,7 @@
switch (class_id_) {
case kArrayCid:
case kImmutableArrayCid:
+ case kTypeArgumentsCid:
return kTagged;
case kOneByteStringCid:
case kTwoByteStringCid:
@@ -1600,7 +1601,8 @@
default: {
const Register result = locs()->out(0).reg();
ASSERT(representation() == kTagged);
- ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid));
+ ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid) ||
+ (class_id() == kTypeArgumentsCid));
__ movl(result, element_address);
break;
}
@@ -2531,35 +2533,17 @@
LocationSummary* LoadFieldInstr::MakeLocationSummary(Zone* zone,
bool opt) const {
const intptr_t kNumInputs = 1;
- const intptr_t kNumTemps =
- (slot().representation() != kTagged)
- ? 0
- : ((IsUnboxedDartFieldLoad() && opt)
- ? 1
- : ((IsPotentialUnboxedDartFieldLoad()) ? 2 : 0));
-
- const auto contains_call =
- (slot().representation() != kTagged)
- ? LocationSummary::kNoCall
- : ((IsUnboxedDartFieldLoad() && opt)
- ? LocationSummary::kNoCall
- : (IsPotentialUnboxedDartFieldLoad()
- ? LocationSummary::kCallOnSlowPath
- : (calls_initializer() ? LocationSummary::kCall
- : LocationSummary::kNoCall)));
-
- LocationSummary* locs =
- new (zone) LocationSummary(zone, kNumInputs, kNumTemps, contains_call);
-
- locs->set_in(0, calls_initializer() ? Location::RegisterLocation(
- InitInstanceFieldABI::kInstanceReg)
- : Location::RequiresRegister());
-
+ LocationSummary* locs = nullptr;
if (slot().representation() != kTagged) {
ASSERT(!calls_initializer());
ASSERT(RepresentationUtils::IsUnboxedInteger(slot().representation()));
const size_t value_size =
RepresentationUtils::ValueSize(slot().representation());
+
+ const intptr_t kNumTemps = 0;
+ locs = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ locs->set_in(0, Location::RequiresRegister());
if (value_size <= compiler::target::kWordSize) {
locs->set_out(0, Location::RequiresRegister());
} else {
@@ -2567,23 +2551,51 @@
locs->set_out(0, Location::Pair(Location::RequiresRegister(),
Location::RequiresRegister()));
}
+
} else if (IsUnboxedDartFieldLoad() && opt) {
ASSERT(!calls_initializer());
+ const intptr_t kNumTemps = 1;
+ locs = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ locs->set_in(0, Location::RequiresRegister());
locs->set_temp(0, Location::RequiresRegister());
locs->set_out(0, Location::RequiresFpuRegister());
+
} else if (IsPotentialUnboxedDartFieldLoad()) {
ASSERT(!calls_initializer());
+ const intptr_t kNumTemps = 2;
+ locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps,
+ LocationSummary::kCallOnSlowPath);
+ locs->set_in(0, Location::RequiresRegister());
locs->set_temp(0, opt ? Location::RequiresFpuRegister()
: Location::FpuRegisterLocation(XMM1));
locs->set_temp(1, Location::RequiresRegister());
locs->set_out(0, Location::RequiresRegister());
+
} else if (calls_initializer()) {
- locs->set_out(0,
- Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+ if (throw_exception_on_initialization()) {
+ ASSERT(!UseSharedSlowPathStub(opt));
+ const intptr_t kNumTemps = 0;
+ locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps,
+ LocationSummary::kCallOnSlowPath);
+ locs->set_in(0, Location::RequiresRegister());
+ locs->set_out(0, Location::RequiresRegister());
+ } else {
+ const intptr_t kNumTemps = 0;
+ locs = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+ locs->set_in(
+ 0, Location::RegisterLocation(InitInstanceFieldABI::kInstanceReg));
+ locs->set_out(
+ 0, Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+ }
} else {
+ const intptr_t kNumTemps = 0;
+ locs = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ locs->set_in(0, Location::RequiresRegister());
locs->set_out(0, Location::RequiresRegister());
}
-
return locs;
}
@@ -2612,6 +2624,13 @@
__ movl(result, compiler::FieldAddress(instance_reg, OffsetInBytes()));
break;
}
+ case kUnboxedUint8: {
+ const Register result = locs()->out(0).reg();
+ __ Comment("UnboxedUint8LoadFieldInstr");
+ __ movzxb(result,
+ compiler::FieldAddress(instance_reg, OffsetInBytes()));
+ break;
+ }
default:
UNIMPLEMENTED();
break;
@@ -2779,27 +2798,34 @@
void InstantiateTypeArgumentsInstr::EmitNativeCode(
FlowGraphCompiler* compiler) {
- Register instantiator_type_args_reg = locs()->in(0).reg();
- Register function_type_args_reg = locs()->in(1).reg();
- Register result_reg = locs()->out(0).reg();
-
- compiler::Label type_arguments_instantiated;
- ASSERT(!instantiator_class().IsNull());
- ASSERT(type_arguments()->BindsToConstant());
+ // We should never try and instantiate a TAV known at compile time to be null,
+ // so we can use a null value below for the dynamic case.
+ ASSERT(!type_arguments()->BindsToConstant() ||
+ !type_arguments()->BoundConstant().IsNull());
const auto& type_args =
- TypeArguments::Cast(type_arguments()->BoundConstant());
- // 'instantiator_type_args_reg' is a TypeArguments object (or null).
- // 'function_type_args_reg' is a TypeArguments object (or null).
-
- // If both the instantiator and function type arguments are null and if the
- // type argument vector instantiated from null becomes a vector of dynamic,
- // then use null as the type arguments.
+ type_arguments()->BindsToConstant()
+ ? TypeArguments::Cast(type_arguments()->BoundConstant())
+ : Object::null_type_arguments();
const intptr_t len = type_args.Length();
const bool can_function_type_args_be_null =
function_type_arguments()->CanBe(Object::null_object());
- if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
- can_function_type_args_be_null) {
+
+ compiler::Label type_arguments_instantiated;
+ if (type_args.IsNull()) {
+ // Currently we only create dynamic InstantiateTypeArguments instructions
+ // in cases where we know the type argument is uninstantiated at runtime,
+ // so there are no extra checks needed to call the stub successfully.
+ } else if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
+ can_function_type_args_be_null) {
+ // If both the instantiator and function type arguments are null and if the
+ // type argument vector instantiated from null becomes a vector of dynamic,
+ // then use null as the type arguments.
compiler::Label non_null_type_args;
+ // 'instantiator_type_args_reg' is a TypeArguments object (or null).
+ // 'function_type_args_reg' is a TypeArguments object (or null).
+ const Register instantiator_type_args_reg = locs()->in(0).reg();
+ const Register function_type_args_reg = locs()->in(1).reg();
+ const Register result_reg = locs()->out(0).reg();
ASSERT(result_reg != instantiator_type_args_reg &&
result_reg != function_type_args_reg);
__ LoadObject(result_reg, Object::null_object());
@@ -3902,6 +3928,28 @@
__ Bind(&done);
}
+LocationSummary* BoxUint8Instr::MakeLocationSummary(Zone* zone,
+ bool opt) const {
+ ASSERT(from_representation() == kUnboxedUint8);
+ const intptr_t kNumInputs = 1;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::RequiresRegister());
+ summary->set_out(0, Location::RequiresRegister());
+ return summary;
+}
+
+void BoxUint8Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ const Register value = locs()->in(0).reg();
+ const Register out = locs()->out(0).reg();
+ ASSERT(value != out);
+
+ __ MoveRegister(out, value);
+ __ andl(out, compiler::Immediate(0xff));
+ __ SmiTag(out);
+}
+
LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
bool opt) const {
const intptr_t kNumInputs = 1;
@@ -5898,12 +5946,9 @@
class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
public:
- static const intptr_t kNumberOfArguments = 0;
-
ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
: ThrowErrorSlowPathCode(instruction,
kArgumentErrorUnboxedInt64RuntimeEntry,
- kNumberOfArguments,
try_index) {}
const char* name() override { return "int64 shift"; }
@@ -6063,12 +6108,9 @@
class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
public:
- static const intptr_t kNumberOfArguments = 0;
-
ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
: ThrowErrorSlowPathCode(instruction,
kArgumentErrorUnboxedInt64RuntimeEntry,
- kNumberOfArguments,
try_index) {}
const char* name() override { return "uint32 shift"; }
diff --git a/runtime/vm/compiler/backend/il_printer.cc b/runtime/vm/compiler/backend/il_printer.cc
index 62b7000..6a3fc15 100644
--- a/runtime/vm/compiler/backend/il_printer.cc
+++ b/runtime/vm/compiler/backend/il_printer.cc
@@ -452,8 +452,9 @@
sub_type()->PrintTo(f);
f->AddString(", ");
super_type()->PrintTo(f);
- f->Printf(", '%s', ", dst_name().ToCString());
- f->AddString(" instantiator_type_args(");
+ f->AddString(", ");
+ dst_name()->PrintTo(f);
+ f->AddString(", instantiator_type_args(");
instantiator_type_arguments()->PrintTo(f);
f->AddString("), function_type_args(");
function_type_arguments()->PrintTo(f);
@@ -926,6 +927,8 @@
return "double";
case kUnboxedFloat:
return "float";
+ case kUnboxedUint8:
+ return "uint8";
case kUnboxedInt32:
return "int32";
case kUnboxedUint32:
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index 1cd2a74..cdc4f79 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -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.
+#include "platform/globals.h"
#include "vm/globals.h" // Needed here to get TARGET_ARCH_X64.
#if defined(TARGET_ARCH_X64)
@@ -1552,6 +1553,7 @@
switch (class_id_) {
case kArrayCid:
case kImmutableArrayCid:
+ case kTypeArgumentsCid:
return kTagged;
case kOneByteStringCid:
case kTwoByteStringCid:
@@ -1701,7 +1703,8 @@
break;
default:
ASSERT(representation() == kTagged);
- ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid));
+ ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid) ||
+ (class_id() == kTypeArgumentsCid));
__ movq(result, element_address);
break;
}
@@ -2752,53 +2755,71 @@
LocationSummary* LoadFieldInstr::MakeLocationSummary(Zone* zone,
bool opt) const {
const intptr_t kNumInputs = 1;
- const intptr_t kNumTemps =
- (slot().representation() != kTagged)
- ? 0
- : ((IsUnboxedDartFieldLoad() && opt)
- ? (FLAG_precompiled_mode ? 0 : 1)
- : (IsPotentialUnboxedDartFieldLoad() ? 2 : 0));
- const auto contains_call =
- (slot().representation() != kTagged)
- ? LocationSummary::kNoCall
- : ((IsUnboxedDartFieldLoad() && opt)
- ? LocationSummary::kNoCall
- : (IsPotentialUnboxedDartFieldLoad()
- ? LocationSummary::kCallOnSlowPath
- : (calls_initializer() ? LocationSummary::kCall
- : LocationSummary::kNoCall)));
-
- LocationSummary* locs =
- new (zone) LocationSummary(zone, kNumInputs, kNumTemps, contains_call);
-
- locs->set_in(0, calls_initializer() ? Location::RegisterLocation(
- InitInstanceFieldABI::kInstanceReg)
- : Location::RequiresRegister());
-
+ LocationSummary* locs = nullptr;
if (slot().representation() != kTagged) {
ASSERT(!calls_initializer());
ASSERT(RepresentationUtils::IsUnboxedInteger(slot().representation()));
ASSERT(RepresentationUtils::ValueSize(slot().representation()) <=
compiler::target::kWordSize);
+
+ const intptr_t kNumTemps = 0;
+ locs = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ locs->set_in(0, Location::RequiresRegister());
locs->set_out(0, Location::RequiresRegister());
- }
- if (IsUnboxedDartFieldLoad() && opt) {
+
+ } else if (IsUnboxedDartFieldLoad() && opt) {
ASSERT(!calls_initializer());
ASSERT(!slot().field().is_non_nullable_integer());
+
+ const intptr_t kNumTemps = FLAG_precompiled_mode ? 0 : 1;
+ locs = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ locs->set_in(0, Location::RequiresRegister());
if (!FLAG_precompiled_mode) {
locs->set_temp(0, Location::RequiresRegister());
}
locs->set_out(0, Location::RequiresFpuRegister());
+
} else if (IsPotentialUnboxedDartFieldLoad()) {
ASSERT(!calls_initializer());
+ const intptr_t kNumTemps = 2;
+ locs = new (zone) LocationSummary(zone, kNumInputs, kNumTemps,
+ LocationSummary::kCallOnSlowPath);
+ locs->set_in(0, Location::RequiresRegister());
locs->set_temp(0, opt ? Location::RequiresFpuRegister()
: Location::FpuRegisterLocation(XMM1));
locs->set_temp(1, Location::RequiresRegister());
locs->set_out(0, Location::RequiresRegister());
+
} else if (calls_initializer()) {
- locs->set_out(0,
- Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+ if (throw_exception_on_initialization()) {
+ const bool using_shared_stub = UseSharedSlowPathStub(opt);
+ const intptr_t kNumTemps = using_shared_stub ? 1 : 0;
+ locs = new (zone) LocationSummary(
+ zone, kNumInputs, kNumTemps,
+ using_shared_stub ? LocationSummary::kCallOnSharedSlowPath
+ : LocationSummary::kCallOnSlowPath);
+ if (using_shared_stub) {
+ locs->set_temp(0, Location::RegisterLocation(
+ LateInitializationErrorABI::kFieldReg));
+ }
+ locs->set_in(0, Location::RequiresRegister());
+ locs->set_out(0, Location::RequiresRegister());
+ } else {
+ const intptr_t kNumTemps = 0;
+ locs = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall);
+ locs->set_in(
+ 0, Location::RegisterLocation(InitInstanceFieldABI::kInstanceReg));
+ locs->set_out(
+ 0, Location::RegisterLocation(InitInstanceFieldABI::kResultReg));
+ }
} else {
+ const intptr_t kNumTemps = 0;
+ locs = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ locs->set_in(0, Location::RequiresRegister());
locs->set_out(0, Location::RequiresRegister());
}
return locs;
@@ -2821,6 +2842,12 @@
__ Comment("UnboxedUint32LoadFieldInstr");
__ movl(result, compiler::FieldAddress(instance_reg, OffsetInBytes()));
break;
+ case kUnboxedUint8: {
+ __ Comment("UnboxedUint8LoadFieldInstr");
+ __ movzxb(result,
+ compiler::FieldAddress(instance_reg, OffsetInBytes()));
+ break;
+ }
default:
UNIMPLEMENTED();
break;
@@ -3013,27 +3040,34 @@
void InstantiateTypeArgumentsInstr::EmitNativeCode(
FlowGraphCompiler* compiler) {
- Register instantiator_type_args_reg = locs()->in(0).reg();
- Register function_type_args_reg = locs()->in(1).reg();
- Register result_reg = locs()->out(0).reg();
-
- compiler::Label type_arguments_instantiated;
- ASSERT(!instantiator_class().IsNull());
- ASSERT(type_arguments()->BindsToConstant());
+ // We should never try and instantiate a TAV known at compile time to be null,
+ // so we can use a null value below for the dynamic case.
+ ASSERT(!type_arguments()->BindsToConstant() ||
+ !type_arguments()->BoundConstant().IsNull());
const auto& type_args =
- TypeArguments::Cast(type_arguments()->BoundConstant());
- // 'instantiator_type_args_reg' is a TypeArguments object (or null).
- // 'function_type_args_reg' is a TypeArguments object (or null).
-
- // If both the instantiator and function type arguments are null and if the
- // type argument vector instantiated from null becomes a vector of dynamic,
- // then use null as the type arguments.
+ type_arguments()->BindsToConstant()
+ ? TypeArguments::Cast(type_arguments()->BoundConstant())
+ : Object::null_type_arguments();
const intptr_t len = type_args.Length();
const bool can_function_type_args_be_null =
function_type_arguments()->CanBe(Object::null_object());
- if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
- can_function_type_args_be_null) {
+
+ compiler::Label type_arguments_instantiated;
+ if (type_args.IsNull()) {
+ // Currently we only create dynamic InstantiateTypeArguments instructions
+ // in cases where we know the type argument is uninstantiated at runtime,
+ // so there are no extra checks needed to call the stub successfully.
+ } else if (type_args.IsRawWhenInstantiatedFromRaw(len) &&
+ can_function_type_args_be_null) {
+ // If both the instantiator and function type arguments are null and if the
+ // type argument vector instantiated from null becomes a vector of dynamic,
+ // then use null as the type arguments.
compiler::Label non_null_type_args;
+ // 'instantiator_type_args_reg' is a TypeArguments object (or null).
+ // 'function_type_args_reg' is a TypeArguments object (or null).
+ const Register instantiator_type_args_reg = locs()->in(0).reg();
+ const Register function_type_args_reg = locs()->in(1).reg();
+ const Register result_reg = locs()->out(0).reg();
ASSERT(result_reg != instantiator_type_args_reg &&
result_reg != function_type_args_reg);
__ LoadObject(result_reg, Object::null_object());
@@ -4415,6 +4449,27 @@
}
}
+LocationSummary* BoxUint8Instr::MakeLocationSummary(Zone* zone,
+ bool opt) const {
+ ASSERT(from_representation() == kUnboxedUint8);
+ const intptr_t kNumInputs = 1;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary = new (zone)
+ LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+ summary->set_in(0, Location::RequiresRegister());
+ summary->set_out(0, Location::RequiresRegister());
+ return summary;
+}
+
+void BoxUint8Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
+ const Register value = locs()->in(0).reg();
+ const Register out = locs()->out(0).reg();
+ ASSERT(value != out);
+
+ __ movzxb(out, value);
+ __ SmiTag(out);
+}
+
LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
bool opt) const {
ASSERT((from_representation() == kUnboxedInt32) ||
@@ -5935,15 +5990,12 @@
class Int64DivideSlowPath : public ThrowErrorSlowPathCode {
public:
- static const intptr_t kNumberOfArguments = 0;
-
Int64DivideSlowPath(BinaryInt64OpInstr* instruction,
Register divisor,
Range* divisor_range,
intptr_t try_index)
: ThrowErrorSlowPathCode(instruction,
kIntegerDivisionByZeroExceptionRuntimeEntry,
- kNumberOfArguments,
try_index),
is_mod_(instruction->op_kind() == Token::kMOD),
divisor_(divisor),
@@ -6358,12 +6410,9 @@
class ShiftInt64OpSlowPath : public ThrowErrorSlowPathCode {
public:
- static const intptr_t kNumberOfArguments = 0;
-
ShiftInt64OpSlowPath(ShiftInt64OpInstr* instruction, intptr_t try_index)
: ThrowErrorSlowPathCode(instruction,
kArgumentErrorUnboxedInt64RuntimeEntry,
- kNumberOfArguments,
try_index) {}
const char* name() override { return "int64 shift"; }
@@ -6488,12 +6537,9 @@
class ShiftUint32OpSlowPath : public ThrowErrorSlowPathCode {
public:
- static const intptr_t kNumberOfArguments = 0;
-
ShiftUint32OpSlowPath(ShiftUint32OpInstr* instruction, intptr_t try_index)
: ThrowErrorSlowPathCode(instruction,
kArgumentErrorUnboxedInt64RuntimeEntry,
- kNumberOfArguments,
try_index) {}
const char* name() override { return "uint32 shift"; }
diff --git a/runtime/vm/compiler/backend/locations.h b/runtime/vm/compiler/backend/locations.h
index 8f4c37f..1d29a39 100644
--- a/runtime/vm/compiler/backend/locations.h
+++ b/runtime/vm/compiler/backend/locations.h
@@ -27,6 +27,7 @@
// All unboxed integer representations.
// Format: (representation name, is unsigned, value type)
#define FOR_EACH_INTEGER_REPRESENTATION_KIND(M) \
+ M(UnboxedUint8, true, uint8_t) \
M(UnboxedInt32, false, int32_t) \
M(UnboxedUint32, true, uint32_t) \
M(UnboxedInt64, false, int64_t)
diff --git a/runtime/vm/compiler/backend/range_analysis.cc b/runtime/vm/compiler/backend/range_analysis.cc
index f3a0880..4018099 100644
--- a/runtime/vm/compiler/backend/range_analysis.cc
+++ b/runtime/vm/compiler/backend/range_analysis.cc
@@ -2670,6 +2670,7 @@
case kTagged:
return RangeBoundary::kRangeBoundarySmi;
case kUnboxedInt32:
+ case kUnboxedUint8: // Overapproximate Uint8 as Int32.
return RangeBoundary::kRangeBoundaryInt32;
case kUnboxedInt64:
case kUnboxedUint32: // Overapproximate Uint32 as Int64.
@@ -2689,12 +2690,17 @@
RangeBoundary::FromConstant(compiler::target::Array::kMaxElements));
break;
- case Slot::Kind::kTypeArguments_length:
case Slot::Kind::kTypedDataBase_length:
case Slot::Kind::kTypedDataView_offset_in_bytes:
*range = Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi());
break;
+ case Slot::Kind::kTypeArguments_length:
+ *range = Range(RangeBoundary::FromConstant(0),
+ RangeBoundary::FromConstant(
+ compiler::target::TypeArguments::kMaxElements));
+ break;
+
case Slot::Kind::kString_length:
*range = Range(
RangeBoundary::FromConstant(0),
@@ -2717,6 +2723,8 @@
case Slot::Kind::kClosure_function:
case Slot::Kind::kClosure_function_type_arguments:
case Slot::Kind::kClosure_instantiator_type_arguments:
+ case Slot::Kind::kClosureData_default_type_arguments:
+ case Slot::Kind::kFunction_data:
case Slot::Kind::kFunction_parameter_names:
case Slot::Kind::kFunction_parameter_types:
case Slot::Kind::kFunction_type_parameters:
@@ -2724,6 +2732,8 @@
case Slot::Kind::kTypedDataView_data:
case Slot::Kind::kType_arguments:
case Slot::Kind::kTypeArgumentsIndex:
+ case Slot::Kind::kTypeParameter_bound:
+ case Slot::Kind::kTypeParameter_name:
case Slot::Kind::kUnhandledException_exception:
case Slot::Kind::kUnhandledException_stacktrace:
// Not an integer valued field.
@@ -2735,7 +2745,9 @@
UNREACHABLE();
break;
+ case Slot::Kind::kFunction_kind_tag:
case Slot::Kind::kFunction_packed_fields:
+ case Slot::Kind::kTypeParameter_flags:
*range = Range::Full(RepresentationToRangeSize(slot().representation()));
break;
@@ -2752,6 +2764,12 @@
case Slot::Kind::kArgumentsDescriptor_size:
*range = Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi());
break;
+
+ case Slot::Kind::kClosureData_default_type_arguments_info:
+ *range = Range(
+ RangeBoundary::FromConstant(0),
+ RangeBoundary::FromConstant(
+ (1 << Function::NumParentTypeParametersField::kNextBit) - 1));
}
}
diff --git a/runtime/vm/compiler/backend/slot.cc b/runtime/vm/compiler/backend/slot.cc
index 9b03ce9..1c348aa 100644
--- a/runtime/vm/compiler/backend/slot.cc
+++ b/runtime/vm/compiler/backend/slot.cc
@@ -179,6 +179,9 @@
case kImmutableArrayCid:
return GetNativeSlot(Kind::kArray_length);
+ case kTypeArgumentsCid:
+ return GetNativeSlot(Kind::kTypeArguments_length);
+
default:
UNREACHABLE();
return GetNativeSlot(Kind::kArray_length);
diff --git a/runtime/vm/compiler/backend/slot.h b/runtime/vm/compiler/backend/slot.h
index 3a76cf1..8c24078 100644
--- a/runtime/vm/compiler/backend/slot.h
+++ b/runtime/vm/compiler/backend/slot.h
@@ -56,6 +56,8 @@
V(Closure, ClosureLayout, instantiator_type_arguments, TypeArguments, FINAL) \
V(Closure, ClosureLayout, delayed_type_arguments, TypeArguments, FINAL) \
V(Closure, ClosureLayout, function_type_arguments, TypeArguments, FINAL) \
+ V(ClosureData, ClosureDataLayout, default_type_arguments, TypeArguments, \
+ FINAL) \
V(Function, FunctionLayout, type_parameters, TypeArguments, FINAL) \
V(Type, TypeLayout, arguments, TypeArguments, FINAL)
@@ -77,6 +79,8 @@
V(Closure, ClosureLayout, function, Function, FINAL) \
V(Closure, ClosureLayout, context, Context, FINAL) \
V(Closure, ClosureLayout, hash, Context, VAR) \
+ V(ClosureData, ClosureDataLayout, default_type_arguments_info, Smi, FINAL) \
+ V(Function, FunctionLayout, data, Dynamic, FINAL) \
V(Function, FunctionLayout, parameter_names, Array, FINAL) \
V(Function, FunctionLayout, parameter_types, Array, FINAL) \
V(GrowableObjectArray, GrowableObjectArrayLayout, length, Smi, VAR) \
@@ -96,6 +100,8 @@
V(ArgumentsDescriptor, ArrayLayout, size, Smi, FINAL) \
V(PointerBase, PointerBaseLayout, data_field, Dynamic, FINAL) \
V(TypeArguments, TypeArgumentsLayout, length, Smi, FINAL) \
+ V(TypeParameter, TypeParameterLayout, bound, Dynamic, FINAL) \
+ V(TypeParameter, TypeParameterLayout, name, Dynamic, FINAL) \
V(UnhandledException, UnhandledExceptionLayout, exception, Dynamic, FINAL) \
V(UnhandledException, UnhandledExceptionLayout, stacktrace, Dynamic, FINAL)
@@ -115,7 +121,9 @@
//
// Note: As the underlying field is unboxed, these slots cannot be nullable.
#define UNBOXED_NATIVE_SLOTS_LIST(V) \
- V(Function, FunctionLayout, packed_fields, Uint32, FINAL)
+ V(Function, FunctionLayout, kind_tag, Uint32, FINAL) \
+ V(Function, FunctionLayout, packed_fields, Uint32, FINAL) \
+ V(TypeParameter, TypeParameterLayout, flags, Uint8, FINAL)
// For uses that do not need the exact_type (boxed) or representation (unboxed)
// or whether a boxed native slot is nullable. (Generally, such users only need
diff --git a/runtime/vm/compiler/backend/type_propagator.cc b/runtime/vm/compiler/backend/type_propagator.cc
index 3877f45..8d96744 100644
--- a/runtime/vm/compiler/backend/type_propagator.cc
+++ b/runtime/vm/compiler/backend/type_propagator.cc
@@ -1815,6 +1815,10 @@
}
return ComputeArrayElementType(array());
+ case kTypeArgumentsCid:
+ return CompileType::FromAbstractType(Object::dynamic_type(),
+ /*is_nullable=*/false);
+
case kTypedDataFloat32ArrayCid:
case kTypedDataFloat64ArrayCid:
return CompileType::FromCid(kDoubleCid);
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
index 13b220d..06d5d73 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
@@ -367,27 +367,18 @@
}
}
-Fragment BaseFlowGraphBuilder::LoadIndexed(intptr_t index_scale) {
+Fragment BaseFlowGraphBuilder::LoadIndexed(classid_t class_id,
+ intptr_t index_scale,
+ bool index_unboxed) {
Value* index = Pop();
+ // A C pointer if index_unboxed, otherwise a boxed Dart value.
Value* array = Pop();
+
+ // We use C behavior when dereferencing pointers, so we use aligned access in
+ // all cases.
LoadIndexedInstr* instr = new (Z) LoadIndexedInstr(
- array, index, /*index_unboxed=*/false, index_scale, kArrayCid,
- kAlignedAccess, DeoptId::kNone, TokenPosition::kNoSource);
- Push(instr);
- return Fragment(instr);
-}
-
-Fragment BaseFlowGraphBuilder::LoadIndexedTypedData(classid_t class_id,
- intptr_t index_scale,
- bool index_unboxed) {
- // We use C behavior when dereferencing pointers, we assume alignment.
- const AlignmentType alignment = kAlignedAccess;
-
- Value* index = Pop();
- Value* c_pointer = Pop();
- LoadIndexedInstr* instr = new (Z)
- LoadIndexedInstr(c_pointer, index, index_unboxed, index_scale, class_id,
- alignment, DeoptId::kNone, TokenPosition::kNoSource);
+ array, index, index_unboxed, index_scale, class_id, kAlignedAccess,
+ DeoptId::kNone, TokenPosition::kNoSource);
Push(instr);
return Fragment(instr);
}
@@ -967,6 +958,19 @@
return instructions;
}
+Fragment BaseFlowGraphBuilder::InstantiateDynamicTypeArguments() {
+ Value* type_arguments = Pop();
+ Value* function_type_args = Pop();
+ Value* instantiator_type_args = Pop();
+ const Function& function = Object::null_function();
+ const Class& instantiator_class = Class::ZoneHandle(Z);
+ InstantiateTypeArgumentsInstr* instr = new (Z) InstantiateTypeArgumentsInstr(
+ TokenPosition::kNoSource, instantiator_type_args, function_type_args,
+ type_arguments, instantiator_class, function, GetNextDeoptId());
+ Push(instr);
+ return Fragment(instr);
+}
+
Fragment BaseFlowGraphBuilder::LoadClassId() {
LoadClassIdInstr* load = new (Z) LoadClassIdInstr(Pop());
Push(load);
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.h b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
index 4753533..673375a 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.h
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
@@ -164,11 +164,10 @@
Fragment LoadField(const Field& field, bool calls_initializer);
Fragment LoadNativeField(const Slot& native_field,
bool calls_initializer = false);
- Fragment LoadIndexed(intptr_t index_scale);
- // Takes a [class_id] valid for StoreIndexed.
- Fragment LoadIndexedTypedData(classid_t class_id,
- intptr_t index_scale,
- bool index_unboxed);
+ // Pass true for index_unboxed if indexing into external typed data.
+ Fragment LoadIndexed(classid_t class_id,
+ intptr_t index_scale = compiler::target::kWordSize,
+ bool index_unboxed = false);
Fragment LoadUntagged(intptr_t offset);
Fragment StoreUntagged(intptr_t offset);
@@ -339,6 +338,7 @@
Fragment AllocateTypedData(TokenPosition position, classid_t class_id);
Fragment InstantiateType(const AbstractType& type);
Fragment InstantiateTypeArguments(const TypeArguments& type_arguments);
+ Fragment InstantiateDynamicTypeArguments();
Fragment LoadClassId();
// Returns true if we are building a graph for inlining of a call site that
diff --git a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
index 1ce2b7a..41af858 100644
--- a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
@@ -1417,7 +1417,7 @@
LoadStackSlots(5);
- const String& dst_name = String::Cast(PopConstant().value());
+ Value* dst_name = Pop();
Value* super_type = Pop();
Value* sub_type = Pop();
Value* function_type_args = Pop();
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.cc b/runtime/vm/compiler/frontend/bytecode_reader.cc
index 15f3dda..a6a4252 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.cc
+++ b/runtime/vm/compiler/frontend/bytecode_reader.cc
@@ -674,6 +674,7 @@
// Do not set type parameters for factories, as VM uses class type
// parameters instead.
parameterized_function.set_type_parameters(type_parameters);
+ parameterized_function.UpdateCachedDefaultTypeArguments(thread_);
if (parameterized_function.IsSignatureFunction()) {
if (function_type_type_parameters_ == nullptr) {
function_type_type_parameters_ = &type_parameters;
@@ -3136,6 +3137,7 @@
type = type_args.TypeAt(i);
param.set_default_argument(type);
}
+ function.UpdateCachedDefaultTypeArguments(thread_);
}
}
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index da8192e..efc2994 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -542,12 +542,8 @@
prologue += IntConstant(dart_function.NumTypeParameters() +
dart_function.NumParentTypeParameters());
- const Library& dart_internal =
- Library::Handle(Z, Library::InternalLibrary());
- const Function& prepend_function =
- Function::ZoneHandle(Z, dart_internal.LookupFunctionAllowPrivate(
- Symbols::PrependTypeArguments()));
- ASSERT(!prepend_function.IsNull());
+ const auto& prepend_function =
+ flow_graph_builder_->PrependTypeArgumentsFunction();
prologue += StaticCall(TokenPosition::kNoSource, prepend_function, 4,
ICData::kStatic);
@@ -738,20 +734,17 @@
Fragment* explicit_checks,
Fragment* implicit_checks,
Fragment* implicit_redefinitions) {
- if (!dart_function.NeedsArgumentTypeChecks()) return;
-
- // Check if parent function was annotated with no-dynamic-invocations.
- const ProcedureAttributesMetadata attrs =
- procedure_attributes_metadata_helper_.GetProcedureAttributes(
- dart_function.kernel_offset());
-
- AlternativeReadingScope _(&reader_);
- SetOffset(type_parameters_offset);
- B->BuildArgumentTypeChecks(
- MethodCanSkipTypeChecksForNonCovariantArguments(dart_function, attrs)
- ? TypeChecksToBuild::kCheckCovariantTypeParameterBounds
- : TypeChecksToBuild::kCheckAllTypeParameterBounds,
- explicit_checks, implicit_checks, implicit_redefinitions);
+ if (dart_function.NeedsTypeArgumentTypeChecks()) {
+ B->BuildTypeArgumentTypeChecks(
+ MethodCanSkipTypeChecksForNonCovariantTypeArguments(dart_function)
+ ? TypeChecksToBuild::kCheckCovariantTypeParameterBounds
+ : TypeChecksToBuild::kCheckAllTypeParameterBounds,
+ implicit_checks);
+ }
+ if (dart_function.NeedsArgumentTypeChecks()) {
+ B->BuildArgumentTypeChecks(explicit_checks, implicit_checks,
+ implicit_redefinitions);
+ }
}
Fragment StreamingFlowGraphBuilder::ShortcutForUserDefinedEquals(
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 46daea0..4e9d36e 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -68,7 +68,9 @@
switch_block_(NULL),
try_catch_block_(NULL),
try_finally_block_(NULL),
- catch_block_(NULL) {
+ catch_block_(NULL),
+ prepend_type_arguments_(Function::ZoneHandle(zone_)),
+ throw_new_null_assertion_(Function::ZoneHandle(zone_)) {
const Script& script =
Script::Handle(Z, parsed_function->function().script());
H.InitFromScript(script);
@@ -1282,8 +1284,8 @@
body += LoadUntagged(compiler::target::PointerBase::data_field_offset());
body += LoadLocal(arg_offset_not_null);
body += UnboxTruncate(kUnboxedFfiIntPtr);
- body += LoadIndexedTypedData(typed_data_cid, /*index_scale=*/1,
- /*index_unboxed=*/true);
+ body += LoadIndexed(typed_data_cid, /*index_scale=*/1,
+ /*index_unboxed=*/true);
if (kind == MethodRecognizer::kFfiLoadFloat ||
kind == MethodRecognizer::kFfiLoadDouble) {
if (kind == MethodRecognizer::kFfiLoadFloat) {
@@ -1705,14 +1707,21 @@
Fragment FlowGraphBuilder::AssertSubtype(TokenPosition position,
const AbstractType& sub_type_value,
const AbstractType& super_type_value,
- const String& dst_name) {
+ const String& dst_name_value) {
Fragment instructions;
-
instructions += LoadInstantiatorTypeArguments();
instructions += LoadFunctionTypeArguments();
- instructions += Constant(AbstractType::ZoneHandle(sub_type_value.raw()));
- instructions += Constant(AbstractType::ZoneHandle(super_type_value.raw()));
+ instructions += Constant(AbstractType::ZoneHandle(Z, sub_type_value.raw()));
+ instructions += Constant(AbstractType::ZoneHandle(Z, super_type_value.raw()));
+ instructions += Constant(String::ZoneHandle(Z, dst_name_value.raw()));
+ instructions += AssertSubtype(position);
+ return instructions;
+}
+Fragment FlowGraphBuilder::AssertSubtype(TokenPosition position) {
+ Fragment instructions;
+
+ Value* dst_name = Pop();
Value* super_type = Pop();
Value* sub_type = Pop();
Value* function_type_args = Pop();
@@ -1726,11 +1735,8 @@
return instructions;
}
-void FlowGraphBuilder::BuildArgumentTypeChecks(
- TypeChecksToBuild mode,
- Fragment* explicit_checks,
- Fragment* implicit_checks,
- Fragment* implicit_redefinitions) {
+void FlowGraphBuilder::BuildTypeArgumentTypeChecks(TypeChecksToBuild mode,
+ Fragment* implicit_checks) {
const Function& dart_function = parsed_function_->function();
const Function* forwarding_target = nullptr;
@@ -1796,6 +1802,19 @@
} else {
*implicit_checks += check_bounds;
}
+}
+
+void FlowGraphBuilder::BuildArgumentTypeChecks(
+ Fragment* explicit_checks,
+ Fragment* implicit_checks,
+ Fragment* implicit_redefinitions) {
+ const Function& dart_function = parsed_function_->function();
+
+ const Function* forwarding_target = nullptr;
+ if (parsed_function_->is_forwarding_stub()) {
+ forwarding_target = parsed_function_->forwarding_stub_super_target();
+ ASSERT(!forwarding_target->IsNull());
+ }
const intptr_t num_params = dart_function.NumParameters();
for (intptr_t i = dart_function.NumImplicitParameters(); i < num_params;
@@ -2045,8 +2064,32 @@
LocalVariable* has_named_params = nullptr;
LocalVariable* parameter_names = nullptr;
LocalVariable* type_parameters = nullptr;
+ LocalVariable* closure_data = nullptr;
+ LocalVariable* default_tav_info = nullptr;
+ LocalVariable* instantiator_type_args = nullptr;
+ LocalVariable* parent_function_type_args = nullptr;
};
+Fragment FlowGraphBuilder::TestClosureFunctionGeneric(
+ const ClosureCallInfo& info,
+ Fragment generic,
+ Fragment not_generic) {
+ JoinEntryInstr* after_branch = BuildJoinEntry();
+
+ Fragment check;
+ check += LoadLocal(info.type_parameters);
+ TargetEntryInstr *is_not_generic, *is_generic;
+ check += BranchIfNull(&is_not_generic, &is_generic);
+
+ generic.Prepend(is_generic);
+ generic += Goto(after_branch);
+
+ not_generic.Prepend(is_not_generic);
+ not_generic += Goto(after_branch);
+
+ return Fragment(check.entry, after_branch);
+}
+
Fragment FlowGraphBuilder::TestClosureFunctionNamedParameterRequired(
const ClosureCallInfo& info,
Fragment set,
@@ -2094,7 +2137,7 @@
check_required.current = valid_index;
check_required += LoadLocal(info.parameter_names);
check_required += LoadLocal(flags_index);
- check_required += LoadIndexed(compiler::target::kWordSize);
+ check_required += LoadIndexed(kArrayCid);
check_required += LoadLocal(opt_index);
check_required +=
IntConstant(compiler::target::kNumParameterFlagsPerElement - 1);
@@ -2126,6 +2169,101 @@
return check_required;
}
+Fragment FlowGraphBuilder::BuildClosureCallDefaultTypeHandling(
+ const ClosureCallInfo& info) {
+ if (info.descriptor.TypeArgsLen() > 0) {
+ ASSERT(parsed_function_->function_type_arguments() != nullptr);
+ // A TAV was provided, so we don't need default type argument handling
+ // and can just take the arguments we were given.
+ Fragment store_provided;
+ store_provided += LoadLocal(parsed_function_->function_type_arguments());
+ store_provided += StoreLocal(info.vars->function_type_args);
+ store_provided += Drop();
+ return store_provided;
+ }
+
+ // Load the defaults, instantiating or replacing them with the other type
+ // arguments as appropriate.
+ Fragment store_default;
+ store_default += LoadLocal(info.default_tav_info);
+ static_assert(
+ Function::DefaultTypeArgumentsKindField::shift() == 0,
+ "Need to generate shift for DefaultTypeArgumentsKindField bit field");
+ store_default += IntConstant(Function::DefaultTypeArgumentsKindField::mask());
+ store_default += SmiBinaryOp(Token::kBIT_AND);
+ LocalVariable* default_tav_kind = MakeTemporary("default_tav_kind");
+
+ // One read-only stack values (default_tav_kind) that must be dropped after
+ // rejoining at done.
+ JoinEntryInstr* done = BuildJoinEntry();
+
+ store_default += LoadLocal(default_tav_kind);
+ TargetEntryInstr *is_instantiated, *is_not_instantiated;
+ store_default += IntConstant(static_cast<intptr_t>(
+ Function::DefaultTypeArgumentsKind::kIsInstantiated));
+ store_default += BranchIfEqual(&is_instantiated, &is_not_instantiated);
+ store_default.current = is_not_instantiated; // Check next case.
+ store_default += LoadLocal(default_tav_kind);
+ TargetEntryInstr *needs_instantiation, *can_share;
+ store_default += IntConstant(static_cast<intptr_t>(
+ Function::DefaultTypeArgumentsKind::kNeedsInstantiation));
+ store_default += BranchIfEqual(&needs_instantiation, &can_share);
+ store_default.current = can_share; // Check next case.
+ store_default += LoadLocal(default_tav_kind);
+ TargetEntryInstr *can_share_instantiator, *can_share_function;
+ store_default += IntConstant(static_cast<intptr_t>(
+ Function::DefaultTypeArgumentsKind::kSharesInstantiatorTypeArguments));
+ store_default += BranchIfEqual(&can_share_instantiator, &can_share_function);
+
+ Fragment instantiated(is_instantiated);
+ instantiated += LoadLocal(info.closure_data);
+ instantiated += LoadNativeField(Slot::ClosureData_default_type_arguments());
+ instantiated += StoreLocal(info.vars->function_type_args);
+ instantiated += Drop();
+ instantiated += Goto(done);
+
+ Fragment do_instantiation(needs_instantiation);
+ // Load the instantiator type arguments.
+ do_instantiation += LoadLocal(info.instantiator_type_args);
+ // Load the parent function type arguments. (No local function type arguments
+ // can be used within the defaults).
+ do_instantiation += LoadLocal(info.parent_function_type_args);
+ // Load the default type arguments to instantiate.
+ do_instantiation += LoadLocal(info.closure_data);
+ do_instantiation +=
+ LoadNativeField(Slot::ClosureData_default_type_arguments());
+ do_instantiation += InstantiateDynamicTypeArguments();
+ do_instantiation += StoreLocal(info.vars->function_type_args);
+ do_instantiation += Drop();
+ do_instantiation += Goto(done);
+
+ Fragment share_instantiator(can_share_instantiator);
+ share_instantiator += LoadLocal(info.instantiator_type_args);
+ share_instantiator += StoreLocal(info.vars->function_type_args);
+ share_instantiator += Drop();
+ share_instantiator += Goto(done);
+
+ Fragment share_function(can_share_function);
+ // Since the defaults won't have local type parameters, these must all be
+ // from the parent function type arguments, so we can just use it.
+ share_function += LoadLocal(info.parent_function_type_args);
+ share_function += StoreLocal(info.vars->function_type_args);
+ share_function += Drop();
+ share_function += Goto(done);
+
+ store_default.current = done; // Return here after branching.
+ store_default += DropTemporary(&default_tav_kind);
+
+ Fragment store_delayed;
+ store_delayed += LoadLocal(info.closure);
+ store_delayed += LoadNativeField(Slot::Closure_delayed_type_arguments());
+ store_delayed += StoreLocal(info.vars->function_type_args);
+ store_delayed += Drop();
+
+ // Use the delayed type args if present, else the default ones.
+ return TestDelayedTypeArgs(info.closure, store_delayed, store_default);
+}
+
Fragment FlowGraphBuilder::BuildClosureCallNamedArgumentsCheck(
const ClosureCallInfo& info) {
// When no named arguments are provided, we just need to check for possible
@@ -2189,7 +2327,7 @@
// First load the name we need to check against.
loop_body += LoadLocal(info.parameter_names);
loop_body += LoadLocal(info.vars->current_param_index);
- loop_body += LoadIndexed(compiler::target::kWordSize);
+ loop_body += LoadIndexed(kArrayCid);
LocalVariable* param_name = MakeTemporary("param_name"); // Read only.
// One additional local value on the stack within the loop body (param_name)
@@ -2349,31 +2487,98 @@
return check_entry;
}
+Fragment FlowGraphBuilder::BuildClosureCallTypeArgumentsTypeCheck(
+ const ClosureCallInfo& info) {
+ JoinEntryInstr* done = BuildJoinEntry();
+ JoinEntryInstr* loop = BuildJoinEntry();
+
+ // We assume that the value stored in :t_type_parameters is not null (i.e.,
+ // the function stored in :t_function is generic).
+ Fragment loop_init;
+ // Loop over the type parameters array.
+ loop_init += IntConstant(0);
+ loop_init += StoreLocal(info.vars->current_param_index);
+ loop_init += Drop();
+ loop_init += Goto(loop);
+
+ Fragment loop_check(loop);
+ loop_check += LoadLocal(info.vars->current_param_index);
+ loop_check += LoadLocal(info.type_parameters);
+ loop_check += LoadNativeField(Slot::TypeArguments_length());
+ loop_check += SmiRelationalOp(Token::kLT);
+ TargetEntryInstr *more, *no_more;
+ loop_check += BranchIfTrue(&more, &no_more);
+
+ Fragment(no_more) + Goto(done);
+
+ Fragment loop_body(more);
+ loop_body += LoadLocal(info.type_parameters);
+ loop_body += LoadLocal(info.vars->current_param_index);
+ loop_body += LoadIndexed(kTypeArgumentsCid);
+ LocalVariable* current_param = MakeTemporary("current_param"); // Read-only.
+
+ // One read-only local variable on stack (param) to drop after joining.
+ JoinEntryInstr* next = BuildJoinEntry();
+
+ loop_body += LoadLocal(current_param);
+ loop_body += LoadNativeField(Slot::TypeParameter_flags());
+ loop_body += Box(kUnboxedUint8);
+ loop_body += IntConstant(
+ TypeParameterLayout::GenericCovariantImplBit::mask_in_place());
+ loop_body += SmiBinaryOp(Token::kBIT_AND);
+ loop_body += IntConstant(0);
+ TargetEntryInstr *is_noncovariant, *is_covariant;
+ loop_body += BranchIfEqual(&is_noncovariant, &is_covariant);
+
+ Fragment(is_covariant) + Goto(next); // Continue if covariant.
+
+ loop_body.current = is_noncovariant; // Type check if non-covariant.
+ loop_body += LoadLocal(info.instantiator_type_args);
+ loop_body += LoadLocal(info.vars->function_type_args);
+ // Load parameter.
+ loop_body += LoadLocal(current_param);
+ // Load bounds from parameter.
+ loop_body += LoadLocal(current_param);
+ loop_body += LoadNativeField(Slot::TypeParameter_bound());
+ // Load name from parameter.
+ loop_body += LoadLocal(current_param);
+ loop_body += LoadNativeField(Slot::TypeParameter_name());
+ // Assert that the type the parameter is instantiated as is consistent with
+ // the bounds of the parameter.
+ loop_body += AssertSubtype(TokenPosition::kNoSource);
+ loop_body += Goto(next);
+
+ Fragment loop_incr(next);
+ loop_incr += DropTemporary(¤t_param);
+ loop_incr += LoadLocal(info.vars->current_param_index);
+ loop_incr += IntConstant(1);
+ loop_incr += SmiBinaryOp(Token::kADD, /*is_truncating=*/true);
+ loop_incr += StoreLocal(info.vars->current_param_index);
+ loop_incr += Drop();
+ loop_incr += Goto(loop);
+
+ return Fragment(loop_init.entry, done);
+}
+
Fragment FlowGraphBuilder::BuildDynamicClosureCallChecks(
LocalVariable* closure) {
ClosureCallInfo info(closure, BuildThrowNoSuchMethod(),
saved_args_desc_array(),
parsed_function_->dynamic_closure_call_vars());
- // We extract all the packed fields here so code generation that puts unboxed
- // integers on the expression stack even in unoptimized code is in one place.
- auto const rep = Slot::Function_packed_fields().representation();
-
Fragment body;
body += LoadLocal(info.closure);
body += LoadNativeField(Slot::Closure_function());
info.function = MakeTemporary("function");
body += LoadLocal(info.function);
- body += LoadNativeField(Slot::Function_packed_fields());
- body +=
- BuildExtractPackedFieldIntoSmi<Function::PackedNumFixedParameters>(rep);
+ body += BuildExtractUnboxedSlotBitFieldIntoSmi<
+ Function::PackedNumFixedParameters>(Slot::Function_packed_fields());
info.num_fixed_params = MakeTemporary("num_fixed_params");
body += LoadLocal(info.function);
- body += LoadNativeField(Slot::Function_packed_fields());
- body += BuildExtractPackedFieldIntoSmi<Function::PackedNumOptionalParameters>(
- rep);
+ body += BuildExtractUnboxedSlotBitFieldIntoSmi<
+ Function::PackedNumOptionalParameters>(Slot::Function_packed_fields());
info.num_opt_params = MakeTemporary("num_opt_params");
body += LoadLocal(info.num_fixed_params);
@@ -2382,9 +2587,10 @@
info.num_max_params = MakeTemporary("num_max_params");
body += LoadLocal(info.function);
- body += LoadNativeField(Slot::Function_packed_fields());
- body += BuildExtractPackedFieldIntoSmi<
- Function::PackedHasNamedOptionalParameters>(rep);
+ body += BuildExtractUnboxedSlotBitFieldIntoSmi<
+ Function::PackedHasNamedOptionalParameters>(
+ Slot::Function_packed_fields());
+
body += IntConstant(0);
body += StrictCompare(Token::kNE_STRICT);
info.has_named_params = MakeTemporary("has_named_params");
@@ -2395,21 +2601,86 @@
info.parameter_names = MakeTemporary("parameter_names");
}
- if (info.descriptor.TypeArgsLen() > 0) {
- body += LoadLocal(info.function);
- body += LoadNativeField(Slot::Function_type_parameters());
- info.type_parameters = MakeTemporary("type_parameters");
- }
+ body += LoadLocal(info.function);
+ body += LoadNativeField(Slot::Function_type_parameters());
+ info.type_parameters = MakeTemporary("type_parameters");
- // Check that the shape of the arguments generally matches what the
- // closure function expects. The only remaining non-type check after this
- // is that the names for optional arguments are valid.
+ body += LoadLocal(info.closure);
+ body += LoadNativeField(Slot::Closure_instantiator_type_arguments());
+ info.instantiator_type_args = MakeTemporary("instantiator_type_args");
+
+ body += LoadLocal(info.closure);
+ body += LoadNativeField(Slot::Closure_function_type_arguments());
+ info.parent_function_type_args = MakeTemporary("parent_function_type_args");
+
+ // At this point, all the read-only temporaries stored in the ClosureCallInfo
+ // should be either loaded or still nullptr, if not needed for this function.
+ // Now we check that the arguments to the closure call have the right shape.
body += BuildClosureCallArgumentsValidCheck(info);
- // TODO(dartbug.com/40813): Move checks that are currently compiled
- // in the closure body to here, using the dynamic versions of
- // AssertSubtype to typecheck the type arguments using the runtime types
- // available in the closure object.
+ // If the closure function is not generic, there are no local function type
+ // args. Thus, use whatever was stored for the parent function type arguments,
+ // which has already been checked against any parent type parameter bounds.
+ Fragment not_generic;
+ not_generic += LoadLocal(info.parent_function_type_args);
+ not_generic += StoreLocal(info.vars->function_type_args);
+ not_generic += Drop();
+
+ // If the closure function is generic, then we first need to calculate the
+ // full set of function type arguments, then check the local function type
+ // arguments against the closure function's type parameter bounds.
+ Fragment generic;
+ generic += LoadLocal(info.function);
+ generic += LoadNativeField(Slot::Function_data());
+ info.closure_data = MakeTemporary("closure_data");
+ generic += LoadLocal(info.closure_data);
+ generic += LoadNativeField(Slot::ClosureData_default_type_arguments_info());
+ info.default_tav_info = MakeTemporary("default_tav_info");
+ // Calculate the local function type arguments and store them in
+ // info.vars->function_type_args.
+ generic += BuildClosureCallDefaultTypeHandling(info);
+ // Load the local function type args.
+ generic += LoadLocal(info.vars->function_type_args);
+ // Load the parent function type args.
+ generic += LoadLocal(info.parent_function_type_args);
+ // Load the number of parent type parameters.
+ generic += LoadLocal(info.default_tav_info);
+ static_assert(Function::NumParentTypeParametersField::shift() > 0,
+ "No need to shift for NumParentTypeParametersField bit field");
+ generic += IntConstant(Function::NumParentTypeParametersField::shift());
+ generic += SmiBinaryOp(Token::kSHR);
+ generic += IntConstant(Function::NumParentTypeParametersField::mask());
+ generic += SmiBinaryOp(Token::kBIT_AND);
+ // Load the number of total type parameters.
+ LocalVariable* num_parents = MakeTemporary();
+ generic += LoadLocal(info.type_parameters);
+ generic += LoadNativeField(Slot::TypeArguments_length());
+ generic += LoadLocal(num_parents);
+ generic += SmiBinaryOp(Token::kADD, /*is_truncating=*/true);
+
+ // Call the static function for prepending type arguments.
+ generic += StaticCall(TokenPosition::kNoSource,
+ PrependTypeArgumentsFunction(), 4, ICData::kStatic);
+ generic += StoreLocal(info.vars->function_type_args);
+ generic += Drop();
+ generic += DropTemporary(&info.default_tav_info);
+ generic += DropTemporary(&info.closure_data);
+
+ // Now that we have the full set of function type arguments, check them
+ // against the type parameter bounds. However, if the local function type
+ // arguments are delayed type arguments, they have already been checked by
+ // the type system and need not be checked again at the call site.
+ auto const check_bounds = BuildClosureCallTypeArgumentsTypeCheck(info);
+ if (FLAG_eliminate_type_checks) {
+ generic += TestDelayedTypeArgs(info.closure, /*present=*/{},
+ /*absent=*/check_bounds);
+ } else {
+ generic += check_bounds;
+ }
+
+ // Call the appropriate fragment for setting up the function type arguments
+ // and performing any needed type argument checking.
+ body += TestClosureFunctionGeneric(info, generic, not_generic);
// TODO(dartbug.com/40813): Move checks that are currently compiled
// in the closure body to here, using the dynamic versions of
@@ -2417,9 +2688,9 @@
// available in the closure object.
// Drop all the read-only temporaries at the end of the fragment.
- if (info.type_parameters != nullptr) {
- body += DropTemporary(&info.type_parameters);
- }
+ body += DropTemporary(&info.parent_function_type_args);
+ body += DropTemporary(&info.instantiator_type_args);
+ body += DropTemporary(&info.type_parameters);
if (info.parameter_names != nullptr) {
body += DropTemporary(&info.parameter_names);
}
@@ -2579,9 +2850,13 @@
kWordSize * compiler::target::frame_layout.param_end_from_fp);
}
+ if (function.NeedsTypeArgumentTypeChecks()) {
+ BuildTypeArgumentTypeChecks(TypeChecksToBuild::kCheckAllTypeParameterBounds,
+ &body);
+ }
+
if (function.NeedsArgumentTypeChecks()) {
- BuildArgumentTypeChecks(TypeChecksToBuild::kCheckAllTypeParameterBounds,
- &body, &body, nullptr);
+ BuildArgumentTypeChecks(&body, &body, nullptr);
}
body += MakeTemp();
@@ -2939,26 +3214,23 @@
const Fragment default_type_handling = BuildDefaultTypeHandling(function);
- // We're going to throw away the explicit checks because the target will
- // always check them.
Fragment implicit_checks;
- if (function.NeedsArgumentTypeChecks()) {
+ if (function.NeedsTypeArgumentTypeChecks() &&
+ (target.is_static() ||
+ MethodCanSkipTypeChecksForNonCovariantTypeArguments(parent))) {
+ BuildTypeArgumentTypeChecks(
+ target.is_static()
+ ? TypeChecksToBuild::kCheckAllTypeParameterBounds
+ : TypeChecksToBuild::kCheckNonCovariantTypeParameterBounds,
+ &implicit_checks);
+ }
+ if (function.NeedsArgumentTypeChecks() &&
+ (target.is_static() ||
+ MethodCanSkipTypeChecksForNonCovariantArguments(parent))) {
+ // We're going to throw away the explicit checks because the target will
+ // always check them.
Fragment explicit_checks_unused;
- if (target.is_static()) {
- // Tearoffs of static methods needs to perform arguments checks since
- // static methods they forward to don't do it themselves.
- BuildArgumentTypeChecks(TypeChecksToBuild::kCheckAllTypeParameterBounds,
- &explicit_checks_unused, &implicit_checks,
- nullptr);
- } else {
- if (MethodCanSkipTypeChecksForNonCovariantArguments(
- parent, ProcedureAttributesMetadata())) {
- // Generate checks that are skipped inside a body of a function.
- BuildArgumentTypeChecks(
- TypeChecksToBuild::kCheckNonCovariantTypeParameterBounds,
- &explicit_checks_unused, &implicit_checks, nullptr);
- }
- }
+ BuildArgumentTypeChecks(&explicit_checks_unused, &implicit_checks, nullptr);
}
Fragment body;
@@ -3187,9 +3459,9 @@
// Build argument type checks that complement those that are emitted in the
// target.
- BuildArgumentTypeChecks(
- TypeChecksToBuild::kCheckNonCovariantTypeParameterBounds, &body, &body,
- nullptr);
+ BuildTypeArgumentTypeChecks(
+ TypeChecksToBuild::kCheckNonCovariantTypeParameterBounds, &body);
+ BuildArgumentTypeChecks(&body, &body, nullptr);
// Push all arguments and invoke the original method.
@@ -3315,8 +3587,7 @@
code += ConvertUnboxedToUntagged(kUnboxedIntPtr);
code += IntConstant(compiler::target::LocalHandle::raw_offset());
code += UnboxTruncate(kUnboxedIntPtr);
- code += LoadIndexedTypedData(kArrayCid, /*index_scale=*/1,
- /*index_unboxed=*/true);
+ code += LoadIndexed(kArrayCid, /*index_scale=*/1, /*index_unboxed=*/true);
return code;
}
@@ -3477,8 +3748,10 @@
const bool signature_contains_handles = marshaller.ContainsHandles();
- BuildArgumentTypeChecks(TypeChecksToBuild::kCheckAllTypeParameterBounds,
- &function_body, &function_body, &function_body);
+ ASSERT(function.CanReceiveDynamicInvocation());
+ BuildTypeArgumentTypeChecks(TypeChecksToBuild::kCheckAllTypeParameterBounds,
+ &function_body);
+ BuildArgumentTypeChecks(&function_body, &function_body, &function_body);
// Null check arguments before we go into the try catch, so that we don't
// catch our own null errors.
@@ -3699,18 +3972,6 @@
code += NullConstant();
code += BranchIfEqual(&then, &otherwise);
- if (throw_new_null_assertion_ == nullptr) {
- const Class& klass = Class::ZoneHandle(
- Z, Library::LookupCoreClass(Symbols::AssertionError()));
- ASSERT(!klass.IsNull());
- const auto& error = klass.EnsureIsFinalized(H.thread());
- ASSERT(error == Error::null());
- throw_new_null_assertion_ =
- &Function::ZoneHandle(Z, klass.LookupStaticFunctionAllowPrivate(
- Symbols::ThrowNewNullAssertion()));
- ASSERT(!throw_new_null_assertion_->IsNull());
- }
-
const Script& script =
Script::Handle(Z, parsed_function_->function().script());
intptr_t line = -1;
@@ -3726,8 +3987,8 @@
null_code += Constant(variable->name());
null_code += IntConstant(line);
null_code += IntConstant(column);
- null_code += StaticCall(variable->token_pos(), *throw_new_null_assertion_, 3,
- ICData::kStatic);
+ null_code += StaticCall(variable->token_pos(),
+ ThrowNewNullAssertionFunction(), 3, ICData::kStatic);
null_code += ThrowException(TokenPosition::kNoSource);
null_code += Drop();
@@ -3750,6 +4011,30 @@
return code;
}
+const Function& FlowGraphBuilder::ThrowNewNullAssertionFunction() {
+ if (throw_new_null_assertion_.IsNull()) {
+ const Class& klass = Class::ZoneHandle(
+ Z, Library::LookupCoreClass(Symbols::AssertionError()));
+ ASSERT(!klass.IsNull());
+ const auto& error = klass.EnsureIsFinalized(H.thread());
+ ASSERT(error == Error::null());
+ throw_new_null_assertion_ = klass.LookupStaticFunctionAllowPrivate(
+ Symbols::ThrowNewNullAssertion());
+ ASSERT(!throw_new_null_assertion_.IsNull());
+ }
+ return throw_new_null_assertion_;
+}
+
+const Function& FlowGraphBuilder::PrependTypeArgumentsFunction() {
+ if (prepend_type_arguments_.IsNull()) {
+ const auto& dart_internal = Library::Handle(Z, Library::InternalLibrary());
+ prepend_type_arguments_ = dart_internal.LookupFunctionAllowPrivate(
+ Symbols::PrependTypeArguments());
+ ASSERT(!prepend_type_arguments_.IsNull());
+ }
+ return prepend_type_arguments_;
+}
+
} // namespace kernel
} // namespace dart
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index 173db75..cd23744 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -82,6 +82,12 @@
struct ClosureCallInfo;
+ // Tests whether the closure function is generic and branches to the
+ // appropriate fragment.
+ Fragment TestClosureFunctionGeneric(const ClosureCallInfo& info,
+ Fragment generic,
+ Fragment not_generic);
+
// Tests whether the function parameter at the given index is required and
// branches to the appropriate fragment. Loads the parameter index to
// check from info.vars->current_param_index.
@@ -90,6 +96,11 @@
Fragment set,
Fragment not_set);
+ // Builds a fragment that, if there are no provided function type arguments,
+ // calculates the appropriate TAV to use instead. Stores either the provided
+ // or calculated function type arguments in vars->function_type_args.
+ Fragment BuildClosureCallDefaultTypeHandling(const ClosureCallInfo& info);
+
// The BuildClosureCall...Check methods differs from the checks built in the
// PrologueBuilder in that they are built for invoke field dispatchers,
// where the ArgumentsDescriptor is known at compile time but the specific
@@ -104,6 +115,11 @@
// function retrieved at runtime from the closure.
Fragment BuildClosureCallArgumentsValidCheck(const ClosureCallInfo& info);
+ // Builds checks that the type arguments of a call are consistent with the
+ // bounds of the closure function type parameters. Assumes that the closure
+ // function is generic.
+ Fragment BuildClosureCallTypeArgumentsTypeCheck(const ClosureCallInfo& info);
+
// Main entry point for building checks.
Fragment BuildDynamicClosureCallChecks(LocalVariable* closure);
@@ -215,6 +231,8 @@
const AbstractType& sub_type,
const AbstractType& super_type,
const String& dst_name);
+ // Assumes destination name, supertype, and subtype are the top of the stack.
+ Fragment AssertSubtype(TokenPosition position);
bool NeedsDebugStepCheck(const Function& function, TokenPosition position);
bool NeedsDebugStepCheck(Value* value, TokenPosition position);
@@ -278,6 +296,16 @@
LocalVariable* LookupVariable(intptr_t kernel_offset);
+ // Build type argument type checks for the current function.
+ // ParsedFunction should have the following information:
+ // - is_forwarding_stub()
+ // - forwarding_stub_super_target()
+ // Scope should be populated with parameter variables including
+ // - needs_type_check()
+ // - is_explicit_covariant_parameter()
+ void BuildTypeArgumentTypeChecks(TypeChecksToBuild mode,
+ Fragment* implicit_checks);
+
// Build argument type checks for the current function.
// ParsedFunction should have the following information:
// - is_forwarding_stub()
@@ -285,8 +313,7 @@
// Scope should be populated with parameter variables including
// - needs_type_check()
// - is_explicit_covariant_parameter()
- void BuildArgumentTypeChecks(TypeChecksToBuild mode,
- Fragment* explicit_checks,
+ void BuildArgumentTypeChecks(Fragment* explicit_checks,
Fragment* implicit_checks,
Fragment* implicit_redefinitions);
@@ -390,19 +417,31 @@
// on the top of the stack. Picks a sequence that keeps unboxed values on the
// expression stack only as needed, switching to Smis as soon as possible.
template <typename T>
- Fragment BuildExtractPackedFieldIntoSmi(Representation rep) {
+ Fragment BuildExtractUnboxedSlotBitFieldIntoSmi(const Slot& slot) {
+ ASSERT(RepresentationUtils::IsUnboxedInteger(slot.representation()));
Fragment instructions;
- // Since kBIT_AND never throws or deoptimizes, we require that the result of
- // masking the field in place fits into a Smi, so we can use Smi operations
- // for the shift.
- static_assert(T::mask_in_place() <= compiler::target::kSmiMax,
- "Cannot fit results of masking in place into a Smi");
- instructions += UnboxedIntConstant(T::mask_in_place(), rep);
- instructions += BinaryIntegerOp(Token::kBIT_AND, rep);
- // Set the range of the definition that will be used as the value in the
- // box so that ValueFitsSmi() can return true even in unoptimized code.
- SetConstantRangeOfCurrentDefinition(instructions, 0, T::mask_in_place());
- instructions += Box(rep);
+ if (!Boxing::RequiresAllocation(slot.representation())) {
+ // We don't need to allocate to box this value, so it already fits in
+ // a Smi (and thus the mask must also).
+ instructions += LoadNativeField(slot);
+ instructions += Box(slot.representation());
+ instructions += IntConstant(T::mask_in_place());
+ instructions += SmiBinaryOp(Token::kBIT_AND);
+ } else {
+ // Since kBIT_AND never throws or deoptimizes, we require that the result
+ // of masking the field in place fits into a Smi, so we can use Smi
+ // operations for the shift.
+ static_assert(T::mask_in_place() <= compiler::target::kSmiMax,
+ "Cannot fit results of masking in place into a Smi");
+ instructions += LoadNativeField(slot);
+ instructions +=
+ UnboxedIntConstant(T::mask_in_place(), slot.representation());
+ instructions += BinaryIntegerOp(Token::kBIT_AND, slot.representation());
+ // Set the range of the definition that will be used as the value in the
+ // box so that ValueFitsSmi() returns true even in unoptimized code.
+ SetConstantRangeOfCurrentDefinition(instructions, 0, T::mask_in_place());
+ instructions += Box(slot.representation());
+ }
if (T::shift() != 0) {
// Only add the shift operation if it's necessary.
instructions += IntConstant(T::shift());
@@ -476,8 +515,19 @@
ActiveClass active_class_;
+ // Cached _PrependTypeArguments.
+ Function& prepend_type_arguments_;
+
+ // Returns the function _PrependTypeArguments from dart:_internal. If the
+ // cached version is null, retrieves it and updates the cache.
+ const Function& PrependTypeArgumentsFunction();
+
// Cached _AssertionError._throwNewNullAssertion.
- Function* throw_new_null_assertion_ = nullptr;
+ Function& throw_new_null_assertion_;
+
+ // Returns the function _AssertionError._throwNewNullAssertion. If the
+ // cached version is null, retrieves it and updates the cache.
+ const Function& ThrowNewNullAssertionFunction();
friend class BreakableBlock;
friend class CatchBlock;
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index b0af83b..59d6362 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -3356,10 +3356,13 @@
default_arg = &BuildTypeWithoutFinalization();
}
parameter.set_default_argument(*default_arg);
-
helper.Finish();
}
+ if (set_on.IsFunction()) {
+ Function::Cast(set_on).UpdateCachedDefaultTypeArguments(Thread::Current());
+ }
+
// Fix bounds and default arguments in all derived type parameters (with
// different nullabilities).
if (active_class->derived_type_parameters != nullptr) {
diff --git a/runtime/vm/compiler/frontend/prologue_builder.cc b/runtime/vm/compiler/frontend/prologue_builder.cc
index b829e8b..7fd8c35 100644
--- a/runtime/vm/compiler/frontend/prologue_builder.cc
+++ b/runtime/vm/compiler/frontend/prologue_builder.cc
@@ -349,7 +349,7 @@
compiler::target::kWordSize);
good += LoadLocal(tuple_diff);
good += SmiBinaryOp(Token::kADD, /* truncate= */ true);
- good += LoadIndexed(/* index_scale = */ compiler::target::kWordSize);
+ good += LoadIndexed(kArrayCid);
}
good += SmiBinaryOp(Token::kSUB, /* truncate= */ true);
good += LoadFpRelativeSlot(
@@ -388,8 +388,7 @@
compiler::target::kWordSize);
copy_args_prologue += LoadLocal(tuple_diff);
copy_args_prologue += SmiBinaryOp(Token::kADD, /* truncate= */ true);
- copy_args_prologue +=
- LoadIndexed(/* index_scale = */ compiler::target::kWordSize);
+ copy_args_prologue += LoadIndexed(kArrayCid);
// first name in sorted list of all names
const String& param_name = String::ZoneHandle(
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index 6e65b8d..c0ac9e9 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -15,11 +15,10 @@
#define T (type_translator_)
#define I Isolate::Current()
-// Returns true if the given method can skip type checks for all arguments
+// Returns true if the given method can skip type checks for all type arguments
// that are not covariant or generic covariant in its implementation.
-bool MethodCanSkipTypeChecksForNonCovariantArguments(
- const Function& method,
- const ProcedureAttributesMetadata& attrs) {
+bool MethodCanSkipTypeChecksForNonCovariantTypeArguments(
+ const Function& method) {
// Dart 2 type system at non-dynamic call sites statically guarantees that
// argument values match declarated parameter types for all non-covariant
// and non-generic-covariant parameters. The same applies to type parameters
@@ -35,7 +34,28 @@
// been fully moved out of closures.
return !method.CanReceiveDynamicInvocation() &&
!(method.IsClosureFunction() &&
- Function::ClosureBodiesContainNonCovariantChecks());
+ Function::ClosureBodiesContainNonCovariantTypeArgumentChecks());
+}
+
+// Returns true if the given method can skip type checks for all arguments
+// that are not covariant or generic covariant in its implementation.
+bool MethodCanSkipTypeChecksForNonCovariantArguments(const Function& method) {
+ // Dart 2 type system at non-dynamic call sites statically guarantees that
+ // argument values match declarated parameter types for all non-covariant
+ // and non-generic-covariant parameters. The same applies to type parameters
+ // bounds for type parameters of generic functions.
+ //
+ // Normally dynamic call sites will call dyn:* forwarders which perform type
+ // checks.
+ //
+ // Though for some kinds of methods (e.g. ffi trampolines called from native
+ // code) we do have to perform type checks for all parameters.
+ //
+ // TODO(dartbug.com/40813): Remove the closure case when argument checks have
+ // been fully moved out of closures.
+ return !method.CanReceiveDynamicInvocation() &&
+ !(method.IsClosureFunction() &&
+ Function::ClosureBodiesContainNonCovariantArgumentChecks());
}
ScopeBuilder::ScopeBuilder(ParsedFunction* parsed_function)
@@ -229,8 +249,10 @@
} else if (function.IsNonImplicitClosureFunction()) {
type_check_mode = kTypeCheckAllParameters;
} else if (function.IsImplicitClosureFunction()) {
- if (MethodCanSkipTypeChecksForNonCovariantArguments(
- Function::Handle(Z, function.parent_function()), attrs)) {
+ if (MethodCanSkipTypeChecksForNonCovariantTypeArguments(
+ Function::Handle(Z, function.parent_function())) &&
+ MethodCanSkipTypeChecksForNonCovariantArguments(
+ Function::Handle(Z, function.parent_function()))) {
// This is a tear-off of an instance method that can not be reached
// from any dynamic invocation. The method would not check any
// parameters except covariant ones and those annotated with
@@ -243,8 +265,9 @@
if (function.is_static()) {
// In static functions we don't check anything.
type_check_mode = kTypeCheckForStaticFunction;
- } else if (MethodCanSkipTypeChecksForNonCovariantArguments(function,
- attrs)) {
+ } else if (MethodCanSkipTypeChecksForNonCovariantTypeArguments(
+ function) &&
+ MethodCanSkipTypeChecksForNonCovariantArguments(function)) {
// If the current function is never a target of a dynamic invocation
// and this parameter is not marked with generic-covariant-impl
// (which means that among all super-interfaces no type parameters
@@ -319,7 +342,8 @@
scope_->InsertParameterAt(pos++, result_->setter_value);
if (is_method &&
- MethodCanSkipTypeChecksForNonCovariantArguments(function, attrs)) {
+ MethodCanSkipTypeChecksForNonCovariantTypeArguments(function) &&
+ MethodCanSkipTypeChecksForNonCovariantArguments(function)) {
if (field.is_covariant()) {
result_->setter_value->set_is_explicit_covariant_parameter();
} else if (!field.is_generic_covariant_impl() ||
diff --git a/runtime/vm/compiler/frontend/scope_builder.h b/runtime/vm/compiler/frontend/scope_builder.h
index 4f53fbd..33e24b3 100644
--- a/runtime/vm/compiler/frontend/scope_builder.h
+++ b/runtime/vm/compiler/frontend/scope_builder.h
@@ -230,11 +230,14 @@
DISALLOW_COPY_AND_ASSIGN(ScopeBuildingResult);
};
+// Returns true if the given method can skip type checks for all type arguments
+// that are not covariant or generic covariant in its implementation.
+bool MethodCanSkipTypeChecksForNonCovariantTypeArguments(
+ const Function& method);
+
// Returns true if the given method can skip type checks for all arguments
// that are not covariant or generic covariant in its implementation.
-bool MethodCanSkipTypeChecksForNonCovariantArguments(
- const Function& method,
- const ProcedureAttributesMetadata& attrs);
+bool MethodCanSkipTypeChecksForNonCovariantArguments(const Function& method);
} // namespace kernel
} // namespace dart
diff --git a/runtime/vm/compiler/runtime_api.cc b/runtime/vm/compiler/runtime_api.cc
index 4c9c03c..e83406a 100644
--- a/runtime/vm/compiler/runtime_api.cc
+++ b/runtime/vm/compiler/runtime_api.cc
@@ -444,6 +444,8 @@
case kArrayCid:
case kImmutableArrayCid:
return Array::data_offset();
+ case kTypeArgumentsCid:
+ return TypeArguments::types_offset();
case kOneByteStringCid:
return OneByteString::data_offset();
case kTwoByteStringCid:
@@ -462,6 +464,7 @@
switch (cid) {
case kArrayCid:
case kImmutableArrayCid:
+ case kTypeArgumentsCid:
return kWordSize;
case kOneByteStringCid:
return dart::OneByteString::kBytesPerElement;
diff --git a/runtime/vm/compiler/runtime_api.h b/runtime/vm/compiler/runtime_api.h
index 89d4a81..a7e9547 100644
--- a/runtime/vm/compiler/runtime_api.h
+++ b/runtime/vm/compiler/runtime_api.h
@@ -492,7 +492,9 @@
class Function : public AllStatic {
public:
static word code_offset();
+ static word data_offset();
static word entry_point_offset(CodeEntryKind kind = CodeEntryKind::kNormal);
+ static word kind_tag_offset();
static word packed_fields_offset();
static word parameter_names_offset();
static word parameter_types_offset();
@@ -899,6 +901,9 @@
class TypeParameter : public AllStatic {
public:
+ static word bound_offset();
+ static word flags_offset();
+ static word name_offset();
static word InstanceSize();
static word NextFieldOffset();
static word parameterized_class_id_offset();
@@ -1064,6 +1069,8 @@
static word invoke_dart_code_stub_offset();
static word interpret_call_entry_point_offset();
static word invoke_dart_code_from_bytecode_stub_offset();
+ static word late_initialization_error_shared_without_fpu_regs_stub_offset();
+ static word late_initialization_error_shared_with_fpu_regs_stub_offset();
static word null_error_shared_without_fpu_regs_stub_offset();
static word null_error_shared_with_fpu_regs_stub_offset();
static word null_arg_error_shared_without_fpu_regs_stub_offset();
@@ -1252,6 +1259,8 @@
class ClosureData : public AllStatic {
public:
+ static word default_type_arguments_offset();
+ static word default_type_arguments_info_offset();
static word InstanceSize();
static word NextFieldOffset();
};
@@ -1326,8 +1335,11 @@
static word length_offset();
static word nullability_offset();
static word type_at_offset(intptr_t i);
+ static word types_offset();
static word InstanceSize();
static word NextFieldOffset();
+
+ static const word kMaxElements;
};
class FreeListElement : public AllStatic {
diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h
index 7873607..e2196c5 100644
--- a/runtime/vm/compiler/runtime_offsets_extracted.h
+++ b/runtime/vm/compiler/runtime_offsets_extracted.h
@@ -59,6 +59,8 @@
static constexpr dart::compiler::target::word
SubtypeTestCache_kTestEntryLength = 7;
static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+ 268435455;
static constexpr dart::compiler::target::word
AbstractType_type_test_stub_entry_point_offset = 4;
static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -99,6 +101,10 @@
static constexpr dart::compiler::target::word Closure_hash_offset = 24;
static constexpr dart::compiler::target::word
Closure_instantiator_type_arguments_offset = 4;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_info_offset = 24;
static constexpr dart::compiler::target::word Code_object_pool_offset = 20;
static constexpr dart::compiler::target::word Code_saved_instructions_offset =
24;
@@ -124,8 +130,10 @@
static constexpr dart::compiler::target::word Field_is_nullable_offset = 50;
static constexpr dart::compiler::target::word Field_kind_bits_offset = 58;
static constexpr dart::compiler::target::word Function_code_offset = 44;
+static constexpr dart::compiler::target::word Function_data_offset = 36;
static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
4, 8};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 64;
static constexpr dart::compiler::target::word Function_packed_fields_offset =
68;
static constexpr dart::compiler::target::word Function_parameter_names_offset =
@@ -209,155 +217,159 @@
static constexpr dart::compiler::target::word String_length_offset = 4;
static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 4;
static constexpr dart::compiler::target::word
- Thread_AllocateArray_entry_point_offset = 376;
+ Thread_AllocateArray_entry_point_offset = 384;
static constexpr dart::compiler::target::word Thread_active_exception_offset =
- 724;
+ 732;
static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
- 728;
+ 736;
static constexpr dart::compiler::target::word
Thread_array_write_barrier_code_offset = 128;
static constexpr dart::compiler::target::word
- Thread_array_write_barrier_entry_point_offset = 268;
+ Thread_array_write_barrier_entry_point_offset = 276;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_with_fpu_regs_entry_point_offset = 276;
+ Thread_allocate_mint_with_fpu_regs_entry_point_offset = 284;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_with_fpu_regs_stub_offset = 184;
+ Thread_allocate_mint_with_fpu_regs_stub_offset = 192;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_without_fpu_regs_entry_point_offset = 280;
+ Thread_allocate_mint_without_fpu_regs_entry_point_offset = 288;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_without_fpu_regs_stub_offset = 188;
+ Thread_allocate_mint_without_fpu_regs_stub_offset = 196;
static constexpr dart::compiler::target::word
- Thread_allocate_object_entry_point_offset = 284;
+ Thread_allocate_object_entry_point_offset = 292;
static constexpr dart::compiler::target::word
- Thread_allocate_object_stub_offset = 192;
+ Thread_allocate_object_stub_offset = 200;
static constexpr dart::compiler::target::word
- Thread_allocate_object_parameterized_entry_point_offset = 288;
+ Thread_allocate_object_parameterized_entry_point_offset = 296;
static constexpr dart::compiler::target::word
- Thread_allocate_object_parameterized_stub_offset = 196;
+ Thread_allocate_object_parameterized_stub_offset = 204;
static constexpr dart::compiler::target::word
- Thread_allocate_object_slow_entry_point_offset = 292;
+ Thread_allocate_object_slow_entry_point_offset = 300;
static constexpr dart::compiler::target::word
- Thread_allocate_object_slow_stub_offset = 200;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 760;
+ Thread_allocate_object_slow_stub_offset = 208;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 768;
static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
96;
static constexpr dart::compiler::target::word
- Thread_auto_scope_native_wrapper_entry_point_offset = 336;
+ Thread_auto_scope_native_wrapper_entry_point_offset = 344;
static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
static constexpr dart::compiler::target::word Thread_bool_true_offset = 116;
static constexpr dart::compiler::target::word
- Thread_bootstrap_native_wrapper_entry_point_offset = 328;
+ Thread_bootstrap_native_wrapper_entry_point_offset = 336;
static constexpr dart::compiler::target::word
- Thread_call_to_runtime_entry_point_offset = 272;
+ Thread_call_to_runtime_entry_point_offset = 280;
static constexpr dart::compiler::target::word
Thread_call_to_runtime_stub_offset = 148;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 768;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 776;
static constexpr dart::compiler::target::word
Thread_dispatch_table_array_offset = 48;
static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
- 312;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 228;
+ 320;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 236;
static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
- 316;
+ 324;
static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
- 232;
+ 240;
static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
- 356;
+ 364;
static constexpr dart::compiler::target::word
- Thread_double_negate_address_offset = 352;
+ Thread_double_negate_address_offset = 360;
static constexpr dart::compiler::target::word Thread_end_offset = 56;
static constexpr dart::compiler::target::word
- Thread_enter_safepoint_stub_offset = 252;
+ Thread_enter_safepoint_stub_offset = 260;
static constexpr dart::compiler::target::word Thread_execution_state_offset =
- 744;
+ 752;
static constexpr dart::compiler::target::word
- Thread_exit_safepoint_stub_offset = 256;
+ Thread_exit_safepoint_stub_offset = 264;
static constexpr dart::compiler::target::word
- Thread_call_native_through_safepoint_stub_offset = 260;
+ Thread_call_native_through_safepoint_stub_offset = 268;
static constexpr dart::compiler::target::word
- Thread_call_native_through_safepoint_entry_point_offset = 320;
+ Thread_call_native_through_safepoint_entry_point_offset = 328;
static constexpr dart::compiler::target::word
Thread_fix_allocation_stub_code_offset = 136;
static constexpr dart::compiler::target::word
Thread_fix_callers_target_code_offset = 132;
static constexpr dart::compiler::target::word
- Thread_float_absolute_address_offset = 368;
+ Thread_float_absolute_address_offset = 376;
static constexpr dart::compiler::target::word
- Thread_float_negate_address_offset = 364;
+ Thread_float_negate_address_offset = 372;
static constexpr dart::compiler::target::word Thread_float_not_address_offset =
- 360;
+ 368;
static constexpr dart::compiler::target::word
- Thread_float_zerow_address_offset = 372;
+ Thread_float_zerow_address_offset = 380;
static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
- 732;
+ 740;
static constexpr dart::compiler::target::word
- Thread_interpret_call_entry_point_offset = 340;
+ Thread_interpret_call_entry_point_offset = 348;
static constexpr dart::compiler::target::word
Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
static constexpr dart::compiler::target::word
Thread_invoke_dart_code_stub_offset = 140;
static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
- 756;
+ 764;
static constexpr dart::compiler::target::word Thread_isolate_offset = 44;
static constexpr dart::compiler::target::word Thread_field_table_values_offset =
68;
static constexpr dart::compiler::target::word
- Thread_lazy_deopt_from_return_stub_offset = 236;
+ Thread_lazy_deopt_from_return_stub_offset = 244;
static constexpr dart::compiler::target::word
- Thread_lazy_deopt_from_throw_stub_offset = 240;
+ Thread_lazy_deopt_from_throw_stub_offset = 248;
static constexpr dart::compiler::target::word
- Thread_lazy_specialize_type_test_stub_offset = 248;
+ Thread_lazy_specialize_type_test_stub_offset = 256;
static constexpr dart::compiler::target::word
Thread_marking_stack_block_offset = 84;
static constexpr dart::compiler::target::word
- Thread_megamorphic_call_checked_entry_offset = 304;
+ Thread_megamorphic_call_checked_entry_offset = 312;
static constexpr dart::compiler::target::word
- Thread_switchable_call_miss_entry_offset = 308;
+ Thread_switchable_call_miss_entry_offset = 316;
static constexpr dart::compiler::target::word
- Thread_switchable_call_miss_stub_offset = 212;
+ Thread_switchable_call_miss_stub_offset = 220;
static constexpr dart::compiler::target::word
- Thread_no_scope_native_wrapper_entry_point_offset = 332;
+ Thread_no_scope_native_wrapper_entry_point_offset = 340;
static constexpr dart::compiler::target::word
- Thread_null_error_shared_with_fpu_regs_stub_offset = 156;
+ Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 156;
static constexpr dart::compiler::target::word
- Thread_null_error_shared_without_fpu_regs_stub_offset = 152;
+ Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 152;
static constexpr dart::compiler::target::word
- Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 164;
+ Thread_null_error_shared_with_fpu_regs_stub_offset = 164;
static constexpr dart::compiler::target::word
- Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 160;
+ Thread_null_error_shared_without_fpu_regs_stub_offset = 160;
static constexpr dart::compiler::target::word
- Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 172;
+ Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 172;
static constexpr dart::compiler::target::word
- Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 168;
+ Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 168;
static constexpr dart::compiler::target::word
- Thread_range_error_shared_with_fpu_regs_stub_offset = 180;
+ Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 180;
static constexpr dart::compiler::target::word
- Thread_range_error_shared_without_fpu_regs_stub_offset = 176;
+ Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 176;
+static constexpr dart::compiler::target::word
+ Thread_range_error_shared_with_fpu_regs_stub_offset = 188;
+static constexpr dart::compiler::target::word
+ Thread_range_error_shared_without_fpu_regs_stub_offset = 184;
static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
static constexpr dart::compiler::target::word
- Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 736;
+ Thread_predefined_symbols_address_offset = 352;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 744;
static constexpr dart::compiler::target::word
- Thread_saved_shadow_call_stack_offset = 740;
+ Thread_saved_shadow_call_stack_offset = 748;
static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
- 748;
+ 756;
static constexpr dart::compiler::target::word
- Thread_slow_type_test_stub_offset = 244;
+ Thread_slow_type_test_stub_offset = 252;
static constexpr dart::compiler::target::word
- Thread_slow_type_test_entry_point_offset = 324;
+ Thread_slow_type_test_entry_point_offset = 332;
static constexpr dart::compiler::target::word Thread_stack_limit_offset = 36;
static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
60;
static constexpr dart::compiler::target::word
Thread_stack_overflow_flags_offset = 64;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 300;
+ Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 308;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 208;
+ Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 216;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 296;
+ Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 304;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 204;
+ Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 212;
static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
80;
static constexpr dart::compiler::target::word
@@ -370,10 +382,10 @@
static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
124;
static constexpr dart::compiler::target::word
- Thread_write_barrier_entry_point_offset = 264;
+ Thread_write_barrier_entry_point_offset = 272;
static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
40;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 752;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 760;
static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
static constexpr dart::compiler::target::word Type_arguments_offset = 16;
@@ -390,6 +402,10 @@
static constexpr dart::compiler::target::word TypeArguments_length_offset = 8;
static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
16;
+static constexpr dart::compiler::target::word TypeArguments_types_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 12;
static constexpr dart::compiler::target::word TypeRef_type_offset = 12;
static constexpr dart::compiler::target::word TypedDataBase_length_offset = 8;
static constexpr dart::compiler::target::word TypedDataView_data_offset = 12;
@@ -419,7 +435,7 @@
4, 12, 8, 16};
static constexpr dart::compiler::target::word
Thread_write_barrier_wrappers_thread_offset[] = {
- 692, 696, 700, 704, 708, -1, 712, -1, 716, 720, -1, -1, -1, -1, -1, -1};
+ 700, 704, 708, 712, 716, -1, 720, -1, 724, 728, -1, -1, -1, -1, -1, -1};
static constexpr dart::compiler::target::word ApiError_InstanceSize = 8;
static constexpr dart::compiler::target::word Array_InstanceSize = 12;
static constexpr dart::compiler::target::word Array_header_size = 12;
@@ -428,7 +444,7 @@
static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word Class_InstanceSize = 128;
static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 20;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 28;
static constexpr dart::compiler::target::word Code_InstanceSize = 96;
static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -488,7 +504,7 @@
static constexpr dart::compiler::target::word PatchClass_InstanceSize = 24;
static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 8;
static constexpr dart::compiler::target::word Pointer_InstanceSize = 12;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 12;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 20;
static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 16;
static constexpr dart::compiler::target::word RegExp_InstanceSize = 60;
static constexpr dart::compiler::target::word Script_InstanceSize = 56;
@@ -565,6 +581,8 @@
static constexpr dart::compiler::target::word
SubtypeTestCache_kTestEntryLength = 7;
static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+ 576460752303423487;
static constexpr dart::compiler::target::word
AbstractType_type_test_stub_entry_point_offset = 8;
static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -605,6 +623,10 @@
static constexpr dart::compiler::target::word Closure_hash_offset = 48;
static constexpr dart::compiler::target::word
Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_info_offset = 48;
static constexpr dart::compiler::target::word Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word Code_saved_instructions_offset =
48;
@@ -630,8 +652,10 @@
static constexpr dart::compiler::target::word Field_is_nullable_offset = 90;
static constexpr dart::compiler::target::word Field_kind_bits_offset = 98;
static constexpr dart::compiler::target::word Function_code_offset = 88;
+static constexpr dart::compiler::target::word Function_data_offset = 72;
static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
8, 16};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 120;
static constexpr dart::compiler::target::word Function_packed_fields_offset =
124;
static constexpr dart::compiler::target::word Function_parameter_names_offset =
@@ -716,156 +740,160 @@
static constexpr dart::compiler::target::word String_length_offset = 8;
static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 8;
static constexpr dart::compiler::target::word
- Thread_AllocateArray_entry_point_offset = 736;
+ Thread_AllocateArray_entry_point_offset = 752;
static constexpr dart::compiler::target::word Thread_active_exception_offset =
- 1456;
+ 1472;
static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
- 1464;
+ 1480;
static constexpr dart::compiler::target::word
Thread_array_write_barrier_code_offset = 240;
static constexpr dart::compiler::target::word
- Thread_array_write_barrier_entry_point_offset = 520;
+ Thread_array_write_barrier_entry_point_offset = 536;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+ Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+ Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+ Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+ Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
static constexpr dart::compiler::target::word
- Thread_allocate_object_entry_point_offset = 552;
+ Thread_allocate_object_entry_point_offset = 568;
static constexpr dart::compiler::target::word
- Thread_allocate_object_stub_offset = 368;
+ Thread_allocate_object_stub_offset = 384;
static constexpr dart::compiler::target::word
- Thread_allocate_object_parameterized_entry_point_offset = 560;
+ Thread_allocate_object_parameterized_entry_point_offset = 576;
static constexpr dart::compiler::target::word
- Thread_allocate_object_parameterized_stub_offset = 376;
+ Thread_allocate_object_parameterized_stub_offset = 392;
static constexpr dart::compiler::target::word
- Thread_allocate_object_slow_entry_point_offset = 568;
+ Thread_allocate_object_slow_entry_point_offset = 584;
static constexpr dart::compiler::target::word
- Thread_allocate_object_slow_stub_offset = 384;
+ Thread_allocate_object_slow_stub_offset = 400;
static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
- 1528;
+ 1544;
static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
192;
static constexpr dart::compiler::target::word
- Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+ Thread_auto_scope_native_wrapper_entry_point_offset = 672;
static constexpr dart::compiler::target::word Thread_bool_false_offset = 224;
static constexpr dart::compiler::target::word Thread_bool_true_offset = 216;
static constexpr dart::compiler::target::word
- Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+ Thread_bootstrap_native_wrapper_entry_point_offset = 656;
static constexpr dart::compiler::target::word
- Thread_call_to_runtime_entry_point_offset = 528;
+ Thread_call_to_runtime_entry_point_offset = 544;
static constexpr dart::compiler::target::word
Thread_call_to_runtime_stub_offset = 280;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1544;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1560;
static constexpr dart::compiler::target::word
Thread_dispatch_table_array_offset = 96;
static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
- 608;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 440;
+ 624;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 456;
static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
- 616;
+ 632;
static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
- 448;
+ 464;
static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
- 696;
+ 712;
static constexpr dart::compiler::target::word
- Thread_double_negate_address_offset = 688;
+ Thread_double_negate_address_offset = 704;
static constexpr dart::compiler::target::word Thread_end_offset = 112;
static constexpr dart::compiler::target::word
- Thread_enter_safepoint_stub_offset = 488;
+ Thread_enter_safepoint_stub_offset = 504;
static constexpr dart::compiler::target::word Thread_execution_state_offset =
- 1496;
+ 1512;
static constexpr dart::compiler::target::word
- Thread_exit_safepoint_stub_offset = 496;
+ Thread_exit_safepoint_stub_offset = 512;
static constexpr dart::compiler::target::word
- Thread_call_native_through_safepoint_stub_offset = 504;
+ Thread_call_native_through_safepoint_stub_offset = 520;
static constexpr dart::compiler::target::word
- Thread_call_native_through_safepoint_entry_point_offset = 624;
+ Thread_call_native_through_safepoint_entry_point_offset = 640;
static constexpr dart::compiler::target::word
Thread_fix_allocation_stub_code_offset = 256;
static constexpr dart::compiler::target::word
Thread_fix_callers_target_code_offset = 248;
static constexpr dart::compiler::target::word
- Thread_float_absolute_address_offset = 720;
+ Thread_float_absolute_address_offset = 736;
static constexpr dart::compiler::target::word
- Thread_float_negate_address_offset = 712;
+ Thread_float_negate_address_offset = 728;
static constexpr dart::compiler::target::word Thread_float_not_address_offset =
- 704;
+ 720;
static constexpr dart::compiler::target::word
- Thread_float_zerow_address_offset = 728;
+ Thread_float_zerow_address_offset = 744;
static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
- 1472;
+ 1488;
static constexpr dart::compiler::target::word
- Thread_interpret_call_entry_point_offset = 664;
+ Thread_interpret_call_entry_point_offset = 680;
static constexpr dart::compiler::target::word
Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
static constexpr dart::compiler::target::word
Thread_invoke_dart_code_stub_offset = 264;
static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
- 1520;
+ 1536;
static constexpr dart::compiler::target::word Thread_isolate_offset = 88;
static constexpr dart::compiler::target::word Thread_field_table_values_offset =
136;
static constexpr dart::compiler::target::word
- Thread_lazy_deopt_from_return_stub_offset = 456;
+ Thread_lazy_deopt_from_return_stub_offset = 472;
static constexpr dart::compiler::target::word
- Thread_lazy_deopt_from_throw_stub_offset = 464;
+ Thread_lazy_deopt_from_throw_stub_offset = 480;
static constexpr dart::compiler::target::word
- Thread_lazy_specialize_type_test_stub_offset = 480;
+ Thread_lazy_specialize_type_test_stub_offset = 496;
static constexpr dart::compiler::target::word
Thread_marking_stack_block_offset = 168;
static constexpr dart::compiler::target::word
- Thread_megamorphic_call_checked_entry_offset = 592;
+ Thread_megamorphic_call_checked_entry_offset = 608;
static constexpr dart::compiler::target::word
- Thread_switchable_call_miss_entry_offset = 600;
+ Thread_switchable_call_miss_entry_offset = 616;
static constexpr dart::compiler::target::word
- Thread_switchable_call_miss_stub_offset = 408;
+ Thread_switchable_call_miss_stub_offset = 424;
static constexpr dart::compiler::target::word
- Thread_no_scope_native_wrapper_entry_point_offset = 648;
+ Thread_no_scope_native_wrapper_entry_point_offset = 664;
static constexpr dart::compiler::target::word
- Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+ Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
static constexpr dart::compiler::target::word
- Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+ Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 288;
static constexpr dart::compiler::target::word
- Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+ Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
static constexpr dart::compiler::target::word
- Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+ Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
static constexpr dart::compiler::target::word
- Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+ Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
static constexpr dart::compiler::target::word
- Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+ Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
static constexpr dart::compiler::target::word
- Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+ Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
static constexpr dart::compiler::target::word
- Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+ Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+static constexpr dart::compiler::target::word
+ Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+static constexpr dart::compiler::target::word
+ Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
static constexpr dart::compiler::target::word Thread_object_null_offset = 208;
static constexpr dart::compiler::target::word
- Thread_predefined_symbols_address_offset = 672;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1480;
+ Thread_predefined_symbols_address_offset = 688;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1496;
static constexpr dart::compiler::target::word
- Thread_saved_shadow_call_stack_offset = 1488;
+ Thread_saved_shadow_call_stack_offset = 1504;
static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
- 1504;
+ 1520;
static constexpr dart::compiler::target::word
- Thread_slow_type_test_stub_offset = 472;
+ Thread_slow_type_test_stub_offset = 488;
static constexpr dart::compiler::target::word
- Thread_slow_type_test_entry_point_offset = 632;
+ Thread_slow_type_test_entry_point_offset = 648;
static constexpr dart::compiler::target::word Thread_stack_limit_offset = 72;
static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
120;
static constexpr dart::compiler::target::word
Thread_stack_overflow_flags_offset = 128;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+ Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+ Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+ Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+ Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
160;
static constexpr dart::compiler::target::word
@@ -878,11 +906,11 @@
static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
232;
static constexpr dart::compiler::target::word
- Thread_write_barrier_entry_point_offset = 512;
+ Thread_write_barrier_entry_point_offset = 528;
static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
80;
static constexpr dart::compiler::target::word Thread_callback_code_offset =
- 1512;
+ 1528;
static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
16;
static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -900,6 +928,10 @@
static constexpr dart::compiler::target::word TypeArguments_length_offset = 16;
static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
32;
+static constexpr dart::compiler::target::word TypeArguments_types_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 74;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 24;
static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
@@ -929,8 +961,8 @@
8, 24, 16, 32};
static constexpr dart::compiler::target::word
Thread_write_barrier_wrappers_thread_offset[] = {
- 1368, 1376, 1384, 1392, -1, -1, 1400, 1408,
- 1416, 1424, 1432, -1, 1440, 1448, -1, -1};
+ 1384, 1392, 1400, 1408, -1, -1, 1416, 1424,
+ 1432, 1440, 1448, -1, 1456, 1464, -1, -1};
static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
static constexpr dart::compiler::target::word Array_InstanceSize = 24;
static constexpr dart::compiler::target::word Array_header_size = 24;
@@ -939,7 +971,7 @@
static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word Class_InstanceSize = 208;
static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 56;
static constexpr dart::compiler::target::word Code_InstanceSize = 176;
static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -999,7 +1031,7 @@
static constexpr dart::compiler::target::word PatchClass_InstanceSize = 48;
static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 40;
static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 32;
static constexpr dart::compiler::target::word RegExp_InstanceSize = 120;
static constexpr dart::compiler::target::word Script_InstanceSize = 96;
@@ -1075,6 +1107,8 @@
static constexpr dart::compiler::target::word
SubtypeTestCache_kTestEntryLength = 7;
static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+ 268435455;
static constexpr dart::compiler::target::word
AbstractType_type_test_stub_entry_point_offset = 4;
static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -1115,6 +1149,10 @@
static constexpr dart::compiler::target::word Closure_hash_offset = 24;
static constexpr dart::compiler::target::word
Closure_instantiator_type_arguments_offset = 4;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_info_offset = 24;
static constexpr dart::compiler::target::word Code_object_pool_offset = 20;
static constexpr dart::compiler::target::word Code_saved_instructions_offset =
24;
@@ -1140,8 +1178,10 @@
static constexpr dart::compiler::target::word Field_is_nullable_offset = 50;
static constexpr dart::compiler::target::word Field_kind_bits_offset = 58;
static constexpr dart::compiler::target::word Function_code_offset = 44;
+static constexpr dart::compiler::target::word Function_data_offset = 36;
static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
4, 8};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 64;
static constexpr dart::compiler::target::word Function_packed_fields_offset =
68;
static constexpr dart::compiler::target::word Function_parameter_names_offset =
@@ -1225,155 +1265,159 @@
static constexpr dart::compiler::target::word String_length_offset = 4;
static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 4;
static constexpr dart::compiler::target::word
- Thread_AllocateArray_entry_point_offset = 376;
+ Thread_AllocateArray_entry_point_offset = 384;
static constexpr dart::compiler::target::word Thread_active_exception_offset =
- 692;
+ 700;
static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
- 696;
+ 704;
static constexpr dart::compiler::target::word
Thread_array_write_barrier_code_offset = 128;
static constexpr dart::compiler::target::word
- Thread_array_write_barrier_entry_point_offset = 268;
+ Thread_array_write_barrier_entry_point_offset = 276;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_with_fpu_regs_entry_point_offset = 276;
+ Thread_allocate_mint_with_fpu_regs_entry_point_offset = 284;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_with_fpu_regs_stub_offset = 184;
+ Thread_allocate_mint_with_fpu_regs_stub_offset = 192;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_without_fpu_regs_entry_point_offset = 280;
+ Thread_allocate_mint_without_fpu_regs_entry_point_offset = 288;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_without_fpu_regs_stub_offset = 188;
+ Thread_allocate_mint_without_fpu_regs_stub_offset = 196;
static constexpr dart::compiler::target::word
- Thread_allocate_object_entry_point_offset = 284;
+ Thread_allocate_object_entry_point_offset = 292;
static constexpr dart::compiler::target::word
- Thread_allocate_object_stub_offset = 192;
+ Thread_allocate_object_stub_offset = 200;
static constexpr dart::compiler::target::word
- Thread_allocate_object_parameterized_entry_point_offset = 288;
+ Thread_allocate_object_parameterized_entry_point_offset = 296;
static constexpr dart::compiler::target::word
- Thread_allocate_object_parameterized_stub_offset = 196;
+ Thread_allocate_object_parameterized_stub_offset = 204;
static constexpr dart::compiler::target::word
- Thread_allocate_object_slow_entry_point_offset = 292;
+ Thread_allocate_object_slow_entry_point_offset = 300;
static constexpr dart::compiler::target::word
- Thread_allocate_object_slow_stub_offset = 200;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 728;
+ Thread_allocate_object_slow_stub_offset = 208;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 736;
static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
96;
static constexpr dart::compiler::target::word
- Thread_auto_scope_native_wrapper_entry_point_offset = 336;
+ Thread_auto_scope_native_wrapper_entry_point_offset = 344;
static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
static constexpr dart::compiler::target::word Thread_bool_true_offset = 116;
static constexpr dart::compiler::target::word
- Thread_bootstrap_native_wrapper_entry_point_offset = 328;
+ Thread_bootstrap_native_wrapper_entry_point_offset = 336;
static constexpr dart::compiler::target::word
- Thread_call_to_runtime_entry_point_offset = 272;
+ Thread_call_to_runtime_entry_point_offset = 280;
static constexpr dart::compiler::target::word
Thread_call_to_runtime_stub_offset = 148;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 736;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 744;
static constexpr dart::compiler::target::word
Thread_dispatch_table_array_offset = 48;
static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
- 312;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 228;
+ 320;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 236;
static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
- 316;
+ 324;
static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
- 232;
+ 240;
static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
- 356;
+ 364;
static constexpr dart::compiler::target::word
- Thread_double_negate_address_offset = 352;
+ Thread_double_negate_address_offset = 360;
static constexpr dart::compiler::target::word Thread_end_offset = 56;
static constexpr dart::compiler::target::word
- Thread_enter_safepoint_stub_offset = 252;
+ Thread_enter_safepoint_stub_offset = 260;
static constexpr dart::compiler::target::word Thread_execution_state_offset =
- 712;
+ 720;
static constexpr dart::compiler::target::word
- Thread_exit_safepoint_stub_offset = 256;
+ Thread_exit_safepoint_stub_offset = 264;
static constexpr dart::compiler::target::word
- Thread_call_native_through_safepoint_stub_offset = 260;
+ Thread_call_native_through_safepoint_stub_offset = 268;
static constexpr dart::compiler::target::word
- Thread_call_native_through_safepoint_entry_point_offset = 320;
+ Thread_call_native_through_safepoint_entry_point_offset = 328;
static constexpr dart::compiler::target::word
Thread_fix_allocation_stub_code_offset = 136;
static constexpr dart::compiler::target::word
Thread_fix_callers_target_code_offset = 132;
static constexpr dart::compiler::target::word
- Thread_float_absolute_address_offset = 368;
+ Thread_float_absolute_address_offset = 376;
static constexpr dart::compiler::target::word
- Thread_float_negate_address_offset = 364;
+ Thread_float_negate_address_offset = 372;
static constexpr dart::compiler::target::word Thread_float_not_address_offset =
- 360;
+ 368;
static constexpr dart::compiler::target::word
- Thread_float_zerow_address_offset = 372;
+ Thread_float_zerow_address_offset = 380;
static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
- 700;
+ 708;
static constexpr dart::compiler::target::word
- Thread_interpret_call_entry_point_offset = 340;
+ Thread_interpret_call_entry_point_offset = 348;
static constexpr dart::compiler::target::word
Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
static constexpr dart::compiler::target::word
Thread_invoke_dart_code_stub_offset = 140;
static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
- 724;
+ 732;
static constexpr dart::compiler::target::word Thread_isolate_offset = 44;
static constexpr dart::compiler::target::word Thread_field_table_values_offset =
68;
static constexpr dart::compiler::target::word
- Thread_lazy_deopt_from_return_stub_offset = 236;
+ Thread_lazy_deopt_from_return_stub_offset = 244;
static constexpr dart::compiler::target::word
- Thread_lazy_deopt_from_throw_stub_offset = 240;
+ Thread_lazy_deopt_from_throw_stub_offset = 248;
static constexpr dart::compiler::target::word
- Thread_lazy_specialize_type_test_stub_offset = 248;
+ Thread_lazy_specialize_type_test_stub_offset = 256;
static constexpr dart::compiler::target::word
Thread_marking_stack_block_offset = 84;
static constexpr dart::compiler::target::word
- Thread_megamorphic_call_checked_entry_offset = 304;
+ Thread_megamorphic_call_checked_entry_offset = 312;
static constexpr dart::compiler::target::word
- Thread_switchable_call_miss_entry_offset = 308;
+ Thread_switchable_call_miss_entry_offset = 316;
static constexpr dart::compiler::target::word
- Thread_switchable_call_miss_stub_offset = 212;
+ Thread_switchable_call_miss_stub_offset = 220;
static constexpr dart::compiler::target::word
- Thread_no_scope_native_wrapper_entry_point_offset = 332;
+ Thread_no_scope_native_wrapper_entry_point_offset = 340;
static constexpr dart::compiler::target::word
- Thread_null_error_shared_with_fpu_regs_stub_offset = 156;
+ Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 156;
static constexpr dart::compiler::target::word
- Thread_null_error_shared_without_fpu_regs_stub_offset = 152;
+ Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 152;
static constexpr dart::compiler::target::word
- Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 164;
+ Thread_null_error_shared_with_fpu_regs_stub_offset = 164;
static constexpr dart::compiler::target::word
- Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 160;
+ Thread_null_error_shared_without_fpu_regs_stub_offset = 160;
static constexpr dart::compiler::target::word
- Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 172;
+ Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 172;
static constexpr dart::compiler::target::word
- Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 168;
+ Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 168;
static constexpr dart::compiler::target::word
- Thread_range_error_shared_with_fpu_regs_stub_offset = 180;
+ Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 180;
static constexpr dart::compiler::target::word
- Thread_range_error_shared_without_fpu_regs_stub_offset = 176;
+ Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 176;
+static constexpr dart::compiler::target::word
+ Thread_range_error_shared_with_fpu_regs_stub_offset = 188;
+static constexpr dart::compiler::target::word
+ Thread_range_error_shared_without_fpu_regs_stub_offset = 184;
static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
static constexpr dart::compiler::target::word
- Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 704;
+ Thread_predefined_symbols_address_offset = 352;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 712;
static constexpr dart::compiler::target::word
- Thread_saved_shadow_call_stack_offset = 708;
+ Thread_saved_shadow_call_stack_offset = 716;
static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
- 716;
+ 724;
static constexpr dart::compiler::target::word
- Thread_slow_type_test_stub_offset = 244;
+ Thread_slow_type_test_stub_offset = 252;
static constexpr dart::compiler::target::word
- Thread_slow_type_test_entry_point_offset = 324;
+ Thread_slow_type_test_entry_point_offset = 332;
static constexpr dart::compiler::target::word Thread_stack_limit_offset = 36;
static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
60;
static constexpr dart::compiler::target::word
Thread_stack_overflow_flags_offset = 64;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 300;
+ Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 308;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 208;
+ Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 216;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 296;
+ Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 304;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 204;
+ Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 212;
static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
80;
static constexpr dart::compiler::target::word
@@ -1386,10 +1430,10 @@
static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
124;
static constexpr dart::compiler::target::word
- Thread_write_barrier_entry_point_offset = 264;
+ Thread_write_barrier_entry_point_offset = 272;
static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
40;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 720;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 728;
static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
static constexpr dart::compiler::target::word Type_arguments_offset = 16;
@@ -1406,6 +1450,10 @@
static constexpr dart::compiler::target::word TypeArguments_length_offset = 8;
static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
16;
+static constexpr dart::compiler::target::word TypeArguments_types_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 12;
static constexpr dart::compiler::target::word TypeRef_type_offset = 12;
static constexpr dart::compiler::target::word TypedDataBase_length_offset = 8;
static constexpr dart::compiler::target::word TypedDataView_data_offset = 12;
@@ -1441,7 +1489,7 @@
static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word Class_InstanceSize = 128;
static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 20;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 28;
static constexpr dart::compiler::target::word Code_InstanceSize = 96;
static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -1501,7 +1549,7 @@
static constexpr dart::compiler::target::word PatchClass_InstanceSize = 24;
static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 8;
static constexpr dart::compiler::target::word Pointer_InstanceSize = 12;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 12;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 20;
static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 16;
static constexpr dart::compiler::target::word RegExp_InstanceSize = 60;
static constexpr dart::compiler::target::word Script_InstanceSize = 56;
@@ -1578,6 +1626,8 @@
static constexpr dart::compiler::target::word
SubtypeTestCache_kTestEntryLength = 7;
static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+ 576460752303423487;
static constexpr dart::compiler::target::word
AbstractType_type_test_stub_entry_point_offset = 8;
static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -1618,6 +1668,10 @@
static constexpr dart::compiler::target::word Closure_hash_offset = 48;
static constexpr dart::compiler::target::word
Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_info_offset = 48;
static constexpr dart::compiler::target::word Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word Code_saved_instructions_offset =
48;
@@ -1643,8 +1697,10 @@
static constexpr dart::compiler::target::word Field_is_nullable_offset = 90;
static constexpr dart::compiler::target::word Field_kind_bits_offset = 98;
static constexpr dart::compiler::target::word Function_code_offset = 88;
+static constexpr dart::compiler::target::word Function_data_offset = 72;
static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
8, 16};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 120;
static constexpr dart::compiler::target::word Function_packed_fields_offset =
124;
static constexpr dart::compiler::target::word Function_parameter_names_offset =
@@ -1729,156 +1785,160 @@
static constexpr dart::compiler::target::word String_length_offset = 8;
static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 8;
static constexpr dart::compiler::target::word
- Thread_AllocateArray_entry_point_offset = 736;
+ Thread_AllocateArray_entry_point_offset = 752;
static constexpr dart::compiler::target::word Thread_active_exception_offset =
- 1528;
+ 1544;
static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
- 1536;
+ 1552;
static constexpr dart::compiler::target::word
Thread_array_write_barrier_code_offset = 240;
static constexpr dart::compiler::target::word
- Thread_array_write_barrier_entry_point_offset = 520;
+ Thread_array_write_barrier_entry_point_offset = 536;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+ Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+ Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+ Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+ Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
static constexpr dart::compiler::target::word
- Thread_allocate_object_entry_point_offset = 552;
+ Thread_allocate_object_entry_point_offset = 568;
static constexpr dart::compiler::target::word
- Thread_allocate_object_stub_offset = 368;
+ Thread_allocate_object_stub_offset = 384;
static constexpr dart::compiler::target::word
- Thread_allocate_object_parameterized_entry_point_offset = 560;
+ Thread_allocate_object_parameterized_entry_point_offset = 576;
static constexpr dart::compiler::target::word
- Thread_allocate_object_parameterized_stub_offset = 376;
+ Thread_allocate_object_parameterized_stub_offset = 392;
static constexpr dart::compiler::target::word
- Thread_allocate_object_slow_entry_point_offset = 568;
+ Thread_allocate_object_slow_entry_point_offset = 584;
static constexpr dart::compiler::target::word
- Thread_allocate_object_slow_stub_offset = 384;
+ Thread_allocate_object_slow_stub_offset = 400;
static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
- 1600;
+ 1616;
static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
192;
static constexpr dart::compiler::target::word
- Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+ Thread_auto_scope_native_wrapper_entry_point_offset = 672;
static constexpr dart::compiler::target::word Thread_bool_false_offset = 224;
static constexpr dart::compiler::target::word Thread_bool_true_offset = 216;
static constexpr dart::compiler::target::word
- Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+ Thread_bootstrap_native_wrapper_entry_point_offset = 656;
static constexpr dart::compiler::target::word
- Thread_call_to_runtime_entry_point_offset = 528;
+ Thread_call_to_runtime_entry_point_offset = 544;
static constexpr dart::compiler::target::word
Thread_call_to_runtime_stub_offset = 280;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1616;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1632;
static constexpr dart::compiler::target::word
Thread_dispatch_table_array_offset = 96;
static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
- 608;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 440;
+ 624;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 456;
static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
- 616;
+ 632;
static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
- 448;
+ 464;
static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
- 696;
+ 712;
static constexpr dart::compiler::target::word
- Thread_double_negate_address_offset = 688;
+ Thread_double_negate_address_offset = 704;
static constexpr dart::compiler::target::word Thread_end_offset = 112;
static constexpr dart::compiler::target::word
- Thread_enter_safepoint_stub_offset = 488;
+ Thread_enter_safepoint_stub_offset = 504;
static constexpr dart::compiler::target::word Thread_execution_state_offset =
- 1568;
+ 1584;
static constexpr dart::compiler::target::word
- Thread_exit_safepoint_stub_offset = 496;
+ Thread_exit_safepoint_stub_offset = 512;
static constexpr dart::compiler::target::word
- Thread_call_native_through_safepoint_stub_offset = 504;
+ Thread_call_native_through_safepoint_stub_offset = 520;
static constexpr dart::compiler::target::word
- Thread_call_native_through_safepoint_entry_point_offset = 624;
+ Thread_call_native_through_safepoint_entry_point_offset = 640;
static constexpr dart::compiler::target::word
Thread_fix_allocation_stub_code_offset = 256;
static constexpr dart::compiler::target::word
Thread_fix_callers_target_code_offset = 248;
static constexpr dart::compiler::target::word
- Thread_float_absolute_address_offset = 720;
+ Thread_float_absolute_address_offset = 736;
static constexpr dart::compiler::target::word
- Thread_float_negate_address_offset = 712;
+ Thread_float_negate_address_offset = 728;
static constexpr dart::compiler::target::word Thread_float_not_address_offset =
- 704;
+ 720;
static constexpr dart::compiler::target::word
- Thread_float_zerow_address_offset = 728;
+ Thread_float_zerow_address_offset = 744;
static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
- 1544;
+ 1560;
static constexpr dart::compiler::target::word
- Thread_interpret_call_entry_point_offset = 664;
+ Thread_interpret_call_entry_point_offset = 680;
static constexpr dart::compiler::target::word
Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
static constexpr dart::compiler::target::word
Thread_invoke_dart_code_stub_offset = 264;
static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
- 1592;
+ 1608;
static constexpr dart::compiler::target::word Thread_isolate_offset = 88;
static constexpr dart::compiler::target::word Thread_field_table_values_offset =
136;
static constexpr dart::compiler::target::word
- Thread_lazy_deopt_from_return_stub_offset = 456;
+ Thread_lazy_deopt_from_return_stub_offset = 472;
static constexpr dart::compiler::target::word
- Thread_lazy_deopt_from_throw_stub_offset = 464;
+ Thread_lazy_deopt_from_throw_stub_offset = 480;
static constexpr dart::compiler::target::word
- Thread_lazy_specialize_type_test_stub_offset = 480;
+ Thread_lazy_specialize_type_test_stub_offset = 496;
static constexpr dart::compiler::target::word
Thread_marking_stack_block_offset = 168;
static constexpr dart::compiler::target::word
- Thread_megamorphic_call_checked_entry_offset = 592;
+ Thread_megamorphic_call_checked_entry_offset = 608;
static constexpr dart::compiler::target::word
- Thread_switchable_call_miss_entry_offset = 600;
+ Thread_switchable_call_miss_entry_offset = 616;
static constexpr dart::compiler::target::word
- Thread_switchable_call_miss_stub_offset = 408;
+ Thread_switchable_call_miss_stub_offset = 424;
static constexpr dart::compiler::target::word
- Thread_no_scope_native_wrapper_entry_point_offset = 648;
+ Thread_no_scope_native_wrapper_entry_point_offset = 664;
static constexpr dart::compiler::target::word
- Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+ Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
static constexpr dart::compiler::target::word
- Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+ Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 288;
static constexpr dart::compiler::target::word
- Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+ Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
static constexpr dart::compiler::target::word
- Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+ Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
static constexpr dart::compiler::target::word
- Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+ Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
static constexpr dart::compiler::target::word
- Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+ Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
static constexpr dart::compiler::target::word
- Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+ Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
static constexpr dart::compiler::target::word
- Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+ Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+static constexpr dart::compiler::target::word
+ Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+static constexpr dart::compiler::target::word
+ Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
static constexpr dart::compiler::target::word Thread_object_null_offset = 208;
static constexpr dart::compiler::target::word
- Thread_predefined_symbols_address_offset = 672;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1552;
+ Thread_predefined_symbols_address_offset = 688;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1568;
static constexpr dart::compiler::target::word
- Thread_saved_shadow_call_stack_offset = 1560;
+ Thread_saved_shadow_call_stack_offset = 1576;
static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
- 1576;
+ 1592;
static constexpr dart::compiler::target::word
- Thread_slow_type_test_stub_offset = 472;
+ Thread_slow_type_test_stub_offset = 488;
static constexpr dart::compiler::target::word
- Thread_slow_type_test_entry_point_offset = 632;
+ Thread_slow_type_test_entry_point_offset = 648;
static constexpr dart::compiler::target::word Thread_stack_limit_offset = 72;
static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
120;
static constexpr dart::compiler::target::word
Thread_stack_overflow_flags_offset = 128;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+ Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+ Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+ Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+ Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
160;
static constexpr dart::compiler::target::word
@@ -1891,11 +1951,11 @@
static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
232;
static constexpr dart::compiler::target::word
- Thread_write_barrier_entry_point_offset = 512;
+ Thread_write_barrier_entry_point_offset = 528;
static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
80;
static constexpr dart::compiler::target::word Thread_callback_code_offset =
- 1584;
+ 1600;
static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
16;
static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -1913,6 +1973,10 @@
static constexpr dart::compiler::target::word TypeArguments_length_offset = 16;
static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
32;
+static constexpr dart::compiler::target::word TypeArguments_types_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 74;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 24;
static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
@@ -1942,9 +2006,9 @@
8, 24, 16, 32};
static constexpr dart::compiler::target::word
Thread_write_barrier_wrappers_thread_offset[] = {
- 1368, 1376, 1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448,
- 1456, 1464, 1472, 1480, -1, -1, -1, -1, 1488, 1496, -1,
- -1, 1504, 1512, 1520, -1, -1, -1, -1, -1, -1};
+ 1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448, 1456, 1464,
+ 1472, 1480, 1488, 1496, -1, -1, -1, -1, 1504, 1512, -1,
+ -1, 1520, 1528, 1536, -1, -1, -1, -1, -1, -1};
static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
static constexpr dart::compiler::target::word Array_InstanceSize = 24;
static constexpr dart::compiler::target::word Array_header_size = 24;
@@ -1953,7 +2017,7 @@
static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word Class_InstanceSize = 208;
static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 56;
static constexpr dart::compiler::target::word Code_InstanceSize = 176;
static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -2013,7 +2077,7 @@
static constexpr dart::compiler::target::word PatchClass_InstanceSize = 48;
static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 40;
static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 32;
static constexpr dart::compiler::target::word RegExp_InstanceSize = 120;
static constexpr dart::compiler::target::word Script_InstanceSize = 96;
@@ -2091,6 +2155,8 @@
static constexpr dart::compiler::target::word
SubtypeTestCache_kTestEntryLength = 7;
static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+ 268435455;
static constexpr dart::compiler::target::word
AbstractType_type_test_stub_entry_point_offset = 4;
static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -2129,6 +2195,10 @@
static constexpr dart::compiler::target::word Closure_hash_offset = 24;
static constexpr dart::compiler::target::word
Closure_instantiator_type_arguments_offset = 4;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_info_offset = 24;
static constexpr dart::compiler::target::word Code_object_pool_offset = 20;
static constexpr dart::compiler::target::word Code_saved_instructions_offset =
24;
@@ -2154,8 +2224,10 @@
static constexpr dart::compiler::target::word Field_is_nullable_offset = 50;
static constexpr dart::compiler::target::word Field_kind_bits_offset = 58;
static constexpr dart::compiler::target::word Function_code_offset = 44;
+static constexpr dart::compiler::target::word Function_data_offset = 36;
static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
4, 8};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 64;
static constexpr dart::compiler::target::word Function_packed_fields_offset =
68;
static constexpr dart::compiler::target::word Function_parameter_names_offset =
@@ -2238,155 +2310,159 @@
static constexpr dart::compiler::target::word String_length_offset = 4;
static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 4;
static constexpr dart::compiler::target::word
- Thread_AllocateArray_entry_point_offset = 376;
+ Thread_AllocateArray_entry_point_offset = 384;
static constexpr dart::compiler::target::word Thread_active_exception_offset =
- 724;
+ 732;
static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
- 728;
+ 736;
static constexpr dart::compiler::target::word
Thread_array_write_barrier_code_offset = 128;
static constexpr dart::compiler::target::word
- Thread_array_write_barrier_entry_point_offset = 268;
+ Thread_array_write_barrier_entry_point_offset = 276;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_with_fpu_regs_entry_point_offset = 276;
+ Thread_allocate_mint_with_fpu_regs_entry_point_offset = 284;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_with_fpu_regs_stub_offset = 184;
+ Thread_allocate_mint_with_fpu_regs_stub_offset = 192;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_without_fpu_regs_entry_point_offset = 280;
+ Thread_allocate_mint_without_fpu_regs_entry_point_offset = 288;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_without_fpu_regs_stub_offset = 188;
+ Thread_allocate_mint_without_fpu_regs_stub_offset = 196;
static constexpr dart::compiler::target::word
- Thread_allocate_object_entry_point_offset = 284;
+ Thread_allocate_object_entry_point_offset = 292;
static constexpr dart::compiler::target::word
- Thread_allocate_object_stub_offset = 192;
+ Thread_allocate_object_stub_offset = 200;
static constexpr dart::compiler::target::word
- Thread_allocate_object_parameterized_entry_point_offset = 288;
+ Thread_allocate_object_parameterized_entry_point_offset = 296;
static constexpr dart::compiler::target::word
- Thread_allocate_object_parameterized_stub_offset = 196;
+ Thread_allocate_object_parameterized_stub_offset = 204;
static constexpr dart::compiler::target::word
- Thread_allocate_object_slow_entry_point_offset = 292;
+ Thread_allocate_object_slow_entry_point_offset = 300;
static constexpr dart::compiler::target::word
- Thread_allocate_object_slow_stub_offset = 200;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 760;
+ Thread_allocate_object_slow_stub_offset = 208;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 768;
static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
96;
static constexpr dart::compiler::target::word
- Thread_auto_scope_native_wrapper_entry_point_offset = 336;
+ Thread_auto_scope_native_wrapper_entry_point_offset = 344;
static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
static constexpr dart::compiler::target::word Thread_bool_true_offset = 116;
static constexpr dart::compiler::target::word
- Thread_bootstrap_native_wrapper_entry_point_offset = 328;
+ Thread_bootstrap_native_wrapper_entry_point_offset = 336;
static constexpr dart::compiler::target::word
- Thread_call_to_runtime_entry_point_offset = 272;
+ Thread_call_to_runtime_entry_point_offset = 280;
static constexpr dart::compiler::target::word
Thread_call_to_runtime_stub_offset = 148;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 768;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 776;
static constexpr dart::compiler::target::word
Thread_dispatch_table_array_offset = 48;
static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
- 312;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 228;
+ 320;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 236;
static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
- 316;
+ 324;
static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
- 232;
+ 240;
static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
- 356;
+ 364;
static constexpr dart::compiler::target::word
- Thread_double_negate_address_offset = 352;
+ Thread_double_negate_address_offset = 360;
static constexpr dart::compiler::target::word Thread_end_offset = 56;
static constexpr dart::compiler::target::word
- Thread_enter_safepoint_stub_offset = 252;
+ Thread_enter_safepoint_stub_offset = 260;
static constexpr dart::compiler::target::word Thread_execution_state_offset =
- 744;
+ 752;
static constexpr dart::compiler::target::word
- Thread_exit_safepoint_stub_offset = 256;
+ Thread_exit_safepoint_stub_offset = 264;
static constexpr dart::compiler::target::word
- Thread_call_native_through_safepoint_stub_offset = 260;
+ Thread_call_native_through_safepoint_stub_offset = 268;
static constexpr dart::compiler::target::word
- Thread_call_native_through_safepoint_entry_point_offset = 320;
+ Thread_call_native_through_safepoint_entry_point_offset = 328;
static constexpr dart::compiler::target::word
Thread_fix_allocation_stub_code_offset = 136;
static constexpr dart::compiler::target::word
Thread_fix_callers_target_code_offset = 132;
static constexpr dart::compiler::target::word
- Thread_float_absolute_address_offset = 368;
+ Thread_float_absolute_address_offset = 376;
static constexpr dart::compiler::target::word
- Thread_float_negate_address_offset = 364;
+ Thread_float_negate_address_offset = 372;
static constexpr dart::compiler::target::word Thread_float_not_address_offset =
- 360;
+ 368;
static constexpr dart::compiler::target::word
- Thread_float_zerow_address_offset = 372;
+ Thread_float_zerow_address_offset = 380;
static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
- 732;
+ 740;
static constexpr dart::compiler::target::word
- Thread_interpret_call_entry_point_offset = 340;
+ Thread_interpret_call_entry_point_offset = 348;
static constexpr dart::compiler::target::word
Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
static constexpr dart::compiler::target::word
Thread_invoke_dart_code_stub_offset = 140;
static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
- 756;
+ 764;
static constexpr dart::compiler::target::word Thread_isolate_offset = 44;
static constexpr dart::compiler::target::word Thread_field_table_values_offset =
68;
static constexpr dart::compiler::target::word
- Thread_lazy_deopt_from_return_stub_offset = 236;
+ Thread_lazy_deopt_from_return_stub_offset = 244;
static constexpr dart::compiler::target::word
- Thread_lazy_deopt_from_throw_stub_offset = 240;
+ Thread_lazy_deopt_from_throw_stub_offset = 248;
static constexpr dart::compiler::target::word
- Thread_lazy_specialize_type_test_stub_offset = 248;
+ Thread_lazy_specialize_type_test_stub_offset = 256;
static constexpr dart::compiler::target::word
Thread_marking_stack_block_offset = 84;
static constexpr dart::compiler::target::word
- Thread_megamorphic_call_checked_entry_offset = 304;
+ Thread_megamorphic_call_checked_entry_offset = 312;
static constexpr dart::compiler::target::word
- Thread_switchable_call_miss_entry_offset = 308;
+ Thread_switchable_call_miss_entry_offset = 316;
static constexpr dart::compiler::target::word
- Thread_switchable_call_miss_stub_offset = 212;
+ Thread_switchable_call_miss_stub_offset = 220;
static constexpr dart::compiler::target::word
- Thread_no_scope_native_wrapper_entry_point_offset = 332;
+ Thread_no_scope_native_wrapper_entry_point_offset = 340;
static constexpr dart::compiler::target::word
- Thread_null_error_shared_with_fpu_regs_stub_offset = 156;
+ Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 156;
static constexpr dart::compiler::target::word
- Thread_null_error_shared_without_fpu_regs_stub_offset = 152;
+ Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 152;
static constexpr dart::compiler::target::word
- Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 164;
+ Thread_null_error_shared_with_fpu_regs_stub_offset = 164;
static constexpr dart::compiler::target::word
- Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 160;
+ Thread_null_error_shared_without_fpu_regs_stub_offset = 160;
static constexpr dart::compiler::target::word
- Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 172;
+ Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 172;
static constexpr dart::compiler::target::word
- Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 168;
+ Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 168;
static constexpr dart::compiler::target::word
- Thread_range_error_shared_with_fpu_regs_stub_offset = 180;
+ Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 180;
static constexpr dart::compiler::target::word
- Thread_range_error_shared_without_fpu_regs_stub_offset = 176;
+ Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 176;
+static constexpr dart::compiler::target::word
+ Thread_range_error_shared_with_fpu_regs_stub_offset = 188;
+static constexpr dart::compiler::target::word
+ Thread_range_error_shared_without_fpu_regs_stub_offset = 184;
static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
static constexpr dart::compiler::target::word
- Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 736;
+ Thread_predefined_symbols_address_offset = 352;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 744;
static constexpr dart::compiler::target::word
- Thread_saved_shadow_call_stack_offset = 740;
+ Thread_saved_shadow_call_stack_offset = 748;
static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
- 748;
+ 756;
static constexpr dart::compiler::target::word
- Thread_slow_type_test_stub_offset = 244;
+ Thread_slow_type_test_stub_offset = 252;
static constexpr dart::compiler::target::word
- Thread_slow_type_test_entry_point_offset = 324;
+ Thread_slow_type_test_entry_point_offset = 332;
static constexpr dart::compiler::target::word Thread_stack_limit_offset = 36;
static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
60;
static constexpr dart::compiler::target::word
Thread_stack_overflow_flags_offset = 64;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 300;
+ Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 308;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 208;
+ Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 216;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 296;
+ Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 304;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 204;
+ Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 212;
static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
80;
static constexpr dart::compiler::target::word
@@ -2399,10 +2475,10 @@
static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
124;
static constexpr dart::compiler::target::word
- Thread_write_barrier_entry_point_offset = 264;
+ Thread_write_barrier_entry_point_offset = 272;
static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
40;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 752;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 760;
static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
static constexpr dart::compiler::target::word Type_arguments_offset = 16;
@@ -2419,6 +2495,10 @@
static constexpr dart::compiler::target::word TypeArguments_length_offset = 8;
static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
16;
+static constexpr dart::compiler::target::word TypeArguments_types_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 12;
static constexpr dart::compiler::target::word TypeRef_type_offset = 12;
static constexpr dart::compiler::target::word TypedDataBase_length_offset = 8;
static constexpr dart::compiler::target::word TypedDataView_data_offset = 12;
@@ -2445,7 +2525,7 @@
4, 12, 8, 16};
static constexpr dart::compiler::target::word
Thread_write_barrier_wrappers_thread_offset[] = {
- 692, 696, 700, 704, 708, -1, 712, -1, 716, 720, -1, -1, -1, -1, -1, -1};
+ 700, 704, 708, 712, 716, -1, 720, -1, 724, 728, -1, -1, -1, -1, -1, -1};
static constexpr dart::compiler::target::word ApiError_InstanceSize = 8;
static constexpr dart::compiler::target::word Array_InstanceSize = 12;
static constexpr dart::compiler::target::word Array_header_size = 12;
@@ -2454,7 +2534,7 @@
static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word Class_InstanceSize = 128;
static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 20;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 28;
static constexpr dart::compiler::target::word Code_InstanceSize = 76;
static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -2514,7 +2594,7 @@
static constexpr dart::compiler::target::word PatchClass_InstanceSize = 24;
static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 8;
static constexpr dart::compiler::target::word Pointer_InstanceSize = 12;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 12;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 20;
static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 16;
static constexpr dart::compiler::target::word RegExp_InstanceSize = 60;
static constexpr dart::compiler::target::word Script_InstanceSize = 56;
@@ -2591,6 +2671,8 @@
static constexpr dart::compiler::target::word
SubtypeTestCache_kTestEntryLength = 7;
static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+ 576460752303423487;
static constexpr dart::compiler::target::word
AbstractType_type_test_stub_entry_point_offset = 8;
static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -2629,6 +2711,10 @@
static constexpr dart::compiler::target::word Closure_hash_offset = 48;
static constexpr dart::compiler::target::word
Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_info_offset = 48;
static constexpr dart::compiler::target::word Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word Code_saved_instructions_offset =
48;
@@ -2654,8 +2740,10 @@
static constexpr dart::compiler::target::word Field_is_nullable_offset = 90;
static constexpr dart::compiler::target::word Field_kind_bits_offset = 98;
static constexpr dart::compiler::target::word Function_code_offset = 88;
+static constexpr dart::compiler::target::word Function_data_offset = 72;
static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
8, 16};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 120;
static constexpr dart::compiler::target::word Function_packed_fields_offset =
124;
static constexpr dart::compiler::target::word Function_parameter_names_offset =
@@ -2739,156 +2827,160 @@
static constexpr dart::compiler::target::word String_length_offset = 8;
static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 8;
static constexpr dart::compiler::target::word
- Thread_AllocateArray_entry_point_offset = 736;
+ Thread_AllocateArray_entry_point_offset = 752;
static constexpr dart::compiler::target::word Thread_active_exception_offset =
- 1456;
+ 1472;
static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
- 1464;
+ 1480;
static constexpr dart::compiler::target::word
Thread_array_write_barrier_code_offset = 240;
static constexpr dart::compiler::target::word
- Thread_array_write_barrier_entry_point_offset = 520;
+ Thread_array_write_barrier_entry_point_offset = 536;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+ Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+ Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+ Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+ Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
static constexpr dart::compiler::target::word
- Thread_allocate_object_entry_point_offset = 552;
+ Thread_allocate_object_entry_point_offset = 568;
static constexpr dart::compiler::target::word
- Thread_allocate_object_stub_offset = 368;
+ Thread_allocate_object_stub_offset = 384;
static constexpr dart::compiler::target::word
- Thread_allocate_object_parameterized_entry_point_offset = 560;
+ Thread_allocate_object_parameterized_entry_point_offset = 576;
static constexpr dart::compiler::target::word
- Thread_allocate_object_parameterized_stub_offset = 376;
+ Thread_allocate_object_parameterized_stub_offset = 392;
static constexpr dart::compiler::target::word
- Thread_allocate_object_slow_entry_point_offset = 568;
+ Thread_allocate_object_slow_entry_point_offset = 584;
static constexpr dart::compiler::target::word
- Thread_allocate_object_slow_stub_offset = 384;
+ Thread_allocate_object_slow_stub_offset = 400;
static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
- 1528;
+ 1544;
static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
192;
static constexpr dart::compiler::target::word
- Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+ Thread_auto_scope_native_wrapper_entry_point_offset = 672;
static constexpr dart::compiler::target::word Thread_bool_false_offset = 224;
static constexpr dart::compiler::target::word Thread_bool_true_offset = 216;
static constexpr dart::compiler::target::word
- Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+ Thread_bootstrap_native_wrapper_entry_point_offset = 656;
static constexpr dart::compiler::target::word
- Thread_call_to_runtime_entry_point_offset = 528;
+ Thread_call_to_runtime_entry_point_offset = 544;
static constexpr dart::compiler::target::word
Thread_call_to_runtime_stub_offset = 280;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1544;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1560;
static constexpr dart::compiler::target::word
Thread_dispatch_table_array_offset = 96;
static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
- 608;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 440;
+ 624;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 456;
static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
- 616;
+ 632;
static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
- 448;
+ 464;
static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
- 696;
+ 712;
static constexpr dart::compiler::target::word
- Thread_double_negate_address_offset = 688;
+ Thread_double_negate_address_offset = 704;
static constexpr dart::compiler::target::word Thread_end_offset = 112;
static constexpr dart::compiler::target::word
- Thread_enter_safepoint_stub_offset = 488;
+ Thread_enter_safepoint_stub_offset = 504;
static constexpr dart::compiler::target::word Thread_execution_state_offset =
- 1496;
+ 1512;
static constexpr dart::compiler::target::word
- Thread_exit_safepoint_stub_offset = 496;
+ Thread_exit_safepoint_stub_offset = 512;
static constexpr dart::compiler::target::word
- Thread_call_native_through_safepoint_stub_offset = 504;
+ Thread_call_native_through_safepoint_stub_offset = 520;
static constexpr dart::compiler::target::word
- Thread_call_native_through_safepoint_entry_point_offset = 624;
+ Thread_call_native_through_safepoint_entry_point_offset = 640;
static constexpr dart::compiler::target::word
Thread_fix_allocation_stub_code_offset = 256;
static constexpr dart::compiler::target::word
Thread_fix_callers_target_code_offset = 248;
static constexpr dart::compiler::target::word
- Thread_float_absolute_address_offset = 720;
+ Thread_float_absolute_address_offset = 736;
static constexpr dart::compiler::target::word
- Thread_float_negate_address_offset = 712;
+ Thread_float_negate_address_offset = 728;
static constexpr dart::compiler::target::word Thread_float_not_address_offset =
- 704;
+ 720;
static constexpr dart::compiler::target::word
- Thread_float_zerow_address_offset = 728;
+ Thread_float_zerow_address_offset = 744;
static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
- 1472;
+ 1488;
static constexpr dart::compiler::target::word
- Thread_interpret_call_entry_point_offset = 664;
+ Thread_interpret_call_entry_point_offset = 680;
static constexpr dart::compiler::target::word
Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
static constexpr dart::compiler::target::word
Thread_invoke_dart_code_stub_offset = 264;
static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
- 1520;
+ 1536;
static constexpr dart::compiler::target::word Thread_isolate_offset = 88;
static constexpr dart::compiler::target::word Thread_field_table_values_offset =
136;
static constexpr dart::compiler::target::word
- Thread_lazy_deopt_from_return_stub_offset = 456;
+ Thread_lazy_deopt_from_return_stub_offset = 472;
static constexpr dart::compiler::target::word
- Thread_lazy_deopt_from_throw_stub_offset = 464;
+ Thread_lazy_deopt_from_throw_stub_offset = 480;
static constexpr dart::compiler::target::word
- Thread_lazy_specialize_type_test_stub_offset = 480;
+ Thread_lazy_specialize_type_test_stub_offset = 496;
static constexpr dart::compiler::target::word
Thread_marking_stack_block_offset = 168;
static constexpr dart::compiler::target::word
- Thread_megamorphic_call_checked_entry_offset = 592;
+ Thread_megamorphic_call_checked_entry_offset = 608;
static constexpr dart::compiler::target::word
- Thread_switchable_call_miss_entry_offset = 600;
+ Thread_switchable_call_miss_entry_offset = 616;
static constexpr dart::compiler::target::word
- Thread_switchable_call_miss_stub_offset = 408;
+ Thread_switchable_call_miss_stub_offset = 424;
static constexpr dart::compiler::target::word
- Thread_no_scope_native_wrapper_entry_point_offset = 648;
+ Thread_no_scope_native_wrapper_entry_point_offset = 664;
static constexpr dart::compiler::target::word
- Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+ Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
static constexpr dart::compiler::target::word
- Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+ Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 288;
static constexpr dart::compiler::target::word
- Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+ Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
static constexpr dart::compiler::target::word
- Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+ Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
static constexpr dart::compiler::target::word
- Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+ Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
static constexpr dart::compiler::target::word
- Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+ Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
static constexpr dart::compiler::target::word
- Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+ Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
static constexpr dart::compiler::target::word
- Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+ Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+static constexpr dart::compiler::target::word
+ Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+static constexpr dart::compiler::target::word
+ Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
static constexpr dart::compiler::target::word Thread_object_null_offset = 208;
static constexpr dart::compiler::target::word
- Thread_predefined_symbols_address_offset = 672;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1480;
+ Thread_predefined_symbols_address_offset = 688;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1496;
static constexpr dart::compiler::target::word
- Thread_saved_shadow_call_stack_offset = 1488;
+ Thread_saved_shadow_call_stack_offset = 1504;
static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
- 1504;
+ 1520;
static constexpr dart::compiler::target::word
- Thread_slow_type_test_stub_offset = 472;
+ Thread_slow_type_test_stub_offset = 488;
static constexpr dart::compiler::target::word
- Thread_slow_type_test_entry_point_offset = 632;
+ Thread_slow_type_test_entry_point_offset = 648;
static constexpr dart::compiler::target::word Thread_stack_limit_offset = 72;
static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
120;
static constexpr dart::compiler::target::word
Thread_stack_overflow_flags_offset = 128;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+ Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+ Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+ Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+ Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
160;
static constexpr dart::compiler::target::word
@@ -2901,11 +2993,11 @@
static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
232;
static constexpr dart::compiler::target::word
- Thread_write_barrier_entry_point_offset = 512;
+ Thread_write_barrier_entry_point_offset = 528;
static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
80;
static constexpr dart::compiler::target::word Thread_callback_code_offset =
- 1512;
+ 1528;
static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
16;
static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -2923,6 +3015,10 @@
static constexpr dart::compiler::target::word TypeArguments_length_offset = 16;
static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
32;
+static constexpr dart::compiler::target::word TypeArguments_types_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 74;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 24;
static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
@@ -2949,8 +3045,8 @@
8, 24, 16, 32};
static constexpr dart::compiler::target::word
Thread_write_barrier_wrappers_thread_offset[] = {
- 1368, 1376, 1384, 1392, -1, -1, 1400, 1408,
- 1416, 1424, 1432, -1, 1440, 1448, -1, -1};
+ 1384, 1392, 1400, 1408, -1, -1, 1416, 1424,
+ 1432, 1440, 1448, -1, 1456, 1464, -1, -1};
static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
static constexpr dart::compiler::target::word Array_InstanceSize = 24;
static constexpr dart::compiler::target::word Array_header_size = 24;
@@ -2959,7 +3055,7 @@
static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word Class_InstanceSize = 208;
static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 56;
static constexpr dart::compiler::target::word Code_InstanceSize = 144;
static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -3019,7 +3115,7 @@
static constexpr dart::compiler::target::word PatchClass_InstanceSize = 48;
static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 40;
static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 32;
static constexpr dart::compiler::target::word RegExp_InstanceSize = 120;
static constexpr dart::compiler::target::word Script_InstanceSize = 96;
@@ -3095,6 +3191,8 @@
static constexpr dart::compiler::target::word
SubtypeTestCache_kTestEntryLength = 7;
static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+ 268435455;
static constexpr dart::compiler::target::word
AbstractType_type_test_stub_entry_point_offset = 4;
static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -3133,6 +3231,10 @@
static constexpr dart::compiler::target::word Closure_hash_offset = 24;
static constexpr dart::compiler::target::word
Closure_instantiator_type_arguments_offset = 4;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_info_offset = 24;
static constexpr dart::compiler::target::word Code_object_pool_offset = 20;
static constexpr dart::compiler::target::word Code_saved_instructions_offset =
24;
@@ -3158,8 +3260,10 @@
static constexpr dart::compiler::target::word Field_is_nullable_offset = 50;
static constexpr dart::compiler::target::word Field_kind_bits_offset = 58;
static constexpr dart::compiler::target::word Function_code_offset = 44;
+static constexpr dart::compiler::target::word Function_data_offset = 36;
static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
4, 8};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 64;
static constexpr dart::compiler::target::word Function_packed_fields_offset =
68;
static constexpr dart::compiler::target::word Function_parameter_names_offset =
@@ -3242,155 +3346,159 @@
static constexpr dart::compiler::target::word String_length_offset = 4;
static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 4;
static constexpr dart::compiler::target::word
- Thread_AllocateArray_entry_point_offset = 376;
+ Thread_AllocateArray_entry_point_offset = 384;
static constexpr dart::compiler::target::word Thread_active_exception_offset =
- 692;
+ 700;
static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
- 696;
+ 704;
static constexpr dart::compiler::target::word
Thread_array_write_barrier_code_offset = 128;
static constexpr dart::compiler::target::word
- Thread_array_write_barrier_entry_point_offset = 268;
+ Thread_array_write_barrier_entry_point_offset = 276;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_with_fpu_regs_entry_point_offset = 276;
+ Thread_allocate_mint_with_fpu_regs_entry_point_offset = 284;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_with_fpu_regs_stub_offset = 184;
+ Thread_allocate_mint_with_fpu_regs_stub_offset = 192;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_without_fpu_regs_entry_point_offset = 280;
+ Thread_allocate_mint_without_fpu_regs_entry_point_offset = 288;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_without_fpu_regs_stub_offset = 188;
+ Thread_allocate_mint_without_fpu_regs_stub_offset = 196;
static constexpr dart::compiler::target::word
- Thread_allocate_object_entry_point_offset = 284;
+ Thread_allocate_object_entry_point_offset = 292;
static constexpr dart::compiler::target::word
- Thread_allocate_object_stub_offset = 192;
+ Thread_allocate_object_stub_offset = 200;
static constexpr dart::compiler::target::word
- Thread_allocate_object_parameterized_entry_point_offset = 288;
+ Thread_allocate_object_parameterized_entry_point_offset = 296;
static constexpr dart::compiler::target::word
- Thread_allocate_object_parameterized_stub_offset = 196;
+ Thread_allocate_object_parameterized_stub_offset = 204;
static constexpr dart::compiler::target::word
- Thread_allocate_object_slow_entry_point_offset = 292;
+ Thread_allocate_object_slow_entry_point_offset = 300;
static constexpr dart::compiler::target::word
- Thread_allocate_object_slow_stub_offset = 200;
-static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 728;
+ Thread_allocate_object_slow_stub_offset = 208;
+static constexpr dart::compiler::target::word Thread_api_top_scope_offset = 736;
static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
96;
static constexpr dart::compiler::target::word
- Thread_auto_scope_native_wrapper_entry_point_offset = 336;
+ Thread_auto_scope_native_wrapper_entry_point_offset = 344;
static constexpr dart::compiler::target::word Thread_bool_false_offset = 120;
static constexpr dart::compiler::target::word Thread_bool_true_offset = 116;
static constexpr dart::compiler::target::word
- Thread_bootstrap_native_wrapper_entry_point_offset = 328;
+ Thread_bootstrap_native_wrapper_entry_point_offset = 336;
static constexpr dart::compiler::target::word
- Thread_call_to_runtime_entry_point_offset = 272;
+ Thread_call_to_runtime_entry_point_offset = 280;
static constexpr dart::compiler::target::word
Thread_call_to_runtime_stub_offset = 148;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 736;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 744;
static constexpr dart::compiler::target::word
Thread_dispatch_table_array_offset = 48;
static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
- 312;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 228;
+ 320;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 236;
static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
- 316;
+ 324;
static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
- 232;
+ 240;
static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
- 356;
+ 364;
static constexpr dart::compiler::target::word
- Thread_double_negate_address_offset = 352;
+ Thread_double_negate_address_offset = 360;
static constexpr dart::compiler::target::word Thread_end_offset = 56;
static constexpr dart::compiler::target::word
- Thread_enter_safepoint_stub_offset = 252;
+ Thread_enter_safepoint_stub_offset = 260;
static constexpr dart::compiler::target::word Thread_execution_state_offset =
- 712;
+ 720;
static constexpr dart::compiler::target::word
- Thread_exit_safepoint_stub_offset = 256;
+ Thread_exit_safepoint_stub_offset = 264;
static constexpr dart::compiler::target::word
- Thread_call_native_through_safepoint_stub_offset = 260;
+ Thread_call_native_through_safepoint_stub_offset = 268;
static constexpr dart::compiler::target::word
- Thread_call_native_through_safepoint_entry_point_offset = 320;
+ Thread_call_native_through_safepoint_entry_point_offset = 328;
static constexpr dart::compiler::target::word
Thread_fix_allocation_stub_code_offset = 136;
static constexpr dart::compiler::target::word
Thread_fix_callers_target_code_offset = 132;
static constexpr dart::compiler::target::word
- Thread_float_absolute_address_offset = 368;
+ Thread_float_absolute_address_offset = 376;
static constexpr dart::compiler::target::word
- Thread_float_negate_address_offset = 364;
+ Thread_float_negate_address_offset = 372;
static constexpr dart::compiler::target::word Thread_float_not_address_offset =
- 360;
+ 368;
static constexpr dart::compiler::target::word
- Thread_float_zerow_address_offset = 372;
+ Thread_float_zerow_address_offset = 380;
static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
- 700;
+ 708;
static constexpr dart::compiler::target::word
- Thread_interpret_call_entry_point_offset = 340;
+ Thread_interpret_call_entry_point_offset = 348;
static constexpr dart::compiler::target::word
Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
static constexpr dart::compiler::target::word
Thread_invoke_dart_code_stub_offset = 140;
static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
- 724;
+ 732;
static constexpr dart::compiler::target::word Thread_isolate_offset = 44;
static constexpr dart::compiler::target::word Thread_field_table_values_offset =
68;
static constexpr dart::compiler::target::word
- Thread_lazy_deopt_from_return_stub_offset = 236;
+ Thread_lazy_deopt_from_return_stub_offset = 244;
static constexpr dart::compiler::target::word
- Thread_lazy_deopt_from_throw_stub_offset = 240;
+ Thread_lazy_deopt_from_throw_stub_offset = 248;
static constexpr dart::compiler::target::word
- Thread_lazy_specialize_type_test_stub_offset = 248;
+ Thread_lazy_specialize_type_test_stub_offset = 256;
static constexpr dart::compiler::target::word
Thread_marking_stack_block_offset = 84;
static constexpr dart::compiler::target::word
- Thread_megamorphic_call_checked_entry_offset = 304;
+ Thread_megamorphic_call_checked_entry_offset = 312;
static constexpr dart::compiler::target::word
- Thread_switchable_call_miss_entry_offset = 308;
+ Thread_switchable_call_miss_entry_offset = 316;
static constexpr dart::compiler::target::word
- Thread_switchable_call_miss_stub_offset = 212;
+ Thread_switchable_call_miss_stub_offset = 220;
static constexpr dart::compiler::target::word
- Thread_no_scope_native_wrapper_entry_point_offset = 332;
+ Thread_no_scope_native_wrapper_entry_point_offset = 340;
static constexpr dart::compiler::target::word
- Thread_null_error_shared_with_fpu_regs_stub_offset = 156;
+ Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 156;
static constexpr dart::compiler::target::word
- Thread_null_error_shared_without_fpu_regs_stub_offset = 152;
+ Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 152;
static constexpr dart::compiler::target::word
- Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 164;
+ Thread_null_error_shared_with_fpu_regs_stub_offset = 164;
static constexpr dart::compiler::target::word
- Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 160;
+ Thread_null_error_shared_without_fpu_regs_stub_offset = 160;
static constexpr dart::compiler::target::word
- Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 172;
+ Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 172;
static constexpr dart::compiler::target::word
- Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 168;
+ Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 168;
static constexpr dart::compiler::target::word
- Thread_range_error_shared_with_fpu_regs_stub_offset = 180;
+ Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 180;
static constexpr dart::compiler::target::word
- Thread_range_error_shared_without_fpu_regs_stub_offset = 176;
+ Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 176;
+static constexpr dart::compiler::target::word
+ Thread_range_error_shared_with_fpu_regs_stub_offset = 188;
+static constexpr dart::compiler::target::word
+ Thread_range_error_shared_without_fpu_regs_stub_offset = 184;
static constexpr dart::compiler::target::word Thread_object_null_offset = 112;
static constexpr dart::compiler::target::word
- Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 704;
+ Thread_predefined_symbols_address_offset = 352;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 712;
static constexpr dart::compiler::target::word
- Thread_saved_shadow_call_stack_offset = 708;
+ Thread_saved_shadow_call_stack_offset = 716;
static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
- 716;
+ 724;
static constexpr dart::compiler::target::word
- Thread_slow_type_test_stub_offset = 244;
+ Thread_slow_type_test_stub_offset = 252;
static constexpr dart::compiler::target::word
- Thread_slow_type_test_entry_point_offset = 324;
+ Thread_slow_type_test_entry_point_offset = 332;
static constexpr dart::compiler::target::word Thread_stack_limit_offset = 36;
static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
60;
static constexpr dart::compiler::target::word
Thread_stack_overflow_flags_offset = 64;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 300;
+ Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 308;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 208;
+ Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 216;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 296;
+ Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 304;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 204;
+ Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 212;
static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
80;
static constexpr dart::compiler::target::word
@@ -3403,10 +3511,10 @@
static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
124;
static constexpr dart::compiler::target::word
- Thread_write_barrier_entry_point_offset = 264;
+ Thread_write_barrier_entry_point_offset = 272;
static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
40;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 720;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 728;
static constexpr dart::compiler::target::word TimelineStream_enabled_offset = 8;
static constexpr dart::compiler::target::word TwoByteString_data_offset = 12;
static constexpr dart::compiler::target::word Type_arguments_offset = 16;
@@ -3423,6 +3531,10 @@
static constexpr dart::compiler::target::word TypeArguments_length_offset = 8;
static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
16;
+static constexpr dart::compiler::target::word TypeArguments_types_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 20;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 42;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 12;
static constexpr dart::compiler::target::word TypeRef_type_offset = 12;
static constexpr dart::compiler::target::word TypedDataBase_length_offset = 8;
static constexpr dart::compiler::target::word TypedDataView_data_offset = 12;
@@ -3455,7 +3567,7 @@
static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word Class_InstanceSize = 128;
static constexpr dart::compiler::target::word Closure_InstanceSize = 28;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 20;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 28;
static constexpr dart::compiler::target::word Code_InstanceSize = 76;
static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 8;
static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -3515,7 +3627,7 @@
static constexpr dart::compiler::target::word PatchClass_InstanceSize = 24;
static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 8;
static constexpr dart::compiler::target::word Pointer_InstanceSize = 12;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 12;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 20;
static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 16;
static constexpr dart::compiler::target::word RegExp_InstanceSize = 60;
static constexpr dart::compiler::target::word Script_InstanceSize = 56;
@@ -3592,6 +3704,8 @@
static constexpr dart::compiler::target::word
SubtypeTestCache_kTestEntryLength = 7;
static constexpr dart::compiler::target::word SubtypeTestCache_kTestResult = 0;
+static constexpr dart::compiler::target::word TypeArguments_kMaxElements =
+ 576460752303423487;
static constexpr dart::compiler::target::word
AbstractType_type_test_stub_entry_point_offset = 8;
static constexpr dart::compiler::target::word ArgumentsDescriptor_count_offset =
@@ -3630,6 +3744,10 @@
static constexpr dart::compiler::target::word Closure_hash_offset = 48;
static constexpr dart::compiler::target::word
Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+ ClosureData_default_type_arguments_info_offset = 48;
static constexpr dart::compiler::target::word Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word Code_saved_instructions_offset =
48;
@@ -3655,8 +3773,10 @@
static constexpr dart::compiler::target::word Field_is_nullable_offset = 90;
static constexpr dart::compiler::target::word Field_kind_bits_offset = 98;
static constexpr dart::compiler::target::word Function_code_offset = 88;
+static constexpr dart::compiler::target::word Function_data_offset = 72;
static constexpr dart::compiler::target::word Function_entry_point_offset[] = {
8, 16};
+static constexpr dart::compiler::target::word Function_kind_tag_offset = 120;
static constexpr dart::compiler::target::word Function_packed_fields_offset =
124;
static constexpr dart::compiler::target::word Function_parameter_names_offset =
@@ -3740,156 +3860,160 @@
static constexpr dart::compiler::target::word String_length_offset = 8;
static constexpr dart::compiler::target::word SubtypeTestCache_cache_offset = 8;
static constexpr dart::compiler::target::word
- Thread_AllocateArray_entry_point_offset = 736;
+ Thread_AllocateArray_entry_point_offset = 752;
static constexpr dart::compiler::target::word Thread_active_exception_offset =
- 1528;
+ 1544;
static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
- 1536;
+ 1552;
static constexpr dart::compiler::target::word
Thread_array_write_barrier_code_offset = 240;
static constexpr dart::compiler::target::word
- Thread_array_write_barrier_entry_point_offset = 520;
+ Thread_array_write_barrier_entry_point_offset = 536;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+ Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+ Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+ Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
static constexpr dart::compiler::target::word
- Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+ Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
static constexpr dart::compiler::target::word
- Thread_allocate_object_entry_point_offset = 552;
+ Thread_allocate_object_entry_point_offset = 568;
static constexpr dart::compiler::target::word
- Thread_allocate_object_stub_offset = 368;
+ Thread_allocate_object_stub_offset = 384;
static constexpr dart::compiler::target::word
- Thread_allocate_object_parameterized_entry_point_offset = 560;
+ Thread_allocate_object_parameterized_entry_point_offset = 576;
static constexpr dart::compiler::target::word
- Thread_allocate_object_parameterized_stub_offset = 376;
+ Thread_allocate_object_parameterized_stub_offset = 392;
static constexpr dart::compiler::target::word
- Thread_allocate_object_slow_entry_point_offset = 568;
+ Thread_allocate_object_slow_entry_point_offset = 584;
static constexpr dart::compiler::target::word
- Thread_allocate_object_slow_stub_offset = 384;
+ Thread_allocate_object_slow_stub_offset = 400;
static constexpr dart::compiler::target::word Thread_api_top_scope_offset =
- 1600;
+ 1616;
static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
192;
static constexpr dart::compiler::target::word
- Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+ Thread_auto_scope_native_wrapper_entry_point_offset = 672;
static constexpr dart::compiler::target::word Thread_bool_false_offset = 224;
static constexpr dart::compiler::target::word Thread_bool_true_offset = 216;
static constexpr dart::compiler::target::word
- Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+ Thread_bootstrap_native_wrapper_entry_point_offset = 656;
static constexpr dart::compiler::target::word
- Thread_call_to_runtime_entry_point_offset = 528;
+ Thread_call_to_runtime_entry_point_offset = 544;
static constexpr dart::compiler::target::word
Thread_call_to_runtime_stub_offset = 280;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1616;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1632;
static constexpr dart::compiler::target::word
Thread_dispatch_table_array_offset = 96;
static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
- 608;
-static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 440;
+ 624;
+static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 456;
static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
- 616;
+ 632;
static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
- 448;
+ 464;
static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
- 696;
+ 712;
static constexpr dart::compiler::target::word
- Thread_double_negate_address_offset = 688;
+ Thread_double_negate_address_offset = 704;
static constexpr dart::compiler::target::word Thread_end_offset = 112;
static constexpr dart::compiler::target::word
- Thread_enter_safepoint_stub_offset = 488;
+ Thread_enter_safepoint_stub_offset = 504;
static constexpr dart::compiler::target::word Thread_execution_state_offset =
- 1568;
+ 1584;
static constexpr dart::compiler::target::word
- Thread_exit_safepoint_stub_offset = 496;
+ Thread_exit_safepoint_stub_offset = 512;
static constexpr dart::compiler::target::word
- Thread_call_native_through_safepoint_stub_offset = 504;
+ Thread_call_native_through_safepoint_stub_offset = 520;
static constexpr dart::compiler::target::word
- Thread_call_native_through_safepoint_entry_point_offset = 624;
+ Thread_call_native_through_safepoint_entry_point_offset = 640;
static constexpr dart::compiler::target::word
Thread_fix_allocation_stub_code_offset = 256;
static constexpr dart::compiler::target::word
Thread_fix_callers_target_code_offset = 248;
static constexpr dart::compiler::target::word
- Thread_float_absolute_address_offset = 720;
+ Thread_float_absolute_address_offset = 736;
static constexpr dart::compiler::target::word
- Thread_float_negate_address_offset = 712;
+ Thread_float_negate_address_offset = 728;
static constexpr dart::compiler::target::word Thread_float_not_address_offset =
- 704;
+ 720;
static constexpr dart::compiler::target::word
- Thread_float_zerow_address_offset = 728;
+ Thread_float_zerow_address_offset = 744;
static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
- 1544;
+ 1560;
static constexpr dart::compiler::target::word
- Thread_interpret_call_entry_point_offset = 664;
+ Thread_interpret_call_entry_point_offset = 680;
static constexpr dart::compiler::target::word
Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
static constexpr dart::compiler::target::word
Thread_invoke_dart_code_stub_offset = 264;
static constexpr dart::compiler::target::word Thread_exit_through_ffi_offset =
- 1592;
+ 1608;
static constexpr dart::compiler::target::word Thread_isolate_offset = 88;
static constexpr dart::compiler::target::word Thread_field_table_values_offset =
136;
static constexpr dart::compiler::target::word
- Thread_lazy_deopt_from_return_stub_offset = 456;
+ Thread_lazy_deopt_from_return_stub_offset = 472;
static constexpr dart::compiler::target::word
- Thread_lazy_deopt_from_throw_stub_offset = 464;
+ Thread_lazy_deopt_from_throw_stub_offset = 480;
static constexpr dart::compiler::target::word
- Thread_lazy_specialize_type_test_stub_offset = 480;
+ Thread_lazy_specialize_type_test_stub_offset = 496;
static constexpr dart::compiler::target::word
Thread_marking_stack_block_offset = 168;
static constexpr dart::compiler::target::word
- Thread_megamorphic_call_checked_entry_offset = 592;
+ Thread_megamorphic_call_checked_entry_offset = 608;
static constexpr dart::compiler::target::word
- Thread_switchable_call_miss_entry_offset = 600;
+ Thread_switchable_call_miss_entry_offset = 616;
static constexpr dart::compiler::target::word
- Thread_switchable_call_miss_stub_offset = 408;
+ Thread_switchable_call_miss_stub_offset = 424;
static constexpr dart::compiler::target::word
- Thread_no_scope_native_wrapper_entry_point_offset = 648;
+ Thread_no_scope_native_wrapper_entry_point_offset = 664;
static constexpr dart::compiler::target::word
- Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+ Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
static constexpr dart::compiler::target::word
- Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+ Thread_late_initialization_error_shared_without_fpu_regs_stub_offset = 288;
static constexpr dart::compiler::target::word
- Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+ Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
static constexpr dart::compiler::target::word
- Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+ Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
static constexpr dart::compiler::target::word
- Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+ Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
static constexpr dart::compiler::target::word
- Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+ Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
static constexpr dart::compiler::target::word
- Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+ Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
static constexpr dart::compiler::target::word
- Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+ Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+static constexpr dart::compiler::target::word
+ Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+static constexpr dart::compiler::target::word
+ Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
static constexpr dart::compiler::target::word Thread_object_null_offset = 208;
static constexpr dart::compiler::target::word
- Thread_predefined_symbols_address_offset = 672;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1552;
+ Thread_predefined_symbols_address_offset = 688;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1568;
static constexpr dart::compiler::target::word
- Thread_saved_shadow_call_stack_offset = 1560;
+ Thread_saved_shadow_call_stack_offset = 1576;
static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
- 1576;
+ 1592;
static constexpr dart::compiler::target::word
- Thread_slow_type_test_stub_offset = 472;
+ Thread_slow_type_test_stub_offset = 488;
static constexpr dart::compiler::target::word
- Thread_slow_type_test_entry_point_offset = 632;
+ Thread_slow_type_test_entry_point_offset = 648;
static constexpr dart::compiler::target::word Thread_stack_limit_offset = 72;
static constexpr dart::compiler::target::word Thread_saved_stack_limit_offset =
120;
static constexpr dart::compiler::target::word
Thread_stack_overflow_flags_offset = 128;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+ Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+ Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+ Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
static constexpr dart::compiler::target::word
- Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+ Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
160;
static constexpr dart::compiler::target::word
@@ -3902,11 +4026,11 @@
static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
232;
static constexpr dart::compiler::target::word
- Thread_write_barrier_entry_point_offset = 512;
+ Thread_write_barrier_entry_point_offset = 528;
static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
80;
static constexpr dart::compiler::target::word Thread_callback_code_offset =
- 1584;
+ 1600;
static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
16;
static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -3924,6 +4048,10 @@
static constexpr dart::compiler::target::word TypeArguments_length_offset = 16;
static constexpr dart::compiler::target::word TypeArguments_nullability_offset =
32;
+static constexpr dart::compiler::target::word TypeArguments_types_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_bound_offset = 40;
+static constexpr dart::compiler::target::word TypeParameter_flags_offset = 74;
+static constexpr dart::compiler::target::word TypeParameter_name_offset = 24;
static constexpr dart::compiler::target::word TypeRef_type_offset = 24;
static constexpr dart::compiler::target::word TypedDataBase_length_offset = 16;
static constexpr dart::compiler::target::word TypedDataView_data_offset = 24;
@@ -3950,9 +4078,9 @@
8, 24, 16, 32};
static constexpr dart::compiler::target::word
Thread_write_barrier_wrappers_thread_offset[] = {
- 1368, 1376, 1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448,
- 1456, 1464, 1472, 1480, -1, -1, -1, -1, 1488, 1496, -1,
- -1, 1504, 1512, 1520, -1, -1, -1, -1, -1, -1};
+ 1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448, 1456, 1464,
+ 1472, 1480, 1488, 1496, -1, -1, -1, -1, 1504, 1512, -1,
+ -1, 1520, 1528, 1536, -1, -1, -1, -1, -1, -1};
static constexpr dart::compiler::target::word ApiError_InstanceSize = 16;
static constexpr dart::compiler::target::word Array_InstanceSize = 24;
static constexpr dart::compiler::target::word Array_header_size = 24;
@@ -3961,7 +4089,7 @@
static constexpr dart::compiler::target::word Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word Class_InstanceSize = 208;
static constexpr dart::compiler::target::word Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word ClosureData_InstanceSize = 56;
static constexpr dart::compiler::target::word Code_InstanceSize = 144;
static constexpr dart::compiler::target::word CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word CompressedStackMaps_HeaderSize =
@@ -4021,7 +4149,7 @@
static constexpr dart::compiler::target::word PatchClass_InstanceSize = 48;
static constexpr dart::compiler::target::word PcDescriptors_HeaderSize = 16;
static constexpr dart::compiler::target::word Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word ReceivePort_InstanceSize = 40;
static constexpr dart::compiler::target::word RedirectionData_InstanceSize = 32;
static constexpr dart::compiler::target::word RegExp_InstanceSize = 120;
static constexpr dart::compiler::target::word Script_InstanceSize = 96;
@@ -4100,6 +4228,8 @@
AOT_SubtypeTestCache_kTestEntryLength = 7;
static constexpr dart::compiler::target::word AOT_SubtypeTestCache_kTestResult =
0;
+static constexpr dart::compiler::target::word AOT_TypeArguments_kMaxElements =
+ 268435455;
static constexpr dart::compiler::target::word
AOT_AbstractType_type_test_stub_entry_point_offset = 4;
static constexpr dart::compiler::target::word
@@ -4141,6 +4271,10 @@
static constexpr dart::compiler::target::word AOT_Closure_hash_offset = 24;
static constexpr dart::compiler::target::word
AOT_Closure_instantiator_type_arguments_offset = 4;
+static constexpr dart::compiler::target::word
+ AOT_ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+ AOT_ClosureData_default_type_arguments_info_offset = 24;
static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 20;
static constexpr dart::compiler::target::word
AOT_Code_saved_instructions_offset = 24;
@@ -4167,8 +4301,10 @@
static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 42;
static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 46;
static constexpr dart::compiler::target::word AOT_Function_code_offset = 44;
+static constexpr dart::compiler::target::word AOT_Function_data_offset = 36;
static constexpr dart::compiler::target::word
AOT_Function_entry_point_offset[] = {4, 8};
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 48;
static constexpr dart::compiler::target::word
AOT_Function_packed_fields_offset = 52;
static constexpr dart::compiler::target::word
@@ -4269,147 +4405,152 @@
static constexpr dart::compiler::target::word
AOT_SubtypeTestCache_cache_offset = 4;
static constexpr dart::compiler::target::word
- AOT_Thread_AllocateArray_entry_point_offset = 376;
+ AOT_Thread_AllocateArray_entry_point_offset = 384;
static constexpr dart::compiler::target::word
- AOT_Thread_active_exception_offset = 724;
+ AOT_Thread_active_exception_offset = 732;
static constexpr dart::compiler::target::word
- AOT_Thread_active_stacktrace_offset = 728;
+ AOT_Thread_active_stacktrace_offset = 736;
static constexpr dart::compiler::target::word
AOT_Thread_array_write_barrier_code_offset = 128;
static constexpr dart::compiler::target::word
- AOT_Thread_array_write_barrier_entry_point_offset = 268;
+ AOT_Thread_array_write_barrier_entry_point_offset = 276;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 276;
+ AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 284;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 184;
+ AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 192;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 280;
+ AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 288;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 188;
+ AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 196;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_entry_point_offset = 284;
+ AOT_Thread_allocate_object_entry_point_offset = 292;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_stub_offset = 192;
+ AOT_Thread_allocate_object_stub_offset = 200;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_parameterized_entry_point_offset = 288;
+ AOT_Thread_allocate_object_parameterized_entry_point_offset = 296;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_parameterized_stub_offset = 196;
+ AOT_Thread_allocate_object_parameterized_stub_offset = 204;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_slow_entry_point_offset = 292;
+ AOT_Thread_allocate_object_slow_entry_point_offset = 300;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_slow_stub_offset = 200;
+ AOT_Thread_allocate_object_slow_stub_offset = 208;
static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
- 760;
+ 768;
static constexpr dart::compiler::target::word
AOT_Thread_async_stack_trace_offset = 96;
static constexpr dart::compiler::target::word
- AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 336;
+ AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 344;
static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
120;
static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 116;
static constexpr dart::compiler::target::word
- AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 328;
+ AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 336;
static constexpr dart::compiler::target::word
- AOT_Thread_call_to_runtime_entry_point_offset = 272;
+ AOT_Thread_call_to_runtime_entry_point_offset = 280;
static constexpr dart::compiler::target::word
AOT_Thread_call_to_runtime_stub_offset = 148;
static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
- 768;
+ 776;
static constexpr dart::compiler::target::word
AOT_Thread_dispatch_table_array_offset = 48;
static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
- 312;
+ 320;
static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
- 228;
+ 236;
static constexpr dart::compiler::target::word
- AOT_Thread_deoptimize_entry_offset = 316;
+ AOT_Thread_deoptimize_entry_offset = 324;
static constexpr dart::compiler::target::word
- AOT_Thread_deoptimize_stub_offset = 232;
+ AOT_Thread_deoptimize_stub_offset = 240;
static constexpr dart::compiler::target::word
- AOT_Thread_double_abs_address_offset = 356;
+ AOT_Thread_double_abs_address_offset = 364;
static constexpr dart::compiler::target::word
- AOT_Thread_double_negate_address_offset = 352;
+ AOT_Thread_double_negate_address_offset = 360;
static constexpr dart::compiler::target::word AOT_Thread_end_offset = 56;
static constexpr dart::compiler::target::word
- AOT_Thread_enter_safepoint_stub_offset = 252;
+ AOT_Thread_enter_safepoint_stub_offset = 260;
static constexpr dart::compiler::target::word
- AOT_Thread_execution_state_offset = 744;
+ AOT_Thread_execution_state_offset = 752;
static constexpr dart::compiler::target::word
- AOT_Thread_exit_safepoint_stub_offset = 256;
+ AOT_Thread_exit_safepoint_stub_offset = 264;
static constexpr dart::compiler::target::word
- AOT_Thread_call_native_through_safepoint_stub_offset = 260;
+ AOT_Thread_call_native_through_safepoint_stub_offset = 268;
static constexpr dart::compiler::target::word
- AOT_Thread_call_native_through_safepoint_entry_point_offset = 320;
+ AOT_Thread_call_native_through_safepoint_entry_point_offset = 328;
static constexpr dart::compiler::target::word
AOT_Thread_fix_allocation_stub_code_offset = 136;
static constexpr dart::compiler::target::word
AOT_Thread_fix_callers_target_code_offset = 132;
static constexpr dart::compiler::target::word
- AOT_Thread_float_absolute_address_offset = 368;
+ AOT_Thread_float_absolute_address_offset = 376;
static constexpr dart::compiler::target::word
- AOT_Thread_float_negate_address_offset = 364;
+ AOT_Thread_float_negate_address_offset = 372;
static constexpr dart::compiler::target::word
- AOT_Thread_float_not_address_offset = 360;
+ AOT_Thread_float_not_address_offset = 368;
static constexpr dart::compiler::target::word
- AOT_Thread_float_zerow_address_offset = 372;
+ AOT_Thread_float_zerow_address_offset = 380;
static constexpr dart::compiler::target::word
- AOT_Thread_global_object_pool_offset = 732;
+ AOT_Thread_global_object_pool_offset = 740;
static constexpr dart::compiler::target::word
- AOT_Thread_interpret_call_entry_point_offset = 340;
+ AOT_Thread_interpret_call_entry_point_offset = 348;
static constexpr dart::compiler::target::word
AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
static constexpr dart::compiler::target::word
AOT_Thread_invoke_dart_code_stub_offset = 140;
static constexpr dart::compiler::target::word
- AOT_Thread_exit_through_ffi_offset = 756;
+ AOT_Thread_exit_through_ffi_offset = 764;
static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 44;
static constexpr dart::compiler::target::word
AOT_Thread_field_table_values_offset = 68;
static constexpr dart::compiler::target::word
- AOT_Thread_lazy_deopt_from_return_stub_offset = 236;
+ AOT_Thread_lazy_deopt_from_return_stub_offset = 244;
static constexpr dart::compiler::target::word
- AOT_Thread_lazy_deopt_from_throw_stub_offset = 240;
+ AOT_Thread_lazy_deopt_from_throw_stub_offset = 248;
static constexpr dart::compiler::target::word
- AOT_Thread_lazy_specialize_type_test_stub_offset = 248;
+ AOT_Thread_lazy_specialize_type_test_stub_offset = 256;
static constexpr dart::compiler::target::word
AOT_Thread_marking_stack_block_offset = 84;
static constexpr dart::compiler::target::word
- AOT_Thread_megamorphic_call_checked_entry_offset = 304;
+ AOT_Thread_megamorphic_call_checked_entry_offset = 312;
static constexpr dart::compiler::target::word
- AOT_Thread_switchable_call_miss_entry_offset = 308;
+ AOT_Thread_switchable_call_miss_entry_offset = 316;
static constexpr dart::compiler::target::word
- AOT_Thread_switchable_call_miss_stub_offset = 212;
+ AOT_Thread_switchable_call_miss_stub_offset = 220;
static constexpr dart::compiler::target::word
- AOT_Thread_no_scope_native_wrapper_entry_point_offset = 332;
+ AOT_Thread_no_scope_native_wrapper_entry_point_offset = 340;
static constexpr dart::compiler::target::word
- AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 156;
+ AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 156;
static constexpr dart::compiler::target::word
- AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 152;
+ AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
+ 152;
static constexpr dart::compiler::target::word
- AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 164;
+ AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 164;
static constexpr dart::compiler::target::word
- AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 160;
+ AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 160;
static constexpr dart::compiler::target::word
- AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 172;
+ AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 172;
static constexpr dart::compiler::target::word
- AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 168;
+ AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 168;
static constexpr dart::compiler::target::word
- AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 180;
+ AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 180;
static constexpr dart::compiler::target::word
- AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 176;
+ AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 176;
+static constexpr dart::compiler::target::word
+ AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 188;
+static constexpr dart::compiler::target::word
+ AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 184;
static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
112;
static constexpr dart::compiler::target::word
- AOT_Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 736;
+ AOT_Thread_predefined_symbols_address_offset = 352;
+static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 744;
static constexpr dart::compiler::target::word
- AOT_Thread_saved_shadow_call_stack_offset = 740;
+ AOT_Thread_saved_shadow_call_stack_offset = 748;
static constexpr dart::compiler::target::word
- AOT_Thread_safepoint_state_offset = 748;
+ AOT_Thread_safepoint_state_offset = 756;
static constexpr dart::compiler::target::word
- AOT_Thread_slow_type_test_stub_offset = 244;
+ AOT_Thread_slow_type_test_stub_offset = 252;
static constexpr dart::compiler::target::word
- AOT_Thread_slow_type_test_entry_point_offset = 324;
+ AOT_Thread_slow_type_test_entry_point_offset = 332;
static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
36;
static constexpr dart::compiler::target::word
@@ -4417,13 +4558,13 @@
static constexpr dart::compiler::target::word
AOT_Thread_stack_overflow_flags_offset = 64;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 300;
+ AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 308;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 208;
+ AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 216;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 296;
+ AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 304;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 204;
+ AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 212;
static constexpr dart::compiler::target::word
AOT_Thread_store_buffer_block_offset = 80;
static constexpr dart::compiler::target::word
@@ -4437,11 +4578,11 @@
static constexpr dart::compiler::target::word
AOT_Thread_write_barrier_code_offset = 124;
static constexpr dart::compiler::target::word
- AOT_Thread_write_barrier_entry_point_offset = 264;
+ AOT_Thread_write_barrier_entry_point_offset = 272;
static constexpr dart::compiler::target::word
AOT_Thread_write_barrier_mask_offset = 40;
static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
- 752;
+ 760;
static constexpr dart::compiler::target::word
AOT_TimelineStream_enabled_offset = 8;
static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -4463,6 +4604,14 @@
8;
static constexpr dart::compiler::target::word
AOT_TypeArguments_nullability_offset = 16;
+static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
+ 20;
+static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
+ 20;
+static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
+ 42;
+static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
+ 12;
static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 12;
static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
8;
@@ -4496,7 +4645,7 @@
4, 12, 8, 16};
static constexpr dart::compiler::target::word
AOT_Thread_write_barrier_wrappers_thread_offset[] = {
- 692, 696, 700, 704, 708, -1, 712, -1, 716, 720, -1, -1, -1, -1, -1, -1};
+ 700, 704, 708, 712, 716, -1, 720, -1, 724, 728, -1, -1, -1, -1, -1, -1};
static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 8;
static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 12;
static constexpr dart::compiler::target::word AOT_Array_header_size = 12;
@@ -4505,7 +4654,7 @@
static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 112;
static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 28;
-static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 20;
+static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 28;
static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 88;
static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 8;
static constexpr dart::compiler::target::word
@@ -4573,7 +4722,7 @@
static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 20;
static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 8;
static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 12;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 12;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 20;
static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
16;
static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 60;
@@ -4658,6 +4807,8 @@
AOT_SubtypeTestCache_kTestEntryLength = 7;
static constexpr dart::compiler::target::word AOT_SubtypeTestCache_kTestResult =
0;
+static constexpr dart::compiler::target::word AOT_TypeArguments_kMaxElements =
+ 576460752303423487;
static constexpr dart::compiler::target::word
AOT_AbstractType_type_test_stub_entry_point_offset = 8;
static constexpr dart::compiler::target::word
@@ -4699,6 +4850,10 @@
static constexpr dart::compiler::target::word AOT_Closure_hash_offset = 48;
static constexpr dart::compiler::target::word
AOT_Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+ AOT_ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+ AOT_ClosureData_default_type_arguments_info_offset = 48;
static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word
AOT_Code_saved_instructions_offset = 48;
@@ -4725,8 +4880,10 @@
static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 74;
static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 78;
static constexpr dart::compiler::target::word AOT_Function_code_offset = 88;
+static constexpr dart::compiler::target::word AOT_Function_data_offset = 72;
static constexpr dart::compiler::target::word
AOT_Function_entry_point_offset[] = {8, 16};
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 96;
static constexpr dart::compiler::target::word
AOT_Function_packed_fields_offset = 100;
static constexpr dart::compiler::target::word
@@ -4827,148 +4984,153 @@
static constexpr dart::compiler::target::word
AOT_SubtypeTestCache_cache_offset = 8;
static constexpr dart::compiler::target::word
- AOT_Thread_AllocateArray_entry_point_offset = 736;
+ AOT_Thread_AllocateArray_entry_point_offset = 752;
static constexpr dart::compiler::target::word
- AOT_Thread_active_exception_offset = 1456;
+ AOT_Thread_active_exception_offset = 1472;
static constexpr dart::compiler::target::word
- AOT_Thread_active_stacktrace_offset = 1464;
+ AOT_Thread_active_stacktrace_offset = 1480;
static constexpr dart::compiler::target::word
AOT_Thread_array_write_barrier_code_offset = 240;
static constexpr dart::compiler::target::word
- AOT_Thread_array_write_barrier_entry_point_offset = 520;
+ AOT_Thread_array_write_barrier_entry_point_offset = 536;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+ AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+ AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+ AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+ AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_entry_point_offset = 552;
+ AOT_Thread_allocate_object_entry_point_offset = 568;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_stub_offset = 368;
+ AOT_Thread_allocate_object_stub_offset = 384;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_parameterized_entry_point_offset = 560;
+ AOT_Thread_allocate_object_parameterized_entry_point_offset = 576;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_parameterized_stub_offset = 376;
+ AOT_Thread_allocate_object_parameterized_stub_offset = 392;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_slow_entry_point_offset = 568;
+ AOT_Thread_allocate_object_slow_entry_point_offset = 584;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_slow_stub_offset = 384;
+ AOT_Thread_allocate_object_slow_stub_offset = 400;
static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
- 1528;
+ 1544;
static constexpr dart::compiler::target::word
AOT_Thread_async_stack_trace_offset = 192;
static constexpr dart::compiler::target::word
- AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+ AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 672;
static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
224;
static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 216;
static constexpr dart::compiler::target::word
- AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+ AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 656;
static constexpr dart::compiler::target::word
- AOT_Thread_call_to_runtime_entry_point_offset = 528;
+ AOT_Thread_call_to_runtime_entry_point_offset = 544;
static constexpr dart::compiler::target::word
AOT_Thread_call_to_runtime_stub_offset = 280;
static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
- 1544;
+ 1560;
static constexpr dart::compiler::target::word
AOT_Thread_dispatch_table_array_offset = 96;
static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
- 608;
+ 624;
static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
- 440;
+ 456;
static constexpr dart::compiler::target::word
- AOT_Thread_deoptimize_entry_offset = 616;
+ AOT_Thread_deoptimize_entry_offset = 632;
static constexpr dart::compiler::target::word
- AOT_Thread_deoptimize_stub_offset = 448;
+ AOT_Thread_deoptimize_stub_offset = 464;
static constexpr dart::compiler::target::word
- AOT_Thread_double_abs_address_offset = 696;
+ AOT_Thread_double_abs_address_offset = 712;
static constexpr dart::compiler::target::word
- AOT_Thread_double_negate_address_offset = 688;
+ AOT_Thread_double_negate_address_offset = 704;
static constexpr dart::compiler::target::word AOT_Thread_end_offset = 112;
static constexpr dart::compiler::target::word
- AOT_Thread_enter_safepoint_stub_offset = 488;
+ AOT_Thread_enter_safepoint_stub_offset = 504;
static constexpr dart::compiler::target::word
- AOT_Thread_execution_state_offset = 1496;
+ AOT_Thread_execution_state_offset = 1512;
static constexpr dart::compiler::target::word
- AOT_Thread_exit_safepoint_stub_offset = 496;
+ AOT_Thread_exit_safepoint_stub_offset = 512;
static constexpr dart::compiler::target::word
- AOT_Thread_call_native_through_safepoint_stub_offset = 504;
+ AOT_Thread_call_native_through_safepoint_stub_offset = 520;
static constexpr dart::compiler::target::word
- AOT_Thread_call_native_through_safepoint_entry_point_offset = 624;
+ AOT_Thread_call_native_through_safepoint_entry_point_offset = 640;
static constexpr dart::compiler::target::word
AOT_Thread_fix_allocation_stub_code_offset = 256;
static constexpr dart::compiler::target::word
AOT_Thread_fix_callers_target_code_offset = 248;
static constexpr dart::compiler::target::word
- AOT_Thread_float_absolute_address_offset = 720;
+ AOT_Thread_float_absolute_address_offset = 736;
static constexpr dart::compiler::target::word
- AOT_Thread_float_negate_address_offset = 712;
+ AOT_Thread_float_negate_address_offset = 728;
static constexpr dart::compiler::target::word
- AOT_Thread_float_not_address_offset = 704;
+ AOT_Thread_float_not_address_offset = 720;
static constexpr dart::compiler::target::word
- AOT_Thread_float_zerow_address_offset = 728;
+ AOT_Thread_float_zerow_address_offset = 744;
static constexpr dart::compiler::target::word
- AOT_Thread_global_object_pool_offset = 1472;
+ AOT_Thread_global_object_pool_offset = 1488;
static constexpr dart::compiler::target::word
- AOT_Thread_interpret_call_entry_point_offset = 664;
+ AOT_Thread_interpret_call_entry_point_offset = 680;
static constexpr dart::compiler::target::word
AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
static constexpr dart::compiler::target::word
AOT_Thread_invoke_dart_code_stub_offset = 264;
static constexpr dart::compiler::target::word
- AOT_Thread_exit_through_ffi_offset = 1520;
+ AOT_Thread_exit_through_ffi_offset = 1536;
static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 88;
static constexpr dart::compiler::target::word
AOT_Thread_field_table_values_offset = 136;
static constexpr dart::compiler::target::word
- AOT_Thread_lazy_deopt_from_return_stub_offset = 456;
+ AOT_Thread_lazy_deopt_from_return_stub_offset = 472;
static constexpr dart::compiler::target::word
- AOT_Thread_lazy_deopt_from_throw_stub_offset = 464;
+ AOT_Thread_lazy_deopt_from_throw_stub_offset = 480;
static constexpr dart::compiler::target::word
- AOT_Thread_lazy_specialize_type_test_stub_offset = 480;
+ AOT_Thread_lazy_specialize_type_test_stub_offset = 496;
static constexpr dart::compiler::target::word
AOT_Thread_marking_stack_block_offset = 168;
static constexpr dart::compiler::target::word
- AOT_Thread_megamorphic_call_checked_entry_offset = 592;
+ AOT_Thread_megamorphic_call_checked_entry_offset = 608;
static constexpr dart::compiler::target::word
- AOT_Thread_switchable_call_miss_entry_offset = 600;
+ AOT_Thread_switchable_call_miss_entry_offset = 616;
static constexpr dart::compiler::target::word
- AOT_Thread_switchable_call_miss_stub_offset = 408;
+ AOT_Thread_switchable_call_miss_stub_offset = 424;
static constexpr dart::compiler::target::word
- AOT_Thread_no_scope_native_wrapper_entry_point_offset = 648;
+ AOT_Thread_no_scope_native_wrapper_entry_point_offset = 664;
static constexpr dart::compiler::target::word
- AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+ AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
static constexpr dart::compiler::target::word
- AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+ AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
+ 288;
static constexpr dart::compiler::target::word
- AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+ AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
static constexpr dart::compiler::target::word
- AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+ AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
static constexpr dart::compiler::target::word
- AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+ AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
static constexpr dart::compiler::target::word
- AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+ AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
static constexpr dart::compiler::target::word
- AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+ AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
static constexpr dart::compiler::target::word
- AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+ AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+static constexpr dart::compiler::target::word
+ AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+static constexpr dart::compiler::target::word
+ AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
208;
static constexpr dart::compiler::target::word
- AOT_Thread_predefined_symbols_address_offset = 672;
+ AOT_Thread_predefined_symbols_address_offset = 688;
static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
- 1480;
+ 1496;
static constexpr dart::compiler::target::word
- AOT_Thread_saved_shadow_call_stack_offset = 1488;
+ AOT_Thread_saved_shadow_call_stack_offset = 1504;
static constexpr dart::compiler::target::word
- AOT_Thread_safepoint_state_offset = 1504;
+ AOT_Thread_safepoint_state_offset = 1520;
static constexpr dart::compiler::target::word
- AOT_Thread_slow_type_test_stub_offset = 472;
+ AOT_Thread_slow_type_test_stub_offset = 488;
static constexpr dart::compiler::target::word
- AOT_Thread_slow_type_test_entry_point_offset = 632;
+ AOT_Thread_slow_type_test_entry_point_offset = 648;
static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
72;
static constexpr dart::compiler::target::word
@@ -4976,13 +5138,13 @@
static constexpr dart::compiler::target::word
AOT_Thread_stack_overflow_flags_offset = 128;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+ AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+ AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+ AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+ AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
static constexpr dart::compiler::target::word
AOT_Thread_store_buffer_block_offset = 160;
static constexpr dart::compiler::target::word
@@ -4996,11 +5158,11 @@
static constexpr dart::compiler::target::word
AOT_Thread_write_barrier_code_offset = 232;
static constexpr dart::compiler::target::word
- AOT_Thread_write_barrier_entry_point_offset = 512;
+ AOT_Thread_write_barrier_entry_point_offset = 528;
static constexpr dart::compiler::target::word
AOT_Thread_write_barrier_mask_offset = 80;
static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
- 1512;
+ 1528;
static constexpr dart::compiler::target::word
AOT_TimelineStream_enabled_offset = 16;
static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -5022,6 +5184,14 @@
16;
static constexpr dart::compiler::target::word
AOT_TypeArguments_nullability_offset = 32;
+static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
+ 40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
+ 40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
+ 74;
+static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
+ 24;
static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
16;
@@ -5055,8 +5225,8 @@
8, 24, 16, 32};
static constexpr dart::compiler::target::word
AOT_Thread_write_barrier_wrappers_thread_offset[] = {
- 1368, 1376, 1384, 1392, -1, -1, 1400, 1408,
- 1416, 1424, 1432, -1, 1440, 1448, -1, -1};
+ 1384, 1392, 1400, 1408, -1, -1, 1416, 1424,
+ 1432, 1440, 1448, -1, 1456, 1464, -1, -1};
static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 24;
static constexpr dart::compiler::target::word AOT_Array_header_size = 24;
@@ -5065,7 +5235,7 @@
static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 192;
static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 56;
static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 152;
static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word
@@ -5133,7 +5303,7 @@
static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 40;
static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 40;
static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
32;
static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 120;
@@ -5221,6 +5391,8 @@
AOT_SubtypeTestCache_kTestEntryLength = 7;
static constexpr dart::compiler::target::word AOT_SubtypeTestCache_kTestResult =
0;
+static constexpr dart::compiler::target::word AOT_TypeArguments_kMaxElements =
+ 576460752303423487;
static constexpr dart::compiler::target::word
AOT_AbstractType_type_test_stub_entry_point_offset = 8;
static constexpr dart::compiler::target::word
@@ -5262,6 +5434,10 @@
static constexpr dart::compiler::target::word AOT_Closure_hash_offset = 48;
static constexpr dart::compiler::target::word
AOT_Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+ AOT_ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+ AOT_ClosureData_default_type_arguments_info_offset = 48;
static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word
AOT_Code_saved_instructions_offset = 48;
@@ -5288,8 +5464,10 @@
static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 74;
static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 78;
static constexpr dart::compiler::target::word AOT_Function_code_offset = 88;
+static constexpr dart::compiler::target::word AOT_Function_data_offset = 72;
static constexpr dart::compiler::target::word
AOT_Function_entry_point_offset[] = {8, 16};
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 96;
static constexpr dart::compiler::target::word
AOT_Function_packed_fields_offset = 100;
static constexpr dart::compiler::target::word
@@ -5390,148 +5568,153 @@
static constexpr dart::compiler::target::word
AOT_SubtypeTestCache_cache_offset = 8;
static constexpr dart::compiler::target::word
- AOT_Thread_AllocateArray_entry_point_offset = 736;
+ AOT_Thread_AllocateArray_entry_point_offset = 752;
static constexpr dart::compiler::target::word
- AOT_Thread_active_exception_offset = 1528;
+ AOT_Thread_active_exception_offset = 1544;
static constexpr dart::compiler::target::word
- AOT_Thread_active_stacktrace_offset = 1536;
+ AOT_Thread_active_stacktrace_offset = 1552;
static constexpr dart::compiler::target::word
AOT_Thread_array_write_barrier_code_offset = 240;
static constexpr dart::compiler::target::word
- AOT_Thread_array_write_barrier_entry_point_offset = 520;
+ AOT_Thread_array_write_barrier_entry_point_offset = 536;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+ AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+ AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+ AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+ AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_entry_point_offset = 552;
+ AOT_Thread_allocate_object_entry_point_offset = 568;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_stub_offset = 368;
+ AOT_Thread_allocate_object_stub_offset = 384;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_parameterized_entry_point_offset = 560;
+ AOT_Thread_allocate_object_parameterized_entry_point_offset = 576;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_parameterized_stub_offset = 376;
+ AOT_Thread_allocate_object_parameterized_stub_offset = 392;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_slow_entry_point_offset = 568;
+ AOT_Thread_allocate_object_slow_entry_point_offset = 584;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_slow_stub_offset = 384;
+ AOT_Thread_allocate_object_slow_stub_offset = 400;
static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
- 1600;
+ 1616;
static constexpr dart::compiler::target::word
AOT_Thread_async_stack_trace_offset = 192;
static constexpr dart::compiler::target::word
- AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+ AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 672;
static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
224;
static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 216;
static constexpr dart::compiler::target::word
- AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+ AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 656;
static constexpr dart::compiler::target::word
- AOT_Thread_call_to_runtime_entry_point_offset = 528;
+ AOT_Thread_call_to_runtime_entry_point_offset = 544;
static constexpr dart::compiler::target::word
AOT_Thread_call_to_runtime_stub_offset = 280;
static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
- 1616;
+ 1632;
static constexpr dart::compiler::target::word
AOT_Thread_dispatch_table_array_offset = 96;
static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
- 608;
+ 624;
static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
- 440;
+ 456;
static constexpr dart::compiler::target::word
- AOT_Thread_deoptimize_entry_offset = 616;
+ AOT_Thread_deoptimize_entry_offset = 632;
static constexpr dart::compiler::target::word
- AOT_Thread_deoptimize_stub_offset = 448;
+ AOT_Thread_deoptimize_stub_offset = 464;
static constexpr dart::compiler::target::word
- AOT_Thread_double_abs_address_offset = 696;
+ AOT_Thread_double_abs_address_offset = 712;
static constexpr dart::compiler::target::word
- AOT_Thread_double_negate_address_offset = 688;
+ AOT_Thread_double_negate_address_offset = 704;
static constexpr dart::compiler::target::word AOT_Thread_end_offset = 112;
static constexpr dart::compiler::target::word
- AOT_Thread_enter_safepoint_stub_offset = 488;
+ AOT_Thread_enter_safepoint_stub_offset = 504;
static constexpr dart::compiler::target::word
- AOT_Thread_execution_state_offset = 1568;
+ AOT_Thread_execution_state_offset = 1584;
static constexpr dart::compiler::target::word
- AOT_Thread_exit_safepoint_stub_offset = 496;
+ AOT_Thread_exit_safepoint_stub_offset = 512;
static constexpr dart::compiler::target::word
- AOT_Thread_call_native_through_safepoint_stub_offset = 504;
+ AOT_Thread_call_native_through_safepoint_stub_offset = 520;
static constexpr dart::compiler::target::word
- AOT_Thread_call_native_through_safepoint_entry_point_offset = 624;
+ AOT_Thread_call_native_through_safepoint_entry_point_offset = 640;
static constexpr dart::compiler::target::word
AOT_Thread_fix_allocation_stub_code_offset = 256;
static constexpr dart::compiler::target::word
AOT_Thread_fix_callers_target_code_offset = 248;
static constexpr dart::compiler::target::word
- AOT_Thread_float_absolute_address_offset = 720;
+ AOT_Thread_float_absolute_address_offset = 736;
static constexpr dart::compiler::target::word
- AOT_Thread_float_negate_address_offset = 712;
+ AOT_Thread_float_negate_address_offset = 728;
static constexpr dart::compiler::target::word
- AOT_Thread_float_not_address_offset = 704;
+ AOT_Thread_float_not_address_offset = 720;
static constexpr dart::compiler::target::word
- AOT_Thread_float_zerow_address_offset = 728;
+ AOT_Thread_float_zerow_address_offset = 744;
static constexpr dart::compiler::target::word
- AOT_Thread_global_object_pool_offset = 1544;
+ AOT_Thread_global_object_pool_offset = 1560;
static constexpr dart::compiler::target::word
- AOT_Thread_interpret_call_entry_point_offset = 664;
+ AOT_Thread_interpret_call_entry_point_offset = 680;
static constexpr dart::compiler::target::word
AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
static constexpr dart::compiler::target::word
AOT_Thread_invoke_dart_code_stub_offset = 264;
static constexpr dart::compiler::target::word
- AOT_Thread_exit_through_ffi_offset = 1592;
+ AOT_Thread_exit_through_ffi_offset = 1608;
static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 88;
static constexpr dart::compiler::target::word
AOT_Thread_field_table_values_offset = 136;
static constexpr dart::compiler::target::word
- AOT_Thread_lazy_deopt_from_return_stub_offset = 456;
+ AOT_Thread_lazy_deopt_from_return_stub_offset = 472;
static constexpr dart::compiler::target::word
- AOT_Thread_lazy_deopt_from_throw_stub_offset = 464;
+ AOT_Thread_lazy_deopt_from_throw_stub_offset = 480;
static constexpr dart::compiler::target::word
- AOT_Thread_lazy_specialize_type_test_stub_offset = 480;
+ AOT_Thread_lazy_specialize_type_test_stub_offset = 496;
static constexpr dart::compiler::target::word
AOT_Thread_marking_stack_block_offset = 168;
static constexpr dart::compiler::target::word
- AOT_Thread_megamorphic_call_checked_entry_offset = 592;
+ AOT_Thread_megamorphic_call_checked_entry_offset = 608;
static constexpr dart::compiler::target::word
- AOT_Thread_switchable_call_miss_entry_offset = 600;
+ AOT_Thread_switchable_call_miss_entry_offset = 616;
static constexpr dart::compiler::target::word
- AOT_Thread_switchable_call_miss_stub_offset = 408;
+ AOT_Thread_switchable_call_miss_stub_offset = 424;
static constexpr dart::compiler::target::word
- AOT_Thread_no_scope_native_wrapper_entry_point_offset = 648;
+ AOT_Thread_no_scope_native_wrapper_entry_point_offset = 664;
static constexpr dart::compiler::target::word
- AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+ AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
static constexpr dart::compiler::target::word
- AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+ AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
+ 288;
static constexpr dart::compiler::target::word
- AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+ AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
static constexpr dart::compiler::target::word
- AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+ AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
static constexpr dart::compiler::target::word
- AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+ AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
static constexpr dart::compiler::target::word
- AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+ AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
static constexpr dart::compiler::target::word
- AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+ AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
static constexpr dart::compiler::target::word
- AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+ AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+static constexpr dart::compiler::target::word
+ AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+static constexpr dart::compiler::target::word
+ AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
208;
static constexpr dart::compiler::target::word
- AOT_Thread_predefined_symbols_address_offset = 672;
+ AOT_Thread_predefined_symbols_address_offset = 688;
static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
- 1552;
+ 1568;
static constexpr dart::compiler::target::word
- AOT_Thread_saved_shadow_call_stack_offset = 1560;
+ AOT_Thread_saved_shadow_call_stack_offset = 1576;
static constexpr dart::compiler::target::word
- AOT_Thread_safepoint_state_offset = 1576;
+ AOT_Thread_safepoint_state_offset = 1592;
static constexpr dart::compiler::target::word
- AOT_Thread_slow_type_test_stub_offset = 472;
+ AOT_Thread_slow_type_test_stub_offset = 488;
static constexpr dart::compiler::target::word
- AOT_Thread_slow_type_test_entry_point_offset = 632;
+ AOT_Thread_slow_type_test_entry_point_offset = 648;
static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
72;
static constexpr dart::compiler::target::word
@@ -5539,13 +5722,13 @@
static constexpr dart::compiler::target::word
AOT_Thread_stack_overflow_flags_offset = 128;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+ AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+ AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+ AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+ AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
static constexpr dart::compiler::target::word
AOT_Thread_store_buffer_block_offset = 160;
static constexpr dart::compiler::target::word
@@ -5559,11 +5742,11 @@
static constexpr dart::compiler::target::word
AOT_Thread_write_barrier_code_offset = 232;
static constexpr dart::compiler::target::word
- AOT_Thread_write_barrier_entry_point_offset = 512;
+ AOT_Thread_write_barrier_entry_point_offset = 528;
static constexpr dart::compiler::target::word
AOT_Thread_write_barrier_mask_offset = 80;
static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
- 1584;
+ 1600;
static constexpr dart::compiler::target::word
AOT_TimelineStream_enabled_offset = 16;
static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -5585,6 +5768,14 @@
16;
static constexpr dart::compiler::target::word
AOT_TypeArguments_nullability_offset = 32;
+static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
+ 40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
+ 40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
+ 74;
+static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
+ 24;
static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
16;
@@ -5618,9 +5809,9 @@
8, 24, 16, 32};
static constexpr dart::compiler::target::word
AOT_Thread_write_barrier_wrappers_thread_offset[] = {
- 1368, 1376, 1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448,
- 1456, 1464, 1472, 1480, -1, -1, -1, -1, 1488, 1496, -1,
- -1, 1504, 1512, 1520, -1, -1, -1, -1, -1, -1};
+ 1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448, 1456, 1464,
+ 1472, 1480, 1488, 1496, -1, -1, -1, -1, 1504, 1512, -1,
+ -1, 1520, 1528, 1536, -1, -1, -1, -1, -1, -1};
static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 24;
static constexpr dart::compiler::target::word AOT_Array_header_size = 24;
@@ -5629,7 +5820,7 @@
static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 192;
static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 56;
static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 152;
static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word
@@ -5697,7 +5888,7 @@
static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 40;
static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 40;
static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
32;
static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 120;
@@ -5783,6 +5974,8 @@
AOT_SubtypeTestCache_kTestEntryLength = 7;
static constexpr dart::compiler::target::word AOT_SubtypeTestCache_kTestResult =
0;
+static constexpr dart::compiler::target::word AOT_TypeArguments_kMaxElements =
+ 268435455;
static constexpr dart::compiler::target::word
AOT_AbstractType_type_test_stub_entry_point_offset = 4;
static constexpr dart::compiler::target::word
@@ -5822,6 +6015,10 @@
static constexpr dart::compiler::target::word AOT_Closure_hash_offset = 24;
static constexpr dart::compiler::target::word
AOT_Closure_instantiator_type_arguments_offset = 4;
+static constexpr dart::compiler::target::word
+ AOT_ClosureData_default_type_arguments_offset = 20;
+static constexpr dart::compiler::target::word
+ AOT_ClosureData_default_type_arguments_info_offset = 24;
static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 20;
static constexpr dart::compiler::target::word
AOT_Code_saved_instructions_offset = 24;
@@ -5848,8 +6045,10 @@
static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 42;
static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 46;
static constexpr dart::compiler::target::word AOT_Function_code_offset = 44;
+static constexpr dart::compiler::target::word AOT_Function_data_offset = 36;
static constexpr dart::compiler::target::word
AOT_Function_entry_point_offset[] = {4, 8};
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 48;
static constexpr dart::compiler::target::word
AOT_Function_packed_fields_offset = 52;
static constexpr dart::compiler::target::word
@@ -5948,147 +6147,152 @@
static constexpr dart::compiler::target::word
AOT_SubtypeTestCache_cache_offset = 4;
static constexpr dart::compiler::target::word
- AOT_Thread_AllocateArray_entry_point_offset = 376;
+ AOT_Thread_AllocateArray_entry_point_offset = 384;
static constexpr dart::compiler::target::word
- AOT_Thread_active_exception_offset = 724;
+ AOT_Thread_active_exception_offset = 732;
static constexpr dart::compiler::target::word
- AOT_Thread_active_stacktrace_offset = 728;
+ AOT_Thread_active_stacktrace_offset = 736;
static constexpr dart::compiler::target::word
AOT_Thread_array_write_barrier_code_offset = 128;
static constexpr dart::compiler::target::word
- AOT_Thread_array_write_barrier_entry_point_offset = 268;
+ AOT_Thread_array_write_barrier_entry_point_offset = 276;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 276;
+ AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 284;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 184;
+ AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 192;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 280;
+ AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 288;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 188;
+ AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 196;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_entry_point_offset = 284;
+ AOT_Thread_allocate_object_entry_point_offset = 292;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_stub_offset = 192;
+ AOT_Thread_allocate_object_stub_offset = 200;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_parameterized_entry_point_offset = 288;
+ AOT_Thread_allocate_object_parameterized_entry_point_offset = 296;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_parameterized_stub_offset = 196;
+ AOT_Thread_allocate_object_parameterized_stub_offset = 204;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_slow_entry_point_offset = 292;
+ AOT_Thread_allocate_object_slow_entry_point_offset = 300;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_slow_stub_offset = 200;
+ AOT_Thread_allocate_object_slow_stub_offset = 208;
static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
- 760;
+ 768;
static constexpr dart::compiler::target::word
AOT_Thread_async_stack_trace_offset = 96;
static constexpr dart::compiler::target::word
- AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 336;
+ AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 344;
static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
120;
static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 116;
static constexpr dart::compiler::target::word
- AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 328;
+ AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 336;
static constexpr dart::compiler::target::word
- AOT_Thread_call_to_runtime_entry_point_offset = 272;
+ AOT_Thread_call_to_runtime_entry_point_offset = 280;
static constexpr dart::compiler::target::word
AOT_Thread_call_to_runtime_stub_offset = 148;
static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
- 768;
+ 776;
static constexpr dart::compiler::target::word
AOT_Thread_dispatch_table_array_offset = 48;
static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
- 312;
+ 320;
static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
- 228;
+ 236;
static constexpr dart::compiler::target::word
- AOT_Thread_deoptimize_entry_offset = 316;
+ AOT_Thread_deoptimize_entry_offset = 324;
static constexpr dart::compiler::target::word
- AOT_Thread_deoptimize_stub_offset = 232;
+ AOT_Thread_deoptimize_stub_offset = 240;
static constexpr dart::compiler::target::word
- AOT_Thread_double_abs_address_offset = 356;
+ AOT_Thread_double_abs_address_offset = 364;
static constexpr dart::compiler::target::word
- AOT_Thread_double_negate_address_offset = 352;
+ AOT_Thread_double_negate_address_offset = 360;
static constexpr dart::compiler::target::word AOT_Thread_end_offset = 56;
static constexpr dart::compiler::target::word
- AOT_Thread_enter_safepoint_stub_offset = 252;
+ AOT_Thread_enter_safepoint_stub_offset = 260;
static constexpr dart::compiler::target::word
- AOT_Thread_execution_state_offset = 744;
+ AOT_Thread_execution_state_offset = 752;
static constexpr dart::compiler::target::word
- AOT_Thread_exit_safepoint_stub_offset = 256;
+ AOT_Thread_exit_safepoint_stub_offset = 264;
static constexpr dart::compiler::target::word
- AOT_Thread_call_native_through_safepoint_stub_offset = 260;
+ AOT_Thread_call_native_through_safepoint_stub_offset = 268;
static constexpr dart::compiler::target::word
- AOT_Thread_call_native_through_safepoint_entry_point_offset = 320;
+ AOT_Thread_call_native_through_safepoint_entry_point_offset = 328;
static constexpr dart::compiler::target::word
AOT_Thread_fix_allocation_stub_code_offset = 136;
static constexpr dart::compiler::target::word
AOT_Thread_fix_callers_target_code_offset = 132;
static constexpr dart::compiler::target::word
- AOT_Thread_float_absolute_address_offset = 368;
+ AOT_Thread_float_absolute_address_offset = 376;
static constexpr dart::compiler::target::word
- AOT_Thread_float_negate_address_offset = 364;
+ AOT_Thread_float_negate_address_offset = 372;
static constexpr dart::compiler::target::word
- AOT_Thread_float_not_address_offset = 360;
+ AOT_Thread_float_not_address_offset = 368;
static constexpr dart::compiler::target::word
- AOT_Thread_float_zerow_address_offset = 372;
+ AOT_Thread_float_zerow_address_offset = 380;
static constexpr dart::compiler::target::word
- AOT_Thread_global_object_pool_offset = 732;
+ AOT_Thread_global_object_pool_offset = 740;
static constexpr dart::compiler::target::word
- AOT_Thread_interpret_call_entry_point_offset = 340;
+ AOT_Thread_interpret_call_entry_point_offset = 348;
static constexpr dart::compiler::target::word
AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 144;
static constexpr dart::compiler::target::word
AOT_Thread_invoke_dart_code_stub_offset = 140;
static constexpr dart::compiler::target::word
- AOT_Thread_exit_through_ffi_offset = 756;
+ AOT_Thread_exit_through_ffi_offset = 764;
static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 44;
static constexpr dart::compiler::target::word
AOT_Thread_field_table_values_offset = 68;
static constexpr dart::compiler::target::word
- AOT_Thread_lazy_deopt_from_return_stub_offset = 236;
+ AOT_Thread_lazy_deopt_from_return_stub_offset = 244;
static constexpr dart::compiler::target::word
- AOT_Thread_lazy_deopt_from_throw_stub_offset = 240;
+ AOT_Thread_lazy_deopt_from_throw_stub_offset = 248;
static constexpr dart::compiler::target::word
- AOT_Thread_lazy_specialize_type_test_stub_offset = 248;
+ AOT_Thread_lazy_specialize_type_test_stub_offset = 256;
static constexpr dart::compiler::target::word
AOT_Thread_marking_stack_block_offset = 84;
static constexpr dart::compiler::target::word
- AOT_Thread_megamorphic_call_checked_entry_offset = 304;
+ AOT_Thread_megamorphic_call_checked_entry_offset = 312;
static constexpr dart::compiler::target::word
- AOT_Thread_switchable_call_miss_entry_offset = 308;
+ AOT_Thread_switchable_call_miss_entry_offset = 316;
static constexpr dart::compiler::target::word
- AOT_Thread_switchable_call_miss_stub_offset = 212;
+ AOT_Thread_switchable_call_miss_stub_offset = 220;
static constexpr dart::compiler::target::word
- AOT_Thread_no_scope_native_wrapper_entry_point_offset = 332;
+ AOT_Thread_no_scope_native_wrapper_entry_point_offset = 340;
static constexpr dart::compiler::target::word
- AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 156;
+ AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 156;
static constexpr dart::compiler::target::word
- AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 152;
+ AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
+ 152;
static constexpr dart::compiler::target::word
- AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 164;
+ AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 164;
static constexpr dart::compiler::target::word
- AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 160;
+ AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 160;
static constexpr dart::compiler::target::word
- AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 172;
+ AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 172;
static constexpr dart::compiler::target::word
- AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 168;
+ AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 168;
static constexpr dart::compiler::target::word
- AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 180;
+ AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 180;
static constexpr dart::compiler::target::word
- AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 176;
+ AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 176;
+static constexpr dart::compiler::target::word
+ AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 188;
+static constexpr dart::compiler::target::word
+ AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 184;
static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
112;
static constexpr dart::compiler::target::word
- AOT_Thread_predefined_symbols_address_offset = 344;
-static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 736;
+ AOT_Thread_predefined_symbols_address_offset = 352;
+static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset = 744;
static constexpr dart::compiler::target::word
- AOT_Thread_saved_shadow_call_stack_offset = 740;
+ AOT_Thread_saved_shadow_call_stack_offset = 748;
static constexpr dart::compiler::target::word
- AOT_Thread_safepoint_state_offset = 748;
+ AOT_Thread_safepoint_state_offset = 756;
static constexpr dart::compiler::target::word
- AOT_Thread_slow_type_test_stub_offset = 244;
+ AOT_Thread_slow_type_test_stub_offset = 252;
static constexpr dart::compiler::target::word
- AOT_Thread_slow_type_test_entry_point_offset = 324;
+ AOT_Thread_slow_type_test_entry_point_offset = 332;
static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
36;
static constexpr dart::compiler::target::word
@@ -6096,13 +6300,13 @@
static constexpr dart::compiler::target::word
AOT_Thread_stack_overflow_flags_offset = 64;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 300;
+ AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 308;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 208;
+ AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 216;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 296;
+ AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 304;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 204;
+ AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 212;
static constexpr dart::compiler::target::word
AOT_Thread_store_buffer_block_offset = 80;
static constexpr dart::compiler::target::word
@@ -6116,11 +6320,11 @@
static constexpr dart::compiler::target::word
AOT_Thread_write_barrier_code_offset = 124;
static constexpr dart::compiler::target::word
- AOT_Thread_write_barrier_entry_point_offset = 264;
+ AOT_Thread_write_barrier_entry_point_offset = 272;
static constexpr dart::compiler::target::word
AOT_Thread_write_barrier_mask_offset = 40;
static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
- 752;
+ 760;
static constexpr dart::compiler::target::word
AOT_TimelineStream_enabled_offset = 8;
static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -6142,6 +6346,14 @@
8;
static constexpr dart::compiler::target::word
AOT_TypeArguments_nullability_offset = 16;
+static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
+ 20;
+static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
+ 20;
+static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
+ 42;
+static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
+ 12;
static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 12;
static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
8;
@@ -6172,7 +6384,7 @@
4, 12, 8, 16};
static constexpr dart::compiler::target::word
AOT_Thread_write_barrier_wrappers_thread_offset[] = {
- 692, 696, 700, 704, 708, -1, 712, -1, 716, 720, -1, -1, -1, -1, -1, -1};
+ 700, 704, 708, 712, 716, -1, 720, -1, 724, 728, -1, -1, -1, -1, -1, -1};
static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 8;
static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 12;
static constexpr dart::compiler::target::word AOT_Array_header_size = 12;
@@ -6181,7 +6393,7 @@
static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 112;
static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 28;
-static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 20;
+static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 28;
static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 64;
static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 8;
static constexpr dart::compiler::target::word
@@ -6249,7 +6461,7 @@
static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 20;
static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 8;
static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 12;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 12;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 20;
static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
16;
static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 60;
@@ -6334,6 +6546,8 @@
AOT_SubtypeTestCache_kTestEntryLength = 7;
static constexpr dart::compiler::target::word AOT_SubtypeTestCache_kTestResult =
0;
+static constexpr dart::compiler::target::word AOT_TypeArguments_kMaxElements =
+ 576460752303423487;
static constexpr dart::compiler::target::word
AOT_AbstractType_type_test_stub_entry_point_offset = 8;
static constexpr dart::compiler::target::word
@@ -6373,6 +6587,10 @@
static constexpr dart::compiler::target::word AOT_Closure_hash_offset = 48;
static constexpr dart::compiler::target::word
AOT_Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+ AOT_ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+ AOT_ClosureData_default_type_arguments_info_offset = 48;
static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word
AOT_Code_saved_instructions_offset = 48;
@@ -6399,8 +6617,10 @@
static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 74;
static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 78;
static constexpr dart::compiler::target::word AOT_Function_code_offset = 88;
+static constexpr dart::compiler::target::word AOT_Function_data_offset = 72;
static constexpr dart::compiler::target::word
AOT_Function_entry_point_offset[] = {8, 16};
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 96;
static constexpr dart::compiler::target::word
AOT_Function_packed_fields_offset = 100;
static constexpr dart::compiler::target::word
@@ -6499,148 +6719,153 @@
static constexpr dart::compiler::target::word
AOT_SubtypeTestCache_cache_offset = 8;
static constexpr dart::compiler::target::word
- AOT_Thread_AllocateArray_entry_point_offset = 736;
+ AOT_Thread_AllocateArray_entry_point_offset = 752;
static constexpr dart::compiler::target::word
- AOT_Thread_active_exception_offset = 1456;
+ AOT_Thread_active_exception_offset = 1472;
static constexpr dart::compiler::target::word
- AOT_Thread_active_stacktrace_offset = 1464;
+ AOT_Thread_active_stacktrace_offset = 1480;
static constexpr dart::compiler::target::word
AOT_Thread_array_write_barrier_code_offset = 240;
static constexpr dart::compiler::target::word
- AOT_Thread_array_write_barrier_entry_point_offset = 520;
+ AOT_Thread_array_write_barrier_entry_point_offset = 536;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+ AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+ AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+ AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+ AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_entry_point_offset = 552;
+ AOT_Thread_allocate_object_entry_point_offset = 568;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_stub_offset = 368;
+ AOT_Thread_allocate_object_stub_offset = 384;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_parameterized_entry_point_offset = 560;
+ AOT_Thread_allocate_object_parameterized_entry_point_offset = 576;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_parameterized_stub_offset = 376;
+ AOT_Thread_allocate_object_parameterized_stub_offset = 392;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_slow_entry_point_offset = 568;
+ AOT_Thread_allocate_object_slow_entry_point_offset = 584;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_slow_stub_offset = 384;
+ AOT_Thread_allocate_object_slow_stub_offset = 400;
static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
- 1528;
+ 1544;
static constexpr dart::compiler::target::word
AOT_Thread_async_stack_trace_offset = 192;
static constexpr dart::compiler::target::word
- AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+ AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 672;
static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
224;
static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 216;
static constexpr dart::compiler::target::word
- AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+ AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 656;
static constexpr dart::compiler::target::word
- AOT_Thread_call_to_runtime_entry_point_offset = 528;
+ AOT_Thread_call_to_runtime_entry_point_offset = 544;
static constexpr dart::compiler::target::word
AOT_Thread_call_to_runtime_stub_offset = 280;
static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
- 1544;
+ 1560;
static constexpr dart::compiler::target::word
AOT_Thread_dispatch_table_array_offset = 96;
static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
- 608;
+ 624;
static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
- 440;
+ 456;
static constexpr dart::compiler::target::word
- AOT_Thread_deoptimize_entry_offset = 616;
+ AOT_Thread_deoptimize_entry_offset = 632;
static constexpr dart::compiler::target::word
- AOT_Thread_deoptimize_stub_offset = 448;
+ AOT_Thread_deoptimize_stub_offset = 464;
static constexpr dart::compiler::target::word
- AOT_Thread_double_abs_address_offset = 696;
+ AOT_Thread_double_abs_address_offset = 712;
static constexpr dart::compiler::target::word
- AOT_Thread_double_negate_address_offset = 688;
+ AOT_Thread_double_negate_address_offset = 704;
static constexpr dart::compiler::target::word AOT_Thread_end_offset = 112;
static constexpr dart::compiler::target::word
- AOT_Thread_enter_safepoint_stub_offset = 488;
+ AOT_Thread_enter_safepoint_stub_offset = 504;
static constexpr dart::compiler::target::word
- AOT_Thread_execution_state_offset = 1496;
+ AOT_Thread_execution_state_offset = 1512;
static constexpr dart::compiler::target::word
- AOT_Thread_exit_safepoint_stub_offset = 496;
+ AOT_Thread_exit_safepoint_stub_offset = 512;
static constexpr dart::compiler::target::word
- AOT_Thread_call_native_through_safepoint_stub_offset = 504;
+ AOT_Thread_call_native_through_safepoint_stub_offset = 520;
static constexpr dart::compiler::target::word
- AOT_Thread_call_native_through_safepoint_entry_point_offset = 624;
+ AOT_Thread_call_native_through_safepoint_entry_point_offset = 640;
static constexpr dart::compiler::target::word
AOT_Thread_fix_allocation_stub_code_offset = 256;
static constexpr dart::compiler::target::word
AOT_Thread_fix_callers_target_code_offset = 248;
static constexpr dart::compiler::target::word
- AOT_Thread_float_absolute_address_offset = 720;
+ AOT_Thread_float_absolute_address_offset = 736;
static constexpr dart::compiler::target::word
- AOT_Thread_float_negate_address_offset = 712;
+ AOT_Thread_float_negate_address_offset = 728;
static constexpr dart::compiler::target::word
- AOT_Thread_float_not_address_offset = 704;
+ AOT_Thread_float_not_address_offset = 720;
static constexpr dart::compiler::target::word
- AOT_Thread_float_zerow_address_offset = 728;
+ AOT_Thread_float_zerow_address_offset = 744;
static constexpr dart::compiler::target::word
- AOT_Thread_global_object_pool_offset = 1472;
+ AOT_Thread_global_object_pool_offset = 1488;
static constexpr dart::compiler::target::word
- AOT_Thread_interpret_call_entry_point_offset = 664;
+ AOT_Thread_interpret_call_entry_point_offset = 680;
static constexpr dart::compiler::target::word
AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
static constexpr dart::compiler::target::word
AOT_Thread_invoke_dart_code_stub_offset = 264;
static constexpr dart::compiler::target::word
- AOT_Thread_exit_through_ffi_offset = 1520;
+ AOT_Thread_exit_through_ffi_offset = 1536;
static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 88;
static constexpr dart::compiler::target::word
AOT_Thread_field_table_values_offset = 136;
static constexpr dart::compiler::target::word
- AOT_Thread_lazy_deopt_from_return_stub_offset = 456;
+ AOT_Thread_lazy_deopt_from_return_stub_offset = 472;
static constexpr dart::compiler::target::word
- AOT_Thread_lazy_deopt_from_throw_stub_offset = 464;
+ AOT_Thread_lazy_deopt_from_throw_stub_offset = 480;
static constexpr dart::compiler::target::word
- AOT_Thread_lazy_specialize_type_test_stub_offset = 480;
+ AOT_Thread_lazy_specialize_type_test_stub_offset = 496;
static constexpr dart::compiler::target::word
AOT_Thread_marking_stack_block_offset = 168;
static constexpr dart::compiler::target::word
- AOT_Thread_megamorphic_call_checked_entry_offset = 592;
+ AOT_Thread_megamorphic_call_checked_entry_offset = 608;
static constexpr dart::compiler::target::word
- AOT_Thread_switchable_call_miss_entry_offset = 600;
+ AOT_Thread_switchable_call_miss_entry_offset = 616;
static constexpr dart::compiler::target::word
- AOT_Thread_switchable_call_miss_stub_offset = 408;
+ AOT_Thread_switchable_call_miss_stub_offset = 424;
static constexpr dart::compiler::target::word
- AOT_Thread_no_scope_native_wrapper_entry_point_offset = 648;
+ AOT_Thread_no_scope_native_wrapper_entry_point_offset = 664;
static constexpr dart::compiler::target::word
- AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+ AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
static constexpr dart::compiler::target::word
- AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+ AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
+ 288;
static constexpr dart::compiler::target::word
- AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+ AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
static constexpr dart::compiler::target::word
- AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+ AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
static constexpr dart::compiler::target::word
- AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+ AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
static constexpr dart::compiler::target::word
- AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+ AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
static constexpr dart::compiler::target::word
- AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+ AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
static constexpr dart::compiler::target::word
- AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+ AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+static constexpr dart::compiler::target::word
+ AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+static constexpr dart::compiler::target::word
+ AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
208;
static constexpr dart::compiler::target::word
- AOT_Thread_predefined_symbols_address_offset = 672;
+ AOT_Thread_predefined_symbols_address_offset = 688;
static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
- 1480;
+ 1496;
static constexpr dart::compiler::target::word
- AOT_Thread_saved_shadow_call_stack_offset = 1488;
+ AOT_Thread_saved_shadow_call_stack_offset = 1504;
static constexpr dart::compiler::target::word
- AOT_Thread_safepoint_state_offset = 1504;
+ AOT_Thread_safepoint_state_offset = 1520;
static constexpr dart::compiler::target::word
- AOT_Thread_slow_type_test_stub_offset = 472;
+ AOT_Thread_slow_type_test_stub_offset = 488;
static constexpr dart::compiler::target::word
- AOT_Thread_slow_type_test_entry_point_offset = 632;
+ AOT_Thread_slow_type_test_entry_point_offset = 648;
static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
72;
static constexpr dart::compiler::target::word
@@ -6648,13 +6873,13 @@
static constexpr dart::compiler::target::word
AOT_Thread_stack_overflow_flags_offset = 128;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+ AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+ AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+ AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+ AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
static constexpr dart::compiler::target::word
AOT_Thread_store_buffer_block_offset = 160;
static constexpr dart::compiler::target::word
@@ -6668,11 +6893,11 @@
static constexpr dart::compiler::target::word
AOT_Thread_write_barrier_code_offset = 232;
static constexpr dart::compiler::target::word
- AOT_Thread_write_barrier_entry_point_offset = 512;
+ AOT_Thread_write_barrier_entry_point_offset = 528;
static constexpr dart::compiler::target::word
AOT_Thread_write_barrier_mask_offset = 80;
static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
- 1512;
+ 1528;
static constexpr dart::compiler::target::word
AOT_TimelineStream_enabled_offset = 16;
static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -6694,6 +6919,14 @@
16;
static constexpr dart::compiler::target::word
AOT_TypeArguments_nullability_offset = 32;
+static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
+ 40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
+ 40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
+ 74;
+static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
+ 24;
static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
16;
@@ -6724,8 +6957,8 @@
8, 24, 16, 32};
static constexpr dart::compiler::target::word
AOT_Thread_write_barrier_wrappers_thread_offset[] = {
- 1368, 1376, 1384, 1392, -1, -1, 1400, 1408,
- 1416, 1424, 1432, -1, 1440, 1448, -1, -1};
+ 1384, 1392, 1400, 1408, -1, -1, 1416, 1424,
+ 1432, 1440, 1448, -1, 1456, 1464, -1, -1};
static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 24;
static constexpr dart::compiler::target::word AOT_Array_header_size = 24;
@@ -6734,7 +6967,7 @@
static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 192;
static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 56;
static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 120;
static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word
@@ -6802,7 +7035,7 @@
static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 40;
static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 40;
static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
32;
static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 120;
@@ -6890,6 +7123,8 @@
AOT_SubtypeTestCache_kTestEntryLength = 7;
static constexpr dart::compiler::target::word AOT_SubtypeTestCache_kTestResult =
0;
+static constexpr dart::compiler::target::word AOT_TypeArguments_kMaxElements =
+ 576460752303423487;
static constexpr dart::compiler::target::word
AOT_AbstractType_type_test_stub_entry_point_offset = 8;
static constexpr dart::compiler::target::word
@@ -6929,6 +7164,10 @@
static constexpr dart::compiler::target::word AOT_Closure_hash_offset = 48;
static constexpr dart::compiler::target::word
AOT_Closure_instantiator_type_arguments_offset = 8;
+static constexpr dart::compiler::target::word
+ AOT_ClosureData_default_type_arguments_offset = 40;
+static constexpr dart::compiler::target::word
+ AOT_ClosureData_default_type_arguments_info_offset = 48;
static constexpr dart::compiler::target::word AOT_Code_object_pool_offset = 40;
static constexpr dart::compiler::target::word
AOT_Code_saved_instructions_offset = 48;
@@ -6955,8 +7194,10 @@
static constexpr dart::compiler::target::word AOT_Field_is_nullable_offset = 74;
static constexpr dart::compiler::target::word AOT_Field_kind_bits_offset = 78;
static constexpr dart::compiler::target::word AOT_Function_code_offset = 88;
+static constexpr dart::compiler::target::word AOT_Function_data_offset = 72;
static constexpr dart::compiler::target::word
AOT_Function_entry_point_offset[] = {8, 16};
+static constexpr dart::compiler::target::word AOT_Function_kind_tag_offset = 96;
static constexpr dart::compiler::target::word
AOT_Function_packed_fields_offset = 100;
static constexpr dart::compiler::target::word
@@ -7055,148 +7296,153 @@
static constexpr dart::compiler::target::word
AOT_SubtypeTestCache_cache_offset = 8;
static constexpr dart::compiler::target::word
- AOT_Thread_AllocateArray_entry_point_offset = 736;
+ AOT_Thread_AllocateArray_entry_point_offset = 752;
static constexpr dart::compiler::target::word
- AOT_Thread_active_exception_offset = 1528;
+ AOT_Thread_active_exception_offset = 1544;
static constexpr dart::compiler::target::word
- AOT_Thread_active_stacktrace_offset = 1536;
+ AOT_Thread_active_stacktrace_offset = 1552;
static constexpr dart::compiler::target::word
AOT_Thread_array_write_barrier_code_offset = 240;
static constexpr dart::compiler::target::word
- AOT_Thread_array_write_barrier_entry_point_offset = 520;
+ AOT_Thread_array_write_barrier_entry_point_offset = 536;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 536;
+ AOT_Thread_allocate_mint_with_fpu_regs_entry_point_offset = 552;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 352;
+ AOT_Thread_allocate_mint_with_fpu_regs_stub_offset = 368;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 544;
+ AOT_Thread_allocate_mint_without_fpu_regs_entry_point_offset = 560;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 360;
+ AOT_Thread_allocate_mint_without_fpu_regs_stub_offset = 376;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_entry_point_offset = 552;
+ AOT_Thread_allocate_object_entry_point_offset = 568;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_stub_offset = 368;
+ AOT_Thread_allocate_object_stub_offset = 384;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_parameterized_entry_point_offset = 560;
+ AOT_Thread_allocate_object_parameterized_entry_point_offset = 576;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_parameterized_stub_offset = 376;
+ AOT_Thread_allocate_object_parameterized_stub_offset = 392;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_slow_entry_point_offset = 568;
+ AOT_Thread_allocate_object_slow_entry_point_offset = 584;
static constexpr dart::compiler::target::word
- AOT_Thread_allocate_object_slow_stub_offset = 384;
+ AOT_Thread_allocate_object_slow_stub_offset = 400;
static constexpr dart::compiler::target::word AOT_Thread_api_top_scope_offset =
- 1600;
+ 1616;
static constexpr dart::compiler::target::word
AOT_Thread_async_stack_trace_offset = 192;
static constexpr dart::compiler::target::word
- AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 656;
+ AOT_Thread_auto_scope_native_wrapper_entry_point_offset = 672;
static constexpr dart::compiler::target::word AOT_Thread_bool_false_offset =
224;
static constexpr dart::compiler::target::word AOT_Thread_bool_true_offset = 216;
static constexpr dart::compiler::target::word
- AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 640;
+ AOT_Thread_bootstrap_native_wrapper_entry_point_offset = 656;
static constexpr dart::compiler::target::word
- AOT_Thread_call_to_runtime_entry_point_offset = 528;
+ AOT_Thread_call_to_runtime_entry_point_offset = 544;
static constexpr dart::compiler::target::word
AOT_Thread_call_to_runtime_stub_offset = 280;
static constexpr dart::compiler::target::word AOT_Thread_dart_stream_offset =
- 1616;
+ 1632;
static constexpr dart::compiler::target::word
AOT_Thread_dispatch_table_array_offset = 96;
static constexpr dart::compiler::target::word AOT_Thread_optimize_entry_offset =
- 608;
+ 624;
static constexpr dart::compiler::target::word AOT_Thread_optimize_stub_offset =
- 440;
+ 456;
static constexpr dart::compiler::target::word
- AOT_Thread_deoptimize_entry_offset = 616;
+ AOT_Thread_deoptimize_entry_offset = 632;
static constexpr dart::compiler::target::word
- AOT_Thread_deoptimize_stub_offset = 448;
+ AOT_Thread_deoptimize_stub_offset = 464;
static constexpr dart::compiler::target::word
- AOT_Thread_double_abs_address_offset = 696;
+ AOT_Thread_double_abs_address_offset = 712;
static constexpr dart::compiler::target::word
- AOT_Thread_double_negate_address_offset = 688;
+ AOT_Thread_double_negate_address_offset = 704;
static constexpr dart::compiler::target::word AOT_Thread_end_offset = 112;
static constexpr dart::compiler::target::word
- AOT_Thread_enter_safepoint_stub_offset = 488;
+ AOT_Thread_enter_safepoint_stub_offset = 504;
static constexpr dart::compiler::target::word
- AOT_Thread_execution_state_offset = 1568;
+ AOT_Thread_execution_state_offset = 1584;
static constexpr dart::compiler::target::word
- AOT_Thread_exit_safepoint_stub_offset = 496;
+ AOT_Thread_exit_safepoint_stub_offset = 512;
static constexpr dart::compiler::target::word
- AOT_Thread_call_native_through_safepoint_stub_offset = 504;
+ AOT_Thread_call_native_through_safepoint_stub_offset = 520;
static constexpr dart::compiler::target::word
- AOT_Thread_call_native_through_safepoint_entry_point_offset = 624;
+ AOT_Thread_call_native_through_safepoint_entry_point_offset = 640;
static constexpr dart::compiler::target::word
AOT_Thread_fix_allocation_stub_code_offset = 256;
static constexpr dart::compiler::target::word
AOT_Thread_fix_callers_target_code_offset = 248;
static constexpr dart::compiler::target::word
- AOT_Thread_float_absolute_address_offset = 720;
+ AOT_Thread_float_absolute_address_offset = 736;
static constexpr dart::compiler::target::word
- AOT_Thread_float_negate_address_offset = 712;
+ AOT_Thread_float_negate_address_offset = 728;
static constexpr dart::compiler::target::word
- AOT_Thread_float_not_address_offset = 704;
+ AOT_Thread_float_not_address_offset = 720;
static constexpr dart::compiler::target::word
- AOT_Thread_float_zerow_address_offset = 728;
+ AOT_Thread_float_zerow_address_offset = 744;
static constexpr dart::compiler::target::word
- AOT_Thread_global_object_pool_offset = 1544;
+ AOT_Thread_global_object_pool_offset = 1560;
static constexpr dart::compiler::target::word
- AOT_Thread_interpret_call_entry_point_offset = 664;
+ AOT_Thread_interpret_call_entry_point_offset = 680;
static constexpr dart::compiler::target::word
AOT_Thread_invoke_dart_code_from_bytecode_stub_offset = 272;
static constexpr dart::compiler::target::word
AOT_Thread_invoke_dart_code_stub_offset = 264;
static constexpr dart::compiler::target::word
- AOT_Thread_exit_through_ffi_offset = 1592;
+ AOT_Thread_exit_through_ffi_offset = 1608;
static constexpr dart::compiler::target::word AOT_Thread_isolate_offset = 88;
static constexpr dart::compiler::target::word
AOT_Thread_field_table_values_offset = 136;
static constexpr dart::compiler::target::word
- AOT_Thread_lazy_deopt_from_return_stub_offset = 456;
+ AOT_Thread_lazy_deopt_from_return_stub_offset = 472;
static constexpr dart::compiler::target::word
- AOT_Thread_lazy_deopt_from_throw_stub_offset = 464;
+ AOT_Thread_lazy_deopt_from_throw_stub_offset = 480;
static constexpr dart::compiler::target::word
- AOT_Thread_lazy_specialize_type_test_stub_offset = 480;
+ AOT_Thread_lazy_specialize_type_test_stub_offset = 496;
static constexpr dart::compiler::target::word
AOT_Thread_marking_stack_block_offset = 168;
static constexpr dart::compiler::target::word
- AOT_Thread_megamorphic_call_checked_entry_offset = 592;
+ AOT_Thread_megamorphic_call_checked_entry_offset = 608;
static constexpr dart::compiler::target::word
- AOT_Thread_switchable_call_miss_entry_offset = 600;
+ AOT_Thread_switchable_call_miss_entry_offset = 616;
static constexpr dart::compiler::target::word
- AOT_Thread_switchable_call_miss_stub_offset = 408;
+ AOT_Thread_switchable_call_miss_stub_offset = 424;
static constexpr dart::compiler::target::word
- AOT_Thread_no_scope_native_wrapper_entry_point_offset = 648;
+ AOT_Thread_no_scope_native_wrapper_entry_point_offset = 664;
static constexpr dart::compiler::target::word
- AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 296;
+ AOT_Thread_late_initialization_error_shared_with_fpu_regs_stub_offset = 296;
static constexpr dart::compiler::target::word
- AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 288;
+ AOT_Thread_late_initialization_error_shared_without_fpu_regs_stub_offset =
+ 288;
static constexpr dart::compiler::target::word
- AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 312;
+ AOT_Thread_null_error_shared_with_fpu_regs_stub_offset = 312;
static constexpr dart::compiler::target::word
- AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 304;
+ AOT_Thread_null_error_shared_without_fpu_regs_stub_offset = 304;
static constexpr dart::compiler::target::word
- AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 328;
+ AOT_Thread_null_arg_error_shared_with_fpu_regs_stub_offset = 328;
static constexpr dart::compiler::target::word
- AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 320;
+ AOT_Thread_null_arg_error_shared_without_fpu_regs_stub_offset = 320;
static constexpr dart::compiler::target::word
- AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 344;
+ AOT_Thread_null_cast_error_shared_with_fpu_regs_stub_offset = 344;
static constexpr dart::compiler::target::word
- AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 336;
+ AOT_Thread_null_cast_error_shared_without_fpu_regs_stub_offset = 336;
+static constexpr dart::compiler::target::word
+ AOT_Thread_range_error_shared_with_fpu_regs_stub_offset = 360;
+static constexpr dart::compiler::target::word
+ AOT_Thread_range_error_shared_without_fpu_regs_stub_offset = 352;
static constexpr dart::compiler::target::word AOT_Thread_object_null_offset =
208;
static constexpr dart::compiler::target::word
- AOT_Thread_predefined_symbols_address_offset = 672;
+ AOT_Thread_predefined_symbols_address_offset = 688;
static constexpr dart::compiler::target::word AOT_Thread_resume_pc_offset =
- 1552;
+ 1568;
static constexpr dart::compiler::target::word
- AOT_Thread_saved_shadow_call_stack_offset = 1560;
+ AOT_Thread_saved_shadow_call_stack_offset = 1576;
static constexpr dart::compiler::target::word
- AOT_Thread_safepoint_state_offset = 1576;
+ AOT_Thread_safepoint_state_offset = 1592;
static constexpr dart::compiler::target::word
- AOT_Thread_slow_type_test_stub_offset = 472;
+ AOT_Thread_slow_type_test_stub_offset = 488;
static constexpr dart::compiler::target::word
- AOT_Thread_slow_type_test_entry_point_offset = 632;
+ AOT_Thread_slow_type_test_entry_point_offset = 648;
static constexpr dart::compiler::target::word AOT_Thread_stack_limit_offset =
72;
static constexpr dart::compiler::target::word
@@ -7204,13 +7450,13 @@
static constexpr dart::compiler::target::word
AOT_Thread_stack_overflow_flags_offset = 128;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 584;
+ AOT_Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 600;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 400;
+ AOT_Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 416;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 576;
+ AOT_Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 592;
static constexpr dart::compiler::target::word
- AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 392;
+ AOT_Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 408;
static constexpr dart::compiler::target::word
AOT_Thread_store_buffer_block_offset = 160;
static constexpr dart::compiler::target::word
@@ -7224,11 +7470,11 @@
static constexpr dart::compiler::target::word
AOT_Thread_write_barrier_code_offset = 232;
static constexpr dart::compiler::target::word
- AOT_Thread_write_barrier_entry_point_offset = 512;
+ AOT_Thread_write_barrier_entry_point_offset = 528;
static constexpr dart::compiler::target::word
AOT_Thread_write_barrier_mask_offset = 80;
static constexpr dart::compiler::target::word AOT_Thread_callback_code_offset =
- 1584;
+ 1600;
static constexpr dart::compiler::target::word
AOT_TimelineStream_enabled_offset = 16;
static constexpr dart::compiler::target::word AOT_TwoByteString_data_offset =
@@ -7250,6 +7496,14 @@
16;
static constexpr dart::compiler::target::word
AOT_TypeArguments_nullability_offset = 32;
+static constexpr dart::compiler::target::word AOT_TypeArguments_types_offset =
+ 40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_bound_offset =
+ 40;
+static constexpr dart::compiler::target::word AOT_TypeParameter_flags_offset =
+ 74;
+static constexpr dart::compiler::target::word AOT_TypeParameter_name_offset =
+ 24;
static constexpr dart::compiler::target::word AOT_TypeRef_type_offset = 24;
static constexpr dart::compiler::target::word AOT_TypedDataBase_length_offset =
16;
@@ -7280,9 +7534,9 @@
8, 24, 16, 32};
static constexpr dart::compiler::target::word
AOT_Thread_write_barrier_wrappers_thread_offset[] = {
- 1368, 1376, 1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448,
- 1456, 1464, 1472, 1480, -1, -1, -1, -1, 1488, 1496, -1,
- -1, 1504, 1512, 1520, -1, -1, -1, -1, -1, -1};
+ 1384, 1392, 1400, 1408, 1416, 1424, 1432, 1440, 1448, 1456, 1464,
+ 1472, 1480, 1488, 1496, -1, -1, -1, -1, 1504, 1512, -1,
+ -1, 1520, 1528, 1536, -1, -1, -1, -1, -1, -1};
static constexpr dart::compiler::target::word AOT_ApiError_InstanceSize = 16;
static constexpr dart::compiler::target::word AOT_Array_InstanceSize = 24;
static constexpr dart::compiler::target::word AOT_Array_header_size = 24;
@@ -7291,7 +7545,7 @@
static constexpr dart::compiler::target::word AOT_Capability_InstanceSize = 16;
static constexpr dart::compiler::target::word AOT_Class_InstanceSize = 192;
static constexpr dart::compiler::target::word AOT_Closure_InstanceSize = 56;
-static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 40;
+static constexpr dart::compiler::target::word AOT_ClosureData_InstanceSize = 56;
static constexpr dart::compiler::target::word AOT_Code_InstanceSize = 120;
static constexpr dart::compiler::target::word AOT_CodeSourceMap_HeaderSize = 16;
static constexpr dart::compiler::target::word
@@ -7359,7 +7613,7 @@
static constexpr dart::compiler::target::word AOT_PatchClass_InstanceSize = 40;
static constexpr dart::compiler::target::word AOT_PcDescriptors_HeaderSize = 16;
static constexpr dart::compiler::target::word AOT_Pointer_InstanceSize = 24;
-static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 24;
+static constexpr dart::compiler::target::word AOT_ReceivePort_InstanceSize = 40;
static constexpr dart::compiler::target::word AOT_RedirectionData_InstanceSize =
32;
static constexpr dart::compiler::target::word AOT_RegExp_InstanceSize = 120;
diff --git a/runtime/vm/compiler/runtime_offsets_list.h b/runtime/vm/compiler/runtime_offsets_list.h
index 76eb49f..6039830 100644
--- a/runtime/vm/compiler/runtime_offsets_list.h
+++ b/runtime/vm/compiler/runtime_offsets_list.h
@@ -60,6 +60,7 @@
CONSTANT(SubtypeTestCache, kInstantiatorTypeArguments) \
CONSTANT(SubtypeTestCache, kTestEntryLength) \
CONSTANT(SubtypeTestCache, kTestResult) \
+ CONSTANT(TypeArguments, kMaxElements) \
FIELD(AbstractType, type_test_stub_entry_point_offset) \
FIELD(ArgumentsDescriptor, count_offset) \
FIELD(ArgumentsDescriptor, size_offset) \
@@ -84,6 +85,8 @@
FIELD(Closure, function_type_arguments_offset) \
FIELD(Closure, hash_offset) \
FIELD(Closure, instantiator_type_arguments_offset) \
+ FIELD(ClosureData, default_type_arguments_offset) \
+ FIELD(ClosureData, default_type_arguments_info_offset) \
FIELD(Code, object_pool_offset) \
FIELD(Code, saved_instructions_offset) \
FIELD(Code, owner_offset) \
@@ -102,8 +105,10 @@
FIELD(Field, is_nullable_offset) \
FIELD(Field, kind_bits_offset) \
FIELD(Function, code_offset) \
+ FIELD(Function, data_offset) \
RANGE(Function, entry_point_offset, CodeEntryKind, CodeEntryKind::kNormal, \
CodeEntryKind::kUnchecked, [](CodeEntryKind value) { return true; }) \
+ FIELD(Function, kind_tag_offset) \
FIELD(Function, packed_fields_offset) \
FIELD(Function, parameter_names_offset) \
FIELD(Function, parameter_types_offset) \
@@ -217,6 +222,8 @@
FIELD(Thread, switchable_call_miss_entry_offset) \
FIELD(Thread, switchable_call_miss_stub_offset) \
FIELD(Thread, no_scope_native_wrapper_entry_point_offset) \
+ FIELD(Thread, late_initialization_error_shared_with_fpu_regs_stub_offset) \
+ FIELD(Thread, late_initialization_error_shared_without_fpu_regs_stub_offset) \
FIELD(Thread, null_error_shared_with_fpu_regs_stub_offset) \
FIELD(Thread, null_error_shared_without_fpu_regs_stub_offset) \
FIELD(Thread, null_arg_error_shared_with_fpu_regs_stub_offset) \
@@ -264,6 +271,10 @@
FIELD(TypeArguments, instantiations_offset) \
FIELD(TypeArguments, length_offset) \
FIELD(TypeArguments, nullability_offset) \
+ FIELD(TypeArguments, types_offset) \
+ FIELD(TypeParameter, bound_offset) \
+ FIELD(TypeParameter, flags_offset) \
+ FIELD(TypeParameter, name_offset) \
FIELD(TypeRef, type_offset) \
FIELD(TypedDataBase, length_offset) \
FIELD(TypedDataView, data_offset) \
diff --git a/runtime/vm/compiler/stub_code_compiler.cc b/runtime/vm/compiler/stub_code_compiler.cc
index dfa4d4f..547cf92 100644
--- a/runtime/vm/compiler/stub_code_compiler.cc
+++ b/runtime/vm/compiler/stub_code_compiler.cc
@@ -166,6 +166,19 @@
__ Breakpoint();
}
+void StubCodeCompiler::GenerateAssertSubtypeStub(Assembler* assembler) {
+ __ EnterStubFrame();
+ __ PushRegister(AssertSubtypeABI::kInstantiatorTypeArgumentsReg);
+ __ PushRegister(AssertSubtypeABI::kFunctionTypeArgumentsReg);
+ __ PushRegister(AssertSubtypeABI::kSubTypeReg);
+ __ PushRegister(AssertSubtypeABI::kSuperTypeReg);
+ __ PushRegister(AssertSubtypeABI::kDstNameReg);
+ __ CallRuntime(kSubtypeCheckRuntimeEntry, /*argument_count=*/5);
+ __ Drop(5); // Drop unused result as well as arguments.
+ __ LeaveStubFrame();
+ __ Ret();
+}
+
void StubCodeCompiler::GenerateInstanceOfStub(Assembler* assembler) {
__ EnterStubFrame();
__ PushObject(NullObject()); // Make room for the result.
@@ -204,6 +217,106 @@
CLASS_LIST_TYPED_DATA(TYPED_DATA_ALLOCATION_STUB)
#undef TYPED_DATA_ALLOCATION_STUB
+void StubCodeCompiler::GenerateLateInitializationError(Assembler* assembler,
+ bool with_fpu_regs) {
+ auto perform_runtime_call = [&]() {
+ __ PushRegister(LateInitializationErrorABI::kFieldReg);
+ __ CallRuntime(kLateInitializationErrorRuntimeEntry, /*argument_count=*/1);
+ };
+ GenerateSharedStubGeneric(
+ assembler, /*save_fpu_registers=*/with_fpu_regs,
+ with_fpu_regs
+ ? target::Thread::
+ late_initialization_error_shared_with_fpu_regs_stub_offset()
+ : target::Thread::
+ late_initialization_error_shared_without_fpu_regs_stub_offset(),
+ /*allow_return=*/false, perform_runtime_call);
+}
+
+void StubCodeCompiler::GenerateLateInitializationErrorSharedWithoutFPURegsStub(
+ Assembler* assembler) {
+ GenerateLateInitializationError(assembler, /*with_fpu_regs=*/false);
+}
+
+void StubCodeCompiler::GenerateLateInitializationErrorSharedWithFPURegsStub(
+ Assembler* assembler) {
+ GenerateLateInitializationError(assembler, /*with_fpu_regs=*/true);
+}
+
+void StubCodeCompiler::GenerateNullErrorSharedWithoutFPURegsStub(
+ Assembler* assembler) {
+ GenerateSharedStub(
+ assembler, /*save_fpu_registers=*/false, &kNullErrorRuntimeEntry,
+ target::Thread::null_error_shared_without_fpu_regs_stub_offset(),
+ /*allow_return=*/false);
+}
+
+void StubCodeCompiler::GenerateNullErrorSharedWithFPURegsStub(
+ Assembler* assembler) {
+ GenerateSharedStub(
+ assembler, /*save_fpu_registers=*/true, &kNullErrorRuntimeEntry,
+ target::Thread::null_error_shared_with_fpu_regs_stub_offset(),
+ /*allow_return=*/false);
+}
+
+void StubCodeCompiler::GenerateNullArgErrorSharedWithoutFPURegsStub(
+ Assembler* assembler) {
+ GenerateSharedStub(
+ assembler, /*save_fpu_registers=*/false, &kArgumentNullErrorRuntimeEntry,
+ target::Thread::null_arg_error_shared_without_fpu_regs_stub_offset(),
+ /*allow_return=*/false);
+}
+
+void StubCodeCompiler::GenerateNullArgErrorSharedWithFPURegsStub(
+ Assembler* assembler) {
+ GenerateSharedStub(
+ assembler, /*save_fpu_registers=*/true, &kArgumentNullErrorRuntimeEntry,
+ target::Thread::null_arg_error_shared_with_fpu_regs_stub_offset(),
+ /*allow_return=*/false);
+}
+
+void StubCodeCompiler::GenerateNullCastErrorSharedWithoutFPURegsStub(
+ Assembler* assembler) {
+ GenerateSharedStub(
+ assembler, /*save_fpu_registers=*/false, &kNullCastErrorRuntimeEntry,
+ target::Thread::null_cast_error_shared_without_fpu_regs_stub_offset(),
+ /*allow_return=*/false);
+}
+
+void StubCodeCompiler::GenerateNullCastErrorSharedWithFPURegsStub(
+ Assembler* assembler) {
+ GenerateSharedStub(
+ assembler, /*save_fpu_registers=*/true, &kNullCastErrorRuntimeEntry,
+ target::Thread::null_cast_error_shared_with_fpu_regs_stub_offset(),
+ /*allow_return=*/false);
+}
+
+void StubCodeCompiler::GenerateStackOverflowSharedWithoutFPURegsStub(
+ Assembler* assembler) {
+ GenerateSharedStub(
+ assembler, /*save_fpu_registers=*/false, &kStackOverflowRuntimeEntry,
+ target::Thread::stack_overflow_shared_without_fpu_regs_stub_offset(),
+ /*allow_return=*/true);
+}
+
+void StubCodeCompiler::GenerateStackOverflowSharedWithFPURegsStub(
+ Assembler* assembler) {
+ GenerateSharedStub(
+ assembler, /*save_fpu_registers=*/true, &kStackOverflowRuntimeEntry,
+ target::Thread::stack_overflow_shared_with_fpu_regs_stub_offset(),
+ /*allow_return=*/true);
+}
+
+void StubCodeCompiler::GenerateRangeErrorSharedWithoutFPURegsStub(
+ Assembler* assembler) {
+ GenerateRangeError(assembler, /*with_fpu_regs=*/false);
+}
+
+void StubCodeCompiler::GenerateRangeErrorSharedWithFPURegsStub(
+ Assembler* assembler) {
+ GenerateRangeError(assembler, /*with_fpu_regs=*/true);
+}
+
} // namespace compiler
} // namespace dart
diff --git a/runtime/vm/compiler/stub_code_compiler.h b/runtime/vm/compiler/stub_code_compiler.h
index d4a6fd0..5f3e09c 100644
--- a/runtime/vm/compiler/stub_code_compiler.h
+++ b/runtime/vm/compiler/stub_code_compiler.h
@@ -9,6 +9,8 @@
#error "AOT runtime should not use compiler sources (including header files)"
#endif // defined(DART_PRECOMPILED_RUNTIME)
+#include <functional>
+
#include "vm/allocation.h"
#include "vm/compiler/runtime_api.h"
#include "vm/constants.h"
@@ -146,6 +148,30 @@
// Common function for generating Allocate<TypedData>Array stubs.
static void GenerateAllocateTypedDataArrayStub(Assembler* assembler,
intptr_t cid);
+
+ static void GenerateSharedStubGeneric(
+ Assembler* assembler,
+ bool save_fpu_registers,
+ intptr_t self_code_stub_offset_from_thread,
+ bool allow_return,
+ std::function<void()> perform_runtime_call);
+
+ // Generates shared slow path stub which saves registers and calls
+ // [target] runtime entry.
+ // If [store_runtime_result_in_result_register], then stub puts result into
+ // SharedSlowPathStubABI::kResultReg.
+ static void GenerateSharedStub(
+ Assembler* assembler,
+ bool save_fpu_registers,
+ const RuntimeEntry* target,
+ intptr_t self_code_stub_offset_from_thread,
+ bool allow_return,
+ bool store_runtime_result_in_result_register = false);
+
+ static void GenerateLateInitializationError(Assembler* assembler,
+ bool with_fpu_regs);
+
+ static void GenerateRangeError(Assembler* assembler, bool with_fpu_regs);
};
} // namespace compiler
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index b1744c7..fef56a0 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -165,11 +165,12 @@
__ Ret();
}
-void GenerateSharedStubGeneric(Assembler* assembler,
- bool save_fpu_registers,
- intptr_t self_code_stub_offset_from_thread,
- bool allow_return,
- std::function<void()> perform_runtime_call) {
+void StubCodeCompiler::GenerateSharedStubGeneric(
+ Assembler* assembler,
+ bool save_fpu_registers,
+ intptr_t self_code_stub_offset_from_thread,
+ bool allow_return,
+ std::function<void()> perform_runtime_call) {
// If the target CPU does not support VFP the caller should always use the
// non-FPU stub.
if (save_fpu_registers && !TargetCPUFeatures::vfp_supported()) {
@@ -199,24 +200,25 @@
__ bx(LR);
}
-static void GenerateSharedStub(Assembler* assembler,
- bool save_fpu_registers,
- const RuntimeEntry* target,
- intptr_t self_code_stub_offset_from_thread,
- bool allow_return,
- bool store_runtime_result_in_r0 = false) {
- ASSERT(!store_runtime_result_in_r0 || allow_return);
+void StubCodeCompiler::GenerateSharedStub(
+ Assembler* assembler,
+ bool save_fpu_registers,
+ const RuntimeEntry* target,
+ intptr_t self_code_stub_offset_from_thread,
+ bool allow_return,
+ bool store_runtime_result_in_result_register) {
+ ASSERT(!store_runtime_result_in_result_register || allow_return);
auto perform_runtime_call = [&]() {
- if (store_runtime_result_in_r0) {
+ if (store_runtime_result_in_result_register) {
__ PushRegister(LR);
}
__ CallRuntime(*target, /*argument_count=*/0);
- if (store_runtime_result_in_r0) {
+ if (store_runtime_result_in_result_register) {
__ PopRegister(R0);
- __ str(
- R0,
- Address(FP, target::kWordSize *
- StubCodeCompiler::WordOffsetFromFpToCpuRegister(R0)));
+ __ str(R0,
+ Address(FP, target::kWordSize *
+ StubCodeCompiler::WordOffsetFromFpToCpuRegister(
+ SharedSlowPathStubABI::kResultReg)));
}
};
GenerateSharedStubGeneric(assembler, save_fpu_registers,
@@ -491,55 +493,8 @@
__ Breakpoint();
}
-void StubCodeCompiler::GenerateNullErrorSharedWithoutFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/false, &kNullErrorRuntimeEntry,
- target::Thread::null_error_shared_without_fpu_regs_stub_offset(),
- /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullErrorSharedWithFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/true, &kNullErrorRuntimeEntry,
- target::Thread::null_error_shared_with_fpu_regs_stub_offset(),
- /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullArgErrorSharedWithoutFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/false, &kArgumentNullErrorRuntimeEntry,
- target::Thread::null_arg_error_shared_without_fpu_regs_stub_offset(),
- /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullArgErrorSharedWithFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/true, &kArgumentNullErrorRuntimeEntry,
- target::Thread::null_arg_error_shared_with_fpu_regs_stub_offset(),
- /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithoutFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/false, &kNullCastErrorRuntimeEntry,
- target::Thread::null_cast_error_shared_without_fpu_regs_stub_offset(),
- /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/true, &kNullCastErrorRuntimeEntry,
- target::Thread::null_cast_error_shared_with_fpu_regs_stub_offset(),
- /*allow_return=*/false);
-}
-
-static void GenerateRangeError(Assembler* assembler, bool with_fpu_regs) {
+void StubCodeCompiler::GenerateRangeError(Assembler* assembler,
+ bool with_fpu_regs) {
auto perform_runtime_call = [&]() {
ASSERT(!GenericCheckBoundInstr::UseUnboxedRepresentation());
__ PushRegister(RangeErrorABI::kLengthReg);
@@ -556,32 +511,6 @@
/*allow_return=*/false, perform_runtime_call);
}
-void StubCodeCompiler::GenerateRangeErrorSharedWithoutFPURegsStub(
- Assembler* assembler) {
- GenerateRangeError(assembler, /*with_fpu_regs=*/false);
-}
-
-void StubCodeCompiler::GenerateRangeErrorSharedWithFPURegsStub(
- Assembler* assembler) {
- GenerateRangeError(assembler, /*with_fpu_regs=*/true);
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithoutFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/false, &kStackOverflowRuntimeEntry,
- target::Thread::stack_overflow_shared_without_fpu_regs_stub_offset(),
- /*allow_return=*/true);
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/true, &kStackOverflowRuntimeEntry,
- target::Thread::stack_overflow_shared_with_fpu_regs_stub_offset(),
- /*allow_return=*/true);
-}
-
// Input parameters:
// LR : return address.
// SP : address of return value.
@@ -1211,12 +1140,13 @@
__ Bind(&slow_case);
}
- COMPILE_ASSERT(AllocateMintABI::kResultReg == R0);
+ COMPILE_ASSERT(AllocateMintABI::kResultReg ==
+ SharedSlowPathStubABI::kResultReg);
GenerateSharedStub(assembler, /*save_fpu_registers=*/true,
&kAllocateMintRuntimeEntry,
target::Thread::allocate_mint_with_fpu_regs_stub_offset(),
/*allow_return=*/true,
- /*store_runtime_result_in_r0=*/true);
+ /*store_runtime_result_in_result_register=*/true);
}
// Called for allocation of Mint.
@@ -1231,12 +1161,13 @@
__ Bind(&slow_case);
}
- COMPILE_ASSERT(AllocateMintABI::kResultReg == R0);
+ COMPILE_ASSERT(AllocateMintABI::kResultReg ==
+ SharedSlowPathStubABI::kResultReg);
GenerateSharedStub(
assembler, /*save_fpu_registers=*/false, &kAllocateMintRuntimeEntry,
target::Thread::allocate_mint_without_fpu_regs_stub_offset(),
/*allow_return=*/true,
- /*store_runtime_result_in_r0=*/true);
+ /*store_runtime_result_in_result_register=*/true);
}
// Called when invoking Dart code from C++ (VM code).
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index fdb10212..6548ef8 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -181,7 +181,7 @@
__ ret();
}
-static void GenerateSharedStubGeneric(
+void StubCodeCompiler::GenerateSharedStubGeneric(
Assembler* assembler,
bool save_fpu_registers,
intptr_t self_code_stub_offset_from_thread,
@@ -209,24 +209,25 @@
__ ret(LR);
}
-static void GenerateSharedStub(Assembler* assembler,
- bool save_fpu_registers,
- const RuntimeEntry* target,
- intptr_t self_code_stub_offset_from_thread,
- bool allow_return,
- bool store_runtime_result_in_r0 = false) {
- ASSERT(!store_runtime_result_in_r0 || allow_return);
+void StubCodeCompiler::GenerateSharedStub(
+ Assembler* assembler,
+ bool save_fpu_registers,
+ const RuntimeEntry* target,
+ intptr_t self_code_stub_offset_from_thread,
+ bool allow_return,
+ bool store_runtime_result_in_result_register) {
+ ASSERT(!store_runtime_result_in_result_register || allow_return);
auto perform_runtime_call = [&]() {
- if (store_runtime_result_in_r0) {
+ if (store_runtime_result_in_result_register) {
__ PushRegister(NULL_REG);
}
__ CallRuntime(*target, /*argument_count=*/0);
- if (store_runtime_result_in_r0) {
+ if (store_runtime_result_in_result_register) {
__ PopRegister(R0);
- __ str(
- R0,
- Address(FP, target::kWordSize *
- StubCodeCompiler::WordOffsetFromFpToCpuRegister(R0)));
+ __ str(R0,
+ Address(FP, target::kWordSize *
+ StubCodeCompiler::WordOffsetFromFpToCpuRegister(
+ SharedSlowPathStubABI::kResultReg)));
}
};
GenerateSharedStubGeneric(assembler, save_fpu_registers,
@@ -545,55 +546,8 @@
__ Breakpoint();
}
-void StubCodeCompiler::GenerateNullErrorSharedWithoutFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/false, &kNullErrorRuntimeEntry,
- target::Thread::null_error_shared_without_fpu_regs_stub_offset(),
- /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullErrorSharedWithFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/true, &kNullErrorRuntimeEntry,
- target::Thread::null_error_shared_with_fpu_regs_stub_offset(),
- /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullArgErrorSharedWithoutFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/false, &kArgumentNullErrorRuntimeEntry,
- target::Thread::null_arg_error_shared_without_fpu_regs_stub_offset(),
- /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullArgErrorSharedWithFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/true, &kArgumentNullErrorRuntimeEntry,
- target::Thread::null_arg_error_shared_with_fpu_regs_stub_offset(),
- /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithoutFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/false, &kNullCastErrorRuntimeEntry,
- target::Thread::null_cast_error_shared_without_fpu_regs_stub_offset(),
- /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/true, &kNullCastErrorRuntimeEntry,
- target::Thread::null_cast_error_shared_with_fpu_regs_stub_offset(),
- /*allow_return=*/false);
-}
-
-static void GenerateRangeError(Assembler* assembler, bool with_fpu_regs) {
+void StubCodeCompiler::GenerateRangeError(Assembler* assembler,
+ bool with_fpu_regs) {
auto perform_runtime_call = [&]() {
// If the generated code has unboxed index/length we need to box them before
// calling the runtime entry.
@@ -640,32 +594,6 @@
/*allow_return=*/false, perform_runtime_call);
}
-void StubCodeCompiler::GenerateRangeErrorSharedWithoutFPURegsStub(
- Assembler* assembler) {
- GenerateRangeError(assembler, /*with_fpu_regs=*/false);
-}
-
-void StubCodeCompiler::GenerateRangeErrorSharedWithFPURegsStub(
- Assembler* assembler) {
- GenerateRangeError(assembler, /*with_fpu_regs=*/true);
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithoutFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/false, &kStackOverflowRuntimeEntry,
- target::Thread::stack_overflow_shared_without_fpu_regs_stub_offset(),
- /*allow_return=*/true);
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/true, &kStackOverflowRuntimeEntry,
- target::Thread::stack_overflow_shared_with_fpu_regs_stub_offset(),
- /*allow_return=*/true);
-}
-
// Input parameters:
// LR : return address.
// SP : address of return value.
@@ -1334,12 +1262,13 @@
__ Bind(&slow_case);
}
- COMPILE_ASSERT(AllocateMintABI::kResultReg == R0);
+ COMPILE_ASSERT(AllocateMintABI::kResultReg ==
+ SharedSlowPathStubABI::kResultReg);
GenerateSharedStub(assembler, /*save_fpu_registers=*/true,
&kAllocateMintRuntimeEntry,
target::Thread::allocate_mint_with_fpu_regs_stub_offset(),
/*allow_return=*/true,
- /*store_runtime_result_in_r0=*/true);
+ /*store_runtime_result_in_result_register=*/true);
}
void StubCodeCompiler::GenerateAllocateMintSharedWithoutFPURegsStub(
@@ -1353,12 +1282,13 @@
__ Bind(&slow_case);
}
- COMPILE_ASSERT(AllocateMintABI::kResultReg == R0);
+ COMPILE_ASSERT(AllocateMintABI::kResultReg ==
+ SharedSlowPathStubABI::kResultReg);
GenerateSharedStub(
assembler, /*save_fpu_registers=*/false, &kAllocateMintRuntimeEntry,
target::Thread::allocate_mint_without_fpu_regs_stub_offset(),
/*allow_return=*/true,
- /*store_runtime_result_in_r0=*/true);
+ /*store_runtime_result_in_result_register=*/true);
}
// Called when invoking Dart code from C++ (VM code).
diff --git a/runtime/vm/compiler/stub_code_compiler_ia32.cc b/runtime/vm/compiler/stub_code_compiler_ia32.cc
index 369f95b..e3eeed6 100644
--- a/runtime/vm/compiler/stub_code_compiler_ia32.cc
+++ b/runtime/vm/compiler/stub_code_compiler_ia32.cc
@@ -298,61 +298,36 @@
#endif
}
-void StubCodeCompiler::GenerateDispatchTableNullErrorStub(
- Assembler* assembler) {
+void StubCodeCompiler::GenerateSharedStubGeneric(
+ Assembler* assembler,
+ bool save_fpu_registers,
+ intptr_t self_code_stub_offset_from_thread,
+ bool allow_return,
+ std::function<void()> perform_runtime_call) {
// Only used in AOT.
__ Breakpoint();
}
-void StubCodeCompiler::GenerateNullErrorSharedWithoutFPURegsStub(
- Assembler* assembler) {
+void StubCodeCompiler::GenerateSharedStub(
+ Assembler* assembler,
+ bool save_fpu_registers,
+ const RuntimeEntry* target,
+ intptr_t self_code_stub_offset_from_thread,
+ bool allow_return,
+ bool store_runtime_result_in_result_register) {
+ // Only used in AOT.
__ Breakpoint();
}
-void StubCodeCompiler::GenerateNullErrorSharedWithFPURegsStub(
- Assembler* assembler) {
+void StubCodeCompiler::GenerateRangeError(Assembler* assembler,
+ bool with_fpu_regs) {
+ // Only used in AOT.
__ Breakpoint();
}
-void StubCodeCompiler::GenerateNullArgErrorSharedWithoutFPURegsStub(
+void StubCodeCompiler::GenerateDispatchTableNullErrorStub(
Assembler* assembler) {
- __ Breakpoint();
-}
-
-void StubCodeCompiler::GenerateNullArgErrorSharedWithFPURegsStub(
- Assembler* assembler) {
- __ Breakpoint();
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithoutFPURegsStub(
- Assembler* assembler) {
- __ Breakpoint();
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithFPURegsStub(
- Assembler* assembler) {
- __ Breakpoint();
-}
-
-void StubCodeCompiler::GenerateRangeErrorSharedWithoutFPURegsStub(
- Assembler* assembler) {
- __ Breakpoint();
-}
-
-void StubCodeCompiler::GenerateRangeErrorSharedWithFPURegsStub(
- Assembler* assembler) {
- __ Breakpoint();
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithoutFPURegsStub(
- Assembler* assembler) {
- // TODO(sjindel): implement.
- __ Breakpoint();
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithFPURegsStub(
- Assembler* assembler) {
- // TODO(sjindel): implement.
+ // Only used in AOT.
__ Breakpoint();
}
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index c5eeb8a..7af1a07 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -164,7 +164,7 @@
__ ret();
}
-static void GenerateSharedStubGeneric(
+void StubCodeCompiler::GenerateSharedStubGeneric(
Assembler* assembler,
bool save_fpu_registers,
intptr_t self_code_stub_offset_from_thread,
@@ -202,22 +202,23 @@
__ ret();
}
-static void GenerateSharedStub(Assembler* assembler,
- bool save_fpu_registers,
- const RuntimeEntry* target,
- intptr_t self_code_stub_offset_from_thread,
- bool allow_return,
- bool store_runtime_result_in_rax = false) {
+void StubCodeCompiler::GenerateSharedStub(
+ Assembler* assembler,
+ bool save_fpu_registers,
+ const RuntimeEntry* target,
+ intptr_t self_code_stub_offset_from_thread,
+ bool allow_return,
+ bool store_runtime_result_in_result_register) {
auto perform_runtime_call = [&]() {
- if (store_runtime_result_in_rax) {
+ if (store_runtime_result_in_result_register) {
__ PushImmediate(Immediate(0));
}
__ CallRuntime(*target, /*argument_count=*/0);
- if (store_runtime_result_in_rax) {
+ if (store_runtime_result_in_result_register) {
__ PopRegister(RAX);
- __ movq(Address(RBP,
- target::kWordSize *
- StubCodeCompiler::WordOffsetFromFpToCpuRegister(RAX)),
+ __ movq(Address(RBP, target::kWordSize *
+ StubCodeCompiler::WordOffsetFromFpToCpuRegister(
+ SharedSlowPathStubABI::kResultReg)),
RAX);
}
};
@@ -492,55 +493,8 @@
__ Breakpoint();
}
-void StubCodeCompiler::GenerateNullErrorSharedWithoutFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/false, &kNullErrorRuntimeEntry,
- target::Thread::null_error_shared_without_fpu_regs_stub_offset(),
- /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullErrorSharedWithFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/true, &kNullErrorRuntimeEntry,
- target::Thread::null_error_shared_with_fpu_regs_stub_offset(),
- /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullArgErrorSharedWithoutFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/false, &kArgumentNullErrorRuntimeEntry,
- target::Thread::null_arg_error_shared_without_fpu_regs_stub_offset(),
- /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullArgErrorSharedWithFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/true, &kArgumentNullErrorRuntimeEntry,
- target::Thread::null_arg_error_shared_with_fpu_regs_stub_offset(),
- /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithoutFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/false, &kNullCastErrorRuntimeEntry,
- target::Thread::null_cast_error_shared_without_fpu_regs_stub_offset(),
- /*allow_return=*/false);
-}
-
-void StubCodeCompiler::GenerateNullCastErrorSharedWithFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/true, &kNullCastErrorRuntimeEntry,
- target::Thread::null_cast_error_shared_with_fpu_regs_stub_offset(),
- /*allow_return=*/false);
-}
-
-static void GenerateRangeError(Assembler* assembler, bool with_fpu_regs) {
+void StubCodeCompiler::GenerateRangeError(Assembler* assembler,
+ bool with_fpu_regs) {
auto perform_runtime_call = [&]() {
// If the generated code has unboxed index/length we need to box them before
// calling the runtime entry.
@@ -589,32 +543,6 @@
/*allow_return=*/false, perform_runtime_call);
}
-void StubCodeCompiler::GenerateRangeErrorSharedWithoutFPURegsStub(
- Assembler* assembler) {
- GenerateRangeError(assembler, /*with_fpu_regs=*/false);
-}
-
-void StubCodeCompiler::GenerateRangeErrorSharedWithFPURegsStub(
- Assembler* assembler) {
- GenerateRangeError(assembler, /*with_fpu_regs=*/true);
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithoutFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/false, &kStackOverflowRuntimeEntry,
- target::Thread::stack_overflow_shared_without_fpu_regs_stub_offset(),
- /*allow_return=*/true);
-}
-
-void StubCodeCompiler::GenerateStackOverflowSharedWithFPURegsStub(
- Assembler* assembler) {
- GenerateSharedStub(
- assembler, /*save_fpu_registers=*/true, &kStackOverflowRuntimeEntry,
- target::Thread::stack_overflow_shared_with_fpu_regs_stub_offset(),
- /*allow_return=*/true);
-}
-
// Input parameters:
// RSP : points to return address.
// RSP + 8 : address of return value.
@@ -1258,12 +1186,13 @@
__ Bind(&slow_case);
}
- COMPILE_ASSERT(AllocateMintABI::kResultReg == RAX);
+ COMPILE_ASSERT(AllocateMintABI::kResultReg ==
+ SharedSlowPathStubABI::kResultReg);
GenerateSharedStub(assembler, /*save_fpu_registers=*/true,
&kAllocateMintRuntimeEntry,
target::Thread::allocate_mint_with_fpu_regs_stub_offset(),
/*allow_return=*/true,
- /*store_runtime_result_in_rax=*/true);
+ /*store_runtime_result_in_result_register=*/true);
}
void StubCodeCompiler::GenerateAllocateMintSharedWithoutFPURegsStub(
@@ -1277,12 +1206,13 @@
__ Bind(&slow_case);
}
- COMPILE_ASSERT(AllocateMintABI::kResultReg == RAX);
+ COMPILE_ASSERT(AllocateMintABI::kResultReg ==
+ SharedSlowPathStubABI::kResultReg);
GenerateSharedStub(
assembler, /*save_fpu_registers=*/false, &kAllocateMintRuntimeEntry,
target::Thread::allocate_mint_without_fpu_regs_stub_offset(),
/*allow_return=*/true,
- /*store_runtime_result_in_rax=*/true);
+ /*store_runtime_result_in_result_register=*/true);
}
// Called when invoking Dart code from C++ (VM code).
diff --git a/runtime/vm/compiler/write_barrier_elimination_test.cc b/runtime/vm/compiler/write_barrier_elimination_test.cc
index a45ece7..f483b05 100644
--- a/runtime/vm/compiler/write_barrier_elimination_test.cc
+++ b/runtime/vm/compiler/write_barrier_elimination_test.cc
@@ -215,7 +215,7 @@
final root = List<dynamic>.filled(128, null);
List<dynamic> last = root;
for (int i = 0; i < 10 * 1024; ++i) {
- final nc = List(128);
+ final nc = List<dynamic>.filled(128, null);
last[0] = nc;
last = nc;
}
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index d7f79a7..016d438 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -310,6 +310,11 @@
// ABI for allocation stubs.
const Register kAllocationStubTypeArgumentsReg = R3;
+// Common ABI for shared slow path stubs.
+struct SharedSlowPathStubABI {
+ static const Register kResultReg = R0;
+};
+
// ABI for instantiation stubs.
struct InstantiationABI {
static const Register kUninstantiatedTypeArgumentsReg = R3;
@@ -337,6 +342,23 @@
static const Register kResultReg = R0;
};
+// Calling convention when calling AssertSubtypeStub.
+struct AssertSubtypeABI {
+ static const Register kSubTypeReg = R0;
+ static const Register kSuperTypeReg = R8;
+ static const Register kInstantiatorTypeArgumentsReg = R2;
+ static const Register kFunctionTypeArgumentsReg = R1;
+ static const Register kDstNameReg = R3;
+
+ static const intptr_t kAbiRegisters =
+ (1 << kSubTypeReg) | (1 << kSuperTypeReg) |
+ (1 << kInstantiatorTypeArgumentsReg) | (1 << kFunctionTypeArgumentsReg) |
+ (1 << kDstNameReg);
+
+ // No result register, as AssertSubtype is only run for side effect
+ // (throws if the subtype check fails).
+};
+
// Registers used inside the implementation of type testing stubs.
struct TTSInternalRegs {
static const Register kInstanceTypeArgumentsReg = R4;
@@ -366,6 +388,11 @@
static const Register kScratchReg = R4;
};
+// ABI for LateInitializationError stubs.
+struct LateInitializationErrorABI {
+ static const Register kFieldReg = R9;
+};
+
// ABI for ThrowStub.
struct ThrowABI {
static const Register kExceptionReg = R0;
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index 87dbb7f..39225df 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -142,6 +142,11 @@
// ABI for allocation stubs.
const Register kAllocationStubTypeArgumentsReg = R1;
+// Common ABI for shared slow path stubs.
+struct SharedSlowPathStubABI {
+ static const Register kResultReg = R0;
+};
+
// ABI for instantiation stubs.
struct InstantiationABI {
static const Register kUninstantiatedTypeArgumentsReg = R3;
@@ -169,6 +174,23 @@
static const Register kResultReg = R0;
};
+// Calling convention when calling AssertSubtypeStub.
+struct AssertSubtypeABI {
+ static const Register kSubTypeReg = R0;
+ static const Register kSuperTypeReg = R8;
+ static const Register kInstantiatorTypeArgumentsReg = R2;
+ static const Register kFunctionTypeArgumentsReg = R1;
+ static const Register kDstNameReg = R3;
+
+ static const intptr_t kAbiRegisters =
+ (1 << kSubTypeReg) | (1 << kSuperTypeReg) |
+ (1 << kInstantiatorTypeArgumentsReg) | (1 << kFunctionTypeArgumentsReg) |
+ (1 << kDstNameReg);
+
+ // No result register, as AssertSubtype is only run for side effect
+ // (throws if the subtype check fails).
+};
+
// Registers used inside the implementation of type testing stubs.
struct TTSInternalRegs {
static const Register kInstanceTypeArgumentsReg = R7;
@@ -198,6 +220,11 @@
static const Register kScratchReg = R4;
};
+// ABI for LateInitializationError stubs.
+struct LateInitializationErrorABI {
+ static const Register kFieldReg = R9;
+};
+
// ABI for ThrowStub.
struct ThrowABI {
static const Register kExceptionReg = R0;
diff --git a/runtime/vm/constants_ia32.h b/runtime/vm/constants_ia32.h
index 02ac81d..a8d5b46 100644
--- a/runtime/vm/constants_ia32.h
+++ b/runtime/vm/constants_ia32.h
@@ -91,6 +91,11 @@
// ABI for allocation stubs.
const Register kAllocationStubTypeArgumentsReg = EDX;
+// Common ABI for shared slow path stubs.
+struct SharedSlowPathStubABI {
+ static const Register kResultReg = EAX;
+};
+
// ABI for instantiation stubs.
struct InstantiationABI {
static const Register kUninstantiatedTypeArgumentsReg = EBX;
@@ -116,6 +121,20 @@
static const Register kResultReg = kNoRegister;
};
+// Calling convention when calling kSubtypeCheckRuntimeEntry, to match other
+// architectures. We don't generate a call to the AssertSubtypeStub because we
+// need CODE_REG to store a fifth argument.
+struct AssertSubtypeABI {
+ static const Register kSubTypeReg = EAX;
+ static const Register kSuperTypeReg = EBX;
+ static const Register kInstantiatorTypeArgumentsReg = EDX;
+ static const Register kFunctionTypeArgumentsReg = ECX;
+ static const Register kDstNameReg = EDI; /// On ia32 we don't use CODE_REG.
+
+ // No result register, as AssertSubtype is only run for side effect
+ // (throws if the subtype check fails).
+};
+
// ABI for InitStaticFieldStub.
struct InitStaticFieldABI {
static const Register kFieldReg = EAX;
@@ -136,6 +155,11 @@
static const Register kScratchReg = EDI;
};
+// ABI for LateInitializationError stubs.
+struct LateInitializationErrorABI {
+ static const Register kFieldReg = EDI;
+};
+
// ABI for ThrowStub.
struct ThrowABI {
static const Register kExceptionReg = EAX;
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index b74b2b6..dc2e794 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -132,6 +132,11 @@
// ABI for allocation stubs.
const Register kAllocationStubTypeArgumentsReg = RDX;
+// Common ABI for shared slow path stubs.
+struct SharedSlowPathStubABI {
+ static const Register kResultReg = RAX;
+};
+
// ABI for instantiation stubs.
struct InstantiationABI {
static const Register kUninstantiatedTypeArgumentsReg = RBX;
@@ -159,6 +164,23 @@
static const Register kResultReg = RAX;
};
+// Calling convention when calling AssertSubtypeStub.
+struct AssertSubtypeABI {
+ static const Register kSubTypeReg = RAX;
+ static const Register kSuperTypeReg = RBX;
+ static const Register kInstantiatorTypeArgumentsReg = RDX;
+ static const Register kFunctionTypeArgumentsReg = RCX;
+ static const Register kDstNameReg = R9;
+
+ static const intptr_t kAbiRegisters =
+ (1 << kSubTypeReg) | (1 << kSuperTypeReg) |
+ (1 << kInstantiatorTypeArgumentsReg) | (1 << kFunctionTypeArgumentsReg) |
+ (1 << kDstNameReg);
+
+ // No result register, as AssertSubtype is only run for side effect
+ // (throws if the subtype check fails).
+};
+
// ABI for InitStaticFieldStub.
struct InitStaticFieldABI {
static const Register kFieldReg = RAX;
@@ -179,6 +201,11 @@
static const Register kScratchReg = RSI;
};
+// ABI for LateInitializationError stubs.
+struct LateInitializationErrorABI {
+ static const Register kFieldReg = RSI;
+};
+
// ABI for ThrowStub.
struct ThrowABI {
static const Register kExceptionReg = RAX;
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 0046562..cf7853f 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -1966,7 +1966,7 @@
const char* kScriptChars =
"import 'dart:typed_data';\n"
- "List main(int size) {\n"
+ "List testMain(int size) {\n"
" var a = new Int8List(size);\n"
" var view = new Int8List.view(a.buffer, 0, size);\n"
" return view;\n"
@@ -1977,7 +1977,7 @@
// Test with a typed data view object.
Dart_Handle dart_args[1];
dart_args[0] = Dart_NewInteger(kSize);
- Dart_Handle view_obj = Dart_Invoke(lib, NewString("main"), 1, dart_args);
+ Dart_Handle view_obj = Dart_Invoke(lib, NewString("testMain"), 1, dart_args);
EXPECT_VALID(view_obj);
for (intptr_t i = 0; i < kSize; ++i) {
EXPECT_VALID(Dart_ListSetAt(view_obj, i, Dart_NewInteger(i & 0xff)));
@@ -1998,7 +1998,7 @@
const char* kScriptChars =
"import 'dart:typed_data';\n"
- "List main(int size) {\n"
+ "List testMain(int size) {\n"
" var a = new Int8List(size);\n"
" var view = new Int8List.view(a.buffer, 0, size);\n"
" return view;\n"
@@ -2009,7 +2009,7 @@
// Create a typed data view object.
Dart_Handle dart_args[1];
dart_args[0] = Dart_NewInteger(kSize);
- Dart_Handle view_obj = Dart_Invoke(lib, NewString("main"), 1, dart_args);
+ Dart_Handle view_obj = Dart_Invoke(lib, NewString("testMain"), 1, dart_args);
EXPECT_VALID(view_obj);
// Test that the API considers it a TypedData object.
EXPECT(Dart_IsTypedData(view_obj));
@@ -5524,9 +5524,6 @@
" factory MyClass.multiply(value) {\n"
" return new MyClass.named(value * 100);\n"
" }\n"
- " factory MyClass.nullo() {\n"
- " return null;\n"
- " }\n"
" var foo;\n"
"}\n"
"\n"
@@ -5687,11 +5684,6 @@
EXPECT_VALID(Dart_IntegerToInt64(foo, &int_value));
EXPECT_EQ(1100, int_value);
- // Invoke a factory constructor which returns null.
- result = Dart_New(type, NewString("nullo"), 0, NULL);
- EXPECT_VALID(result);
- EXPECT(Dart_IsNull(result));
-
// Pass an error class object. Error is passed through.
result = Dart_New(Dart_NewApiError("myerror"), NewString("named"), 1, args);
EXPECT_ERROR(result, "myerror");
@@ -5967,6 +5959,13 @@
// Null is always valid as the fill argument if we're creating an empty list.
EXPECT_VALID(Dart_NewListOfTypeFilled(zxhandle_type, Dart_Null(), 0));
+
+ // Test creation of a non nullable list of strings.
+ Dart_Handle corelib = Dart_LookupLibrary(NewString("dart:core"));
+ EXPECT_VALID(corelib);
+ Dart_Handle string_type =
+ Dart_GetNonNullableType(corelib, NewString("String"), 0, NULL);
+ EXPECT_VALID(Dart_NewListOfTypeFilled(string_type, Dart_EmptyString(), 2));
}
static Dart_Handle PrivateLibName(Dart_Handle lib, const char* str) {
@@ -8626,7 +8625,7 @@
TEST_CASE(DartAPI_ExternalStringIndexOf) {
const char* kScriptChars =
- "main(String pattern) {\n"
+ "testMain(String pattern) {\n"
" var str = 'Hello World';\n"
" return str.indexOf(pattern);\n"
"}\n";
@@ -8641,7 +8640,7 @@
Dart_Handle dart_args[1];
dart_args[0] = ext8;
- Dart_Handle result = Dart_Invoke(lib, NewString("main"), 1, dart_args);
+ Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 1, dart_args);
int64_t value = 0;
result = Dart_IntegerToInt64(result, &value);
EXPECT_VALID(result);
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index aec36e8..89f06a9 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -750,6 +750,31 @@
return result.raw();
}
+ObjectPtr DartLibraryCalls::LookupOpenPorts() {
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
+ Function& function = Function::Handle(
+ zone, thread->isolate()->object_store()->lookup_open_ports());
+ const int kTypeArgsLen = 0;
+ const int kNumArguments = 0;
+ if (function.IsNull()) {
+ Library& isolate_lib = Library::Handle(zone, Library::IsolateLibrary());
+ ASSERT(!isolate_lib.IsNull());
+ const String& class_name = String::Handle(
+ zone, isolate_lib.PrivateName(Symbols::_RawReceivePortImpl()));
+ const String& function_name = String::Handle(
+ zone, isolate_lib.PrivateName(Symbols::_lookupOpenPorts()));
+ function = Resolver::ResolveStatic(isolate_lib, class_name, function_name,
+ kTypeArgsLen, kNumArguments,
+ Object::empty_array());
+ ASSERT(!function.IsNull());
+ thread->isolate()->object_store()->set_lookup_open_ports(function);
+ }
+ const Object& result = Object::Handle(
+ zone, DartEntry::InvokeFunction(function, Object::empty_array()));
+ return result.raw();
+}
+
ObjectPtr DartLibraryCalls::HandleMessage(const Object& handler,
const Instance& message) {
Thread* thread = Thread::Current();
diff --git a/runtime/vm/dart_entry.h b/runtime/vm/dart_entry.h
index 4f81b28..1527c11 100644
--- a/runtime/vm/dart_entry.h
+++ b/runtime/vm/dart_entry.h
@@ -284,6 +284,9 @@
// Returns the handler if one has been registered for this port id.
static ObjectPtr LookupHandler(Dart_Port port_id);
+ // Returns a list of open ReceivePorts.
+ static ObjectPtr LookupOpenPorts();
+
// Returns null on success, a RawError on failure.
static ObjectPtr HandleMessage(const Object& handler,
const Instance& dart_message);
diff --git a/runtime/vm/instructions_arm.cc b/runtime/vm/instructions_arm.cc
index 3d6c231..83ae8f5 100644
--- a/runtime/vm/instructions_arm.cc
+++ b/runtime/vm/instructions_arm.cc
@@ -420,11 +420,12 @@
intptr_t TypeTestingStubCallPattern::GetSubtypeTestCachePoolIndex() {
// Calls to the type testing stubs look like:
// ldr R9, ...
- // ldr R3, [PP+idx]
+ // ldr Rn, [PP+idx]
// blx R9
// or
- // ldr R3, [PP+idx]
+ // ldr Rn, [PP+idx]
// blx pc+<offset>
+ // where Rn = TypeTestABI::kSubtypeTestCacheReg.
// Ensure the caller of the type testing stub (whose return address is [pc_])
// branched via `blx R9` or a pc-relative call.
@@ -440,7 +441,7 @@
Register reg;
intptr_t pool_index = -1;
InstructionPattern::DecodeLoadWordFromPool(load_instr_end, ®, &pool_index);
- ASSERT(reg == R3);
+ ASSERT_EQUAL(reg, TypeTestABI::kSubtypeTestCacheReg);
return pool_index;
}
diff --git a/runtime/vm/instructions_arm64.cc b/runtime/vm/instructions_arm64.cc
index 17b2243..2eed6c0 100644
--- a/runtime/vm/instructions_arm64.cc
+++ b/runtime/vm/instructions_arm64.cc
@@ -556,11 +556,12 @@
intptr_t TypeTestingStubCallPattern::GetSubtypeTestCachePoolIndex() {
// Calls to the type testing stubs look like:
// ldr R9, ...
- // ldr R3, [PP+idx]
+ // ldr Rn, [PP+idx]
// blr R9
// or
- // ldr R3, [PP+idx]
+ // ldr Rn, [PP+idx]
// blr pc+<offset>
+ // where Rn = TypeTestABI::kSubtypeTestCacheReg.
// Ensure the caller of the type testing stub (whose return address is [pc_])
// branched via `blr R9` or a pc-relative call.
@@ -576,7 +577,7 @@
Register reg;
intptr_t pool_index = -1;
InstructionPattern::DecodeLoadWordFromPool(load_instr_end, ®, &pool_index);
- ASSERT(reg == R3);
+ ASSERT_EQUAL(reg, TypeTestABI::kSubtypeTestCacheReg);
return pool_index;
}
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 3f7e002..03f4c83 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -2395,8 +2395,9 @@
args.SetAt(2, Instance::Handle(state->BuildArgs(thread)));
args.SetAt(3, Instance::Handle(state->BuildMessage(thread)));
args.SetAt(4, is_spawn_uri ? Bool::True() : Bool::False());
- args.SetAt(5, ReceivePort::Handle(ReceivePort::New(
- isolate->main_port(), true /* control port */)));
+ args.SetAt(5, ReceivePort::Handle(
+ ReceivePort::New(isolate->main_port(), String::Handle(),
+ true /* control port */)));
args.SetAt(6, capabilities);
const Library& lib = Library::Handle(Library::IsolateLibrary());
diff --git a/runtime/vm/isolate_reload_test.cc b/runtime/vm/isolate_reload_test.cc
index eac771f..c373d3d 100644
--- a/runtime/vm/isolate_reload_test.cc
+++ b/runtime/vm/isolate_reload_test.cc
@@ -1096,12 +1096,12 @@
const char* kScript =
"main() {\n"
- " return importedFunc();\n"
+ " return 'b';\n"
"}\n";
Dart_Handle result;
Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
EXPECT_VALID(lib);
- EXPECT_ERROR(SimpleInvokeError(lib, "main"), "importedFunc");
+ EXPECT_STREQ("b", SimpleInvokeStr(lib, "main"));
// Fail to find 'test:lib1' in the isolate.
result = Dart_LookupLibrary(NewString("test:lib1"));
@@ -1122,7 +1122,7 @@
result = Dart_LookupLibrary(NewString("test:lib1"));
EXPECT(Dart_IsLibrary(result));
- // Reload and remove 'dart:math' from isolate.
+ // Reload and remove 'test:lib1' from isolate.
lib = TestCase::ReloadTestScript(kScript);
EXPECT_VALID(lib);
@@ -1362,22 +1362,15 @@
"}\n";
EXPECT_VALID(TestCase::SetReloadTestScript(kReloadScript));
-
const char* expected = "static";
const char* result = SimpleInvokeStr(lib, "main");
EXPECT_NOTNULL(result);
-
// Bail out if we've already failed so we don't crash in StringEquals.
if (result == NULL) {
return;
}
EXPECT_STREQ(expected, result);
- // Bail out if we've already failed so we don't crash in the tag handler.
- if (strcmp(expected, result) != 0) {
- return;
- }
-
lib = Dart_RootLibrary();
EXPECT_NON_NULL(lib);
EXPECT_STREQ(expected, SimpleInvokeStr(lib, "main"));
@@ -1390,7 +1383,6 @@
"class C {\n"
" test() {\n"
" reloadTest();\n"
- " return new Foo();\n"
" }\n"
"}\n"
"main() {\n"
@@ -1480,19 +1472,7 @@
"}\n";
EXPECT_VALID(TestCase::SetReloadTestScript(kReloadScript));
-
- const char* expected = "exception";
- const char* result = SimpleInvokeStr(lib, "main");
- EXPECT_STREQ(expected, result);
-
- // Bail out if we've already failed so we don't crash in the tag handler.
- if ((result == NULL) || (strcmp(expected, result) != 0)) {
- return;
- }
-
- lib = Dart_RootLibrary();
- EXPECT_NON_NULL(lib);
- EXPECT_STREQ(expected, SimpleInvokeStr(lib, "main"));
+ EXPECT_ERROR(SimpleInvokeError(lib, "main"), "is abstract");
}
TEST_CASE(IsolateReload_PendingStaticCall_DefinedToNSM) {
@@ -1533,7 +1513,6 @@
"}\n";
EXPECT_VALID(TestCase::SetReloadTestScript(kReloadScript));
-
const char* expected = "exception";
const char* result = SimpleInvokeStr(lib, "main");
EXPECT_NOTNULL(result);
@@ -1544,12 +1523,6 @@
}
EXPECT_STREQ(expected, result);
- // Bail out if we've already failed so we don't crash in the tag handler.
- if (strcmp(expected, result) != 0) {
- return;
- }
-
- EXPECT_STREQ(expected, result);
lib = Dart_RootLibrary();
EXPECT_NON_NULL(lib);
EXPECT_STREQ(expected, SimpleInvokeStr(lib, "main"));
@@ -1596,12 +1569,12 @@
const char* expected = "static";
const char* result = SimpleInvokeStr(lib, "main");
- EXPECT_STREQ(expected, result);
// Bail out if we've already failed so we don't crash in the tag handler.
- if ((result == NULL) || (strcmp(expected, result) != 0)) {
+ if (result == NULL) {
return;
}
+ EXPECT_STREQ(expected, result);
lib = Dart_RootLibrary();
EXPECT_NON_NULL(lib);
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index a35ccf7..089354b 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -7,6 +7,7 @@
#include <memory>
#include "include/dart_api.h"
+#include "lib/stacktrace.h"
#include "platform/assert.h"
#include "platform/text_buffer.h"
#include "platform/unaligned.h"
@@ -1207,6 +1208,8 @@
ASSERT(empty_array_->IsArray());
ASSERT(!zero_array_->IsSmi());
ASSERT(zero_array_->IsArray());
+ ASSERT(!empty_type_arguments_->IsSmi());
+ ASSERT(empty_type_arguments_->IsTypeArguments());
ASSERT(!empty_context_scope_->IsSmi());
ASSERT(empty_context_scope_->IsContextScope());
ASSERT(!empty_compressed_stackmaps_->IsSmi());
@@ -6035,6 +6038,19 @@
printer->AddString(">");
}
+void TypeArguments::PrintTo(BaseTextBuffer* buffer) const {
+ buffer->AddString("TypeArguments: ");
+ if (IsNull()) {
+ return buffer->AddString("null");
+ }
+ buffer->Printf("(H%" Px ")", Smi::Value(raw_ptr()->hash_));
+ auto& type_at = AbstractType::Handle();
+ for (intptr_t i = 0; i < Length(); i++) {
+ type_at = TypeAt(i);
+ buffer->Printf(" [%s]", type_at.IsNull() ? "null" : type_at.ToCString());
+ }
+}
+
bool TypeArguments::IsSubvectorEquivalent(const TypeArguments& other,
intptr_t from_index,
intptr_t len,
@@ -6546,7 +6562,9 @@
return this->raw();
}
const intptr_t num_types = Length();
- if (IsRaw(0, num_types)) {
+ if (num_types == 0) {
+ return TypeArguments::empty_type_arguments().raw();
+ } else if (IsRaw(0, num_types)) {
return TypeArguments::null();
}
Zone* zone = thread->zone();
@@ -6624,18 +6642,11 @@
const char* TypeArguments::ToCString() const {
if (IsNull()) {
- return "TypeArguments: null";
+ return "TypeArguments: null"; // Optimizing the frequent case.
}
- Zone* zone = Thread::Current()->zone();
- const char* prev_cstr = OS::SCreate(zone, "TypeArguments: (H%" Px ")",
- Smi::Value(raw_ptr()->hash_));
- for (int i = 0; i < Length(); i++) {
- const AbstractType& type_at = AbstractType::Handle(zone, TypeAt(i));
- const char* type_cstr = type_at.IsNull() ? "null" : type_at.ToCString();
- char* chars = OS::SCreate(zone, "%s [%s]", prev_cstr, type_cstr);
- prev_cstr = chars;
- }
- return prev_cstr;
+ ZoneTextBuffer buffer(Thread::Current()->zone());
+ PrintTo(&buffer);
+ return buffer.buffer();
}
const char* PatchClass::ToCString() const {
@@ -7037,10 +7048,121 @@
}
}
-TypeArgumentsPtr Function::InstantiateToBounds(Thread* thread) const {
- const auto& type_params =
- TypeArguments::Handle(thread->zone(), type_parameters());
- return InstantiateTypeArgumentsToBounds(thread, type_params);
+TypeArgumentsPtr Function::InstantiateToBounds(
+ Thread* thread,
+ DefaultTypeArgumentsKind* kind_out) const {
+ if (CachesDefaultTypeArguments()) {
+ // Always use the cached version, even if the type parameters are null,
+ // to catch cases where the cache isn't properly initialized.
+ return default_type_arguments(kind_out);
+ }
+ // No cached version, so just retrieve from the type parameters and return
+ // a canonicalized version..
+ if (type_parameters() == TypeArguments::null()) {
+ if (kind_out != nullptr) {
+ *kind_out = DefaultTypeArgumentsKind::kIsInstantiated;
+ }
+ return Object::empty_type_arguments().raw();
+ }
+ auto& result = TypeArguments::Handle(thread->zone(), type_parameters());
+ result = InstantiateTypeArgumentsToBounds(thread, result);
+ if (kind_out != nullptr) {
+ // We just return is/is not instantiated if the value isn't cached, as
+ // the other checks may be more overhead at runtime than just doing the
+ // instantiation.
+ *kind_out = result.IsNull() || result.IsInstantiated()
+ ? DefaultTypeArgumentsKind::kIsInstantiated
+ : DefaultTypeArgumentsKind::kNeedsInstantiation;
+ }
+ return result.raw();
+}
+
+void Function::UpdateCachedDefaultTypeArguments(Thread* thread) const {
+ auto const zone = thread->zone();
+ auto& closure_function = Function::Handle(zone);
+ if (HasImplicitClosureFunction()) {
+ closure_function = ImplicitClosureFunction();
+ }
+ if (CachesDefaultTypeArguments()) {
+ auto defaults = &Object::empty_type_arguments();
+ if (NumTypeParameters(thread) > 0) {
+ const auto& params = TypeArguments::Handle(zone, type_parameters());
+ const intptr_t num_params = params.Length();
+ auto& new_defaults = TypeArguments::Handle(
+ zone, TypeArguments::New(num_params, Heap::kNew));
+ // Only canonicalize the result if all the default arguments have been
+ // canonicalized, to avoid premature canonicalization of the arguments.
+ bool all_canonical = true;
+ auto& type = AbstractType::Handle(zone);
+ for (intptr_t i = 0; i < num_params; i++) {
+ type = params.TypeAt(i);
+ type = TypeParameter::Cast(type).default_argument();
+ if (!type.IsCanonical()) {
+ all_canonical = false;
+ }
+ new_defaults.SetTypeAt(i, type);
+ }
+ if (all_canonical) {
+ new_defaults = new_defaults.Canonicalize(thread);
+ }
+ defaults = &new_defaults;
+ }
+ set_default_type_arguments(*defaults);
+ if (!closure_function.IsNull()) {
+ closure_function.set_default_type_arguments(*defaults);
+ }
+ } else if (!closure_function.IsNull()) {
+ closure_function.UpdateCachedDefaultTypeArguments(thread);
+ }
+}
+
+TypeArgumentsPtr Function::default_type_arguments(
+ DefaultTypeArgumentsKind* kind_out) const {
+ if (!CachesDefaultTypeArguments()) {
+ UNREACHABLE();
+ }
+ const auto& closure_data =
+ ClosureData::Handle(ClosureData::RawCast(raw_ptr()->data_));
+ ASSERT(!closure_data.IsNull());
+ if (kind_out != nullptr) {
+ *kind_out = DefaultTypeArgumentsKindField::decode(
+ closure_data.default_type_arguments_info());
+ }
+ return closure_data.default_type_arguments();
+}
+
+void Function::set_default_type_arguments(const TypeArguments& value) const {
+ if (!CachesDefaultTypeArguments()) {
+ UNREACHABLE();
+ }
+ const auto& closure_data =
+ ClosureData::Handle(ClosureData::RawCast(raw_ptr()->data_));
+ ASSERT(!closure_data.IsNull());
+ auto kind = DefaultTypeArgumentsKindFor(value);
+ ASSERT(kind != DefaultTypeArgumentsKind::kInvalid);
+ const intptr_t num_parent_type_params = NumParentTypeParameters();
+ const intptr_t default_type_args_info =
+ DefaultTypeArgumentsKindField::encode(kind) |
+ NumParentTypeParametersField::encode(num_parent_type_params);
+ closure_data.set_default_type_arguments_info(default_type_args_info);
+ // We could just store null for the ksharesFunction/kSharesInstantiator cases,
+ // assuming all clients retrieve the DefaultTypeArgumentsKind to distinguish.
+ closure_data.set_default_type_arguments(value);
+}
+
+Function::DefaultTypeArgumentsKind Function::DefaultTypeArgumentsKindFor(
+ const TypeArguments& value) const {
+ if (value.IsNull() || value.IsInstantiated()) {
+ return DefaultTypeArgumentsKind::kIsInstantiated;
+ }
+ if (value.CanShareFunctionTypeArguments(*this)) {
+ return DefaultTypeArgumentsKind::kSharesFunctionTypeArguments;
+ }
+ const auto& cls = Class::Handle(Owner());
+ if (value.CanShareInstantiatorTypeArguments(cls)) {
+ return DefaultTypeArgumentsKind::kSharesInstantiatorTypeArguments;
+ }
+ return DefaultTypeArgumentsKind::kNeedsInstantiation;
}
FunctionPtr Function::GetGeneratedClosure() const {
@@ -7958,48 +8080,6 @@
return true;
}
-// Checks each supplied function type argument is a subtype of the corresponding
-// bound. Also takes the number of type arguments to skip over because they
-// belong to parent functions and are not included in the type parameters.
-// Returns null if all checks succeed, otherwise returns a non-null Error for
-// one of the failures.
-static ObjectPtr TypeArgumentsAreBoundSubtypes(
- Zone* zone,
- const TokenPosition& token_pos,
- const TypeArguments& type_parameters,
- intptr_t num_parent_type_args,
- const TypeArguments& instantiator_type_arguments,
- const TypeArguments& function_type_arguments) {
- ASSERT(!type_parameters.IsNull());
- const intptr_t kNumTypeArgs = type_parameters.Length() + num_parent_type_args;
- ASSERT(function_type_arguments.HasCount(kNumTypeArgs));
-
- // Don't bother allocating handles, there's nothing to check.
- if (kNumTypeArgs - num_parent_type_args == 0) return Error::null();
-
- auto& type = AbstractType::Handle(zone);
- auto& bound = AbstractType::Handle(zone);
- auto& name = String::Handle(zone);
- for (intptr_t i = num_parent_type_args; i < kNumTypeArgs; i++) {
- type = type_parameters.TypeAt(i - num_parent_type_args);
- ASSERT(type.IsTypeParameter());
- const auto& parameter = TypeParameter::Cast(type);
- bound = parameter.bound();
- name = parameter.name();
- // Only perform non-covariant checks where the bound is not the top type.
- if (parameter.IsGenericCovariantImpl() || bound.IsTopTypeForSubtyping()) {
- continue;
- }
- if (!AbstractType::InstantiateAndTestSubtype(&type, &bound,
- instantiator_type_arguments,
- function_type_arguments)) {
- return Error::RawCast(ThrowTypeError(token_pos, type, bound, name));
- }
- }
-
- return Error::null();
-}
-
// Retrieves the function type arguments, if any. This could be explicitly
// passed type from the arguments array, delayed type arguments in closures,
// or instantiated bounds for the type parameters if no other source for
@@ -8055,8 +8135,28 @@
function_type_args ^= args.At(0);
} else if (!has_delayed_type_args) {
// We have no explicitly provided function type arguments, so instantiate
- // the type parameters to bounds.
- function_type_args = function.InstantiateToBounds(thread);
+ // the type parameters to bounds or replace as appropriate.
+ Function::DefaultTypeArgumentsKind kind;
+ function_type_args = function.InstantiateToBounds(thread, &kind);
+ switch (kind) {
+ case Function::DefaultTypeArgumentsKind::kInvalid:
+ // We shouldn't hit the invalid case.
+ UNREACHABLE();
+ break;
+ case Function::DefaultTypeArgumentsKind::kIsInstantiated:
+ // Nothing left to do.
+ break;
+ case Function::DefaultTypeArgumentsKind::kNeedsInstantiation:
+ function_type_args = function_type_args.InstantiateAndCanonicalizeFrom(
+ instantiator_type_args, parent_type_args);
+ break;
+ case Function::DefaultTypeArgumentsKind::kSharesInstantiatorTypeArguments:
+ function_type_args = instantiator_type_args.raw();
+ break;
+ case Function::DefaultTypeArgumentsKind::kSharesFunctionTypeArguments:
+ function_type_args = parent_type_args.raw();
+ break;
+ }
}
return function_type_args.Prepend(zone, parent_type_args, kNumParentTypeArgs,
@@ -8131,16 +8231,26 @@
// arguments to make sure they are appropriate subtypes of the bounds.
const intptr_t kNumLocalTypeArgs = NumTypeParameters(thread);
if (kNumLocalTypeArgs > 0) {
- const intptr_t kNumParentTypeArgs = NumParentTypeParameters();
ASSERT(function_type_arguments.HasCount(kNumLocalTypeArgs +
- kNumParentTypeArgs));
+ NumParentTypeParameters()));
const auto& params = TypeArguments::Handle(zone, type_parameters());
- const auto& result = Object::Handle(
- zone, TypeArgumentsAreBoundSubtypes(
- zone, token_pos(), params, kNumParentTypeArgs,
- instantiator_type_arguments, function_type_arguments));
- if (result.IsError()) {
- return result.raw();
+ auto& parameter = TypeParameter::Handle(zone);
+ auto& type = AbstractType::Handle(zone);
+ auto& bound = AbstractType::Handle(zone);
+ for (intptr_t i = 0; i < kNumLocalTypeArgs; i++) {
+ parameter ^= params.TypeAt(i);
+ type = parameter.raw();
+ bound = parameter.bound();
+ // Only perform non-covariant checks where the bound is not the top type.
+ if (parameter.IsGenericCovariantImpl() || bound.IsTopTypeForSubtyping()) {
+ continue;
+ }
+ if (!AbstractType::InstantiateAndTestSubtype(&type, &bound,
+ instantiator_type_arguments,
+ function_type_arguments)) {
+ const auto& name = String::Handle(zone, parameter.name());
+ return Error::RawCast(ThrowTypeError(token_pos(), type, bound, name));
+ }
}
} else {
ASSERT(function_type_arguments.HasCount(NumParentTypeParameters()));
@@ -8700,6 +8810,11 @@
// in new space.
ASSERT(space == Heap::kOld);
}
+ if (result.CachesDefaultTypeArguments()) {
+ // Make sure the default type arguments are set consistently with the
+ // function type parameters (currently null).
+ result.set_default_type_arguments(Object::empty_type_arguments());
+ }
// Force-optimized functions are not debuggable because they cannot
// deoptimize.
@@ -8833,8 +8948,9 @@
}
// Set closure function's type parameters.
- closure_function.set_type_parameters(
- TypeArguments::Handle(zone, type_parameters()));
+ auto& type_args_handle = TypeArguments::Handle(zone, type_parameters());
+ closure_function.set_type_parameters(type_args_handle);
+ closure_function.UpdateCachedDefaultTypeArguments(thread);
// Set closure function's result type to this result type.
closure_function.set_result_type(AbstractType::Handle(zone, result_type()));
@@ -9733,7 +9849,8 @@
bool Function::MayHaveUncheckedEntryPoint() const {
return FLAG_enable_multiple_entrypoints &&
- (NeedsArgumentTypeChecks() || IsImplicitClosureFunction());
+ (NeedsTypeArgumentTypeChecks() || NeedsArgumentTypeChecks() ||
+ IsImplicitClosureFunction());
}
const char* Function::ToCString() const {
@@ -9827,6 +9944,19 @@
StorePointer(&raw_ptr()->signature_type_, value.raw());
}
+void ClosureData::set_default_type_arguments(const TypeArguments& value) const {
+ StorePointer(&raw_ptr()->default_type_arguments_, value.raw());
+}
+
+intptr_t ClosureData::default_type_arguments_info() const {
+ return Smi::Value(raw_ptr()->default_type_arguments_info_);
+}
+
+void ClosureData::set_default_type_arguments_info(intptr_t value) const {
+ ASSERT(Smi::IsValid(value));
+ StorePointer(&raw_ptr()->default_type_arguments_info_, Smi::New(value));
+}
+
ClosureDataPtr ClosureData::New() {
ASSERT(Object::closure_data_class() != Class::null());
ObjectPtr raw = Object::Allocate(ClosureData::kClassId,
@@ -9838,16 +9968,32 @@
if (IsNull()) {
return "ClosureData: null";
}
- const Function& parent = Function::Handle(parent_function());
- const Type& type = Type::Handle(signature_type());
- return OS::SCreate(Thread::Current()->zone(),
- "ClosureData: context_scope: 0x%" Px
- " parent_function: %s signature_type: %s"
- " implicit_static_closure: 0x%" Px,
- static_cast<uword>(context_scope()),
- parent.IsNull() ? "null" : parent.ToCString(),
- type.IsNull() ? "null" : type.ToCString(),
- static_cast<uword>(implicit_static_closure()));
+ auto const zone = Thread::Current()->zone();
+ ZoneTextBuffer buffer(zone);
+ buffer.Printf("ClosureData: context_scope: 0x%" Px "",
+ static_cast<uword>(context_scope()));
+ buffer.AddString(" parent_function: ");
+ if (parent_function() == Function::null()) {
+ buffer.AddString("null");
+ } else {
+ buffer.AddString(Function::Handle(zone, parent_function()).ToCString());
+ }
+ buffer.AddString(" signature_type: ");
+ if (signature_type() == Type::null()) {
+ buffer.AddString("null");
+ } else {
+ buffer.AddString(Type::Handle(zone, signature_type()).ToCString());
+ }
+ buffer.Printf(" implicit_static_closure: 0x%" Px "",
+ static_cast<uword>(implicit_static_closure()));
+ buffer.AddString(" default_type_arguments: ");
+ if (default_type_arguments() == TypeArguments::null()) {
+ buffer.AddString("null");
+ } else {
+ buffer.AddString(
+ TypeArguments::Handle(zone, default_type_arguments()).ToCString());
+ }
+ return buffer.buffer();
}
void SignatureData::set_parent_function(const Function& value) const {
@@ -18985,6 +19131,8 @@
case kArrayCid:
case kImmutableArrayCid:
return Array::kBytesPerElement;
+ case kTypeArgumentsCid:
+ return TypeArguments::ArrayTraits::kElementSize;
case kOneByteStringCid:
return OneByteString::kBytesPerElement;
case kTwoByteStringCid:
@@ -19011,6 +19159,8 @@
case kArrayCid:
case kImmutableArrayCid:
return Array::data_offset();
+ case kTypeArgumentsCid:
+ return TypeArguments::types_offset();
case kOneByteStringCid:
return OneByteString::data_offset();
case kTwoByteStringCid:
@@ -24153,6 +24303,7 @@
}
ReceivePortPtr ReceivePort::New(Dart_Port id,
+ const String& debug_name,
bool is_control_port,
Heap::Space space) {
ASSERT(id != ILLEGAL_PORT);
@@ -24160,6 +24311,8 @@
Zone* zone = thread->zone();
const SendPort& send_port =
SendPort::Handle(zone, SendPort::New(id, thread->isolate()->origin_id()));
+ const StackTrace& allocation_location_ =
+ HasStack() ? GetCurrentStackTrace(0) : StackTrace::Handle();
ReceivePort& result = ReceivePort::Handle(zone);
{
@@ -24168,6 +24321,9 @@
NoSafepointScope no_safepoint;
result ^= raw;
result.StorePointer(&result.raw_ptr()->send_port_, send_port.raw());
+ result.StorePointer(&result.raw_ptr()->debug_name_, debug_name.raw());
+ result.StorePointer(&result.raw_ptr()->allocation_location_,
+ allocation_location_.raw());
}
if (is_control_port) {
PortMap::SetPortState(id, PortMap::kControlPort);
@@ -24250,16 +24406,18 @@
}
const char* Closure::ToCString() const {
- Zone* zone = Thread::Current()->zone();
+ auto const thread = Thread::Current();
+ auto const zone = thread->zone();
+ ZoneTextBuffer buffer(zone);
+ buffer.AddString("Closure: ");
const Function& fun = Function::Handle(zone, function());
- const bool is_implicit_closure = fun.IsImplicitClosureFunction();
const Function& sig_fun =
Function::Handle(zone, GetInstantiatedSignature(zone));
- const char* fun_sig =
- String::Handle(zone, sig_fun.UserVisibleSignature()).ToCString();
- const char* from = is_implicit_closure ? " from " : "";
- const char* fun_desc = is_implicit_closure ? fun.ToCString() : "";
- return OS::SCreate(zone, "Closure: %s%s%s", fun_sig, from, fun_desc);
+ sig_fun.PrintSignature(NameVisibility::kUserVisibleName, &buffer);
+ if (fun.IsImplicitClosureFunction()) {
+ buffer.Printf(" from %s", fun.ToCString());
+ }
+ return buffer.buffer();
}
int64_t Closure::ComputeHash() const {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index c49817c..627fe0e 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -2771,9 +2771,65 @@
// Enclosing function of this local function.
FunctionPtr parent_function() const;
+ enum class DefaultTypeArgumentsKind : uint8_t {
+ // Only here to make sure it's explicitly set appropriately.
+ kInvalid = 0,
+ // Must instantiate the default type arguments before use.
+ kNeedsInstantiation,
+ // The default type arguments are already instantiated.
+ kIsInstantiated,
+ // Use the instantiator type arguments that would be used to instantiate
+ // the default type arguments, as instantiating produces the same result.
+ kSharesInstantiatorTypeArguments,
+ // Use the function type arguments that would be used to instantiate
+ // the default type arguments, as instantiating produces the same result.
+ kSharesFunctionTypeArguments,
+ };
+ static constexpr intptr_t kDefaultTypeArgumentsKindFieldSize = 3;
+ static_assert(static_cast<uint8_t>(
+ DefaultTypeArgumentsKind::kSharesFunctionTypeArguments) <
+ (1 << kDefaultTypeArgumentsKindFieldSize),
+ "Wrong bit size chosen for default TAV kind field");
+
+ // Fields encoded in an integer stored alongside a default TAV.
+ using DefaultTypeArgumentsKindField =
+ BitField<intptr_t,
+ DefaultTypeArgumentsKind,
+ 0,
+ kDefaultTypeArgumentsKindFieldSize>;
+ // If more space is needed, we can almost certainly reduce the size of this
+ // field.
+ using NumParentTypeParametersField =
+ BitField<intptr_t,
+ uint16_t,
+ DefaultTypeArgumentsKindField::kNextBit,
+ kBitsPerByte * sizeof(uint16_t)>;
+
+ static_assert(NumParentTypeParametersField::kNextBit <=
+ compiler::target::kSmiBits,
+ "Default TAV info does not fit in a target Smi");
+
// Returns a canonicalized vector of the type parameters instantiated
// to bounds. If non-generic, the empty type arguments vector is returned.
- TypeArgumentsPtr InstantiateToBounds(Thread* thread) const;
+ TypeArgumentsPtr InstantiateToBounds(
+ Thread* thread,
+ DefaultTypeArgumentsKind* kind_out = nullptr) const;
+
+ // Whether this function should have a cached type arguments vector for the
+ // instantiated-to-bounds version of the type parameters.
+ bool CachesDefaultTypeArguments() const { return IsClosureFunction(); }
+
+ // Updates the cached default type arguments vector for this function if it
+ // caches and for its implicit closure function if it has one. If the
+ // default arguments are all canonical, the cached default type arguments
+ // vector is canonicalized. Should be run any time the type parameters vector
+ // is changed or if the default arguments of any type parameters are updated.
+ void UpdateCachedDefaultTypeArguments(Thread* thread) const;
+
+ // These are only usable for functions that cache the default type arguments.
+ TypeArgumentsPtr default_type_arguments(
+ DefaultTypeArgumentsKind* kind_out = nullptr) const;
+ void set_default_type_arguments(const TypeArguments& value) const;
// Enclosed generated closure function of this local function.
// This will only work after the closure function has been allocated in the
@@ -2889,7 +2945,11 @@
return (kind() == FunctionLayout::kConstructor) && is_static();
}
- static bool ClosureBodiesContainNonCovariantChecks() {
+ static bool ClosureBodiesContainNonCovariantTypeArgumentChecks() {
+ return FLAG_enable_interpreter;
+ }
+
+ static bool ClosureBodiesContainNonCovariantArgumentChecks() {
return FLAG_precompiled_mode || FLAG_lazy_dispatchers;
}
@@ -2961,7 +3021,14 @@
bool IsInFactoryScope() const;
bool NeedsArgumentTypeChecks() const {
- return (IsClosureFunction() && ClosureBodiesContainNonCovariantChecks()) ||
+ return (IsClosureFunction() &&
+ ClosureBodiesContainNonCovariantArgumentChecks()) ||
+ !(is_static() || (kind() == FunctionLayout::kConstructor));
+ }
+
+ bool NeedsTypeArgumentTypeChecks() const {
+ return (IsClosureFunction() &&
+ ClosureBodiesContainNonCovariantTypeArgumentChecks()) ||
!(is_static() || (kind() == FunctionLayout::kConstructor));
}
@@ -3713,6 +3780,12 @@
void SetWasExecuted(bool value) const { SetWasExecutedBit(value); }
+ static intptr_t data_offset() { return OFFSET_OF(FunctionLayout, data_); }
+
+ static intptr_t kind_tag_offset() {
+ return OFFSET_OF(FunctionLayout, kind_tag_);
+ }
+
// static: Considered during class-side or top-level resolution rather than
// instance-side resolution.
// const: Valid target of a const constructor call.
@@ -3787,11 +3860,6 @@
value, raw_ptr()->packed_fields_));
}
- private:
- void set_parameter_names(const Array& value) const;
- void set_ic_data_array(const Array& value) const;
- void SetInstructionsSafe(const Code& value) const;
-
enum KindTagBits {
kKindTagPos = 0,
kKindTagSize = 5,
@@ -3810,8 +3878,7 @@
COMPILE_ASSERT(MethodRecognizer::kNumRecognizedMethods <
(1 << kRecognizedTagSize));
COMPILE_ASSERT(kNumTagBits <=
- (kBitsPerByte *
- sizeof(static_cast<FunctionLayout*>(nullptr)->kind_tag_)));
+ (kBitsPerByte * sizeof(decltype(FunctionLayout::kind_tag_))));
class KindBits : public BitField<uint32_t,
FunctionLayout::Kind,
@@ -3832,6 +3899,15 @@
FOR_EACH_FUNCTION_KIND_BIT(DEFINE_BIT)
#undef DEFINE_BIT
+ private:
+ // Given the provided defaults type arguments, determines which
+ // DefaultTypeArgumentsKind applies.
+ DefaultTypeArgumentsKind DefaultTypeArgumentsKindFor(
+ const TypeArguments& defaults) const;
+
+ void set_parameter_names(const Array& value) const;
+ void set_ic_data_array(const Array& value) const;
+ void SetInstructionsSafe(const Code& value) const;
void set_name(const String& value) const;
void set_kind(FunctionLayout::Kind value) const;
void set_parent_function(const Function& value) const;
@@ -3882,6 +3958,13 @@
return RoundedAllocationSize(sizeof(ClosureDataLayout));
}
+ static intptr_t default_type_arguments_offset() {
+ return OFFSET_OF(ClosureDataLayout, default_type_arguments_);
+ }
+ static intptr_t default_type_arguments_info_offset() {
+ return OFFSET_OF(ClosureDataLayout, default_type_arguments_info_);
+ }
+
private:
ContextScopePtr context_scope() const { return raw_ptr()->context_scope_; }
void set_context_scope(const ContextScope& value) const;
@@ -3897,6 +3980,14 @@
InstancePtr implicit_static_closure() const { return raw_ptr()->closure_; }
void set_implicit_static_closure(const Instance& closure) const;
+ TypeArgumentsPtr default_type_arguments() const {
+ return raw_ptr()->default_type_arguments_;
+ }
+ void set_default_type_arguments(const TypeArguments& value) const;
+
+ intptr_t default_type_arguments_info() const;
+ void set_default_type_arguments_info(intptr_t value) const;
+
static ClosureDataPtr New();
FINAL_HEAP_OBJECT_IMPLEMENTATION(ClosureData, Object);
@@ -7702,15 +7793,17 @@
intptr_t Length() const;
AbstractTypePtr TypeAt(intptr_t index) const;
AbstractTypePtr TypeAtNullSafe(intptr_t index) const;
+ static intptr_t types_offset() {
+ return OFFSET_OF_RETURNED_VALUE(TypeArgumentsLayout, types);
+ }
static intptr_t type_at_offset(intptr_t index) {
- return OFFSET_OF_RETURNED_VALUE(TypeArgumentsLayout, types) +
- index * kWordSize;
+ return types_offset() + index * kWordSize;
}
void SetTypeAt(intptr_t index, const AbstractType& value) const;
struct ArrayTraits {
static intptr_t elements_start_offset() {
- return TypeArguments::type_at_offset(0);
+ return TypeArguments::types_offset();
}
static constexpr intptr_t kElementSize = kWordSize;
@@ -7756,6 +7849,7 @@
NameVisibility name_visibility,
BaseTextBuffer* printer,
NameDisambiguation name_disambiguation = NameDisambiguation::kNo) const;
+ void PrintTo(BaseTextBuffer* printer) const;
// Check if the subvector of length 'len' starting at 'from_index' of this
// type argument vector consists solely of DynamicType.
@@ -8485,6 +8579,9 @@
}
virtual void SetIsFinalized() const;
virtual bool IsBeingFinalized() const { return false; }
+ static intptr_t flags_offset() {
+ return OFFSET_OF(TypeParameterLayout, flags_);
+ }
bool IsGenericCovariantImpl() const {
return TypeParameterLayout::GenericCovariantImplBit::decode(
raw_ptr()->flags_);
@@ -8520,6 +8617,9 @@
}
StringPtr name() const { return raw_ptr()->name_; }
+ static intptr_t name_offset() {
+ return OFFSET_OF(TypeParameterLayout, name_);
+ }
intptr_t index() const { return raw_ptr()->index_; }
void set_index(intptr_t value) const;
AbstractTypePtr bound() const { return raw_ptr()->bound_; }
@@ -8528,6 +8628,9 @@
return raw_ptr()->default_argument_;
}
void set_default_argument(const AbstractType& value) const;
+ static intptr_t bound_offset() {
+ return OFFSET_OF(TypeParameterLayout, bound_);
+ }
virtual TokenPosition token_pos() const { return raw_ptr()->token_pos_; }
virtual bool IsInstantiated(Genericity genericity = kAny,
intptr_t num_free_fun_type_params = kAllFree,
@@ -10856,10 +10959,17 @@
InstancePtr handler() const { return raw_ptr()->handler_; }
void set_handler(const Instance& value) const;
+ StackTracePtr allocation_location() const {
+ return raw_ptr()->allocation_location_;
+ }
+
+ StringPtr debug_name() const { return raw_ptr()->debug_name_; }
+
static intptr_t InstanceSize() {
return RoundedAllocationSize(sizeof(ReceivePortLayout));
}
static ReceivePortPtr New(Dart_Port id,
+ const String& debug_name,
bool is_control_port,
Heap::Space space = Heap::kNew);
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index fe34f62..3eb70c6 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -1557,7 +1557,15 @@
}
void ReceivePort::PrintJSONImpl(JSONStream* stream, bool ref) const {
- Instance::PrintJSONImpl(stream, ref);
+ JSONObject obj(stream);
+ Instance::PrintSharedInstanceJSON(&obj, ref);
+ const StackTrace& allocation_location_ =
+ StackTrace::Handle(allocation_location());
+ const String& debug_name_ = String::Handle(debug_name());
+ obj.AddProperty("kind", "ReceivePort");
+ obj.AddProperty("portId", static_cast<intptr_t>(Id()));
+ obj.AddProperty("debugName", debug_name_.ToCString());
+ obj.AddProperty("allocationLocation", allocation_location_);
}
void SendPort::PrintJSONImpl(JSONStream* stream, bool ref) const {
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index fa649a5..fe789af 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -160,6 +160,7 @@
RW(Instance, stack_overflow) \
RW(Instance, out_of_memory) \
RW(Function, lookup_port_handler) \
+ RW(Function, lookup_open_ports) \
RW(Function, handle_message_function) \
RW(Function, growable_list_factory) \
RW(Function, simple_instance_of_function) \
@@ -180,6 +181,8 @@
RW(GrowableObjectArray, megamorphic_cache_table) \
RW(Code, build_method_extractor_code) \
RW(Code, dispatch_table_null_error_stub) \
+ RW(Code, late_initialization_error_stub_with_fpu_regs_stub) \
+ RW(Code, late_initialization_error_stub_without_fpu_regs_stub) \
RW(Code, null_error_stub_with_fpu_regs_stub) \
RW(Code, null_error_stub_without_fpu_regs_stub) \
RW(Code, null_arg_error_stub_with_fpu_regs_stub) \
@@ -242,6 +245,10 @@
#define OBJECT_STORE_STUB_CODE_LIST(DO) \
DO(dispatch_table_null_error_stub, DispatchTableNullError) \
+ DO(late_initialization_error_stub_with_fpu_regs_stub, \
+ LateInitializationErrorSharedWithFPURegs) \
+ DO(late_initialization_error_stub_without_fpu_regs_stub, \
+ LateInitializationErrorSharedWithoutFPURegs) \
DO(null_error_stub_with_fpu_regs_stub, NullErrorSharedWithFPURegs) \
DO(null_error_stub_without_fpu_regs_stub, NullErrorSharedWithoutFPURegs) \
DO(null_arg_error_stub_with_fpu_regs_stub, NullArgErrorSharedWithFPURegs) \
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index fefbb4a..4941d60 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -347,6 +347,9 @@
if (dynamic_closure_call_vars_ != nullptr) return dynamic_closure_call_vars_;
dynamic_closure_call_vars_ = new (zone()) DynamicClosureCallVars();
+ const auto& type_Dynamic = Object::dynamic_type();
+ const auto& type_Function =
+ Type::ZoneHandle(zone(), Type::DartFunctionType());
const auto& type_Smi = Type::ZoneHandle(zone(), Type::SmiType());
#define INIT_FIELD(Name, TypeName, Symbol) \
dynamic_closure_call_vars_->Name = new (zone()) \
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 22ae1f4..42eaf4b 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -239,8 +239,10 @@
// because they are both read and written to by the builders.
struct DynamicClosureCallVars : ZoneAllocated {
#define FOR_EACH_DYNAMIC_CLOSURE_CALL_VARIABLE(V) \
+ V(current_function, Function, CurrentFunction) \
V(current_num_processed, Smi, CurrentNumProcessed) \
- V(current_param_index, Smi, CurrentParamIndex)
+ V(current_param_index, Smi, CurrentParamIndex) \
+ V(function_type_args, Dynamic, FunctionTypeArgs)
#define DEFINE_FIELD(Name, _, __) LocalVariable* Name = nullptr;
FOR_EACH_DYNAMIC_CLOSURE_CALL_VARIABLE(DEFINE_FIELD)
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 6436338..21aae8b 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1115,7 +1115,11 @@
FunctionPtr parent_function_; // Enclosing function of this local function.
TypePtr signature_type_;
InstancePtr closure_; // Closure object for static implicit closures.
- VISIT_TO(ObjectPtr, closure_);
+ // Instantiate-to-bounds TAV for use when no TAV is provided.
+ TypeArgumentsPtr default_type_arguments_;
+ // Additional information about the instantiate-to-bounds TAV.
+ SmiPtr default_type_arguments_info_;
+ VISIT_TO(ObjectPtr, default_type_arguments_info_);
friend class Function;
};
@@ -2302,6 +2306,7 @@
uint8_t flags_;
int8_t nullability_;
+ public:
using FinalizedBit = BitField<decltype(flags_), bool, 0, 1>;
using GenericCovariantImplBit =
BitField<decltype(flags_), bool, FinalizedBit::kNextBit, 1>;
@@ -2309,6 +2314,7 @@
BitField<decltype(flags_), bool, GenericCovariantImplBit::kNextBit, 1>;
static constexpr intptr_t kFlagsBitSize = DeclarationBit::kNextBit;
+ private:
ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
friend class CidRewriteVisitor;
@@ -2782,6 +2788,8 @@
VISIT_FROM(ObjectPtr, send_port_)
SendPortPtr send_port_;
InstancePtr handler_;
+ StringPtr debug_name_;
+ StackTracePtr allocation_location_;
VISIT_TO(ObjectPtr, handler_)
};
diff --git a/runtime/vm/raw_object_fields.cc b/runtime/vm/raw_object_fields.cc
index 8b6b184..e3ad43d 100644
--- a/runtime/vm/raw_object_fields.cc
+++ b/runtime/vm/raw_object_fields.cc
@@ -182,6 +182,7 @@
F(ExternalTypedData, length_) \
F(ReceivePort, send_port_) \
F(ReceivePort, handler_) \
+ F(ReceivePort, allocation_location_) \
F(StackTrace, async_link_) \
F(StackTrace, code_array_) \
F(StackTrace, pc_offset_array_) \
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 601befe..4219416 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -480,6 +480,10 @@
ASSERT(!subtype.IsNull() && !subtype.IsTypeRef());
ASSERT(!supertype.IsNull() && !supertype.IsTypeRef());
+ // Now that AssertSubtype may be checking types only available at runtime,
+ // we can't guarantee the supertype isn't the top type.
+ if (supertype.IsTopTypeForSubtyping()) return;
+
// The supertype or subtype may not be instantiated.
if (AbstractType::InstantiateAndTestSubtype(
&subtype, &supertype, instantiator_type_args, function_type_args)) {
@@ -557,7 +561,7 @@
}
// Check that arguments are valid for the given closure.
-// Arg0: function
+// Arg0: closure
// Arg1: arguments descriptor
// Return value: whether the arguments are valid
DEFINE_RUNTIME_ENTRY(ClosureArgumentsValid, 2) {
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 3a89d30..d144d8c 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -3146,6 +3146,29 @@
return true;
}
+static const MethodParameter* get_ports_params[] = {
+ RUNNABLE_ISOLATE_PARAMETER,
+};
+
+static bool GetPorts(Thread* thread, JSONStream* js) {
+ // Ensure the array and handles created below are promptly destroyed.
+ StackZone zone(thread);
+ HANDLESCOPE(thread);
+ const GrowableObjectArray& ports = GrowableObjectArray::Handle(
+ GrowableObjectArray::RawCast(DartLibraryCalls::LookupOpenPorts()));
+ JSONObject jsobj(js);
+ jsobj.AddProperty("type", "PortList");
+ {
+ Instance& port = Instance::Handle(zone.GetZone());
+ JSONArray arr(&jsobj, "ports");
+ for (int i = 0; i < ports.Length(); ++i) {
+ port ^= ports.At(i);
+ arr.AddValue(port);
+ }
+ }
+ return true;
+}
+
#if !defined(DART_PRECOMPILED_RUNTIME)
static const char* const report_enum_names[] = {
SourceReport::kCallSitesStr,
@@ -4393,12 +4416,12 @@
return true;
}
-static const MethodParameter* get_ports_params[] = {
+static const MethodParameter* get_ports_private_params[] = {
RUNNABLE_ISOLATE_PARAMETER,
NULL,
};
-static bool GetPorts(Thread* thread, JSONStream* js) {
+static bool GetPortsPrivate(Thread* thread, JSONStream* js) {
MessageHandler* message_handler = thread->isolate()->message_handler();
PortMap::PrintPortsForMessageHandler(message_handler, js);
return true;
@@ -5058,6 +5081,8 @@
get_inbound_references_params },
{ "getInstances", GetInstances,
get_instances_params },
+ { "getPorts", GetPorts,
+ get_ports_params },
{ "getIsolate", GetIsolate,
get_isolate_params },
{ "_getIsolateObjectStore", GetIsolateObjectStore,
@@ -5078,8 +5103,8 @@
get_object_store_params },
{ "_getPersistentHandles", GetPersistentHandles,
get_persistent_handles_params, },
- { "_getPorts", GetPorts,
- get_ports_params },
+ { "_getPorts", GetPortsPrivate,
+ get_ports_private_params },
{ "getProcessMemoryUsage", GetProcessMemoryUsage,
get_process_memory_usage_params },
{ "_getReachableSize", GetReachableSize,
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index bf1d99b..9d09af1 100644
--- a/runtime/vm/service.h
+++ b/runtime/vm/service.h
@@ -15,7 +15,7 @@
namespace dart {
#define SERVICE_PROTOCOL_MAJOR_VERSION 3
-#define SERVICE_PROTOCOL_MINOR_VERSION 40
+#define SERVICE_PROTOCOL_MINOR_VERSION 41
class Array;
class EmbedderServiceHandler;
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index b8d0906..6fe2fb8 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -1,8 +1,8 @@
-# Dart VM Service Protocol 3.40
+# Dart VM Service Protocol 3.41
> Please post feedback to the [observatory-discuss group][discuss-list]
-This document describes of _version 3.40_ of the Dart VM Service Protocol. This
+This document describes of _version 3.41_ of the Dart VM Service Protocol. This
protocol is used to communicate with a running Dart Virtual Machine.
To use the Service Protocol, start the VM with the *--observe* flag.
@@ -47,6 +47,7 @@
- [getIsolateGroup](#getisolategroup)
- [getMemoryUsage](#getmemoryusage)
- [getObject](#getobject)
+ - [getPorts](#getports)
- [getProcessMemoryUsage](#getprocessmemoryusage)
- [getRetainingPath](#getretainingpath)
- [getScripts](#getscripts)
@@ -113,6 +114,7 @@
- [NativeFunction](#nativefunction)
- [Null](#null)
- [Object](#object)
+ - [PortList](#portlist)
- [ReloadReport](#reloadreport)
- [Response](#response)
- [RetainingObject](#retainingobject)
@@ -936,6 +938,17 @@
Float32x4List, and Float64x2List. These parameters are otherwise
ignored.
+### getPorts
+
+```
+PortList getPorts(string isolateId)
+```
+
+The _getPorts_ RPC is used to retrieve the list of `ReceivePort` instances for a
+given isolate.
+
+See [PortList](#portlist).
+
### getRetainingPath
```
@@ -2426,6 +2439,24 @@
// Provided for instance kinds:
// Closure
@Context closureContext [optional];
+
+ // The port ID for a ReceivePort.
+ //
+ // Provided for instance kinds:
+ // ReceivePort
+ int portId [optional];
+
+ // The stack trace associated with the allocation of a ReceivePort.
+ //
+ // Provided for instance kinds:
+ // ReceivePort
+ @Instance allocationLocation [optional];
+
+ // A name associated with a ReceivePort used for debugging purposes.
+ //
+ // Provided for instance kinds:
+ // ReceivePort
+ string debugName [optional];
}
```
@@ -2446,6 +2477,7 @@
// Double (suitable for passing to Double.parse())
// Int (suitable for passing to int.parse())
// String (value may be truncated)
+ // StackTrace
string valueAsString [optional];
// The valueAsString for String references may be truncated. If so,
@@ -2658,6 +2690,24 @@
// BoundedType
// TypeParameter
@Instance bound [optional];
+
+ // The port ID for a ReceivePort.
+ //
+ // Provided for instance kinds:
+ // ReceivePort
+ int portId [optional];
+
+ // The stack trace associated with the allocation of a ReceivePort.
+ //
+ // Provided for instance kinds:
+ // ReceivePort
+ @Instance allocationLocation [optional];
+
+ // A name associated with a ReceivePort used for debugging purposes.
+ //
+ // Provided for instance kinds:
+ // ReceivePort
+ string debugName [optional];
}
```
@@ -2742,6 +2792,9 @@
// An instance of the Dart class BoundedType.
BoundedType,
+
+ // An instance of the Dart class ReceivePort.
+ ReceivePort,
}
```
@@ -3184,6 +3237,18 @@
An _Object_ is a persistent object that is owned by some isolate.
+### PortList
+
+```
+class PortList extends Response {
+ @Instance[] ports;
+}
+```
+
+A _PortList_ contains a list of ports associated with some isolate.
+
+See [getPort](#getPort).
+
### ProfileFunction
```
@@ -3855,5 +3920,6 @@
3.38 | Added `isSystemIsolate` property to `@Isolate` and `Isolate`, `isSystemIsolateGroup` property to `@IsolateGroup` and `IsolateGroup`, and properties `systemIsolates` and `systemIsolateGroups` to `VM`.
3.39 | Removed the following deprecated RPCs and objects: `getClientName`, `getWebSocketTarget`, `setClientName`, `requireResumeApproval`, `ClientName`, and `WebSocketTarget`.
3.40 | Added `IsolateFlag` object and `isolateFlags` property to `Isolate`.
+3.41 | Added `PortList` object, `ReceivePort` `InstanceKind`, and `getPorts` RPC.
[discuss-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/observatory-discuss
diff --git a/runtime/vm/service/service_extension.md b/runtime/vm/service/service_extension.md
index 5cb05ff..9f806c3 100644
--- a/runtime/vm/service/service_extension.md
+++ b/runtime/vm/service/service_extension.md
@@ -1,4 +1,4 @@
-# Dart VM Service Protocol Extension 1.4
+# Dart VM Service Protocol Extension 1.5
This protocol describes service extensions that are made available through
the Dart core libraries, but are not part of the core
@@ -10,7 +10,7 @@
## dart:io Extensions
-This section describes _version 1.4_ of the dart:io service protocol extensions.
+This section describes _version 1.5_ of the dart:io service protocol extensions.
### getVersion
@@ -22,9 +22,25 @@
See [Version](#version).
+### socketProfilingEnabled
+
+```
+SocketProfilingState socketProfilingEnabled(string isolateId, bool enabled [optional])
+```
+
+The _socketProfilingEnabled_ RPC is used to enable/disable the socket profiler
+and query its current state. If `enabled` is provided, the profiler state will
+be updated to reflect the value of `enabled`.
+
+If the state of the socket profiler is changed, a `SocketProfilingStateChange`
+event will be sent on the `Extension` stream.
+
+See [SocketProfilingState](#socketprofilingstate).
+
### startSocketProfiling
```
+@Deprecated
Success startSocketProfiling(string isolateId)
```
@@ -35,6 +51,7 @@
### pauseSocketProfiling
```
+@Deprecated
Success pauseSocketProfiling(string isolateId)
```
@@ -196,6 +213,15 @@
A _OpenFile_ contains information about reads and writes to a currently opened file.
+### HttpTimelineLoggingState
+
+```
+class HttpTimelineLoggingState extends State {
+}
+```
+
+See [httpEnableTimelineLogging](#httpenabletimelinelogging) and [State](#state).
+
### OpenFileList
```
@@ -205,6 +231,15 @@
}
```
+### SocketProfilingState
+
+```
+class SocketProfilingState extends State {
+}
+```
+
+See [socketProfilingEnabled](#socketProfilingEnabled) and [State](#state)
+
### SpawnedProcess
```
@@ -323,6 +358,16 @@
The _Success_ type is used to indicate that an operation completed successfully.
+### State
+
+```
+class State extends Response {
+ bool enabled;
+}
+```
+
+The _State_ type is used to represent a response to a state request.
+
### Version
```
@@ -345,3 +390,4 @@
1.2 | Added `getOpenFiles`, `getOpenFileById`, `getSpawnedProcesses`, and `getSpawnedProcessById` RPCs and added `OpenFile` and `SpawnedProcess` objects.
1.3 | Added `httpEnableTimelineLogging` RPC and `HttpTimelineLoggingStateChange` event, deprecated `getHttpEnableTimelineLogging` and `setHttpEnableTimelineLogging`.
1.4 | Updated `httpEnableTimelineLogging` parameter `enable` to `enabled`. `enable` will continue to be accepted.
+1.5 | Added `socketProfilingEnabled` RPC and `SocketProfilingStateChanged` event, deprecated `startSocketProfiling` and `pauseSocketProfiling`.
diff --git a/runtime/vm/stub_code_list.h b/runtime/vm/stub_code_list.h
index 395676c..baf6507 100644
--- a/runtime/vm/stub_code_list.h
+++ b/runtime/vm/stub_code_list.h
@@ -76,6 +76,7 @@
V(ZeroArgsUnoptimizedStaticCall) \
V(OneArgUnoptimizedStaticCall) \
V(TwoArgsUnoptimizedStaticCall) \
+ V(AssertSubtype) \
V(Subtype1TestCache) \
V(Subtype2TestCache) \
V(Subtype4TestCache) \
@@ -94,6 +95,8 @@
V(AsynchronousGapMarker) \
V(NotLoaded) \
V(DispatchTableNullError) \
+ V(LateInitializationErrorSharedWithFPURegs) \
+ V(LateInitializationErrorSharedWithoutFPURegs) \
V(NullErrorSharedWithFPURegs) \
V(NullErrorSharedWithoutFPURegs) \
V(NullArgErrorSharedWithFPURegs) \
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 9db5e9b..55b1ba1 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -109,7 +109,9 @@
V(Dynamic, "dynamic") \
V(DynamicCall, "dyn:call") \
V(DynamicCallCurrentNumProcessedVar, ":dyn_call_current_num_processed") \
+ V(DynamicCallCurrentFunctionVar, ":dyn_call_current_function") \
V(DynamicCallCurrentParamIndexVar, ":dyn_call_current_param_index") \
+ V(DynamicCallFunctionTypeArgsVar, ":dyn_call_function_type_args") \
V(DynamicPrefix, "dyn:") \
V(EntryPointsTemp, ":entry_points_temp") \
V(EqualOperator, "==") \
@@ -447,6 +449,7 @@
V(_handleMessage, "_handleMessage") \
V(_instanceOf, "_instanceOf") \
V(_lookupHandler, "_lookupHandler") \
+ V(_lookupOpenPorts, "_lookupOpenPorts") \
V(_name, "_name") \
V(_onData, "_onData") \
V(_rehashObjects, "_rehashObjects") \
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index 8ec17a2..34a65d0 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -101,6 +101,10 @@
V(CodePtr, invoke_dart_code_from_bytecode_stub_, \
StubCode::InvokeDartCodeFromBytecode().raw(), nullptr) \
V(CodePtr, call_to_runtime_stub_, StubCode::CallToRuntime().raw(), nullptr) \
+ V(CodePtr, late_initialization_error_shared_without_fpu_regs_stub_, \
+ StubCode::LateInitializationErrorSharedWithoutFPURegs().raw(), nullptr) \
+ V(CodePtr, late_initialization_error_shared_with_fpu_regs_stub_, \
+ StubCode::LateInitializationErrorSharedWithFPURegs().raw(), nullptr) \
V(CodePtr, null_error_shared_without_fpu_regs_stub_, \
StubCode::NullErrorSharedWithoutFPURegs().raw(), nullptr) \
V(CodePtr, null_error_shared_with_fpu_regs_stub_, \
diff --git a/runtime/vm/type_testing_stubs.cc b/runtime/vm/type_testing_stubs.cc
index 60328d7..f86d082 100644
--- a/runtime/vm/type_testing_stubs.cc
+++ b/runtime/vm/type_testing_stubs.cc
@@ -525,7 +525,7 @@
//
// Case b)
// type_arguments <- InstantiateTypeArguments(ita, fta, uta)
- // (where uta may or may not be a constant TypeArguments object)
+ // (where uta may not be a constant non-null TypeArguments object)
//
// Case c)
// type_arguments <- LoadField(vx)
@@ -544,11 +544,12 @@
type_usage_info->UseTypeArgumentsInInstanceCreation(klass, type_arguments);
} else if (InstantiateTypeArgumentsInstr* instantiate =
type_arguments->AsInstantiateTypeArguments()) {
- ASSERT(instantiate->type_arguments()->BindsToConstant());
- ASSERT(!instantiate->type_arguments()->BoundConstant().IsNull());
- const auto& ta =
- TypeArguments::Cast(instantiate->type_arguments()->BoundConstant());
- type_usage_info->UseTypeArgumentsInInstanceCreation(klass, ta);
+ if (instantiate->type_arguments()->BindsToConstant() &&
+ !instantiate->type_arguments()->BoundConstant().IsNull()) {
+ const auto& ta =
+ TypeArguments::Cast(instantiate->type_arguments()->BoundConstant());
+ type_usage_info->UseTypeArgumentsInInstanceCreation(klass, ta);
+ }
} else if (LoadFieldInstr* load_field = type_arguments->AsLoadField()) {
Definition* instance = load_field->instance()->definition();
intptr_t cid = instance->Type()->ToNullableCid();
diff --git a/runtime/vm/type_testing_stubs_test_arm.cc b/runtime/vm/type_testing_stubs_test_arm.cc
index 2970a03..0391fe9 100644
--- a/runtime/vm/type_testing_stubs_test_arm.cc
+++ b/runtime/vm/type_testing_stubs_test_arm.cc
@@ -45,8 +45,6 @@
const intptr_t sub_type_cache_index = __ object_pool_builder().AddObject(
Object::null_object(), compiler::ObjectPoolBuilderEntry::kPatchable);
- const intptr_t sub_type_cache_offset =
- ObjectPool::element_offset(sub_type_cache_index) - kHeapObjectTag;
const intptr_t dst_name_index = __ object_pool_builder().AddObject(
Symbols::OptimizedOut(), compiler::ObjectPoolBuilderEntry::kPatchable);
ASSERT((sub_type_cache_index + 1) == dst_name_index);
@@ -56,8 +54,8 @@
__ ldr(R9, compiler::FieldAddress(
TypeTestABI::kDstTypeReg,
AbstractType::type_test_stub_entry_point_offset()));
- __ ldr(TypeTestABI::kSubtypeTestCacheReg,
- compiler::Address(PP, sub_type_cache_offset));
+ __ LoadWordFromPoolIndex(TypeTestABI::kSubtypeTestCacheReg,
+ sub_type_cache_index);
__ blx(R9);
// We have the guarantee that TTS preserve all registers except for one
diff --git a/runtime/vm/type_testing_stubs_test_arm64.cc b/runtime/vm/type_testing_stubs_test_arm64.cc
index 858cd33..39f7d36 100644
--- a/runtime/vm/type_testing_stubs_test_arm64.cc
+++ b/runtime/vm/type_testing_stubs_test_arm64.cc
@@ -45,8 +45,6 @@
const intptr_t sub_type_cache_index = __ object_pool_builder().AddObject(
Object::null_object(), compiler::ObjectPoolBuilderEntry::kPatchable);
- const intptr_t sub_type_cache_offset =
- ObjectPool::element_offset(sub_type_cache_index);
const intptr_t dst_name_index = __ object_pool_builder().AddObject(
Symbols::OptimizedOut(), compiler::ObjectPoolBuilderEntry::kPatchable);
ASSERT((sub_type_cache_index + 1) == dst_name_index);
@@ -56,8 +54,8 @@
__ ldr(R9, compiler::FieldAddress(
TypeTestABI::kDstTypeReg,
AbstractType::type_test_stub_entry_point_offset()));
- __ LoadWordFromPoolOffset(TypeTestABI::kSubtypeTestCacheReg,
- sub_type_cache_offset);
+ __ LoadWordFromPoolIndex(TypeTestABI::kSubtypeTestCacheReg,
+ sub_type_cache_index);
__ blr(R9);
// We have the guarantee that TTS preserve all registers except for one
diff --git a/sdk/lib/_internal/js_runtime/pubspec.yaml b/sdk/lib/_internal/js_runtime/pubspec.yaml
index f42b2cd..6ab57e6 100644
--- a/sdk/lib/_internal/js_runtime/pubspec.yaml
+++ b/sdk/lib/_internal/js_runtime/pubspec.yaml
@@ -2,3 +2,6 @@
# make it easier to develop on dart2js.
name: js_runtime
publish_to: none
+
+environment:
+ sdk: '>=2.2.2'
diff --git a/sdk/lib/_internal/vm/lib/function.dart b/sdk/lib/_internal/vm/lib/function.dart
index 1c99ca2..710f1ef 100644
--- a/sdk/lib/_internal/vm/lib/function.dart
+++ b/sdk/lib/_internal/vm/lib/function.dart
@@ -19,8 +19,6 @@
_Closure get call => this;
- _Closure _clone() native "Closure_clone";
-
int _computeHash() native "Closure_computeHash";
// No instance fields should be declared before the following fields whose
diff --git a/sdk/lib/_internal/vm/lib/isolate_patch.dart b/sdk/lib/_internal/vm/lib/isolate_patch.dart
index 91a567d..8f8b02c 100644
--- a/sdk/lib/_internal/vm/lib/isolate_patch.dart
+++ b/sdk/lib/_internal/vm/lib/isolate_patch.dart
@@ -22,7 +22,8 @@
@patch
class ReceivePort {
@patch
- factory ReceivePort() => new _ReceivePortImpl();
+ factory ReceivePort([String debugName = '']) =>
+ new _ReceivePortImpl(debugName);
@patch
factory ReceivePort.fromRawReceivePort(RawReceivePort rawPort) {
@@ -62,15 +63,16 @@
* event is received.
*/
@patch
- factory RawReceivePort([Function? handler]) {
- _RawReceivePortImpl result = new _RawReceivePortImpl();
+ factory RawReceivePort([Function? handler, String debugName = '']) {
+ _RawReceivePortImpl result = new _RawReceivePortImpl(debugName);
result.handler = handler;
return result;
}
}
class _ReceivePortImpl extends Stream implements ReceivePort {
- _ReceivePortImpl() : this.fromRawReceivePort(new RawReceivePort());
+ _ReceivePortImpl([String debugName = ''])
+ : this.fromRawReceivePort(new RawReceivePort(null, debugName));
_ReceivePortImpl.fromRawReceivePort(this._rawPort)
: _controller = new StreamController(sync: true) {
@@ -128,11 +130,21 @@
@pragma("vm:entry-point")
class _RawReceivePortImpl implements RawReceivePort {
- factory _RawReceivePortImpl() native "RawReceivePortImpl_factory";
+ factory _RawReceivePortImpl(String debugName) {
+ final port = _RawReceivePortImpl._(debugName);
+ _portMap[port._get_id()] = {
+ 'port': port,
+ 'handler': null,
+ };
+ return port;
+ }
+
+ factory _RawReceivePortImpl._(String debugName)
+ native "RawReceivePortImpl_factory";
close() {
// Close the port and remove it from the handler map.
- _handlerMap.remove(this._closeInternal());
+ _portMap.remove(this._closeInternal());
}
SendPort get sendPort {
@@ -155,10 +167,15 @@
// Called from the VM to retrieve the handler for a message.
@pragma("vm:entry-point", "call")
static _lookupHandler(int id) {
- var result = _handlerMap[id];
+ var result = _portMap[id]?['handler'];
return result;
}
+ @pragma("vm:entry-point", "call")
+ static _lookupOpenPorts() {
+ return _portMap.values.map((e) => e['port']).toList();
+ }
+
// Called from the VM to dispatch to the handler.
@pragma("vm:entry-point", "call")
static void _handleMessage(Function handler, var message) {
@@ -173,22 +190,18 @@
_closeInternal() native "RawReceivePortImpl_closeInternal";
void set handler(Function? value) {
- _handlerMap[this._get_id()] = value;
+ final id = this._get_id();
+ if (!_portMap.containsKey(id)) {
+ _portMap[id] = {
+ 'port': this,
+ 'handler': value,
+ };
+ } else {
+ _portMap[id]!['handler'] = value;
+ }
}
- // TODO(iposva): Ideally keep this map in the VM.
- // id to handler mapping.
- static _initHandlerMap() {
- // TODO(18511): Workaround bad CheckSmi hoisting.
- var tempMap = new HashMap();
- // Collect feedback that not all keys are Smis.
- tempMap["."] = 1;
- tempMap["."] = 2;
-
- return new HashMap();
- }
-
- static final Map _handlerMap = _initHandlerMap();
+ static final _portMap = <dynamic, Map<String, dynamic>>{};
}
@pragma("vm:entry-point")
diff --git a/sdk/lib/io/network_profiling.dart b/sdk/lib/io/network_profiling.dart
index 5c1c620..95fa5a3 100644
--- a/sdk/lib/io/network_profiling.dart
+++ b/sdk/lib/io/network_profiling.dart
@@ -6,7 +6,7 @@
// TODO(bkonyi): refactor into io_resource_info.dart
const int _versionMajor = 1;
-const int _versionMinor = 4;
+const int _versionMinor = 5;
const String _tcpSocket = 'tcp';
const String _udpSocket = 'udp';
@@ -25,7 +25,11 @@
// Socket relative RPCs
static const _kClearSocketProfileRPC = 'ext.dart.io.clearSocketProfile';
static const _kGetSocketProfileRPC = 'ext.dart.io.getSocketProfile';
+ static const _kSocketProfilingEnabledRPC =
+ 'ext.dart.io.socketProfilingEnabled';
+ @Deprecated('Use socketProfilingEnabled instead')
static const _kPauseSocketProfilingRPC = 'ext.dart.io.pauseSocketProfiling';
+ @Deprecated('Use socketProfilingEnabled instead')
static const _kStartSocketProfilingRPC = 'ext.dart.io.startSocketProfiling';
// TODO(zichangguo): This version number represents the version of service
@@ -41,6 +45,7 @@
registerExtension(_kGetSocketProfileRPC, _serviceExtensionHandler);
registerExtension(_kStartSocketProfilingRPC, _serviceExtensionHandler);
registerExtension(_kPauseSocketProfilingRPC, _serviceExtensionHandler);
+ registerExtension(_kSocketProfilingEnabledRPC, _serviceExtensionHandler);
registerExtension(_kClearSocketProfileRPC, _serviceExtensionHandler);
registerExtension(_kGetVersionRPC, _serviceExtensionHandler);
}
@@ -73,6 +78,9 @@
case _kGetSocketProfileRPC:
responseJson = _SocketProfile.toJson();
break;
+ case _kSocketProfilingEnabledRPC:
+ responseJson = _socketProfilingEnabled(parameters);
+ break;
case _kStartSocketProfilingRPC:
responseJson = _SocketProfile.start();
break;
@@ -131,8 +139,35 @@
return _success();
}
+String _socketProfilingEnabled(Map<String, String> parameters) {
+ const String kEnabled = 'enabled';
+ if (parameters.containsKey(kEnabled)) {
+ final enable = parameters[kEnabled]!.toLowerCase();
+ if (enable != 'true' && enable != 'false') {
+ throw _invalidArgument(kEnabled, enable);
+ }
+ enable == 'true' ? _SocketProfile.start() : _SocketProfile.pause();
+ }
+ return json.encode({
+ 'type': 'SocketProfilingState',
+ 'enabled': _SocketProfile.enableSocketProfiling,
+ });
+}
+
abstract class _SocketProfile {
static const _kType = 'SocketProfile';
+ static set enableSocketProfiling(bool enabled) {
+ if (enabled != _enableSocketProfiling) {
+ postEvent('SocketProfilingStateChange', {
+ 'isolateId': Service.getIsolateID(Isolate.current),
+ 'enabled': enabled,
+ });
+ _enableSocketProfiling = enabled;
+ }
+ }
+
+ static bool get enableSocketProfiling => _enableSocketProfiling;
+
static bool _enableSocketProfiling = false;
static Map<int, _SocketStatistic> _idToSocketStatistic = {};
@@ -194,12 +229,12 @@
}
static String start() {
- _enableSocketProfiling = true;
+ enableSocketProfiling = true;
return _success();
}
static String pause() {
- _enableSocketProfiling = false;
+ enableSocketProfiling = false;
return _success();
}
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
index 0c5747e..b7650dd 100644
--- a/sdk/lib/isolate/isolate.dart
+++ b/sdk/lib/isolate/isolate.dart
@@ -671,9 +671,12 @@
* receive messages. See [Stream.asBroadcastStream] for transforming the port
* to a broadcast stream.
*
+ * The optional `debugName` parameter can be set to associate a name with
+ * this port that can be displayed in tooling.
+ *
* A receive port is closed by canceling its subscription.
*/
- external factory ReceivePort();
+ external factory ReceivePort([String debugName = '']);
/**
* Creates a [ReceivePort] from a [RawReceivePort].
@@ -718,8 +721,12 @@
* A [RawReceivePort] is low level and does not work with [Zone]s. It
* can not be paused. The data-handler must be set before the first
* event is received.
+ *
+ * The optional `debugName` parameter can be set to associate a name with
+ * this port that can be displayed in tooling.
+ *
*/
- external factory RawReceivePort([Function? handler]);
+ external factory RawReceivePort([Function? handler, String debugName = '']);
/**
* Sets the handler that is invoked for every incoming message.
diff --git a/tools/VERSION b/tools/VERSION
index d291217..35f23ff 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 11
PATCH 0
-PRERELEASE 263
+PRERELEASE 264
PRERELEASE_PATCH 0
\ No newline at end of file