in java/fury-core/src/main/java/org/apache/fury/builder/CompatibleCodecBuilder.java [718:785]
private void readSeparateTypesHashFields(
Expression buffer,
ListExpression expressionBuilder,
Expression bean,
Expression partFieldInfo) {
FieldInfo[] separateTypesHashFields = fieldResolver.getSeparateTypesHashFields();
if (separateTypesHashFields.length > 0) {
long minFieldInfo = separateTypesHashFields[0].getEncodedFieldInfo();
expressionBuilder.add(
skipDataBy8Until(
bean,
buffer,
partFieldInfo,
minFieldInfo,
0b11,
FieldResolver.SEPARATE_TYPES_HASH_FLAG,
false));
groupFields(separateTypesHashFields, 3)
.forEach(
group -> {
Expression invokeGeneratedRead =
ExpressionOptimizer.invokeGenerated(
ctx,
() -> {
ListExpression groupExpressions = new ListExpression();
for (FieldInfo fieldInfo : group) {
long encodedFieldInfo = fieldInfo.getEncodedFieldInfo();
Descriptor descriptor = createDescriptor(fieldInfo);
walkPath.add(descriptor.getDeclaringClass() + descriptor.getName());
Expression readField =
readObjectField(fieldInfo, bean, buffer, descriptor, partFieldInfo);
Expression tryReadField =
new ListExpression(
skipDataBy8Until(
bean,
buffer,
partFieldInfo,
encodedFieldInfo,
0b11,
FieldResolver.SEPARATE_TYPES_HASH_FLAG,
true),
new If(
eq(
partFieldInfo,
new Literal(encodedFieldInfo, PRIMITIVE_LONG_TYPE)),
readObjectField(
fieldInfo, bean, buffer, descriptor, partFieldInfo)));
walkPath.removeLast();
groupExpressions.add(
new If(
eq(
partFieldInfo,
new Literal(encodedFieldInfo, PRIMITIVE_LONG_TYPE)),
readField,
tryReadField));
}
groupExpressions.add(new Return(partFieldInfo));
return groupExpressions;
},
"readSeparateTypesHashFields",
true);
expressionBuilder.add(
new Assign(partFieldInfo, invokeGeneratedRead),
new If(eq(partFieldInfo, endTagLiteral), new Return(bean)));
});
}
expressionBuilder.add(new Invoke(fieldResolverRef, "skipEndFields", buffer, partFieldInfo));
}