From 0465c8834e2d5066e4ec5cdd378afcb40efd91f0 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Sun, 1 Jul 2018 12:16:50 +0200 Subject: [PATCH 1/2] Refactor deps for built libpath.h * libguile/Makefile.am (BUILT_INCLUDES): Move libpath.h here, from BUILT_SOURCES, so that .x files depend on it. Thanks to Dale Smith for the report. --- libguile/Makefile.am | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/libguile/Makefile.am b/libguile/Makefile.am index 4e782f215..8bf7e2768 100644 --- a/libguile/Makefile.am +++ b/libguile/Makefile.am @@ -449,8 +449,8 @@ vm-operations.h: vm-engine.c | sed -e 's,VM_DEFINE_OP (\(.*\)).*, M (\1) \\,' >> $@ @echo '' >> $@ -BUILT_INCLUDES = vm-operations.h scmconfig.h -BUILT_SOURCES = cpp-E.c cpp-SIG.c libpath.h $(BUILT_INCLUDES) \ +BUILT_INCLUDES = vm-operations.h scmconfig.h libpath.h +BUILT_SOURCES = cpp-E.c cpp-SIG.c $(BUILT_INCLUDES) \ $(DOT_X_FILES) $(EXTRA_DOT_X_FILES) # Force the generation of `guile-procedures.texi' because the top-level @@ -781,8 +781,6 @@ $(DOT_DOC_FILES) $(EXTRA_DOT_DOC_FILES): $(BUILT_INCLUDES) snarf.h guile-snarf-d error.x: cpp-E.c posix.x: cpp-SIG.c -load.x: libpath.h -dynl.x: libpath.h alldotdocfiles = $(DOT_DOC_FILES) $(EXTRA_DOT_DOC_FILES) snarf2checkedtexi = GUILE_AUTO_COMPILE=0 $(top_builddir)/meta/build-env guild snarf-check-and-output-texi From e6461cf1b2b63e3ec9a2867731742db552b61b71 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Mon, 16 Jul 2018 12:16:58 +0200 Subject: [PATCH 2/2] Fix errors introduced when giving multiple-values objects a tc7 * libguile/values.c (scm_c_value_ref): Fix a case in which a request for the 0th value of a zero-valued object would return the object instead of erroring. * libguile/vm-engine.c (halt): Fix construction of a multiple-valued return (off-by-one error). Fixes a crash introduced in 4a2d78b4d463cd29226f3eee776dcad9f64e6152. --- libguile/values.c | 14 ++++++++++---- libguile/vm-engine.c | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/libguile/values.c b/libguile/values.c index 4fd9b5451..8603aa3f1 100644 --- a/libguile/values.c +++ b/libguile/values.c @@ -59,10 +59,16 @@ scm_c_nvalues (SCM obj) SCM scm_c_value_ref (SCM obj, size_t idx) { - if (SCM_LIKELY (scm_is_values (obj) && idx < scm_i_nvalues (obj))) - return scm_i_value_ref (obj, idx); - else if (idx == 0) - return obj; + if (scm_is_values (obj)) + { + if (idx < scm_i_nvalues (obj)) + return scm_i_value_ref (obj, idx); + } + else + { + if (idx == 0) + return obj; + } scm_error (scm_out_of_range_key, "scm_c_value_ref", diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c index d08ebbb74..7305beebb 100644 --- a/libguile/vm-engine.c +++ b/libguile/vm-engine.c @@ -335,7 +335,7 @@ VM_NAME (scm_thread *thread) VM_ASSERT (nvals <= (UINTPTR_MAX >> 8), abort ()); ret = scm_words ((nvals << 8) | scm_tc7_values, nvals + 1); for (n = 0; n < nvals; n++) - SCM_SET_CELL_OBJECT (ret, n+1, FP_REF (4 + n - 1)); + SCM_SET_CELL_OBJECT (ret, n+1, FP_REF (4 + n)); } VP->ip = SCM_FRAME_RETURN_ADDRESS (VP->fp);