From 7884975a890a461fb62178eeb3dfbb8b30b28ba2 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Mon, 6 Sep 2010 13:58:13 +0200 Subject: [PATCH] fix to program-module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * libguile/programs.c (scm_program_module): Fix an edge case in which this function returned non-modules. Thanks to José Antonio Ortega Ruiz, Caballero del Cálculo Lambda for the report. --- libguile/programs.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/libguile/programs.c b/libguile/programs.c index 12baf68b6..3a14f65ed 100644 --- a/libguile/programs.c +++ b/libguile/programs.c @@ -150,10 +150,17 @@ SCM_DEFINE (scm_program_module, "program-module", 1, 0, 0, "") #define FUNC_NAME s_scm_program_module { - SCM objs; + SCM objs, mod; SCM_VALIDATE_PROGRAM (1, program); objs = SCM_PROGRAM_OBJTABLE (program); - return scm_is_true (objs) ? scm_c_vector_ref (objs, 0) : SCM_BOOL_F; + /* If a program is the result of compiling GLIL to assembly, then if + it has an objtable, the first entry will be a module. But some + programs are hand-coded trampolines, like boot programs and + primitives and the like. So if a program happens to have a + non-module in the first slot of the objtable, assume that it is + such a trampoline, and just return #f for the module. */ + mod = scm_is_true (objs) ? scm_c_vector_ref (objs, 0) : SCM_BOOL_F; + return SCM_MODULEP (mod) ? mod : SCM_BOOL_F; } #undef FUNC_NAME