mono_mlist_alloc (struct MonoObject * data)
{
  struct MonoVTable * monolist_item_vtable.0;
  struct MonoImage * D.15056;
  struct MonoDomain * D.15057;
  struct MonoVTable * monolist_item_vtable.1;
  _Bool D.15059;
  long int D.15060;
  long int D.15061;
  struct MonoObject * * D.15064;
  struct MonoMList * D.15065;
  struct MonoMList * res;

  monolist_item_vtable.0 = monolist_item_vtable;
  if (monolist_item_vtable.0 == 0B) goto <D.15054>; else goto <D.15055>;
  <D.15054>:
  {
    struct MonoClass * klass;

    D.15056 = mono_defaults.corlib;
    klass = mono_class_from_name (D.15056, "System", "MonoListItem");
    D.15057 = mono_get_root_domain ();
    monolist_item_vtable.1 = mono_class_vtable (D.15057, klass);
    monolist_item_vtable = monolist_item_vtable.1;
    monolist_item_vtable.0 = monolist_item_vtable;
    D.15059 = monolist_item_vtable.0 == 0B;
    D.15060 = (long int) D.15059;
    D.15061 = __builtin_expect (D.15060, 0);
    if (D.15061 != 0) goto <D.15062>; else goto <D.15063>;
    <D.15062>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mono-mlist.c", 44, "monolist_item_vtable");
    <D.15063>:
  }
  <D.15055>:
  monolist_item_vtable.0 = monolist_item_vtable;
  res = mono_object_new_fast (monolist_item_vtable.0);
  D.15064 = &res->data;
  mono_gc_wbarrier_set_field (res, D.15064, data);
  D.15065 = res;
  return D.15065;
}


mono_mlist_get_data (struct MonoMList * list)
{
  struct MonoObject * D.15067;

  D.15067 = list->data;
  return D.15067;
}


mono_mlist_set_data (struct MonoMList * list, struct MonoObject * data)
{
  struct MonoObject * * D.15069;

  D.15069 = &list->data;
  mono_gc_wbarrier_set_field (list, D.15069, data);
}


mono_mlist_set_next (struct MonoMList * list, struct MonoMList * next)
{
  struct MonoMList * D.15072;
  struct MonoMList * * D.15073;

  if (list == 0B) goto <D.15070>; else goto <D.15071>;
  <D.15070>:
  D.15072 = next;
  return D.15072;
  <D.15071>:
  D.15073 = &list->next;
  mono_gc_wbarrier_set_field (list, D.15073, next);
  D.15072 = list;
  return D.15072;
}


mono_mlist_length (struct MonoMList * list)
{
  int D.15075;
  int len;

  len = 0;
  goto <D.15015>;
  <D.15014>:
  list = list->next;
  len = len + 1;
  <D.15015>:
  if (list != 0B) goto <D.15014>; else goto <D.15016>;
  <D.15016>:
  D.15075 = len;
  return D.15075;
}


mono_mlist_next (struct MonoMList * list)
{
  struct MonoMList * D.15077;

  D.15077 = list->next;
  return D.15077;
}


mono_mlist_last (struct MonoMList * list)
{
  struct MonoMList * D.15081;
  struct MonoMList * D.15082;

  if (list != 0B) goto <D.15079>; else goto <D.15080>;
  <D.15079>:
  goto <D.15024>;
  <D.15023>:
  list = list->next;
  <D.15024>:
  D.15081 = list->next;
  if (D.15081 != 0B) goto <D.15023>; else goto <D.15025>;
  <D.15025>:
  D.15082 = list;
  return D.15082;
  <D.15080>:
  D.15082 = 0B;
  return D.15082;
}


mono_mlist_prepend (struct MonoMList * list, struct MonoObject * data)
{
  struct MonoMList * * D.15086;
  struct MonoMList * D.15087;
  struct MonoMList * res;

  res = mono_mlist_alloc (data);
  if (list != 0B) goto <D.15084>; else goto <D.15085>;
  <D.15084>:
  D.15086 = &res->next;
  mono_gc_wbarrier_set_field (res, D.15086, list);
  <D.15085>:
  D.15087 = res;
  return D.15087;
}


mono_mlist_append (struct MonoMList * list, struct MonoObject * data)
{
  struct MonoMList * * D.15091;
  struct MonoMList * D.15092;
  struct MonoMList * res;

  res = mono_mlist_alloc (data);
  if (list != 0B) goto <D.15089>; else goto <D.15090>;
  <D.15089>:
  {
    struct MonoMList * last;

    last = mono_mlist_last (list);
    D.15091 = &last->next;
    mono_gc_wbarrier_set_field (last, D.15091, res);
    D.15092 = list;
    return D.15092;
  }
  <D.15090>:
  D.15092 = res;
  return D.15092;
}


mono_mlist_remove_item (struct MonoMList * list, struct MonoMList * item)
{
  struct MonoMList * D.15096;
  struct MonoMList * * D.15099;
  struct MonoMList * D.15100;
  struct MonoMList * prev;

  if (list == item) goto <D.15094>; else goto <D.15095>;
  <D.15094>:
  list = item->next;
  item->next = 0B;
  D.15096 = list;
  return D.15096;
  <D.15095>:
  prev = find_prev (list, item);
  if (prev != 0B) goto <D.15097>; else goto <D.15098>;
  <D.15097>:
  D.15099 = &prev->next;
  D.15100 = item->next;
  mono_gc_wbarrier_set_field (prev, D.15099, D.15100);
  item->next = 0B;
  D.15096 = list;
  return D.15096;
  <D.15098>:
  D.15096 = list;
  return D.15096;
}


find_prev (struct MonoMList * list, struct MonoMList * item)
{
  struct MonoMList * D.15103;
  struct MonoMList * prev;

  prev = 0B;
  goto <D.15044>;
  <D.15043>:
  if (list == item) goto <D.15042>; else goto <D.15102>;
  <D.15102>:
  prev = list;
  list = list->next;
  <D.15044>:
  if (list != 0B) goto <D.15043>; else goto <D.15042>;
  <D.15042>:
  D.15103 = prev;
  return D.15103;
}


