main = b::main;
library from "org-dartlang-test:///a.dart" as a {

  import "dart:ffi";

  @#C7
  class StructA extends dart.ffi::Struct {
    synthetic constructor •() → a::StructA
      : super dart.ffi::Struct::•()
      ;
    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → a::StructA
      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
      ;
    get a1() → dart.ffi::Pointer<dart.ffi::Void>
      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
    set a1(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
    get a2() → dart.ffi::Pointer<dart.ffi::Void>
      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
    set a2(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
    get a3() → dart.ffi::Pointer<dart.ffi::Void>
      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
    set a3(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
    get blah() → a::NestedStruct
      return new a::NestedStruct::#fromTypedDataBase( block {
        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object};
        dart.core::int #offset = #C17.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<a::NestedStruct>(#typedDataBase.{dart.ffi::Pointer::address}{dart.core::int}.{dart.core::num::+}(#offset){(dart.core::num) → dart.core::num}) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}{dart.typed_data::ByteBuffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}{dart.core::int}.{dart.core::num::+}(#offset){(dart.core::num) → dart.core::num}, #C17.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}){([dart.core::int, dart.core::int?]) → dart.typed_data::Uint8List});
    set blah(a::NestedStruct #externalFieldValue) → void
      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C17.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C8, #C17.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*});
    @#C19
    static get #sizeOf() → dart.core::int*
      return #C21.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
  }
  @#C24
  class NestedStruct extends dart.ffi::Struct {
    synthetic constructor •() → a::NestedStruct
      : super dart.ffi::Struct::•()
      ;
    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → a::NestedStruct
      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
      ;
    get n1() → dart.ffi::Pointer<dart.ffi::Void>
      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
    set n1(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
    get n2() → dart.ffi::Pointer<dart.ffi::Void>
      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
    set n2(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C12.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
    get n3() → dart.ffi::Pointer<dart.ffi::Void>
      return dart.ffi::_fromAddress<dart.ffi::Void>(dart.ffi::_loadAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}));
    set n3(dart.ffi::Pointer<dart.ffi::Void> #externalFieldValue) → void
      return dart.ffi::_storeAbiSpecificInt<dart.ffi::IntPtr>(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C14.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::Pointer::address}{dart.core::int});
    @#C19
    static get #sizeOf() → dart.core::int*
      return #C17.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
  }
}
library from "org-dartlang-test:///b.dart" as b {

  import "dart:ffi";
  import "dart:isolate";
  import "dart:async";
  import "org-dartlang-test:///a.dart";

  @#C28
  class StructB extends dart.ffi::Struct {
    synthetic constructor •() → b::StructB
      : super dart.ffi::Struct::•()
      ;
    constructor #fromTypedDataBase(dart.core::Object #typedDataBase) → b::StructB
      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase)
      ;
    get b1() → a::StructA
      return new a::StructA::#fromTypedDataBase( block {
        dart.core::Object #typedDataBase = this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object};
        dart.core::int #offset = #C9.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
      } =>#typedDataBase is dart.ffi::Pointer<dynamic> ?{dart.core::Object} dart.ffi::_fromAddress<a::StructA>(#typedDataBase.{dart.ffi::Pointer::address}{dart.core::int}.{dart.core::num::+}(#offset){(dart.core::num) → dart.core::num}) : let dart.typed_data::TypedData #typedData = dart._internal::unsafeCast<dart.typed_data::TypedData>(#typedDataBase) in #typedData.{dart.typed_data::TypedData::buffer}{dart.typed_data::ByteBuffer}.{dart.typed_data::ByteBuffer::asUint8List}(#typedData.{dart.typed_data::TypedData::offsetInBytes}{dart.core::int}.{dart.core::num::+}(#offset){(dart.core::num) → dart.core::num}, #C21.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}){([dart.core::int, dart.core::int?]) → dart.typed_data::Uint8List});
    set b1(a::StructA #externalFieldValue) → void
      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C9.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*}, #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #C8, #C21.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*});
    @#C19
    static get #sizeOf() → dart.core::int*
      return #C21.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int*};
  }
  static method periodic() → void {
    dart.core::print(b::StructB::#sizeOf);
  }
  static method main() → void {
    dart.async::Timer::periodic(#C30, (dart.async::Timer _) → void => b::periodic());
  }
}
constants  {
  #C1 = "vm:ffi:struct-fields"
  #C2 = TypeLiteralConstant(dart.ffi::Pointer<dart.ffi::NativeType>)
  #C3 = TypeLiteralConstant(a::NestedStruct)
  #C4 = <dart.core::Type>[#C2, #C2, #C2, #C3]
  #C5 = null
  #C6 = dart.ffi::_FfiStructLayout {fieldTypes:#C4, packing:#C5}
  #C7 = dart.core::pragma {name:#C1, options:#C6}
  #C8 = 0
  #C9 = <dart.core::int*>[#C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8, #C8]
  #C10 = 4
  #C11 = 8
  #C12 = <dart.core::int*>[#C10, #C11, #C10, #C11, #C11, #C11, #C10, #C11, #C11, #C10, #C11, #C10, #C11, #C11, #C11, #C11, #C10, #C11]
  #C13 = 16
  #C14 = <dart.core::int*>[#C11, #C13, #C11, #C13, #C13, #C13, #C11, #C13, #C13, #C11, #C13, #C11, #C13, #C13, #C13, #C13, #C11, #C13]
  #C15 = 12
  #C16 = 24
  #C17 = <dart.core::int*>[#C15, #C16, #C15, #C16, #C16, #C16, #C15, #C16, #C16, #C15, #C16, #C15, #C16, #C16, #C16, #C16, #C15, #C16]
  #C18 = "vm:prefer-inline"
  #C19 = dart.core::pragma {name:#C18, options:#C5}
  #C20 = 48
  #C21 = <dart.core::int*>[#C16, #C20, #C16, #C20, #C20, #C20, #C16, #C20, #C20, #C16, #C20, #C16, #C20, #C20, #C20, #C20, #C16, #C20]
  #C22 = <dart.core::Type>[#C2, #C2, #C2]
  #C23 = dart.ffi::_FfiStructLayout {fieldTypes:#C22, packing:#C5}
  #C24 = dart.core::pragma {name:#C1, options:#C23}
  #C25 = TypeLiteralConstant(a::StructA)
  #C26 = <dart.core::Type>[#C25]
  #C27 = dart.ffi::_FfiStructLayout {fieldTypes:#C26, packing:#C5}
  #C28 = dart.core::pragma {name:#C1, options:#C27}
  #C29 = 1000000
  #C30 = dart.core::Duration {_duration:#C29}
}
