Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5942bcd

Browse files
ronshapirosameb
authored andcommitted
Fix invokestatic on interfaces in JDK 9+ and begin emitting Java 8 bytecode to support it (#155)
This is necessary for 380ef56 to work properly on all JDKs
1 parent 700a268 commit 5942bcd

16 files changed

+30
-25
lines changed

cglib/src/main/java/net/sf/cglib/beans/BeanCopier.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ public void generateClass(ClassVisitor v) {
9999
Type sourceType = Type.getType(source);
100100
Type targetType = Type.getType(target);
101101
ClassEmitter ce = new ClassEmitter(v);
102-
ce.begin_class(Constants.V1_2,
102+
ce.begin_class(Constants.V1_8,
103103
Constants.ACC_PUBLIC,
104104
getClassName(),
105105
BEAN_COPIER,

cglib/src/main/java/net/sf/cglib/beans/BeanGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public void generateClass(ClassVisitor v) throws Exception {
102102
types[i] = (Type)props.get(names[i]);
103103
}
104104
ClassEmitter ce = new ClassEmitter(v);
105-
ce.begin_class(Constants.V1_2,
105+
ce.begin_class(Constants.V1_8,
106106
Constants.ACC_PUBLIC,
107107
getClassName(),
108108
superclass != null ? Type.getType(superclass) : Constants.TYPE_OBJECT,

cglib/src/main/java/net/sf/cglib/beans/BeanMapEmitter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class BeanMapEmitter extends ClassEmitter {
4545
public BeanMapEmitter(ClassVisitor v, String className, Class type, int require) {
4646
super(v);
4747

48-
begin_class(Constants.V1_2, Constants.ACC_PUBLIC, className, BEAN_MAP, null, Constants.SOURCE_FILE);
48+
begin_class(Constants.V1_8, Constants.ACC_PUBLIC, className, BEAN_MAP, null, Constants.SOURCE_FILE);
4949
EmitUtils.null_constructor(this);
5050
EmitUtils.factory_method(this, NEW_INSTANCE);
5151
generateConstructor();

cglib/src/main/java/net/sf/cglib/beans/BulkBeanEmitter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public BulkBeanEmitter(ClassVisitor v,
4747
Method[] setters = new Method[setterNames.length];
4848
validate(target, getterNames, setterNames, types, getters, setters);
4949

50-
begin_class(Constants.V1_2, Constants.ACC_PUBLIC, className, BULK_BEAN, null, Constants.SOURCE_FILE);
50+
begin_class(Constants.V1_8, Constants.ACC_PUBLIC, className, BULK_BEAN, null, Constants.SOURCE_FILE);
5151
EmitUtils.null_constructor(this);
5252
generateGet(target, getters);
5353
generateSet(target, setters);

cglib/src/main/java/net/sf/cglib/beans/ImmutableBean.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public Object create() {
7373
public void generateClass(ClassVisitor v) {
7474
Type targetType = Type.getType(target);
7575
ClassEmitter ce = new ClassEmitter(v);
76-
ce.begin_class(Constants.V1_2,
76+
ce.begin_class(Constants.V1_8,
7777
Constants.ACC_PUBLIC,
7878
getClassName(),
7979
targetType,

cglib/src/main/java/net/sf/cglib/core/CodeEmitter.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,7 @@ public void super_invoke() {
476476
}
477477

478478
public void super_invoke(Signature sig) {
479-
emit_invoke(Constants.INVOKESPECIAL, ce.getSuperType(), sig);
479+
emit_invoke(Constants.INVOKESPECIAL, ce.getSuperType(), sig, false);
480480
}
481481

482482
public void invoke_constructor(Type type) {
@@ -491,7 +491,7 @@ public void invoke_constructor_this() {
491491
invoke_constructor(ce.getClassType());
492492
}
493493

494-
private void emit_invoke(int opcode, Type type, Signature sig) {
494+
private void emit_invoke(int opcode, Type type, Signature sig, boolean isInterface) {
495495
if (sig.getName().equals(Constants.CONSTRUCTOR_NAME) &&
496496
((opcode == Constants.INVOKEVIRTUAL) ||
497497
(opcode == Constants.INVOKESTATIC))) {
@@ -501,19 +501,24 @@ private void emit_invoke(int opcode, Type type, Signature sig) {
501501
type.getInternalName(),
502502
sig.getName(),
503503
sig.getDescriptor(),
504-
opcode == Opcodes.INVOKEINTERFACE);
504+
isInterface);
505505
}
506506

507507
public void invoke_interface(Type owner, Signature sig) {
508-
emit_invoke(Constants.INVOKEINTERFACE, owner, sig);
508+
emit_invoke(Constants.INVOKEINTERFACE, owner, sig, true);
509509
}
510510

511511
public void invoke_virtual(Type owner, Signature sig) {
512-
emit_invoke(Constants.INVOKEVIRTUAL, owner, sig);
512+
emit_invoke(Constants.INVOKEVIRTUAL, owner, sig, false);
513513
}
514514

515+
@Deprecated
515516
public void invoke_static(Type owner, Signature sig) {
516-
emit_invoke(Constants.INVOKESTATIC, owner, sig);
517+
invoke_static(owner, sig, false);
518+
}
519+
520+
public void invoke_static(Type owner, Signature sig, boolean isInterface) {
521+
emit_invoke(Constants.INVOKESTATIC, owner, sig, isInterface);
517522
}
518523

519524
public void invoke_virtual_this(Signature sig) {
@@ -525,7 +530,7 @@ public void invoke_static_this(Signature sig) {
525530
}
526531

527532
public void invoke_constructor(Type type, Signature sig) {
528-
emit_invoke(Constants.INVOKESPECIAL, type, sig);
533+
emit_invoke(Constants.INVOKESPECIAL, type, sig, false);
529534
}
530535

531536
public void invoke_constructor_this(Signature sig) {
@@ -850,7 +855,7 @@ public void invoke(MethodInfo method, Type virtualType) {
850855
if (sig.getName().equals(Constants.CONSTRUCTOR_NAME)) {
851856
invoke_constructor(type, sig);
852857
} else if (TypeUtils.isStatic(method.getModifiers())) {
853-
invoke_static(type, sig);
858+
invoke_static(type, sig, TypeUtils.isInterface(classInfo.getModifiers()));
854859
} else if (TypeUtils.isInterface(classInfo.getModifiers())) {
855860
invoke_interface(type, sig);
856861
} else {

cglib/src/main/java/net/sf/cglib/core/KeyFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ public void generateClass(ClassVisitor v) {
246246
}
247247

248248
Type[] parameterTypes = TypeUtils.getTypes(newInstance.getParameterTypes());
249-
ce.begin_class(Constants.V1_2,
249+
ce.begin_class(Constants.V1_8,
250250
Constants.ACC_PUBLIC,
251251
getClassName(),
252252
KEY_FACTORY,

cglib/src/main/java/net/sf/cglib/proxy/Enhancer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -591,7 +591,7 @@ public Object transform(Object value) {
591591

592592
ClassEmitter e = new ClassEmitter(v);
593593
if (currentData == null) {
594-
e.begin_class(Constants.V1_2,
594+
e.begin_class(Constants.V1_8,
595595
Constants.ACC_PUBLIC,
596596
getClassName(),
597597
Type.getType(sc),
@@ -600,7 +600,7 @@ public Object transform(Object value) {
600600
TypeUtils.getTypes(interfaces)),
601601
Constants.SOURCE_FILE);
602602
} else {
603-
e.begin_class(Constants.V1_2,
603+
e.begin_class(Constants.V1_8,
604604
Constants.ACC_PUBLIC,
605605
getClassName(),
606606
null,

cglib/src/main/java/net/sf/cglib/proxy/InterfaceMaker.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ protected Object nextInstance(Object instance) {
100100

101101
public void generateClass(ClassVisitor v) throws Exception {
102102
ClassEmitter ce = new ClassEmitter(v);
103-
ce.begin_class(Constants.V1_2,
104-
Constants.ACC_PUBLIC | Constants.ACC_INTERFACE,
103+
ce.begin_class(Constants.V1_8,
104+
Constants.ACC_PUBLIC | Constants.ACC_INTERFACE | Constants.ACC_ABSTRACT,
105105
getClassName(),
106106
null,
107107
null,

cglib/src/main/java/net/sf/cglib/proxy/MixinEmitter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class MixinEmitter extends ClassEmitter {
3737
public MixinEmitter(ClassVisitor v, String className, Class[] classes, int[] route) {
3838
super(v);
3939

40-
begin_class(Constants.V1_2,
40+
begin_class(Constants.V1_8,
4141
Constants.ACC_PUBLIC,
4242
className,
4343
MIXIN,

0 commit comments

Comments
 (0)