mono_internal_hash_table_init (struct MonoInternalHashTable * table, guint (*GHashFunc) (const void *) hash_func, void * (*MonoInternalHashKeyExtractFunc) (void *) key_extract, void * * (*MonoInternalHashNextValueFunc) (void *) next_value)
{
  int D.4666;
  unsigned int D.4667;
  unsigned int D.4668;
  void * D.4669;

  table->hash_func = hash_func;
  table->key_extract = key_extract;
  table->next_value = next_value;
  table->size = 11;
  table->num_entries = 0;
  D.4666 = table->size;
  D.4667 = (unsigned int) D.4666;
  D.4668 = D.4667 * 4;
  D.4669 = monoeg_malloc0 (D.4668);
  table->table = D.4669;
}


mono_internal_hash_table_destroy (struct MonoInternalHashTable * table)
{
  void * * D.4670;

  D.4670 = table->table;
  monoeg_g_free (D.4670);
  table->table = 0B;
}


mono_internal_hash_table_lookup (struct MonoInternalHashTable * table, void * key)
{
  void * * D.4671;
  _Bool D.4672;
  long int D.4673;
  long int D.4674;
  guint (*<Tbdc>) (const void *) D.4677;
  unsigned int D.4678;
  int D.4679;
  unsigned int D.4680;
  unsigned int D.4681;
  unsigned int D.4682;
  void * * D.4683;
  void * (*<Tde4>) (void *) D.4684;
  void * D.4685;
  void * D.4688;
  void * * (*<Tde9>) (void *) D.4689;
  void * * D.4690;
  void * value;

  D.4671 = table->table;
  D.4672 = D.4671 == 0B;
  D.4673 = (long int) D.4672;
  D.4674 = __builtin_expect (D.4673, 0);
  if (D.4674 != 0) goto <D.4675>; else goto <D.4676>;
  <D.4675>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mono-internal-hash.c", 46, "table->table != NULL");
  <D.4676>:
  D.4671 = table->table;
  D.4677 = table->hash_func;
  D.4678 = D.4677 (key);
  D.4679 = table->size;
  D.4680 = (unsigned int) D.4679;
  D.4681 = D.4678 % D.4680;
  D.4682 = D.4681 * 4;
  D.4683 = D.4671 + D.4682;
  value = *D.4683;
  goto <D.4634>;
  <D.4633>:
  D.4684 = table->key_extract;
  D.4685 = D.4684 (value);
  if (D.4685 == key) goto <D.4686>; else goto <D.4687>;
  <D.4686>:
  D.4688 = value;
  return D.4688;
  <D.4687>:
  D.4689 = table->next_value;
  D.4690 = D.4689 (value);
  value = *D.4690;
  <D.4634>:
  if (value != 0B) goto <D.4633>; else goto <D.4635>;
  <D.4635>:
  D.4688 = 0B;
  return D.4688;
}


mono_internal_hash_table_insert (struct MonoInternalHashTable * table, void * key, void * value)
{
  guint (*<Tbdc>) (const void *) D.4692;
  unsigned int D.4693;
  int D.4694;
  unsigned int D.4695;
  unsigned int D.4696;
  void * (*<Tde4>) (void *) D.4697;
  void * D.4698;
  _Bool D.4699;
  long int D.4700;
  long int D.4701;
  void * * (*<Tde9>) (void *) D.4704;
  void * * D.4705;
  void * D.4706;
  _Bool D.4707;
  long int D.4708;
  long int D.4709;
  void * D.4712;
  _Bool D.4713;
  long int D.4714;
  long int D.4715;
  void * * D.4718;
  void * * D.4719;
  unsigned int hash.0;
  unsigned int D.4721;
  void * * D.4722;
  void * D.4723;
  int D.4724;
  int D.4725;
  gint hash;

  D.4692 = table->hash_func;
  D.4693 = D.4692 (key);
  D.4694 = table->size;
  D.4695 = (unsigned int) D.4694;
  D.4696 = D.4693 % D.4695;
  hash = (gint) D.4696;
  D.4697 = table->key_extract;
  D.4698 = D.4697 (value);
  D.4699 = D.4698 != key;
  D.4700 = (long int) D.4699;
  D.4701 = __builtin_expect (D.4700, 0);
  if (D.4701 != 0) goto <D.4702>; else goto <D.4703>;
  <D.4702>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mono-internal-hash.c", 96, "table->key_extract(value) == key");
  <D.4703>:
  D.4704 = table->next_value;
  D.4705 = D.4704 (value);
  D.4706 = *D.4705;
  D.4707 = D.4706 != 0B;
  D.4708 = (long int) D.4707;
  D.4709 = __builtin_expect (D.4708, 0);
  if (D.4709 != 0) goto <D.4710>; else goto <D.4711>;
  <D.4710>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mono-internal-hash.c", 97, "*(table->next_value (value)) == NULL");
  <D.4711>:
  D.4712 = mono_internal_hash_table_lookup (table, key);
  D.4713 = D.4712 != 0B;
  D.4714 = (long int) D.4713;
  D.4715 = __builtin_expect (D.4714, 0);
  if (D.4715 != 0) goto <D.4716>; else goto <D.4717>;
  <D.4716>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mono-internal-hash.c", 98, "mono_internal_hash_table_lookup (table, key) == NULL");
  <D.4717>:
  D.4704 = table->next_value;
  D.4718 = D.4704 (value);
  D.4719 = table->table;
  hash.0 = (unsigned int) hash;
  D.4721 = hash.0 * 4;
  D.4722 = D.4719 + D.4721;
  D.4723 = *D.4722;
  *D.4718 = D.4723;
  D.4719 = table->table;
  hash.0 = (unsigned int) hash;
  D.4721 = hash.0 * 4;
  D.4722 = D.4719 + D.4721;
  *D.4722 = value;
  D.4724 = table->num_entries;
  D.4725 = D.4724 + 1;
  table->num_entries = D.4725;
  resize_if_needed (table);
}


resize_if_needed (struct MonoInternalHashTable * table)
{
  int D.4726;
  int D.4727;
  int D.4728;
  unsigned int D.4731;
  unsigned int D.4732;
  unsigned int new_size.1;
  unsigned int D.4734;
  void * * D.4735;
  unsigned int i.2;
  unsigned int D.4737;
  void * * D.4738;
  void * * (*<Tde9>) (void *) D.4739;
  void * * D.4740;
  void * D.4741;
  guint (*<Tbdc>) (const void *) D.4742;
  void * (*<Tde4>) (void *) D.4743;
  void * D.4744;
  unsigned int D.4745;
  unsigned int new_size.3;
  unsigned int D.4747;
  void * * D.4748;
  unsigned int hash.4;
  unsigned int D.4750;
  void * * D.4751;
  void * D.4752;
  void * D.4753;
  void * * new_table;
  gint new_size;
  gint i;

  D.4726 = table->num_entries;
  D.4727 = table->size;
  D.4728 = D.4727 * 3;
  if (D.4726 < D.4728) goto <D.4729>; else goto <D.4730>;
  <D.4729>:
  return;
  <D.4730>:
  D.4726 = table->num_entries;
  D.4731 = (unsigned int) D.4726;
  D.4732 = monoeg_g_spaced_primes_closest (D.4731);
  new_size = (gint) D.4732;
  new_size.1 = (unsigned int) new_size;
  D.4734 = new_size.1 * 4;
  new_table = monoeg_malloc0 (D.4734);
  i = 0;
  goto <D.4648>;
  <D.4647>:
  goto <D.4645>;
  <D.4644>:
  {
    void * value;
    gint hash;

    D.4735 = table->table;
    i.2 = (unsigned int) i;
    D.4737 = i.2 * 4;
    D.4738 = D.4735 + D.4737;
    value = *D.4738;
    D.4735 = table->table;
    i.2 = (unsigned int) i;
    D.4737 = i.2 * 4;
    D.4738 = D.4735 + D.4737;
    D.4739 = table->next_value;
    D.4740 = D.4739 (value);
    D.4741 = *D.4740;
    *D.4738 = D.4741;
    D.4742 = table->hash_func;
    D.4743 = table->key_extract;
    D.4744 = D.4743 (value);
    D.4745 = D.4742 (D.4744);
    new_size.3 = (unsigned int) new_size;
    D.4747 = D.4745 % new_size.3;
    hash = (gint) D.4747;
    D.4739 = table->next_value;
    D.4748 = D.4739 (value);
    hash.4 = (unsigned int) hash;
    D.4750 = hash.4 * 4;
    D.4751 = new_table + D.4750;
    D.4752 = *D.4751;
    *D.4748 = D.4752;
    hash.4 = (unsigned int) hash;
    D.4750 = hash.4 * 4;
    D.4751 = new_table + D.4750;
    *D.4751 = value;
  }
  <D.4645>:
  D.4735 = table->table;
  i.2 = (unsigned int) i;
  D.4737 = i.2 * 4;
  D.4738 = D.4735 + D.4737;
  D.4753 = *D.4738;
  if (D.4753 != 0B) goto <D.4644>; else goto <D.4646>;
  <D.4646>:
  i = i + 1;
  <D.4648>:
  D.4727 = table->size;
  if (D.4727 > i) goto <D.4647>; else goto <D.4649>;
  <D.4649>:
  D.4735 = table->table;
  monoeg_g_free (D.4735);
  table->size = new_size;
  table->table = new_table;
}


mono_internal_hash_table_remove (struct MonoInternalHashTable * table, void * key)
{
  guint (*<Tbdc>) (const void *) D.4755;
  unsigned int D.4756;
  int D.4757;
  unsigned int D.4758;
  unsigned int D.4759;
  void * * D.4760;
  unsigned int hash.5;
  unsigned int D.4762;
  void * (*<Tde4>) (void *) D.4763;
  void * D.4764;
  void * D.4765;
  void * * (*<Tde9>) (void *) D.4768;
  void * * D.4769;
  void * D.4770;
  int D.4771;
  int D.4772;
  gint hash;
  void * * value;

  D.4755 = table->hash_func;
  D.4756 = D.4755 (key);
  D.4757 = table->size;
  D.4758 = (unsigned int) D.4757;
  D.4759 = D.4756 % D.4758;
  hash = (gint) D.4759;
  D.4760 = table->table;
  hash.5 = (unsigned int) hash;
  D.4762 = hash.5 * 4;
  value = D.4760 + D.4762;
  goto <D.4663>;
  <D.4662>:
  D.4763 = table->key_extract;
  D.4764 = *value;
  D.4765 = D.4763 (D.4764);
  if (D.4765 == key) goto <D.4766>; else goto <D.4767>;
  <D.4766>:
  D.4768 = table->next_value;
  D.4764 = *value;
  D.4769 = D.4768 (D.4764);
  D.4770 = *D.4769;
  *value = D.4770;
  D.4771 = table->num_entries;
  D.4772 = D.4771 + -1;
  table->num_entries = D.4772;
  return;
  <D.4767>:
  D.4768 = table->next_value;
  D.4764 = *value;
  value = D.4768 (D.4764);
  <D.4663>:
  D.4764 = *value;
  if (D.4764 != 0B) goto <D.4662>; else goto <D.4664>;
  <D.4664>:
  if (1 != 0) goto <D.4773>; else goto <D.4774>;
  <D.4773>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mono-internal-hash.c", 125, "0");
  <D.4774>:
}


