[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@8844 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
570a3bf514
commit
bf1f3e4c09
8 changed files with 138 additions and 28 deletions
|
|
@ -9,8 +9,8 @@
|
|||
(define-macro (check-range function from to)
|
||||
`(begin (check-equality (,function ,from) ,from)
|
||||
(check-equality (,function ,to) ,to)
|
||||
(check-equality (throws-exception? (- ,from 1)) #t)
|
||||
(check-equality (throws-exception? (+ ,to 1)) #t)))
|
||||
(check-equality (throws-exception? (,function (- ,from 1))) #t)
|
||||
(check-equality (throws-exception? (,function (+ ,to 1))) #t)))
|
||||
|
||||
;;; signed char, unsigned char typemaps deal with characters, not integers.
|
||||
;; (check-range signed-char-identity (- (expt 2 7)) (- (expt 2 7) 1))
|
||||
|
|
@ -21,7 +21,8 @@
|
|||
(check-range unsigned-int-identity 0 (- (expt 2 32) 1))
|
||||
(check-range signed-long-identity (- (expt 2 31)) (- (expt 2 31) 1))
|
||||
(check-range unsigned-long-identity 0 (- (expt 2 32) 1))
|
||||
;;; long long not implemented in Guile.
|
||||
;;; long long not implemented in Guile and MzScheme.
|
||||
;; (check-range signed-long-long-identity (- (expt 2 63)) (- (expt 2 63) 1))
|
||||
;; (check-range unsigned-long-long-identity 0 (- (expt 2 64) 1))
|
||||
(quit)
|
||||
|
||||
(exit 0)
|
||||
|
|
|
|||
|
|
@ -19,8 +19,11 @@
|
|||
#define gh_scm2double(a) scm_num2dbl(a, FUNC_NAME)
|
||||
#define gh_scm2int(a) scm_num2int(a, SCM_ARG1, FUNC_NAME)
|
||||
#define gh_scm2long(a) scm_num2long(a, SCM_ARG1, FUNC_NAME)
|
||||
#define gh_scm2short(a) scm_num2short(a, SCM_ARG1, FUNC_NAME)
|
||||
#define gh_scm2newstr SWIG_Guile_scm2newstr
|
||||
#define gh_scm2ulong(a) scm_num2ulong(a, SCM_ARG1, FUNC_NAME)
|
||||
#define gh_scm2ulong(a) scm_num2ulong(a, SCM_ARG1, FUNC_NAME)
|
||||
#define gh_scm2ushort(a) scm_num2ushort(a, SCM_ARG1, FUNC_NAME)
|
||||
#define gh_scm2uint(a) scm_num2uint(a, SCM_ARG1, FUNC_NAME)
|
||||
#define gh_ulong2scm scm_ulong2num
|
||||
#define gh_long2scm scm_long2num
|
||||
#define gh_str02scm scm_makfrom0str
|
||||
|
|
|
|||
|
|
@ -7,6 +7,23 @@
|
|||
|
||||
%runtime "swigrun.swg"
|
||||
%runtime "guile_gh_run.swg"
|
||||
|
||||
#define SWIG_convert_short(o) \
|
||||
SWIG_convert_integer(o, - (1 << (8 * sizeof(short) - 1)), \
|
||||
(1 << (8 * sizeof(short) - 1)) - 1, \
|
||||
FUNC_NAME, $argnum)
|
||||
#define SWIG_convert_unsigned_short(o) \
|
||||
SWIG_convert_unsigned_integer(o, 0, \
|
||||
(1 << (8 * sizeof(short))) - 1, \
|
||||
FUNC_NAME, $argnum)
|
||||
#define SWIG_convert_unsigned_int(o) \
|
||||
SWIG_convert_unsigned_integer(o, 0, UINT_MAX, \
|
||||
FUNC_NAME, $argnum)
|
||||
|
||||
#define gh_scm2short(a) SWIG_convert_short(a)
|
||||
#define gh_scm2ushort(a) SWIG_convert_unsigned_short(a)
|
||||
#define gh_scm2uint(a) SWIG_convert_unsigned_int(a)
|
||||
|
||||
%include <guile.i>
|
||||
|
||||
%runtime %{
|
||||
|
|
|
|||
|
|
@ -68,6 +68,29 @@ GSWIG_scm2char (SCM s)
|
|||
# define SCM_OUTPUT_PORT_P SCM_OUTPORTP
|
||||
#endif
|
||||
|
||||
static long
|
||||
SWIG_convert_integer(SCM o,
|
||||
long lower_bound, long upper_bound,
|
||||
const char *func_name, int argnum)
|
||||
{
|
||||
long value = gh_scm2long(o);
|
||||
if (value < lower_bound || value > upper_bound)
|
||||
scm_wrong_type_arg((char *) func_name, argnum, o);
|
||||
return value;
|
||||
}
|
||||
|
||||
static unsigned long
|
||||
SWIG_convert_unsigned_integer(SCM o,
|
||||
unsigned long lower_bound,
|
||||
unsigned long upper_bound,
|
||||
const char *func_name, int argnum)
|
||||
{
|
||||
unsigned long value = gh_scm2ulong(o);
|
||||
if (value < lower_bound || value > upper_bound)
|
||||
scm_wrong_type_arg((char *) func_name, argnum, o);
|
||||
return value;
|
||||
}
|
||||
|
||||
static swig_type_info *SWIG_Guile_LookupType(swig_module_info *module, SCM s, int normal) {
|
||||
swig_module_info *iter;
|
||||
if (!module) return 0;
|
||||
|
|
|
|||
|
|
@ -263,11 +263,11 @@
|
|||
SIMPLE_MAP(unsigned char, gh_scm2char, gh_char2scm, char);
|
||||
SIMPLE_MAP(signed char, gh_scm2char, gh_char2scm, char);
|
||||
SIMPLE_MAP(int, gh_scm2int, gh_int2scm, integer);
|
||||
SIMPLE_MAP(short, gh_scm2int, gh_int2scm, integer);
|
||||
SIMPLE_MAP(short, gh_scm2short, gh_int2scm, integer);
|
||||
SIMPLE_MAP(long, gh_scm2long, gh_long2scm, integer);
|
||||
SIMPLE_MAP(ptrdiff_t, gh_scm2long, gh_long2scm, integer);
|
||||
SIMPLE_MAP(unsigned int, gh_scm2ulong, gh_ulong2scm, integer);
|
||||
SIMPLE_MAP(unsigned short, gh_scm2ulong, gh_ulong2scm, integer);
|
||||
SIMPLE_MAP(unsigned int, gh_scm2uint, gh_ulong2scm, integer);
|
||||
SIMPLE_MAP(unsigned short, gh_scm2ushort, gh_ulong2scm, integer);
|
||||
SIMPLE_MAP(unsigned long, gh_scm2ulong, gh_ulong2scm, integer);
|
||||
SIMPLE_MAP(size_t, gh_scm2ulong, gh_ulong2scm, integer);
|
||||
SIMPLE_MAP(float, gh_scm2double, gh_double2scm, real);
|
||||
|
|
|
|||
|
|
@ -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