private void readSeparateTypesHashFields()

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));
  }