From 41689edfc31dd7e0438d776754d550311a878ce5 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Tue, 10 Apr 2018 19:54:58 +0200 Subject: [PATCH] Slim heap-allocated flonums * libguile/numbers.h (struct scm_t_double, struct scm_t_complex): Avoid adding an extra padding word on systems with 8-byte pointers. * module/system/base/types.scm (cell->object): Update to compute correct offset of embedded double. --- libguile/numbers.h | 6 +++++- module/system/base/types.scm | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/libguile/numbers.h b/libguile/numbers.h index 83bcc9ea7..c07082eb1 100644 --- a/libguile/numbers.h +++ b/libguile/numbers.h @@ -4,7 +4,7 @@ #define SCM_NUMBERS_H /* Copyright (C) 1995, 1996, 1998, 2000-2006, 2008-2011, 2013, 2014, - * 2016, 2017 Free Software Foundation, Inc. + * 2016-2018 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 @@ -172,14 +172,18 @@ typedef long scm_t_inum; typedef struct scm_t_double { SCM type; +#if SCM_SIZEOF_UINTPTR_T != 8 SCM pad; +#endif double real; } scm_t_double; typedef struct scm_t_complex { SCM type; +#if SCM_SIZEOF_UINTPTR_T != 8 SCM pad; +#endif double real; double imag; } scm_t_complex; diff --git a/module/system/base/types.scm b/module/system/base/types.scm index c6aaed242..834fa5f38 100644 --- a/module/system/base/types.scm +++ b/module/system/base/types.scm @@ -1,5 +1,5 @@ ;;; 'SCM' type tag decoding. -;;; Copyright (C) 2014, 2015, 2017 Free Software Foundation, Inc. +;;; Copyright (C) 2014, 2015, 2017, 2018 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 as published by @@ -419,7 +419,7 @@ using BACKEND." (((_ & #xffff = %tc16-bignum)) (inferior-object 'bignum address)) (((_ & #xffff = %tc16-flonum) pad) - (let* ((address (+ address (* 2 %word-size))) + (let* ((address (+ address (match %word-size (4 8) (8 8)))) (port (memory-port backend address (sizeof double))) (words (get-bytevector-n port (sizeof double)))) (bytevector-ieee-double-ref words 0 (native-endianness))))