diff -r b758351d191f -r cc9b7e14412b web/lib/arch/osx/jcc/sources/JCCEnv.h --- /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 +#if defined(_MSC_VER) || defined(__WIN32) +#define _DLL_IMPORT __declspec(dllimport) +#define _DLL_EXPORT __declspec(dllexport) +#include +#undef MAX_PRIORITY +#undef MIN_PRIORITY +#else +#include +#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 + +#ifdef PYTHON +#include +#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 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 */