Added unit test using C99 INFINITY. This test actually tests a float
conversion bug where converting to float imposed overflow checking which should not be there and causes this program to error out. This was seen originally in Javascript, but it turns out Python has the same bug. Lua does not have this bug. Other generators have not been tested. This test also tests the rename feature. The Javascript generator was not renaming the variable correctly.
This commit is contained in:
parent
1729fac360
commit
e01e337d75
2 changed files with 53 additions and 0 deletions
49
Examples/test-suite/infinity.i
Normal file
49
Examples/test-suite/infinity.i
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
%module infinity
|
||||
|
||||
#include <math.h>
|
||||
|
||||
/* C99 defines INFINITY
|
||||
Because INFINITY may be defined by compiler built-ins, we can't use #define.
|
||||
Instead, expose the variable MYINFINITY and then use %rename to make it INFINITY in the scripting language.
|
||||
*/
|
||||
%rename(INFINITY) MYINFINITY;
|
||||
|
||||
|
||||
%inline %{
|
||||
#include <math.h>
|
||||
|
||||
/* C99 math.h defines INFINITY. If not available, this is the fallback. */
|
||||
#ifndef INFINITY
|
||||
#ifdef _MSC_VER
|
||||
union MSVC_EVIL_FLOAT_HACK
|
||||
{
|
||||
unsigned __int8 Bytes[4];
|
||||
float Value;
|
||||
};
|
||||
static union MSVC_EVIL_FLOAT_HACK INFINITY_HACK = {{0x00, 0x00, 0x80, 0x7F}};
|
||||
#define INFINITY (INFINITY_HACK.Value)
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define INFINITY (__builtin_inf())
|
||||
#elif defined(__clang__)
|
||||
#if __has_builtin(__builtin_inf)
|
||||
#define INFINITY (__builtin_inf())
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef INFINITY
|
||||
#define INFINITY (1e1000)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* This will allow us to bind the real INFINITY value through SWIG via MYINFINITY. Use %rename to fix the name. */
|
||||
const double MYINFINITY = INFINITY;
|
||||
|
||||
/* Use of float is intentional because the original bug was in the float conversion due to overflow checking. */
|
||||
float use_infinity(float inf_val)
|
||||
{
|
||||
return inf_val;
|
||||
}
|
||||
%}
|
||||
|
||||
4
Examples/test-suite/javascript/infinity_runme.js
Normal file
4
Examples/test-suite/javascript/infinity_runme.js
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
|
||||
var my_infinity = infinity.INFINTY;
|
||||
var ret_val = infinity.use_infinity(my_infinity);
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue