Closed vovanre closed 4 years ago
Can't you just do
if (str.getBytes(StandardCharsets.UTF_8).length > 65535) {/* stuff */}
?
Can. But is it worth wasting memory to copy an array?
I don't really know. Less boilerplate is all I can say.
private static InsnList getSafeStringInsnList(String string) {
InsnList insnList = new InsnList();
if (string.getBytes(StandardCharsets.UTF_8).length < StringUtils.MAX_SAFE_BYTE_COUNT) {
insnList.add(new LdcInsnNode(string));
return insnList;
}
insnList.add(new TypeInsnNode(NEW, "java/lang/StringBuilder"));
insnList.add(new InsnNode(DUP));
insnList.add(new MethodInsnNode(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false));
String[] chunks = StringUtils.splitUtf8ToChunks(string, StringUtils.MAX_SAFE_BYTE_COUNT);
for (String chunk : chunks) {
insnList.add(new LdcInsnNode(chunk));
insnList.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false));
}
insnList.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false));
return insnList;
}
Like that?
Fix for #45 issue.