library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:ffi" as ffi;
import "dart:typed_data" as typ;
import "dart:_internal" as _in;

import "dart:ffi";
import "package:ffi/ffi.dart";

@#C8
class StructInlineArray extends ffi::Struct {
  synthetic constructor •() → self::StructInlineArray
    : super ffi::Struct::•()
    ;
  constructor #fromTypedDataBase(core::Object #typedDataBase) → self::StructInlineArray
    : super ffi::Struct::_fromTypedDataBase(#typedDataBase)
    ;
  @#C9
  get a0() → ffi::Array<ffi::Uint8>
    return new ffi::Array::_<ffi::Uint8>( block {
      core::Object #typedDataBase = this.{ffi::_Compound::_typedDataBase}{core::Object};
      core::int #offset = (#C11).{core::List::[]}(ffi::_abi()){(core::int) → core::int*};
    } =>#typedDataBase is ffi::Pointer<dynamic> ?{core::Object} ffi::_fromAddress<ffi::Uint8>(#typedDataBase.{ffi::Pointer::address}{core::int}.{core::num::+}(#offset){(core::num) → core::num}) : let typ::TypedData #typedData = _in::unsafeCast<typ::TypedData>(#typedDataBase) in #typedData.{typ::TypedData::buffer}{typ::ByteBuffer}.{typ::ByteBuffer::asUint8List}(#typedData.{typ::TypedData::offsetInBytes}{core::int}.{core::num::+}(#offset){(core::num) → core::num}, (#C12).{core::List::[]}(ffi::_abi()){(core::int) → core::int*}){([core::int, core::int?]) → typ::Uint8List}, #C3, #C13);
  @#C9
  set a0(ffi::Array<ffi::Uint8> #externalFieldValue) → void
    return ffi::_memCopy(this.{ffi::_Compound::_typedDataBase}{core::Object}, (#C11).{core::List::[]}(ffi::_abi()){(core::int) → core::int*}, #externalFieldValue.{ffi::Array::_typedDataBase}{core::Object}, #C10, (#C12).{core::List::[]}(ffi::_abi()){(core::int) → core::int*});
  @#C15
  static get #sizeOf() → core::int*
    return (#C12).{core::List::[]}(ffi::_abi()){(core::int) → core::int*};
}
static method main() → dynamic {}

constants  {
  #C1 = "vm:ffi:struct-fields"
  #C2 = TypeLiteralConstant(ffi::Uint8)
  #C3 = 8
  #C4 = ffi::_FfiInlineArray {elementType:#C2, length:#C3}
  #C5 = <core::Type>[#C4]
  #C6 = null
  #C7 = ffi::_FfiStructLayout {fieldTypes:#C5, packing:#C6}
  #C8 = core::pragma {name:#C1, options:#C7}
  #C9 = ffi::_ArraySize<ffi::NativeType*> {dimension1:#C3, dimension2:#C6, dimension3:#C6, dimension4:#C6, dimension5:#C6, dimensions:#C6}
  #C10 = 0
  #C11 = <core::int*>[#C10, #C10, #C10]
  #C12 = <core::int*>[#C3, #C3, #C3]
  #C13 = <core::int*>[]
  #C14 = "vm:prefer-inline"
  #C15 = core::pragma {name:#C14, options:#C6}
}


Constructor coverage from constants:
org-dartlang-testcase:///ffi_struct_inline_array.dart:
- _ArraySize. (from org-dartlang-sdk:///sdk/lib/ffi/ffi.dart:136:9)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
