mono_mlist_alloc (struct MonoObject * data)
{
  struct MonoVTable * monolist_item_vtable.0;
  struct MonoImage * D.12797;
  struct MonoDomain * D.12798;
  struct MonoVTable * monolist_item_vtable.1;
  _Bool D.12800;
  long int D.12801;
  long int D.12802;
  struct MonoObject * * D.12805;
  struct MonoMList * D.12806;
  struct MonoMList * res;

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

    D.12797 = mono_defaults.corlib;
    klass = mono_class_from_name (D.12797, "System", "MonoListItem");
    D.12798 = mono_get_root_domain ();
    monolist_item_vtable.1 = mono_class_vtable (D.12798, klass);
    monolist_item_vtable = monolist_item_vtable.1;
    monolist_item_vtable.0 = monolist_item_vtable;
    D.12800 = monolist_item_vtable.0 == 0B;
    D.12801 = (long int) D.12800;
    D.12802 = __builtin_expect (D.12801, 0);
    if (D.12802 != 0) goto <D.12803>; else goto <D.12804>;
    <D.12803>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mono-mlist.c", 44, "monolist_item_vtable");
    <D.12804>:
  }
  <D.12796>:
  monolist_item_vtable.0 = monolist_item_vtable;
  res = mono_object_new_fast (monolist_item_vtable.0);
  D.12805 = &res->data;
  mono_gc_wbarrier_set_field (res, D.12805, data);
  D.12806 = res;
  return D.12806;
}


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

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


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

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


mono_mlist_set_next (struct MonoMList * list, struct MonoMList * next)
{
  struct MonoMList * D.12813;
  struct MonoMList * * D.12814;

  if (list == 0B) goto <D.12811>; else goto <D.12812>;
  <D.12811>:
  D.12813 = next;
  return D.12813;
  <D.12812>:
  D.12814 = &list->next;
  mono_gc_wbarrier_set_field (list, D.12814, next);
  D.12813 = list;
  return D.12813;
}


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

  len = 0;
  goto <D.12758>;
  <D.12757>:
  list = list->next;
  len = len + 1;
  <D.12758>:
  if (list != 0B) goto <D.12757>; else goto <D.12759>;
  <D.12759>:
  D.12816 = len;
  return D.12816;
}


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

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


mono_mlist_last (struct MonoMList * list)
{
  struct MonoMList * D.12822;
  struct MonoMList * D.12823;

  if (list != 0B) goto <D.12820>; else goto <D.12821>;
  <D.12820>:
  goto <D.12767>;
  <D.12766>:
  list = list->next;
  <D.12767>:
  D.12822 = list->next;
  if (D.12822 != 0B) goto <D.12766>; else goto <D.12768>;
  <D.12768>:
  D.12823 = list;
  return D.12823;
  <D.12821>:
  D.12823 = 0B;
  return D.12823;
}


mono_mlist_prepend (struct MonoMList * list, struct MonoObject * data)
{
  struct MonoMList * * D.12827;
  struct MonoMList * D.12828;
  struct MonoMList * res;

  res = mono_mlist_alloc (data);
  if (list != 0B) goto <D.12825>; else goto <D.12826>;
  <D.12825>:
  D.12827 = &res->next;
  mono_gc_wbarrier_set_field (res, D.12827, list);
  <D.12826>:
  D.12828 = res;
  return D.12828;
}


mono_mlist_append (struct MonoMList * list, struct MonoObject * data)
{
  struct MonoMList * * D.12832;
  struct MonoMList * D.12833;
  struct MonoMList * res;

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

    last = mono_mlist_last (list);
    D.12832 = &last->next;
    mono_gc_wbarrier_set_field (last, D.12832, res);
    D.12833 = list;
    return D.12833;
  }
  <D.12831>:
  D.12833 = res;
  return D.12833;
}


mono_mlist_remove_item (struct MonoMList * list, struct MonoMList * item)
{
  struct MonoMList * D.12837;
  struct MonoMList * D.12840;
  struct MonoMList * * D.12841;
  struct MonoMList * prev;

  if (list == item) goto <D.12835>; else goto <D.12836>;
  <D.12835>:
  list = item->next;
  item->next = 0B;
  D.12837 = list;
  return D.12837;
  <D.12836>:
  prev = find_prev (list, item);
  if (prev != 0B) goto <D.12838>; else goto <D.12839>;
  <D.12838>:
  D.12840 = item->next;
  D.12841 = &prev->next;
  mono_gc_wbarrier_set_field (prev, D.12841, D.12840);
  item->next = 0B;
  D.12837 = list;
  return D.12837;
  <D.12839>:
  D.12837 = list;
  return D.12837;
}


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

  prev = 0B;
  goto <D.12787>;
  <D.12786>:
  if (list == item) goto <D.12785>; else goto <D.12843>;
  <D.12843>:
  prev = list;
  list = list->next;
  <D.12787>:
  if (list != 0B) goto <D.12786>; else goto <D.12785>;
  <D.12785>:
  D.12844 = prev;
  return D.12844;
}


