web/lib/arch/osx/jcc/sources/JCCEnv.h
changeset 29 cc9b7e14412b
equal deleted inserted replaced
28:b758351d191f 29:cc9b7e14412b
       
     1 /*
       
     2  *   Copyright (c) 2007-2008 Open Source Applications Foundation
       
     3  *
       
     4  *   Licensed under the Apache License, Version 2.0 (the "License");
       
     5  *   you may not use this file except in compliance with the License.
       
     6  *   You may obtain a copy of the License at
       
     7  *
       
     8  *       http://www.apache.org/licenses/LICENSE-2.0
       
     9  *
       
    10  *   Unless required by applicable law or agreed to in writing, software
       
    11  *   distributed under the License is distributed on an "AS IS" BASIS,
       
    12  *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
       
    13  *   See the License for the specific language governing permissions and
       
    14  *   limitations under the License.
       
    15  */
       
    16 
       
    17 #ifndef _JCCEnv_H
       
    18 #define _JCCEnv_H
       
    19 
       
    20 #include <stdarg.h>
       
    21 #if defined(_MSC_VER) || defined(__WIN32)
       
    22 #define _DLL_IMPORT __declspec(dllimport)
       
    23 #define _DLL_EXPORT __declspec(dllexport)
       
    24 #include <windows.h>
       
    25 #undef MAX_PRIORITY
       
    26 #undef MIN_PRIORITY
       
    27 #else
       
    28 #include <pthread.h>
       
    29 #define _DLL_IMPORT
       
    30 #define _DLL_EXPORT
       
    31 #endif
       
    32 
       
    33 #ifdef __SUNPRO_CC
       
    34 #undef DEFAULT_TYPE
       
    35 #endif
       
    36 
       
    37 #ifdef TRUE
       
    38 #undef TRUE
       
    39 #endif
       
    40 #ifdef FALSE
       
    41 #undef FALSE
       
    42 #endif
       
    43 
       
    44 #include <map>
       
    45 
       
    46 #ifdef PYTHON
       
    47 #include <Python.h>
       
    48 #endif
       
    49 
       
    50 #undef EOF
       
    51 
       
    52 class JCCEnv;
       
    53 
       
    54 #if defined(_MSC_VER) || defined(__WIN32)
       
    55 
       
    56 #ifdef _jcc_shared
       
    57 _DLL_IMPORT extern JCCEnv *env;
       
    58 _DLL_IMPORT extern DWORD VM_ENV;
       
    59 #else
       
    60 _DLL_EXPORT extern JCCEnv *env;
       
    61 _DLL_EXPORT extern DWORD VM_ENV;
       
    62 #endif
       
    63 
       
    64 #else
       
    65 
       
    66 extern JCCEnv *env;
       
    67 
       
    68 #endif
       
    69 
       
    70 
       
    71 class countedRef {
       
    72 public:
       
    73     jobject global;
       
    74     int count;
       
    75 };
       
    76 
       
    77 class _DLL_EXPORT JCCEnv {
       
    78 protected:
       
    79     jclass _sys, _obj, _thr;
       
    80     jmethodID *_mids;
       
    81 
       
    82     enum {
       
    83         mid_sys_identityHashCode,
       
    84         mid_sys_setProperty,
       
    85         mid_sys_getProperty,
       
    86         mid_obj_toString,
       
    87         mid_obj_hashCode,
       
    88         mid_obj_getClass,
       
    89         mid_iterator_next,
       
    90         mid_enumeration_nextElement,
       
    91         max_mid
       
    92     };
       
    93 
       
    94 public:
       
    95     JavaVM *vm;
       
    96     std::multimap<int, countedRef> refs;
       
    97     int handlers;
       
    98 
       
    99     class exception {
       
   100     public:
       
   101         jthrowable throwable;
       
   102         exception(jthrowable throwable) {
       
   103             this->throwable = throwable;
       
   104         }
       
   105     };
       
   106 
       
   107 #ifdef PYTHON
       
   108     class pythonError {
       
   109     public:
       
   110         jthrowable throwable;
       
   111         pythonError(jthrowable throwable) {
       
   112             this->throwable = throwable;
       
   113         }
       
   114     };
       
   115 #endif
       
   116 
       
   117     explicit JCCEnv(JavaVM *vm, JNIEnv *env);
       
   118     virtual ~JCCEnv() {};
       
   119 
       
   120 #if defined(_MSC_VER) || defined(__WIN32)
       
   121     inline JNIEnv *get_vm_env() const
       
   122     {
       
   123         return (JNIEnv *) TlsGetValue(VM_ENV);
       
   124     }
       
   125 #else
       
   126     static pthread_key_t VM_ENV;
       
   127 
       
   128     inline JNIEnv *get_vm_env() const
       
   129     {
       
   130         return (JNIEnv *) pthread_getspecific(VM_ENV);
       
   131     }
       
   132 #endif
       
   133     virtual void set_vm(JavaVM *vm, JNIEnv *vm_env);
       
   134     virtual void set_vm_env(JNIEnv *vm_env);
       
   135 
       
   136     virtual jint getJNIVersion() const;
       
   137     virtual jstring getJavaVersion() const;
       
   138 
       
   139     virtual jclass findClass(const char *className) const;
       
   140     virtual void registerNatives(jclass cls, JNINativeMethod *methods,
       
   141                                  int n) const;
       
   142 
       
   143     virtual jobject iteratorNext(jobject obj) const;
       
   144     virtual jobject enumerationNext(jobject obj) const;
       
   145 
       
   146     virtual jobject newGlobalRef(jobject obj, int id);
       
   147     virtual jobject deleteGlobalRef(jobject obj, int id);
       
   148 
       
   149     virtual jobject newObject(jclass (*initializeClass)(), jmethodID **mids,
       
   150                               int m, ...);
       
   151 
       
   152     virtual jobjectArray newObjectArray(jclass cls, int size);
       
   153     virtual void setObjectArrayElement(jobjectArray a, int n,
       
   154                                        jobject obj) const;
       
   155     virtual jobject getObjectArrayElement(jobjectArray a, int n) const;
       
   156     virtual int getArrayLength(jarray a) const;
       
   157 
       
   158     virtual void reportException() const;
       
   159 
       
   160     virtual jobject callObjectMethod(jobject obj, jmethodID mid, ...) const;
       
   161     virtual jboolean callBooleanMethod(jobject obj, jmethodID mid, ...) const;
       
   162     virtual jbyte callByteMethod(jobject obj, jmethodID mid, ...) const;
       
   163     virtual jchar callCharMethod(jobject obj, jmethodID mid, ...) const;
       
   164     virtual jdouble callDoubleMethod(jobject obj, jmethodID mid, ...) const;
       
   165     virtual jfloat callFloatMethod(jobject obj, jmethodID mid, ...) const;
       
   166     virtual jint callIntMethod(jobject obj, jmethodID mid, ...) const;
       
   167     virtual jlong callLongMethod(jobject obj, jmethodID mid, ...) const;
       
   168     virtual jshort callShortMethod(jobject obj, jmethodID mid, ...) const;
       
   169     virtual void callVoidMethod(jobject obj, jmethodID mid, ...) const;
       
   170 
       
   171     virtual jobject callNonvirtualObjectMethod(jobject obj, jclass cls,
       
   172                                                jmethodID mid, ...) const;
       
   173     virtual jboolean callNonvirtualBooleanMethod(jobject obj, jclass cls,
       
   174                                                  jmethodID mid, ...) const;
       
   175     virtual jbyte callNonvirtualByteMethod(jobject obj, jclass cls,
       
   176                                            jmethodID mid, ...) const;
       
   177     virtual jchar callNonvirtualCharMethod(jobject obj, jclass cls,
       
   178                                            jmethodID mid, ...) const;
       
   179     virtual jdouble callNonvirtualDoubleMethod(jobject obj, jclass cls,
       
   180                                                jmethodID mid, ...) const;
       
   181     virtual jfloat callNonvirtualFloatMethod(jobject obj, jclass cls,
       
   182                                              jmethodID mid, ...) const;
       
   183     virtual jint callNonvirtualIntMethod(jobject obj, jclass cls,
       
   184                                          jmethodID mid, ...) const;
       
   185     virtual jlong callNonvirtualLongMethod(jobject obj, jclass cls,
       
   186                                            jmethodID mid, ...) const;
       
   187     virtual jshort callNonvirtualShortMethod(jobject obj, jclass cls,
       
   188                                              jmethodID mid, ...) const;
       
   189     virtual void callNonvirtualVoidMethod(jobject obj, jclass cls,
       
   190                                           jmethodID mid, ...) const;
       
   191 
       
   192     virtual jobject callStaticObjectMethod(jclass cls,
       
   193                                            jmethodID mid, ...) const;
       
   194     virtual jboolean callStaticBooleanMethod(jclass cls,
       
   195                                              jmethodID mid, ...) const;
       
   196     virtual jbyte callStaticByteMethod(jclass cls,
       
   197                                        jmethodID mid, ...) const;
       
   198     virtual jchar callStaticCharMethod(jclass cls,
       
   199                                        jmethodID mid, ...) const;
       
   200     virtual jdouble callStaticDoubleMethod(jclass cls,
       
   201                                            jmethodID mid, ...) const;
       
   202     virtual jfloat callStaticFloatMethod(jclass cls,
       
   203                                          jmethodID mid, ...) const;
       
   204     virtual jint callStaticIntMethod(jclass cls,
       
   205                                      jmethodID mid, ...) const;
       
   206     virtual jlong callStaticLongMethod(jclass cls,
       
   207                                        jmethodID mid, ...) const;
       
   208     virtual jshort callStaticShortMethod(jclass cls,
       
   209                                          jmethodID mid, ...) const;
       
   210     virtual void callStaticVoidMethod(jclass cls,
       
   211                                       jmethodID mid, ...) const;
       
   212 
       
   213     virtual jmethodID getMethodID(jclass cls, const char *name,
       
   214                                   const char *signature) const;
       
   215     virtual jfieldID getFieldID(jclass cls, const char *name,
       
   216                                 const char *signature) const;
       
   217     virtual jmethodID getStaticMethodID(jclass cls, const char *name,
       
   218                                         const char *signature) const;
       
   219 
       
   220     virtual jobject getStaticObjectField(jclass cls, const char *name,
       
   221                                          const char *signature) const;
       
   222     virtual jboolean getStaticBooleanField(jclass cls, const char *name) const;
       
   223     virtual jbyte getStaticByteField(jclass cls, const char *name) const;
       
   224     virtual jchar getStaticCharField(jclass cls, const char *name) const;
       
   225     virtual jdouble getStaticDoubleField(jclass cls, const char *name) const;
       
   226     virtual jfloat getStaticFloatField(jclass cls, const char *name) const;
       
   227     virtual jint getStaticIntField(jclass cls, const char *name) const;
       
   228     virtual jlong getStaticLongField(jclass cls, const char *name) const;
       
   229     virtual jshort getStaticShortField(jclass cls, const char *name) const;
       
   230 
       
   231     virtual jobject getObjectField(jobject obj, jfieldID id) const;
       
   232     virtual jboolean getBooleanField(jobject obj, jfieldID id) const;
       
   233     virtual jbyte getByteField(jobject obj, jfieldID id) const;
       
   234     virtual jchar getCharField(jobject obj, jfieldID id) const;
       
   235     virtual jdouble getDoubleField(jobject obj, jfieldID id) const;
       
   236     virtual jfloat getFloatField(jobject obj, jfieldID id) const;
       
   237     virtual jint getIntField(jobject obj, jfieldID id) const;
       
   238     virtual jlong getLongField(jobject obj, jfieldID id) const;
       
   239     virtual jshort getShortField(jobject obj, jfieldID id) const;
       
   240 
       
   241     virtual void setObjectField(jobject obj, jfieldID id, jobject value) const;
       
   242     virtual void setBooleanField(jobject obj, jfieldID id, jboolean value) const;
       
   243     virtual void setByteField(jobject obj, jfieldID id, jbyte value) const;
       
   244     virtual void setCharField(jobject obj, jfieldID id, jchar value) const;
       
   245     virtual void setDoubleField(jobject obj, jfieldID id, jdouble value) const;
       
   246     virtual void setFloatField(jobject obj, jfieldID id, jfloat value) const;
       
   247     virtual void setIntField(jobject obj, jfieldID id, jint value) const;
       
   248     virtual void setLongField(jobject obj, jfieldID id, jlong value) const;
       
   249     virtual void setShortField(jobject obj, jfieldID id, jshort value) const;
       
   250 
       
   251     int id(jobject obj) const {
       
   252         return obj
       
   253             ? get_vm_env()->CallStaticIntMethod(_sys,
       
   254                                                 _mids[mid_sys_identityHashCode],
       
   255                                                 obj)
       
   256             : 0;
       
   257     }
       
   258 
       
   259     int hash(jobject obj) const {
       
   260         return obj
       
   261             ? get_vm_env()->CallIntMethod(obj, _mids[mid_obj_hashCode])
       
   262             : 0;
       
   263     }
       
   264 
       
   265     virtual void setClassPath(const char *classPath);
       
   266 
       
   267     virtual jstring fromUTF(const char *bytes) const;
       
   268     virtual char *toUTF(jstring str) const;
       
   269     virtual char *toString(jobject obj) const;
       
   270     virtual char *getClassName(jobject obj) const;
       
   271 #ifdef PYTHON
       
   272     virtual jclass getPythonExceptionClass() const;
       
   273     virtual jstring fromPyString(PyObject *object) const;
       
   274     virtual PyObject *fromJString(jstring js, int delete_local_ref) const;
       
   275     virtual void finalizeObject(JNIEnv *jenv, PyObject *obj);
       
   276 #endif
       
   277 
       
   278     virtual inline int isSame(jobject o1, jobject o2) const
       
   279     {
       
   280         return o1 == o2 || get_vm_env()->IsSameObject(o1, o2);
       
   281     }
       
   282 };
       
   283 
       
   284 #ifdef PYTHON
       
   285 
       
   286 class PythonGIL {
       
   287   private:
       
   288     PyGILState_STATE state;
       
   289   public:
       
   290     PythonGIL()
       
   291     {
       
   292         state = PyGILState_Ensure();
       
   293     }
       
   294     PythonGIL(JNIEnv *vm_env)
       
   295     {
       
   296         state = PyGILState_Ensure();
       
   297         env->set_vm_env(vm_env);
       
   298     }
       
   299     ~PythonGIL()
       
   300     {
       
   301         PyGILState_Release(state);
       
   302     }
       
   303 };
       
   304 
       
   305 class PythonThreadState {
       
   306   private:
       
   307     PyThreadState *state;
       
   308     int handler;
       
   309   public:
       
   310     PythonThreadState(int handler=0)
       
   311     {
       
   312         state = PyEval_SaveThread();
       
   313         this->handler = handler;
       
   314         env->handlers += handler;
       
   315     }
       
   316     ~PythonThreadState()
       
   317     {
       
   318         PyEval_RestoreThread(state);
       
   319         env->handlers -= handler;
       
   320     }
       
   321 };
       
   322 
       
   323 #endif
       
   324 
       
   325 #endif /* _JCCEnv_H */