* libguile/srcprop.c (scm_set_source_properties_x): When only a subset of file, line, and column fields are specified, store the data as a srcprops object (tc16_srcprops) rather than an alist. ---
Proposed for at least 3.x. If we want some additional tests, then one option might be a public or private predicate to test for a srcprops object (at least for scheme level testing). libguile/srcprop.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/libguile/srcprop.c b/libguile/srcprop.c index 0ebbfc301..fea68e031 100644 --- a/libguile/srcprop.c +++ b/libguile/srcprop.c @@ -168,8 +168,6 @@ SCM_DEFINE (scm_source_properties, "source-properties", 1, 0, 0, #define SCM_VALIDATE_NIM(pos, scm) \ SCM_MAKE_VALIDATE_MSG (pos, scm, NIMP, "non-immediate") -/* Perhaps this procedure should look through an alist - and try to make a srcprops-object...? */ SCM_DEFINE (scm_set_source_properties_x, "set-source-properties!", 2, 0, 0, (SCM obj, SCM alist), "Install the association list @var{alist} as the source property\n" @@ -177,9 +175,17 @@ SCM_DEFINE (scm_set_source_properties_x, "set-source-properties!", 2, 0, 0, #define FUNC_NAME s_scm_set_source_properties_x { SCM_VALIDATE_NIM (1, obj); - - scm_weak_table_putq_x (scm_source_whash, obj, alist); - + SCM fname = scm_assq_ref (alist, scm_sym_filename); + SCM col = scm_assq_ref (alist, scm_sym_column); + SCM line = scm_assq_ref (alist, scm_sym_line); + const int n = ((fname == SCM_BOOL_F) ? 0 : 1) + + ((col == SCM_BOOL_F) ? 0 : 1) + + ((line == SCM_BOOL_F) ? 0 : 1); + + if (scm_ilength (alist) == n) + scm_i_set_source_properties_x (obj, line, col, fname); + else + scm_weak_table_putq_x (scm_source_whash, obj, alist); return alist; } #undef FUNC_NAME -- 2.29.2