in core/src/main/java/org/adoptopenjdk/jitwatch/chain/CompileChainWalker.java [97:196]
private void processParseTag(Tag parseTag, CompileNode parentNode, IParseDictionary parseDictionary)
{
String methodID = null;
CompileNode lastNode = null;
Map<String, String> methodAttrs = new HashMap<>();
Map<String, String> callAttrs = new HashMap<>();
for (Tag child : parseTag.getChildren())
{
String tagName = child.getName();
Map<String, String> tagAttrs = child.getAttributes();
switch (tagName)
{
case TAG_BC:
{
callAttrs.clear();
break;
}
case TAG_METHOD:
{
methodID = tagAttrs.get(ATTR_ID);
methodAttrs.clear();
methodAttrs.putAll(tagAttrs);
break;
}
case TAG_CALL:
{
methodID = tagAttrs.get(ATTR_METHOD);
callAttrs.clear();
callAttrs.putAll(tagAttrs);
break;
}
case TAG_INLINE_FAIL:
{
createChildNode(parentNode, methodID, parseDictionary, false, false, methodAttrs, callAttrs, tagAttrs);
methodID = null;
lastNode = null;
break;
}
case TAG_INLINE_SUCCESS:
{
lastNode = createChildNode(parentNode, methodID, parseDictionary, true, false, methodAttrs, callAttrs, tagAttrs);
break;
}
case TAG_PARSE: // call depth
{
String childMethodID = tagAttrs.get(ATTR_METHOD);
CompileNode nextParent = parentNode;
if (lastNode != null)
{
nextParent = lastNode;
}
else if (child.getNamedChildren(TAG_PARSE).size() > 0)
{
CompileNode childNode = new CompileNode(childMethodID);
parentNode.addChild(childNode);
nextParent = childNode;
}
processParseTag(child, nextParent, parseDictionary);
break;
}
case TAG_PHASE:
{
String phaseName = tagAttrs.get(ATTR_NAME);
if (S_PARSE_HIR.equals(phaseName))
{
processParseTag(child, parentNode, parseDictionary);
}
else
{
logger.warn("Don't know how to handle phase {}", phaseName);
}
break;
}
case TAG_VIRTUAL_CALL:
lastNode = createChildNode(parentNode, methodID, parseDictionary, false, true, methodAttrs, callAttrs, tagAttrs);
break;
default:
handleOther(child);
break;
}
}
}