TextBuffer (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()) + ")"); } }; }