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