in java/fury-core/src/main/java/org/apache/fury/builder/CompatibleCodecBuilder.java [172:337]
public Expression buildEncodeExpression() {
Reference inputObject = new Reference(ROOT_OBJECT_NAME, OBJECT_TYPE, false);
Reference buffer = new Reference(BUFFER_NAME, bufferTypeRef, false);
ListExpression expressions = new ListExpression();
Expression bean = tryCastIfPublic(inputObject, beanType, ctx.newName(beanClass));
expressions.add(bean);
groupFields(fieldResolver.getEmbedTypes4Fields(), 9)
.forEach(
group -> {
Expression invokeGeneratedWrite =
ExpressionOptimizer.invokeGenerated(
ctx,
() -> {
ListExpression groupExpressions = new ListExpression();
for (FieldInfo fieldInfo : group) {
groupExpressions.add(
new Invoke(
buffer,
"writeInt32",
new Literal(
(int) fieldInfo.getEncodedFieldInfo(), PRIMITIVE_INT_TYPE)));
groupExpressions.add(writeEmbedTypeFieldValue(bean, buffer, fieldInfo));
}
return groupExpressions;
},
"writeEmbedTypes4Fields");
expressions.add(invokeGeneratedWrite);
});
groupFields(fieldResolver.getEmbedTypes9Fields(), 9)
.forEach(
group -> {
Expression invokeGeneratedWrite =
ExpressionOptimizer.invokeGenerated(
ctx,
() -> {
ListExpression groupExpressions = new ListExpression();
for (FieldInfo fieldInfo : group) {
groupExpressions.add(
new Invoke(
buffer,
"writeInt64",
new Literal(
fieldInfo.getEncodedFieldInfo(), PRIMITIVE_LONG_TYPE)));
groupExpressions.add(writeEmbedTypeFieldValue(bean, buffer, fieldInfo));
}
return groupExpressions;
},
"writeEmbedTypes9Fields");
expressions.add(invokeGeneratedWrite);
});
groupFields(fieldResolver.getEmbedTypesHashFields(), 9)
.forEach(
group -> {
Expression invokeGeneratedWrite =
ExpressionOptimizer.invokeGenerated(
ctx,
() -> {
ListExpression groupExpressions = new ListExpression();
for (FieldInfo fieldInfo : group) {
groupExpressions.add(
new Invoke(
buffer,
"writeInt64",
new Literal(
fieldInfo.getEncodedFieldInfo(), PRIMITIVE_LONG_TYPE)));
groupExpressions.add(writeEmbedTypeFieldValue(bean, buffer, fieldInfo));
}
return groupExpressions;
},
"writeEmbedTypesHashFields");
expressions.add(invokeGeneratedWrite);
});
groupFields(fieldResolver.getSeparateTypesHashFields(), 9)
.forEach(
group -> {
Expression invokeGeneratedWrite =
ExpressionOptimizer.invokeGenerated(
ctx,
() -> {
ListExpression groupExpressions = new ListExpression();
for (FieldInfo fieldInfo : group) {
groupExpressions.add(
new Invoke(
buffer,
"writeInt64",
new Literal(
fieldInfo.getEncodedFieldInfo(), PRIMITIVE_LONG_TYPE)));
Descriptor descriptor = createDescriptor(fieldInfo);
walkPath.add(descriptor.getDeclaringClass() + descriptor.getName());
byte fieldType = fieldInfo.getFieldType();
Expression writeFieldAction =
invokeGenerated(
ctx,
() -> {
Expression fieldValue = getFieldValue(bean, descriptor);
ListExpression writeFieldValue =
new ListExpression(
new Invoke(
buffer,
"writeByte",
new Literal(fieldType, PRIMITIVE_BYTE_TYPE)));
if (fieldType == FieldTypes.OBJECT) {
writeFieldValue.add(
writeForNotNullNonFinalObject(
fieldValue, buffer, descriptor.getTypeRef()));
} else {
if (fieldType == FieldTypes.COLLECTION_ELEMENT_FINAL) {
CollectionFieldInfo collectionFieldInfo =
(CollectionFieldInfo) fieldInfo;
writeFieldValue.add(
writeFinalClassInfo(
buffer, collectionFieldInfo.getElementType()));
} else if (fieldType == FieldTypes.MAP_KV_FINAL) {
MapFieldInfo mapFieldInfo = (MapFieldInfo) fieldInfo;
Expression keyClassInfo =
getFinalClassInfo(mapFieldInfo.getKeyType());
Expression valueClassInfo =
getFinalClassInfo(mapFieldInfo.getValueType());
writeFieldValue.add(
keyClassInfo,
valueClassInfo,
writeFinalClassInfo(buffer, mapFieldInfo.getKeyType()),
writeFinalClassInfo(
buffer, mapFieldInfo.getValueType()));
} else if (fieldType == FieldTypes.MAP_KEY_FINAL) {
MapFieldInfo mapFieldInfo = (MapFieldInfo) fieldInfo;
writeFieldValue.add(
writeFinalClassInfo(buffer, mapFieldInfo.getKeyType()));
} else {
Preconditions.checkArgument(
fieldType == FieldTypes.MAP_VALUE_FINAL, fieldInfo);
MapFieldInfo mapFieldInfo = (MapFieldInfo) fieldInfo;
writeFieldValue.add(
writeFinalClassInfo(
buffer, mapFieldInfo.getValueType()));
}
Class<?> clz = descriptor.getRawType();
if (ReflectionUtils.isMonomorphic(clz)) {
// serializeForNotNull won't write field type if it's final,
// but the type is useful if peer doesn't have this field.
writeFieldValue.add(writeFinalClassInfo(buffer, clz));
}
writeFieldValue.add(
serializeForNotNull(
fieldValue, buffer, descriptor.getTypeRef()));
}
return new If(
ExpressionUtils.not(writeRefOrNull(buffer, fieldValue)),
writeFieldValue);
},
"writeField",
fieldInfo.getEncodedFieldInfo());
walkPath.removeLast();
groupExpressions.add(writeFieldAction);
}
return groupExpressions;
},
"writeSeparateTypesHashFields");
expressions.add(invokeGeneratedWrite);
});
expressions.add(
new Invoke(
buffer, "writeInt64", new Literal(fieldResolver.getEndTag(), PRIMITIVE_LONG_TYPE)));
return expressions;
}