Skip to content

Commit ffa5d16

Browse files
dcharkescommit-bot@chromium.org
authored andcommitted
[vm/ffi] Support multi-dimensional inline arrays
This CL only changes dart:ffi API, CFE, and analyzer. No VM changes were needed because the dimensions of inline arrays can be flattened before passing them to the VM. The multi-dimensionality does not impact the ABI. Closes: #45023 TEST=pkg/analyzer/test/src/diagnostics/size_annotation_dimensions_test.dart TEST=pkg/front_end/testcases/nnbd/ffi_struct_inline_array_multi_dimensional.dart TEST=tests/ffi/function_structs_by_value_generated_test.dart TEST=tests/ffi/inline_array_multi_dimensional_test.dart Change-Id: Ica2c01fccbea7e513879365b34086d8968b54c5b Cq-Include-Trybots: luci.dart.try:dart-sdk-linux-try,dart-sdk-mac-try,dart-sdk-win-try,vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-mac-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-kernel-linux-debug-x64-try,vm-kernel-nnbd-linux-debug-x64-try,vm-kernel-nnbd-linux-debug-ia32-try,vm-kernel-nnbd-mac-release-x64-try,vm-kernel-nnbd-win-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-debug-simarm_x64-try,vm-kernel-precomp-nnbd-linux-debug-x64-try,vm-kernel-precomp-win-release-x64-try,vm-kernel-reload-linux-debug-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-precomp-ffi-qemu-linux-release-arm-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-msan-linux-release-x64-try,vm-kernel-precomp-msan-linux-release-x64-try,vm-kernel-precomp-android-release-arm_x64-try,analyzer-analysis-server-linux-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/188286 Commit-Queue: Daco Harkes <[email protected]> Reviewed-by: Aske Simon Christensen <[email protected]>
1 parent 7d64d52 commit ffa5d16

File tree

48 files changed

+2872
-211
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+2872
-211
lines changed

pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3925,6 +3925,32 @@ Message _withArgumentsFfiSizeAnnotation(String name) {
39253925
arguments: {'name': name});
39263926
}
39273927

3928+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
3929+
const Template<
3930+
Message Function(
3931+
String
3932+
name)> templateFfiSizeAnnotationDimensions = const Template<
3933+
Message Function(String name)>(
3934+
messageTemplate:
3935+
r"""Field '#name' must have an 'Array' annotation that matches the dimensions.""",
3936+
withArguments: _withArgumentsFfiSizeAnnotationDimensions);
3937+
3938+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
3939+
const Code<Message Function(String name)> codeFfiSizeAnnotationDimensions =
3940+
const Code<Message Function(String name)>(
3941+
"FfiSizeAnnotationDimensions",
3942+
);
3943+
3944+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
3945+
Message _withArgumentsFfiSizeAnnotationDimensions(String name) {
3946+
if (name.isEmpty) throw 'No name provided';
3947+
name = demangleMixinApplicationName(name);
3948+
return new Message(codeFfiSizeAnnotationDimensions,
3949+
message:
3950+
"""Field '${name}' must have an 'Array' annotation that matches the dimensions.""",
3951+
arguments: {'name': name});
3952+
}
3953+
39283954
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
39293955
const Template<Message Function(String name)> templateFfiStructGeneric =
39303956
const Template<Message Function(String name)>(

pkg/analyzer/lib/error/error.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,7 @@ const List<ErrorCode> errorCodeValues = [
476476
FfiCode.NON_CONSTANT_TYPE_ARGUMENT,
477477
FfiCode.NON_NATIVE_FUNCTION_TYPE_ARGUMENT_TO_POINTER,
478478
FfiCode.NON_SIZED_TYPE_ARGUMENT,
479+
FfiCode.SIZE_ANNOTATION_DIMENSIONS,
479480
FfiCode.SUBTYPE_OF_FFI_CLASS_IN_EXTENDS,
480481
FfiCode.SUBTYPE_OF_FFI_CLASS_IN_IMPLEMENTS,
481482
FfiCode.SUBTYPE_OF_FFI_CLASS_IN_WITH,

pkg/analyzer/lib/src/dart/error/ffi_code.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,15 @@ class FfiCode extends AnalyzerErrorCode {
206206
correction: "Try using a native integer, 'Float', 'Double', 'Pointer', "
207207
"or subtype of 'Struct'.");
208208

209+
/**
210+
* No parameters.
211+
*/
212+
static const FfiCode SIZE_ANNOTATION_DIMENSIONS = FfiCode(
213+
name: 'SIZE_ANNOTATION_DIMENSIONS',
214+
message:
215+
"'Array's must have an 'Array' annotation that matches the dimensions.",
216+
correction: "Try adjusting the arguments in the 'Array' annotation.");
217+
209218
/**
210219
* Parameters:
211220
* 0: the name of the subclass

pkg/analyzer/lib/src/generated/ffi_verifier.dart

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class FfiVerifier extends RecursiveAstVisitor<void> {
1818
static const _allocatorClassName = 'Allocator';
1919
static const _allocateExtensionMethodName = 'call';
2020
static const _allocatorExtensionName = 'AllocatorAlloc';
21-
static const _cArrayClassName = 'Array';
21+
static const _arrayClassName = 'Array';
2222
static const _dartFfiLibraryName = 'dart.ffi';
2323
static const _opaqueClassName = 'Opaque';
2424

@@ -248,6 +248,9 @@ class FfiVerifier extends RecursiveAstVisitor<void> {
248248
if (nativeType.isPointer) {
249249
return true;
250250
}
251+
if (nativeType.isArray) {
252+
return true;
253+
}
251254
return false;
252255
}
253256

@@ -554,9 +557,10 @@ class FfiVerifier extends RecursiveAstVisitor<void> {
554557
final typeArg = (declaredType as InterfaceType).typeArguments.single;
555558
if (!_isSized(typeArg)) {
556559
_errorReporter.reportErrorForNode(FfiCode.NON_SIZED_TYPE_ARGUMENT,
557-
fieldType, [_cArrayClassName, typeArg.toString()]);
560+
fieldType, [_arrayClassName, typeArg.toString()]);
558561
}
559-
_validateSizeOfAnnotation(fieldType, annotations);
562+
final arrayDimensions = declaredType.arrayDimensions;
563+
_validateSizeOfAnnotation(fieldType, annotations, arrayDimensions);
560564
} else if (declaredType.isStructSubtype) {
561565
final clazz = (declaredType as InterfaceType).element;
562566
if (clazz.isEmptyStruct) {
@@ -708,8 +712,8 @@ class FfiVerifier extends RecursiveAstVisitor<void> {
708712
/// Validate that the [annotations] include exactly one size annotation. If
709713
/// an error is produced that cannot be associated with an annotation,
710714
/// associate it with the [errorNode].
711-
void _validateSizeOfAnnotation(
712-
AstNode errorNode, NodeList<Annotation> annotations) {
715+
void _validateSizeOfAnnotation(AstNode errorNode,
716+
NodeList<Annotation> annotations, int arrayDimensions) {
713717
final ffiSizeAnnotations = annotations.where((annotation) {
714718
final element = annotation.element;
715719
return element is ConstructorElement &&
@@ -720,14 +724,34 @@ class FfiVerifier extends RecursiveAstVisitor<void> {
720724
if (ffiSizeAnnotations.isEmpty) {
721725
_errorReporter.reportErrorForNode(
722726
FfiCode.MISSING_SIZE_ANNOTATION_CARRAY, errorNode);
727+
return;
723728
}
729+
724730
if (ffiSizeAnnotations.length > 1) {
725731
final extraAnnotations = ffiSizeAnnotations.skip(1);
726732
for (final annotation in extraAnnotations) {
727733
_errorReporter.reportErrorForNode(
728734
FfiCode.EXTRA_SIZE_ANNOTATION_CARRAY, annotation);
729735
}
730736
}
737+
738+
// Check number of dimensions.
739+
final annotation = ffiSizeAnnotations.first;
740+
final expressions = annotation.arguments!.arguments;
741+
int annotationDimensions = 0;
742+
for (var expression in expressions) {
743+
if (expression is IntegerLiteral) {
744+
// Element of `@Array(1, 2, 3)`.
745+
annotationDimensions++;
746+
} else if (expression is ListLiteral) {
747+
// Element of `@Array.multi([1, 2, 3])`.
748+
annotationDimensions += expression.elements.length;
749+
}
750+
}
751+
if (annotationDimensions != arrayDimensions) {
752+
_errorReporter.reportErrorForNode(
753+
FfiCode.SIZE_ANNOTATION_DIMENSIONS, annotation);
754+
}
731755
}
732756

733757
/// Validate that the given [typeArgument] has a constant value. Return `true`
@@ -845,11 +869,23 @@ extension on DartType {
845869
final self = this;
846870
if (self is InterfaceType) {
847871
final element = self.element;
848-
return element.name == FfiVerifier._cArrayClassName && element.isFfiClass;
872+
return element.name == FfiVerifier._arrayClassName && element.isFfiClass;
849873
}
850874
return false;
851875
}
852876

877+
int get arrayDimensions {
878+
DartType iterator = this;
879+
int dimensions = 0;
880+
while (iterator is InterfaceType &&
881+
iterator.element.name == FfiVerifier._arrayClassName &&
882+
iterator.element.isFfiClass) {
883+
dimensions++;
884+
iterator = iterator.typeArguments.single;
885+
}
886+
return dimensions;
887+
}
888+
853889
bool get isPointer {
854890
final self = this;
855891
return self is InterfaceType && self.element.isPointer;

pkg/analyzer/lib/src/test_utilities/mock_sdk.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -691,7 +691,10 @@ class DartRepresentationOf {
691691
}
692692
693693
class Array<T extends NativeType> extends NativeType {
694-
external const factory Array(int dimension1);
694+
external const factory Array(int dimension1,
695+
[int dimension2, int dimension3, int dimension4, int dimension5]);
696+
697+
external const factory Array.multi(List<int> dimensions);
695698
}
696699
697700
extension StructPointer<T extends Struct> on Pointer<T> {

pkg/analyzer/test/src/diagnostics/non_sized_type_argument_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ import 'dart:ffi';
3232
3333
class C extends Struct {
3434
@Array(8)
35-
Array<Array<Uint8>> a0;
35+
Array<Void> a0;
3636
}
3737
''', [
38-
error(FfiCode.NON_SIZED_TYPE_ARGUMENT, 59, 19),
38+
error(FfiCode.NON_SIZED_TYPE_ARGUMENT, 59, 11),
3939
]);
4040
}
4141
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:analyzer/src/dart/error/ffi_code.dart';
6+
import 'package:test_reflective_loader/test_reflective_loader.dart';
7+
8+
import '../dart/resolution/context_collection_resolution.dart';
9+
10+
main() {
11+
defineReflectiveSuite(() {
12+
defineReflectiveTests(SizeAnnotationDimensions);
13+
});
14+
}
15+
16+
@reflectiveTest
17+
class SizeAnnotationDimensions extends PubPackageResolutionTest {
18+
test_error_array_2_3() async {
19+
await assertErrorsInCode(r'''
20+
import 'dart:ffi';
21+
22+
class C extends Struct {
23+
@Array(8, 8)
24+
Array<Array<Array<Uint8>>> a0;
25+
}
26+
''', [
27+
error(FfiCode.SIZE_ANNOTATION_DIMENSIONS, 47, 12),
28+
]);
29+
}
30+
31+
test_error_array_3_2() async {
32+
await assertErrorsInCode(r'''
33+
import 'dart:ffi';
34+
35+
class C extends Struct {
36+
@Array(8, 8, 8)
37+
Array<Array<Uint8>> a0;
38+
}
39+
''', [
40+
error(FfiCode.SIZE_ANNOTATION_DIMENSIONS, 47, 15),
41+
]);
42+
}
43+
44+
test_error_multi_2_3() async {
45+
await assertErrorsInCode(r'''
46+
import 'dart:ffi';
47+
48+
class C extends Struct {
49+
@Array.multi([8, 8])
50+
Array<Array<Array<Uint8>>> a0;
51+
}
52+
''', [
53+
error(FfiCode.SIZE_ANNOTATION_DIMENSIONS, 47, 20),
54+
]);
55+
}
56+
57+
test_no_error() async {
58+
await assertNoErrorsInCode(r'''
59+
import 'dart:ffi';
60+
61+
class C extends Struct {
62+
@Array(8, 8)
63+
Array<Array<Uint8>> a0;
64+
}
65+
''');
66+
}
67+
}

pkg/analyzer/test/src/diagnostics/test_all.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,7 @@ import 'set_element_from_deferred_library_test.dart'
571571
import 'set_element_type_not_assignable_test.dart'
572572
as set_element_type_not_assignable;
573573
import 'shared_deferred_prefix_test.dart' as shared_deferred_prefix;
574+
import 'size_annotation_dimensions_test.dart' as size_annotation_dimensions;
574575
import 'spread_expression_from_deferred_library_test.dart'
575576
as spread_expression_from_deferred_library;
576577
import 'static_access_to_instance_member_test.dart'
@@ -1044,6 +1045,7 @@ main() {
10441045
sdk_version_ui_as_code_in_const_context.main();
10451046
set_element_type_not_assignable.main();
10461047
shared_deferred_prefix.main();
1048+
size_annotation_dimensions.main();
10471049
spread_expression_from_deferred_library.main();
10481050
static_access_to_instance_member.main();
10491051
strict_raw_type.main();

pkg/front_end/lib/src/api_unstable/vm.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ export '../fasta/fasta_codes.dart'
6565
templateFfiFieldNull,
6666
templateFfiNotStatic,
6767
templateFfiSizeAnnotation,
68+
templateFfiSizeAnnotationDimensions,
6869
templateFfiStructGeneric,
6970
templateFfiTypeInvalid,
7071
templateFfiTypeMismatch;

pkg/front_end/messages.status

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,7 @@ FfiFieldNoAnnotation/analyzerCode: Fail
330330
FfiFieldNull/analyzerCode: Fail
331331
FfiNotStatic/analyzerCode: Fail
332332
FfiSizeAnnotation/analyzerCode: Fail
333+
FfiSizeAnnotationDimensions/analyzerCode: Fail
333334
FfiStructAnnotation/analyzerCode: Fail
334335
FfiStructGeneric/analyzerCode: Fail
335336
FfiTypeInvalid/analyzerCode: Fail

pkg/front_end/messages.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4272,6 +4272,11 @@ FfiSizeAnnotation:
42724272
template: "Field '#name' must have exactly one 'Array' annotation."
42734273
external: test/ffi_test.dart
42744274

4275+
FfiSizeAnnotationDimensions:
4276+
# Used by dart:ffi
4277+
template: "Field '#name' must have an 'Array' annotation that matches the dimensions."
4278+
external: test/ffi_test.dart
4279+
42754280
FfiStructGeneric:
42764281
# Used by dart:ffi
42774282
template: "Struct '#name' should not be generic."

pkg/front_end/test/spell_checking_list_common.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -857,6 +857,9 @@ dig
857857
digit
858858
digits
859859
dill
860+
dimension
861+
dimensional
862+
dimensions
860863
dir
861864
direct
862865
direction

pkg/front_end/test/spell_checking_list_tests.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ c's
9999
c59cdee365b94ce066344840f9e3412d642019b
100100
ca
101101
cafebabe
102+
calloc
102103
camel
103104
capitalized
104105
causal

pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.expect

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,20 @@ class StructInlineArray extends ffi::Struct {
99
synthetic constructor •() → self::StructInlineArray
1010
: super ffi::Struct::•()
1111
;
12-
@#C2
12+
@#C3
1313
external get a0() → ffi::Array<ffi::Uint8>;
14-
@#C2
14+
@#C3
1515
external set a0(ffi::Array<ffi::Uint8> #externalFieldValue) → void;
1616
}
1717
static method main() → dynamic {}
1818

1919
constants {
2020
#C1 = 8
21-
#C2 = ffi::_ArraySize<ffi::NativeType> {dimension1:#C1}
21+
#C2 = null
22+
#C3 = ffi::_ArraySize<ffi::NativeType> {dimension1:#C1, dimension2:#C2, dimension3:#C2, dimension4:#C2, dimension5:#C2, dimensions:#C2}
2223
}
2324

2425

2526
Constructor coverage from constants:
2627
org-dartlang-testcase:///ffi_struct_inline_array.dart:
27-
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/ffi_patch.dart:133:9)
28+
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/ffi_patch.dart:156:9)

pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.strong.transformed.expect

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class StructInlineArray extends ffi::Struct {
2323
return new ffi::Array::_<ffi::Array<ffi::Uint8>>( block {
2424
core::Object #typedDataBase = this.{ffi::Struct::_addressOf};
2525
core::int #offset = (#C14).{core::List::[]}(ffi::_abi());
26-
} =>#typedDataBase is ffi::Pointer<dynamic> ?{core::Object} ffi::_fromAddress<ffi::Uint8>(#typedDataBase.{ffi::Pointer::address}.{core::num::+}(#offset)) : let typ::TypedData #typedData = _in::unsafeCast<typ::TypedData>(#typedDataBase) in #typedData.{typ::TypedData::buffer}.{typ::ByteBuffer::asUint8List}(#typedData.{typ::TypedData::offsetInBytes}.{core::num::+}(#offset), (#C8).{core::List::[]}(ffi::_abi())), #C3);
26+
} =>#typedDataBase is ffi::Pointer<dynamic> ?{core::Object} ffi::_fromAddress<ffi::Uint8>(#typedDataBase.{ffi::Pointer::address}.{core::num::+}(#offset)) : let typ::TypedData #typedData = _in::unsafeCast<typ::TypedData>(#typedDataBase) in #typedData.{typ::TypedData::buffer}.{typ::ByteBuffer::asUint8List}(#typedData.{typ::TypedData::offsetInBytes}.{core::num::+}(#offset), (#C8).{core::List::[]}(ffi::_abi())), #C3, #C15);
2727
@#C12
2828
set a0(ffi::Array<ffi::Uint8> #externalFieldValue) → void
2929
return ffi::_memCopy(this.{ffi::Struct::_addressOf}, (#C14).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Array::_typedDataBase}, #C13, (#C8).{core::List::[]}(ffi::_abi()));
@@ -42,12 +42,13 @@ constants {
4242
#C9 = "vm:entry-point"
4343
#C10 = null
4444
#C11 = core::pragma {name:#C9, options:#C10}
45-
#C12 = ffi::_ArraySize<ffi::NativeType> {dimension1:#C3}
45+
#C12 = ffi::_ArraySize<ffi::NativeType> {dimension1:#C3, dimension2:#C10, dimension3:#C10, dimension4:#C10, dimension5:#C10, dimensions:#C10}
4646
#C13 = 0
4747
#C14 = <core::int*>[#C13, #C13, #C13]
48+
#C15 = <core::int*>[]
4849
}
4950

5051

5152
Constructor coverage from constants:
5253
org-dartlang-testcase:///ffi_struct_inline_array.dart:
53-
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/ffi_patch.dart:133:9)
54+
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/ffi_patch.dart:156:9)

pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.expect

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,20 @@ class StructInlineArray extends ffi::Struct {
99
synthetic constructor •() → self::StructInlineArray
1010
: super ffi::Struct::•()
1111
;
12-
@#C2
12+
@#C3
1313
external get a0() → ffi::Array<ffi::Uint8>;
14-
@#C2
14+
@#C3
1515
external set a0(ffi::Array<ffi::Uint8> #externalFieldValue) → void;
1616
}
1717
static method main() → dynamic {}
1818

1919
constants {
2020
#C1 = 8
21-
#C2 = ffi::_ArraySize<ffi::NativeType*> {dimension1:#C1}
21+
#C2 = null
22+
#C3 = ffi::_ArraySize<ffi::NativeType*> {dimension1:#C1, dimension2:#C2, dimension3:#C2, dimension4:#C2, dimension5:#C2, dimensions:#C2}
2223
}
2324

2425

2526
Constructor coverage from constants:
2627
org-dartlang-testcase:///ffi_struct_inline_array.dart:
27-
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/ffi_patch.dart:133:9)
28+
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/_internal/vm/lib/ffi_patch.dart:156:9)

pkg/front_end/testcases/nnbd/ffi_struct_inline_array.dart.weak.outline.expect

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ static method main() → dynamic
1818

1919

2020
Extra constant evaluation status:
21-
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///ffi_struct_inline_array.dart:10:4 -> InstanceConstant(const _ArraySize<NativeType*>{_ArraySize.dimension1: 8})
22-
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///ffi_struct_inline_array.dart:10:4 -> InstanceConstant(const _ArraySize<NativeType*>{_ArraySize.dimension1: 8})
21+
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///ffi_struct_inline_array.dart:10:4 -> InstanceConstant(const _ArraySize<NativeType*>{_ArraySize.dimension1: 8, _ArraySize.dimension2: null, _ArraySize.dimension3: null, _ArraySize.dimension4: null, _ArraySize.dimension5: null, _ArraySize.dimensions: null})
22+
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///ffi_struct_inline_array.dart:10:4 -> InstanceConstant(const _ArraySize<NativeType*>{_ArraySize.dimension1: 8, _ArraySize.dimension2: null, _ArraySize.dimension3: null, _ArraySize.dimension4: null, _ArraySize.dimension5: null, _ArraySize.dimensions: null})
2323
Extra constant evaluation: evaluated: 2, effectively constant: 2

0 commit comments

Comments
 (0)