web/lib/arch/osx/jcc/sources/functions.h
changeset 29 cc9b7e14412b
equal deleted inserted replaced
28:b758351d191f 29:cc9b7e14412b
       
     1 /*
       
     2  *   Licensed under the Apache License, Version 2.0 (the "License");
       
     3  *   you may not use this file except in compliance with the License.
       
     4  *   You may obtain a copy of the License at
       
     5  *
       
     6  *       http://www.apache.org/licenses/LICENSE-2.0
       
     7  *
       
     8  *   Unless required by applicable law or agreed to in writing, software
       
     9  *   distributed under the License is distributed on an "AS IS" BASIS,
       
    10  *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
       
    11  *   See the License for the specific language governing permissions and
       
    12  *   limitations under the License.
       
    13  */
       
    14 
       
    15 #ifndef _functions_h
       
    16 #define _functions_h
       
    17 
       
    18 #include "java/util/Iterator.h"
       
    19 #include "java/util/Enumeration.h"
       
    20 #include "java/lang/String.h"
       
    21 #include "java/lang/Object.h"
       
    22 #include "macros.h"
       
    23 
       
    24 #if PY_VERSION_HEX < 0x02050000
       
    25 typedef int Py_ssize_t;
       
    26 typedef inquiry lenfunc;
       
    27 typedef intargfunc ssizeargfunc;
       
    28 typedef intintargfunc ssizessizeargfunc;
       
    29 typedef intobjargproc ssizeobjargproc;
       
    30 typedef intintobjargproc ssizessizeobjargproc;
       
    31 #endif
       
    32 
       
    33 typedef jclass (*getclassfn)(void);
       
    34 typedef PyTypeObject **(*getparametersfn)(void *);
       
    35 
       
    36 PyObject *PyErr_SetArgsError(char *name, PyObject *args);
       
    37 PyObject *PyErr_SetArgsError(PyObject *self, char *name, PyObject *args);
       
    38 PyObject *PyErr_SetArgsError(PyTypeObject *type, char *name, PyObject *args);
       
    39 PyObject *PyErr_SetJavaError(jthrowable throwable);
       
    40 
       
    41 extern PyObject *PyExc_JavaError;
       
    42 extern PyObject *PyExc_InvalidArgsError;
       
    43 
       
    44 
       
    45 void throwPythonError(void);
       
    46 void throwTypeError(const char *name, PyObject *object);
       
    47 
       
    48 #if defined(_MSC_VER) || defined(__SUNPRO_CC)
       
    49 
       
    50 #define parseArgs __parseArgs
       
    51 #define parseArg __parseArg
       
    52 
       
    53 int __parseArgs(PyObject *args, char *types, ...);
       
    54 int __parseArg(PyObject *arg, char *types, ...);
       
    55 
       
    56 int _parseArgs(PyObject **args, unsigned int count, char *types,
       
    57 	       va_list list, va_list check);
       
    58 
       
    59 #else
       
    60 
       
    61 #define parseArgs(args, types, rest...) \
       
    62     _parseArgs(((PyTupleObject *)(args))->ob_item, \
       
    63                ((PyTupleObject *)(args))->ob_size, types, ##rest)
       
    64 
       
    65 #define parseArg(arg, types, rest...) \
       
    66     _parseArgs(&(arg), 1, types, ##rest)
       
    67 
       
    68 int _parseArgs(PyObject **args, unsigned int count, char *types, ...);
       
    69 
       
    70 #endif
       
    71 
       
    72 int abstract_init(PyObject *self, PyObject *args, PyObject *kwds);
       
    73 PyObject *wrapType(PyTypeObject *type, const jobject& obj);
       
    74 
       
    75 PyObject *j2p(const java::lang::String& js);
       
    76 java::lang::String p2j(PyObject *object);
       
    77 
       
    78 PyObject *make_descriptor(PyTypeObject *value);
       
    79 PyObject *make_descriptor(getclassfn initializeClass);
       
    80 PyObject *make_descriptor(getclassfn initializeClass, int generics);
       
    81 PyObject *make_descriptor(PyObject *value);
       
    82 PyObject *make_descriptor(PyObject *(*wrapfn)(const jobject &));
       
    83 PyObject *make_descriptor(jboolean value);
       
    84 PyObject *make_descriptor(jbyte value);
       
    85 PyObject *make_descriptor(jchar value);
       
    86 PyObject *make_descriptor(jdouble value);
       
    87 PyObject *make_descriptor(jfloat value);
       
    88 PyObject *make_descriptor(jint value);
       
    89 PyObject *make_descriptor(jlong value);
       
    90 PyObject *make_descriptor(jshort value);
       
    91 
       
    92 jobjectArray make_array(jclass cls, PyObject *sequence);
       
    93 
       
    94 PyObject *callSuper(PyTypeObject *type,
       
    95                     const char *name, PyObject *args, int cardinality);
       
    96 PyObject *callSuper(PyTypeObject *type, PyObject *self,
       
    97                     const char *name, PyObject *args, int cardinality);
       
    98 
       
    99 template<class T> PyObject *get_iterator(T *self)
       
   100 {
       
   101     java::util::Iterator iterator((jobject) NULL);
       
   102 
       
   103     OBJ_CALL(iterator = self->object.iterator());
       
   104     return java::util::t_Iterator::wrap_Object(iterator);
       
   105 }
       
   106 
       
   107 #ifdef _java_generics
       
   108 template<class T> PyObject *get_generic_iterator(T *self)
       
   109 {
       
   110     java::util::Iterator iterator((jobject) NULL);
       
   111     PyTypeObject *param = self->parameters ? self->parameters[0] : NULL;
       
   112 
       
   113     OBJ_CALL(iterator = self->object.iterator());
       
   114     return java::util::t_Iterator::wrap_Object(iterator, param);
       
   115 }
       
   116 #endif
       
   117 
       
   118 template<class T, class U> PyObject *get_iterator_next(T *self)
       
   119 {
       
   120     jboolean hasNext;
       
   121     OBJ_CALL(hasNext = self->object.hasNext());
       
   122     if (!hasNext)
       
   123     {
       
   124         PyErr_SetNone(PyExc_StopIteration);
       
   125         return NULL;
       
   126     }
       
   127 
       
   128     jobject next;
       
   129     OBJ_CALL(next = env->iteratorNext(self->object.this$));
       
   130 
       
   131     jclass cls = java::lang::String::initializeClass();
       
   132     if (env->get_vm_env()->IsInstanceOf(next, cls))
       
   133         return env->fromJString((jstring) next, 1);
       
   134 
       
   135     return U::wrap_jobject(next);
       
   136 }
       
   137 
       
   138 #ifdef _java_generics
       
   139 template<class T, class U> PyObject *get_generic_iterator_next(T *self)
       
   140 {
       
   141     jboolean hasNext;
       
   142     OBJ_CALL(hasNext = self->object.hasNext());
       
   143     if (!hasNext)
       
   144     {
       
   145         PyErr_SetNone(PyExc_StopIteration);
       
   146         return NULL;
       
   147     }
       
   148 
       
   149     jobject next;
       
   150     OBJ_CALL(next = env->iteratorNext(self->object.this$));
       
   151 
       
   152     jclass cls = java::lang::String::initializeClass();
       
   153     if (env->get_vm_env()->IsInstanceOf(next, cls))
       
   154         return env->fromJString((jstring) next, 1);
       
   155 
       
   156     PyTypeObject *param = self->parameters ? self->parameters[0] : NULL;
       
   157     if (param != NULL)
       
   158         return wrapType(param, next);
       
   159 
       
   160     return U::wrap_jobject(next);
       
   161 }
       
   162 #endif
       
   163 
       
   164 template<class T, class U> PyObject *get_enumeration_next(T *self)
       
   165 {
       
   166     jboolean hasMoreElements;
       
   167     OBJ_CALL(hasMoreElements = self->object.hasMoreElements());
       
   168     if (!hasMoreElements)
       
   169     {
       
   170         PyErr_SetNone(PyExc_StopIteration);
       
   171         return NULL;
       
   172     }
       
   173 
       
   174     jobject next;
       
   175     OBJ_CALL(next = env->enumerationNext(self->object.this$));
       
   176 
       
   177     jclass cls = java::lang::String::initializeClass();
       
   178     if (env->get_vm_env()->IsInstanceOf(next, cls))
       
   179         return env->fromJString((jstring) next, 1);
       
   180 
       
   181     return U::wrap_jobject(next);
       
   182 }
       
   183 
       
   184 #ifdef _java_generics
       
   185 template<class T, class U> PyObject *get_generic_enumeration_next(T *self)
       
   186 {
       
   187     jboolean hasMoreElements;
       
   188     OBJ_CALL(hasMoreElements = self->object.hasMoreElements());
       
   189     if (!hasMoreElements)
       
   190     {
       
   191         PyErr_SetNone(PyExc_StopIteration);
       
   192         return NULL;
       
   193     }
       
   194 
       
   195     jobject next;
       
   196     OBJ_CALL(next = env->enumerationNext(self->object.this$));
       
   197 
       
   198     jclass cls = java::lang::String::initializeClass();
       
   199     if (env->get_vm_env()->IsInstanceOf(next, cls))
       
   200         return env->fromJString((jstring) next, 1);
       
   201 
       
   202     PyTypeObject *param = self->parameters ? self->parameters[0] : NULL;
       
   203     if (param != NULL)
       
   204         return wrapType(param, next);
       
   205 
       
   206     return U::wrap_jobject(next);
       
   207 }
       
   208 #endif
       
   209 
       
   210 template<class T, class U, class V> PyObject *get_next(T *self)
       
   211 {
       
   212     V next((jobject) NULL);
       
   213     OBJ_CALL(next = self->object.next());
       
   214     if (!next)
       
   215     {
       
   216         PyErr_SetNone(PyExc_StopIteration);
       
   217         return NULL;
       
   218     }
       
   219         
       
   220     jclass cls = java::lang::String::initializeClass();
       
   221     if (env->get_vm_env()->IsInstanceOf(next.this$, cls))
       
   222         return env->fromJString((jstring) next.this$, 0);
       
   223 
       
   224     return U::wrap_Object(next);
       
   225 }
       
   226 
       
   227 #ifdef _java_generics
       
   228 template<class T, class U, class V> PyObject *get_generic_next(T *self)
       
   229 {
       
   230     V next((jobject) NULL);
       
   231     OBJ_CALL(next = self->object.next());
       
   232     if (!next)
       
   233     {
       
   234         PyErr_SetNone(PyExc_StopIteration);
       
   235         return NULL;
       
   236     }
       
   237         
       
   238     jclass cls = java::lang::String::initializeClass();
       
   239     if (env->get_vm_env()->IsInstanceOf(next.this$, cls))
       
   240         return env->fromJString((jstring) next.this$, 0);
       
   241 
       
   242     PyTypeObject *param = self->parameters ? self->parameters[0] : NULL;
       
   243     if (param != NULL)
       
   244         return wrapType(param, next.this$);
       
   245 
       
   246     return U::wrap_Object(next);
       
   247 }
       
   248 #endif
       
   249 
       
   250 PyObject *get_extension_iterator(PyObject *self);
       
   251 PyObject *get_extension_next(PyObject *self);
       
   252 PyObject *get_extension_nextElement(PyObject *self);
       
   253 
       
   254 jobjectArray fromPySequence(jclass cls, PyObject *sequence);
       
   255 PyObject *castCheck(PyObject *obj, getclassfn initializeClass,
       
   256                     int reportError);
       
   257 void installType(PyTypeObject *type, PyObject *module, char *name,
       
   258                  int isExtension);
       
   259 
       
   260 #ifdef _java_generics
       
   261 PyObject *typeParameters(PyTypeObject *types[], size_t size);
       
   262 #endif
       
   263 
       
   264 extern PyTypeObject FinalizerClass$$Type;
       
   265 extern PyTypeObject FinalizerProxy$$Type;
       
   266 
       
   267 typedef struct {
       
   268     PyObject_HEAD
       
   269     PyObject *object;
       
   270 } t_fp;
       
   271 
       
   272 #endif /* _functions_h */