adjust unsafe hash-table iteration implementation

Restore exports available to embedding, extending, and FFI
applications, and shift boundary back between hash-table
implementation details (in "hash.c") and Racket interface
(in "list.c").
This commit is contained in:
Matthew Flatt 2016-02-28 16:23:52 -07:00
parent 3ac2c69f6c
commit 8a59534669
11 changed files with 433 additions and 129 deletions

View File

@ -232,6 +232,41 @@ EXPORTS
scheme_add_gc_callback
scheme_remove_gc_callback
scheme_register_type_gc_shape
scheme_make_bucket_table
scheme_add_to_table
scheme_change_in_table
scheme_lookup_in_table
scheme_bucket_from_table
scheme_bucket_table_equal
scheme_clone_bucket_table
scheme_clear_bucket_table
scheme_bucket_table_index
scheme_bucket_table_next
scheme_make_hash_table
scheme_make_hash_table_equal
scheme_make_hash_table_eqv
scheme_hash_set
scheme_hash_get
scheme_eq_hash_get
scheme_hash_set_atomic
scheme_hash_get_atomic
scheme_hash_table_equal
scheme_is_hash_table_equal
scheme_is_hash_table_eqv
scheme_clone_hash_table
scheme_clear_hash_table
scheme_hash_table_index
scheme_hash_table_next
scheme_make_hash_tree
scheme_make_hash_tree_set
scheme_hash_tree_set
scheme_hash_tree_get
scheme_eq_hash_tree_get
scheme_hash_tree_next
scheme_hash_tree_index
scheme_hash_tree_equal
scheme_is_hash_tree_equal
scheme_is_hash_tree_eqv
scheme_make_prim
scheme_make_noneternal_prim
scheme_make_prim_w_arity

View File

@ -246,6 +246,41 @@ EXPORTS
scheme_add_gc_callback
scheme_remove_gc_callback
scheme_register_type_gc_shape
scheme_make_bucket_table
scheme_add_to_table
scheme_change_in_table
scheme_lookup_in_table
scheme_bucket_from_table
scheme_bucket_table_equal
scheme_clone_bucket_table
scheme_clear_bucket_table
scheme_bucket_table_index
scheme_bucket_table_next
scheme_make_hash_table
scheme_make_hash_table_equal
scheme_make_hash_table_eqv
scheme_hash_set
scheme_hash_get
scheme_eq_hash_get
scheme_hash_set_atomic
scheme_hash_get_atomic
scheme_hash_table_equal
scheme_is_hash_table_equal
scheme_is_hash_table_eqv
scheme_clone_hash_table
scheme_clear_hash_table
scheme_hash_table_index
scheme_hash_table_next
scheme_make_hash_tree
scheme_make_hash_tree_set
scheme_hash_tree_set
scheme_hash_tree_get
scheme_eq_hash_tree_get
scheme_hash_tree_next
scheme_hash_tree_index
scheme_hash_tree_equal
scheme_is_hash_tree_equal
scheme_is_hash_tree_eqv
scheme_make_prim
scheme_make_noneternal_prim
scheme_make_prim_w_arity

View File

@ -248,6 +248,41 @@ scheme_free_immobile_box
scheme_add_gc_callback
scheme_remove_gc_callback
scheme_register_type_gc_shape
scheme_make_bucket_table
scheme_add_to_table
scheme_change_in_table
scheme_lookup_in_table
scheme_bucket_from_table
scheme_bucket_table_equal
scheme_clone_bucket_table
scheme_clear_bucket_table
scheme_bucket_table_index
scheme_bucket_table_next
scheme_make_hash_table
scheme_make_hash_table_equal
scheme_make_hash_table_eqv
scheme_hash_set
scheme_hash_get
scheme_eq_hash_get
scheme_hash_set_atomic
scheme_hash_get_atomic
scheme_hash_table_equal
scheme_is_hash_table_equal
scheme_is_hash_table_eqv
scheme_clone_hash_table
scheme_clear_hash_table
scheme_hash_table_index
scheme_hash_table_next
scheme_make_hash_tree
scheme_make_hash_tree_set
scheme_hash_tree_set
scheme_hash_tree_get
scheme_eq_hash_tree_get
scheme_hash_tree_next
scheme_hash_tree_index
scheme_hash_tree_equal
scheme_is_hash_tree_equal
scheme_is_hash_tree_eqv
scheme_make_prim
scheme_make_noneternal_prim
scheme_make_prim_w_arity

View File

@ -253,6 +253,41 @@ scheme_free_immobile_box
scheme_add_gc_callback
scheme_remove_gc_callback
scheme_register_type_gc_shape
scheme_make_bucket_table
scheme_add_to_table
scheme_change_in_table
scheme_lookup_in_table
scheme_bucket_from_table
scheme_bucket_table_equal
scheme_clone_bucket_table
scheme_clear_bucket_table
scheme_bucket_table_index
scheme_bucket_table_next
scheme_make_hash_table
scheme_make_hash_table_equal
scheme_make_hash_table_eqv
scheme_hash_set
scheme_hash_get
scheme_eq_hash_get
scheme_hash_set_atomic
scheme_hash_get_atomic
scheme_hash_table_equal
scheme_is_hash_table_equal
scheme_is_hash_table_eqv
scheme_clone_hash_table
scheme_clear_hash_table
scheme_hash_table_index
scheme_hash_table_next
scheme_make_hash_tree
scheme_make_hash_tree_set
scheme_hash_tree_set
scheme_hash_tree_get
scheme_eq_hash_tree_get
scheme_hash_tree_next
scheme_hash_tree_index
scheme_hash_tree_equal
scheme_is_hash_tree_equal
scheme_is_hash_tree_eqv
scheme_make_prim
scheme_make_noneternal_prim
scheme_make_prim_w_arity

View File

@ -2418,7 +2418,7 @@ XFORM_NONGCING static int hamt_index(uintptr_t code, int shift)
return (code >> shift) & ((1 << mzHAMT_LOG_WORD_SIZE) - 1);
}
XFORM_NONGCING int hamt_popcount(hash_tree_bitmap_t x)
XFORM_NONGCING static int hamt_popcount(hash_tree_bitmap_t x)
{
#if MZ_HAS_BUILTIN_POPCOUNT
return __builtin_popcount(x);
@ -2836,6 +2836,15 @@ XFORM_NONGCING void scheme_unsafe_hash_tree_subtree(Scheme_Object *obj, Scheme_O
*_i =i;
}
XFORM_NONGCING Scheme_Object *scheme_unsafe_hash_tree_access(Scheme_Hash_Tree *subtree, int i)
{
int popcount;
popcount = hamt_popcount(subtree->bitmap);
return subtree->els[i+popcount];
}
/* args is a (cons subtree (cons subtree-index stack-of-parents))
or the comppressed representation as a fixnum */
Scheme_Object *scheme_unsafe_hash_tree_next(Scheme_Hash_Tree *ht, Scheme_Object *args)

View File

@ -175,27 +175,29 @@ static Scheme_Object *unsafe_unbox_star (int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_set_box (int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_set_box_star (int argc, Scheme_Object *argv[]);
/* unsafe_scheme_hash_table */
Scheme_Object *unsafe_scheme_hash_table_iterate_start(int argc, Scheme_Object *argv[]);
Scheme_Object *unsafe_scheme_hash_table_iterate_next(int argc, Scheme_Object *argv[]);
Scheme_Object *unsafe_scheme_hash_table_iterate_key(int argc, Scheme_Object *argv[]);
Scheme_Object *unsafe_scheme_hash_table_iterate_value(int argc, Scheme_Object *argv[]);
Scheme_Object *unsafe_scheme_hash_table_iterate_pair(int argc, Scheme_Object *argv[]);
Scheme_Object *unsafe_scheme_hash_table_iterate_key_value(int argc, Scheme_Object *argv[]);
/* unsafe_scheme_hash_tree */
Scheme_Object *unsafe_scheme_hash_tree_iterate_start(int argc, Scheme_Object *argv[]);
Scheme_Object *unsafe_scheme_hash_tree_iterate_next(int argc, Scheme_Object *argv[]);
Scheme_Object *unsafe_scheme_hash_tree_iterate_key(int argc, Scheme_Object *argv[]);
Scheme_Object *unsafe_scheme_hash_tree_iterate_value(int argc, Scheme_Object *argv[]);
Scheme_Object *unsafe_scheme_hash_tree_iterate_pair(int argc, Scheme_Object *argv[]);
Scheme_Object *unsafe_scheme_hash_tree_iterate_key_value(int argc, Scheme_Object *argv[]);
/* unsafe_scheme_bucket_table */
Scheme_Object *unsafe_scheme_bucket_table_iterate_start(int argc, Scheme_Object *argv[]);
Scheme_Object *unsafe_scheme_bucket_table_iterate_next(int argc, Scheme_Object *argv[]);
Scheme_Object *unsafe_scheme_bucket_table_iterate_key(int argc, Scheme_Object *argv[]);
Scheme_Object *unsafe_scheme_bucket_table_iterate_value(int argc, Scheme_Object *argv[]);
Scheme_Object *unsafe_scheme_bucket_table_iterate_pair(int argc, Scheme_Object *argv[]);
Scheme_Object *unsafe_scheme_bucket_table_iterate_key_value(int argc, Scheme_Object *argv[]);
/* unsafe_hash_table */
static Scheme_Object *unsafe_hash_table_iterate_start(int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_hash_table_iterate_next(int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_hash_table_iterate_key(int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_hash_table_iterate_value(int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_hash_table_iterate_pair(int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_hash_table_iterate_key_value(int argc, Scheme_Object *argv[]);
/* unsafe_hash_tree */
static Scheme_Object *unsafe_hash_tree_iterate_start(int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_hash_tree_iterate_next(int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_hash_tree_iterate_key(int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_hash_tree_iterate_value(int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_hash_tree_iterate_pair(int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_hash_tree_iterate_key_value(int argc, Scheme_Object *argv[]);
/* unsafe_bucket_table */
static Scheme_Object *unsafe_bucket_table_iterate_start(int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_bucket_table_iterate_next(int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_bucket_table_iterate_key(int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_bucket_table_iterate_value(int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_bucket_table_iterate_pair(int argc, Scheme_Object *argv[]);
static Scheme_Object *unsafe_bucket_table_iterate_key_value(int argc, Scheme_Object *argv[]);
static Scheme_Object *chaperone_hash_key(const char *name, Scheme_Object *table, Scheme_Object *key);
static void chaperone_hash_key_value(const char *name, Scheme_Object *obj, Scheme_Object *k, Scheme_Object **_chap_key, Scheme_Object **_chap_val, int ischap);
@ -890,59 +892,59 @@ scheme_init_unsafe_hash (Scheme_Env *env)
Scheme_Object *p;
/* unsafe-hash-iterate-first ---------------------------------------- */
p = scheme_make_immed_prim(unsafe_scheme_hash_table_iterate_start,
p = scheme_make_immed_prim(unsafe_hash_table_iterate_start,
"unsafe-mutable-hash-iterate-first", 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |=
scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL);
scheme_add_global_constant ("unsafe-mutable-hash-iterate-first", p, env);
p = scheme_make_immed_prim(unsafe_scheme_hash_tree_iterate_start,
p = scheme_make_immed_prim(unsafe_hash_tree_iterate_start,
"unsafe-immutable-hash-iterate-first", 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |=
scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL);
scheme_add_global_constant ("unsafe-immutable-hash-iterate-first", p, env);
p = scheme_make_immed_prim(unsafe_scheme_bucket_table_iterate_start,
p = scheme_make_immed_prim(unsafe_bucket_table_iterate_start,
"unsafe-weak-hash-iterate-first", 1, 1);
SCHEME_PRIM_PROC_FLAGS(p) |=
scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL);
scheme_add_global_constant ("unsafe-weak-hash-iterate-first", p, env);
/* unsafe-hash-iterate-next ---------------------------------------- */
p = scheme_make_immed_prim(unsafe_scheme_hash_table_iterate_next,
p = scheme_make_immed_prim(unsafe_hash_table_iterate_next,
"unsafe-mutable-hash-iterate-next", 2, 2);
SCHEME_PRIM_PROC_FLAGS(p) |=
scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL);
scheme_add_global_constant ("unsafe-mutable-hash-iterate-next", p, env);
p = scheme_make_immed_prim(unsafe_scheme_hash_tree_iterate_next,
p = scheme_make_immed_prim(unsafe_hash_tree_iterate_next,
"unsafe-immutable-hash-iterate-next", 2, 2);
SCHEME_PRIM_PROC_FLAGS(p) |=
scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL);
scheme_add_global_constant ("unsafe-immutable-hash-iterate-next", p, env);
p = scheme_make_immed_prim(unsafe_scheme_bucket_table_iterate_next,
p = scheme_make_immed_prim(unsafe_bucket_table_iterate_next,
"unsafe-weak-hash-iterate-next", 2, 2);
SCHEME_PRIM_PROC_FLAGS(p) |=
scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL);
scheme_add_global_constant ("unsafe-weak-hash-iterate-next", p, env);
/* unsafe-hash-iterate-key ---------------------------------------- */
p = scheme_make_noncm_prim(unsafe_scheme_hash_table_iterate_key,
p = scheme_make_noncm_prim(unsafe_hash_table_iterate_key,
"unsafe-mutable-hash-iterate-key", 2, 2);
SCHEME_PRIM_PROC_FLAGS(p) |=
scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_OMITABLE
| SCHEME_PRIM_IS_UNSAFE_OMITABLE);
scheme_add_global_constant ("unsafe-mutable-hash-iterate-key", p, env);
p = scheme_make_noncm_prim(unsafe_scheme_hash_tree_iterate_key,
p = scheme_make_noncm_prim(unsafe_hash_tree_iterate_key,
"unsafe-immutable-hash-iterate-key", 2, 2);
SCHEME_PRIM_PROC_FLAGS(p) |=
scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL
| SCHEME_PRIM_IS_UNSAFE_NONALLOCATE);
scheme_add_global_constant ("unsafe-immutable-hash-iterate-key", p, env);
p = scheme_make_noncm_prim(unsafe_scheme_bucket_table_iterate_key,
p = scheme_make_noncm_prim(unsafe_bucket_table_iterate_key,
"unsafe-weak-hash-iterate-key", 2, 2);
SCHEME_PRIM_PROC_FLAGS(p) |=
scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_OMITABLE
@ -950,21 +952,21 @@ scheme_init_unsafe_hash (Scheme_Env *env)
scheme_add_global_constant ("unsafe-weak-hash-iterate-key", p, env);
/* unsafe-hash-iterate-value ---------------------------------------- */
p = scheme_make_noncm_prim(unsafe_scheme_hash_table_iterate_value,
p = scheme_make_noncm_prim(unsafe_hash_table_iterate_value,
"unsafe-mutable-hash-iterate-value", 2, 2);
SCHEME_PRIM_PROC_FLAGS(p) |=
scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_OMITABLE
| SCHEME_PRIM_IS_UNSAFE_OMITABLE);
scheme_add_global_constant ("unsafe-mutable-hash-iterate-value", p, env);
p = scheme_make_noncm_prim(unsafe_scheme_hash_tree_iterate_value,
p = scheme_make_noncm_prim(unsafe_hash_tree_iterate_value,
"unsafe-immutable-hash-iterate-value", 2, 2);
SCHEME_PRIM_PROC_FLAGS(p) |=
scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL
| SCHEME_PRIM_IS_UNSAFE_NONALLOCATE);
scheme_add_global_constant ("unsafe-immutable-hash-iterate-value", p, env);
p = scheme_make_noncm_prim(unsafe_scheme_bucket_table_iterate_value,
p = scheme_make_noncm_prim(unsafe_bucket_table_iterate_value,
"unsafe-weak-hash-iterate-value", 2, 2);
SCHEME_PRIM_PROC_FLAGS(p) |=
scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_OMITABLE
@ -972,7 +974,7 @@ scheme_init_unsafe_hash (Scheme_Env *env)
scheme_add_global_constant ("unsafe-weak-hash-iterate-value", p, env);
/* unsafe-hash-iterate-key+value ---------------------------------------- */
p = scheme_make_prim_w_arity2(unsafe_scheme_hash_table_iterate_key_value,
p = scheme_make_prim_w_arity2(unsafe_hash_table_iterate_key_value,
"unsafe-mutable-hash-iterate-key+value",
2, 2, 2, 2);
SCHEME_PRIM_PROC_FLAGS(p) |=
@ -980,7 +982,7 @@ scheme_init_unsafe_hash (Scheme_Env *env)
| SCHEME_PRIM_IS_UNSAFE_OMITABLE);
scheme_add_global_constant ("unsafe-mutable-hash-iterate-key+value", p, env);
p = scheme_make_prim_w_arity2(unsafe_scheme_hash_tree_iterate_key_value,
p = scheme_make_prim_w_arity2(unsafe_hash_tree_iterate_key_value,
"unsafe-immutable-hash-iterate-key+value",
2, 2, 2, 2);
SCHEME_PRIM_PROC_FLAGS(p) |=
@ -988,7 +990,7 @@ scheme_init_unsafe_hash (Scheme_Env *env)
| SCHEME_PRIM_IS_UNSAFE_NONALLOCATE);
scheme_add_global_constant ("unsafe-immutable-hash-iterate-key+value", p, env);
p = scheme_make_prim_w_arity2(unsafe_scheme_bucket_table_iterate_key_value,
p = scheme_make_prim_w_arity2(unsafe_bucket_table_iterate_key_value,
"unsafe-weak-hash-iterate-key+value",
2, 2, 2, 2);
SCHEME_PRIM_PROC_FLAGS(p) |=
@ -997,7 +999,7 @@ scheme_init_unsafe_hash (Scheme_Env *env)
scheme_add_global_constant ("unsafe-weak-hash-iterate-key+value", p, env);
/* unsafe-hash-iterate-pair ---------------------------------------- */
p = scheme_make_immed_prim(unsafe_scheme_hash_table_iterate_pair,
p = scheme_make_immed_prim(unsafe_hash_table_iterate_pair,
"unsafe-mutable-hash-iterate-pair",
2, 2);
SCHEME_PRIM_PROC_FLAGS(p) |=
@ -1005,14 +1007,14 @@ scheme_init_unsafe_hash (Scheme_Env *env)
| SCHEME_PRIM_IS_UNSAFE_OMITABLE);
scheme_add_global_constant ("unsafe-mutable-hash-iterate-pair", p, env);
p = scheme_make_immed_prim(unsafe_scheme_hash_tree_iterate_pair,
p = scheme_make_immed_prim(unsafe_hash_tree_iterate_pair,
"unsafe-immutable-hash-iterate-pair",
2, 2);
SCHEME_PRIM_PROC_FLAGS(p) |=
scheme_intern_prim_opt_flags(SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL);
scheme_add_global_constant ("unsafe-immutable-hash-iterate-pair", p, env);
p = scheme_make_immed_prim(unsafe_scheme_bucket_table_iterate_pair,
p = scheme_make_immed_prim(unsafe_bucket_table_iterate_pair,
"unsafe-weak-hash-iterate-pair",
2, 2);
SCHEME_PRIM_PROC_FLAGS(p) |=
@ -3999,8 +4001,8 @@ static Scheme_Object *unsafe_set_box (int argc, Scheme_Object *argv[])
/* unsafe hash table iteration ops */
/************************************************************/
/* unsafe_scheme_hash_table, ie SCHEME_HASHTP, ops */
Scheme_Object *unsafe_scheme_hash_table_iterate_start(int argc, Scheme_Object *argv[])
/* unsafe_hash_table, ie SCHEME_HASHTP, ops */
Scheme_Object *unsafe_hash_table_iterate_start(int argc, Scheme_Object *argv[])
{
Scheme_Object *o = argv[0];
@ -4008,7 +4010,8 @@ Scheme_Object *unsafe_scheme_hash_table_iterate_start(int argc, Scheme_Object *a
return scheme_hash_table_next((Scheme_Hash_Table *)o, -1);
}
Scheme_Object *unsafe_scheme_hash_table_iterate_next(int argc, Scheme_Object *argv[])
Scheme_Object *unsafe_hash_table_iterate_next(int argc, Scheme_Object *argv[])
{
Scheme_Object *o = argv[0], *res;
@ -4025,9 +4028,10 @@ Scheme_Object *unsafe_scheme_hash_table_iterate_next(int argc, Scheme_Object *ar
NULL);
return NULL;
}
Scheme_Object *unsafe_scheme_hash_table_iterate_key(int argc, Scheme_Object *argv[])
static Scheme_Object *unsafe_hash_table_iterate_key_slow(int argc, Scheme_Object *argv[])
{
const char *name = "unsafe-mutable-hash-iterate-key";
GC_CAN_IGNORE const char *name = "unsafe-mutable-hash-iterate-key";
Scheme_Object *obj = argv[0], *key;
mzlonglong pos = SCHEME_INT_VAL(argv[1]);
@ -4036,15 +4040,28 @@ Scheme_Object *unsafe_scheme_hash_table_iterate_key(int argc, Scheme_Object *arg
if (scheme_hash_table_index(ht, pos, &key, NULL))
return chaperone_hash_key(name, obj, key);
} else {
if(scheme_hash_table_index((Scheme_Hash_Table *)obj, pos, &key, NULL))
if (scheme_hash_table_index((Scheme_Hash_Table *)obj, pos, &key, NULL))
return key;
}
scheme_contract_error(name, "no element at index", "index", 1, argv[1], NULL);
return NULL;
}
Scheme_Object *unsafe_scheme_hash_table_iterate_value(int argc, Scheme_Object *argv[])
Scheme_Object *unsafe_hash_table_iterate_key(int argc, Scheme_Object *argv[])
{
const char *name = "unsafe-mutable-hash-iterate-value";
Scheme_Object *obj = argv[0], *key;
mzlonglong pos = SCHEME_INT_VAL(argv[1]);
if (!SCHEME_NP_CHAPERONEP(obj)
&& scheme_hash_table_index((Scheme_Hash_Table *)obj, pos, &key, NULL))
return key;
else
return unsafe_hash_table_iterate_key_slow(argc, argv);
}
static Scheme_Object *unsafe_hash_table_iterate_value_slow(int argc, Scheme_Object *argv[])
{
GC_CAN_IGNORE const char *name = "unsafe-mutable-hash-iterate-value";
Scheme_Object *obj = argv[0], *key, *val;
mzlonglong pos = SCHEME_INT_VAL(argv[1]);
@ -4062,9 +4079,22 @@ Scheme_Object *unsafe_scheme_hash_table_iterate_value(int argc, Scheme_Object *a
scheme_contract_error(name, "no element at index", "index", 1, argv[1], NULL);
return NULL;
}
Scheme_Object *unsafe_scheme_hash_table_iterate_pair(int argc, Scheme_Object *argv[])
Scheme_Object *unsafe_hash_table_iterate_value(int argc, Scheme_Object *argv[])
{
const char *name = "unsafe-mutable-hash-iterate-pair";
Scheme_Object *obj = argv[0], *key, *val;
mzlonglong pos = SCHEME_INT_VAL(argv[1]);
if (!SCHEME_NP_CHAPERONEP(obj)
&& scheme_hash_table_index((Scheme_Hash_Table *)obj, pos, &key, &val))
return val;
else
return unsafe_hash_table_iterate_value_slow(argc, argv);
}
Scheme_Object *unsafe_hash_table_iterate_pair(int argc, Scheme_Object *argv[])
{
GC_CAN_IGNORE const char *name = "unsafe-mutable-hash-iterate-pair";
Scheme_Object *obj = argv[0], *key, *val;
mzlonglong pos = SCHEME_INT_VAL(argv[1]);
@ -4076,15 +4106,16 @@ Scheme_Object *unsafe_scheme_hash_table_iterate_pair(int argc, Scheme_Object *ar
return scheme_make_pair(chap_key, chap_val);
}
} else {
if(scheme_hash_table_index((Scheme_Hash_Table *)obj, pos, &key, &val))
if (scheme_hash_table_index((Scheme_Hash_Table *)obj, pos, &key, &val))
return scheme_make_pair(key, val);
}
scheme_contract_error(name, "no element at index", "index", 1, argv[1], NULL);
return NULL;
}
Scheme_Object *unsafe_scheme_hash_table_iterate_key_value(int argc, Scheme_Object *argv[])
Scheme_Object *unsafe_hash_table_iterate_key_value(int argc, Scheme_Object *argv[])
{
const char *name = "unsafe-mutable-hash-iterate-key+value";
GC_CAN_IGNORE const char *name = "unsafe-mutable-hash-iterate-key+value";
Scheme_Object *obj = argv[0], *res[2];
mzlonglong pos = SCHEME_INT_VAL(argv[1]);
@ -4096,15 +4127,15 @@ Scheme_Object *unsafe_scheme_hash_table_iterate_key_value(int argc, Scheme_Objec
return scheme_values(2, res);
}
} else {
if(scheme_hash_table_index((Scheme_Hash_Table *)obj, pos, &res[0], &res[1]))
if (scheme_hash_table_index((Scheme_Hash_Table *)obj, pos, &res[0], &res[1]))
return scheme_values(2, res);
}
scheme_contract_error(name, "no element at index", "index", 1, argv[1], NULL);
return NULL;
}
/* unsafe_scheme_hash_tree, ie SCHEME_HASHTRP, ops */
Scheme_Object *unsafe_scheme_hash_tree_iterate_start(int argc, Scheme_Object *argv[])
/* unsafe_hash_tree, ie SCHEME_HASHTRP, ops */
Scheme_Object *unsafe_hash_tree_iterate_start(int argc, Scheme_Object *argv[])
{
Scheme_Object *o = argv[0];
@ -4112,7 +4143,8 @@ Scheme_Object *unsafe_scheme_hash_tree_iterate_start(int argc, Scheme_Object *ar
return scheme_unsafe_hash_tree_start((Scheme_Hash_Tree *)o);
}
Scheme_Object *unsafe_scheme_hash_tree_iterate_next(int argc, Scheme_Object *argv[])
Scheme_Object *unsafe_hash_tree_iterate_next(int argc, Scheme_Object *argv[])
{
Scheme_Object *o = argv[0];
@ -4120,7 +4152,8 @@ Scheme_Object *unsafe_scheme_hash_tree_iterate_next(int argc, Scheme_Object *arg
return scheme_unsafe_hash_tree_next((Scheme_Hash_Tree *)o, argv[1]);
}
Scheme_Object *unsafe_scheme_hash_tree_iterate_key(int argc, Scheme_Object *argv[])
Scheme_Object *unsafe_hash_tree_iterate_key(int argc, Scheme_Object *argv[])
{
Scheme_Object *obj = argv[0], *args = argv[1], *key;
Scheme_Hash_Tree *subtree;
@ -4129,12 +4162,13 @@ Scheme_Object *unsafe_scheme_hash_tree_iterate_key(int argc, Scheme_Object *argv
scheme_unsafe_hash_tree_subtree(obj, args, &subtree, &i);
key = subtree->els[i];
if (SCHEME_NP_CHAPERONEP(obj))
if (!SCHEME_NP_CHAPERONEP(obj))
return chaperone_hash_key("unsafe-immutable-hash-iterate-key", obj, key);
else
return key;
}
Scheme_Object *unsafe_scheme_hash_tree_iterate_value(int argc, Scheme_Object *argv[])
static Scheme_Object *unsafe_hash_tree_iterate_value_slow(int argc, Scheme_Object *argv[])
{
Scheme_Object *obj = argv[0], *args = argv[1];
Scheme_Hash_Tree *subtree;
@ -4147,13 +4181,24 @@ Scheme_Object *unsafe_scheme_hash_tree_iterate_value(int argc, Scheme_Object *ar
chaperone_hash_key_value("unsafe-immutable-hash-iterate-value",
obj, subtree->els[i], &chap_key, &chap_val, 0);
return chap_val;
} else {
int popcount;
popcount = hamt_popcount(subtree->bitmap);
return subtree->els[i+popcount];
}
} else
return scheme_unsafe_hash_tree_access(subtree, i);
}
Scheme_Object *unsafe_scheme_hash_tree_iterate_pair(int argc, Scheme_Object *argv[])
Scheme_Object *unsafe_hash_tree_iterate_value(int argc, Scheme_Object *argv[])
{
Scheme_Object *obj = argv[0], *args = argv[1];
Scheme_Hash_Tree *subtree;
int i;
if (!SCHEME_NP_CHAPERONEP(obj)) {
scheme_unsafe_hash_tree_subtree(obj, args, &subtree, &i);
return scheme_unsafe_hash_tree_access(subtree, i);
} else
return unsafe_hash_tree_iterate_value_slow(argc, argv);
}
Scheme_Object *unsafe_hash_tree_iterate_pair(int argc, Scheme_Object *argv[])
{
Scheme_Object *obj = argv[0], *args = argv[1], *key;
Scheme_Hash_Tree *subtree;
@ -4167,15 +4212,11 @@ Scheme_Object *unsafe_scheme_hash_tree_iterate_pair(int argc, Scheme_Object *arg
chaperone_hash_key_value("unsafe-immutable-hash-iterate-pair",
obj, subtree->els[i], &chap_key, &chap_val, 0);
return scheme_make_pair(chap_key, chap_val);
} else {
Scheme_Object *val;
int popcount;
popcount = hamt_popcount(subtree->bitmap);
val = subtree->els[i+popcount];
return scheme_make_pair(key, val);
}
} else
return scheme_make_pair(key, scheme_unsafe_hash_tree_access(subtree, i));
}
Scheme_Object *unsafe_scheme_hash_tree_iterate_key_value(int argc, Scheme_Object *argv[])
Scheme_Object *unsafe_hash_tree_iterate_key_value(int argc, Scheme_Object *argv[])
{
Scheme_Object *obj = argv[0], *args = argv[1], *key, *res[2];
Scheme_Hash_Tree *subtree;
@ -4188,18 +4229,15 @@ Scheme_Object *unsafe_scheme_hash_tree_iterate_key_value(int argc, Scheme_Object
chaperone_hash_key_value("unsafe-immutable-hash-iterate-pair",
obj, subtree->els[i], &res[0], &res[1], 0);
} else {
Scheme_Object *val;
int popcount;
popcount = hamt_popcount(subtree->bitmap);
val = subtree->els[i+popcount];
res[0] = key;
res[1] = val;
res[1] = scheme_unsafe_hash_tree_access(subtree, i);
}
return scheme_values(2, res);
}
/* unsafe_scheme_bucket_table, ie SCHEME_BUCKTP, ops */
Scheme_Object *unsafe_scheme_bucket_table_iterate_start(int argc, Scheme_Object *argv[])
/* unsafe_bucket_table, ie SCHEME_BUCKTP, ops */
Scheme_Object *unsafe_bucket_table_iterate_start(int argc, Scheme_Object *argv[])
{
Scheme_Object *o = argv[0];
@ -4207,7 +4245,8 @@ Scheme_Object *unsafe_scheme_bucket_table_iterate_start(int argc, Scheme_Object
return scheme_bucket_table_next((Scheme_Bucket_Table *)o, -1);
}
Scheme_Object *unsafe_scheme_bucket_table_iterate_next(int argc, Scheme_Object *argv[])
Scheme_Object *unsafe_bucket_table_iterate_next(int argc, Scheme_Object *argv[])
{
Scheme_Object *o = argv[0], *res;
@ -4224,9 +4263,10 @@ Scheme_Object *unsafe_scheme_bucket_table_iterate_next(int argc, Scheme_Object *
NULL);
return NULL;
}
Scheme_Object *unsafe_scheme_bucket_table_iterate_key(int argc, Scheme_Object *argv[])
Scheme_Object *unsafe_bucket_table_iterate_key(int argc, Scheme_Object *argv[])
{
const char *name = "unsafe-weak-hash-iterate-key";
GC_CAN_IGNORE const char *name = "unsafe-weak-hash-iterate-key";
Scheme_Object *obj = argv[0], *key;
mzlonglong pos = SCHEME_INT_VAL(argv[1]);
@ -4241,9 +4281,10 @@ Scheme_Object *unsafe_scheme_bucket_table_iterate_key(int argc, Scheme_Object *a
scheme_contract_error(name, "no element at index", "index", 1, argv[1], NULL);
return NULL;
}
Scheme_Object *unsafe_scheme_bucket_table_iterate_value(int argc, Scheme_Object *argv[])
Scheme_Object *unsafe_bucket_table_iterate_value(int argc, Scheme_Object *argv[])
{
const char *name = "unsafe-weak-hash-iterate-value";
GC_CAN_IGNORE const char *name = "unsafe-weak-hash-iterate-value";
Scheme_Object *obj = argv[0], *key, *val;
mzlonglong pos = SCHEME_INT_VAL(argv[1]);
@ -4261,9 +4302,10 @@ Scheme_Object *unsafe_scheme_bucket_table_iterate_value(int argc, Scheme_Object
scheme_contract_error(name, "no element at index", "index", 1, argv[1], NULL);
return NULL;
}
Scheme_Object *unsafe_scheme_bucket_table_iterate_pair(int argc, Scheme_Object *argv[])
Scheme_Object *unsafe_bucket_table_iterate_pair(int argc, Scheme_Object *argv[])
{
const char *name = "unsafe-weak-hash-iterate-pair";
GC_CAN_IGNORE const char *name = "unsafe-weak-hash-iterate-pair";
Scheme_Object *obj = argv[0], *key, *val;
mzlonglong pos = SCHEME_INT_VAL(argv[1]);
@ -4281,9 +4323,10 @@ Scheme_Object *unsafe_scheme_bucket_table_iterate_pair(int argc, Scheme_Object *
scheme_contract_error(name, "no element at index", "index", 1, argv[1], NULL);
return NULL;
}
Scheme_Object *unsafe_scheme_bucket_table_iterate_key_value(int argc, Scheme_Object *argv[])
Scheme_Object *unsafe_bucket_table_iterate_key_value(int argc, Scheme_Object *argv[])
{
const char *name = "unsafe-weak-hash-iterate-key+value";
GC_CAN_IGNORE const char *name = "unsafe-weak-hash-iterate-key+value";
Scheme_Object *obj = argv[0], *res[2];
mzlonglong pos = SCHEME_INT_VAL(argv[1]);

View File

@ -486,6 +486,48 @@ MZ_EXTERN void scheme_remove_gc_callback(Scheme_Object *key);
MZ_EXTERN void scheme_register_type_gc_shape(Scheme_Type type, intptr_t *shape_str);
/*========================================================================*/
/* hash tables */
/*========================================================================*/
MZ_EXTERN Scheme_Bucket_Table *scheme_make_bucket_table(intptr_t size_hint, int type);
MZ_EXTERN void scheme_add_to_table(Scheme_Bucket_Table *table, const char *key, void *val, int);
MZ_EXTERN void scheme_change_in_table(Scheme_Bucket_Table *table, const char *key, void *new_val);
MZ_EXTERN void *scheme_lookup_in_table(Scheme_Bucket_Table *table, const char *key);
MZ_EXTERN Scheme_Bucket *scheme_bucket_from_table(Scheme_Bucket_Table *table, const char *key);
MZ_EXTERN int scheme_bucket_table_equal(Scheme_Bucket_Table *t1, Scheme_Bucket_Table *t2);
MZ_EXTERN Scheme_Bucket_Table *scheme_clone_bucket_table(Scheme_Bucket_Table *bt);
MZ_EXTERN void scheme_clear_bucket_table(Scheme_Bucket_Table *bt);
XFORM_NONGCING MZ_EXTERN int scheme_bucket_table_index(Scheme_Bucket_Table *hash, mzlonglong pos, Scheme_Object **_key, Scheme_Object **_val);
XFORM_NONGCING Scheme_Object *scheme_bucket_table_next(Scheme_Bucket_Table *hash, mzlonglong start);
MZ_EXTERN Scheme_Hash_Table *scheme_make_hash_table(int type);
MZ_EXTERN Scheme_Hash_Table *scheme_make_hash_table_equal();
MZ_EXTERN Scheme_Hash_Table *scheme_make_hash_table_eqv();
MZ_EXTERN void scheme_hash_set(Scheme_Hash_Table *table, Scheme_Object *key, Scheme_Object *val);
MZ_EXTERN Scheme_Object *scheme_hash_get(Scheme_Hash_Table *table, Scheme_Object *key);
XFORM_NONGCING MZ_EXTERN Scheme_Object *scheme_eq_hash_get(Scheme_Hash_Table *table, Scheme_Object *key);
MZ_EXTERN void scheme_hash_set_atomic(Scheme_Hash_Table *table, Scheme_Object *key, Scheme_Object *val);
MZ_EXTERN Scheme_Object *scheme_hash_get_atomic(Scheme_Hash_Table *table, Scheme_Object *key);
MZ_EXTERN int scheme_hash_table_equal(Scheme_Hash_Table *t1, Scheme_Hash_Table *t2);
MZ_EXTERN int scheme_is_hash_table_equal(Scheme_Object *o);
MZ_EXTERN int scheme_is_hash_table_eqv(Scheme_Object *o);
MZ_EXTERN Scheme_Hash_Table *scheme_clone_hash_table(Scheme_Hash_Table *ht);
MZ_EXTERN void scheme_clear_hash_table(Scheme_Hash_Table *ht);
XFORM_NONGCING MZ_EXTERN int scheme_hash_table_index(Scheme_Hash_Table *hash, mzlonglong pos, Scheme_Object **_key, Scheme_Object **_val);
XFORM_NONGCING MZ_EXTERN Scheme_Object *scheme_hash_table_next(Scheme_Hash_Table *hash, mzlonglong start);
MZ_EXTERN Scheme_Hash_Tree *scheme_make_hash_tree(int kind);
MZ_EXTERN Scheme_Hash_Tree *scheme_make_hash_tree_set(int kind);
MZ_EXTERN Scheme_Hash_Tree *scheme_hash_tree_set(Scheme_Hash_Tree *tree, Scheme_Object *key, Scheme_Object *val);
MZ_EXTERN Scheme_Object *scheme_hash_tree_get(Scheme_Hash_Tree *tree, Scheme_Object *key);
XFORM_NONGCING MZ_EXTERN Scheme_Object *scheme_eq_hash_tree_get(Scheme_Hash_Tree *tree, Scheme_Object *key);
XFORM_NONGCING MZ_EXTERN mzlonglong scheme_hash_tree_next(Scheme_Hash_Tree *tree, mzlonglong pos);
XFORM_NONGCING MZ_EXTERN int scheme_hash_tree_index(Scheme_Hash_Tree *tree, mzlonglong pos, Scheme_Object **_key, Scheme_Object **_val);
MZ_EXTERN int scheme_hash_tree_equal(Scheme_Hash_Tree *t1, Scheme_Hash_Tree *t2);
MZ_EXTERN int scheme_is_hash_tree_equal(Scheme_Object *o);
MZ_EXTERN int scheme_is_hash_tree_eqv(Scheme_Object *o);
/*========================================================================*/
/* basic Scheme value constructors */
/*========================================================================*/

View File

@ -381,6 +381,44 @@ Scheme_Object *(*scheme_add_gc_callback)(Scheme_Object *pre, Scheme_Object *post
void (*scheme_remove_gc_callback)(Scheme_Object *key);
void (*scheme_register_type_gc_shape)(Scheme_Type type, intptr_t *shape_str);
/*========================================================================*/
/* hash tables */
/*========================================================================*/
Scheme_Bucket_Table *(*scheme_make_bucket_table)(intptr_t size_hint, int type);
void (*scheme_add_to_table)(Scheme_Bucket_Table *table, const char *key, void *val, int);
void (*scheme_change_in_table)(Scheme_Bucket_Table *table, const char *key, void *new_val);
void *(*scheme_lookup_in_table)(Scheme_Bucket_Table *table, const char *key);
Scheme_Bucket *(*scheme_bucket_from_table)(Scheme_Bucket_Table *table, const char *key);
int (*scheme_bucket_table_equal)(Scheme_Bucket_Table *t1, Scheme_Bucket_Table *t2);
Scheme_Bucket_Table *(*scheme_clone_bucket_table)(Scheme_Bucket_Table *bt);
void (*scheme_clear_bucket_table)(Scheme_Bucket_Table *bt);
int (*scheme_bucket_table_index)(Scheme_Bucket_Table *hash, mzlonglong pos, Scheme_Object **_key, Scheme_Object **_val);
Scheme_Object *(*scheme_bucket_table_next)(Scheme_Bucket_Table *hash, mzlonglong start);
Scheme_Hash_Table *(*scheme_make_hash_table)(int type);
Scheme_Hash_Table *(*scheme_make_hash_table_equal)();
Scheme_Hash_Table *(*scheme_make_hash_table_eqv)();
void (*scheme_hash_set)(Scheme_Hash_Table *table, Scheme_Object *key, Scheme_Object *val);
Scheme_Object *(*scheme_hash_get)(Scheme_Hash_Table *table, Scheme_Object *key);
Scheme_Object *(*scheme_eq_hash_get)(Scheme_Hash_Table *table, Scheme_Object *key);
void (*scheme_hash_set_atomic)(Scheme_Hash_Table *table, Scheme_Object *key, Scheme_Object *val);
Scheme_Object *(*scheme_hash_get_atomic)(Scheme_Hash_Table *table, Scheme_Object *key);
int (*scheme_hash_table_equal)(Scheme_Hash_Table *t1, Scheme_Hash_Table *t2);
int (*scheme_is_hash_table_equal)(Scheme_Object *o);
int (*scheme_is_hash_table_eqv)(Scheme_Object *o);
Scheme_Hash_Table *(*scheme_clone_hash_table)(Scheme_Hash_Table *ht);
void (*scheme_clear_hash_table)(Scheme_Hash_Table *ht);
int (*scheme_hash_table_index)(Scheme_Hash_Table *hash, mzlonglong pos, Scheme_Object **_key, Scheme_Object **_val);
Scheme_Object *(*scheme_hash_table_next)(Scheme_Hash_Table *hash, mzlonglong start);
Scheme_Hash_Tree *(*scheme_make_hash_tree)(int kind);
Scheme_Hash_Tree *(*scheme_make_hash_tree_set)(int kind);
Scheme_Hash_Tree *(*scheme_hash_tree_set)(Scheme_Hash_Tree *tree, Scheme_Object *key, Scheme_Object *val);
Scheme_Object *(*scheme_hash_tree_get)(Scheme_Hash_Tree *tree, Scheme_Object *key);
Scheme_Object *(*scheme_eq_hash_tree_get)(Scheme_Hash_Tree *tree, Scheme_Object *key);
mzlonglong (*scheme_hash_tree_next)(Scheme_Hash_Tree *tree, mzlonglong pos);
int (*scheme_hash_tree_index)(Scheme_Hash_Tree *tree, mzlonglong pos, Scheme_Object **_key, Scheme_Object **_val);
int (*scheme_hash_tree_equal)(Scheme_Hash_Tree *t1, Scheme_Hash_Tree *t2);
int (*scheme_is_hash_tree_equal)(Scheme_Object *o);
int (*scheme_is_hash_tree_eqv)(Scheme_Object *o);
/*========================================================================*/
/* basic Scheme value constructors */
/*========================================================================*/
Scheme_Object *(*scheme_make_prim)(Scheme_Prim *prim);

View File

@ -279,6 +279,41 @@
scheme_extension_table->scheme_add_gc_callback = scheme_add_gc_callback;
scheme_extension_table->scheme_remove_gc_callback = scheme_remove_gc_callback;
scheme_extension_table->scheme_register_type_gc_shape = scheme_register_type_gc_shape;
scheme_extension_table->scheme_make_bucket_table = scheme_make_bucket_table;
scheme_extension_table->scheme_add_to_table = scheme_add_to_table;
scheme_extension_table->scheme_change_in_table = scheme_change_in_table;
scheme_extension_table->scheme_lookup_in_table = scheme_lookup_in_table;
scheme_extension_table->scheme_bucket_from_table = scheme_bucket_from_table;
scheme_extension_table->scheme_bucket_table_equal = scheme_bucket_table_equal;
scheme_extension_table->scheme_clone_bucket_table = scheme_clone_bucket_table;
scheme_extension_table->scheme_clear_bucket_table = scheme_clear_bucket_table;
scheme_extension_table->scheme_bucket_table_index = scheme_bucket_table_index;
scheme_extension_table->scheme_bucket_table_next = scheme_bucket_table_next;
scheme_extension_table->scheme_make_hash_table = scheme_make_hash_table;
scheme_extension_table->scheme_make_hash_table_equal = scheme_make_hash_table_equal;
scheme_extension_table->scheme_make_hash_table_eqv = scheme_make_hash_table_eqv;
scheme_extension_table->scheme_hash_set = scheme_hash_set;
scheme_extension_table->scheme_hash_get = scheme_hash_get;
scheme_extension_table->scheme_eq_hash_get = scheme_eq_hash_get;
scheme_extension_table->scheme_hash_set_atomic = scheme_hash_set_atomic;
scheme_extension_table->scheme_hash_get_atomic = scheme_hash_get_atomic;
scheme_extension_table->scheme_hash_table_equal = scheme_hash_table_equal;
scheme_extension_table->scheme_is_hash_table_equal = scheme_is_hash_table_equal;
scheme_extension_table->scheme_is_hash_table_eqv = scheme_is_hash_table_eqv;
scheme_extension_table->scheme_clone_hash_table = scheme_clone_hash_table;
scheme_extension_table->scheme_clear_hash_table = scheme_clear_hash_table;
scheme_extension_table->scheme_hash_table_index = scheme_hash_table_index;
scheme_extension_table->scheme_hash_table_next = scheme_hash_table_next;
scheme_extension_table->scheme_make_hash_tree = scheme_make_hash_tree;
scheme_extension_table->scheme_make_hash_tree_set = scheme_make_hash_tree_set;
scheme_extension_table->scheme_hash_tree_set = scheme_hash_tree_set;
scheme_extension_table->scheme_hash_tree_get = scheme_hash_tree_get;
scheme_extension_table->scheme_eq_hash_tree_get = scheme_eq_hash_tree_get;
scheme_extension_table->scheme_hash_tree_next = scheme_hash_tree_next;
scheme_extension_table->scheme_hash_tree_index = scheme_hash_tree_index;
scheme_extension_table->scheme_hash_tree_equal = scheme_hash_tree_equal;
scheme_extension_table->scheme_is_hash_tree_equal = scheme_is_hash_tree_equal;
scheme_extension_table->scheme_is_hash_tree_eqv = scheme_is_hash_tree_eqv;
scheme_extension_table->scheme_make_prim = scheme_make_prim;
scheme_extension_table->scheme_make_noneternal_prim = scheme_make_noneternal_prim;
scheme_extension_table->scheme_make_prim_w_arity = scheme_make_prim_w_arity;

View File

@ -279,6 +279,41 @@
#define scheme_add_gc_callback (scheme_extension_table->scheme_add_gc_callback)
#define scheme_remove_gc_callback (scheme_extension_table->scheme_remove_gc_callback)
#define scheme_register_type_gc_shape (scheme_extension_table->scheme_register_type_gc_shape)
#define scheme_make_bucket_table (scheme_extension_table->scheme_make_bucket_table)
#define scheme_add_to_table (scheme_extension_table->scheme_add_to_table)
#define scheme_change_in_table (scheme_extension_table->scheme_change_in_table)
#define scheme_lookup_in_table (scheme_extension_table->scheme_lookup_in_table)
#define scheme_bucket_from_table (scheme_extension_table->scheme_bucket_from_table)
#define scheme_bucket_table_equal (scheme_extension_table->scheme_bucket_table_equal)
#define scheme_clone_bucket_table (scheme_extension_table->scheme_clone_bucket_table)
#define scheme_clear_bucket_table (scheme_extension_table->scheme_clear_bucket_table)
#define scheme_bucket_table_index (scheme_extension_table->scheme_bucket_table_index)
#define scheme_bucket_table_next (scheme_extension_table->scheme_bucket_table_next)
#define scheme_make_hash_table (scheme_extension_table->scheme_make_hash_table)
#define scheme_make_hash_table_equal (scheme_extension_table->scheme_make_hash_table_equal)
#define scheme_make_hash_table_eqv (scheme_extension_table->scheme_make_hash_table_eqv)
#define scheme_hash_set (scheme_extension_table->scheme_hash_set)
#define scheme_hash_get (scheme_extension_table->scheme_hash_get)
#define scheme_eq_hash_get (scheme_extension_table->scheme_eq_hash_get)
#define scheme_hash_set_atomic (scheme_extension_table->scheme_hash_set_atomic)
#define scheme_hash_get_atomic (scheme_extension_table->scheme_hash_get_atomic)
#define scheme_hash_table_equal (scheme_extension_table->scheme_hash_table_equal)
#define scheme_is_hash_table_equal (scheme_extension_table->scheme_is_hash_table_equal)
#define scheme_is_hash_table_eqv (scheme_extension_table->scheme_is_hash_table_eqv)
#define scheme_clone_hash_table (scheme_extension_table->scheme_clone_hash_table)
#define scheme_clear_hash_table (scheme_extension_table->scheme_clear_hash_table)
#define scheme_hash_table_index (scheme_extension_table->scheme_hash_table_index)
#define scheme_hash_table_next (scheme_extension_table->scheme_hash_table_next)
#define scheme_make_hash_tree (scheme_extension_table->scheme_make_hash_tree)
#define scheme_make_hash_tree_set (scheme_extension_table->scheme_make_hash_tree_set)
#define scheme_hash_tree_set (scheme_extension_table->scheme_hash_tree_set)
#define scheme_hash_tree_get (scheme_extension_table->scheme_hash_tree_get)
#define scheme_eq_hash_tree_get (scheme_extension_table->scheme_eq_hash_tree_get)
#define scheme_hash_tree_next (scheme_extension_table->scheme_hash_tree_next)
#define scheme_hash_tree_index (scheme_extension_table->scheme_hash_tree_index)
#define scheme_hash_tree_equal (scheme_extension_table->scheme_hash_tree_equal)
#define scheme_is_hash_tree_equal (scheme_extension_table->scheme_is_hash_tree_equal)
#define scheme_is_hash_tree_eqv (scheme_extension_table->scheme_is_hash_tree_eqv)
#define scheme_make_prim (scheme_extension_table->scheme_make_prim)
#define scheme_make_noneternal_prim (scheme_extension_table->scheme_make_noneternal_prim)
#define scheme_make_prim_w_arity (scheme_extension_table->scheme_make_prim_w_arity)

View File

@ -948,46 +948,10 @@ Scheme_Object *scheme_hash_tree_get_w_key_wraps(Scheme_Hash_Tree *tree, Scheme_O
Scheme_Hash_Tree *scheme_hash_tree_set_w_key_wraps(Scheme_Hash_Tree *tree, Scheme_Object *key, Scheme_Object *val,
Scheme_Object *key_wraps);
/*========================================================================*/
/* hash tables */
/*========================================================================*/
Scheme_Bucket_Table *scheme_make_bucket_table(intptr_t size_hint, int type);
void scheme_add_to_table(Scheme_Bucket_Table *table, const char *key, void *val, int);
void scheme_change_in_table(Scheme_Bucket_Table *table, const char *key, void *new_val);
void *scheme_lookup_in_table(Scheme_Bucket_Table *table, const char *key);
Scheme_Bucket *scheme_bucket_from_table(Scheme_Bucket_Table *table, const char *key);
int scheme_bucket_table_equal(Scheme_Bucket_Table *t1, Scheme_Bucket_Table *t2);
Scheme_Bucket_Table *scheme_clone_bucket_table(Scheme_Bucket_Table *bt);
void scheme_clear_bucket_table(Scheme_Bucket_Table *bt);
Scheme_Object *scheme_bucket_table_next(Scheme_Bucket_Table *hash, mzlonglong start);
XFORM_NONGCING int scheme_bucket_table_index(Scheme_Bucket_Table *hash, mzlonglong pos, Scheme_Object **_key, Scheme_Object **_val);
Scheme_Hash_Table *scheme_make_hash_table(int type);
Scheme_Hash_Table *scheme_make_hash_table_equal();
Scheme_Hash_Table *scheme_make_hash_table_eqv();
void scheme_hash_set(Scheme_Hash_Table *table, Scheme_Object *key, Scheme_Object *val);
Scheme_Object *scheme_hash_get(Scheme_Hash_Table *table, Scheme_Object *key);
XFORM_NONGCING Scheme_Object *scheme_eq_hash_get(Scheme_Hash_Table *table, Scheme_Object *key);
void scheme_hash_set_atomic(Scheme_Hash_Table *table, Scheme_Object *key, Scheme_Object *val);
Scheme_Object *scheme_hash_get_atomic(Scheme_Hash_Table *table, Scheme_Object *key);
int scheme_hash_table_equal(Scheme_Hash_Table *t1, Scheme_Hash_Table *t2);
int scheme_is_hash_table_equal(Scheme_Object *o);
int scheme_is_hash_table_eqv(Scheme_Object *o);
Scheme_Hash_Table *scheme_clone_hash_table(Scheme_Hash_Table *ht);
void scheme_clear_hash_table(Scheme_Hash_Table *ht);
Scheme_Object *scheme_hash_table_next(Scheme_Hash_Table *hash, mzlonglong start);
XFORM_NONGCING int scheme_hash_table_index(Scheme_Hash_Table *hash, mzlonglong pos, Scheme_Object **_key, Scheme_Object **_val);
Scheme_Hash_Tree *scheme_make_hash_tree(int kind);
Scheme_Hash_Tree *scheme_make_hash_tree_set(int kind);
Scheme_Hash_Tree *scheme_hash_tree_set(Scheme_Hash_Tree *tree, Scheme_Object *key, Scheme_Object *val);
Scheme_Object *scheme_hash_tree_get(Scheme_Hash_Tree *tree, Scheme_Object *key);
XFORM_NONGCING Scheme_Object *scheme_eq_hash_tree_get(Scheme_Hash_Tree *tree, Scheme_Object *key);
XFORM_NONGCING mzlonglong scheme_hash_tree_next(Scheme_Hash_Tree *tree, mzlonglong pos);
Scheme_Object *scheme_unsafe_hash_tree_start(Scheme_Hash_Tree *ht);
XFORM_NONGCING void scheme_unsafe_hash_tree_subtree(Scheme_Object *obj, Scheme_Object *args,
Scheme_Hash_Tree **_subtree, int *_i);
XFORM_NONGCING Scheme_Object *scheme_unsafe_hash_tree_access(Scheme_Hash_Tree *subtree, int i);
Scheme_Object *scheme_unsafe_hash_tree_next(Scheme_Hash_Tree *ht, Scheme_Object *args);
Scheme_Object *scheme_hash_tree_next_pos(Scheme_Hash_Tree *tree, mzlonglong pos);
XFORM_NONGCING int scheme_hash_tree_index(Scheme_Hash_Tree *tree, mzlonglong pos, Scheme_Object **_key, Scheme_Object **_val);
@ -995,8 +959,6 @@ int scheme_hash_tree_equal(Scheme_Hash_Tree *t1, Scheme_Hash_Tree *t2);
int scheme_is_hash_tree_equal(Scheme_Object *o);
int scheme_is_hash_tree_eqv(Scheme_Object *o);
XFORM_NONGCING int hamt_popcount(hash_tree_bitmap_t x);
/*========================================================================*/
/* structs */
/*========================================================================*/