@@ -1011,7 +1011,7 @@ private void emitDup(Type type) {
1011
1011
@ Override
1012
1012
public byte [] visit (Interface node ) {
1013
1013
String name = node .getName ();
1014
- ContextDependedClassWriter classWriter = new ContextDependedClassWriter (context , CLASS_WRITER_FLAGS );
1014
+ ContextDependedClassWriter classWriter = new ContextDependedClassWriter (CLASS_WRITER_FLAGS );
1015
1015
classWriters .put (name , classWriter );
1016
1016
TypeKlass parentKlass = node .getParentKlass ();
1017
1017
classWriter .visit (Opcodes .V1_8 ,
@@ -1036,7 +1036,7 @@ public byte[] visit(Klass node) {
1036
1036
String name = node .getName ();
1037
1037
TypeKlass prevClass = currentClass ;
1038
1038
currentClass = node .getThisKlass ();
1039
- ContextDependedClassWriter classWriter = new ContextDependedClassWriter (context , CLASS_WRITER_FLAGS );
1039
+ ContextDependedClassWriter classWriter = new ContextDependedClassWriter (CLASS_WRITER_FLAGS );
1040
1040
classWriters .put (name , classWriter );
1041
1041
TypeKlass thisClass = node .getThisKlass ();
1042
1042
TypeKlass parentClass = node .getParentKlass ();
@@ -1233,7 +1233,7 @@ public byte[] visit(MainKlass node) {
1233
1233
TypeKlass prevClass = currentClass ;
1234
1234
currentClass = node .getThisKlass ();
1235
1235
String name = node .getName ();
1236
- ContextDependedClassWriter mainClassWriter = new ContextDependedClassWriter (context , CLASS_WRITER_FLAGS );
1236
+ ContextDependedClassWriter mainClassWriter = new ContextDependedClassWriter (CLASS_WRITER_FLAGS );
1237
1237
classWriters .put (name , mainClassWriter );
1238
1238
1239
1239
TypeKlass thisClass = node .getThisKlass ();
@@ -1780,11 +1780,10 @@ private void initArguments(TypeKlass owner, FunctionInfo info) {
1780
1780
}
1781
1781
}
1782
1782
1783
- private static class GeneratedClassesContext extends java . lang . ClassLoader {
1783
+ private static class GeneratedClassesContext {
1784
1784
private final HashMap <String , byte []> byteCodes = new HashMap <>();
1785
1785
1786
1786
public void register (String name , byte [] bytecode ) {
1787
- defineClass (name , bytecode , 0 , bytecode .length );
1788
1787
byteCodes .put (name , bytecode );
1789
1788
}
1790
1789
@@ -1795,37 +1794,32 @@ public byte[] get(String name) {
1795
1794
1796
1795
1797
1796
private static class ContextDependedClassWriter extends ClassWriter {
1798
- private final GeneratedClassesContext context ;
1799
-
1800
- public ContextDependedClassWriter (GeneratedClassesContext context , int flags ) {
1797
+ public ContextDependedClassWriter (int flags ) {
1801
1798
super (flags );
1802
- this .context = context ;
1803
1799
}
1804
1800
1805
1801
protected String getCommonSuperClass (String className1 , String className2 ) {
1806
- Class <?> klass1 ;
1807
- Class <?> klass2 ;
1808
- try {
1809
- klass1 = Class .forName (className1 .replace ('/' , '.' ), false , context );
1810
- klass2 = Class .forName (className2 .replace ('/' , '.' ), false , context );
1811
- } catch (ClassNotFoundException e ) {
1812
- throw new Error ("can not get common supper for " + className1
1813
- + " and " + className2 , e );
1802
+ TypeKlass type1 = (TypeKlass ) TypeList .find (className1 .replace ('/' , '.' ));
1803
+ TypeKlass type2 = (TypeKlass ) TypeList .find (className2 .replace ('/' , '.' ));
1804
+ if (type1 == null || type2 == null ) {
1805
+ return super .getCommonSuperClass (className1 , className2 );
1814
1806
}
1815
1807
1816
- if (klass1 . isAssignableFrom ( klass2 )) {
1808
+ if (type2 . canImplicitlyCastTo ( type1 )) {
1817
1809
return className1 ;
1818
- } else if (klass2 .isAssignableFrom (klass1 )) {
1810
+ }
1811
+ if (type1 .canImplicitlyCastTo (type2 )) {
1819
1812
return className2 ;
1820
- } else if (!klass1 .isInterface () && !klass2 .isInterface ()) {
1821
- do {
1822
- klass1 = klass1 .getSuperclass ();
1823
- } while (!klass1 .isAssignableFrom (klass2 ));
1824
-
1825
- return asInternalName (className1 );
1826
- } else {
1813
+ }
1814
+ if (type1 .isInterface () || type2 .isInterface ()) {
1827
1815
return "java/lang/Object" ;
1828
1816
}
1817
+
1818
+ do {
1819
+ type1 = type1 .getParent ();
1820
+ } while (!type2 .canImplicitlyCastTo (type1 ));
1821
+
1822
+ return asInternalName (type1 .getName ());
1829
1823
}
1830
1824
}
1831
1825
}
0 commit comments