mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-07-04 08:40:21 +02:00
scm_gc_object_address pins its referent
* libguile/gc.h: * libguile/gc.c (scm_gc_pin_object): New function. (scm_gc_object_address): New function, to be used instead of SCM_UNPACK when an object's address is exposed, for example via hashq. * libguile/atomic.c: * libguile/cache-internal.h: * libguile/continuations.c: * libguile/dynstack.c: * libguile/dynstack.h: * libguile/ephemerons.c: * libguile/exceptions.c: * libguile/finalizers.c: * libguile/fluids-internal.h: * libguile/fluids.c: * libguile/foreign.c: * libguile/frames.c: * libguile/hash.c: * libguile/hashtab.c: * libguile/intrinsics.c: * libguile/memoize.c: * libguile/print.c: * libguile/programs.c: * libguile/smob.c: * libguile/struct.c: * libguile/struct.h: * libguile/variable.c: * libguile/vm.c: Use the new functions everywhere that is needed. Because they take a thread, sometimes we have to do some extra plumbing.
This commit is contained in:
parent
b0ce014801
commit
a7d7ff5019
25 changed files with 133 additions and 117 deletions
|
@ -276,7 +276,7 @@ scm_dynstack_push_unwinder (scm_t_dynstack *dynstack,
|
|||
binding. */
|
||||
void
|
||||
scm_dynstack_push_fluid (scm_t_dynstack *dynstack, SCM fluid, SCM value,
|
||||
scm_t_dynamic_state *dynamic_state)
|
||||
scm_thread *thread)
|
||||
{
|
||||
scm_t_bits *words;
|
||||
SCM value_box;
|
||||
|
@ -292,7 +292,7 @@ scm_dynstack_push_fluid (scm_t_dynstack *dynstack, SCM fluid, SCM value,
|
|||
words[1] = SCM_UNPACK (value_box);
|
||||
|
||||
/* Go ahead and swap them. */
|
||||
scm_swap_fluid (fluid, value_box, dynamic_state);
|
||||
scm_swap_fluid (thread, fluid, value_box);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -440,9 +440,9 @@ scm_dynstack_wind_1 (scm_t_dynstack *dynstack, scm_t_bits *item)
|
|||
break;
|
||||
|
||||
case SCM_DYNSTACK_TYPE_WITH_FLUID:
|
||||
scm_swap_fluid (WITH_FLUID_FLUID (item),
|
||||
WITH_FLUID_VALUE_BOX (item),
|
||||
&SCM_I_CURRENT_THREAD->dynamic_state);
|
||||
scm_swap_fluid (SCM_I_CURRENT_THREAD,
|
||||
WITH_FLUID_FLUID (item),
|
||||
WITH_FLUID_VALUE_BOX (item));
|
||||
break;
|
||||
|
||||
case SCM_DYNSTACK_TYPE_PROMPT:
|
||||
|
@ -497,9 +497,9 @@ scm_dynstack_unwind_1 (scm_t_dynstack *dynstack)
|
|||
break;
|
||||
|
||||
case SCM_DYNSTACK_TYPE_WITH_FLUID:
|
||||
scm_swap_fluid (WITH_FLUID_FLUID (words),
|
||||
WITH_FLUID_VALUE_BOX (words),
|
||||
&SCM_I_CURRENT_THREAD->dynamic_state);
|
||||
scm_swap_fluid (SCM_I_CURRENT_THREAD,
|
||||
WITH_FLUID_FLUID (words),
|
||||
WITH_FLUID_VALUE_BOX (words));
|
||||
clear_scm_t_bits (words, WITH_FLUID_WORDS);
|
||||
break;
|
||||
|
||||
|
@ -739,8 +739,7 @@ scm_dynstack_unwind_frame (scm_t_dynstack *dynstack)
|
|||
|
||||
/* This function must not allocate. */
|
||||
void
|
||||
scm_dynstack_unwind_fluid (scm_t_dynstack *dynstack,
|
||||
scm_t_dynamic_state *dynamic_state)
|
||||
scm_dynstack_unwind_fluid (scm_t_dynstack *dynstack, scm_thread *thread)
|
||||
{
|
||||
scm_t_bits tag, *words;
|
||||
size_t len;
|
||||
|
@ -751,8 +750,7 @@ scm_dynstack_unwind_fluid (scm_t_dynstack *dynstack,
|
|||
assert (SCM_DYNSTACK_TAG_TYPE (tag) == SCM_DYNSTACK_TYPE_WITH_FLUID);
|
||||
assert (len == WITH_FLUID_WORDS);
|
||||
|
||||
scm_swap_fluid (WITH_FLUID_FLUID (words), WITH_FLUID_VALUE_BOX (words),
|
||||
dynamic_state);
|
||||
scm_swap_fluid (thread, WITH_FLUID_FLUID (words), WITH_FLUID_VALUE_BOX (words));
|
||||
clear_scm_t_bits (words, len);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue