Vince Harron | b46a6ee | 2015-06-02 18:58:48 -0700 | [diff] [blame] | 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(__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 */ |
| 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 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 | %} |