From: <cg...@us...> - 2008-12-04 02:30:38
|
Revision: 5692 http://jython.svn.sourceforge.net/jython/?rev=5692&view=rev Author: cgroves Date: 2008-12-04 02:30:34 +0000 (Thu, 04 Dec 2008) Log Message: ----------- Leave ExposedType annotations on processed types so they'll be visible at runtime. Use that to detect exposed inner classes in classes being loaded. Inner classes being loaded won't have set their builder in PyType yet, so they need to be added to BOOTSTRAP_TYPES so they're created as PyType instead of PyJavaType. Modified Paths: -------------- branches/newstyle-java-types/src/org/python/core/PyJavaType.java branches/newstyle-java-types/src/org/python/expose/generate/ExposedTypeProcessor.java branches/newstyle-java-types/src/org/python/expose/generate/ExposedTypeVisitor.java branches/newstyle-java-types/src/org/python/modules/_hashlib.java branches/newstyle-java-types/tests/java/org/python/expose/generate/ExposedTypeVisitorTest.java Modified: branches/newstyle-java-types/src/org/python/core/PyJavaType.java =================================================================== --- branches/newstyle-java-types/src/org/python/core/PyJavaType.java 2008-12-04 02:20:28 UTC (rev 5691) +++ branches/newstyle-java-types/src/org/python/core/PyJavaType.java 2008-12-04 02:30:34 UTC (rev 5692) @@ -16,6 +16,7 @@ import org.python.core.util.StringUtil; import org.python.expose.ExposeAsSuperclass; +import org.python.expose.ExposedType; import org.python.util.Generic; public class PyJavaType extends PyType implements ExposeAsSuperclass { @@ -245,8 +246,17 @@ dict.__setitem__("__init__", reflctr); } for (Class<?> inner : underlying_class.getClasses()) { - // Only add the class if there isn't something else with that name - if (dict.__finditem__(inner.getSimpleName()) == null) { + // Only add the class if there isn't something else with that name and it came from this + // class + if (inner.getDeclaringClass() == underlying_class && + dict.__finditem__(inner.getSimpleName()) == null) { + // If this class is currently being loaded, any exposed types it contains won't have + // set their builder in PyType yet, so add them to BOOTSTRAP_TYPES so they're + // created as PyType instead of PyJavaType + if (inner.getAnnotation(ExposedType.class) != null + || ExposeAsSuperclass.class.isAssignableFrom(inner)) { + Py.BOOTSTRAP_TYPES.add(inner); + } dict.__setitem__(inner.getSimpleName(), PyType.fromClass(inner)); } } Modified: branches/newstyle-java-types/src/org/python/expose/generate/ExposedTypeProcessor.java =================================================================== --- branches/newstyle-java-types/src/org/python/expose/generate/ExposedTypeProcessor.java 2008-12-04 02:20:28 UTC (rev 5691) +++ branches/newstyle-java-types/src/org/python/expose/generate/ExposedTypeProcessor.java 2008-12-04 02:30:34 UTC (rev 5692) @@ -130,8 +130,9 @@ @Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) { + AnnotationVisitor visitor = super.visitAnnotation(desc, visible); if(desc.equals(EXPOSED_TYPE.getDescriptor())) { - return new ExposedTypeVisitor(onType) { + return new ExposedTypeVisitor(onType, visitor) { @Override public void handleResult(String name) { @@ -148,7 +149,7 @@ } }; } - return super.visitAnnotation(desc, visible); + return visitor; } private void throwInvalid(String msg) { Modified: branches/newstyle-java-types/src/org/python/expose/generate/ExposedTypeVisitor.java =================================================================== --- branches/newstyle-java-types/src/org/python/expose/generate/ExposedTypeVisitor.java 2008-12-04 02:20:28 UTC (rev 5691) +++ branches/newstyle-java-types/src/org/python/expose/generate/ExposedTypeVisitor.java 2008-12-04 02:30:34 UTC (rev 5692) @@ -1,5 +1,6 @@ package org.python.expose.generate; +import org.python.objectweb.asm.AnnotationVisitor; import org.python.objectweb.asm.Type; /** @@ -15,8 +16,11 @@ private boolean isBaseType = true; - public ExposedTypeVisitor(Type onType) { + private final AnnotationVisitor passthrough; + + public ExposedTypeVisitor(Type onType, AnnotationVisitor passthrough) { this.onType = onType; + this.passthrough = passthrough; } @Override @@ -30,6 +34,9 @@ } else { super.visit(name, value); } + if (passthrough != null) { + passthrough.visit(name, value); + } } @Override @@ -41,6 +48,9 @@ handleResult(typeName); handleResult(base); handleResult(isBaseType); + if (passthrough != null) { + passthrough.visitEnd(); + } } public abstract void handleResult(Type base); Modified: branches/newstyle-java-types/src/org/python/modules/_hashlib.java =================================================================== --- branches/newstyle-java-types/src/org/python/modules/_hashlib.java 2008-12-04 02:20:28 UTC (rev 5691) +++ branches/newstyle-java-types/src/org/python/modules/_hashlib.java 2008-12-04 02:30:34 UTC (rev 5692) @@ -121,16 +121,18 @@ put("sha-512", 128); }}; - public Hash(String name) { - super(TYPE); - this.name = name; + private static final MessageDigest getDigest(String name) { try { - digest = MessageDigest.getInstance(name); + return MessageDigest.getInstance(name); } catch (NoSuchAlgorithmException nsae) { throw Py.ValueError("unsupported hash type"); } } + public Hash(String name) { + this(name, getDigest(name)); + } + private Hash(String name, MessageDigest digest) { super(TYPE); this.name = name; @@ -192,10 +194,10 @@ // Make hex version of the digest char[] hexDigest = new char[result.length * 2]; for (int i = 0, j = 0; i < result.length; i++) { - int c = (int)((result[i] >> 4) & 0xf); + int c = ((result[i] >> 4) & 0xf); c = c > 9 ? c + 'a' - 10 : c + '0'; hexDigest[j++] = (char)c; - c = (int)result[i] & 0xf; + c = result[i] & 0xf; c = c > 9 ? c + 'a' - 10 : c + '0'; hexDigest[j++] = (char)c; } Modified: branches/newstyle-java-types/tests/java/org/python/expose/generate/ExposedTypeVisitorTest.java =================================================================== --- branches/newstyle-java-types/tests/java/org/python/expose/generate/ExposedTypeVisitorTest.java 2008-12-04 02:20:28 UTC (rev 5691) +++ branches/newstyle-java-types/tests/java/org/python/expose/generate/ExposedTypeVisitorTest.java 2008-12-04 02:30:34 UTC (rev 5692) @@ -9,7 +9,7 @@ public class ExposedTypeVisitorTest extends TestCase { public void setUp() { - etv = new ExposedTypeVisitor(Type.getType("Lsimpletype;")) { + etv = new ExposedTypeVisitor(Type.getType("Lsimpletype;"), null) { @Override public void handleResult(String name) { @@ -47,7 +47,7 @@ ExposedTypeVisitor etv; private String result; - + private Type baseResult; private boolean isBaseTypeResult; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |