summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2009-10-16 11:59:30 +0200
committerAndy Wingo <wingo@pobox.com>2009-10-16 11:59:30 +0200
commitb0fae4ecaa9f602f3183c35eb945c8050e1f3b68 (patch)
treed4aeb48a6f1d2778adb1f549c0de50a37c95101a
parent96e15df109ccfdcc2f6b2cffc0b64a083f000903 (diff)
downloadguile-b0fae4ecaa9f602f3183c35eb945c8050e1f3b68.tar.gz
bitvector tweaks
* libguile/arrays.c (scm_from_contiguous_typed_array): * libguile/bytevectors.c (scm_uniform_array_to_bytevector): Error if the uniform element size is more than 8 bits, but not divisible by 8 -- because our math could overflow in that case. * module/ice-9/deprecated.scm (#\y): Indeed, #* is the valid bitvector syntax :)
-rw-r--r--libguile/arrays.c5
-rw-r--r--libguile/bytevectors.c5
-rw-r--r--module/ice-9/deprecated.scm2
3 files changed, 9 insertions, 3 deletions
diff --git a/libguile/arrays.c b/libguile/arrays.c
index 1fd6d9245..8dc1d7888 100644
--- a/libguile/arrays.c
+++ b/libguile/arrays.c
@@ -241,12 +241,15 @@ scm_from_contiguous_typed_array (SCM type, SCM bounds, const void *bytes,
if (byte_len / (sz / 8) != rlen)
SCM_MISC_ERROR ("byte length and dimensions do not match", SCM_EOL);
}
- else
+ else if (sz < 8)
{
/* byte_len ?= ceil (rlen * sz / 8) */
if (byte_len != (rlen * sz + 7) / 8)
SCM_MISC_ERROR ("byte length and dimensions do not match", SCM_EOL);
}
+ else
+ /* an internal guile error, really */
+ SCM_MISC_ERROR ("uniform elements larger than 8 bits must fill whole bytes", SCM_EOL);
memcpy (elts, bytes, byte_len);
diff --git a/libguile/bytevectors.c b/libguile/bytevectors.c
index e0998197c..b9d2d8926 100644
--- a/libguile/bytevectors.c
+++ b/libguile/bytevectors.c
@@ -604,9 +604,12 @@ SCM_DEFINE (scm_uniform_array_to_bytevector, "uniform-array->bytevector",
sz = scm_array_handle_uniform_element_bit_size (&h);
if (sz >= 8 && ((sz % 8) == 0))
byte_len = len * (sz / 8);
- else
+ else if (sz < 8)
/* byte_len = ceil (len * sz / 8) */
byte_len = (len * sz + 7) / 8;
+ else
+ /* an internal guile error, really */
+ SCM_MISC_ERROR ("uniform elements larger than 8 bits must fill whole bytes", SCM_EOL);
ret = make_bytevector (byte_len, SCM_ARRAY_ELEMENT_TYPE_VU8);
memcpy (SCM_BYTEVECTOR_CONTENTS (ret), elts, byte_len);
diff --git a/module/ice-9/deprecated.scm b/module/ice-9/deprecated.scm
index 838df2df6..c55e13b28 100644
--- a/module/ice-9/deprecated.scm
+++ b/module/ice-9/deprecated.scm
@@ -190,7 +190,7 @@
#\y
(lambda (c port)
(issue-deprecation-warning
- "The `#y' bitvector syntax is deprecated. Use `bitvector' instead.")
+ "The `#y' bitvector syntax is deprecated. Use `#*' instead.")
(let ((x (read port)))
(cond
((list? x)