[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:
committed by
Commit Bot
parent
5317e4c605
commit
3b64cede6d
@@ -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
|
||||
])));
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user