diff --git a/racket/src/racket/include/mzwin.def b/racket/src/racket/include/mzwin.def index 316054f5d4..e51140ea36 100644 --- a/racket/src/racket/include/mzwin.def +++ b/racket/src/racket/include/mzwin.def @@ -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 diff --git a/racket/src/racket/include/mzwin3m.def b/racket/src/racket/include/mzwin3m.def index 678a1629e3..d7c00461da 100644 --- a/racket/src/racket/include/mzwin3m.def +++ b/racket/src/racket/include/mzwin3m.def @@ -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 diff --git a/racket/src/racket/include/racket.exp b/racket/src/racket/include/racket.exp index a7c4a20d9a..ad896f5215 100644 --- a/racket/src/racket/include/racket.exp +++ b/racket/src/racket/include/racket.exp @@ -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 diff --git a/racket/src/racket/include/racket3m.exp b/racket/src/racket/include/racket3m.exp index 138f57f2ba..0d56c72219 100644 --- a/racket/src/racket/include/racket3m.exp +++ b/racket/src/racket/include/racket3m.exp @@ -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 diff --git a/racket/src/racket/src/hash.c b/racket/src/racket/src/hash.c index 7955075b38..2766c32b94 100644 --- a/racket/src/racket/src/hash.c +++ b/racket/src/racket/src/hash.c @@ -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) diff --git a/racket/src/racket/src/list.c b/racket/src/racket/src/list.c index 3a8b1cb698..13e3d650ad 100644 --- a/racket/src/racket/src/list.c +++ b/racket/src/racket/src/list.c @@ -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]); diff --git a/racket/src/racket/src/schemef.h b/racket/src/racket/src/schemef.h index 8035743213..57b3a44880 100644 --- a/racket/src/racket/src/schemef.h +++ b/racket/src/racket/src/schemef.h @@ -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 */ /*========================================================================*/ diff --git a/racket/src/racket/src/schemex.h b/racket/src/racket/src/schemex.h index 595cfe9f7b..98e7e8e563 100644 --- a/racket/src/racket/src/schemex.h +++ b/racket/src/racket/src/schemex.h @@ -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); diff --git a/racket/src/racket/src/schemex.inc b/racket/src/racket/src/schemex.inc index abd64bbff5..7a05e9ded5 100644 --- a/racket/src/racket/src/schemex.inc +++ b/racket/src/racket/src/schemex.inc @@ -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; diff --git a/racket/src/racket/src/schemexm.h b/racket/src/racket/src/schemexm.h index 83c8a4f78f..caadf0237f 100644 --- a/racket/src/racket/src/schemexm.h +++ b/racket/src/racket/src/schemexm.h @@ -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) diff --git a/racket/src/racket/src/schpriv.h b/racket/src/racket/src/schpriv.h index 9d51e48dcc..38ffd157c5 100644 --- a/racket/src/racket/src/schpriv.h +++ b/racket/src/racket/src/schpriv.h @@ -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 */ /*========================================================================*/