private void push(final SymbolTable symbolTable, final String descriptor) {
        final int typeDescriptorOffset;
        switch (descriptor) {
            case "()J":
            case "()V":
            case "()Z":
            case "()I":
            case "()Ljava/lang/Class;":
                typeDescriptorOffset = 2;
                break;
            case "(I)V":
            case "(J)V":
            case "(J)Z":
            case "(I)Ljava/lang/Object;":
            case "(I)Ljava/lang/Integer;":
                typeDescriptorOffset = 3;
                break;
            case "(Ljava/lang/Enum;)V":
                typeDescriptorOffset = 18;
                break;
            case "(Ljava/lang/Object;)Z":
            case "(Ljava/lang/String;)V":
            case "(Ljava/lang/Object;)V":
                typeDescriptorOffset = 20;
                break;
            case "(Lcom/alibaba/fastjson2/JSONWriter;)V":
            case "(Lcom/alibaba/fastjson2/JSONWriter;)Z":
                typeDescriptorOffset = 36;
                break;
            case "(Lcom/alibaba/fastjson2/JSONWriter;I)V":
            case "(Lcom/alibaba/fastjson2/JSONWriter;J)V":
                typeDescriptorOffset = 37;
                break;
            case "(Ljava/lang/Object;Ljava/lang/reflect/Type;)Z":
                typeDescriptorOffset = 44;
                break;
            case "(Lcom/alibaba/fastjson2/JSONWriter;Ljava/lang/Enum;)V":
                typeDescriptorOffset = 52;
                break;
            case "(Lcom/alibaba/fastjson2/JSONWriter;Ljava/lang/Class;)Lcom/alibaba/fastjson2/writer/ObjectWriter;":
            case "(Lcom/alibaba/fastjson2/JSONWriter;ZLjava/util/List;)V":
                typeDescriptorOffset = 53;
                break;
            case "(Lcom/alibaba/fastjson2/JSONWriter;Ljava/lang/reflect/Type;)Lcom/alibaba/fastjson2/writer/ObjectWriter;":
                typeDescriptorOffset = 60;
                break;
            case "(Lcom/alibaba/fastjson2/writer/FieldWriter;Ljava/lang/Object;)Ljava/lang/String;":
                typeDescriptorOffset = 62;
                break;
            case "(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;JLjava/util/List;)V":
                typeDescriptorOffset = 72;
                break;
            case "(Lcom/alibaba/fastjson2/JSONWriter;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/reflect/Type;J)V":
                typeDescriptorOffset = 97;
                break;
            default:
                if (descriptor.charAt(0) == '(') {
                    int currentOffset = 1;
                    // Skip the argument types, one at a each loop iteration.
                    while (descriptor.charAt(currentOffset) != ')') {
                        while (descriptor.charAt(currentOffset) == '[') {
                            currentOffset++;
                        }
                        if (descriptor.charAt(currentOffset++) == 'L') {
                            // Skip the argument descriptor content.
                            int semiColumnOffset = descriptor.indexOf(';', currentOffset);
                            currentOffset = Math.max(currentOffset, semiColumnOffset + 1);
                        }
                    }
                    typeDescriptorOffset = currentOffset + 1;
                } else {
                    typeDescriptorOffset = 0;
                }
                break;
        }

        int abstractType = getAbstractTypeFromDescriptor(symbolTable, descriptor, typeDescriptorOffset);
        if (abstractType != 0) {
            push(abstractType);
            if (abstractType == LONG || abstractType == DOUBLE) {
                push(TOP);
            }
        }
    }
Pushes the abstract type corresponding to the given descriptor on the output frame stack.

@param symbolTable the type table to use to lookup and store type {@link Symbol}.
@param descriptor  a type or method descriptor (in which case its return type is pushed).
core/src/main/java/com/alibaba/fastjson2/internal/asm/Frame.java