mono_mlist_alloc (struct MonoObject * data)
{
  struct MonoVTable * monolist_item_vtable.0;
  struct MonoImage * D.13311;
  struct MonoDomain * D.13312;
  struct MonoVTable * monolist_item_vtable.1;
  _Bool D.13314;
  long int D.13315;
  long int D.13316;
  struct MonoObject * * D.13319;
  struct MonoMList * D.13320;
  struct MonoMList * res;

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

    D.13311 = mono_defaults.corlib;
    klass = mono_class_from_name (D.13311, "System", "MonoListItem");
    D.13312 = mono_get_root_domain ();
    monolist_item_vtable.1 = mono_class_vtable (D.13312, klass);
    monolist_item_vtable = monolist_item_vtable.1;
    monolist_item_vtable.0 = monolist_item_vtable;
    D.13314 = monolist_item_vtable.0 == 0B;
    D.13315 = (long int) D.13314;
    D.13316 = __builtin_expect (D.13315, 0);
    if (D.13316 != 0) goto <D.13317>; else goto <D.13318>;
    <D.13317>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mono-mlist.c", 44, "monolist_item_vtable");
    <D.13318>:
  }
  <D.13310>:
  monolist_item_vtable.0 = monolist_item_vtable;
  res = mono_object_new_fast (monolist_item_vtable.0);
  D.13319 = &res->data;
  mono_gc_wbarrier_set_field (res, D.13319, data);
  D.13320 = res;
  return D.13320;
}


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

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


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

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


mono_mlist_set_next (struct MonoMList * list, struct MonoMList * next)
{
  struct MonoMList * D.13327;
  struct MonoMList * * D.13328;

  if (list == 0B) goto <D.13325>; else goto <D.13326>;
  <D.13325>:
  D.13327 = next;
  return D.13327;
  <D.13326>:
  D.13328 = &list->next;
  mono_gc_wbarrier_set_field (list, D.13328, next);
  D.13327 = list;
  return D.13327;
}


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

  len = 0;
  goto <D.13272>;
  <D.13271>:
  list = list->next;
  len = len + 1;
  <D.13272>:
  if (list != 0B) goto <D.13271>; else goto <D.13273>;
  <D.13273>:
  D.13330 = len;
  return D.13330;
}


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

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


mono_mlist_last (struct MonoMList * list)
{
  struct MonoMList * D.13336;
  struct MonoMList * D.13337;

  if (list != 0B) goto <D.13334>; else goto <D.13335>;
  <D.13334>:
  goto <D.13281>;
  <D.13280>:
  list = list->next;
  <D.13281>:
  D.13336 = list->next;
  if (D.13336 != 0B) goto <D.13280>; else goto <D.13282>;
  <D.13282>:
  D.13337 = list;
  return D.13337;
  <D.13335>:
  D.13337 = 0B;
  return D.13337;
}


mono_mlist_prepend (struct MonoMList * list, struct MonoObject * data)
{
  struct MonoMList * * D.13341;
  struct MonoMList * D.13342;
  struct MonoMList * res;

  res = mono_mlist_alloc (data);
  if (list != 0B) goto <D.13339>; else goto <D.13340>;
  <D.13339>:
  D.13341 = &res->next;
  mono_gc_wbarrier_set_field (res, D.13341, list);
  <D.13340>:
  D.13342 = res;
  return D.13342;
}


mono_mlist_append (struct MonoMList * list, struct MonoObject * data)
{
  struct MonoMList * * D.13346;
  struct MonoMList * D.13347;
  struct MonoMList * res;

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

    last = mono_mlist_last (list);
    D.13346 = &last->next;
    mono_gc_wbarrier_set_field (last, D.13346, res);
    D.13347 = list;
    return D.13347;
  }
  <D.13345>:
  D.13347 = res;
  return D.13347;
}


mono_mlist_remove_item (struct MonoMList * list, struct MonoMList * item)
{
  struct MonoMList * D.13351;
  struct MonoMList * * D.13354;
  struct MonoMList * D.13355;
  struct MonoMList * prev;

  if (list == item) goto <D.13349>; else goto <D.13350>;
  <D.13349>:
  list = item->next;
  item->next = 0B;
  D.13351 = list;
  return D.13351;
  <D.13350>:
  prev = find_prev (list, item);
  if (prev != 0B) goto <D.13352>; else goto <D.13353>;
  <D.13352>:
  D.13354 = &prev->next;
  D.13355 = item->next;
  mono_gc_wbarrier_set_field (prev, D.13354, D.13355);
  item->next = 0B;
  D.13351 = list;
  return D.13351;
  <D.13353>:
  D.13351 = list;
  return D.13351;
}


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

  prev = 0B;
  goto <D.13301>;
  <D.13300>:
  if (list == item) goto <D.13299>; else goto <D.13357>;
  <D.13357>:
  prev = list;
  list = list->next;
  <D.13301>:
  if (list != 0B) goto <D.13300>; else goto <D.13299>;
  <D.13299>:
  D.13358 = prev;
  return D.13358;
}


