diff --git a/pkg/vm/lib/transformations/ffi/common.dart b/pkg/vm/lib/transformations/ffi/common.dart index 22f21954129..3b3a83742c8 100644 --- a/pkg/vm/lib/transformations/ffi/common.dart +++ b/pkg/vm/lib/transformations/ffi/common.dart @@ -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 = diff --git a/pkg/vm/lib/transformations/ffi/use_sites.dart b/pkg/vm/lib/transformations/ffi/use_sites.dart index 0a765e32d1f..bdc6fdf86cb 100644 --- a/pkg/vm/lib/transformations/ffi/use_sites.dart +++ b/pkg/vm/lib/transformations/ffi/use_sites.dart @@ -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 ]))); diff --git a/sdk/lib/_internal/vm/lib/ffi_patch.dart b/sdk/lib/_internal/vm/lib/ffi_patch.dart index bbf8499c09f..174cc69f55e 100644 --- a/sdk/lib/_internal/vm/lib/ffi_patch.dart +++ b/sdk/lib/_internal/vm/lib/ffi_patch.dart @@ -205,15 +205,22 @@ class Array { @pragma("vm:entry-point") final List _nestedDimensions; + int? _nestedDimensionsFlattenedCache; + int? _nestedDimensionsFirstCache; + List? _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( + 1, (accumulator, element) => accumulator * element); - late final int _nestedDimensionsFirst = _nestedDimensions.first; + int get _nestedDimensionsFirst => + _nestedDimensionsFirstCache ??= _nestedDimensions.first; - late final List _nestedDimensionsRest = _nestedDimensions.sublist(1); + List get _nestedDimensionsRest => + _nestedDimensionsRestCache ??= _nestedDimensions.sublist(1); _checkIndex(int index) { if (index < 0 || index >= _size) {