mono_mlist_alloc (struct MonoObject * data)
{
  struct MonoVTable * monolist_item_vtable.0;
  struct MonoImage * D.12475;
  struct MonoDomain * D.12476;
  struct MonoVTable * monolist_item_vtable.1;
  _Bool D.12478;
  long int D.12479;
  long int D.12480;
  struct MonoObject * * D.12483;
  struct MonoMList * D.12484;
  struct MonoMList * res;

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

    D.12475 = mono_defaults.corlib;
    klass = mono_class_from_name (D.12475, "System", "MonoListItem");
    D.12476 = mono_get_root_domain ();
    monolist_item_vtable.1 = mono_class_vtable (D.12476, klass);
    monolist_item_vtable = monolist_item_vtable.1;
    monolist_item_vtable.0 = monolist_item_vtable;
    D.12478 = monolist_item_vtable.0 == 0B;
    D.12479 = (long int) D.12478;
    D.12480 = __builtin_expect (D.12479, 0);
    if (D.12480 != 0) goto <D.12481>; else goto <D.12482>;
    <D.12481>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mono-mlist.c", 44, "monolist_item_vtable");
    <D.12482>:
  }
  <D.12474>:
  monolist_item_vtable.0 = monolist_item_vtable;
  res = mono_object_new_fast (monolist_item_vtable.0);
  D.12483 = &res->data;
  mono_gc_wbarrier_set_field (res, D.12483, data);
  D.12484 = res;
  return D.12484;
}


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

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


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

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


mono_mlist_set_next (struct MonoMList * list, struct MonoMList * next)
{
  struct MonoMList * D.12491;
  struct MonoMList * * D.12492;

  if (list == 0B) goto <D.12489>; else goto <D.12490>;
  <D.12489>:
  D.12491 = next;
  return D.12491;
  <D.12490>:
  D.12492 = &list->next;
  mono_gc_wbarrier_set_field (list, D.12492, next);
  D.12491 = list;
  return D.12491;
}


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

  len = 0;
  goto <D.12436>;
  <D.12435>:
  list = list->next;
  len = len + 1;
  <D.12436>:
  if (list != 0B) goto <D.12435>; else goto <D.12437>;
  <D.12437>:
  D.12494 = len;
  return D.12494;
}


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

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


mono_mlist_last (struct MonoMList * list)
{
  struct MonoMList * D.12500;
  struct MonoMList * D.12501;

  if (list != 0B) goto <D.12498>; else goto <D.12499>;
  <D.12498>:
  goto <D.12445>;
  <D.12444>:
  list = list->next;
  <D.12445>:
  D.12500 = list->next;
  if (D.12500 != 0B) goto <D.12444>; else goto <D.12446>;
  <D.12446>:
  D.12501 = list;
  return D.12501;
  <D.12499>:
  D.12501 = 0B;
  return D.12501;
}


mono_mlist_prepend (struct MonoMList * list, struct MonoObject * data)
{
  struct MonoMList * * D.12505;
  struct MonoMList * D.12506;
  struct MonoMList * res;

  res = mono_mlist_alloc (data);
  if (list != 0B) goto <D.12503>; else goto <D.12504>;
  <D.12503>:
  D.12505 = &res->next;
  mono_gc_wbarrier_set_field (res, D.12505, list);
  <D.12504>:
  D.12506 = res;
  return D.12506;
}


mono_mlist_append (struct MonoMList * list, struct MonoObject * data)
{
  struct MonoMList * * D.12510;
  struct MonoMList * D.12511;
  struct MonoMList * res;

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

    last = mono_mlist_last (list);
    D.12510 = &last->next;
    mono_gc_wbarrier_set_field (last, D.12510, res);
    D.12511 = list;
    return D.12511;
  }
  <D.12509>:
  D.12511 = res;
  return D.12511;
}


mono_mlist_remove_item (struct MonoMList * list, struct MonoMList * item)
{
  struct MonoMList * D.12515;
  struct MonoMList * * D.12518;
  struct MonoMList * D.12519;
  struct MonoMList * prev;

  if (list == item) goto <D.12513>; else goto <D.12514>;
  <D.12513>:
  list = item->next;
  item->next = 0B;
  D.12515 = list;
  return D.12515;
  <D.12514>:
  prev = find_prev (list, item);
  if (prev != 0B) goto <D.12516>; else goto <D.12517>;
  <D.12516>:
  D.12518 = &prev->next;
  D.12519 = item->next;
  mono_gc_wbarrier_set_field (prev, D.12518, D.12519);
  item->next = 0B;
  D.12515 = list;
  return D.12515;
  <D.12517>:
  D.12515 = list;
  return D.12515;
}


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

  prev = 0B;
  goto <D.12465>;
  <D.12464>:
  if (list == item) goto <D.12463>; else goto <D.12521>;
  <D.12521>:
  prev = list;
  list = list->next;
  <D.12465>:
  if (list != 0B) goto <D.12464>; else goto <D.12463>;
  <D.12463>:
  D.12522 = prev;
  return D.12522;
}


