[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:
parent
4f7aeb6bdb
commit
b63f275984
8 changed files with 138 additions and 28 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 &
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue