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