Skip to content

Commit

Permalink
add support for freezing hashes with pmc keys and/or string entries
Browse files Browse the repository at this point in the history
git-svn-id: https://svn.parrot.org/parrot/trunk@45487 d31e2699-5ff4-0310-a27c-f18f2fbe73fe
  • Loading branch information
plobsing committed Apr 9, 2010
1 parent 7c5a19a commit 6061e4e
Showing 1 changed file with 33 additions and 15 deletions.
48 changes: 33 additions & 15 deletions src/hash.c
Expand Up @@ -571,37 +571,49 @@ hash_thaw(PARROT_INTERP, ARGMOD(Hash *hash), ARGMOD(PMC *info))
HashBucket *b;

switch (hash->key_type) {
case Hash_key_type_int:
{
const INTVAL i_key = VTABLE_shift_integer(interp, info);
b = parrot_hash_put(interp, hash, (void*)i_key, NULL);
}
break;
case Hash_key_type_STRING:
{
STRING * const s_key = VTABLE_shift_string(interp, info);
b = parrot_hash_put(interp, hash, s_key, NULL);
}
break;
case Hash_key_type_int:
case Hash_key_type_PMC:
{
const INTVAL i_key = VTABLE_shift_integer(interp, info);
b = parrot_hash_put(interp, hash, (void*)i_key, NULL);
PMC * const p_key = VTABLE_shift_pmc(interp, info);
b = parrot_hash_put(interp, hash, p_key, NULL);
break;
}
break;
default:
Parrot_ex_throw_from_c_args(interp, NULL, 1,
"unimplemented key type");
break;
}

switch (hash->entry_type) {
case enum_hash_pmc:
{
PMC *p = VTABLE_shift_pmc(interp, info);
b->value = (void *)p;
break;
}
case enum_hash_int:
{
const INTVAL i = VTABLE_shift_integer(interp, info);
b->value = (void *)i;
break;
}
case enum_hash_string:
{
const STRING * s = VTABLE_shift_string(interp, info);
b->value = (void *)s;
break;
}
case enum_hash_pmc:
{
PMC *p = VTABLE_shift_pmc(interp, info);
b->value = (void *)p;
break;
}
default:
Parrot_ex_throw_from_c_args(interp, NULL, 1,
"unimplemented value type");
Expand Down Expand Up @@ -637,11 +649,14 @@ hash_freeze(PARROT_INTERP, ARGIN(const Hash * const hash), ARGMOD(PMC *info))
HashBucket * const b = hash->bs+i;

switch (hash->key_type) {
case Hash_key_type_int:
VTABLE_push_integer(interp, info, (INTVAL)b->key);
break;
case Hash_key_type_STRING:
VTABLE_push_string(interp, info, (STRING *)b->key);
break;
case Hash_key_type_int:
VTABLE_push_integer(interp, info, (INTVAL)b->key);
case Hash_key_type_PMC:
VTABLE_push_pmc(interp, info, (PMC *)b->key);
break;
default:
Parrot_ex_throw_from_c_args(interp, NULL, 1,
Expand All @@ -650,12 +665,15 @@ hash_freeze(PARROT_INTERP, ARGIN(const Hash * const hash), ARGMOD(PMC *info))
}

switch (hash->entry_type) {
case enum_hash_pmc:
VTABLE_push_pmc(interp, info, (PMC *)b->value);
break;
case enum_hash_int:
VTABLE_push_integer(interp, info, (INTVAL)b->value);
break;
case enum_hash_string:
VTABLE_push_string(interp, info, (STRING *)b->value);
break;
case enum_hash_pmc:
VTABLE_push_pmc(interp, info, (PMC *)b->value);
break;
default:
Parrot_ex_throw_from_c_args(interp, NULL, 1,
"unimplemented value type");
Expand Down

0 comments on commit 6061e4e

Please sign in to comment.