You are viewing a plain text version of this content. The canonical link for it is here.
Posted to pylucene-commits@lucene.apache.org by va...@apache.org on 2017/06/25 13:45:43 UTC

svn commit: r1799796 [2/2] - in /lucene/pylucene/trunk/jcc: ./ _jcc3/ _jcc3/java/io/ _jcc3/java/lang/ _jcc3/java/lang/reflect/ _jcc3/java/util/ jcc3/ jcc3/sources/

Modified: lucene/pylucene/trunk/jcc/jcc3/python.py
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc3/python.py?rev=1799796&r1=1799795&r2=1799796&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc3/python.py (original)
+++ lucene/pylucene/trunk/jcc/jcc3/python.py Sun Jun 25 13:45:41 2017
@@ -115,7 +115,7 @@ def parseArgs(params, current, generics,
             return ''
         if is_boxed(clsName):
             clsNames = clsName.split('.')
-            return ', &%s::PY_TYPE(%s)' %(absname(cppnames(clsNames[:-1])), cppname(clsNames[-1]))
+            return ', %s::PY_TYPE(%s)' %(absname(cppnames(clsNames[:-1])), cppname(clsNames[-1]))
         return ', %s::initializeClass' %(typename(cls, current, False))
 
     def callarg(cls, i):
@@ -193,14 +193,14 @@ def construct(out, indent, cls, inCase,
                     cls = cls.getComponentType()
                     if cls.isArray():
                         clsNames = 'java.lang.Object'.split('.')
-                        clsArg = '&%s::PY_TYPE(%s)' %(absname(cppnames(clsNames[:-1])), cppname(clsNames[-1]))
+                        clsArg = '%s::PY_TYPE(%s)' %(absname(cppnames(clsNames[:-1])), cppname(clsNames[-1]))
                     elif cls.isPrimitive():
                         clsArg = 'PY_TYPE(JArray%s)' %(cls.getName().capitalize())
                     else:
                         clsArg = 'PY_TYPE(JArrayObject)'
                 else:
                     clsNames = cls.getName().split('.')
-                    clsArg = '&%s::PY_TYPE(%s)' %(absname(cppnames(clsNames[:-1])), cppname(clsNames[-1]))
+                    clsArg = '%s::PY_TYPE(%s)' %(absname(cppnames(clsNames[:-1])), cppname(clsNames[-1]))
                 line(out, indent, 'self->parameters[%d] = %s;', i, clsArg)
             i += 1
 
@@ -276,7 +276,7 @@ def returnValue(cls, returnType, value,
                     if clsArg.isArray():
                         clsArg = Class.forName('java.lang.Object')
                     clsNames = clsArg.getName().split('.')
-                    clsArg = '&%s::PY_TYPE(%s)' %(absname(cppnames(clsNames[:-1])), cppname(clsNames[-1]))
+                    clsArg = '%s::PY_TYPE(%s)' %(absname(cppnames(clsNames[:-1])), cppname(clsNames[-1]))
                     clsArgs.append(clsArg)
                 elif TypeVariable.instance_(clsArg):
                     gd = TypeVariable.cast_(clsArg).getGenericDeclaration()
@@ -368,7 +368,7 @@ def call(out, indent, cls, inCase, metho
     if isExtension and name == 'clone' and Modifier.isNative(modifiers):
         line(out)
         line(out, indent, '%s object(result.this$);', typename(cls, cls, False))
-        line(out, indent, 'if (PyObject_TypeCheck(arg, &PY_TYPE(FinalizerProxy)) &&')
+        line(out, indent, 'if (PyObject_TypeCheck(arg, PY_TYPE(FinalizerProxy)) &&')
         line(out, indent, '    PyObject_TypeCheck(((t_fp *) arg)->object, Py_TYPE(self)))')
         line(out, indent, '{')
         line(out, indent + 1, 'PyObject *_arg = ((t_fp *) arg)->object;')
@@ -543,7 +543,7 @@ def extension(env, out, indent, cls, nam
             line(out, indent, 'return (jobject) NULL;')
 
 
-def python(env, out_h, out, cls, superCls, names, superNames,
+def python(env, out_h, out, cls, superClasses, names, superNames,
            constructors, methods, protectedMethods,
            methodNames, fields, instanceFields,
            mapping, sequence, rename, declares, typeset, moduleName, generics,
@@ -557,7 +557,9 @@ def python(env, out_h, out, cls, superCl
     for name in names[:-1]:
         line(out_h, indent, 'namespace %s {', cppname(name))
         indent += 1
-    line(out_h, indent, '%sextern PyTypeObject PY_TYPE(%s);',
+    line(out_h, indent, '%sextern PyType_Def PY_TYPE_DEF(%s);',
+         _dll_export, names[-1])
+    line(out_h, indent, '%sextern PyTypeObject *PY_TYPE(%s);',
          _dll_export, names[-1])
 
     if generics:
@@ -639,8 +641,9 @@ def python(env, out_h, out, cls, superCl
     else:
         constructorName = 'abstract_init'
 
-    if superCls:
+    if superClasses:
         superMethods = set([method.getName()
+                            for superCls in superClasses
                             for method in superCls.getMethods()])
     else:
         superMethods = ()
@@ -658,8 +661,8 @@ def python(env, out_h, out, cls, superCl
             isNative = Modifier.isNative(modifiers)
             isStatic = Modifier.isStatic(modifiers)
 
-            if (isExtension and not isStatic and superCls and isNative):
-                superMethod = find_method(superCls, name, params)
+            if (isExtension and not isStatic and superClasses and isNative):
+                superMethod = find_method(superClasses[0], name, params)
 
             if isExtension and isNative and not isStatic:
                 extMethods.setdefault(name, []).append(method)
@@ -903,7 +906,7 @@ def python(env, out_h, out, cls, superCl
     if instanceFields or propMethods or isExtension or clsParams:
         tp_getset = 't_%s__fields_' %(names[-1])
     else:
-        tp_getset = '0'
+        tp_getset = None
 
     if iteratorMethod:
         if iteratorExt:
@@ -933,64 +936,68 @@ def python(env, out_h, out, cls, superCl
             returnType = nextMethod.getReturnType()
             tp_iternext = '((PyObject *(*)(t_%s *)) get_%snext< t_%s,%s,%s >)' %(names[-1], clsParams and 'generic_' or '', names[-1], wrapper_typename(returnType, cls), typename(returnType, cls, False))
     else:
-        tp_iter = '0'
-        tp_iternext = '0'
+        tp_iter = None
+        tp_iternext = None
 
     if mappingMethod:
         method, cardinality = mappingMethod
         if cardinality > 1:
-            getName = 't_%s_%s_map_' %(names[-1], method.getName())
+            mp_subscript = 't_%s_%s_map_' %(names[-1], method.getName())
             line(out, indent, 'static PyObject *%s(t_%s *self, PyObject *key);',
-                 getName, names[-1])
+                 mp_subscript, names[-1])
         else:
-            getName = 't_%s_%s' %(names[-1], method.getName())
-        line(out)
-        line(out, indent, 'static PyMappingMethods t_%s_as_mapping = {',
-             names[-1])
-        line(out, indent + 1, '0,')
-        line(out, indent + 1, '(binaryfunc) %s,', getName)
-        line(out, indent + 1, '0,')
-        line(out, indent, '};')
-        tp_as_mapping = '&t_%s_as_mapping' %(names[-1])
+            mp_subscript = 't_%s_%s' %(names[-1], method.getName())
     else:
-        tp_as_mapping = '0'
+        mp_subscript = None
 
-    if sequenceLenMethod or sequenceGetMethod:
-        if sequenceLenMethod:
-            method, cardinality = sequenceLenMethod
-            lenName = 't_%s_%s_seq_' %(names[-1], method.getName())
-            line(out, indent, 'static int %s(t_%s *self);', lenName, names[-1])
-        else:
-            lenName = '0'
-
-        if sequenceGetMethod:
-            method, cardinality = sequenceGetMethod
-            getName = 't_%s_%s_seq_' %(names[-1], method.getName())
-            line(out, indent, 'static PyObject *%s(t_%s *self, int n);',
-                 getName, names[-1])
-        else:
-            getName = '0'
-
-        line(out)
-        line(out, indent, 'static PySequenceMethods t_%s_as_sequence = {',
-             names[-1])
-        line(out, indent + 1, '(lenfunc) %s,', lenName)
-        line(out, indent + 1, '0,')
-        line(out, indent + 1, '0,')
-        line(out, indent + 1, '(ssizeargfunc) %s', getName)
-        line(out, indent, '};')
-        tp_as_sequence = '&t_%s_as_sequence' %(names[-1])
+    if sequenceLenMethod:
+        method, cardinality = sequenceLenMethod
+        sq_length = 't_%s_%s_seq_' %(names[-1], method.getName())
+        line(out, indent, 'static int %s(t_%s *self);',
+             sq_length, names[-1])
     else:
-        tp_as_sequence = '0'
+        sq_length = None
 
-    if len(superNames) > 1:
-        base = '::'.join((absname(cppnames(superNames[:-1])), superNames[-1]))
+    if sequenceGetMethod:
+        method, cardinality = sequenceGetMethod
+        sq_item = 't_%s_%s_seq_' %(names[-1], method.getName())
+        line(out, indent, 'static PyObject *%s(t_%s *self, int n);',
+             sq_item, names[-1])
     else:
-        base = superNames[-1]
+        sq_item = None
+
+    line(out)
+    line(out, indent, 'static PyType_Slot PY_TYPE_SLOTS(%s)[] = {', names[-1])
+    line(out, indent + 1, '{ Py_tp_methods, t_%s__methods_ },', names[-1])
+    line(out, indent + 1, '{ Py_tp_init, (void *) %s },', constructorName)
+    if tp_getset is not None:
+        line(out, indent + 1, '{ Py_tp_getset, %s },', tp_getset)
+    if tp_iter is not None:
+        line(out, indent + 1, '{ Py_tp_iter, (void *) %s },', tp_iter)
+        line(out, indent + 1, '{ Py_tp_iternext, (void *) %s },', tp_iternext)
+    if mp_subscript is not None:
+        line(out, indent + 1, '{ Py_mp_subscript, (void *) %s },', mp_subscript)
+    if sq_length is not None:
+        line(out, indent + 1, '{ Py_sq_length, (void *) %s },', sq_length)
+    if sq_item is not None:
+        line(out, indent + 1, '{ Py_sq_item, (void *) %s },', sq_item)
+    line(out, indent + 1, '{ 0, NULL }')
+    line(out, indent, '};')
+
+    line(out)
+    line(out, indent, 'static PyType_Def *PY_TYPE_BASES(%s)[] = {', names[-1])
+    for superName in superNames:
+        if len(superName) > 1:
+            base = '::'.join((absname(cppnames(superName[:-1])), superName[-1]))
+        else:
+            base = superName[-1]
+        line(out, indent + 1, '&PY_TYPE_DEF(%s),', base)
+    line(out, indent + 1, 'NULL')
+    line(out, indent, '};')
+
     line(out)
-    line(out, indent, 'DECLARE_TYPE(%s, t_%s, %s, %s, %s, %s, %s, %s, %s, %s);',
-         names[-1], names[-1], base, cppname(names[-1]), constructorName,
-         tp_iter, tp_iternext, tp_getset, tp_as_mapping, tp_as_sequence)
+    line(out, indent, 'DEFINE_TYPE(%s, t_%s, %s);',
+         names[-1], names[-1], cppname(names[-1]))
 
     if clsParams:
         clsArgs = []
@@ -1040,20 +1047,21 @@ def python(env, out_h, out, cls, superCl
     line(out)
     line(out, indent, 'void t_%s::install(PyObject *module)', names[-1])
     line(out, indent, '{')
-    line(out, indent + 1, 'installType(&PY_TYPE(%s), module, "%s", %d);',
-         names[-1], rename or names[-1], isExtension and 1 or 0)
+    line(out, indent + 1,
+         'installType(&PY_TYPE(%s), &PY_TYPE_DEF(%s), module, "%s", %d);',
+         names[-1], names[-1], rename or names[-1], isExtension and 1 or 0)
     for inner in cls.getDeclaredClasses():
         if inner in typeset:
             if Modifier.isStatic(inner.getModifiers()):
                 innerName = inner.getName().split('.')[-1]
-                line(out, indent + 1, 'PyDict_SetItemString(PY_TYPE(%s).tp_dict, "%s", make_descriptor(&PY_TYPE(%s)));',
+                line(out, indent + 1, 'PyDict_SetItemString(PY_TYPE(%s)->tp_dict, "%s", make_descriptor(&PY_TYPE_DEF(%s)));',
                      names[-1], innerName[len(names[-1])+1:], innerName)
     line(out, indent, '}')
 
     line(out)
     line(out, indent, 'void t_%s::initialize(PyObject *module)', names[-1])
     line(out, indent, '{')
-    line(out, indent + 1, 'PyDict_SetItemString(PY_TYPE(%s).tp_dict, "class_", make_descriptor(%s::initializeClass, %s));',
+    line(out, indent + 1, 'PyDict_SetItemString(PY_TYPE(%s)->tp_dict, "class_", make_descriptor(%s::initializeClass, %s));',
          names[-1], cppname(names[-1]), generics and 1 or 0)
 
     if is_unboxed(cls.getName()):
@@ -1063,8 +1071,8 @@ def python(env, out_h, out, cls, superCl
         wrapfn_ = "t_%s::wrap_jobject" %(names[-1])
         boxfn_ = "boxObject"
 
-    line(out, indent + 1, 'PyDict_SetItemString(PY_TYPE(%s).tp_dict, "wrapfn_", make_descriptor(%s));', names[-1], wrapfn_)
-    line(out, indent + 1, 'PyDict_SetItemString(PY_TYPE(%s).tp_dict, "boxfn_", make_descriptor(%s));', names[-1], boxfn_)
+    line(out, indent + 1, 'PyDict_SetItemString(PY_TYPE(%s)->tp_dict, "wrapfn_", make_descriptor(%s));', names[-1], wrapfn_)
+    line(out, indent + 1, 'PyDict_SetItemString(PY_TYPE(%s)->tp_dict, "boxfn_", make_descriptor(%s));', names[-1], boxfn_)
 
     if isExtension:
         line(out, indent + 1, 'jclass cls = env->getClass(%s::initializeClass);',
@@ -1093,7 +1101,7 @@ def python(env, out_h, out, cls, superCl
             cppFieldName += RENAME_FIELD_SUFFIX
         value = '%s::%s' %(cppname(names[-1]), cppFieldName)
         value = fieldValue(cls, value, fieldType)
-        line(out, indent + 1, 'PyDict_SetItemString(PY_TYPE(%s).tp_dict, "%s", make_descriptor(%s));',
+        line(out, indent + 1, 'PyDict_SetItemString(PY_TYPE(%s)->tp_dict, "%s", make_descriptor(%s));',
              names[-1], fieldName, value)
     line(out, indent, '}')
 
@@ -1211,7 +1219,7 @@ def python(env, out_h, out, cls, superCl
                     line(out, indent + 1, 'return callSuper(type, "%s"%s, %d);',
                          name, args, cardinality)
                 else:
-                    line(out, indent + 1, 'return callSuper(&PY_TYPE(%s), (PyObject *) self, "%s"%s, %d);',
+                    line(out, indent + 1, 'return callSuper(PY_TYPE(%s), (PyObject *) self, "%s"%s, %d);',
                          names[-1], name, args, cardinality)
             else:
                 line(out, indent + 1, 'PyErr_SetArgsError(%s, "%s"%s);',
@@ -1547,7 +1555,8 @@ def module(out, allInOne, classes, impor
     line(out)
     line(out, 0, 'PyObject *initJCC(PyObject *module);')
     line(out, 0, 'void __install__(PyObject *module);')
-    line(out, 0, 'extern PyTypeObject PY_TYPE(JObject), PY_TYPE(ConstVariableDescriptor), PY_TYPE(FinalizerClass), PY_TYPE(FinalizerProxy);')
+    line(out, 0, 'extern PyTypeObject *PY_TYPE(JObject), *PY_TYPE(ConstVariableDescriptor), *PY_TYPE(FinalizerClass), *PY_TYPE(FinalizerProxy);')
+    line(out, 0, 'extern PyType_Def PY_TYPE_DEF(JObject);')
     line(out, 0, 'extern void _install_jarray(PyObject *);')
     line(out)
     line(out, 0, 'extern "C" {')
@@ -1566,10 +1575,11 @@ def module(out, allInOne, classes, impor
     line(out)
     line(out, 2, 'initJCC(module);')
     line(out)
-    line(out, 2, 'INSTALL_TYPE(JObject, module);')
-    line(out, 2, 'INSTALL_TYPE(ConstVariableDescriptor, module);')
-    line(out, 2, 'INSTALL_TYPE(FinalizerClass, module);')
-    line(out, 2, 'INSTALL_TYPE(FinalizerProxy, module);')
+    line(out, 2, 'INSTALL_STATIC_TYPE(JObject, module);')
+    line(out, 2, 'PY_TYPE_DEF(JObject).type = PY_TYPE(JObject);')
+    line(out, 2, 'INSTALL_STATIC_TYPE(ConstVariableDescriptor, module);')
+    line(out, 2, 'INSTALL_STATIC_TYPE(FinalizerClass, module);')
+    line(out, 2, 'INSTALL_STATIC_TYPE(FinalizerProxy, module);')
     line(out, 2, '_install_jarray(module);')
     line(out, 2, '__install__(module);')
     line(out)

Modified: lucene/pylucene/trunk/jcc/jcc3/sources/JArray.cpp
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc3/sources/JArray.cpp?rev=1799796&r1=1799795&r2=1799796&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc3/sources/JArray.cpp (original)
+++ lucene/pylucene/trunk/jcc/jcc3/sources/JArray.cpp Sun Jun 25 13:45:41 2017
@@ -413,7 +413,7 @@ static PyObject *cast_(PyTypeObject *typ
     if (!PyArg_ParseTuple(args, "O", &arg))
         return NULL;
 
-    if (!PyObject_TypeCheck(arg, &PY_TYPE(Object)))
+    if (!PyObject_TypeCheck(arg, PY_TYPE(Object)))
     {
         PyErr_SetObject(PyExc_TypeError, arg);
         return NULL;
@@ -455,7 +455,7 @@ static PyObject *instance_(PyTypeObject
     if (!PyArg_ParseTuple(args, "O", &arg))
         return NULL;
 
-    if (!PyObject_TypeCheck(arg, &PY_TYPE(Object)))
+    if (!PyObject_TypeCheck(arg, PY_TYPE(Object)))
         Py_RETURN_FALSE;
 
     Class argCls = ((t_Object *) arg)->object.getClass();
@@ -603,7 +603,7 @@ public:
             (richcmpfunc) (PyObject *(*)(U *, PyObject *, int)) richcompare<U>;
         type_object.tp_iter = (getiterfunc) (PyObject *(*)(U *)) iter<U>;
         type_object.tp_methods = methods;
-        type_object.tp_base = &PY_TYPE(Object);
+        type_object.tp_base = PY_TYPE(Object);
         type_object.tp_init =
             (initproc) (int (*)(U *, PyObject *, PyObject *)) init<T,U>;
         type_object.tp_new = (newfunc) _new;
@@ -636,11 +636,11 @@ template<> int init< jobject,_t_jobjecta
 
     if (clsObj == NULL)
         cls = env->findClass("java/lang/Object");
-    else if (PyObject_TypeCheck(clsObj, &PY_TYPE(Class)))
+    else if (PyObject_TypeCheck(clsObj, PY_TYPE(Class)))
         cls = (jclass) ((t_Class *) clsObj)->object.this$;
     else if (PyType_Check(clsObj))
     {
-        if (PyType_IsSubtype((PyTypeObject *) clsObj, &PY_TYPE(JObject)))
+        if (PyType_IsSubtype((PyTypeObject *) clsObj, PY_TYPE(JObject)))
         {
             PyObject *cobj = PyObject_GetAttrString(clsObj, "wrapfn_");
 
@@ -730,7 +730,7 @@ template<> PyObject *cast_<jobject>(PyTy
     if (!PyArg_ParseTuple(args, "O|O", &arg, &clsArg))
         return NULL;
 
-    if (!PyObject_TypeCheck(arg, &PY_TYPE(Object)))
+    if (!PyObject_TypeCheck(arg, PY_TYPE(Object)))
     {
         PyErr_SetObject(PyExc_TypeError, arg);
         return NULL;
@@ -751,7 +751,7 @@ template<> PyObject *cast_<jobject>(PyTy
             PyErr_SetObject(PyExc_TypeError, clsArg);
             return NULL;
         }
-        else if (!PyType_IsSubtype((PyTypeObject *) clsArg, &PY_TYPE(JObject)))
+        else if (!PyType_IsSubtype((PyTypeObject *) clsArg, PY_TYPE(JObject)))
         {
             PyErr_SetObject(PyExc_ValueError, clsArg);
             return NULL;
@@ -793,7 +793,7 @@ template<> PyObject *cast_<jobject>(PyTy
 
 template<> PyObject *wrapfn_<jobject>(const jobject &object) {
     PyObject *cobj = PyObject_GetAttrString(
-        (PyObject *) &PY_TYPE(Object), "wrapfn_");
+        (PyObject *) PY_TYPE(Object), "wrapfn_");
     PyObject *(*wrapfn)(const jobject&) = NULL;
 
     if (cobj == NULL)
@@ -818,7 +818,7 @@ template<> PyObject *instance_<jobject>(
     if (!PyArg_ParseTuple(args, "O|O", &arg, &clsArg))
         return NULL;
 
-    if (!PyObject_TypeCheck(arg, &PY_TYPE(Object)))
+    if (!PyObject_TypeCheck(arg, PY_TYPE(Object)))
         Py_RETURN_FALSE;
 
     Class argCls = ((t_Object *) arg)->object.getClass();
@@ -833,7 +833,7 @@ template<> PyObject *instance_<jobject>(
             PyErr_SetObject(PyExc_TypeError, clsArg);
             return NULL;
         }
-        else if (!PyType_IsSubtype((PyTypeObject *) clsArg, &PY_TYPE(JObject)))
+        else if (!PyType_IsSubtype((PyTypeObject *) clsArg, PY_TYPE(JObject)))
         {
             PyErr_SetObject(PyExc_ValueError, clsArg);
             return NULL;
@@ -868,7 +868,7 @@ template<> PyObject *assignable_<jobject
     if (!PyArg_ParseTuple(args, "O|O", &arg, &clsArg))
         return NULL;
 
-    if (!PyObject_TypeCheck(arg, &PY_TYPE(Object)))
+    if (!PyObject_TypeCheck(arg, PY_TYPE(Object)))
         Py_RETURN_FALSE;
 
     Class argCls = ((t_Object *) arg)->object.getClass();
@@ -883,7 +883,7 @@ template<> PyObject *assignable_<jobject
             PyErr_SetObject(PyExc_TypeError, clsArg);
             return NULL;
         }
-        else if (!PyType_IsSubtype((PyTypeObject *) clsArg, &PY_TYPE(JObject)))
+        else if (!PyType_IsSubtype((PyTypeObject *) clsArg, PY_TYPE(JObject)))
         {
             PyErr_SetObject(PyExc_ValueError, clsArg);
             return NULL;

Modified: lucene/pylucene/trunk/jcc/jcc3/sources/JArray.h
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc3/sources/JArray.h?rev=1799796&r1=1799795&r2=1799796&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc3/sources/JArray.h (original)
+++ lucene/pylucene/trunk/jcc/jcc3/sources/JArray.h Sun Jun 25 13:45:41 2017
@@ -197,7 +197,7 @@ template<> class JArray<jobject> : publi
 
                 if (PyBytes_Check(obj) || PyUnicode_Check(obj))
                     jobj = env->fromPyString(obj);
-                else if (!PyObject_TypeCheck(obj, &PY_TYPE(JObject)))
+                else if (!PyObject_TypeCheck(obj, PY_TYPE(JObject)))
                 {
                     PyErr_SetObject(PyExc_TypeError, obj);
                     return -1;

Modified: lucene/pylucene/trunk/jcc/jcc3/sources/JCCEnv.cpp
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc3/sources/JCCEnv.cpp?rev=1799796&r1=1799795&r2=1799796&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc3/sources/JCCEnv.cpp (original)
+++ lucene/pylucene/trunk/jcc/jcc3/sources/JCCEnv.cpp Sun Jun 25 13:45:41 2017
@@ -512,7 +512,7 @@ bool JCCEnv::restorePythonException(jthr
     {
         jfieldID fid = vm_env->GetFieldID(pycls, "py_error_state", "J");
         PyObject *state = (PyObject *) vm_env->GetLongField(throwable, fid);
-        
+
         if (state != NULL)
         {
             PyObject *type = PyTuple_GET_ITEM(state, 0);

Modified: lucene/pylucene/trunk/jcc/jcc3/sources/JObject.cpp
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc3/sources/JObject.cpp?rev=1799796&r1=1799795&r2=1799796&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc3/sources/JObject.cpp (original)
+++ lucene/pylucene/trunk/jcc/jcc3/sources/JObject.cpp Sun Jun 25 13:45:41 2017
@@ -49,7 +49,8 @@ static PyGetSetDef t_JObject_properties[
     { NULL, NULL, NULL, NULL, NULL }
 };
 
-PyTypeObject PY_TYPE(JObject) = {
+
+static PyTypeObject JObject_type = {
     PyVarObject_HEAD_INIT(NULL, 0)
     "jcc.JObject",                       /* tp_name */
     sizeof(t_JObject),                   /* tp_basicsize */
@@ -91,6 +92,10 @@ PyTypeObject PY_TYPE(JObject) = {
     (newfunc)t_JObject_new,              /* tp_new */
 };
 
+// used only to hold a pointer to JObject_type once JObject type installed
+// so that Object type can be installed using JObject's spec (to get its base)
+PyType_Def PY_TYPE_DEF(JObject) = {};
+PyTypeObject *PY_TYPE(JObject) = &JObject_type;
 
 static void t_JObject_dealloc(t_JObject *self)
 {
@@ -115,7 +120,7 @@ static PyObject *t_JObject_richcmp(t_JOb
     switch (op) {
       case Py_EQ:
       case Py_NE:
-        if (PyObject_TypeCheck(arg, &PY_TYPE(JObject)))
+        if (PyObject_TypeCheck(arg, PY_TYPE(JObject)))
             b = self->object == ((t_JObject *) arg)->object;
         if (op == Py_EQ)
             Py_RETURN_BOOL(b);

Modified: lucene/pylucene/trunk/jcc/jcc3/sources/JObject.h
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc3/sources/JObject.h?rev=1799796&r1=1799795&r2=1799796&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc3/sources/JObject.h (original)
+++ lucene/pylucene/trunk/jcc/jcc3/sources/JObject.h Sun Jun 25 13:45:41 2017
@@ -83,6 +83,9 @@ public:
         return *this;
     }
 
+protected:
+    JObject() {}
+
 private:
     int id;      // zero when this$ is a weak ref */
 };
@@ -99,7 +102,7 @@ public:
     JObject object;
 };
 
-extern PyTypeObject PY_TYPE(JObject);
+DECLARE_TYPE(JObject);
 
 #endif /* PYTHON */
 

Modified: lucene/pylucene/trunk/jcc/jcc3/sources/functions.cpp
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc3/sources/functions.cpp?rev=1799796&r1=1799795&r2=1799796&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc3/sources/functions.cpp (original)
+++ lucene/pylucene/trunk/jcc/jcc3/sources/functions.cpp Sun Jun 25 13:45:41 2017
@@ -431,14 +431,14 @@ int _parseArgs(PyObject **args, unsigned
 
                           if (obj == Py_None)
                               ok = 1;
-                          else if (PyObject_TypeCheck(obj, &PY_TYPE(Object)) &&
+                          else if (PyObject_TypeCheck(obj, PY_TYPE(Object)) &&
                                    vm_env->IsInstanceOf(((t_Object *) obj)->object.this$, cls))
                               ok = 1;
-                          else if (PyObject_TypeCheck(obj, &PY_TYPE(FinalizerProxy)))
+                          else if (PyObject_TypeCheck(obj, PY_TYPE(FinalizerProxy)))
                           {
                               PyObject *o = ((t_fp *) obj)->object;
 
-                              if (PyObject_TypeCheck(o, &PY_TYPE(Object)) &&
+                              if (PyObject_TypeCheck(o, PY_TYPE(Object)) &&
                                   vm_env->IsInstanceOf(((t_Object *) o)->object.this$, cls))
                                   ok = 1;
                           }
@@ -457,14 +457,14 @@ int _parseArgs(PyObject **args, unsigned
 
                       if (arg == Py_None)
                           ok = 1;
-                      else if (PyObject_TypeCheck(arg, &PY_TYPE(Object)) &&
+                      else if (PyObject_TypeCheck(arg, PY_TYPE(Object)) &&
                                vm_env->IsInstanceOf(((t_Object *) arg)->object.this$, cls))
                           ok = 1;
-                      else if (PyObject_TypeCheck(arg, &PY_TYPE(FinalizerProxy)))
+                      else if (PyObject_TypeCheck(arg, PY_TYPE(FinalizerProxy)))
                       {
                           PyObject *o = ((t_fp *) arg)->object;
 
-                          if (PyObject_TypeCheck(o, &PY_TYPE(Object)) &&
+                          if (PyObject_TypeCheck(o, PY_TYPE(Object)) &&
                               vm_env->IsInstanceOf(((t_Object *) o)->object.this$, cls))
                               ok = 1;
                       }
@@ -475,13 +475,13 @@ int _parseArgs(PyObject **args, unsigned
                       }
                   }
               }
-              else if (PyObject_TypeCheck(arg, &PY_TYPE(Object)) &&
+              else if (PyObject_TypeCheck(arg, PY_TYPE(Object)) &&
                        vm_env->IsInstanceOf(((t_Object *) arg)->object.this$, cls))
                   break;
-              else if (PyObject_TypeCheck(arg, &PY_TYPE(FinalizerProxy)))
+              else if (PyObject_TypeCheck(arg, PY_TYPE(FinalizerProxy)))
               {
                   arg = ((t_fp *) arg)->object;
-                  if (PyObject_TypeCheck(arg, &PY_TYPE(Object)) &&
+                  if (PyObject_TypeCheck(arg, PY_TYPE(Object)) &&
                       vm_env->IsInstanceOf(((t_Object *) arg)->object.this$, cls))
                       break;
               }
@@ -954,7 +954,7 @@ int _parseArgs(PyObject **args, unsigned
               {
                   Object *obj = va_arg(list, Object *);
 
-                  if (PyObject_TypeCheck(arg, &PY_TYPE(FinalizerProxy)))
+                  if (PyObject_TypeCheck(arg, PY_TYPE(FinalizerProxy)))
                       arg = ((t_fp *) arg)->object;
 
 #ifdef _java_generics
@@ -1411,7 +1411,7 @@ void throwPythonError(void)
                 Py_XDECREF(traceback);
                 exc = je;
 
-                if (exc && PyObject_TypeCheck(exc, &PY_TYPE(Throwable)))
+                if (exc && PyObject_TypeCheck(exc, PY_TYPE(Throwable)))
                 {
                     jobject jobj = ((t_Throwable *) exc)->object.this$;
 
@@ -1527,10 +1527,10 @@ PyObject *callSuper(PyTypeObject *type,
 PyObject *castCheck(PyObject *obj, getclassfn initializeClass,
                     int reportError)
 {
-    if (PyObject_TypeCheck(obj, &PY_TYPE(FinalizerProxy)))
+    if (PyObject_TypeCheck(obj, PY_TYPE(FinalizerProxy)))
         obj = ((t_fp *) obj)->object;
 
-    if (!PyObject_TypeCheck(obj, &PY_TYPE(Object)))
+    if (!PyObject_TypeCheck(obj, PY_TYPE(Object)))
     {
         if (reportError)
             PyErr_SetObject(PyExc_TypeError, obj);
@@ -1577,9 +1577,9 @@ static bool setArrayObj(jobjectArray arr
         jobj = env->fromPyString(obj);
         deleteLocal = true;
     }
-    else if (PyObject_TypeCheck(obj, &PY_TYPE(JObject)))
+    else if (PyObject_TypeCheck(obj, PY_TYPE(JObject)))
         jobj = ((t_JObject *) obj)->object.this$;
-    else if (PyObject_TypeCheck(obj, &PY_TYPE(FinalizerProxy)))
+    else if (PyObject_TypeCheck(obj, PY_TYPE(FinalizerProxy)))
         jobj = ((t_JObject *) ((t_fp *) obj)->object)->object.this$;
     else if (obj == Py_True || obj == Py_False)
     {
@@ -1701,18 +1701,43 @@ jobjectArray fromPySequence(jclass cls,
     return array;
 }
 
-void installType(PyTypeObject *type, PyObject *module, char *name,
-                 int isExtension)
+PyTypeObject *makeType(PyType_Def *def)
 {
-    if (PyType_Ready(type) == 0)
+    if (def->type == NULL)
     {
-        Py_INCREF(type);
+        int count = 0;
+
+        for (PyType_Def **base = def->bases; *base != NULL; ++base)
+            count += 1;
+
+        PyObject *bases = PyTuple_New(count);
+
+        for (int i = 0; i < count; ++i)
+            PyTuple_SET_ITEM(bases, i, (PyObject *) makeType(def->bases[i]));
+
+        def->type = (PyTypeObject *)
+            PyType_FromSpecWithBases(&def->spec, bases);
+        Py_DECREF(bases);
+    }
+
+    return def->type;
+}
+
+void installType(PyTypeObject **type, PyType_Def *def,
+                 PyObject *module, char *name, int isExtension)
+{
+    if (*type == NULL)
+    {
+        *type = makeType(def);
+        Py_INCREF(*type);
+
         if (isExtension)
         {
-            Py_TYPE(type) = &PY_TYPE(FinalizerClass);
-            Py_INCREF(&PY_TYPE(FinalizerClass));
+            Py_TYPE(*type) = PY_TYPE(FinalizerClass);
+            Py_INCREF(PY_TYPE(FinalizerClass));
         }
-        PyModule_AddObject(module, name, (PyObject *) type);
+
+        PyModule_AddObject(module, name, (PyObject *) *type);
     }
 }
 
@@ -1739,7 +1764,7 @@ PyObject *unboxBoolean(const jobject& ob
         if (!env->isInstanceOf(obj, java::lang::Boolean::initializeClass))
         {
             PyErr_SetObject(PyExc_TypeError,
-                            (PyObject *) &java::lang::PY_TYPE(Boolean));
+                            (PyObject *) java::lang::PY_TYPE(Boolean));
             return NULL;
         }
 
@@ -1759,7 +1784,7 @@ PyObject *unboxByte(const jobject &obj)
         if (!env->isInstanceOf(obj, java::lang::Byte::initializeClass))
         {
             PyErr_SetObject(PyExc_TypeError,
-                            (PyObject *) &java::lang::PY_TYPE(Byte));
+                            (PyObject *) java::lang::PY_TYPE(Byte));
             return NULL;
         }
 
@@ -1776,7 +1801,7 @@ PyObject *unboxCharacter(const jobject &
         if (!env->isInstanceOf(obj, java::lang::Character::initializeClass))
         {
             PyErr_SetObject(PyExc_TypeError,
-                            (PyObject *) &java::lang::PY_TYPE(Character));
+                            (PyObject *) java::lang::PY_TYPE(Character));
             return NULL;
         }
 
@@ -1793,7 +1818,7 @@ PyObject *unboxDouble(const jobject &obj
         if (!env->isInstanceOf(obj, java::lang::Double::initializeClass))
         {
             PyErr_SetObject(PyExc_TypeError,
-                            (PyObject *) &java::lang::PY_TYPE(Double));
+                            (PyObject *) java::lang::PY_TYPE(Double));
             return NULL;
         }
 
@@ -1810,7 +1835,7 @@ PyObject *unboxFloat(const jobject &obj)
         if (!env->isInstanceOf(obj, java::lang::Float::initializeClass))
         {
             PyErr_SetObject(PyExc_TypeError,
-                            (PyObject *) &java::lang::PY_TYPE(Float));
+                            (PyObject *) java::lang::PY_TYPE(Float));
             return NULL;
         }
 
@@ -1827,7 +1852,7 @@ PyObject *unboxInteger(const jobject &ob
         if (!env->isInstanceOf(obj, java::lang::Integer::initializeClass))
         {
             PyErr_SetObject(PyExc_TypeError,
-                            (PyObject *) &java::lang::PY_TYPE(Integer));
+                            (PyObject *) java::lang::PY_TYPE(Integer));
             return NULL;
         }
 
@@ -1844,7 +1869,7 @@ PyObject *unboxLong(const jobject &obj)
         if (!env->isInstanceOf(obj, java::lang::Long::initializeClass))
         {
             PyErr_SetObject(PyExc_TypeError,
-                            (PyObject *) &java::lang::PY_TYPE(Long));
+                            (PyObject *) java::lang::PY_TYPE(Long));
             return NULL;
         }
 
@@ -1861,7 +1886,7 @@ PyObject *unboxShort(const jobject &obj)
         if (!env->isInstanceOf(obj, java::lang::Short::initializeClass))
         {
             PyErr_SetObject(PyExc_TypeError,
-                            (PyObject *) &java::lang::PY_TYPE(Short));
+                            (PyObject *) java::lang::PY_TYPE(Short));
             return NULL;
         }
 
@@ -1878,7 +1903,7 @@ PyObject *unboxString(const jobject &obj
         if (!env->isInstanceOf(obj, java::lang::String::initializeClass))
         {
             PyErr_SetObject(PyExc_TypeError,
-                            (PyObject *) &java::lang::PY_TYPE(String));
+                            (PyObject *) java::lang::PY_TYPE(String));
             return NULL;
         }
 
@@ -1896,7 +1921,7 @@ static int boxJObject(PyTypeObject *type
         if (obj != NULL)
             *obj = Object(NULL);
     }
-    else if (PyObject_TypeCheck(arg, &PY_TYPE(Object)))
+    else if (PyObject_TypeCheck(arg, PY_TYPE(Object)))
     {
         if (type != NULL && !is_instance_of(arg, type))
             return -1;
@@ -1904,10 +1929,10 @@ static int boxJObject(PyTypeObject *type
         if (obj != NULL)
             *obj = ((t_Object *) arg)->object;
     }
-    else if (PyObject_TypeCheck(arg, &PY_TYPE(FinalizerProxy)))
+    else if (PyObject_TypeCheck(arg, PY_TYPE(FinalizerProxy)))
     {
         arg = ((t_fp *) arg)->object;
-        if (PyObject_TypeCheck(arg, &PY_TYPE(Object)))
+        if (PyObject_TypeCheck(arg, PY_TYPE(Object)))
         {
             if (type != NULL && !is_instance_of(arg, type))
                 return -1;

Modified: lucene/pylucene/trunk/jcc/jcc3/sources/functions.h
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc3/sources/functions.h?rev=1799796&r1=1799795&r2=1799796&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc3/sources/functions.h (original)
+++ lucene/pylucene/trunk/jcc/jcc3/sources/functions.h Sun Jun 25 13:45:41 2017
@@ -90,7 +90,7 @@ java::lang::String p2j(PyObject *object)
 PyObject *j2p(const java::lang::String& js);
 PyObject *c2p(jchar c);
 
-PyObject *make_descriptor(PyTypeObject *value);
+PyObject *make_descriptor(PyType_Def *value);
 PyObject *make_descriptor(getclassfn initializeClass);
 PyObject *make_descriptor(getclassfn initializeClass, int generics);
 PyObject *make_descriptor(PyObject *value);
@@ -250,7 +250,7 @@ template<class T, class U, class V> PyOb
         PyErr_SetNone(PyExc_StopIteration);
         return NULL;
     }
-        
+
     jclass cls = env->getClass(java::lang::String::initializeClass);
     if (env->get_vm_env()->IsInstanceOf(next.this$, cls))
         return env->fromJString((jstring) next.this$, 0);
@@ -271,15 +271,16 @@ jobjectArray fromPySequence(jclass cls,
 jobjectArray fromPySequence(jclass cls, PyObject **args, int length);
 PyObject *castCheck(PyObject *obj, getclassfn initializeClass,
                     int reportError);
-void installType(PyTypeObject *type, PyObject *module, char *name,
-                 int isExtension);
+PyTypeObject *makeType(PyType_Def *def);
+void installType(PyTypeObject **type, PyType_Def *spec, PyObject *module,
+                 char *name, int isExtension);
 
 #ifdef _java_generics
 PyObject *typeParameters(PyTypeObject *types[], size_t size);
 #endif
 
-extern PyTypeObject PY_TYPE(FinalizerClass);
-extern PyTypeObject PY_TYPE(FinalizerProxy);
+extern PyTypeObject *PY_TYPE(FinalizerClass);
+extern PyTypeObject *PY_TYPE(FinalizerProxy);
 
 typedef struct {
     PyObject_HEAD

Modified: lucene/pylucene/trunk/jcc/jcc3/sources/jcc.cpp
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc3/sources/jcc.cpp?rev=1799796&r1=1799795&r2=1799796&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc3/sources/jcc.cpp (original)
+++ lucene/pylucene/trunk/jcc/jcc3/sources/jcc.cpp Sun Jun 25 13:45:41 2017
@@ -83,7 +83,7 @@ static PyMethodDef t_jccenv_methods[] =
     { NULL, NULL, 0, NULL }
 };
 
-PyTypeObject PY_TYPE(JCCEnv) = {
+static PyTypeObject JCCEnv_type = {
     PyVarObject_HEAD_INIT(NULL, 0)
     "jcc.JCCEnv",                        /* tp_name */
     sizeof(t_jccenv),                    /* tp_basicsize */
@@ -123,6 +123,7 @@ PyTypeObject PY_TYPE(JCCEnv) = {
     0,                                   /* tp_alloc */
     0,                                   /* tp_new */
 };
+PyTypeObject *PY_TYPE(JCCEnv) = &JCCEnv_type;
 
 static void t_jccenv_dealloc(t_jccenv *self)
 {
@@ -316,7 +317,7 @@ _DLL_EXPORT PyObject *getVMEnv(PyObject
 {
     if (env->vm != NULL)
     {
-        t_jccenv *jccenv = (t_jccenv *) PY_TYPE(JCCEnv).tp_alloc(&PY_TYPE(JCCEnv), 0);
+        t_jccenv *jccenv = (t_jccenv *) PY_TYPE(JCCEnv)->tp_alloc(PY_TYPE(JCCEnv), 0);
         jccenv->env = env;
 
         return (PyObject *) jccenv;
@@ -343,7 +344,7 @@ _DLL_EXPORT PyObject *initJCC(PyObject *
     if (_once_only)
     {
         PyEval_InitThreads();
-        INSTALL_TYPE(JCCEnv, module);
+        INSTALL_STATIC_TYPE(JCCEnv, module);
 
         if (env == NULL)
             env = new JCCEnv(NULL, NULL);
@@ -538,7 +539,7 @@ _DLL_EXPORT PyObject *initVM(PyObject *s
         for (unsigned int i = 0; i < nOptions; i++)
             delete vm_options[i].optionString;
 
-        t_jccenv *jccenv = (t_jccenv *) PY_TYPE(JCCEnv).tp_alloc(&PY_TYPE(JCCEnv), 0);
+        t_jccenv *jccenv = (t_jccenv *) PY_TYPE(JCCEnv)->tp_alloc(PY_TYPE(JCCEnv), 0);
         jccenv->env = env;
 
 #ifdef _jcc_lib

Modified: lucene/pylucene/trunk/jcc/jcc3/sources/macros.h
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc3/sources/macros.h?rev=1799796&r1=1799795&r2=1799796&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc3/sources/macros.h (original)
+++ lucene/pylucene/trunk/jcc/jcc3/sources/macros.h Sun Jun 25 13:45:41 2017
@@ -63,56 +63,36 @@
 #define DECLARE_GETSET_FIELD(type, name)        \
     { #name, (getter) type##_get__##name, (setter) type##_set__##name, "", NULL }
 
-#define PY_TYPE(name) name##$$Type
+struct PyType_Def {
+    PyType_Spec spec;
+    PyTypeObject *type;
+    PyType_Def **bases;   // NULL terminated array
+};
 
-#define DECLARE_TYPE(name, t_name, base, javaClass,                         \
-                     init, iter, iternext, getset, mapping, sequence)       \
-PyTypeObject PY_TYPE(name) = {                                              \
-    PyVarObject_HEAD_INIT(NULL, 0)                                          \
-    /* tp_name            */   #name,                                       \
-    /* tp_basicsize       */   sizeof(t_name),                              \
-    /* tp_itemsize        */   0,                                           \
-    /* tp_dealloc         */   0,                                           \
-    /* tp_print           */   0,                                           \
-    /* tp_getattr         */   0,                                           \
-    /* tp_setattr         */   0,                                           \
-    /* tp_compare         */   0,                                           \
-    /* tp_repr            */   0,                                           \
-    /* tp_as_number       */   0,                                           \
-    /* tp_as_sequence     */   sequence,                                    \
-    /* tp_as_mapping      */   mapping,                                     \
-    /* tp_hash            */   0,                                           \
-    /* tp_call            */   0,                                           \
-    /* tp_str             */   0,                                           \
-    /* tp_getattro        */   0,                                           \
-    /* tp_setattro        */   0,                                           \
-    /* tp_as_buffer       */   0,                                           \
-    /* tp_flags           */   Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,    \
-    /* tp_doc             */   #t_name" objects",                           \
-    /* tp_traverse        */   0,                                           \
-    /* tp_clear           */   0,                                           \
-    /* tp_richcompare     */   0,                                           \
-    /* tp_weaklistoffset  */   0,                                           \
-    /* tp_iter            */   (getiterfunc) iter,                          \
-    /* tp_iternext        */   (iternextfunc) iternext,                     \
-    /* tp_methods         */   t_name##__methods_,                          \
-    /* tp_members         */   0,                                           \
-    /* tp_getset          */   getset,                                      \
-    /* tp_base            */   &PY_TYPE(base),                              \
-    /* tp_dict            */   0,                                           \
-    /* tp_descr_get       */   0,                                           \
-    /* tp_descr_set       */   0,                                           \
-    /* tp_dictoffset      */   0,                                           \
-    /* tp_init            */   (initproc)init,                              \
-    /* tp_alloc           */   0,                                           \
-    /* tp_new             */   0,                                           \
+#define PY_TYPE(name) name##$$Type
+#define PY_TYPE_DEF(name) name##$$TypeDef
+#define PY_TYPE_BASES(name) name##$$TypeBases
+#define PY_TYPE_SLOTS(name) name##$$TypeSlots
+
+#define DEFINE_TYPE(name, t_name, javaClass)                                \
+PyType_Def PY_TYPE_DEF(name) = {                                            \
+  {                                                                         \
+    #name,                                                                  \
+    sizeof(t_name),                                                         \
+    0,                                                                      \
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,                               \
+    PY_TYPE_SLOTS(name)                                                     \
+  },                                                                        \
+  NULL,                                                                     \
+  PY_TYPE_BASES(name),                                                      \
 };                                                                          \
+PyTypeObject *PY_TYPE(name) = NULL;                                         \
 PyObject *t_name::wrap_Object(const javaClass& object)                  \
 {                                                                       \
     if (!!object)                                                       \
     {                                                                   \
         t_name *self =                                                  \
-            (t_name *) PY_TYPE(name).tp_alloc(&PY_TYPE(name), 0);       \
+            (t_name *) PY_TYPE(name)->tp_alloc(PY_TYPE(name), 0);       \
         if (self)                                                       \
             self->object = object;                                      \
         return (PyObject *) self;                                       \
@@ -126,11 +106,11 @@ PyObject *t_name::wrap_jobject(const job
         if (!env->isInstanceOf(object, javaClass::initializeClass))     \
         {                                                               \
             PyErr_SetObject(PyExc_TypeError,                            \
-                            (PyObject *) &PY_TYPE(name));               \
+                            (PyObject *) PY_TYPE(name));                \
             return NULL;                                                \
         }                                                               \
         t_name *self = (t_name *)                                       \
-            PY_TYPE(name).tp_alloc(&PY_TYPE(name), 0);                  \
+            PY_TYPE(name)->tp_alloc(PY_TYPE(name), 0);                  \
         if (self)                                                       \
             self->object = javaClass(object);                           \
         return (PyObject *) self;                                       \
@@ -138,12 +118,18 @@ PyObject *t_name::wrap_jobject(const job
     Py_RETURN_NONE;                                                     \
 }                                                                       \
 
+#define DECLARE_TYPE(name)                                              \
+    extern PyType_Def PY_TYPE_DEF(name);                                \
+    extern PyTypeObject *PY_TYPE(name)
 
 #define INSTALL_TYPE(name, module)                                      \
-    if (PyType_Ready(&PY_TYPE(name)) == 0)                              \
+    installType(&PY_TYPE(name), &PY_TYPE_DEF(name), module, #name, 0)
+
+#define INSTALL_STATIC_TYPE(name, module)                               \
+    if (PyType_Ready(PY_TYPE(name)) == 0)                               \
     {                                                                   \
-        Py_INCREF(&PY_TYPE(name));                                      \
-        PyModule_AddObject(module, #name, (PyObject *) &PY_TYPE(name)); \
+        Py_INCREF(PY_TYPE(name));                                       \
+        PyModule_AddObject(module, #name, (PyObject *) PY_TYPE(name));  \
     }
 
 

Modified: lucene/pylucene/trunk/jcc/jcc3/sources/types.cpp
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc3/sources/types.cpp?rev=1799796&r1=1799795&r2=1799796&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc3/sources/types.cpp (original)
+++ lucene/pylucene/trunk/jcc/jcc3/sources/types.cpp Sun Jun 25 13:45:41 2017
@@ -49,7 +49,7 @@ static PyObject *t_fp_seq_inplace_concat
 static PyObject *t_fp_seq_inplace_repeat(t_fp *self, Py_ssize_t n);
 
 
-PyTypeObject PY_TYPE(FinalizerClass) = {
+static PyTypeObject FinalizerClass_type = {
     PyVarObject_HEAD_INIT(NULL, 0)
     "jcc.FinalizerClass",                /* tp_name */
     PyType_Type.tp_basicsize,            /* tp_basicsize */
@@ -89,6 +89,7 @@ PyTypeObject PY_TYPE(FinalizerClass) = {
     0,                                   /* tp_alloc */
     0,                                   /* tp_new */
 };
+PyTypeObject *PY_TYPE(FinalizerClass) = &FinalizerClass_type;
 
 static PyMappingMethods t_fp_as_mapping = {
     (lenfunc)t_fp_map_length,            /* mp_length          */
@@ -109,7 +110,7 @@ static PySequenceMethods t_fp_as_sequenc
     (ssizeargfunc)t_fp_seq_inplace_repeat,    /* sq_inplace_repeat */
 };
 
-PyTypeObject PY_TYPE(FinalizerProxy) = {
+static PyTypeObject FinalizerProxy_type = {
     PyVarObject_HEAD_INIT(NULL, 0)
     "jcc.FinalizerProxy",                /* tp_name */
     sizeof(t_fp),                        /* tp_basicsize */
@@ -150,6 +151,7 @@ PyTypeObject PY_TYPE(FinalizerProxy) = {
     0,                                   /* tp_alloc */
     0,                                   /* tp_new */
 };
+PyTypeObject *PY_TYPE(FinalizerProxy) = &FinalizerProxy_type;
 
 static PyObject *t_fc_call(PyObject *self, PyObject *args, PyObject *kwds)
 {
@@ -157,7 +159,7 @@ static PyObject *t_fc_call(PyObject *sel
 
     if (obj)
     {
-        t_fp *fp = (t_fp *) PY_TYPE(FinalizerProxy).tp_alloc(&PY_TYPE(FinalizerProxy), 0);
+        t_fp *fp = (t_fp *) PY_TYPE(FinalizerProxy)->tp_alloc(PY_TYPE(FinalizerProxy), 0);
 
         fp->object = obj;      /* released by t_fp_clear() */
         obj = (PyObject *) fp;
@@ -292,7 +294,7 @@ static PyMethodDef t_descriptor_methods[
 };
 
 
-PyTypeObject PY_TYPE(ConstVariableDescriptor) = {
+static PyTypeObject ConstVariableDescriptor_type = {
     PyVarObject_HEAD_INIT(NULL, 0)
     "jcc.ConstVariableDescriptor",       /* tp_name */
     sizeof(t_descriptor),                /* tp_basicsize */
@@ -332,6 +334,7 @@ PyTypeObject PY_TYPE(ConstVariableDescri
     0,                                   /* tp_alloc */
     0,                                   /* tp_new */
 };
+PyTypeObject *PY_TYPE(ConstVariableDescriptor) = &ConstVariableDescriptor_type;
 
 static void t_descriptor_dealloc(t_descriptor *self)
 {
@@ -342,15 +345,17 @@ static void t_descriptor_dealloc(t_descr
     self->ob_base.ob_type->tp_free((PyObject *) self);
 }
 
-PyObject *make_descriptor(PyTypeObject *value)
+PyObject *make_descriptor(PyType_Def *value)
 {
     t_descriptor *self = (t_descriptor *)
-        PY_TYPE(ConstVariableDescriptor).tp_alloc(&PY_TYPE(ConstVariableDescriptor), 0);
+        PY_TYPE(ConstVariableDescriptor)->tp_alloc(PY_TYPE(ConstVariableDescriptor), 0);
 
     if (self)
     {
-        Py_INCREF(value);
-        self->access.value = (PyObject *) value;
+        PyTypeObject *type = makeType(value);
+
+        Py_INCREF(type);
+        self->access.value = (PyObject *) type;
         self->flags = DESCRIPTOR_VALUE;
     }
 
@@ -360,7 +365,7 @@ PyObject *make_descriptor(PyTypeObject *
 PyObject *make_descriptor(getclassfn initializeClass)
 {
     t_descriptor *self = (t_descriptor *)
-        PY_TYPE(ConstVariableDescriptor).tp_alloc(&PY_TYPE(ConstVariableDescriptor), 0);
+        PY_TYPE(ConstVariableDescriptor)->tp_alloc(PY_TYPE(ConstVariableDescriptor), 0);
 
     if (self)
     {
@@ -384,7 +389,7 @@ PyObject *make_descriptor(getclassfn ini
 PyObject *make_descriptor(PyObject *value)
 {
     t_descriptor *self = (t_descriptor *)
-        PY_TYPE(ConstVariableDescriptor).tp_alloc(&PY_TYPE(ConstVariableDescriptor), 0);
+        PY_TYPE(ConstVariableDescriptor)->tp_alloc(PY_TYPE(ConstVariableDescriptor), 0);
 
     if (self)
     {
@@ -410,7 +415,7 @@ PyObject *make_descriptor(boxfn fn)
 PyObject *make_descriptor(jboolean b)
 {
     t_descriptor *self = (t_descriptor *)
-        PY_TYPE(ConstVariableDescriptor).tp_alloc(&PY_TYPE(ConstVariableDescriptor), 0);
+        PY_TYPE(ConstVariableDescriptor)->tp_alloc(PY_TYPE(ConstVariableDescriptor), 0);
 
     if (self)
     {
@@ -425,7 +430,7 @@ PyObject *make_descriptor(jboolean b)
 PyObject *make_descriptor(jbyte value)
 {
     t_descriptor *self = (t_descriptor *)
-        PY_TYPE(ConstVariableDescriptor).tp_alloc(&PY_TYPE(ConstVariableDescriptor), 0);
+        PY_TYPE(ConstVariableDescriptor)->tp_alloc(PY_TYPE(ConstVariableDescriptor), 0);
 
     if (self)
     {
@@ -439,7 +444,7 @@ PyObject *make_descriptor(jbyte value)
 PyObject *make_descriptor(jchar value)
 {
     t_descriptor *self = (t_descriptor *)
-        PY_TYPE(ConstVariableDescriptor).tp_alloc(&PY_TYPE(ConstVariableDescriptor), 0);
+        PY_TYPE(ConstVariableDescriptor)->tp_alloc(PY_TYPE(ConstVariableDescriptor), 0);
 
     if (self)
     {
@@ -453,7 +458,7 @@ PyObject *make_descriptor(jchar value)
 PyObject *make_descriptor(jdouble value)
 {
     t_descriptor *self = (t_descriptor *)
-        PY_TYPE(ConstVariableDescriptor).tp_alloc(&PY_TYPE(ConstVariableDescriptor), 0);
+        PY_TYPE(ConstVariableDescriptor)->tp_alloc(PY_TYPE(ConstVariableDescriptor), 0);
 
     if (self)
     {
@@ -467,7 +472,7 @@ PyObject *make_descriptor(jdouble value)
 PyObject *make_descriptor(jfloat value)
 {
     t_descriptor *self = (t_descriptor *)
-        PY_TYPE(ConstVariableDescriptor).tp_alloc(&PY_TYPE(ConstVariableDescriptor), 0);
+        PY_TYPE(ConstVariableDescriptor)->tp_alloc(PY_TYPE(ConstVariableDescriptor), 0);
 
     if (self)
     {
@@ -481,7 +486,7 @@ PyObject *make_descriptor(jfloat value)
 PyObject *make_descriptor(jint value)
 {
     t_descriptor *self = (t_descriptor *)
-        PY_TYPE(ConstVariableDescriptor).tp_alloc(&PY_TYPE(ConstVariableDescriptor), 0);
+        PY_TYPE(ConstVariableDescriptor)->tp_alloc(PY_TYPE(ConstVariableDescriptor), 0);
 
     if (self)
     {
@@ -495,7 +500,7 @@ PyObject *make_descriptor(jint value)
 PyObject *make_descriptor(jlong value)
 {
     t_descriptor *self = (t_descriptor *)
-        PY_TYPE(ConstVariableDescriptor).tp_alloc(&PY_TYPE(ConstVariableDescriptor), 0);
+        PY_TYPE(ConstVariableDescriptor)->tp_alloc(PY_TYPE(ConstVariableDescriptor), 0);
 
     if (self)
     {
@@ -509,7 +514,7 @@ PyObject *make_descriptor(jlong value)
 PyObject *make_descriptor(jshort value)
 {
     t_descriptor *self = (t_descriptor *)
-        PY_TYPE(ConstVariableDescriptor).tp_alloc(&PY_TYPE(ConstVariableDescriptor), 0);
+        PY_TYPE(ConstVariableDescriptor)->tp_alloc(PY_TYPE(ConstVariableDescriptor), 0);
 
     if (self)
     {