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:
parent
3ac2c69f6c
commit
8a59534669
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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]);
|
||||
|
||||
|
|
|
@ -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 */
|
||||
/*========================================================================*/
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 */
|
||||
/*========================================================================*/
|
||||
|
|
Loading…
Reference in New Issue
Block a user