mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-02 21:10:27 +02:00
Always return `%null-pointer' when creating a NULL pointer with no finalizer.
* libguile/foreign.c (scm_make_pointer): Always call out to `scm_from_pointer'. (scm_from_pointer): Return NULL_POINTER when PTR and FINALIZER are NULL.
This commit is contained in:
parent
5b46a8c2c8
commit
854aa906b4
1 changed files with 20 additions and 20 deletions
|
@ -107,7 +107,6 @@ SCM_DEFINE (scm_make_pointer, "make-pointer", 1, 1, 0,
|
||||||
{
|
{
|
||||||
void *c_finalizer;
|
void *c_finalizer;
|
||||||
scm_t_uintptr c_address;
|
scm_t_uintptr c_address;
|
||||||
SCM result;
|
|
||||||
|
|
||||||
c_address = scm_to_uintptr (address);
|
c_address = scm_to_uintptr (address);
|
||||||
if (SCM_UNBNDP (finalizer))
|
if (SCM_UNBNDP (finalizer))
|
||||||
|
@ -118,12 +117,7 @@ SCM_DEFINE (scm_make_pointer, "make-pointer", 1, 1, 0,
|
||||||
c_finalizer = SCM_POINTER_VALUE (finalizer);
|
c_finalizer = SCM_POINTER_VALUE (finalizer);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (c_address == 0 && c_finalizer == NULL)
|
return scm_from_pointer ((void *) c_address, c_finalizer);
|
||||||
result = null_pointer;
|
|
||||||
else
|
|
||||||
result = scm_from_pointer ((void *) c_address, c_finalizer);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
#undef FUNC_NAME
|
#undef FUNC_NAME
|
||||||
|
|
||||||
|
@ -131,21 +125,27 @@ SCM
|
||||||
scm_from_pointer (void *ptr, scm_t_pointer_finalizer finalizer)
|
scm_from_pointer (void *ptr, scm_t_pointer_finalizer finalizer)
|
||||||
{
|
{
|
||||||
SCM ret;
|
SCM ret;
|
||||||
scm_t_bits word0;
|
|
||||||
|
|
||||||
word0 = scm_tc7_pointer | (finalizer ? (1 << 16UL) : 0UL);
|
if (ptr == NULL && finalizer == NULL)
|
||||||
|
ret = null_pointer;
|
||||||
ret = scm_cell (word0, (scm_t_bits) ptr);
|
else
|
||||||
if (finalizer)
|
|
||||||
{
|
{
|
||||||
/* Register a finalizer for the newly created instance. */
|
scm_t_bits type;
|
||||||
GC_finalization_proc prev_finalizer;
|
|
||||||
GC_PTR prev_finalizer_data;
|
type = scm_tc7_pointer | (finalizer ? (1 << 16UL) : 0UL);
|
||||||
GC_REGISTER_FINALIZER_NO_ORDER (SCM2PTR (ret),
|
ret = scm_cell (type, (scm_t_bits) ptr);
|
||||||
pointer_finalizer_trampoline,
|
|
||||||
finalizer,
|
if (finalizer)
|
||||||
&prev_finalizer,
|
{
|
||||||
&prev_finalizer_data);
|
/* Register a finalizer for the newly created instance. */
|
||||||
|
GC_finalization_proc prev_finalizer;
|
||||||
|
GC_PTR prev_finalizer_data;
|
||||||
|
GC_REGISTER_FINALIZER_NO_ORDER (SCM2PTR (ret),
|
||||||
|
pointer_finalizer_trampoline,
|
||||||
|
finalizer,
|
||||||
|
&prev_finalizer,
|
||||||
|
&prev_finalizer_data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue