web/lib/arch/osx/jcc/sources/JCCEnv.h
changeset 29 cc9b7e14412b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/lib/arch/osx/jcc/sources/JCCEnv.h	Tue May 25 02:43:45 2010 +0200
@@ -0,0 +1,325 @@
+/*
+ *   Copyright (c) 2007-2008 Open Source Applications Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *   limitations under the License.
+ */
+
+#ifndef _JCCEnv_H
+#define _JCCEnv_H
+
+#include <stdarg.h>
+#if defined(_MSC_VER) || defined(__WIN32)
+#define _DLL_IMPORT __declspec(dllimport)
+#define _DLL_EXPORT __declspec(dllexport)
+#include <windows.h>
+#undef MAX_PRIORITY
+#undef MIN_PRIORITY
+#else
+#include <pthread.h>
+#define _DLL_IMPORT
+#define _DLL_EXPORT
+#endif
+
+#ifdef __SUNPRO_CC
+#undef DEFAULT_TYPE
+#endif
+
+#ifdef TRUE
+#undef TRUE
+#endif
+#ifdef FALSE
+#undef FALSE
+#endif
+
+#include <map>
+
+#ifdef PYTHON
+#include <Python.h>
+#endif
+
+#undef EOF
+
+class JCCEnv;
+
+#if defined(_MSC_VER) || defined(__WIN32)
+
+#ifdef _jcc_shared
+_DLL_IMPORT extern JCCEnv *env;
+_DLL_IMPORT extern DWORD VM_ENV;
+#else
+_DLL_EXPORT extern JCCEnv *env;
+_DLL_EXPORT extern DWORD VM_ENV;
+#endif
+
+#else
+
+extern JCCEnv *env;
+
+#endif
+
+
+class countedRef {
+public:
+    jobject global;
+    int count;
+};
+
+class _DLL_EXPORT JCCEnv {
+protected:
+    jclass _sys, _obj, _thr;
+    jmethodID *_mids;
+
+    enum {
+        mid_sys_identityHashCode,
+        mid_sys_setProperty,
+        mid_sys_getProperty,
+        mid_obj_toString,
+        mid_obj_hashCode,
+        mid_obj_getClass,
+        mid_iterator_next,
+        mid_enumeration_nextElement,
+        max_mid
+    };
+
+public:
+    JavaVM *vm;
+    std::multimap<int, countedRef> refs;
+    int handlers;
+
+    class exception {
+    public:
+        jthrowable throwable;
+        exception(jthrowable throwable) {
+            this->throwable = throwable;
+        }
+    };
+
+#ifdef PYTHON
+    class pythonError {
+    public:
+        jthrowable throwable;
+        pythonError(jthrowable throwable) {
+            this->throwable = throwable;
+        }
+    };
+#endif
+
+    explicit JCCEnv(JavaVM *vm, JNIEnv *env);
+    virtual ~JCCEnv() {};
+
+#if defined(_MSC_VER) || defined(__WIN32)
+    inline JNIEnv *get_vm_env() const
+    {
+        return (JNIEnv *) TlsGetValue(VM_ENV);
+    }
+#else
+    static pthread_key_t VM_ENV;
+
+    inline JNIEnv *get_vm_env() const
+    {
+        return (JNIEnv *) pthread_getspecific(VM_ENV);
+    }
+#endif
+    virtual void set_vm(JavaVM *vm, JNIEnv *vm_env);
+    virtual void set_vm_env(JNIEnv *vm_env);
+
+    virtual jint getJNIVersion() const;
+    virtual jstring getJavaVersion() const;
+
+    virtual jclass findClass(const char *className) const;
+    virtual void registerNatives(jclass cls, JNINativeMethod *methods,
+                                 int n) const;
+
+    virtual jobject iteratorNext(jobject obj) const;
+    virtual jobject enumerationNext(jobject obj) const;
+
+    virtual jobject newGlobalRef(jobject obj, int id);
+    virtual jobject deleteGlobalRef(jobject obj, int id);
+
+    virtual jobject newObject(jclass (*initializeClass)(), jmethodID **mids,
+                              int m, ...);
+
+    virtual jobjectArray newObjectArray(jclass cls, int size);
+    virtual void setObjectArrayElement(jobjectArray a, int n,
+                                       jobject obj) const;
+    virtual jobject getObjectArrayElement(jobjectArray a, int n) const;
+    virtual int getArrayLength(jarray a) const;
+
+    virtual void reportException() const;
+
+    virtual jobject callObjectMethod(jobject obj, jmethodID mid, ...) const;
+    virtual jboolean callBooleanMethod(jobject obj, jmethodID mid, ...) const;
+    virtual jbyte callByteMethod(jobject obj, jmethodID mid, ...) const;
+    virtual jchar callCharMethod(jobject obj, jmethodID mid, ...) const;
+    virtual jdouble callDoubleMethod(jobject obj, jmethodID mid, ...) const;
+    virtual jfloat callFloatMethod(jobject obj, jmethodID mid, ...) const;
+    virtual jint callIntMethod(jobject obj, jmethodID mid, ...) const;
+    virtual jlong callLongMethod(jobject obj, jmethodID mid, ...) const;
+    virtual jshort callShortMethod(jobject obj, jmethodID mid, ...) const;
+    virtual void callVoidMethod(jobject obj, jmethodID mid, ...) const;
+
+    virtual jobject callNonvirtualObjectMethod(jobject obj, jclass cls,
+                                               jmethodID mid, ...) const;
+    virtual jboolean callNonvirtualBooleanMethod(jobject obj, jclass cls,
+                                                 jmethodID mid, ...) const;
+    virtual jbyte callNonvirtualByteMethod(jobject obj, jclass cls,
+                                           jmethodID mid, ...) const;
+    virtual jchar callNonvirtualCharMethod(jobject obj, jclass cls,
+                                           jmethodID mid, ...) const;
+    virtual jdouble callNonvirtualDoubleMethod(jobject obj, jclass cls,
+                                               jmethodID mid, ...) const;
+    virtual jfloat callNonvirtualFloatMethod(jobject obj, jclass cls,
+                                             jmethodID mid, ...) const;
+    virtual jint callNonvirtualIntMethod(jobject obj, jclass cls,
+                                         jmethodID mid, ...) const;
+    virtual jlong callNonvirtualLongMethod(jobject obj, jclass cls,
+                                           jmethodID mid, ...) const;
+    virtual jshort callNonvirtualShortMethod(jobject obj, jclass cls,
+                                             jmethodID mid, ...) const;
+    virtual void callNonvirtualVoidMethod(jobject obj, jclass cls,
+                                          jmethodID mid, ...) const;
+
+    virtual jobject callStaticObjectMethod(jclass cls,
+                                           jmethodID mid, ...) const;
+    virtual jboolean callStaticBooleanMethod(jclass cls,
+                                             jmethodID mid, ...) const;
+    virtual jbyte callStaticByteMethod(jclass cls,
+                                       jmethodID mid, ...) const;
+    virtual jchar callStaticCharMethod(jclass cls,
+                                       jmethodID mid, ...) const;
+    virtual jdouble callStaticDoubleMethod(jclass cls,
+                                           jmethodID mid, ...) const;
+    virtual jfloat callStaticFloatMethod(jclass cls,
+                                         jmethodID mid, ...) const;
+    virtual jint callStaticIntMethod(jclass cls,
+                                     jmethodID mid, ...) const;
+    virtual jlong callStaticLongMethod(jclass cls,
+                                       jmethodID mid, ...) const;
+    virtual jshort callStaticShortMethod(jclass cls,
+                                         jmethodID mid, ...) const;
+    virtual void callStaticVoidMethod(jclass cls,
+                                      jmethodID mid, ...) const;
+
+    virtual jmethodID getMethodID(jclass cls, const char *name,
+                                  const char *signature) const;
+    virtual jfieldID getFieldID(jclass cls, const char *name,
+                                const char *signature) const;
+    virtual jmethodID getStaticMethodID(jclass cls, const char *name,
+                                        const char *signature) const;
+
+    virtual jobject getStaticObjectField(jclass cls, const char *name,
+                                         const char *signature) const;
+    virtual jboolean getStaticBooleanField(jclass cls, const char *name) const;
+    virtual jbyte getStaticByteField(jclass cls, const char *name) const;
+    virtual jchar getStaticCharField(jclass cls, const char *name) const;
+    virtual jdouble getStaticDoubleField(jclass cls, const char *name) const;
+    virtual jfloat getStaticFloatField(jclass cls, const char *name) const;
+    virtual jint getStaticIntField(jclass cls, const char *name) const;
+    virtual jlong getStaticLongField(jclass cls, const char *name) const;
+    virtual jshort getStaticShortField(jclass cls, const char *name) const;
+
+    virtual jobject getObjectField(jobject obj, jfieldID id) const;
+    virtual jboolean getBooleanField(jobject obj, jfieldID id) const;
+    virtual jbyte getByteField(jobject obj, jfieldID id) const;
+    virtual jchar getCharField(jobject obj, jfieldID id) const;
+    virtual jdouble getDoubleField(jobject obj, jfieldID id) const;
+    virtual jfloat getFloatField(jobject obj, jfieldID id) const;
+    virtual jint getIntField(jobject obj, jfieldID id) const;
+    virtual jlong getLongField(jobject obj, jfieldID id) const;
+    virtual jshort getShortField(jobject obj, jfieldID id) const;
+
+    virtual void setObjectField(jobject obj, jfieldID id, jobject value) const;
+    virtual void setBooleanField(jobject obj, jfieldID id, jboolean value) const;
+    virtual void setByteField(jobject obj, jfieldID id, jbyte value) const;
+    virtual void setCharField(jobject obj, jfieldID id, jchar value) const;
+    virtual void setDoubleField(jobject obj, jfieldID id, jdouble value) const;
+    virtual void setFloatField(jobject obj, jfieldID id, jfloat value) const;
+    virtual void setIntField(jobject obj, jfieldID id, jint value) const;
+    virtual void setLongField(jobject obj, jfieldID id, jlong value) const;
+    virtual void setShortField(jobject obj, jfieldID id, jshort value) const;
+
+    int id(jobject obj) const {
+        return obj
+            ? get_vm_env()->CallStaticIntMethod(_sys,
+                                                _mids[mid_sys_identityHashCode],
+                                                obj)
+            : 0;
+    }
+
+    int hash(jobject obj) const {
+        return obj
+            ? get_vm_env()->CallIntMethod(obj, _mids[mid_obj_hashCode])
+            : 0;
+    }
+
+    virtual void setClassPath(const char *classPath);
+
+    virtual jstring fromUTF(const char *bytes) const;
+    virtual char *toUTF(jstring str) const;
+    virtual char *toString(jobject obj) const;
+    virtual char *getClassName(jobject obj) const;
+#ifdef PYTHON
+    virtual jclass getPythonExceptionClass() const;
+    virtual jstring fromPyString(PyObject *object) const;
+    virtual PyObject *fromJString(jstring js, int delete_local_ref) const;
+    virtual void finalizeObject(JNIEnv *jenv, PyObject *obj);
+#endif
+
+    virtual inline int isSame(jobject o1, jobject o2) const
+    {
+        return o1 == o2 || get_vm_env()->IsSameObject(o1, o2);
+    }
+};
+
+#ifdef PYTHON
+
+class PythonGIL {
+  private:
+    PyGILState_STATE state;
+  public:
+    PythonGIL()
+    {
+        state = PyGILState_Ensure();
+    }
+    PythonGIL(JNIEnv *vm_env)
+    {
+        state = PyGILState_Ensure();
+        env->set_vm_env(vm_env);
+    }
+    ~PythonGIL()
+    {
+        PyGILState_Release(state);
+    }
+};
+
+class PythonThreadState {
+  private:
+    PyThreadState *state;
+    int handler;
+  public:
+    PythonThreadState(int handler=0)
+    {
+        state = PyEval_SaveThread();
+        this->handler = handler;
+        env->handlers += handler;
+    }
+    ~PythonThreadState()
+    {
+        PyEval_RestoreThread(state);
+        env->handlers -= handler;
+    }
+};
+
+#endif
+
+#endif /* _JCCEnv_H */