Commit | Line | Data |
---|---|---|
920dae64 AT |
1 | /* ----------------------------------------------------------------------------- |
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(__INTELC__) | |
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 */ | |
52 | typedef 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 | ||
64 | typedef struct { | |
65 | SWIG_JavaExceptionCodes code; | |
66 | const char *java_exception; | |
67 | } SWIG_JavaExceptions_t; | |
68 | %} | |
69 | ||
70 | %insert(runtime) { | |
71 | static void 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 | const SWIG_JavaExceptions_t *except_ptr = java_exceptions; | |
85 | ||
86 | while (except_ptr->code != code && except_ptr->code) | |
87 | except_ptr++; | |
88 | ||
89 | JCALL0(ExceptionClear, jenv); | |
90 | excep = JCALL1(FindClass, jenv, except_ptr->java_exception); | |
91 | if (excep) | |
92 | JCALL2(ThrowNew, jenv, excep, msg); | |
93 | } | |
94 | } | |
95 | ||
96 | %insert(runtime) %{ | |
97 | /* Contract support */ | |
98 | ||
99 | #define SWIG_contract_assert(nullreturn, expr, msg) if (!(expr)) {SWIG_JavaThrowException(jenv, SWIG_JavaIllegalArgumentException, msg); return nullreturn; } else | |
100 | %} |