Home | History | Annotate | Download | only in java
      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 %}
    102