Skip to content

Commit cb87575

Browse files
committed
HHH-19577 Avoid duplicate stack map frames for SetPropertyValues
1 parent 3a46cfc commit cb87575

File tree

1 file changed

+19
-6
lines changed

1 file changed

+19
-6
lines changed

hibernate-core/src/main/java/org/hibernate/bytecode/internal/bytebuddy/BytecodeProviderImpl.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -886,17 +886,17 @@ public Size apply(
886886
Label nextLabel = new Label();
887887
for ( int index = 0; index < setters.length; index++ ) {
888888
final Member setterMember = setters[index];
889-
if ( enhanced && currentLabel != null ) {
889+
if ( setterMember == EMBEDDED_MEMBER ) {
890+
// The embedded property access does a no-op
891+
continue;
892+
}
893+
if ( currentLabel != null ) {
890894
methodVisitor.visitLabel( currentLabel );
891895
implementationContext.getFrameGeneration().same(
892896
methodVisitor,
893897
instrumentedMethod.getParameters().asTypeList()
894898
);
895899
}
896-
if ( setterMember == EMBEDDED_MEMBER ) {
897-
// The embedded property access does a no-op
898-
continue;
899-
}
900900
// Push entity on stack
901901
methodVisitor.visitVarInsn( Opcodes.ALOAD, 1 );
902902
methodVisitor.visitTypeInsn( Opcodes.CHECKCAST, Type.getInternalName( clazz ) );
@@ -1023,6 +1023,7 @@ else if ( setterMember instanceof Field field ) {
10231023
}
10241024
if ( enhanced ) {
10251025
final boolean compositeTracker = CompositeTracker.class.isAssignableFrom( type );
1026+
boolean alreadyHasFrame = false;
10261027
// The composite owner check and setting only makes sense if
10271028
// * the value type is a composite tracker
10281029
// * a value subtype can be a composite tracker
@@ -1104,6 +1105,7 @@ else if ( setterMember instanceof Field field ) {
11041105
// Clean stack after the if block
11051106
methodVisitor.visitLabel( compositeTrackerEndLabel );
11061107
implementationContext.getFrameGeneration().same(methodVisitor, instrumentedMethod.getParameters().asTypeList());
1108+
alreadyHasFrame = true;
11071109
}
11081110
if ( persistentAttributeInterceptable ) {
11091111
// Load the owner
@@ -1168,9 +1170,20 @@ else if ( setterMember instanceof Field field ) {
11681170
// Clean stack after the if block
11691171
methodVisitor.visitLabel( instanceofEndLabel );
11701172
implementationContext.getFrameGeneration().same(methodVisitor, instrumentedMethod.getParameters().asTypeList());
1173+
alreadyHasFrame = true;
11711174
}
11721175

1173-
currentLabel = nextLabel;
1176+
if ( alreadyHasFrame ) {
1177+
// Usually, the currentLabel is visited as well generating a frame,
1178+
// but if a frame was already generated, only visit the label here,
1179+
// otherwise two frames for the same bytecode index are generated,
1180+
// which is wrong and will produce an error when the JDK ClassFile API is used
1181+
methodVisitor.visitLabel( nextLabel );
1182+
currentLabel = null;
1183+
}
1184+
else {
1185+
currentLabel = nextLabel;
1186+
}
11741187
nextLabel = new Label();
11751188
}
11761189
}

0 commit comments

Comments
 (0)