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 2010/04/06 07:04:13 UTC

svn commit: r931019 - in /lucene/pylucene/trunk/jcc: ./ _jcc/java/lang/ jcc/ jcc/sources/

Author: vajda
Date: Tue Apr  6 05:04:12 2010
New Revision: 931019

URL: http://svn.apache.org/viewvc?rev=931019&view=rev
Log:
 - improved auto-boxing of primitive type parameters into their class

Modified:
    lucene/pylucene/trunk/jcc/CHANGES
    lucene/pylucene/trunk/jcc/_jcc/java/lang/Boolean.cpp
    lucene/pylucene/trunk/jcc/_jcc/java/lang/Boolean.h
    lucene/pylucene/trunk/jcc/_jcc/java/lang/Byte.cpp
    lucene/pylucene/trunk/jcc/_jcc/java/lang/Byte.h
    lucene/pylucene/trunk/jcc/_jcc/java/lang/Character.cpp
    lucene/pylucene/trunk/jcc/_jcc/java/lang/Character.h
    lucene/pylucene/trunk/jcc/_jcc/java/lang/Float.cpp
    lucene/pylucene/trunk/jcc/_jcc/java/lang/Float.h
    lucene/pylucene/trunk/jcc/_jcc/java/lang/Short.cpp
    lucene/pylucene/trunk/jcc/_jcc/java/lang/Short.h
    lucene/pylucene/trunk/jcc/jcc/python.py
    lucene/pylucene/trunk/jcc/jcc/sources/functions.cpp
    lucene/pylucene/trunk/jcc/jcc/sources/functions.h
    lucene/pylucene/trunk/jcc/jcc/sources/types.cpp

Modified: lucene/pylucene/trunk/jcc/CHANGES
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/CHANGES?rev=931019&r1=931018&r2=931019&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/CHANGES (original)
+++ lucene/pylucene/trunk/jcc/CHANGES Tue Apr  6 05:04:12 2010
@@ -11,6 +11,7 @@ Version 2.5 ->
  - added support for of_() method to set instance type parameters
  - fixed bug with not heeding type parameter for --sequence get method
  - parameterized return values are now unboxed
+ - improved auto-boxing of primitive type parameters into their class
  - 
 
 Version 2.4 -> 2.5

Modified: lucene/pylucene/trunk/jcc/_jcc/java/lang/Boolean.cpp
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/_jcc/java/lang/Boolean.cpp?rev=931019&r1=931018&r2=931019&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/_jcc/java/lang/Boolean.cpp (original)
+++ lucene/pylucene/trunk/jcc/_jcc/java/lang/Boolean.cpp Tue Apr  6 05:04:12 2010
@@ -22,6 +22,7 @@ namespace java {
     namespace lang {
 
         enum {
+            mid__init_,
             mid_booleanValue,
             max_mid
         };
@@ -39,9 +40,9 @@ namespace java {
                 jclass cls = env->findClass("java/lang/Boolean");
 
                 _mids = new jmethodID[max_mid];
+                _mids[mid__init_] = env->getMethodID(cls, "<init>", "(Z)V");
                 _mids[mid_booleanValue] =
-                    env->getMethodID(cls, "booleanValue",
-                                     "()Z");
+                    env->getMethodID(cls, "booleanValue", "()Z");
 
                 class$ = (Class *) new JObject(cls);
 
@@ -52,6 +53,9 @@ namespace java {
             return (jclass) class$->this$;
         }
 
+        Boolean::Boolean(jboolean b) : Object(env->newObject(initializeClass, &_mids, mid__init_, b)) {
+        }
+
         int Boolean::booleanValue() const
         {
             return (int) env->callBooleanMethod(this$, _mids[mid_booleanValue]);

Modified: lucene/pylucene/trunk/jcc/_jcc/java/lang/Boolean.h
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/_jcc/java/lang/Boolean.h?rev=931019&r1=931018&r2=931019&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/_jcc/java/lang/Boolean.h (original)
+++ lucene/pylucene/trunk/jcc/_jcc/java/lang/Boolean.h Tue Apr  6 05:04:12 2010
@@ -31,6 +31,7 @@ namespace java {
             explicit Boolean(jobject obj) : Object(obj) {
                 initializeClass();
             }
+            Boolean(jboolean);
 
             int booleanValue() const;
 

Modified: lucene/pylucene/trunk/jcc/_jcc/java/lang/Byte.cpp
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/_jcc/java/lang/Byte.cpp?rev=931019&r1=931018&r2=931019&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/_jcc/java/lang/Byte.cpp (original)
+++ lucene/pylucene/trunk/jcc/_jcc/java/lang/Byte.cpp Tue Apr  6 05:04:12 2010
@@ -22,6 +22,7 @@ namespace java {
     namespace lang {
 
         enum {
+            mid__init_,
             mid_byteValue,
             max_mid
         };
@@ -36,9 +37,9 @@ namespace java {
                 jclass cls = env->findClass("java/lang/Byte");
 
                 _mids = new jmethodID[max_mid];
+                _mids[mid__init_] = env->getMethodID(cls, "<init>", "(B)V");
                 _mids[mid_byteValue] =
-                    env->getMethodID(cls, "byteValue",
-                                     "()B");
+                    env->getMethodID(cls, "byteValue", "()B");
 
                 class$ = (Class *) new JObject(cls);
             }
@@ -46,6 +47,9 @@ namespace java {
             return (jclass) class$->this$;
         }
 
+        Byte::Byte(jbyte b) : Object(env->newObject(initializeClass, &_mids, mid__init_, b)) {
+        }
+
         jbyte Byte::byteValue() const
         {
             return env->callByteMethod(this$, _mids[mid_byteValue]);

Modified: lucene/pylucene/trunk/jcc/_jcc/java/lang/Byte.h
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/_jcc/java/lang/Byte.h?rev=931019&r1=931018&r2=931019&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/_jcc/java/lang/Byte.h (original)
+++ lucene/pylucene/trunk/jcc/_jcc/java/lang/Byte.h Tue Apr  6 05:04:12 2010
@@ -31,6 +31,7 @@ namespace java {
             explicit Byte(jobject obj) : Object(obj) {
                 initializeClass();
             }
+            Byte(jbyte);
 
             jbyte byteValue() const;
         };

Modified: lucene/pylucene/trunk/jcc/_jcc/java/lang/Character.cpp
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/_jcc/java/lang/Character.cpp?rev=931019&r1=931018&r2=931019&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/_jcc/java/lang/Character.cpp (original)
+++ lucene/pylucene/trunk/jcc/_jcc/java/lang/Character.cpp Tue Apr  6 05:04:12 2010
@@ -22,6 +22,7 @@ namespace java {
     namespace lang {
 
         enum {
+            mid__init_,
             mid_charValue,
             max_mid
         };
@@ -36,9 +37,9 @@ namespace java {
                 jclass cls = env->findClass("java/lang/Character");
 
                 _mids = new jmethodID[max_mid];
+                _mids[mid__init_] = env->getMethodID(cls, "<init>", "(C)V");
                 _mids[mid_charValue] =
-                    env->getMethodID(cls, "charValue",
-                                     "()C");
+                    env->getMethodID(cls, "charValue", "()C");
 
                 class$ = (Class *) new JObject(cls);
             }
@@ -46,6 +47,9 @@ namespace java {
             return (jclass) class$->this$;
         }
 
+        Character::Character(jchar c) : Object(env->newObject(initializeClass, &_mids, mid__init_, c)) {
+        }
+
         jchar Character::charValue() const
         {
             return env->callCharMethod(this$, _mids[mid_charValue]);

Modified: lucene/pylucene/trunk/jcc/_jcc/java/lang/Character.h
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/_jcc/java/lang/Character.h?rev=931019&r1=931018&r2=931019&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/_jcc/java/lang/Character.h (original)
+++ lucene/pylucene/trunk/jcc/_jcc/java/lang/Character.h Tue Apr  6 05:04:12 2010
@@ -31,6 +31,7 @@ namespace java {
             explicit Character(jobject obj) : Object(obj) {
                 initializeClass();
             }
+            Character(jchar);
 
             jchar charValue() const;
         };

Modified: lucene/pylucene/trunk/jcc/_jcc/java/lang/Float.cpp
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/_jcc/java/lang/Float.cpp?rev=931019&r1=931018&r2=931019&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/_jcc/java/lang/Float.cpp (original)
+++ lucene/pylucene/trunk/jcc/_jcc/java/lang/Float.cpp Tue Apr  6 05:04:12 2010
@@ -22,6 +22,7 @@ namespace java {
     namespace lang {
 
         enum {
+            mid__init_,
             mid_floatValue,
             max_mid
         };
@@ -36,9 +37,9 @@ namespace java {
                 jclass cls = env->findClass("java/lang/Float");
 
                 _mids = new jmethodID[max_mid];
+                _mids[mid__init_] = env->getMethodID(cls, "<init>", "(F)V");
                 _mids[mid_floatValue] =
-                    env->getMethodID(cls, "floatValue",
-                                     "()F");
+                    env->getMethodID(cls, "floatValue", "()F");
 
                 class$ = (Class *) new JObject(cls);
             }
@@ -46,6 +47,9 @@ namespace java {
             return (jclass) class$->this$;
         }
 
+        Float::Float(jfloat f) : Object(env->newObject(initializeClass, &_mids, mid__init_, f)) {
+        }
+
         jfloat Float::floatValue() const
         {
             return env->callFloatMethod(this$, _mids[mid_floatValue]);

Modified: lucene/pylucene/trunk/jcc/_jcc/java/lang/Float.h
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/_jcc/java/lang/Float.h?rev=931019&r1=931018&r2=931019&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/_jcc/java/lang/Float.h (original)
+++ lucene/pylucene/trunk/jcc/_jcc/java/lang/Float.h Tue Apr  6 05:04:12 2010
@@ -31,6 +31,7 @@ namespace java {
             explicit Float(jobject obj) : Object(obj) {
                 initializeClass();
             }
+            Float(jfloat);
 
             jfloat floatValue() const;
         };

Modified: lucene/pylucene/trunk/jcc/_jcc/java/lang/Short.cpp
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/_jcc/java/lang/Short.cpp?rev=931019&r1=931018&r2=931019&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/_jcc/java/lang/Short.cpp (original)
+++ lucene/pylucene/trunk/jcc/_jcc/java/lang/Short.cpp Tue Apr  6 05:04:12 2010
@@ -22,6 +22,7 @@ namespace java {
     namespace lang {
 
         enum {
+            mid__init_,
             mid_shortValue,
             max_mid
         };
@@ -36,9 +37,9 @@ namespace java {
                 jclass cls = env->findClass("java/lang/Short");
 
                 _mids = new jmethodID[max_mid];
+                _mids[mid__init_] = env->getMethodID(cls, "<init>", "(S)V");
                 _mids[mid_shortValue] =
-                    env->getMethodID(cls, "shortValue",
-                                     "()S");
+                    env->getMethodID(cls, "shortValue", "()S");
 
                 class$ = (Class *) new JObject(cls);
             }
@@ -46,6 +47,9 @@ namespace java {
             return (jclass) class$->this$;
         }
 
+        Short::Short(jshort n) : Object(env->newObject(initializeClass, &_mids, mid__init_, n)) {
+        }
+
         jshort Short::shortValue() const
         {
             return env->callShortMethod(this$, _mids[mid_shortValue]);

Modified: lucene/pylucene/trunk/jcc/_jcc/java/lang/Short.h
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/_jcc/java/lang/Short.h?rev=931019&r1=931018&r2=931019&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/_jcc/java/lang/Short.h (original)
+++ lucene/pylucene/trunk/jcc/_jcc/java/lang/Short.h Tue Apr  6 05:04:12 2010
@@ -31,6 +31,7 @@ namespace java {
             explicit Short(jobject obj) : Object(obj) {
                 initializeClass();
             }
+            Short(jshort);
 
             jshort shortValue() const;
         };

Modified: lucene/pylucene/trunk/jcc/jcc/python.py
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc/python.py?rev=931019&r1=931018&r2=931019&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc/python.py (original)
+++ lucene/pylucene/trunk/jcc/jcc/python.py Tue Apr  6 05:04:12 2010
@@ -13,6 +13,7 @@
 #
 
 import os, sys, platform, shutil, _jcc
+from itertools import izip
 
 from cpp import PRIMITIVES, INDENT, HALF_INDENT
 from cpp import cppname, cppnames, typename
@@ -85,9 +86,16 @@ def getActualTypeArguments(pt):
         pt = ParameterizedType.cast_(pt)
 
 
-def parseArgs(params, current, generics):
+def parseArgs(params, current, generics, genericParams=None):
 
-    def signature(cls):
+    def signature(cls, genericPT=None):
+        if generics and TypeVariable.instance_(genericPT):
+            if cls.getName() == 'java.lang.Object':
+                gd = TypeVariable.cast_(genericPT).getGenericDeclaration()
+                if gd == current:
+                    for clsParam in getTypeParameters(gd):
+                        if genericPT == clsParam:
+                            return 'O'
         array = ''
         while cls.isArray():
             array += '['
@@ -99,17 +107,32 @@ def parseArgs(params, current, generics)
             return array + 's'
         if clsName == 'java.lang.Object':
             return array + 'o'
+        if clsName in BOXED:
+            return array + 'O'
         if generics and getTypeParameters(cls):
             return array + 'K'
         else:
             return array + 'k'
 
-    def checkarg(cls):
+    def checkarg(cls, genericPT=None):
+        if generics and TypeVariable.instance_(genericPT):
+            if cls.getName() == 'java.lang.Object':
+                gd = TypeVariable.cast_(genericPT).getGenericDeclaration()
+                if gd == current:
+                    i = 0
+                    for clsParam in getTypeParameters(gd):
+                        if genericPT == clsParam:
+                            return ', self->parameters[%d]' %(i)
+                        i += 1
         while cls.isArray():
             cls = cls.getComponentType()
+        clsName = cls.getName()
         if (cls.isPrimitive() or
-            cls.getName() in ('java.lang.String', 'java.lang.Object')):
+            clsName in ('java.lang.String', 'java.lang.Object')):
             return ''
+        if clsName in BOXED:
+            clsNames = clsName.split('.')
+            return ', &%s::%s$$Type' %('::'.join(cppnames(clsNames[:-1])), cppname(clsNames[-1]))
         return ', %s::initializeClass' %(typename(cls, current, False))
 
     def callarg(cls, i):
@@ -121,8 +144,16 @@ def parseArgs(params, current, generics)
                 return ', &a%d, &p%d, %s%st_%s::parameters_' %(i, i, ns, sep, n)
         return ', &a%d' %(i)
 
-    return (''.join([signature(param) for param in params]),
-            ''.join([checkarg(param) for param in params]),
+    if genericParams:
+        sig = ''.join([signature(param, genericParam)
+                       for param, genericParam in izip(params, genericParams)])
+        check = ''.join([checkarg(param, genericParam)
+                         for param, genericParam in izip(params, genericParams)])
+    else:
+        sig = ''.join([signature(param) for param in params])
+        check = ''.join([checkarg(param) for param in params])
+
+    return (sig, check,
             ''.join([callarg(params[i], i) for i in xrange(len(params))]))
 
 
@@ -298,9 +329,11 @@ def call(out, indent, cls, inCase, metho
     returnType = method.getReturnType()
     if generics:
         genericRT = method.getGenericReturnType()
+        genericParams = method.getGenericParameterTypes()
         typeParams = set()
     else:
         genericRT = None
+        genericParams = None
         typeParams = None
     count = len(params)
 
@@ -322,7 +355,7 @@ def call(out, indent, cls, inCase, metho
             line(out, indent, 'if (arg)')
         else:
             line(out, indent, 'if (!parseArg%s(arg%s, "%s"%s%s))',
-                 s, s, *parseArgs(params, cls, generics))
+                 s, s, *parseArgs(params, cls, generics, genericParams))
         line(out, indent, '{')
         indent += 1
 
@@ -984,9 +1017,13 @@ def python(env, out_h, out, cls, superCl
 
     if cls.getName() in BOXED:
         wrapfn_ = "unbox%s" %(names[-1])
+        boxfn_ = "box%s" %(names[-1])
     else:
         wrapfn_ = "t_%s::wrap_jobject" %(names[-1])
+        boxfn_ = "boxObject"
+
     line(out, indent + 1, 'PyDict_SetItemString(%s$$Type.tp_dict, "wrapfn_", make_descriptor(%s));', names[-1], wrapfn_)
+    line(out, indent + 1, 'PyDict_SetItemString(%s$$Type.tp_dict, "boxfn_", make_descriptor(%s));', names[-1], boxfn_)
 
     if isExtension:
         line(out, indent + 1, 'jclass cls = %s::initializeClass();',

Modified: lucene/pylucene/trunk/jcc/jcc/sources/functions.cpp
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc/sources/functions.cpp?rev=931019&r1=931018&r2=931019&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc/sources/functions.cpp (original)
+++ lucene/pylucene/trunk/jcc/jcc/sources/functions.cpp Tue Apr  6 05:04:12 2010
@@ -91,6 +91,40 @@ PyObject *findClass(PyObject *self, PyOb
     Py_RETURN_NONE;
 }
 
+#ifdef _java_generics
+static boxfn get_boxfn(PyTypeObject *type)
+{
+    static PyObject *boxfn_ = PyString_FromString("boxfn_");
+    PyObject *cobj = PyObject_GetAttr((PyObject *) type, boxfn_);
+    boxfn fn;
+    
+    if (cobj == NULL)
+        return NULL;
+
+    fn = (boxfn) PyCObject_AsVoidPtr(cobj);
+    Py_DECREF(cobj);
+
+    return fn;
+}
+#endif
+
+static int is_instance_of(PyObject *arg, PyTypeObject *type)
+{
+    static PyObject *class_ = PyString_FromString("class_");
+    PyObject *clsObj = PyObject_GetAttr((PyObject *) type, class_);
+    int result;
+
+    if (clsObj == NULL)
+        return -1;
+
+    result = env->get_vm_env()->
+        IsInstanceOf(((t_Object *) arg)->object.this$,
+                     (jclass) ((t_Object *) clsObj)->object.this$);
+    Py_DECREF(clsObj);
+
+    return result;
+}
+
 
 #if defined(_MSC_VER) || defined(__SUNPRO_CC)
 int __parseArgs(PyObject *args, char *types, ...)
@@ -503,6 +537,21 @@ int _parseArgs(PyObject **args, unsigned
           case 'o':         /* java.lang.Object */
             break;
 
+#ifdef _java_generics
+          case 'O':         /* java.lang.Object with type param */
+          {
+              PyTypeObject *type = va_arg(list, PyTypeObject *);
+
+              if (type != NULL)
+              {
+                  boxfn fn = get_boxfn(type);
+    
+                  if (fn == NULL || fn(type, arg, NULL) < 0)
+                      return -1;
+              }
+              break;
+          }
+#endif
           case 'T':         /* tuple of python types with wrapfn_ */
           {
               static PyObject *wrapfn_ = PyString_FromString("wrapfn_");
@@ -566,6 +615,7 @@ int _parseArgs(PyObject **args, unsigned
                 case 'K':
                   getclassfn initializeClass = va_arg(check, getclassfn);
                   cls = (*initializeClass)();
+                  break;
               }
 
               if (array)
@@ -849,6 +899,9 @@ int _parseArgs(PyObject **args, unsigned
           }
 
           case 'o':           /* java.lang.Object  */
+#ifdef _java_generics
+          case 'O':           /* java.lang.Object with type param */
+#endif
           {
               if (array)
               {
@@ -866,43 +919,23 @@ int _parseArgs(PyObject **args, unsigned
               {
                   Object *obj = va_arg(list, Object *);
 
-                  if (arg == Py_None)
-                      *obj = Object(NULL);
-                  else if (PyObject_TypeCheck(arg, &Object$$Type))
-                      *obj = ((t_Object *) arg)->object;
-                  else if (PyObject_TypeCheck(arg, &FinalizerProxy$$Type))
-                  {
-                      arg = ((t_fp *) arg)->object;
-                      if (PyObject_TypeCheck(arg, &Object$$Type))
-                          *obj = ((t_Object *) arg)->object;
-                      else
-                          return -1;
-                  }
-                  else if (PyString_Check(arg) || PyUnicode_Check(arg))
-                  {
-                      *obj = p2j(arg);
-                      if (PyErr_Occurred())
-                          return -1;
-                  }
-                  else if (arg == Py_True)
-                      *obj = *Boolean::TRUE;
-                  else if (arg == Py_False)
-                      *obj = *Boolean::FALSE;
-                  else if (PyInt_Check(arg))
+#ifdef _java_generics
+                  if (types[pos] == 'O')
                   {
-                      long ln = PyInt_AS_LONG(arg);
-                      int n = (int) ln;
+                      PyTypeObject *type = va_arg(check, PyTypeObject *);
 
-                      if (ln != (long) n)
-                          *obj = Long((jlong) ln);
-                      else
-                          *obj = Integer((jint) n);
+                      if (type != NULL)
+                      {
+                          boxfn fn = get_boxfn(type);
+
+                          if (fn == NULL || fn(type, arg, obj) < 0)
+                              return -1;
+
+                          break;
+                      }
                   }
-                  else if (PyLong_Check(arg))
-                      *obj = Long((jlong) PyLong_AsLongLong(arg));
-                  else if (PyFloat_Check(arg))
-                      *obj = Double((jdouble) PyFloat_AS_DOUBLE(arg));
-                  else
+#endif
+                  if (boxObject(NULL, arg, obj) < 0)
                       return -1;
               }
               break;
@@ -1438,6 +1471,423 @@ PyObject *unboxString(const jobject &obj
     Py_RETURN_NONE;
 }
 
+static int boxJObject(PyTypeObject *type, PyObject *arg,
+                      java::lang::Object *obj)
+{
+    if (arg == Py_None)
+    {
+        if (obj != NULL)
+            *obj = Object(NULL);
+    }
+    else if (PyObject_TypeCheck(arg, &Object$$Type))
+    {
+        if (type != NULL && !is_instance_of(arg, type))
+            return -1;
+
+        if (obj != NULL)
+            *obj = ((t_Object *) arg)->object;
+    }
+    else if (PyObject_TypeCheck(arg, &FinalizerProxy$$Type))
+    {
+        arg = ((t_fp *) arg)->object;
+        if (PyObject_TypeCheck(arg, &Object$$Type))
+        {
+            if (type != NULL && !is_instance_of(arg, type))
+                return -1;
+
+            if (obj != NULL)
+                *obj = ((t_Object *) arg)->object;
+        }
+        else
+            return -1;
+    }
+    else
+        return 1;
+
+    return 0;
+}
+
+int boxBoolean(PyTypeObject *type, PyObject *arg, java::lang::Object *obj)
+{
+    int result = boxJObject(type, arg, obj);
+
+    if (result <= 0)
+        return result;
+
+    if (arg == Py_True)
+    {
+        if (obj != NULL)
+            *obj = *Boolean::TRUE;
+    }
+    else if (arg == Py_False)
+    {
+        if (obj != NULL)
+            *obj = *Boolean::FALSE;
+    }
+    else
+        return -1;
+
+    return 0;
+}
+
+int boxByte(PyTypeObject *type, PyObject *arg, java::lang::Object *obj)
+{
+    int result = boxJObject(type, arg, obj);
+
+    if (result <= 0)
+        return result;
+
+    if (PyInt_Check(arg))
+    {
+        int n = PyInt_AS_LONG(arg);
+        jbyte b = (jbyte) n;
+
+        if (b == n)
+        {
+            if (obj != NULL)
+                *obj = Byte(b);
+        }
+        else
+            return -1;
+    }
+    else if (PyLong_Check(arg))
+    {
+        PY_LONG_LONG ln = PyLong_AsLongLong(arg);
+        jbyte b = (jbyte) ln;
+
+        if (b == ln)
+        {
+            if (obj != NULL)
+                *obj = Byte(b);
+        }
+        else
+            return -1;
+    }
+    else if (PyFloat_Check(arg))
+    {
+        double d = PyFloat_AS_DOUBLE(arg);
+        jbyte b = (jbyte) d;
+
+        if (b == d)
+        {
+            if (obj != NULL)
+                *obj = Byte(b);
+        }
+        else
+            return -1;
+    }
+    else
+        return -1;
+
+    return 0;
+}
+
+int boxCharacter(PyTypeObject *type, PyObject *arg, java::lang::Object *obj)
+{
+    int result = boxJObject(type, arg, obj);
+
+    if (result <= 0)
+        return result;
+
+    if (PyString_Check(arg))
+    {
+        char *c;
+        Py_ssize_t len;
+
+        if (PyString_AsStringAndSize(arg, &c, &len) < 0 || len != 1)
+            return -1;
+
+        if (obj != NULL)
+            *obj = Character((jchar) c[0]);
+    }
+    else if (PyUnicode_Check(arg))
+    {
+        Py_ssize_t len = PyUnicode_GetSize(arg);
+
+        if (len != 1)
+            return -1;
+
+        if (obj != NULL)
+            *obj = Character((jchar) PyUnicode_AsUnicode(arg)[0]);
+    }
+    else
+        return -1;
+
+    return 0;
+}
+
+int boxDouble(PyTypeObject *type, PyObject *arg, java::lang::Object *obj)
+{
+    int result = boxJObject(type, arg, obj);
+
+    if (result <= 0)
+        return result;
+
+    if (PyInt_Check(arg))
+    {
+        if (obj != NULL)
+            *obj = Double((jdouble) PyInt_AS_LONG(arg));
+    }
+    else if (PyLong_Check(arg))
+    {
+        if (obj != NULL)
+            *obj = Double((jdouble) PyLong_AsLongLong(arg));
+    }
+    else if (PyFloat_Check(arg))
+    {
+        if (obj != NULL)
+            *obj = Double(PyFloat_AS_DOUBLE(arg));
+    }
+    else
+        return -1;
+
+    return 0;
+}
+
+int boxFloat(PyTypeObject *type, PyObject *arg, java::lang::Object *obj)
+{
+    int result = boxJObject(type, arg, obj);
+
+    if (result <= 0)
+        return result;
+
+    if (PyInt_Check(arg))
+    {
+        if (obj != NULL)
+            *obj = Float((jfloat) PyInt_AS_LONG(arg));
+    }
+    else if (PyLong_Check(arg))
+    {
+        PY_LONG_LONG ln = PyLong_AsLongLong(arg);
+        float f = (float) ln;
+
+        if ((PY_LONG_LONG) f == ln)
+        {
+            if (obj != NULL)
+                *obj = Float(f);
+        }
+        else
+            return -1;
+    }
+    else if (PyFloat_Check(arg))
+    {
+        double d = PyFloat_AS_DOUBLE(arg);
+        float f = (float) d;
+
+        if ((double) f == d)
+        {
+            if (obj != NULL)
+                *obj = Float(f);
+        }
+        else
+            return -1;
+    }
+    else
+        return -1;
+
+    return 0;
+}
+
+int boxInteger(PyTypeObject *type, PyObject *arg, java::lang::Object *obj)
+{
+    int result = boxJObject(type, arg, obj);
+
+    if (result <= 0)
+        return result;
+
+    if (PyInt_Check(arg))
+    {
+        if (obj != NULL)
+            *obj = Integer((jint) PyInt_AS_LONG(arg));
+    }
+    else if (PyLong_Check(arg))
+    {
+        PY_LONG_LONG ln = PyLong_AsLongLong(arg);
+        int n = (int) ln;
+
+        if (n == ln)
+        {
+            if (obj != NULL)
+                *obj = Integer(n);
+        }
+        else
+            return -1;
+    }
+    else if (PyFloat_Check(arg))
+    {
+        double d = PyFloat_AS_DOUBLE(arg);
+        int n = (int) d;
+
+        if ((double) n == d)
+        {
+            if (obj != NULL)
+                *obj = Integer(n);
+        }
+        else
+            return -1;
+    }
+    else
+        return -1;
+
+    return 0;
+}
+
+int boxLong(PyTypeObject *type, PyObject *arg, java::lang::Object *obj)
+{
+    int result = boxJObject(type, arg, obj);
+
+    if (result <= 0)
+        return result;
+
+    if (PyInt_Check(arg))
+    {
+        if (obj != NULL)
+            *obj = Long((jlong) PyInt_AS_LONG(arg));
+    }
+    else if (PyLong_Check(arg))
+    {
+        if (obj != NULL)
+            *obj = Long((jlong) PyLong_AsLongLong(arg));
+    }
+    else if (PyFloat_Check(arg))
+    {
+        double d = PyFloat_AS_DOUBLE(arg);
+        PY_LONG_LONG n = (PY_LONG_LONG) d;
+
+        if ((double) n == d)
+        {
+            if (obj != NULL)
+                *obj = Long((jlong) n);
+        }
+        else
+            return -1;
+    }
+    else
+        return -1;
+
+    return 0;
+}
+
+int boxShort(PyTypeObject *type, PyObject *arg, java::lang::Object *obj)
+{
+    int result = boxJObject(type, arg, obj);
+
+    if (result <= 0)
+        return result;
+
+    if (PyInt_Check(arg))
+    {
+        int n = (int) PyInt_AS_LONG(arg);
+        short sn = (short) n;
+
+        if (sn == n)
+        {
+            if (obj != NULL)
+                *obj = Short((jshort) sn);
+        }
+        else
+            return -1;
+    }
+    else if (PyLong_Check(arg))
+    {
+        PY_LONG_LONG ln = PyLong_AsLongLong(arg);
+        short sn = (short) ln;
+
+        if (sn == ln)
+        {
+            if (obj != NULL)
+                *obj = Short((jshort) sn);
+        }
+        else
+            return -1;
+    }
+    else if (PyFloat_Check(arg))
+    {
+        double d = PyFloat_AS_DOUBLE(arg);
+        short sn = (short) (int) d;
+
+        if ((double) sn == d)
+        {
+            if (obj != NULL)
+                *obj = Short((jshort) sn);
+        }
+        else
+            return -1;
+    }
+    else
+        return -1;
+
+    return 0;
+}
+
+int boxString(PyTypeObject *type, PyObject *arg, java::lang::Object *obj)
+{
+    int result = boxJObject(type, arg, obj);
+
+    if (result <= 0)
+        return result;
+
+    if (PyString_Check(arg) || PyUnicode_Check(arg))
+    {
+        if (obj != NULL)
+        {
+            *obj = p2j(arg);
+            if (PyErr_Occurred())
+                return -1;
+        }
+    }
+    else
+        return -1;
+
+    return 0;
+}
+
+int boxObject(PyTypeObject *type, PyObject *arg, java::lang::Object *obj)
+{
+    int result = boxJObject(type, arg, obj);
+
+    if (result <= 0)
+        return result;
+
+    if (obj != NULL)
+    {
+        if (PyString_Check(arg) || PyUnicode_Check(arg))
+        {
+            *obj = p2j(arg);
+            if (PyErr_Occurred())
+                return -1;
+        }
+        else if (arg == Py_True)
+            *obj = *Boolean::TRUE;
+        else if (arg == Py_False)
+            *obj = *Boolean::FALSE;
+        else if (PyInt_Check(arg))
+        {
+            long ln = PyInt_AS_LONG(arg);
+            int n = (int) ln;
+
+            if (ln != (long) n)
+                *obj = Long((jlong) ln);
+            else
+                *obj = Integer((jint) n);
+        }
+        else if (PyLong_Check(arg))
+            *obj = Long((jlong) PyLong_AsLongLong(arg));
+        else if (PyFloat_Check(arg))
+            *obj = Double((jdouble) PyFloat_AS_DOUBLE(arg));
+        else
+            return -1;
+    }
+    else if (!(PyString_Check(arg) || PyUnicode_Check(arg) ||
+               arg == Py_True || arg == Py_False ||
+               PyInt_Check(arg) || PyLong_Check(arg) ||
+               PyFloat_Check(arg)))
+        return -1;
+
+    return 0;
+}
+
+
 #ifdef _java_generics
 PyObject *typeParameters(PyTypeObject *types[], size_t size)
 {

Modified: lucene/pylucene/trunk/jcc/jcc/sources/functions.h
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc/sources/functions.h?rev=931019&r1=931018&r2=931019&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc/sources/functions.h (original)
+++ lucene/pylucene/trunk/jcc/jcc/sources/functions.h Tue Apr  6 05:04:12 2010
@@ -31,6 +31,7 @@ typedef intintobjargproc ssizessizeobjar
 #endif
 
 typedef PyTypeObject **(*getparametersfn)(void *);
+typedef int (*boxfn)(PyTypeObject *, PyObject *, java::lang::Object *);
 
 PyObject *PyErr_SetArgsError(char *name, PyObject *args);
 PyObject *PyErr_SetArgsError(PyObject *self, char *name, PyObject *args);
@@ -72,14 +73,25 @@ int abstract_init(PyObject *self, PyObje
 PyObject *wrapType(PyTypeObject *type, const jobject& obj);
 
 PyObject *unboxBoolean(const jobject& obj);
-PyObject *unboxByte(const jobject &obj);
-PyObject *unboxChar(const jobject &obj);
-PyObject *unboxDouble(const jobject &obj);
-PyObject *unboxFloat(const jobject &obj);
-PyObject *unboxInteger(const jobject &obj);
-PyObject *unboxLong(const jobject &obj);
-PyObject *unboxShort(const jobject &obj);
-PyObject *unboxString(const jobject &obj);
+PyObject *unboxByte(const jobject& obj);
+PyObject *unboxChar(const jobject& obj);
+PyObject *unboxDouble(const jobject& obj);
+PyObject *unboxFloat(const jobject& obj);
+PyObject *unboxInteger(const jobject& obj);
+PyObject *unboxLong(const jobject& obj);
+PyObject *unboxShort(const jobject& obj);
+PyObject *unboxString(const jobject& obj);
+
+int boxBoolean(PyTypeObject *type, PyObject *arg, java::lang::Object *obj);
+int boxByte(PyTypeObject *type, PyObject *arg, java::lang::Object *obj);
+int boxCharacter(PyTypeObject *type, PyObject *arg, java::lang::Object *obj);
+int boxDouble(PyTypeObject *type, PyObject *arg, java::lang::Object *obj);
+int boxFloat(PyTypeObject *type, PyObject *arg, java::lang::Object *obj);
+int boxInteger(PyTypeObject *type, PyObject *arg, java::lang::Object *obj);
+int boxLong(PyTypeObject *type, PyObject *arg, java::lang::Object *obj);
+int boxShort(PyTypeObject *type, PyObject *arg, java::lang::Object *obj);
+int boxString(PyTypeObject *type, PyObject *arg, java::lang::Object *obj);
+int boxObject(PyTypeObject *type, PyObject *arg, java::lang::Object *obj);
 
 PyObject *j2p(const java::lang::String& js);
 java::lang::String p2j(PyObject *object);
@@ -89,6 +101,7 @@ PyObject *make_descriptor(getclassfn ini
 PyObject *make_descriptor(getclassfn initializeClass, int generics);
 PyObject *make_descriptor(PyObject *value);
 PyObject *make_descriptor(PyObject *(*wrapfn)(const jobject &));
+PyObject *make_descriptor(boxfn fn);
 PyObject *make_descriptor(jboolean value);
 PyObject *make_descriptor(jbyte value);
 PyObject *make_descriptor(jchar value);

Modified: lucene/pylucene/trunk/jcc/jcc/sources/types.cpp
URL: http://svn.apache.org/viewvc/lucene/pylucene/trunk/jcc/jcc/sources/types.cpp?rev=931019&r1=931018&r2=931019&view=diff
==============================================================================
--- lucene/pylucene/trunk/jcc/jcc/sources/types.cpp (original)
+++ lucene/pylucene/trunk/jcc/jcc/sources/types.cpp Tue Apr  6 05:04:12 2010
@@ -419,6 +419,11 @@ PyObject *make_descriptor(PyObject *(*wr
     return make_descriptor(PyCObject_FromVoidPtr((void *) wrapfn, NULL));
 }
 
+PyObject *make_descriptor(boxfn fn)
+{
+    return make_descriptor(PyCObject_FromVoidPtr((void *) fn, NULL));
+}
+
 PyObject *make_descriptor(jboolean b)
 {
     t_descriptor *self = (t_descriptor *)