summaryrefslogtreecommitdiff
path: root/libguile/objcodes.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2011-02-13 22:02:01 +0100
committerAndy Wingo <wingo@pobox.com>2011-02-13 22:02:01 +0100
commite8ab529d57e2c3820e567737bd53c6e05e484c4d (patch)
tree1abbe3d22607e19d78c10f718513b2d6d43ff392 /libguile/objcodes.c
parent333a81ccbadc7a81abec1aff4b5981b9fad3786b (diff)
downloadguile-e8ab529d57e2c3820e567737bd53c6e05e484c4d.tar.gz
bump objcode version to 2.0; introduce minor-version compatibility
* libguile/_scm.h (SCM_OBJCODE_MAJOR_VERSION): Bump to 2. (SCM_OBJCODE_MINOR_VERSION): Reset to 0. (SCM_OBJCODE_MACHINE_VERSION_STRING, SCM_OBJCODE_COOKIE): Reorder so the minor version is the last byte. * libguile/objcodes.c (make_objcode_by_mmap): Accept objcodes whose minor version is less than SCM_OBJCODE_MINOR_VERSION, not just equal to.
Diffstat (limited to 'libguile/objcodes.c')
-rw-r--r--libguile/objcodes.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/libguile/objcodes.c b/libguile/objcodes.c
index b7aa578ed..f4e20f8f2 100644
--- a/libguile/objcodes.c
+++ b/libguile/objcodes.c
@@ -77,7 +77,13 @@ make_objcode_by_mmap (int fd)
SCM_SYSERROR;
}
- if (memcmp (addr, SCM_OBJCODE_COOKIE, strlen (SCM_OBJCODE_COOKIE)))
+ /* The cookie ends with a version of the form M.N, where M is the
+ major version and N is the minor version. For this Guile to be
+ able to load an objcode, M must be SCM_OBJCODE_MAJOR_VERSION, and N
+ must be less than or equal to SCM_OBJCODE_MINOR_VERSION. Since N
+ is the last character, we do a strict comparison on all but the
+ last, then a <= on the last one. */
+ if (memcmp (addr, SCM_OBJCODE_COOKIE, strlen (SCM_OBJCODE_COOKIE) - 1))
{
SCM args = scm_list_1 (scm_from_latin1_stringn
(addr, strlen (SCM_OBJCODE_COOKIE)));
@@ -86,6 +92,16 @@ make_objcode_by_mmap (int fd)
scm_misc_error (FUNC_NAME, "bad header on object file: ~s", args);
}
+ {
+ char minor_version = addr[strlen (SCM_OBJCODE_COOKIE) - 1];
+
+ if (minor_version > SCM_OBJCODE_MINOR_VERSION_STRING[0])
+ scm_misc_error (FUNC_NAME, "objcode minor version too new (~a > ~a)",
+ scm_list_2 (scm_from_latin1_stringn (&minor_version, 1),
+ scm_from_latin1_string
+ (SCM_OBJCODE_MINOR_VERSION_STRING)));
+ }
+
data = (struct scm_objcode*)(addr + strlen (SCM_OBJCODE_COOKIE));
if (data->len + data->metalen != (st.st_size - sizeof (*data) - strlen (SCM_OBJCODE_COOKIE)))