@Override
  public TextBuffer toJava(int indent, BytecodeMappingTracer tracer) {
    tracer.addMapping(bytecode);

    if (funcType <= FUNCTION_USHR) {
      return wrapOperandString(lstOperands.get(0), false, indent, tracer)
        .append(OPERATORS[funcType])
        .append(wrapOperandString(lstOperands.get(1), true, indent, tracer));
    }

      // try to determine more accurate type for 'char' literals
    if (funcType >= FUNCTION_EQ) {
      if (funcType <= FUNCTION_LE) {
        Exprent left = lstOperands.get(0);
        Exprent right = lstOperands.get(1);

        if (right.type == EXPRENT_CONST) {
          ((ConstExprent) right).adjustConstType(left.getExprType());
        }
        else if (left.type == EXPRENT_CONST) {
          ((ConstExprent) left).adjustConstType(right.getExprType());
        }
      }

      return wrapOperandString(lstOperands.get(0), false, indent, tracer)
        .append(OPERATORS[funcType - FUNCTION_EQ + 11])
        .append(wrapOperandString(lstOperands.get(1), true, indent, tracer));
    }

    return switch (funcType) {
      case FUNCTION_BIT_NOT -> wrapOperandString(lstOperands.get(0), true, indent, tracer).prepend("~");
      case FUNCTION_BOOL_NOT -> wrapOperandString(lstOperands.get(0), true, indent, tracer).prepend("!");
      case FUNCTION_NEG -> wrapOperandString(lstOperands.get(0), true, indent, tracer).prepend("-");
      case FUNCTION_CAST -> lstOperands.get(1).toJava(indent, tracer).enclose("(", ")")
        .append(wrapOperandString(lstOperands.get(0), true, indent, tracer));
      case FUNCTION_ARRAY_LENGTH -> {
        Exprent arr = lstOperands.get(0);
        TextBuffer res = wrapOperandString(arr, false, indent, tracer);
        if (arr.getExprType().getArrayDim() == 0) {
          VarType objArr = VarType.VARTYPE_OBJECT.resizeArrayDim(1); // type family does not change
          res.enclose("((" + ExprProcessor.getCastTypeName(objArr, Collections.emptyList()) + ")", ")");
        }
        yield res.append(".length");
      }
      case FUNCTION_IIF -> wrapOperandString(lstOperands.get(0), true, indent, tracer)
        .append(" ? ")
        .append(wrapOperandString(lstOperands.get(1), true, indent, tracer))
        .append(" : ")
        .append(wrapOperandString(lstOperands.get(2), true, indent, tracer));
      case FUNCTION_IPP -> wrapOperandString(lstOperands.get(0), true, indent, tracer).append("++");
      case FUNCTION_PPI -> wrapOperandString(lstOperands.get(0), true, indent, tracer).prepend("++");
      case FUNCTION_IMM -> wrapOperandString(lstOperands.get(0), true, indent, tracer).append("--");
      case FUNCTION_MMI -> wrapOperandString(lstOperands.get(0), true, indent, tracer).prepend("--");
      case FUNCTION_INSTANCEOF -> wrapOperandString(lstOperands.get(0), true, indent, tracer).append(" instanceof ")
        .append(wrapOperandString(lstOperands.get(1), true, indent, tracer));
      case FUNCTION_LCMP -> // shouldn't appear in the final code
        wrapOperandString(lstOperands.get(0), true, indent, tracer).prepend("__lcmp__(")
          .append(", ")
          .append(wrapOperandString(lstOperands.get(1), true, indent, tracer))
          .append(")");
      case FUNCTION_FCMPL -> // shouldn't appear in the final code
        wrapOperandString(lstOperands.get(0), true, indent, tracer).prepend("__fcmpl__(")
          .append(", ")
          .append(wrapOperandString(lstOperands.get(1), true, indent, tracer))
          .append(")");
      case FUNCTION_FCMPG -> // shouldn't appear in the final code
        wrapOperandString(lstOperands.get(0), true, indent, tracer).prepend("__fcmpg__(")
          .append(", ")
          .append(wrapOperandString(lstOperands.get(1), true, indent, tracer))
          .append(")");
      case FUNCTION_DCMPL -> // shouldn't appear in the final code
        wrapOperandString(lstOperands.get(0), true, indent, tracer).prepend("__dcmpl__(")
          .append(", ")
          .append(wrapOperandString(lstOperands.get(1), true, indent, tracer))
          .append(")");
      case FUNCTION_DCMPG -> // shouldn't appear in the final code
        wrapOperandString(lstOperands.get(0), true, indent, tracer).prepend("__dcmpg__(")
          .append(", ")
          .append(wrapOperandString(lstOperands.get(1), true, indent, tracer))
          .append(")");
      default -> {
        assert funcType <= FUNCTION_I2S;
        yield wrapOperandString(lstOperands.get(0), true, indent, tracer).prepend("(" + ExprProcessor.getTypeName(
          TYPES[funcType - FUNCTION_I2L], Collections.emptyList()) + ")");
      }
    };
  }
@Override
  public TextBuffer toJava(int indent, BytecodeMappingTracer tracer)