Skip to content

Commit

Permalink
Fixed bug parsing bytecode annotations when method is <init>
Browse files Browse the repository at this point in the history
  • Loading branch information
chriswhocodes committed Jan 10, 2015
1 parent 4bfddfd commit 49f08bc
Show file tree
Hide file tree
Showing 11 changed files with 84 additions and 64 deletions.
Expand Up @@ -305,7 +305,10 @@ public void unmarshalPropertiesToConfig()

intelMode = loadBooleanFromProperty(loadedProps, KEY_SANDBOX_INTEL_MODE, false);

int tieredMode = Integer.parseInt(getProperty(loadedProps, KEY_SANDBOX_TIERED_MODE, "0"));
// TODO I'm forcing no tiered compilation in sandbox until this fix for the LogCompilation output goes live
// http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8049532
// http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2014-June/014911.html
int tieredMode = Integer.parseInt(getProperty(loadedProps, KEY_SANDBOX_TIERED_MODE, "2"));

switch (tieredMode)
{
Expand Down
Expand Up @@ -248,6 +248,8 @@ public static final Set<String> getAutoGeneratedClassPrefixes()
public static final String S_BYTECODE_LOCALVARIABLETABLE = "LocalVariableTable:";
public static final String S_BYTECODE_STACKMAPTABLE = "StackMapTable:";

public static final String S_CONSTRUCTOR_INIT = "<init>";
public static final String S_STATIC_INIT = "<clinit>";
public static final String S_BYTECODE_STATIC_INITIALISER_SIGNATURE = "static {}";

public static final String PUBLIC = "public";
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/org/adoptopenjdk/jitwatch/jarscan/JarScan.java
Expand Up @@ -19,7 +19,6 @@
import org.adoptopenjdk.jitwatch.model.bytecode.BytecodeInstruction;
import org.adoptopenjdk.jitwatch.model.bytecode.ClassBC;
import org.adoptopenjdk.jitwatch.model.bytecode.MemberBytecode;
import org.adoptopenjdk.jitwatch.util.ParseUtil;

import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.*;

Expand Down Expand Up @@ -75,7 +74,7 @@ private static void process(List<String> classLocations, String className, int m

MemberSignatureParts msp = memberBytecode.getMemberSignatureParts();

if (bcSize >= maxMethodBytes && !ParseUtil.STATIC_INIT.equals(msp.getMemberName()))
if (bcSize >= maxMethodBytes && !S_STATIC_INIT.equals(msp.getMemberName()))
{
writer.print(C_DOUBLE_QUOTE);
writer.print(className);
Expand Down
54 changes: 33 additions & 21 deletions src/main/java/org/adoptopenjdk/jitwatch/journal/JournalUtil.java
Expand Up @@ -5,19 +5,8 @@
*/
package org.adoptopenjdk.jitwatch.journal;

import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_BUILDIR;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_COMPILE_KIND;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_HOLDER;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_METHOD;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_NAME;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.ATTR_PARSE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C2N;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C_DOT;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C_SLASH;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.DEBUG_LOGGING;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_NMETHOD;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_PARSE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.TAG_PHASE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.*;


import java.util.List;

Expand Down Expand Up @@ -74,6 +63,11 @@ public static void visitParseTagsOfLastTask(IMetaMember member, ILastTaskParseTa
{
List<Tag> parseTags = parsePhase.getNamedChildren(TAG_PARSE);

if (DEBUG_LOGGING)
{
logger.debug("About to visit {} parse tags in last <task> of Journal", parseTags.size());
}

for (Tag parseTag : parseTags)
{
visitable.visitParseTag(parseTag, parseDictionary);
Expand Down Expand Up @@ -141,8 +135,8 @@ public static boolean memberMatchesParseTag(IMetaMember member, Tag parseTag, IP
}

String klassAttrName = klassTag.getAttribute(ATTR_NAME);
String methodAttrName = methodTag.getAttribute(ATTR_NAME);

String methodAttrName = methodTag.getAttribute(ATTR_NAME).replace(S_ENTITY_LT, S_OPEN_ANGLE).replace(S_ENTITY_GT, S_CLOSE_ANGLE);
if (klassAttrName != null)
{
klassAttrName = klassAttrName.replace(C_SLASH, C_DOT);
Expand All @@ -153,13 +147,24 @@ public static boolean memberMatchesParseTag(IMetaMember member, Tag parseTag, IP

if (DEBUG_LOGGING)
{
logger.debug("memberName: {}", member.getMemberName());
logger.debug("metaClass : {}", member.getMetaClass().getFullyQualifiedName());
logger.debug("memberName: {}/{}", member.getMemberName(), methodAttrName);
logger.debug("metaClass : {}/{}", member.getMetaClass().getFullyQualifiedName(), klassAttrName);
logger.debug("return : {}/{}", member.getReturnTypeName(), returnType);
logger.debug("params : {}/{}", StringUtil.arrayToString(member.getParamTypeNames()), StringUtil.listToString(paramTypes));
logger.debug("params : {}/{}", StringUtil.arrayToString(member.getParamTypeNames()),
StringUtil.listToString(paramTypes));
}

boolean nameMatches = member.getMemberName().equals(methodAttrName);
boolean nameMatches;

if (S_CONSTRUCTOR_INIT.equals(methodAttrName))
{
nameMatches = member.getMemberName().equals(klassAttrName);
}
else
{
nameMatches = member.getMemberName().equals(methodAttrName);
}

boolean klassMatches = member.getMetaClass().getFullyQualifiedName().equals(klassAttrName);
boolean returnMatches = member.getReturnTypeName().equals(returnType);

Expand All @@ -172,7 +177,8 @@ public static boolean memberMatchesParseTag(IMetaMember member, Tag parseTag, IP
String memberParamType = member.getParamTypeNames()[pos];
String tagParamType = paramTypes.get(pos);

//logger.debug("checking: {}/{}", memberParamType, tagParamType);
// logger.debug("checking: {}/{}", memberParamType,
// tagParamType);

if (!memberParamType.equals(tagParamType))
{
Expand All @@ -188,7 +194,13 @@ public static boolean memberMatchesParseTag(IMetaMember member, Tag parseTag, IP

result = nameMatches && klassMatches && returnMatches && paramsMatch;

//logger.debug("result: {}", result);
if (DEBUG_LOGGING)
{
logger.debug("Matched name: {} klass: {} return: {} params: {}", nameMatches, klassMatches, returnMatches,
paramsMatch);

logger.debug("Matches member:{} = {}", member, result);
}
}
}

Expand Down
Expand Up @@ -94,7 +94,7 @@ private static void completeSignature(String origSig, MemberSignatureParts msp)
if (msp.memberName != null)
{
// Constructors will return void for returnType
if (ParseUtil.CONSTRUCTOR_INIT.equals(msp.memberName) || msp.memberName.equals(msp.fullyQualifiedClassName))
if (S_CONSTRUCTOR_INIT.equals(msp.memberName) || msp.memberName.equals(msp.fullyQualifiedClassName))
{
msp.memberName = msp.fullyQualifiedClassName;
msp.returnType = Void.TYPE.getName();
Expand Down Expand Up @@ -150,7 +150,7 @@ private static boolean isStaticInitialiser(String bytecodeSignature)
{
boolean isClinit = false;

if (bytecodeSignature != null && bytecodeSignature.startsWith(ParseUtil.STATIC_BYTECODE_SIGNATURE))
if (bytecodeSignature != null && bytecodeSignature.startsWith(S_BYTECODE_STATIC_INITIALISER_SIGNATURE))
{
isClinit = true;
}
Expand All @@ -177,7 +177,7 @@ public static MemberSignatureParts fromBytecodeSignature(String fqClassName, Str

if (isStaticInitialiser(toParse))
{
msp.memberName = ParseUtil.STATIC_INIT;
msp.memberName = S_STATIC_INIT;
msp.returnType = Void.TYPE.getName();

return msp;
Expand Down
Expand Up @@ -107,6 +107,11 @@ public void visitParseTag(Tag parseTag, IParseDictionary parseDictionary) throws
private void buildParseTagAnnotations(Tag parseTag, Map<Integer, LineAnnotation> result,
List<BytecodeInstruction> instructions, CompilerName compilerName) throws AnnotationException
{
if (DEBUG_LOGGING)
{
logger.debug("Building parse tag annotations");
}

List<Tag> children = parseTag.getChildren();

int currentBytecode = -1;
Expand All @@ -128,6 +133,11 @@ private void buildParseTagAnnotations(Tag parseTag, Map<Integer, LineAnnotation>
{
String name = child.getName();
Map<String, String> tagAttrs = child.getAttrs();

if (DEBUG_LOGGING)
{
logger.debug("Examining child tag {}", child);
}

switch (name)
{
Expand Down
Expand Up @@ -408,8 +408,7 @@ private void loadDefaultEditors()
{
tabPane.getTabs().clear();

addEditor(new File(Sandbox.SANDBOX_SOURCE_DIR.toFile(), "SandboxTest.java"));
addEditor(new File(Sandbox.SANDBOX_SOURCE_DIR.toFile(), "SandboxTestLoad.java"));
addEditor(new File(Sandbox.SANDBOX_SOURCE_DIR.toFile(), "SimpleInliningTest.java"));

saveEditorPaneConfig();
}
Expand Down
9 changes: 2 additions & 7 deletions src/main/java/org/adoptopenjdk/jitwatch/util/ParseUtil.java
Expand Up @@ -39,11 +39,6 @@ public final class ParseUtil
private static final Pattern PATTERN_LOG_SIGNATURE = Pattern.compile("^([0-9\\p{L}\\.\\$_]+) " + METHOD_NAME_REGEX_GROUP
+ " (\\(.*\\))(.*)");

public static final String SQUARE_BRACKET_PAIR = "[]";
public static final String CONSTRUCTOR_INIT = "<init>";
public static final String STATIC_INIT = "<clinit>";
public static final String STATIC_BYTECODE_SIGNATURE = "static {}";

public static final String NAME_SHORT = "short";
public static final String NAME_CHARACTER = "char";
public static final String NAME_BYTE = "byte";
Expand Down Expand Up @@ -193,7 +188,7 @@ public static String expandParameterType(String name)

for (int i = 0; i < arrayDepth; i++)
{
builder.append(SQUARE_BRACKET_PAIR);
builder.append(S_ARRAY_BRACKET_PAIR);
}

return builder.toString();
Expand Down Expand Up @@ -782,7 +777,7 @@ else if (mspTypeName != null)

public static String getParamTypeWithoutArrayBrackets(String paramType)
{
int bracketsIndex = paramType.indexOf(SQUARE_BRACKET_PAIR);
int bracketsIndex = paramType.indexOf(S_ARRAY_BRACKET_PAIR);

if (bracketsIndex != -1)
{
Expand Down
7 changes: 0 additions & 7 deletions src/main/resources/examples/SandboxTest.java

This file was deleted.

21 changes: 0 additions & 21 deletions src/main/resources/examples/SandboxTestLoad.java

This file was deleted.

28 changes: 28 additions & 0 deletions src/main/resources/examples/SimpleInliningTest.java
@@ -0,0 +1,28 @@
// The Sandbox is designed to help you learn about the HotSpot JIT compilers.
// Please note that the JIT compilers may behave differently when isolating a method
// in the Sandbox compared to running your whole application.

public class SimpleInliningTest
{
public SimpleInliningTest()
{
int sum = 0;

for (int i = 0 ; i < 1_000_000; i++)
{
sum = this.add(sum, 1);
}

System.out.println("Sum:" + sum);
}

public int add(int a, int b)
{
return a + b;
}

public static void main(String[] args)
{
new SimpleInliningTest();
}
}

0 comments on commit 49f08bc

Please sign in to comment.