* 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
On 1/17/21 2:24 PM, Rob Browning wrote: > * 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). Does this mean I can swap out this code for something better now? I've disliked this code for years. > static SCM > ag_scm_c_eval_string_from_file_line( > char const * pzExpr, char const * pzFile, int line) > { > SCM port = scm_open_input_string(AG_SCM_FROM_STR(pzExpr)); > > if (OPT_VALUE_TRACE >= TRACE_EVERYTHING) > fprintf(trace_fp, TRACE_EVAL_STRING, pzFile, line, pzExpr); > > { > static SCM file = SCM_UNDEFINED; > static char * pzOldFile = NULL; > > if ((pzOldFile == NULL) || (strcmp(pzOldFile, pzFile) != 0)) { > if (pzOldFile != NULL) > AGFREE(pzOldFile); > AGDUPSTR(pzOldFile, pzFile, "scheme source"); > file = AG_SCM_FROM_STR(pzFile); > } > > { > SCM ln = scm_from_int(line); > scm_set_port_filename_x(port, file); > scm_set_port_line_x(port, ln); > scm_set_port_column_x(port, SCM_INUM0); > } > } > > { > SCM ans = SCM_UNSPECIFIED; > > /* Read expressions from that port; ignore the values. */ > for (;;) { > SCM form = scm_read(port); > if (SCM_EOF_OBJECT_P(form)) > break; > ans = scm_primitive_eval_x(form); > } > > return ans; > } > }
On Sun 17 Jan 2021 23:55, Bruce Korb <bkorb@gnu.org> writes:
> [Can I] swap out this code for something better now? I've disliked
> this code for years.
>
>> static SCM
>> ag_scm_c_eval_string_from_file_line(
>> char const * pzExpr, char const * pzFile, int line)
Since Guile 2.0.1 you can
(use-modules (ice-9 eval-string))
(eval-string str #:file file #:line line)
From C:
SCM_KEYWORD (k_file, "file");
SCM_KEYWORD (k_line, "line");
...
SCM ans =
scm_call_5 (scm_c_public_ref ("ice-9 eval-string", "eval-string"),
scm_from_utf8_string (str),
k_file, scm_from utf8_string (file),
k_line, scm_from_int (line));
Regards,
Andy