blob: 685bba1988052f7afadb2c3c28a748a7fddcd674 [file] [log] [blame]
Vince Harronb46a6ee2015-06-02 18:58:48 -07001/* -----------------------------------------------------------------------------
2 * javahead.swg
3 *
4 * Java support code
5 * ----------------------------------------------------------------------------- */
6
7
8/* JNI function calls require different calling conventions for C and C++. These JCALL macros are used so
9 * that the same typemaps can be used for generating code for both C and C++. The SWIG preprocessor can expand
10 * the macros thereby generating the correct calling convention. It is thus essential that all typemaps that
11 * use the macros are not within %{ %} brackets as they won't be run through the SWIG preprocessor. */
12#ifdef __cplusplus
13# define JCALL0(func, jenv) jenv->func()
14# define JCALL1(func, jenv, ar1) jenv->func(ar1)
15# define JCALL2(func, jenv, ar1, ar2) jenv->func(ar1, ar2)
16# define JCALL3(func, jenv, ar1, ar2, ar3) jenv->func(ar1, ar2, ar3)
17# define JCALL4(func, jenv, ar1, ar2, ar3, ar4) jenv->func(ar1, ar2, ar3, ar4)
18# define JCALL5(func, jenv, ar1, ar2, ar3, ar4, ar5) jenv->func(ar1, ar2, ar3, ar4, ar5)
19# define JCALL6(func, jenv, ar1, ar2, ar3, ar4, ar5, ar6) jenv->func(ar1, ar2, ar3, ar4, ar5, ar6)
20# define JCALL7(func, jenv, ar1, ar2, ar3, ar4, ar5, ar6, ar7) jenv->func(ar1, ar2, ar3, ar4, ar5, ar6, ar7)
21#else
22# define JCALL0(func, jenv) (*jenv)->func(jenv)
23# define JCALL1(func, jenv, ar1) (*jenv)->func(jenv, ar1)
24# define JCALL2(func, jenv, ar1, ar2) (*jenv)->func(jenv, ar1, ar2)
25# define JCALL3(func, jenv, ar1, ar2, ar3) (*jenv)->func(jenv, ar1, ar2, ar3)
26# define JCALL4(func, jenv, ar1, ar2, ar3, ar4) (*jenv)->func(jenv, ar1, ar2, ar3, ar4)
27# define JCALL5(func, jenv, ar1, ar2, ar3, ar4, ar5) (*jenv)->func(jenv, ar1, ar2, ar3, ar4, ar5)
28# define JCALL6(func, jenv, ar1, ar2, ar3, ar4, ar5, ar6) (*jenv)->func(jenv, ar1, ar2, ar3, ar4, ar5, ar6)
29# define JCALL7(func, jenv, ar1, ar2, ar3, ar4, ar5, ar6, ar7) (*jenv)->func(jenv, ar1, ar2, ar3, ar4, ar5, ar6, ar7)
30#endif
31
32%insert(runtime) %{
33/* Fix for jlong on some versions of gcc on Windows */
34#if defined(__GNUC__) && !defined(__INTEL_COMPILER)
35 typedef long long __int64;
36#endif
37
38/* Fix for jlong on 64-bit x86 Solaris */
39#if defined(__x86_64)
40# ifdef _LP64
41# undef _LP64
42# endif
43#endif
44
45#include <jni.h>
46#include <stdlib.h>
47#include <string.h>
48%}
49
50%insert(runtime) %{
51/* Support for throwing Java exceptions */
52typedef enum {
53 SWIG_JavaOutOfMemoryError = 1,
54 SWIG_JavaIOException,
55 SWIG_JavaRuntimeException,
56 SWIG_JavaIndexOutOfBoundsException,
57 SWIG_JavaArithmeticException,
58 SWIG_JavaIllegalArgumentException,
59 SWIG_JavaNullPointerException,
60 SWIG_JavaDirectorPureVirtual,
61 SWIG_JavaUnknownError
62} SWIG_JavaExceptionCodes;
63
64typedef struct {
65 SWIG_JavaExceptionCodes code;
66 const char *java_exception;
67} SWIG_JavaExceptions_t;
68%}
69
70%insert(runtime) {
71static void SWIGUNUSED SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionCodes code, const char *msg) {
72 jclass excep;
73 static const SWIG_JavaExceptions_t java_exceptions[] = {
74 { SWIG_JavaOutOfMemoryError, "java/lang/OutOfMemoryError" },
75 { SWIG_JavaIOException, "java/io/IOException" },
76 { SWIG_JavaRuntimeException, "java/lang/RuntimeException" },
77 { SWIG_JavaIndexOutOfBoundsException, "java/lang/IndexOutOfBoundsException" },
78 { SWIG_JavaArithmeticException, "java/lang/ArithmeticException" },
79 { SWIG_JavaIllegalArgumentException, "java/lang/IllegalArgumentException" },
80 { SWIG_JavaNullPointerException, "java/lang/NullPointerException" },
81 { SWIG_JavaDirectorPureVirtual, "java/lang/RuntimeException" },
82 { SWIG_JavaUnknownError, "java/lang/UnknownError" },
83 { (SWIG_JavaExceptionCodes)0, "java/lang/UnknownError" }
84 };
85 const SWIG_JavaExceptions_t *except_ptr = java_exceptions;
86
87 while (except_ptr->code != code && except_ptr->code)
88 except_ptr++;
89
90 JCALL0(ExceptionClear, jenv);
91 excep = JCALL1(FindClass, jenv, except_ptr->java_exception);
92 if (excep)
93 JCALL2(ThrowNew, jenv, excep, msg);
94}
95}
96
97%insert(runtime) %{
98/* Contract support */
99
100#define SWIG_contract_assert(nullreturn, expr, msg) if (!(expr)) {SWIG_JavaThrowException(jenv, SWIG_JavaIllegalArgumentException, msg); return nullreturn; } else
101%}