| library #lib; |
| import self as self; |
| import "dart:core" as core; |
| import "dart:ffi" as ffi; |
| import "dart:_internal" as _in; |
| import "dart:typed_data" as typ; |
| |
| import "dart:ffi"; |
| |
| @#C6 |
| final class Struct1 extends ffi::Struct { |
| constructor #fromTypedDataBase([@vm.inferred-arg-type.metadata=dart.typed_data::_Uint8List] synthesized core::Object #typedDataBase) → self::Struct1 |
| : super ffi::Struct::_fromTypedDataBase(#typedDataBase, #C7) |
| ; |
| } |
| @#C6 |
| final class Struct2 extends ffi::Struct { |
| constructor #fromTypedDataBase([@vm.inferred-arg-type.metadata=dart.typed_data::_Uint8List] synthesized core::Object #typedDataBase) → self::Struct2 |
| : super ffi::Struct::_fromTypedDataBase(#typedDataBase, #C7) |
| ; |
| } |
| @#C6 |
| final class Struct3 extends ffi::Struct { |
| constructor #fromTypedDataBase([@vm.inferred-arg-type.metadata=dart.typed_data::_Uint8List] synthesized core::Object #typedDataBase) → self::Struct3 |
| : super ffi::Struct::_fromTypedDataBase(#typedDataBase, #C7) |
| ; |
| } |
| @#C6 |
| abstract final class Struct5 extends ffi::Struct { |
| } |
| @#C6 |
| abstract final class Struct6 extends ffi::Struct { |
| } |
| @#C6 |
| abstract final class Struct7 extends ffi::Struct { |
| } |
| @#C11 |
| final class Struct11 extends ffi::Struct { |
| constructor #fromTypedDataBase([@vm.inferred-arg-type.metadata=dart.ffi::Pointer] synthesized core::Object #typedDataBase) → self::Struct11 |
| : super ffi::Struct::_fromTypedDataBase(#typedDataBase, #C7) |
| ; |
| |
| [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1] |
| get nested() → self::Struct12 |
| return new self::Struct12::#fromTypedDataBase([@vm.direct-call.metadata=dart.ffi::_Compound._typedDataBase] this.{ffi::_Compound::_typedDataBase}{core::Object}, [@vm.direct-call.metadata=dart.core::_IntegerImplementation.+] [@vm.inferred-type.metadata=int (skip check)] [@vm.inferred-type.metadata=dart.core::_Smi (value: 0)] self::Struct11::nested#offsetOf.{core::num::+}([@vm.direct-call.metadata=dart.ffi::_Compound._offsetInBytes] [@vm.inferred-type.metadata=int?] this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num}); |
| |
| [@vm.unboxing-info.metadata=()->i] |
| @#C13 |
| static get nested#offsetOf() → core::int |
| return #C14.{core::List::[]}(ffi::_abi()){(core::int) → core::int}; |
| } |
| @#C6 |
| final class Struct12 extends ffi::Struct { |
| |
| [@vm.unboxing-info.metadata=(b,i)->b] |
| constructor #fromTypedDataBase(synthesized core::Object #typedDataBase, [@vm.inferred-arg-type.metadata=int] synthesized core::int #offsetInBytes) → self::Struct12 |
| : super ffi::Struct::_fromTypedDataBase(#typedDataBase, #offsetInBytes) |
| ; |
| } |
| |
| [@vm.inferred-type.metadata=dart.ffi::Pointer] |
| static final field ffi::Pointer<ffi::NativeFunction<(self::Struct3) → ffi::Int32>> _#ffiCallback0 = [@vm.inferred-type.metadata=dart.ffi::Pointer] ffi::_createNativeCallableIsolateLocal<ffi::NativeFunction<(self::Struct3) → ffi::Int32>>(ffi::_nativeCallbackFunction<(self::Struct3) → ffi::Int32>(#C15, 0), null, false); |
| |
| [@vm.inferred-type.metadata=dart.ffi::Pointer] |
| static final field ffi::Pointer<ffi::NativeFunction<() → self::Struct7>> _#ffiCallback1 = [@vm.inferred-type.metadata=dart.ffi::Pointer] ffi::_createNativeCallableIsolateLocal<ffi::NativeFunction<() → self::Struct7>>(ffi::_nativeCallbackFunction<() → self::Struct7>(#C16, null), null, false); |
| static method main() → void { |
| self::testLookupFunctionReturn(); |
| self::testLookupFunctionArgument(); |
| self::testAsFunctionReturn(); |
| self::testAsFunctionArgument(); |
| self::testFromFunctionArgument(); |
| self::testFromFunctionReturn(); |
| self::testPointerLoad(); |
| self::testNestedLoad(); |
| } |
| |
| [@vm.closure-id=1] |
| static method testLookupFunctionReturn() → void { |
| final ffi::DynamicLibrary dylib = [@vm.inferred-type.metadata=dart.ffi::DynamicLibrary] ffi::DynamicLibrary::executable(); |
| final () → self::Struct1 function1 = block { |
| _in::_nativeEffect(new self::Struct1::#fromTypedDataBase([@vm.inferred-type.metadata=dart.typed_data::_Uint8List] typ::Uint8List::•(#C17))); |
| } => block { |
| [@vm.inferred-type.metadata=dart.ffi::Pointer] synthesized ffi::Pointer<ffi::NativeFunction<() → self::Struct1>> #ffiTarget0 = [@vm.direct-call.metadata=dart.ffi::DynamicLibrary.lookup] [@vm.inferred-type.metadata=dart.ffi::Pointer (skip check)] dylib.{ffi::DynamicLibrary::lookup}<ffi::NativeFunction<() → self::Struct1>>("function1"){(core::String) → ffi::Pointer<ffi::NativeFunction<() → self::Struct1>>}; |
| |
| [@vm.closure-id=1] |
| @#C21 |
| function #ffiClosure0() → self::Struct1 { |
| return [@vm.inferred-type.metadata=#lib::Struct1] ffi::_ffiCall<self::Struct1>(#ffiTarget0); |
| } |
| } =>#ffiClosure0; |
| final self::Struct1 struct1 = [@vm.direct-call.metadata=closure 1 in #lib::testLookupFunctionReturn] [@vm.inferred-type.metadata=#lib::Struct1 (receiver not int)] function1(){() → self::Struct1}; |
| core::print(struct1); |
| } |
| |
| [@vm.closure-id=1] |
| static method testAsFunctionReturn() → void { |
| final ffi::Pointer<ffi::NativeFunction<() → self::Struct2>> pointer = [@vm.inferred-type.metadata=dart.ffi::Pointer] ffi::Pointer::fromAddress<ffi::NativeFunction<() → self::Struct2>>(3735928559); |
| final () → self::Struct2 function2 = block { |
| _in::_nativeEffect(new self::Struct2::#fromTypedDataBase([@vm.inferred-type.metadata=dart.typed_data::_Uint8List] typ::Uint8List::•(#C17))); |
| } => block { |
| [@vm.inferred-type.metadata=dart.ffi::Pointer] synthesized ffi::Pointer<ffi::NativeFunction<() → self::Struct2>> #ffiTarget1 = pointer; |
| |
| [@vm.closure-id=1] |
| @#C23 |
| function #ffiClosure1() → self::Struct2 { |
| return [@vm.inferred-type.metadata=#lib::Struct2] ffi::_ffiCall<self::Struct2>(#ffiTarget1); |
| } |
| } =>#ffiClosure1; |
| final self::Struct2 struct2 = [@vm.direct-call.metadata=closure 1 in #lib::testAsFunctionReturn] [@vm.inferred-type.metadata=#lib::Struct2 (receiver not int)] function2(){() → self::Struct2}; |
| core::print(struct2); |
| } |
| |
| [@vm.unboxing-info.metadata=(b)->i] |
| static method useStruct3(self::Struct3 struct3) → core::int { |
| return 42; |
| } |
| static method testFromFunctionArgument() → void { |
| final ffi::Pointer<ffi::NativeFunction<(self::Struct3) → ffi::Int32>> pointer = block { |
| _in::_nativeEffect(new self::Struct3::#fromTypedDataBase([@vm.inferred-type.metadata=dart.typed_data::_Uint8List] typ::Uint8List::•(#C17))); |
| } =>[@vm.inferred-type.metadata=dart.ffi::Pointer] self::_#ffiCallback0; |
| core::print(pointer); |
| } |
| static method testLookupFunctionArgument() → void { |
| final ffi::DynamicLibrary dylib = [@vm.inferred-type.metadata=dart.ffi::DynamicLibrary] ffi::DynamicLibrary::executable(); |
| final (self::Struct5) → void function5 = block { |
| [@vm.inferred-type.metadata=dart.ffi::Pointer] synthesized ffi::Pointer<ffi::NativeFunction<(self::Struct5) → ffi::Void>> #ffiTarget2 = [@vm.direct-call.metadata=dart.ffi::DynamicLibrary.lookup] [@vm.inferred-type.metadata=dart.ffi::Pointer (skip check)] dylib.{ffi::DynamicLibrary::lookup}<ffi::NativeFunction<(self::Struct5) → ffi::Void>>("function5"){(core::String) → ffi::Pointer<ffi::NativeFunction<(self::Struct5) → ffi::Void>>}; |
| @#C25 |
| function #ffiClosure2(self::Struct5 arg1) → void { |
| throw "Attempt to execute code removed by Dart AOT compiler (TFA)"; |
| return ffi::_ffiCall<void>(#ffiTarget2); |
| } |
| } =>#ffiClosure2; |
| core::print(function5); |
| } |
| static method testAsFunctionArgument() → void { |
| final ffi::Pointer<ffi::NativeFunction<(self::Struct6) → ffi::Void>> pointer = [@vm.inferred-type.metadata=dart.ffi::Pointer] ffi::Pointer::fromAddress<ffi::NativeFunction<(self::Struct6) → ffi::Void>>(3735928559); |
| final (self::Struct6) → void function6 = block { |
| [@vm.inferred-type.metadata=dart.ffi::Pointer] synthesized ffi::Pointer<ffi::NativeFunction<(self::Struct6) → ffi::Void>> #ffiTarget3 = pointer; |
| @#C27 |
| function #ffiClosure3(self::Struct6 arg1) → void { |
| throw "Attempt to execute code removed by Dart AOT compiler (TFA)"; |
| return ffi::_ffiCall<void>(#ffiTarget3); |
| } |
| } =>#ffiClosure3; |
| core::print(function6); |
| } |
| static method returnStruct7() → self::Struct7 { |
| throw "I don't want to create a Struct7!"; |
| } |
| static method testFromFunctionReturn() → void { |
| final ffi::Pointer<ffi::NativeFunction<() → self::Struct7>> pointer = [@vm.inferred-type.metadata=dart.ffi::Pointer] self::_#ffiCallback1; |
| core::print(pointer); |
| } |
| static method testPointerLoad() → void { |
| final ffi::Pointer<self::Struct11> pointer = [@vm.inferred-type.metadata=dart.ffi::Pointer] ffi::Pointer::fromAddress<self::Struct11>(3735928559); |
| final self::Struct11 struct11 = new self::Struct11::#fromTypedDataBase(_in::unsafeCast<ffi::Pointer<self::Struct11>>(pointer)); |
| core::print(struct11); |
| } |
| static method testNestedLoad() → void { |
| final ffi::Pointer<self::Struct11> pointer = [@vm.inferred-type.metadata=dart.ffi::Pointer] ffi::Pointer::fromAddress<self::Struct11>(3735928559); |
| final self::Struct11 struct11 = new self::Struct11::#fromTypedDataBase(_in::unsafeCast<ffi::Pointer<self::Struct11>>(pointer)); |
| final self::Struct12 struct12 = [@vm.direct-call.metadata=#lib::Struct11.nested] [@vm.inferred-type.metadata=#lib::Struct12] struct11.{self::Struct11::nested}{self::Struct12}; |
| core::print(struct12); |
| } |
| constants { |
| #C1 = "vm:ffi:struct-fields" |
| #C2 = TypeLiteralConstant(ffi::Pointer<core::Object>) |
| #C3 = <core::Type>[#C2] |
| #C4 = null |
| #C5 = ffi::_FfiStructLayout {fieldTypes:#C3, packing:#C4} |
| #C6 = core::pragma {name:#C1, options:#C5} |
| #C7 = 0 |
| #C8 = TypeLiteralConstant(self::Struct12) |
| #C9 = <core::Type>[#C8] |
| #C10 = ffi::_FfiStructLayout {fieldTypes:#C9, packing:#C4} |
| #C11 = core::pragma {name:#C1, options:#C10} |
| #C12 = "vm:prefer-inline" |
| #C13 = core::pragma {name:#C12, options:#C4} |
| #C14 = <core::int>[#C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7, #C7] |
| #C15 = static-tearoff self::useStruct3 |
| #C16 = static-tearoff self::returnStruct7 |
| #C17 = 1 |
| #C18 = "vm:ffi:call-closure" |
| #C19 = false |
| #C20 = ffi::_FfiCall<() → self::Struct1> {isLeaf:#C19} |
| #C21 = core::pragma {name:#C18, options:#C20} |
| #C22 = ffi::_FfiCall<() → self::Struct2> {isLeaf:#C19} |
| #C23 = core::pragma {name:#C18, options:#C22} |
| #C24 = ffi::_FfiCall<(self::Struct5) → ffi::Void> {isLeaf:#C19} |
| #C25 = core::pragma {name:#C18, options:#C24} |
| #C26 = ffi::_FfiCall<(self::Struct6) → ffi::Void> {isLeaf:#C19} |
| #C27 = core::pragma {name:#C18, options:#C26} |
| } |