private void putAbstractTypes(final int start, final int end) {
        for (int i = start; i < end; ++i) {
            final int abstractType = currentFrame[i];
            final ByteVector output = stackMapTableEntries;

            int arrayDimensions = (abstractType & Frame.DIM_MASK) >> Frame.DIM_SHIFT;
            if (arrayDimensions == 0) {
                int typeValue = abstractType & Frame.VALUE_MASK;
                switch (abstractType & Frame.KIND_MASK) {
                    case Frame.CONSTANT_KIND:
                        output.putByte(typeValue);
                        break;
                    case Frame.REFERENCE_KIND:
                        output
                                .putByte(Frame.ITEM_OBJECT)
                                .putShort(symbolTable.addConstantUtf8Reference(/*CONSTANT_CLASS_TAG*/ 7, symbolTable.typeTable[typeValue].value).index);
                        break;
                    case Frame.UNINITIALIZED_KIND:
                        output.putByte(Frame.ITEM_UNINITIALIZED).putShort((int) symbolTable.typeTable[typeValue].data);
                        break;
                    default:
                        throw new AssertionError();
                }
            } else {
                // Case of an array type, we need to build its descriptor first.
                StringBuilder typeDescriptor = new StringBuilder();
                while (arrayDimensions-- > 0) {
                    typeDescriptor.append('[');
                }
                if ((abstractType & Frame.KIND_MASK) == Frame.REFERENCE_KIND) {
                    typeDescriptor
                            .append('L')
                            .append(symbolTable.typeTable[abstractType & Frame.VALUE_MASK].value)
                            .append(';');
                } else {
                    switch (abstractType & Frame.VALUE_MASK) {
                        case Frame.ITEM_ASM_BOOLEAN:
                            typeDescriptor.append('Z');
                            break;
                        case Frame.ITEM_ASM_BYTE:
                            typeDescriptor.append('B');
                            break;
                        case Frame.ITEM_ASM_CHAR:
                            typeDescriptor.append('C');
                            break;
                        case Frame.ITEM_ASM_SHORT:
                            typeDescriptor.append('S');
                            break;
                        case Frame.ITEM_INTEGER:
                            typeDescriptor.append('I');
                            break;
                        case Frame.ITEM_FLOAT:
                            typeDescriptor.append('F');
                            break;
                        case Frame.ITEM_LONG:
                            typeDescriptor.append('J');
                            break;
                        case Frame.ITEM_DOUBLE:
                            typeDescriptor.append('D');
                            break;
                        default:
                            throw new AssertionError();
                    }
                }
                output
                        .putByte(Frame.ITEM_OBJECT)
                        .putShort(symbolTable.addConstantUtf8Reference(/*CONSTANT_CLASS_TAG*/ 7, typeDescriptor.toString()).index);
            }
        }
    }
Puts some abstract types of {@link #currentFrame} in {@link #stackMapTableEntries} , using the
JVMS verification_type_info format used in StackMapTable attributes.

@param start index of the first type in {@link #currentFrame} to write.
@param end   index of last type in {@link #currentFrame} to write (exclusive).
core/src/main/java/com/alibaba/fastjson2/internal/asm/MethodWriter.java