[MzScheme] Typemaps for all integral types now accept the full range

of integral values, and they signal an error when a value outside the
valid range is passed.

[Guile] Typemaps for all integral types now signal an error when a
value outside the valid range is passed.


git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@8844 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Matthias Köppe 2006-02-19 19:28:42 +00:00
commit b63f275984
8 changed files with 138 additions and 28 deletions

View file

@ -8,6 +8,7 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <escheme.h>
#ifdef __cplusplus
@ -46,6 +47,50 @@ extern "C" {
#define MAXVALUES 6
#define swig_make_boolean(b) (b ? scheme_true : scheme_false)
static long
SWIG_convert_integer(Scheme_Object *o,
long lower_bound, long upper_bound,
const char *func_name, int argnum, int argc,
Scheme_Object **argv)
{
long value;
int status = scheme_get_int_val(o, &value);
if (!status)
scheme_wrong_type(func_name, "integer", argnum, argc, argv);
if (value < lower_bound || value > upper_bound)
scheme_wrong_type(func_name, "integer", argnum, argc, argv);
return value;
}
static int
SWIG_is_integer(Scheme_Object *o)
{
long value;
return scheme_get_int_val(o, &value);
}
static unsigned long
SWIG_convert_unsigned_integer(Scheme_Object *o,
unsigned long lower_bound, unsigned long upper_bound,
const char *func_name, int argnum, int argc,
Scheme_Object **argv)
{
unsigned long value;
int status = scheme_get_unsigned_int_val(o, &value);
if (!status)
scheme_wrong_type(func_name, "integer", argnum, argc, argv);
if (value < lower_bound || value > upper_bound)
scheme_wrong_type(func_name, "integer", argnum, argc, argv);
return value;
}
static int
SWIG_is_unsigned_integer(Scheme_Object *o)
{
unsigned long value;
return scheme_get_unsigned_int_val(o, &value);
}
/* -----------------------------------------------------------------------
* mzscheme 30X support code
* Contributed by Hans Oesterholt

View file

@ -14,6 +14,27 @@
#define SWIG_malloc(size) swig_malloc(size, FUNC_NAME)
#define SWIG_free(mem) free(mem)
#define SWIG_convert_short(o) \
SWIG_convert_integer(o, - (1 << (8 * sizeof(short) - 1)), \
(1 << (8 * sizeof(short) - 1)) - 1, \
FUNC_NAME, $argnum-1, argc, argv)
#define SWIG_convert_int(o) \
SWIG_convert_integer(o, INT_MIN, INT_MAX, \
FUNC_NAME, $argnum-1, argc, argv)
#define SWIG_convert_long(o) \
SWIG_convert_integer(o, LONG_MIN, LONG_MAX, \
FUNC_NAME, $argnum-1, argc, argv)
#define SWIG_convert_unsigned_short(o) \
SWIG_convert_unsigned_integer(o, 0, \
(1 << (8 * sizeof(short))) - 1, \
FUNC_NAME, $argnum-1, argc, argv)
#define SWIG_convert_unsigned_int(o) \
SWIG_convert_unsigned_integer(o, 0, UINT_MAX, \
FUNC_NAME, $argnum-1, argc, argv)
#define SWIG_convert_unsigned_long(o) \
SWIG_convert_unsigned_integer(o, 0, ULONG_MAX, \
FUNC_NAME, $argnum-1, argc, argv)
/* Guile compatibility kludges */
#define SCM_VALIDATE_VECTOR(argnum, value) (void)0
#define SCM_VALIDATE_LIST(argnum, value) (void)0

View file

@ -1,5 +1,5 @@
/* typemaps.i --- mzscheme typemaps -*- c -*-
Copyright 2000, 2001, 2004 Matthias Koeppe <mkoeppe@mail.math.uni-magdeburg.de>
Copyright 2000, 2001, 2004, 2006 Matthias Koeppe <mkoeppe@mail.math.uni-magdeburg.de>
Based on code written by Oleg Tolmatcev.
$Id$
@ -89,15 +89,15 @@
/* Enums */
%typemap(in) enum SWIGTYPE {
if (!SCHEME_INTP($input))
if (!SWIG_is_integer($input))
scheme_wrong_type(FUNC_NAME, "integer", $argnum - 1, argc, argv);
$1 = ($1_type) SCHEME_INT_VAL($input);
$1 = ($1_type) SWIG_convert_int($input);
}
%typemap(varin) enum SWIGTYPE {
if (!SCHEME_INTP($input))
if (!SWIG_is_integer($input))
scheme_wrong_type(FUNC_NAME, "integer", 0, argc, argv);
$1 = ($1_type) SCHEME_INT_VAL($input);
$1 = ($1_type) SWIG_convert_int($input);
}
%typemap(out) enum SWIGTYPE "$result = scheme_make_integer_value($1);";
@ -194,21 +194,21 @@ SIMPLE_MAP(char, SCHEME_CHARP, SCHEME_CHAR_VAL,
scheme_make_character, character);
SIMPLE_MAP(unsigned char, SCHEME_CHARP, SCHEME_CHAR_VAL,
scheme_make_character, character);
SIMPLE_MAP(int, SCHEME_INTP, SCHEME_INT_VAL,
SIMPLE_MAP(int, SWIG_is_integer, SWIG_convert_int,
scheme_make_integer_value, integer);
SIMPLE_MAP(short, SCHEME_INTP, SCHEME_INT_VAL,
SIMPLE_MAP(short, SWIG_is_integer, SWIG_convert_short,
scheme_make_integer_value, integer);
SIMPLE_MAP(long, SCHEME_INTP, SCHEME_INT_VAL,
SIMPLE_MAP(long, SWIG_is_integer, SWIG_convert_long,
scheme_make_integer_value, integer);
SIMPLE_MAP(ptrdiff_t, SCHEME_INTP, SCHEME_INT_VAL,
SIMPLE_MAP(ptrdiff_t, SWIG_is_integer, SWIG_convert_long,
scheme_make_integer_value, integer);
SIMPLE_MAP(unsigned int, SCHEME_INTP, SCHEME_INT_VAL,
SIMPLE_MAP(unsigned int, SWIG_is_unsigned_integer, SWIG_convert_unsigned_int,
scheme_make_integer_value_from_unsigned, integer);
SIMPLE_MAP(unsigned short, SCHEME_INTP, SCHEME_INT_VAL,
SIMPLE_MAP(unsigned short, SWIG_is_unsigned_integer, SWIG_convert_unsigned_short,
scheme_make_integer_value_from_unsigned, integer);
SIMPLE_MAP(unsigned long, SCHEME_INTP, SCHEME_INT_VAL,
SIMPLE_MAP(unsigned long, SWIG_is_unsigned_integer, SWIG_convert_unsigned_long,
scheme_make_integer_value_from_unsigned, integer);
SIMPLE_MAP(size_t, SCHEME_INTP, SCHEME_INT_VAL,
SIMPLE_MAP(size_t, SWIG_is_unsigned_integer, SWIG_convert_unsigned_long,
scheme_make_integer_value_from_unsigned, integer);
SIMPLE_MAP(float, SCHEME_REALP, scheme_real_to_double,
scheme_make_double, real);
@ -248,17 +248,17 @@ REF_MAP(char, SCHEME_CHARP, SCHEME_CHAR_VAL,
scheme_make_character, character);
REF_MAP(unsigned char, SCHEME_CHARP, SCHEME_CHAR_VAL,
scheme_make_character, character);
REF_MAP(int, SCHEME_INTP, SCHEME_INT_VAL,
REF_MAP(int, SWIG_is_integer, SWIG_convert_int,
scheme_make_integer_value, integer);
REF_MAP(short, SCHEME_INTP, SCHEME_INT_VAL,
REF_MAP(short, SWIG_is_integer, SWIG_convert_short,
scheme_make_integer_value, integer);
REF_MAP(long, SCHEME_INTP, SCHEME_INT_VAL,
REF_MAP(long, SWIG_is_integer, SWIG_convert_long,
scheme_make_integer_value, integer);
REF_MAP(unsigned int, SCHEME_INTP, SCHEME_INT_VAL,
REF_MAP(unsigned int, SWIG_is_unsigned_integer, SWIG_convert_unsigned_int,
scheme_make_integer_value_from_unsigned, integer);
REF_MAP(unsigned short, SCHEME_INTP, SCHEME_INT_VAL,
REF_MAP(unsigned short, SWIG_is_unsigned_integer, SWIG_convert_unsigned_short,
scheme_make_integer_value_from_unsigned, integer);
REF_MAP(unsigned long, SCHEME_INTP, SCHEME_INT_VAL,
REF_MAP(unsigned long, SWIG_is_unsigned_integer, SWIG_convert_unsigned_long,
scheme_make_integer_value_from_unsigned, integer);
REF_MAP(float, SCHEME_REALP, scheme_real_to_double,
scheme_make_double, real);
@ -301,7 +301,7 @@ REF_MAP(double, SCHEME_REALP, scheme_real_to_double,
const long long &, const unsigned long long &,
enum SWIGTYPE
{
$1 = (SCHEME_INTP($input)) ? 1 : 0;
$1 = (SWIG_is_integer($input)) ? 1 : 0;
}
%typecheck(SWIG_TYPECHECK_BOOL) bool, bool &, const bool &