Skip to content

Commit 0bcb0c9

Browse files
committed
[vm/ffi] Add _Compound _offsetInBytes field
This CL changes compounds (structs, unions, and arrays) to be backed by a TypedDataBase and an int offset. Before this CL, the compounds where only backed by a TypedDataBase. This leads to the following issues: 1. Access to nested structs required code for allocating new typed data views or pointers, which the optimizer then had to prevent from being allocated after inlining. 2. Runtime branching on whether the TypedDataBase was a Pointer or TypedData increased code size and prevented inlining. #54892 This could not be properly optimized if in AOT both typed data and pointer were flowing into the same compound. 3. Constructing TypedData views required calculating the length of the view. After this CL, accessing nested compounds will lead to accesses on the original TypedDataBase with an extra offset. This removes the polymorphism on TypedData vs Pointer, because the final int/float/Pointer accesses in nested compounds operate on TypedDataBase. Also, it simplifies creating an `offsetBy` accessor, because it will no longer have to be polymorphic in typed data vs pointer, nor will it have to calculate the length of the field. Implementation details: * The changes in the CFE and patch files are straightforward. * VM: Struct-by-value returns (or callback params) are initialized with an offsetInBytes of 0. * VM: Struct-by-value arguments (and callback return) need to read out the offsetInBytes. Before this CL we were passing in the TypedData as tagged value. With this CL we are passing the TypedData as tagged value and the offset as unboxed int, from 1 IL input to 2 IL inputs. (The alternative would have been to take the compound as a tagged value, but that would have prevented optimizations from not allocating the compound object in the optimizer. The FfiCallInstr is updated to have two definitions for the case where we were passing in the TypedData previously. The NativeReturnInstr is refactored to be able to take two inputs instead of 1. (Note that we don't have VariadicInstr only VariadicDefinition in the code base. So the instruction is _not_ implemented as variadic, rather as having a fixed length of 2.) * dart2wasm does no longer support nested compounds due to the compound implementation only storing a pointer address. #55083 Intending to land this after https://dart-review.googlesource.com/c/sdk/+/353101. TEST=test/ffi CoreLibraryReviewExempt: VM and WASM-only implementation change. Closes: #54892 Bug: #44589 Change-Id: I8749e21094bf8fa2d5ff1e48b6b002c375232eb5 Cq-Include-Trybots: dart-internal/g3.dart-internal.try:g3-cbuild-try Cq-Include-Trybots: dart/try:vm-aot-android-release-arm64c-try,vm-aot-android-release-arm_x64-try,vm-aot-linux-debug-x64-try,vm-aot-linux-debug-x64c-try,vm-aot-mac-release-arm64-try,vm-aot-mac-release-x64-try,vm-aot-obfuscate-linux-release-x64-try,vm-aot-optimization-level-linux-release-x64-try,vm-aot-win-debug-arm64-try,vm-aot-win-debug-x64-try,vm-aot-win-debug-x64c-try,vm-appjit-linux-debug-x64-try,vm-asan-linux-release-x64-try,vm-checked-mac-release-arm64-try,vm-eager-optimization-linux-release-ia32-try,vm-eager-optimization-linux-release-x64-try,vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64c-try,vm-ffi-qemu-linux-release-arm-try,vm-ffi-qemu-linux-release-riscv64-try,vm-fuchsia-release-x64-try,vm-linux-debug-ia32-try,vm-linux-debug-x64-try,vm-linux-debug-x64c-try,vm-mac-debug-arm64-try,vm-mac-debug-x64-try,vm-msan-linux-release-x64-try,vm-reload-linux-debug-x64-try,vm-reload-rollback-linux-debug-x64-try,vm-ubsan-linux-release-x64-try,vm-win-debug-arm64-try,vm-win-debug-x64-try,vm-win-debug-x64c-try,vm-win-release-ia32-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/354226 Reviewed-by: Tess Strickland <[email protected]>
1 parent 8df8de8 commit 0bcb0c9

File tree

71 files changed

+1251
-1106
lines changed

Some content is hidden

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

71 files changed

+1251
-1106
lines changed

pkg/dart2wasm/lib/ffi_native_transformer.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ class WasmFfiNativeTransformer extends FfiNativeTransformer {
257257
StaticInvocation(wasmF32FromDouble, Arguments([expr])),
258258
NativeType.kDouble =>
259259
StaticInvocation(wasmF64FromDouble, Arguments([expr])),
260-
NativeType.kPointer || NativeType.kStruct => expr,
260+
NativeType.kPointer => expr,
261261
NativeType.kBool => StaticInvocation(wasmI32FromBool, Arguments([expr])),
262262
NativeType.kVoid => null,
263263
_ => throw '_dartValueToFfiValue: $abiTypeNativeType cannot be converted'
@@ -297,7 +297,6 @@ class WasmFfiNativeTransformer extends FfiNativeTransformer {
297297

298298
case NativeType.kPointer:
299299
case NativeType.kVoid:
300-
case NativeType.kStruct:
301300
return expr;
302301

303302
case NativeType.kUint64:
@@ -319,6 +318,7 @@ class WasmFfiNativeTransformer extends FfiNativeTransformer {
319318
case NativeType.kNativeInteger:
320319
case NativeType.kNativeType:
321320
case NativeType.kOpaque:
321+
case NativeType.kStruct:
322322
throw '_ffiValueToDartValue: $nativeType cannot be converted';
323323
}
324324
}

pkg/dart2wasm/lib/intrinsics.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,10 +187,21 @@ class Intrinsifier {
187187
// A compound (subclass of Struct or Union) is represented by its i32
188188
// address. The _typedDataBase field contains a Pointer pointing to the
189189
// compound, whose representation is the same.
190+
// TODO(https://dartbug.com/55083): Implement structs backed by TypedData.
190191
codeGen.wrap(receiver, w.NumType.i32);
191192
return w.NumType.i32;
192193
}
193194

195+
// _Compound._offsetInBytes
196+
if (cls == translator.ffiCompoundClass && name == '_offsetInBytes') {
197+
// A compound (subclass of Struct or Union) is represented by its i32
198+
// address. The _offsetInBytes field contains is always 0.
199+
// This also breaks nested structs, which are currently not used.
200+
// TODO(https://dartbug.com/55083): Implement structs backed by TypedData.
201+
b.i64_const(0);
202+
return w.NumType.i64;
203+
}
204+
194205
// Pointer.address
195206
if (cls == translator.ffiPointerClass && name == 'address') {
196207
// A Pointer is represented by its i32 address.

pkg/front_end/testcases/general/ffi_external_in_part_file.dart.strong.transformed.expect

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,18 @@ final class Struct1ByteInt extends ffi::Struct {
1313
synthetic constructor •() → self::Struct1ByteInt
1414
: super ffi::Struct::•()
1515
;
16-
constructor #fromTypedDataBase(synthesized core::Object #typedDataBase) → self::Struct1ByteInt
17-
: super ffi::Struct::_fromTypedDataBase(#typedDataBase)
16+
constructor #fromTypedDataBase(synthesized core::Object #typedDataBase, synthesized core::int #offsetInBytes) → self::Struct1ByteInt
17+
: super ffi::Struct::_fromTypedDataBase(#typedDataBase, #offsetInBytes)
1818
;
1919
constructor #fromTypedData(synthesized typ::TypedData #typedData, synthesized core::int #offset, synthesized core::int #sizeInBytes) → self::Struct1ByteInt
2020
: super ffi::Struct::_fromTypedData(#typedData, #offset, #sizeInBytes)
2121
;
2222
@#C7
2323
get a0() → core::int
24-
return ffi::_loadInt8(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Struct1ByteInt::a0#offsetOf);
24+
return ffi::_loadInt8(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Struct1ByteInt::a0#offsetOf.{core::num::+}(this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num});
2525
@#C7
2626
set a0(synthesized core::int #externalFieldValue) → void
27-
return ffi::_storeInt8(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Struct1ByteInt::a0#offsetOf, #externalFieldValue);
27+
return ffi::_storeInt8(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Struct1ByteInt::a0#offsetOf.{core::num::+}(this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num}, #externalFieldValue);
2828
@#C9
2929
static get a0#offsetOf() → core::int
3030
return #C11.{core::List::[]}(ffi::_abi()){(core::int) → core::int*};
@@ -39,7 +39,7 @@ static method notMain() → void {
3939
@#C9
4040
static method /* from org-dartlang-testcase:///ffi_external_in_part_lib.dart */ returnStruct1ByteIntNative(core::int a0) → self::Struct1ByteInt
4141
return block {
42-
_in::_nativeEffect(new self::Struct1ByteInt::#fromTypedDataBase(typ::Uint8List::•(#C12)));
42+
_in::_nativeEffect(new self::Struct1ByteInt::#fromTypedDataBase(typ::Uint8List::•(#C12), #C10));
4343
} =>self::_returnStruct1ByteIntNative$Method$FfiNative(a0);
4444
@#C21
4545
external static method /* from org-dartlang-testcase:///ffi_external_in_part_lib.dart */ _returnStruct1ByteIntNative$Method$FfiNative(core::int #t0) → self::Struct1ByteInt;
@@ -70,7 +70,7 @@ constants {
7070

7171
Extra constant evaluation status:
7272
Evaluated: InstanceInvocation @ org-dartlang-testcase:///ffi_external_in_part_file.dart:11:36 -> IntConstant(-1)
73-
Extra constant evaluation: evaluated: 26, effectively constant: 1
73+
Extra constant evaluation: evaluated: 33, effectively constant: 1
7474

7575

7676
Constructor coverage from constants:

pkg/front_end/testcases/general/ffi_external_in_part_file.dart.weak.transformed.expect

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,18 @@ final class Struct1ByteInt extends ffi::Struct {
1313
synthetic constructor •() → self::Struct1ByteInt
1414
: super ffi::Struct::•()
1515
;
16-
constructor #fromTypedDataBase(synthesized core::Object #typedDataBase) → self::Struct1ByteInt
17-
: super ffi::Struct::_fromTypedDataBase(#typedDataBase)
16+
constructor #fromTypedDataBase(synthesized core::Object #typedDataBase, synthesized core::int #offsetInBytes) → self::Struct1ByteInt
17+
: super ffi::Struct::_fromTypedDataBase(#typedDataBase, #offsetInBytes)
1818
;
1919
constructor #fromTypedData(synthesized typ::TypedData #typedData, synthesized core::int #offset, synthesized core::int #sizeInBytes) → self::Struct1ByteInt
2020
: super ffi::Struct::_fromTypedData(#typedData, #offset, #sizeInBytes)
2121
;
2222
@#C7
2323
get a0() → core::int
24-
return ffi::_loadInt8(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Struct1ByteInt::a0#offsetOf);
24+
return ffi::_loadInt8(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Struct1ByteInt::a0#offsetOf.{core::num::+}(this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num});
2525
@#C7
2626
set a0(synthesized core::int #externalFieldValue) → void
27-
return ffi::_storeInt8(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Struct1ByteInt::a0#offsetOf, #externalFieldValue);
27+
return ffi::_storeInt8(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Struct1ByteInt::a0#offsetOf.{core::num::+}(this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num}, #externalFieldValue);
2828
@#C9
2929
static get a0#offsetOf() → core::int
3030
return #C11.{core::List::[]}(ffi::_abi()){(core::int) → core::int*};
@@ -39,7 +39,7 @@ static method notMain() → void {
3939
@#C9
4040
static method /* from org-dartlang-testcase:///ffi_external_in_part_lib.dart */ returnStruct1ByteIntNative(core::int a0) → self::Struct1ByteInt
4141
return block {
42-
_in::_nativeEffect(new self::Struct1ByteInt::#fromTypedDataBase(typ::Uint8List::•(#C12)));
42+
_in::_nativeEffect(new self::Struct1ByteInt::#fromTypedDataBase(typ::Uint8List::•(#C12), #C10));
4343
} =>self::_returnStruct1ByteIntNative$Method$FfiNative(a0);
4444
@#C21
4545
external static method /* from org-dartlang-testcase:///ffi_external_in_part_lib.dart */ _returnStruct1ByteIntNative$Method$FfiNative(core::int #t0) → self::Struct1ByteInt;
@@ -70,7 +70,7 @@ constants {
7070

7171
Extra constant evaluation status:
7272
Evaluated: InstanceInvocation @ org-dartlang-testcase:///ffi_external_in_part_file.dart:11:36 -> IntConstant(-1)
73-
Extra constant evaluation: evaluated: 26, effectively constant: 1
73+
Extra constant evaluation: evaluated: 33, effectively constant: 1
7474

7575

7676
Constructor coverage from constants:

pkg/front_end/testcases/general/ffi_sample.dart.strong.expect

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class Coordinate extends ffi::Struct {
2828
}
2929
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
3030
abstract member-signature get _typedDataBase() → core::Object*; -> ffi::_Compound::_typedDataBase
31+
abstract member-signature get _offsetInBytes() → core::int*; -> ffi::_Compound::_offsetInBytes
3132
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
3233
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
3334
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf

pkg/front_end/testcases/general/ffi_sample.dart.strong.transformed.expect

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,22 @@ import "package:ffi/ffi.dart";
1616

1717
@#C7
1818
class Coordinate extends ffi::Struct {
19-
constructor #fromTypedDataBase(synthesized core::Object #typedDataBase) → self::Coordinate
20-
: super ffi::Struct::_fromTypedDataBase(#typedDataBase)
19+
constructor #fromTypedDataBase(synthesized core::Object #typedDataBase, synthesized core::int #offsetInBytes) → self::Coordinate
20+
: super ffi::Struct::_fromTypedDataBase(#typedDataBase, #offsetInBytes)
2121
;
2222
constructor #fromTypedData(synthesized typ::TypedData #typedData, synthesized core::int #offset, synthesized core::int #sizeInBytes) → self::Coordinate
2323
: super ffi::Struct::_fromTypedData(#typedData, #offset, #sizeInBytes)
2424
;
2525
static factory allocate(ffi::Allocator* allocator, core::double* x, core::double* y, ffi::Pointer<self::Coordinate*>* next) → self::Coordinate* {
26-
return let final self::Coordinate* #t1 = new self::Coordinate::#fromTypedDataBase(allocator.{ffi::Allocator::allocate}<self::Coordinate*>(self::Coordinate::#sizeOf){(core::int, {alignment: core::int?}) → ffi::Pointer<self::Coordinate*>}!) in block {
26+
return let final self::Coordinate* #t1 = new self::Coordinate::#fromTypedDataBase(allocator.{ffi::Allocator::allocate}<self::Coordinate*>(self::Coordinate::#sizeOf){(core::int, {alignment: core::int?}) → ffi::Pointer<self::Coordinate*>}!, #C8) in block {
2727
#t1.{self::Coordinate::x} = x;
2828
#t1.{self::Coordinate::y} = y;
2929
#t1.{self::Coordinate::next} = next;
3030
} =>#t1;
3131
}
3232
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
3333
abstract member-signature get _typedDataBase() → core::Object*; -> ffi::_Compound::_typedDataBase
34+
abstract member-signature get _offsetInBytes() → core::int*; -> ffi::_Compound::_offsetInBytes
3435
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
3536
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
3637
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -40,30 +41,30 @@ class Coordinate extends ffi::Struct {
4041
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
4142
abstract member-signature method toString() → core::String*; -> core::Object::toString
4243
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
43-
@#C9
44+
@#C10
4445
static get /*isNonNullableByDefault*/ x#offsetOf() → core::int
4546
return #C11.{core::List::[]}(ffi::_abi()){(core::int) → core::int*};
4647
@#C12
4748
get x() → core::double*
48-
return ffi::_loadDouble(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::x#offsetOf);
49+
return ffi::_loadDouble(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::x#offsetOf.{core::num::+}(this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num});
4950
set x(synthesized core::double* #v) → void
50-
return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::x#offsetOf, #v);
51-
@#C9
51+
return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::x#offsetOf.{core::num::+}(this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num}, #v);
52+
@#C10
5253
static get /*isNonNullableByDefault*/ y#offsetOf() → core::int
5354
return #C14.{core::List::[]}(ffi::_abi()){(core::int) → core::int*};
5455
@#C12
5556
get y() → core::double*
56-
return ffi::_loadDouble(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::y#offsetOf);
57+
return ffi::_loadDouble(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::y#offsetOf.{core::num::+}(this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num});
5758
set y(synthesized core::double* #v) → void
58-
return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::y#offsetOf, #v);
59-
@#C9
59+
return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::y#offsetOf.{core::num::+}(this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num}, #v);
60+
@#C10
6061
static get /*isNonNullableByDefault*/ next#offsetOf() → core::int
6162
return #C16.{core::List::[]}(ffi::_abi()){(core::int) → core::int*};
6263
get next() → ffi::Pointer<self::Coordinate*>*
63-
return ffi::_loadPointer<self::Coordinate*>(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::next#offsetOf);
64+
return ffi::_loadPointer<self::Coordinate*>(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::next#offsetOf.{core::num::+}(this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num});
6465
set next(synthesized ffi::Pointer<self::Coordinate*>* #v) → void
65-
return ffi::_storePointer<self::Coordinate*>(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::next#offsetOf, #v);
66-
@#C9
66+
return ffi::_storePointer<self::Coordinate*>(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::next#offsetOf.{core::num::+}(this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num}, #v);
67+
@#C10
6768
static get /*isNonNullableByDefault*/ #sizeOf() → core::int*
6869
return #C19.{core::List::[]}(ffi::_abi()){(core::int) → core::int*};
6970
}
@@ -77,10 +78,10 @@ constants {
7778
#C5 = null
7879
#C6 = ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
7980
#C7 = core::pragma {name:#C1, options:#C6}
80-
#C8 = "vm:prefer-inline"
81-
#C9 = core::pragma {name:#C8, options:#C5}
82-
#C10 = 0
83-
#C11 = <core::int*>[#C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10, #C10]
81+
#C8 = 0
82+
#C9 = "vm:prefer-inline"
83+
#C10 = core::pragma {name:#C9, options:#C5}
84+
#C11 = <core::int*>[#C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8]
8485
#C12 = ffi::Double {}
8586
#C13 = 8
8687
#C14 = <core::int*>[#C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13, #C13]

pkg/front_end/testcases/general/ffi_sample.dart.weak.expect

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class Coordinate extends ffi::Struct {
2121
}
2222
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
2323
abstract member-signature get _typedDataBase() → core::Object*; -> ffi::_Compound::_typedDataBase
24+
abstract member-signature get _offsetInBytes() → core::int*; -> ffi::_Compound::_offsetInBytes
2425
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
2526
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
2627
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf

pkg/front_end/testcases/general/ffi_sample.dart.weak.modular.expect

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class Coordinate extends ffi::Struct {
2121
}
2222
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
2323
abstract member-signature get _typedDataBase() → core::Object*; -> ffi::_Compound::_typedDataBase
24+
abstract member-signature get _offsetInBytes() → core::int*; -> ffi::_Compound::_offsetInBytes
2425
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
2526
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
2627
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf

pkg/front_end/testcases/general/ffi_sample.dart.weak.outline.expect

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class Coordinate extends ffi::Struct {
1616
;
1717
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
1818
abstract member-signature get _typedDataBase() → core::Object*; -> ffi::_Compound::_typedDataBase
19+
abstract member-signature get _offsetInBytes() → core::int*; -> ffi::_Compound::_offsetInBytes
1920
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
2021
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
2122
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf

0 commit comments

Comments
 (0)