diff options
author | Andy Wingo <wingo@pobox.com> | 2011-02-13 22:02:01 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2011-02-13 22:02:01 +0100 |
commit | e8ab529d57e2c3820e567737bd53c6e05e484c4d (patch) | |
tree | 1abbe3d22607e19d78c10f718513b2d6d43ff392 | |
parent | 333a81ccbadc7a81abec1aff4b5981b9fad3786b (diff) | |
download | guile-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.
-rw-r--r-- | libguile/_scm.h | 10 | ||||
-rw-r--r-- | libguile/objcodes.c | 18 |
2 files changed, 22 insertions, 6 deletions
diff --git a/libguile/_scm.h b/libguile/_scm.h index 5421116e4..284213032 100644 --- a/libguile/_scm.h +++ b/libguile/_scm.h @@ -3,7 +3,7 @@ #ifndef SCM__SCM_H #define SCM__SCM_H -/* Copyright (C) 1995,1996,2000,2001, 2002, 2006, 2008, 2009, 2010 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,2000,2001, 2002, 2006, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -205,8 +205,8 @@ #define SCM_OBJCODE_WORD_SIZE SCM_CPP_STRINGIFY (SIZEOF_VOID_P) /* Major and minor versions must be single characters. */ -#define SCM_OBJCODE_MAJOR_VERSION 0 -#define SCM_OBJCODE_MINOR_VERSION T +#define SCM_OBJCODE_MAJOR_VERSION 2 +#define SCM_OBJCODE_MINOR_VERSION 0 #define SCM_OBJCODE_MAJOR_VERSION_STRING \ SCM_CPP_STRINGIFY(SCM_OBJCODE_MAJOR_VERSION) #define SCM_OBJCODE_MINOR_VERSION_STRING \ @@ -214,11 +214,11 @@ #define SCM_OBJCODE_VERSION_STRING \ SCM_OBJCODE_MAJOR_VERSION_STRING "." SCM_OBJCODE_MINOR_VERSION_STRING #define SCM_OBJCODE_MACHINE_VERSION_STRING \ - SCM_OBJCODE_VERSION_STRING "-" SCM_OBJCODE_ENDIANNESS "-" SCM_OBJCODE_WORD_SIZE + SCM_OBJCODE_ENDIANNESS "-" SCM_OBJCODE_WORD_SIZE "-" SCM_OBJCODE_VERSION_STRING /* The objcode magic header. */ #define SCM_OBJCODE_COOKIE \ - "GOOF-" SCM_OBJCODE_MACHINE_VERSION_STRING "---" + "GOOF----" SCM_OBJCODE_MACHINE_VERSION_STRING #endif /* SCM__SCM_H */ 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))) |