summaryrefslogtreecommitdiff
path: root/libguile/programs.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2010-09-06 13:58:13 +0200
committerAndy Wingo <wingo@pobox.com>2010-09-06 13:58:13 +0200
commit7884975a890a461fb62178eeb3dfbb8b30b28ba2 (patch)
treef048cc3c6e520525cf32d27b2cdbc0890e47820b /libguile/programs.c
parentcb5a528382d9aaa349dc7234a4ce9c682a2e6837 (diff)
downloadguile-7884975a890a461fb62178eeb3dfbb8b30b28ba2.tar.gz
fix to program-module
* 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.
Diffstat (limited to 'libguile/programs.c')
-rw-r--r--libguile/programs.c11
1 files 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