From: <cg...@us...> - 2009-01-04 05:42:55
|
Revision: 5837 http://jython.svn.sourceforge.net/jython/?rev=5837&view=rev Author: cgroves Date: 2009-01-04 05:42:44 +0000 (Sun, 04 Jan 2009) Log Message: ----------- Expose the underlying_class on proxy types as their Java proxy type such that they properly coerce into java.lang.Class. Modified Paths: -------------- trunk/jython/Lib/test/test_java_integration.py trunk/jython/src/org/python/core/PyType.java trunk/jython/src/org/python/expose/BaseTypeBuilder.java trunk/jython/src/org/python/expose/generate/OverridableNewExposer.java Removed Paths: ------------- trunk/jython/bugtests/test277.py trunk/jython/bugtests/test277p/ Modified: trunk/jython/Lib/test/test_java_integration.py =================================================================== --- trunk/jython/Lib/test/test_java_integration.py 2009-01-03 04:37:38 UTC (rev 5836) +++ trunk/jython/Lib/test/test_java_integration.py 2009-01-04 05:42:44 UTC (rev 5837) @@ -98,9 +98,12 @@ def method(self): called.append(True) A() - Class.newInstance(A) - self.assertEquals(len(called), 2) + self.assertEquals(len(called), 1) +# The no-arg constructor for proxies attempts to look up its Python class by the Python class' name, +# so the class needs to be visible at the module level or the import will fail +class ModuleVisibleJavaSubclass(Object): + pass class InstantiationTest(unittest.TestCase): def test_can_subclass_abstract(self): class A(Component): @@ -114,7 +117,10 @@ from java.util import Date self.assertRaises(TypeError, Date, '99-01-01', 1, 1) + def test_Class_newInstance_works_on_proxies(self): + Class.newInstance(ModuleVisibleJavaSubclass) + class BeanTest(unittest.TestCase): def test_shared_names(self): self.failUnless(callable(Vector.size), Deleted: trunk/jython/bugtests/test277.py =================================================================== --- trunk/jython/bugtests/test277.py 2009-01-03 04:37:38 UTC (rev 5836) +++ trunk/jython/bugtests/test277.py 2009-01-04 05:42:44 UTC (rev 5837) @@ -1,30 +0,0 @@ -""" - -""" - -import support - -support.compileJava("test277p/Test.java") - -from test277p import Test - -cnt = 0 - -class pytest(Test): - - def initialize(self): - global cnt - Test.initialize(self) - cnt += 1 - -pt=pytest() - -support.compare(cnt, "2") - -cnt = 0 - -import java -pt=java.lang.Class.newInstance(pytest) - -support.compare(cnt, "2") - Modified: trunk/jython/src/org/python/core/PyType.java =================================================================== --- trunk/jython/src/org/python/core/PyType.java 2009-01-03 04:37:38 UTC (rev 5836) +++ trunk/jython/src/org/python/core/PyType.java 2009-01-04 05:42:44 UTC (rev 5837) @@ -176,17 +176,14 @@ // XXX also __doc__ __module__ + Class<?> proxyClass = null; if (baseClass != null || interfaces.size() != 0) { String proxyName = name; PyObject module = dict.__finditem__("__module__"); if (module != null) { proxyName = module.toString() + "$" + proxyName; } - Class<?> proxyClass = MakeProxies.makeProxy(baseClass, - interfaces, - name, - proxyName, - dict); + proxyClass = MakeProxies.makeProxy(baseClass, interfaces, name, proxyName, dict); PyType proxyType = PyType.fromClass(proxyClass); List<PyObject> cleanedBases = Generic.list(); boolean addedProxyType = false; @@ -203,8 +200,11 @@ bases_list = cleanedBases.toArray(new PyObject[cleanedBases.size()]); } PyType newtype; - if (new_.for_type == metatype) { + if (new_.for_type == metatype || metatype == PyType.fromClass(Class.class)) { newtype = new PyType(); // XXX set metatype + if(proxyClass != null) { + newtype.underlying_class = proxyClass; + } } else { newtype = new PyTypeDerived(metatype); } @@ -1375,7 +1375,11 @@ private String name; TypeResolver(Class<?> underlying_class, String module, String name) { - this.underlying_class = underlying_class; + // Don't store the underlying_class for PyProxies as the proxy type needs to fill in + // based on the class, not be the class + if (underlying_class != null && !PyProxy.class.isAssignableFrom(underlying_class)) { + this.underlying_class = underlying_class; + } this.module = module; this.name = name; } Modified: trunk/jython/src/org/python/expose/BaseTypeBuilder.java =================================================================== --- trunk/jython/src/org/python/expose/BaseTypeBuilder.java 2009-01-03 04:37:38 UTC (rev 5836) +++ trunk/jython/src/org/python/expose/BaseTypeBuilder.java 2009-01-04 05:42:44 UTC (rev 5837) @@ -16,17 +16,17 @@ private PyDataDescr[] descrs; - private Class typeClass; + private Class<?> typeClass; - private Class baseClass; + private Class<?> baseClass; private String name; private boolean isBaseType; public BaseTypeBuilder(String name, - Class typeClass, - Class baseClass, + Class<?> typeClass, + Class<?> baseClass, boolean isBaseType, PyBuiltinMethod[] meths, PyDataDescr[] descrs, @@ -50,7 +50,7 @@ descr.setType(type); dict.__setitem__(descr.getName(), descr); } - if(newWrapper != null) { + if (newWrapper != null) { dict.__setitem__("__new__", newWrapper); newWrapper.setWrappedType(type); } @@ -61,11 +61,11 @@ return name; } - public Class getTypeClass() { + public Class<?> getTypeClass() { return typeClass; } - public Class getBase() { + public Class<?> getBase() { return baseClass; } Modified: trunk/jython/src/org/python/expose/generate/OverridableNewExposer.java =================================================================== --- trunk/jython/src/org/python/expose/generate/OverridableNewExposer.java 2009-01-03 04:37:38 UTC (rev 5836) +++ trunk/jython/src/org/python/expose/generate/OverridableNewExposer.java 2009-01-04 05:42:44 UTC (rev 5837) @@ -1,9 +1,8 @@ package org.python.expose.generate; +import org.python.core.PyOverridableNew; import org.python.objectweb.asm.Label; import org.python.objectweb.asm.Type; -import org.python.core.PyOverridableNew; -import org.python.core.PyObject; public class OverridableNewExposer extends Exposer { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |