1414import java .util .Iterator ;
1515import java .util .List ;
1616
17+ import org .python .expose .ExposeAsSuperclass ;
1718import org .python .expose .ExposedDelete ;
1819import org .python .expose .ExposedGet ;
1920import org .python .expose .ExposedMethod ;
@@ -786,7 +787,6 @@ private static void fillFromClass(PyType newtype,
786787 Class base ,
787788 boolean newstyle ,
788789 Method setup ,
789- String [] exposed_methods ,
790790 TypeBuilder tb ) {
791791
792792 if (base == null ) {
@@ -827,7 +827,7 @@ private static void fillFromClass(PyType newtype,
827827 } else {
828828 dict = new PyStringMap ();
829829 if (newstyle ) {
830- fillInNewstyle (newtype , setup , exposed_methods , dict );
830+ fillInNewstyle (newtype , setup , dict );
831831 } else {
832832 fillInClassic (c , base , dict );
833833 }
@@ -987,13 +987,7 @@ public PyObject new_impl(boolean init,
987987
988988 private static void fillInNewstyle (PyType newtype ,
989989 Method setup ,
990- String [] exposed_methods ,
991990 PyObject dict ) {
992- for (int i = 0 ; i < exposed_methods .length ; i ++) {
993- String methname = exposed_methods [i ];
994- dict .__setitem__ (normalize_name (methname ),
995- new PyReflectedFunction (methname ));
996- }
997991 if (setup != null ) {
998992 try {
999993 setup .invoke (null , new Object [] {dict , null });
@@ -1016,21 +1010,26 @@ public static void addBuilder(Class forClass, TypeBuilder builder) {
10161010 classToBuilder = new HashMap <Class , TypeBuilder >();
10171011 }
10181012 classToBuilder .put (forClass , builder );
1019- if ( builder . getTypeClass (). equals ( PyObject . class )
1020- || builder . getTypeClass (). equals ( PyType . class )) {
1013+
1014+ if ( class_to_type . containsKey ( forClass )) {
10211015 // PyObject and PyType are loaded as part of creating their
10221016 // builders, so they need to be bootstrapped
10231017 PyType objType = fromClass (builder .getTypeClass ());
1018+ objType .name = builder .getName ();
10241019 objType .dict = builder .getDict (objType );
10251020 }
10261021 }
10271022
10281023 private static PyType addFromClass (Class c ) {
1024+ if (ExposeAsSuperclass .class .isAssignableFrom (c )) {
1025+ PyType exposedAs = fromClass (c .getSuperclass ());
1026+ class_to_type .put (c , exposedAs );
1027+ return exposedAs ;
1028+ }
10291029 Method setup = null ;
10301030 boolean newstyle = Newstyle .class .isAssignableFrom (c );
10311031 Class base = null ;
10321032 String name = null ;
1033- String [] exposed_methods = null ;
10341033 TypeBuilder tb = classToBuilder == null ? null : classToBuilder .get (c );
10351034 if (tb != null ) {
10361035 name = tb .getName ();
@@ -1049,28 +1048,13 @@ private static PyType addFromClass(Class c) {
10491048 if (newstyle ) { // newstyle
10501049 base = (Class )exposed_decl_get_object (c , "base" );
10511050 name = (String )exposed_decl_get_object (c , "name" );
1052- if (base == null ) {
1053- Class cur = c ;
1054- while (cur != PyObject .class ) {
1055- Class exposed_as = (Class )exposed_decl_get_object (cur , "as" );
1056- if (exposed_as != null ) {
1057- PyType exposed_as_type = fromClass (exposed_as );
1058- class_to_type .put (c , exposed_as_type );
1059- return exposed_as_type ;
1060- }
1061- cur = cur .getSuperclass ();
1062- }
1063- }
1064- exposed_methods = (String [])exposed_decl_get_object (c , "methods" );
1065- if (exposed_methods == null )
1066- exposed_methods = new String [0 ];
10671051 }
10681052 }
10691053 PyType newtype = class_to_type .get (c );
10701054 if (newtype == null ) {
10711055 newtype = c == PyType .class ? new PyType (true ) : new PyType ();
10721056 class_to_type .put (c , newtype );
1073- fillFromClass (newtype , name , c , base , newstyle , setup , exposed_methods , tb );
1057+ fillFromClass (newtype , name , c , base , newstyle , setup , tb );
10741058 }
10751059 return newtype ;
10761060 }
@@ -1090,11 +1074,6 @@ private static PyType addFromClass(Class c) {
10901074 * Class exposed_base
10911075 * String exposed_name
10921076 *
1093- * Class exposed_as => instances are exposed as implementing
1094- * just this superclass
1095- *
1096- * (String[] exposed_methods)
1097- *
10981077 */
10991078
11001079 public static synchronized PyType fromClass (Class c ) {
0 commit comments