mono_mlist_alloc (struct MonoObject * data)
{
  struct MonoVTable * monolist_item_vtable.0;
  struct MonoImage * D.12447;
  struct MonoDomain * D.12448;
  struct MonoVTable * monolist_item_vtable.1;
  _Bool D.12450;
  long int D.12451;
  long int D.12452;
  struct MonoObject * * D.12455;
  struct MonoMList * D.12456;
  struct MonoMList * res;

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

    D.12447 = mono_defaults.corlib;
    klass = mono_class_from_name (D.12447, "System", "MonoListItem");
    D.12448 = mono_get_root_domain ();
    monolist_item_vtable.1 = mono_class_vtable (D.12448, klass);
    monolist_item_vtable = monolist_item_vtable.1;
    monolist_item_vtable.0 = monolist_item_vtable;
    D.12450 = monolist_item_vtable.0 == 0B;
    D.12451 = (long int) D.12450;
    D.12452 = __builtin_expect (D.12451, 0);
    if (D.12452 != 0) goto <D.12453>; else goto <D.12454>;
    <D.12453>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mono-mlist.c", 44, "monolist_item_vtable");
    <D.12454>:
  }
  <D.12446>:
  monolist_item_vtable.0 = monolist_item_vtable;
  res = mono_object_new_fast (monolist_item_vtable.0);
  D.12455 = &res->data;
  mono_gc_wbarrier_set_field (res, D.12455, data);
  D.12456 = res;
  return D.12456;
}


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

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


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

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


mono_mlist_set_next (struct MonoMList * list, struct MonoMList * next)
{
  struct MonoMList * D.12463;
  struct MonoMList * * D.12464;

  if (list == 0B) goto <D.12461>; else goto <D.12462>;
  <D.12461>:
  D.12463 = next;
  return D.12463;
  <D.12462>:
  D.12464 = &list->next;
  mono_gc_wbarrier_set_field (list, D.12464, next);
  D.12463 = list;
  return D.12463;
}


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

  len = 0;
  goto <D.12408>;
  <D.12407>:
  list = list->next;
  len = len + 1;
  <D.12408>:
  if (list != 0B) goto <D.12407>; else goto <D.12409>;
  <D.12409>:
  D.12466 = len;
  return D.12466;
}


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

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


mono_mlist_last (struct MonoMList * list)
{
  struct MonoMList * D.12472;
  struct MonoMList * D.12473;

  if (list != 0B) goto <D.12470>; else goto <D.12471>;
  <D.12470>:
  goto <D.12417>;
  <D.12416>:
  list = list->next;
  <D.12417>:
  D.12472 = list->next;
  if (D.12472 != 0B) goto <D.12416>; else goto <D.12418>;
  <D.12418>:
  D.12473 = list;
  return D.12473;
  <D.12471>:
  D.12473 = 0B;
  return D.12473;
}


mono_mlist_prepend (struct MonoMList * list, struct MonoObject * data)
{
  struct MonoMList * * D.12477;
  struct MonoMList * D.12478;
  struct MonoMList * res;

  res = mono_mlist_alloc (data);
  if (list != 0B) goto <D.12475>; else goto <D.12476>;
  <D.12475>:
  D.12477 = &res->next;
  mono_gc_wbarrier_set_field (res, D.12477, list);
  <D.12476>:
  D.12478 = res;
  return D.12478;
}


mono_mlist_append (struct MonoMList * list, struct MonoObject * data)
{
  struct MonoMList * * D.12482;
  struct MonoMList * D.12483;
  struct MonoMList * res;

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

    last = mono_mlist_last (list);
    D.12482 = &last->next;
    mono_gc_wbarrier_set_field (last, D.12482, res);
    D.12483 = list;
    return D.12483;
  }
  <D.12481>:
  D.12483 = res;
  return D.12483;
}


mono_mlist_remove_item (struct MonoMList * list, struct MonoMList * item)
{
  struct MonoMList * D.12487;
  struct MonoMList * D.12490;
  struct MonoMList * * D.12491;
  struct MonoMList * prev;

  if (list == item) goto <D.12485>; else goto <D.12486>;
  <D.12485>:
  list = item->next;
  item->next = 0B;
  D.12487 = list;
  return D.12487;
  <D.12486>:
  prev = find_prev (list, item);
  if (prev != 0B) goto <D.12488>; else goto <D.12489>;
  <D.12488>:
  D.12490 = item->next;
  D.12491 = &prev->next;
  mono_gc_wbarrier_set_field (prev, D.12491, D.12490);
  item->next = 0B;
  D.12487 = list;
  return D.12487;
  <D.12489>:
  D.12487 = list;
  return D.12487;
}


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

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


