From 3b64cede6dc5e2199bc49ea31c2c24ad0493e39f Mon Sep 17 00:00:00 2001 From: Aske Simon Christensen Date: Wed, 16 Mar 2022 11:29:03 +0000 Subject: [PATCH] [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 Commit-Queue: Aske Simon Christensen --- pkg/vm/lib/transformations/ffi/common.dart | 18 +++++++++--------- pkg/vm/lib/transformations/ffi/use_sites.dart | 6 +++--- sdk/lib/_internal/vm/lib/ffi_patch.dart | 15 +++++++++++---- 3 files changed, 23 insertions(+), 16 deletions(-) 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) {