Skip to content

Commit fe02fa2

Browse files
committed
Create descriptors from TypeExposers and rip out the last of the reflection-based exposing
1 parent dad5534 commit fe02fa2

11 files changed

Lines changed: 161 additions & 175 deletions

File tree

build.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ The readme text for the next release will be like:
444444
</fileset>
445445
</copy>
446446
</target>
447-
<target name="expose" depends="compile">
447+
<target name="expose" depends="init">
448448
<mkdir dir="${exposed.dir}"/>
449449
<taskdef name="expose" classname="org.python.expose.generate.ExposeTask"
450450
classpath="${compile.dir}" classpathref="main.classpath"/>
@@ -453,7 +453,7 @@ The readme text for the next release will be like:
453453
</expose>
454454
</target>
455455

456-
<target name="jar" depends="expose">
456+
<target name="jar" depends="compile,expose">
457457
<jar destfile="${dist.dir}/jython.jar" update="true">
458458
<fileset dir="${compile.dir}"/>
459459
<fileset dir="${exposed.dir}"/>

src/org/python/core/PyDataDescr.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,13 @@ public PyDataDescr(PyType onType, String name, Class ofType) {
3636
this.ofType = ofType;
3737
}
3838

39+
/**
40+
* @return - the name this descriptor is exposed as
41+
*/
42+
public String getName() {
43+
return name;
44+
}
45+
3946
@Override
4047
public PyObject __get__(PyObject obj, PyObject type) {
4148
if(obj != null) {

src/org/python/core/PyType.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1177,10 +1177,7 @@ private static PyType addFromClass(Class c) {
11771177
String name = null;
11781178
String[] exposed_methods = null;
11791179
TypeBuilder tb = classToBuilder.get(c);
1180-
if(tb != null || c.getAnnotation(ExposedType.class) != null) {
1181-
if(tb == null) {
1182-
tb = new TypeExposer(c).makeBuilder();
1183-
}
1180+
if(tb != null) {
11841181
name = tb.getName();
11851182
base = PyObject.class;
11861183
newstyle = true;

src/org/python/expose/generate/ExposeTask.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ public void execute() throws BuildException {
8484
for(MethodExposer exposer : etp.getMethodExposers()) {
8585
generate(exposer);
8686
}
87+
for(DescriptorExposer exposer : etp.getDescriptorExposers()) {
88+
generate(exposer);
89+
}
8790
if(etp.getNewExposer() != null) {
8891
generate(etp.getNewExposer());
8992
}

src/org/python/expose/generate/ExposedTypeProcessor.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,17 @@ public void visitEnd() {
147147
if(typeName == null) {
148148
throw new IllegalArgumentException("A class given to InnerClassExposer must have the ExposedType annotation");
149149
}
150-
typeExposer = new TypeExposer(onType, getName(), methodExposers, newExposer);
150+
typeExposer = new TypeExposer(onType,
151+
getName(),
152+
methodExposers,
153+
descExposers.values(),
154+
newExposer);
151155
for(MethodExposer exposer : methodExposers) {
152156
addInnerClass(exposer.getGeneratedType());
153157
}
158+
for(DescriptorExposer exposer : descExposers.values()) {
159+
addInnerClass(exposer.getGeneratedType());
160+
}
154161
if(newExposer != null) {
155162
addInnerClass(newExposer.getGeneratedType());
156163
}
@@ -257,21 +264,21 @@ public void exposeAsDeleteDescriptor(String descName) {
257264

258265
@Override
259266
public FieldVisitor visitField(int access,
260-
String name,
267+
final String fieldName,
261268
final String desc,
262269
String signature,
263270
Object value) {
264-
FieldVisitor passthroughVisitor = super.visitField(access, name, desc, signature, value);
265-
return new ExposedFieldFinder(name, passthroughVisitor) {
271+
FieldVisitor passthroughVisitor = super.visitField(access, fieldName, desc, signature, value);
272+
return new ExposedFieldFinder(fieldName, passthroughVisitor) {
266273

267274
@Override
268275
public void exposeAsGet(String name) {
269-
getDescriptorExposer(name).addFieldGetter(name, Type.getType(desc));
276+
getDescriptorExposer(name).addFieldGetter(fieldName, Type.getType(desc));
270277
}
271278

272279
@Override
273280
public void exposeAsSet(String name) {
274-
getDescriptorExposer(name).addFieldSetter(name, Type.getType(desc));
281+
getDescriptorExposer(name).addFieldSetter(fieldName, Type.getType(desc));
275282
}
276283
};
277284
}

src/org/python/expose/generate/MethodExposer.java

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -17,33 +17,15 @@
1717
*/
1818
public class MethodExposer extends Exposer {
1919

20-
public MethodExposer(Method method) {
21-
this(method, "");
22-
}
23-
24-
/**
25-
* @param type -
26-
* the type the method is on. If no explicit name is given in the
27-
* annotation, type + '_' will be stripped from method names to
28-
* make the exposed name.
29-
*/
30-
public MethodExposer(Method method, String type) {
31-
this(Type.getType(method.getDeclaringClass()),
32-
method.getModifiers(),
33-
method.getName(),
34-
Type.getMethodDescriptor(method),
35-
type,
36-
getExp(method).names(),
37-
getExp(method).defaults(),
38-
getExp(method).type());
39-
}
40-
41-
public static ExposedMethod getExp(Method m) {
42-
ExposedMethod exp = m.getAnnotation(ExposedMethod.class);
43-
if(exp == null) {
44-
throw new IllegalArgumentException(m + " doesn't have the @ExposedMethod annotation");
45-
}
46-
return exp;
20+
public MethodExposer(Type onType, int access, String methodName, String desc, String prefix) {
21+
this(onType,
22+
access,
23+
methodName,
24+
desc,
25+
prefix,
26+
new String[0],
27+
new String[0],
28+
MethodType.NORMAL);
4729
}
4830

4931
public MethodExposer(Type onType,
@@ -223,13 +205,13 @@ private void pushNone() {
223205

224206
private String methodName;
225207

226-
private String[] asNames, defaults;
208+
protected String[] asNames, defaults;
227209

228210
private String prefix;
229211

230212
private Type[] params;
231213

232214
private Type onType, returnType;
233215

234-
private MethodType type;
216+
protected MethodType type;
235217
}

src/org/python/expose/generate/PyTypes.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.python.core.PyBuiltinFunction;
77
import org.python.core.PyBuiltinMethod;
88
import org.python.core.PyBuiltinMethodNarrow;
9+
import org.python.core.PyDataDescr;
910
import org.python.core.PyException;
1011
import org.python.core.PyInteger;
1112
import org.python.core.PyNewWrapper;
@@ -20,7 +21,7 @@
2021
import org.python.expose.ExposedType;
2122
import org.python.expose.TypeBuilder;
2223

23-
/**
24+
/**
2425
* Type objects used by exposed generation.
2526
*/
2627
public interface PyTypes {
@@ -52,6 +53,10 @@ public interface PyTypes {
5253

5354
public static final Type ABUILTIN_FUNCTION = Type.getType(PyBuiltinFunction[].class);
5455

56+
public static final Type DATA_DESCR = Type.getType(PyDataDescr.class);
57+
58+
public static final Type ADATA_DESCR = Type.getType(PyDataDescr[].class);
59+
5560
public static final Type BUILTIN_INFO = Type.getType(PyBuiltinFunction.Info.class);
5661

5762
// Exposer Jython types
@@ -60,30 +65,30 @@ public interface PyTypes {
6065
public static final Type EXPOSED_METHOD = Type.getType(ExposedMethod.class);
6166

6267
public static final Type EXPOSED_NEW = Type.getType(ExposedNew.class);
63-
68+
6469
public static final Type EXPOSED_GET = Type.getType(ExposedGet.class);
65-
70+
6671
public static final Type EXPOSED_SET = Type.getType(ExposedSet.class);
67-
72+
6873
public static final Type EXPOSED_DELETE = Type.getType(ExposedDelete.class);
6974

7075
public static final Type TYPEBUILDER = Type.getType(TypeBuilder.class);
71-
76+
7277
// Java types
7378
public static final Type OBJECT = Type.getType(Object.class);
74-
79+
7580
public static final Type STRING = Type.getType(String.class);
7681

7782
public static final Type ASTRING = Type.getType(String[].class);
7883

7984
public static final Type STRING_BUILDER = Type.getType(StringBuilder.class);
8085

8186
public static final Type CLASS = Type.getType(Class.class);
82-
87+
8388
// Primitives
8489
public static final Type INT = Type.INT_TYPE;
8590

8691
public static final Type VOID = Type.VOID_TYPE;
87-
92+
8893
public static final Type BOOLEAN = Type.BOOLEAN_TYPE;
8994
}

0 commit comments

Comments
 (0)