[ffi] Use explicitly cached getters for Array nested dimensions

The FFI use sites transformation generates code accessing some late
final fields of the Array class. By changing these to be getters, the
transformation works both with and without late field lowering.

Tested: ci
Change-Id: Ib30d18e0830f7bb597214701272b1d0a922ac06a
Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-linux-debug-x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/237363
Reviewed-by: Daco Harkes <dacoharkes@google.com>
Commit-Queue: Aske Simon Christensen <askesc@google.com>
This commit is contained in:
Aske Simon Christensen
2022-03-16 11:29:03 +00:00
committed by Commit Bot
parent 5317e4c605
commit 3b64cede6d
3 changed files with 23 additions and 16 deletions
+9 -9
View File
@@ -223,9 +223,9 @@ class FfiTransformer extends Transformer {
final Field arraySizeField;
final Field arrayNestedDimensionsField;
final Procedure arrayCheckIndex;
final Field arrayNestedDimensionsFlattened;
final Field arrayNestedDimensionsFirst;
final Field arrayNestedDimensionsRest;
final Procedure arrayNestedDimensionsFlattened;
final Procedure arrayNestedDimensionsFirst;
final Procedure arrayNestedDimensionsRest;
final Constructor structFromTypedDataBase;
final Constructor unionFromTypedDataBase;
final Constructor arrayConstructor;
@@ -364,12 +364,12 @@ class FfiTransformer extends Transformer {
index.getField('dart:ffi', 'Array', '_nestedDimensions'),
arrayCheckIndex =
index.getProcedure('dart:ffi', 'Array', '_checkIndex'),
arrayNestedDimensionsFlattened =
index.getField('dart:ffi', 'Array', '_nestedDimensionsFlattened'),
arrayNestedDimensionsFirst =
index.getField('dart:ffi', 'Array', '_nestedDimensionsFirst'),
arrayNestedDimensionsRest =
index.getField('dart:ffi', 'Array', '_nestedDimensionsRest'),
arrayNestedDimensionsFlattened = index.getProcedure(
'dart:ffi', 'Array', 'get:_nestedDimensionsFlattened'),
arrayNestedDimensionsFirst = index.getProcedure(
'dart:ffi', 'Array', 'get:_nestedDimensionsFirst'),
arrayNestedDimensionsRest = index.getProcedure(
'dart:ffi', 'Array', 'get:_nestedDimensionsRest'),
structFromTypedDataBase =
index.getConstructor('dart:ffi', 'Struct', '_fromTypedDataBase'),
unionFromTypedDataBase =
@@ -689,7 +689,7 @@ mixin _FfiUseSiteTransformer on FfiTransformer {
InstanceGet(InstanceAccessKind.Instance, VariableGet(arrayVar),
arrayNestedDimensionsFlattened.name,
interfaceTarget: arrayNestedDimensionsFlattened,
resultType: arrayNestedDimensionsFlattened.type)),
resultType: arrayNestedDimensionsFlattened.getterType)),
type: coreTypes.intNonNullableRawType)
..fileOffset = node.fileOffset;
final offsetVar = VariableDeclaration("#offset",
@@ -729,11 +729,11 @@ mixin _FfiUseSiteTransformer on FfiTransformer {
InstanceGet(InstanceAccessKind.Instance, VariableGet(arrayVar),
arrayNestedDimensionsFirst.name,
interfaceTarget: arrayNestedDimensionsFirst,
resultType: arrayNestedDimensionsFirst.type),
resultType: arrayNestedDimensionsFirst.getterType),
InstanceGet(InstanceAccessKind.Instance, VariableGet(arrayVar),
arrayNestedDimensionsRest.name,
interfaceTarget: arrayNestedDimensionsRest,
resultType: arrayNestedDimensionsRest.type)
resultType: arrayNestedDimensionsRest.getterType)
], types: [
dartType
])));
+11 -4
View File
@@ -205,15 +205,22 @@ class Array<T extends NativeType> {
@pragma("vm:entry-point")
final List<int> _nestedDimensions;
int? _nestedDimensionsFlattenedCache;
int? _nestedDimensionsFirstCache;
List<int>? _nestedDimensionsRestCache;
@pragma("vm:entry-point")
Array._(this._typedDataBase, this._size, this._nestedDimensions);
late final int _nestedDimensionsFlattened = _nestedDimensions.fold(
1, (accumulator, element) => accumulator * element);
int get _nestedDimensionsFlattened =>
_nestedDimensionsFlattenedCache ??= _nestedDimensions.fold<int>(
1, (accumulator, element) => accumulator * element);
late final int _nestedDimensionsFirst = _nestedDimensions.first;
int get _nestedDimensionsFirst =>
_nestedDimensionsFirstCache ??= _nestedDimensions.first;
late final List<int> _nestedDimensionsRest = _nestedDimensions.sublist(1);
List<int> get _nestedDimensionsRest =>
_nestedDimensionsRestCache ??= _nestedDimensions.sublist(1);
_checkIndex(int index) {
if (index < 0 || index >= _size) {