Skip to content

Commit

Permalink
HHH-16832 Bytecode enhancement leads to broken constructor for a gene…
Browse files Browse the repository at this point in the history
…ric embedded field in a MappedSuperclass
  • Loading branch information
dreab8 committed Jun 26, 2023
1 parent d65b74c commit 4dd1dd6
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -607,14 +607,20 @@ static Object getterSelf() {
// mapping to get private field from superclass by calling the enhanced reader, for use when field is not visible
static class GetterMapping implements Advice.OffsetMapping {

private final FieldDescription persistentField;
private final TypeDescription.Generic returnType;
private final String name;

GetterMapping(FieldDescription persistentField) {
this.persistentField = persistentField;
this( persistentField, persistentField.getType() );
}

GetterMapping(FieldDescription persistentField, TypeDescription.Generic returnType) {
this.name = persistentField.getName();
this.returnType = returnType;
}

@Override public Target resolve(TypeDescription instrumentedType, MethodDescription instrumentedMethod, Assigner assigner, Advice.ArgumentHandler argumentHandler, Sort sort) {
MethodDescription.Token signature = new MethodDescription.Token( EnhancerConstants.PERSISTENT_FIELD_READER_PREFIX + persistentField.getName(), Opcodes.ACC_PUBLIC, persistentField.getType() );
MethodDescription.Token signature = new MethodDescription.Token( EnhancerConstants.PERSISTENT_FIELD_READER_PREFIX + name , Opcodes.ACC_PUBLIC, returnType );
MethodDescription method = new MethodDescription.Latent( instrumentedType.getSuperClass().asErasure(), signature );

return new Target.AbstractReadOnlyAdapter() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ else if ( !persistentField.hasAnnotation( Id.class )
Advice.WithCustomMapping advice = Advice.withCustomMapping();
advice = persistentField.isVisibleTo( managedCtClass )
? advice.bind( CodeTemplates.FieldValue.class, persistentField.getFieldDescription() )
: advice.bind( CodeTemplates.FieldValue.class, new CodeTemplates.GetterMapping( persistentField.getFieldDescription() ) );
: advice.bind( CodeTemplates.FieldValue.class, new CodeTemplates.GetterMapping( persistentField.getFieldDescription(), persistentField.getGetter().get().getReturnType() ) );

implementation = advice
.bind( CodeTemplates.FieldName.class, persistentField.getName() )
Expand Down

0 comments on commit 4dd1dd6

Please sign in to comment.