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.4646;
  unsigned int D.4647;
  unsigned int D.4648;
  void * D.4649;

  table->hash_func = hash_func;
  table->key_extract = key_extract;
  table->next_value = next_value;
  table->size = 11;
  table->num_entries = 0;
  D.4646 = table->size;
  D.4647 = (unsigned int) D.4646;
  D.4648 = D.4647 * 4;
  D.4649 = monoeg_malloc0 (D.4648);
  table->table = D.4649;
}


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

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


mono_internal_hash_table_lookup (struct MonoInternalHashTable * table, void * key)
{
  void * * D.4651;
  _Bool D.4652;
  long int D.4653;
  long int D.4654;
  guint (*<Tbd3>) (const void *) D.4657;
  unsigned int D.4658;
  int D.4659;
  unsigned int D.4660;
  unsigned int D.4661;
  unsigned int D.4662;
  void * * D.4663;
  void * (*<Tddb>) (void *) D.4664;
  void * D.4665;
  void * D.4668;
  void * * (*<Tde0>) (void *) D.4669;
  void * * D.4670;
  void * value;

  D.4651 = table->table;
  D.4652 = D.4651 == 0B;
  D.4653 = (long int) D.4652;
  D.4654 = __builtin_expect (D.4653, 0);
  if (D.4654 != 0) goto <D.4655>; else goto <D.4656>;
  <D.4655>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mono-internal-hash.c", 46, "table->table != NULL");
  <D.4656>:
  D.4651 = table->table;
  D.4657 = table->hash_func;
  D.4658 = D.4657 (key);
  D.4659 = table->size;
  D.4660 = (unsigned int) D.4659;
  D.4661 = D.4658 % D.4660;
  D.4662 = D.4661 * 4;
  D.4663 = D.4651 + D.4662;
  value = *D.4663;
  goto <D.4614>;
  <D.4613>:
  D.4664 = table->key_extract;
  D.4665 = D.4664 (value);
  if (D.4665 == key) goto <D.4666>; else goto <D.4667>;
  <D.4666>:
  D.4668 = value;
  return D.4668;
  <D.4667>:
  D.4669 = table->next_value;
  D.4670 = D.4669 (value);
  value = *D.4670;
  <D.4614>:
  if (value != 0B) goto <D.4613>; else goto <D.4615>;
  <D.4615>:
  D.4668 = 0B;
  return D.4668;
}


mono_internal_hash_table_insert (struct MonoInternalHashTable * table, void * key, void * value)
{
  guint (*<Tbd3>) (const void *) D.4672;
  unsigned int D.4673;
  int D.4674;
  unsigned int D.4675;
  unsigned int D.4676;
  void * (*<Tddb>) (void *) D.4677;
  void * D.4678;
  _Bool D.4679;
  long int D.4680;
  long int D.4681;
  void * * (*<Tde0>) (void *) D.4684;
  void * * D.4685;
  void * D.4686;
  _Bool D.4687;
  long int D.4688;
  long int D.4689;
  void * D.4692;
  _Bool D.4693;
  long int D.4694;
  long int D.4695;
  void * * D.4698;
  void * * D.4699;
  unsigned int hash.0;
  unsigned int D.4701;
  void * * D.4702;
  void * D.4703;
  int D.4704;
  int D.4705;
  gint hash;

  D.4672 = table->hash_func;
  D.4673 = D.4672 (key);
  D.4674 = table->size;
  D.4675 = (unsigned int) D.4674;
  D.4676 = D.4673 % D.4675;
  hash = (gint) D.4676;
  D.4677 = table->key_extract;
  D.4678 = D.4677 (value);
  D.4679 = D.4678 != key;
  D.4680 = (long int) D.4679;
  D.4681 = __builtin_expect (D.4680, 0);
  if (D.4681 != 0) goto <D.4682>; else goto <D.4683>;
  <D.4682>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mono-internal-hash.c", 96, "table->key_extract(value) == key");
  <D.4683>:
  D.4684 = table->next_value;
  D.4685 = D.4684 (value);
  D.4686 = *D.4685;
  D.4687 = D.4686 != 0B;
  D.4688 = (long int) D.4687;
  D.4689 = __builtin_expect (D.4688, 0);
  if (D.4689 != 0) goto <D.4690>; else goto <D.4691>;
  <D.4690>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mono-internal-hash.c", 97, "*(table->next_value (value)) == NULL");
  <D.4691>:
  D.4692 = mono_internal_hash_table_lookup (table, key);
  D.4693 = D.4692 != 0B;
  D.4694 = (long int) D.4693;
  D.4695 = __builtin_expect (D.4694, 0);
  if (D.4695 != 0) goto <D.4696>; else goto <D.4697>;
  <D.4696>:
  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.4697>:
  D.4684 = table->next_value;
  D.4698 = D.4684 (value);
  D.4699 = table->table;
  hash.0 = (unsigned int) hash;
  D.4701 = hash.0 * 4;
  D.4702 = D.4699 + D.4701;
  D.4703 = *D.4702;
  *D.4698 = D.4703;
  D.4699 = table->table;
  hash.0 = (unsigned int) hash;
  D.4701 = hash.0 * 4;
  D.4702 = D.4699 + D.4701;
  *D.4702 = value;
  D.4704 = table->num_entries;
  D.4705 = D.4704 + 1;
  table->num_entries = D.4705;
  resize_if_needed (table);
}


resize_if_needed (struct MonoInternalHashTable * table)
{
  int D.4706;
  int D.4707;
  int D.4708;
  unsigned int D.4711;
  unsigned int D.4712;
  unsigned int new_size.1;
  unsigned int D.4714;
  void * * D.4715;
  unsigned int i.2;
  unsigned int D.4717;
  void * * D.4718;
  void * * (*<Tde0>) (void *) D.4719;
  void * * D.4720;
  void * D.4721;
  guint (*<Tbd3>) (const void *) D.4722;
  void * (*<Tddb>) (void *) D.4723;
  void * D.4724;
  unsigned int D.4725;
  unsigned int new_size.3;
  unsigned int D.4727;
  void * * D.4728;
  unsigned int hash.4;
  unsigned int D.4730;
  void * * D.4731;
  void * D.4732;
  void * D.4733;
  void * * new_table;
  gint new_size;
  gint i;

  D.4706 = table->num_entries;
  D.4707 = table->size;
  D.4708 = D.4707 * 3;
  if (D.4706 < D.4708) goto <D.4709>; else goto <D.4710>;
  <D.4709>:
  return;
  <D.4710>:
  D.4706 = table->num_entries;
  D.4711 = (unsigned int) D.4706;
  D.4712 = monoeg_g_spaced_primes_closest (D.4711);
  new_size = (gint) D.4712;
  new_size.1 = (unsigned int) new_size;
  D.4714 = new_size.1 * 4;
  new_table = monoeg_malloc0 (D.4714);
  i = 0;
  goto <D.4628>;
  <D.4627>:
  goto <D.4625>;
  <D.4624>:
  {
    void * value;
    gint hash;

    D.4715 = table->table;
    i.2 = (unsigned int) i;
    D.4717 = i.2 * 4;
    D.4718 = D.4715 + D.4717;
    value = *D.4718;
    D.4715 = table->table;
    i.2 = (unsigned int) i;
    D.4717 = i.2 * 4;
    D.4718 = D.4715 + D.4717;
    D.4719 = table->next_value;
    D.4720 = D.4719 (value);
    D.4721 = *D.4720;
    *D.4718 = D.4721;
    D.4722 = table->hash_func;
    D.4723 = table->key_extract;
    D.4724 = D.4723 (value);
    D.4725 = D.4722 (D.4724);
    new_size.3 = (unsigned int) new_size;
    D.4727 = D.4725 % new_size.3;
    hash = (gint) D.4727;
    D.4719 = table->next_value;
    D.4728 = D.4719 (value);
    hash.4 = (unsigned int) hash;
    D.4730 = hash.4 * 4;
    D.4731 = new_table + D.4730;
    D.4732 = *D.4731;
    *D.4728 = D.4732;
    hash.4 = (unsigned int) hash;
    D.4730 = hash.4 * 4;
    D.4731 = new_table + D.4730;
    *D.4731 = value;
  }
  <D.4625>:
  D.4715 = table->table;
  i.2 = (unsigned int) i;
  D.4717 = i.2 * 4;
  D.4718 = D.4715 + D.4717;
  D.4733 = *D.4718;
  if (D.4733 != 0B) goto <D.4624>; else goto <D.4626>;
  <D.4626>:
  i = i + 1;
  <D.4628>:
  D.4707 = table->size;
  if (D.4707 > i) goto <D.4627>; else goto <D.4629>;
  <D.4629>:
  D.4715 = table->table;
  monoeg_g_free (D.4715);
  table->size = new_size;
  table->table = new_table;
}


mono_internal_hash_table_remove (struct MonoInternalHashTable * table, void * key)
{
  guint (*<Tbd3>) (const void *) D.4735;
  unsigned int D.4736;
  int D.4737;
  unsigned int D.4738;
  unsigned int D.4739;
  void * * D.4740;
  unsigned int hash.5;
  unsigned int D.4742;
  void * (*<Tddb>) (void *) D.4743;
  void * D.4744;
  void * D.4745;
  void * * (*<Tde0>) (void *) D.4748;
  void * * D.4749;
  void * D.4750;
  int D.4751;
  int D.4752;
  gint hash;
  void * * value;

  D.4735 = table->hash_func;
  D.4736 = D.4735 (key);
  D.4737 = table->size;
  D.4738 = (unsigned int) D.4737;
  D.4739 = D.4736 % D.4738;
  hash = (gint) D.4739;
  D.4740 = table->table;
  hash.5 = (unsigned int) hash;
  D.4742 = hash.5 * 4;
  value = D.4740 + D.4742;
  goto <D.4643>;
  <D.4642>:
  D.4743 = table->key_extract;
  D.4744 = *value;
  D.4745 = D.4743 (D.4744);
  if (D.4745 == key) goto <D.4746>; else goto <D.4747>;
  <D.4746>:
  D.4748 = table->next_value;
  D.4744 = *value;
  D.4749 = D.4748 (D.4744);
  D.4750 = *D.4749;
  *value = D.4750;
  D.4751 = table->num_entries;
  D.4752 = D.4751 + -1;
  table->num_entries = D.4752;
  return;
  <D.4747>:
  D.4748 = table->next_value;
  D.4744 = *value;
  value = D.4748 (D.4744);
  <D.4643>:
  D.4744 = *value;
  if (D.4744 != 0B) goto <D.4642>; else goto <D.4644>;
  <D.4644>:
  if (1 != 0) goto <D.4753>; else goto <D.4754>;
  <D.4753>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mono-internal-hash.c", 125, "0");
  <D.4754>:
}


