summaryrefslogtreecommitdiff
path: root/libguile/inline.h
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2009-08-25 18:04:02 +0200
committerAndy Wingo <wingo@pobox.com>2009-08-25 18:04:02 +0200
commit108e18b18abc066b2709a09283751e9138ccc935 (patch)
treef55cf91309b7b069bc2f2d725fb788aa08870fa5 /libguile/inline.h
parentc15d8e6ab9bf991ca55038fa895993bbb4c1efaa (diff)
parentcd43fdc5b7a7c851ee0f2b4e96a1f394fb50d869 (diff)
downloadguile-108e18b18abc066b2709a09283751e9138ccc935.tar.gz
Merge wip-array refactor, up to cd43fdc5b7a7c
Conflicts: NEWS libguile/print.c
Diffstat (limited to 'libguile/inline.h')
-rw-r--r--libguile/inline.h17
1 files changed, 13 insertions, 4 deletions
diff --git a/libguile/inline.h b/libguile/inline.h
index cb908581d..f7a216d7d 100644
--- a/libguile/inline.h
+++ b/libguile/inline.h
@@ -3,7 +3,7 @@
#ifndef SCM_INLINE_H
#define SCM_INLINE_H
-/* Copyright (C) 2001, 2002, 2003, 2004, 2006, 2008 Free Software Foundation, Inc.
+/* Copyright (C) 2001, 2002, 2003, 2004, 2006, 2008, 2009 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
@@ -34,8 +34,9 @@
#include "libguile/pairs.h"
#include "libguile/gc.h"
#include "libguile/threads.h"
-#include "libguile/unif.h"
+#include "libguile/array-handle.h"
#include "libguile/ports.h"
+#include "libguile/numbers.h"
#include "libguile/error.h"
@@ -241,7 +242,11 @@ SCM_C_EXTERN_INLINE
SCM
scm_array_handle_ref (scm_t_array_handle *h, ssize_t p)
{
- return h->ref (h, p);
+ if (SCM_UNLIKELY (p < 0 && -p > h->base))
+ /* catch overflow */
+ scm_out_of_range (NULL, scm_from_ssize_t (p));
+ /* perhaps should catch overflow here too */
+ return h->impl->vref (h, h->base + p);
}
#ifndef SCM_INLINE_C_INCLUDING_INLINE_H
@@ -250,7 +255,11 @@ SCM_C_EXTERN_INLINE
void
scm_array_handle_set (scm_t_array_handle *h, ssize_t p, SCM v)
{
- h->set (h, p, v);
+ if (SCM_UNLIKELY (p < 0 && -p > h->base))
+ /* catch overflow */
+ scm_out_of_range (NULL, scm_from_ssize_t (p));
+ /* perhaps should catch overflow here too */
+ h->impl->vset (h, h->base + p, v);
}
#ifndef SCM_INLINE_C_INCLUDING_INLINE_H