in core/src/main/java/org/adoptopenjdk/jitwatch/model/assembly/x86/AssemblyParserX86.java [115:214]
public AssemblyInstruction parseInstruction(String input, long address, String comment, String annotation,
AssemblyLabels labels)
{
input = input.replaceAll("\\s+", S_SPACE).trim();
int length = input.length();
boolean inBrackets = false;
String mnemonic = null;
List<String> prefixes = new ArrayList<>();
List<String> operands = new ArrayList<>();
StringBuilder partBuilder = new StringBuilder();
for (int pos = 0; pos < length; pos++)
{
char c = input.charAt(pos);
if (c == C_OPEN_PARENTHESES || c == C_OPEN_SQUARE_BRACKET)
{
inBrackets = true;
}
else if (c == C_CLOSE_PARENTHESES || c == C_CLOSE_SQUARE_BRACKET)
{
inBrackets = false;
}
if (c == C_SPACE && mnemonic == null)
{
// end of part
String part = partBuilder.toString();
partBuilder.delete(0, partBuilder.length());
if (DEBUG_LOGGING_ASSEMBLY)
{
logger.debug("part: '{}'", part);
}
if (mnemonic == null)
{
if ("data64".equals(part) || "data32".equals(part) || "data16".equals(part) || "data8".equals(part)
|| "lock".equals(part))
{
prefixes.add(part);
}
else
{
mnemonic = part;
if (DEBUG_LOGGING_ASSEMBLY)
{
logger.debug("mnemonic: '{}'", mnemonic);
}
}
}
}
else if (c == C_COMMA && !inBrackets)
{
String operand = partBuilder.toString();
partBuilder.delete(0, partBuilder.length());
operands.add(operand);
if (DEBUG_LOGGING_ASSEMBLY)
{
logger.debug("operand1: '{}'", operand);
}
}
else
{
partBuilder.append(c);
}
}
if (partBuilder.length() > 0)
{
String part = partBuilder.toString();
partBuilder.delete(0, partBuilder.length() - 1);
if (mnemonic == null)
{
mnemonic = part;
if (DEBUG_LOGGING_ASSEMBLY)
{
logger.debug("mnemonic: '{}'", part);
}
}
else
{
operands.add(part);
if (DEBUG_LOGGING_ASSEMBLY)
{
logger.debug("operand2: '{}'", part);
}
}
}
return new AssemblyInstruction(annotation, address, prefixes, mnemonic, "", operands, comment, labels);
}