--- /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 */