1 |
/* Copyright (C) 1999,2000,2001 Free Software Foundation, Inc. |
/* Copyright (C) 1999,2000,2001, 2003 Free Software Foundation, Inc. |
2 |
* |
* |
3 |
* This program is free software; you can redistribute it and/or modify |
* This program is free software; you can redistribute it and/or modify |
4 |
* it under the terms of the GNU General Public License as published by |
* it under the terms of the GNU General Public License as published by |
531 |
static SCM |
static SCM |
532 |
obarray_enter (SCM obarray, SCM symbol, SCM data) |
obarray_enter (SCM obarray, SCM symbol, SCM data) |
533 |
{ |
{ |
534 |
size_t hash = SCM_SYMBOL_HASH (symbol) % SCM_VECTOR_LENGTH (obarray); |
size_t hash = SCM_SYMBOL_HASH (symbol) % SCM_HASHTABLE_N_BUCKETS (obarray); |
535 |
SCM entry = scm_cons (symbol, data); |
SCM entry = scm_cons (symbol, data); |
536 |
SCM slot = scm_cons (entry, SCM_VELTS (obarray)[hash]); |
SCM slot = scm_cons (entry, SCM_HASHTABLE_BUCKETS (obarray)[hash]); |
537 |
SCM_VECTOR_SET (obarray, hash, slot); |
SCM_SET_HASHTABLE_BUCKET (obarray, hash, slot); |
538 |
|
if (SCM_HASHTABLE_N_ITEMS (obarray) > SCM_HASHTABLE_UPPER (obarray)) |
539 |
|
scm_i_rehash (obarray, scm_i_hash_symbol, 0, "obarray_enter"); |
540 |
|
|
541 |
return entry; |
return entry; |
542 |
} |
} |
549 |
static SCM |
static SCM |
550 |
obarray_replace (SCM obarray, SCM symbol, SCM data) |
obarray_replace (SCM obarray, SCM symbol, SCM data) |
551 |
{ |
{ |
552 |
size_t hash = SCM_SYMBOL_HASH (symbol) % SCM_VECTOR_LENGTH (obarray); |
size_t hash = SCM_SYMBOL_HASH (symbol) % SCM_HASHTABLE_N_BUCKETS (obarray); |
553 |
SCM new_entry = scm_cons (symbol, data); |
SCM new_entry = scm_cons (symbol, data); |
554 |
SCM lsym; |
SCM lsym; |
555 |
SCM slot; |
SCM slot; |
556 |
|
|
557 |
for (lsym = SCM_VELTS (obarray)[hash]; !SCM_NULLP (lsym); lsym = SCM_CDR (lsym)) |
for (lsym = SCM_HASHTABLE_BUCKETS (obarray)[hash]; |
558 |
|
!SCM_NULLP (lsym); |
559 |
|
lsym = SCM_CDR (lsym)) |
560 |
{ |
{ |
561 |
SCM old_entry = SCM_CAR (lsym); |
SCM old_entry = SCM_CAR (lsym); |
562 |
if (SCM_EQ_P (SCM_CAR (old_entry), symbol)) |
if (SCM_EQ_P (SCM_CAR (old_entry), symbol)) |
566 |
} |
} |
567 |
} |
} |
568 |
|
|
569 |
slot = scm_cons (new_entry, SCM_VELTS (obarray)[hash]); |
slot = scm_cons (new_entry, SCM_HASHTABLE_BUCKETS (obarray)[hash]); |
570 |
SCM_VECTOR_SET (obarray, hash, slot); |
SCM_SET_HASHTABLE_BUCKET (obarray, hash, slot); |
571 |
|
if (SCM_HASHTABLE_N_ITEMS (obarray) > SCM_HASHTABLE_UPPER (obarray)) |
572 |
|
scm_i_rehash (obarray, scm_i_hash_symbol, 0, "obarray_replace"); |
573 |
|
|
574 |
return SCM_BOOL_F; |
return SCM_BOOL_F; |
575 |
} |
} |
581 |
static SCM |
static SCM |
582 |
obarray_retrieve (SCM obarray, SCM sym) |
obarray_retrieve (SCM obarray, SCM sym) |
583 |
{ |
{ |
584 |
size_t hash = SCM_SYMBOL_HASH (sym) % SCM_VECTOR_LENGTH (obarray); |
size_t hash = SCM_SYMBOL_HASH (sym) % SCM_HASHTABLE_N_BUCKETS (obarray); |
585 |
SCM lsym; |
SCM lsym; |
586 |
|
|
587 |
for (lsym = SCM_VELTS (obarray)[hash]; !SCM_NULLP (lsym); lsym = SCM_CDR (lsym)) |
for (lsym = SCM_HASHTABLE_BUCKETS (obarray)[hash]; |
588 |
|
!SCM_NULLP (lsym); |
589 |
|
lsym = SCM_CDR (lsym)) |
590 |
{ |
{ |
591 |
SCM entry = SCM_CAR (lsym); |
SCM entry = SCM_CAR (lsym); |
592 |
if (SCM_EQ_P (SCM_CAR (entry), sym)) |
if (SCM_EQ_P (SCM_CAR (entry), sym)) |
604 |
static SCM |
static SCM |
605 |
obarray_remove (SCM obarray, SCM sym) |
obarray_remove (SCM obarray, SCM sym) |
606 |
{ |
{ |
607 |
size_t hash = SCM_SYMBOL_HASH (sym) % SCM_VECTOR_LENGTH (obarray); |
size_t hash = SCM_SYMBOL_HASH (sym) % SCM_HASHTABLE_N_BUCKETS (obarray); |
608 |
SCM table_entry = SCM_VELTS (obarray)[hash]; |
SCM table_entry = SCM_HASHTABLE_BUCKETS (obarray)[hash]; |
609 |
SCM handle = scm_sloppy_assq (sym, table_entry); |
SCM handle = scm_sloppy_assq (sym, table_entry); |
610 |
|
|
611 |
if (SCM_CONSP (handle)) |
if (SCM_CONSP (handle)) |
612 |
{ |
{ |
613 |
SCM new_table_entry = scm_delq1_x (handle, table_entry); |
SCM new_table_entry = scm_delq1_x (handle, table_entry); |
614 |
SCM_VECTOR_SET (obarray, hash, new_table_entry); |
SCM_SET_HASHTABLE_BUCKET (obarray, hash, new_table_entry); |
615 |
|
SCM_HASHTABLE_DECREMENT (obarray); |
616 |
} |
} |
617 |
|
|
618 |
return handle; |
return handle; |
622 |
static void |
static void |
623 |
obarray_remove_all (SCM obarray) |
obarray_remove_all (SCM obarray) |
624 |
{ |
{ |
625 |
size_t size = SCM_VECTOR_LENGTH (obarray); |
size_t size = SCM_HASHTABLE_N_BUCKETS (obarray); |
626 |
size_t i; |
size_t i; |
627 |
|
|
628 |
for (i = 0; i < size; i++) |
for (i = 0; i < size; i++) |
629 |
{ |
{ |
630 |
SCM_VECTOR_SET (obarray, i, SCM_EOL); |
SCM_SET_HASHTABLE_BUCKET (obarray, i, SCM_EOL); |
631 |
} |
} |
632 |
|
SCM_SET_HASHTABLE_N_ITEMS (obarray, 0); |
633 |
} |
} |
634 |
|
|
635 |
|
|
769 |
{ |
{ |
770 |
body->funcs = funcs; |
body->funcs = funcs; |
771 |
body->observers = SCM_EOL; |
body->observers = SCM_EOL; |
772 |
body->weak_observers = scm_make_weak_value_hash_table (SCM_MAKINUM (1)); |
body->weak_observers = scm_make_weak_value_alist_vector (SCM_MAKINUM (1)); |
773 |
} |
} |
774 |
|
|
775 |
|
|
907 |
SCM result = init; |
SCM result = init; |
908 |
SCM obarray = LEAF_ENVIRONMENT (env)->obarray; |
SCM obarray = LEAF_ENVIRONMENT (env)->obarray; |
909 |
|
|
910 |
for (i = 0; i < SCM_VECTOR_LENGTH (obarray); i++) |
for (i = 0; i < SCM_HASHTABLE_N_BUCKETS (obarray); i++) |
911 |
{ |
{ |
912 |
SCM l; |
SCM l; |
913 |
for (l = SCM_VELTS (obarray)[i]; !SCM_NULLP (l); l = SCM_CDR (l)) |
for (l = SCM_HASHTABLE_BUCKETS (obarray)[i]; |
914 |
|
!SCM_NULLP (l); |
915 |
|
l = SCM_CDR (l)) |
916 |
{ |
{ |
917 |
SCM binding = SCM_CAR (l); |
SCM binding = SCM_CAR (l); |
918 |
SCM symbol = SCM_CAR (binding); |
SCM symbol = SCM_CAR (binding); |