Skip to content

Commit

Permalink
Inner class navigation in TriView + refactors + tests
Browse files Browse the repository at this point in the history
  • Loading branch information
chriswhocodes committed May 21, 2015
1 parent 7ba9986 commit afb7b25
Show file tree
Hide file tree
Showing 29 changed files with 915 additions and 274 deletions.
Expand Up @@ -212,6 +212,16 @@ public static final Set<String> getAutoGeneratedClassPrefixes()
public static final String S_FILE_COLON = "file:";
public static final String S_DOT_CLASS = ".class";
public static final String S_GENERICS_WILDCARD = "<?>";

public static final String S_TYPE_NAME_SHORT = "short";
public static final String S_TYPE_NAME_CHARACTER = "char";
public static final String S_TYPE_NAME_BYTE = "byte";
public static final String S_TYPE_NAME_LONG = "long";
public static final String S_TYPE_NAME_DOUBLE = "double";
public static final String S_TYPE_NAME_BOOLEAN = "boolean";
public static final String S_TYPE_NAME_INTEGER = "int";
public static final String S_TYPE_NAME_FLOAT = "float";
public static final String S_TYPE_NAME_VOID = "void";

public static final String S_OPTIMIZED_VIRTUAL_CALL = "{optimized virtual_call}";

Expand Down
49 changes: 15 additions & 34 deletions src/main/java/org/adoptopenjdk/jitwatch/loader/BytecodeLoader.java
Expand Up @@ -30,13 +30,11 @@
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_DEFAULT;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_DOT;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_DOUBLE_QUOTE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_DOUBLE_SLASH;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_EMPTY;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_HASH;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_NEWLINE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_SEMICOLON;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_SLASH;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_SPACE;

import java.io.ByteArrayOutputStream;
import java.io.File;
Expand All @@ -58,9 +56,11 @@
import org.adoptopenjdk.jitwatch.model.bytecode.BytecodeInstruction;
import org.adoptopenjdk.jitwatch.model.bytecode.ClassBC;
import org.adoptopenjdk.jitwatch.model.bytecode.IBytecodeParam;
import org.adoptopenjdk.jitwatch.model.bytecode.InnerClassRelationship;
import org.adoptopenjdk.jitwatch.model.bytecode.LineTableEntry;
import org.adoptopenjdk.jitwatch.model.bytecode.MemberBytecode;
import org.adoptopenjdk.jitwatch.model.bytecode.Opcode;
import org.adoptopenjdk.jitwatch.model.bytecode.SourceMapper;
import org.adoptopenjdk.jitwatch.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -107,9 +107,8 @@ public static MetaClass buildMetaClassFromClass(String fqClassName)
return null;
}

//TODO return list? or combine? (latter)
public static ClassBC fetchBytecodeForClass(List<String> classLocations, String fqClassName)
{
{
if (DEBUG_LOGGING_BYTECODE)
{
logger.debug("fetchBytecodeForClass: {}", fqClassName);
Expand Down Expand Up @@ -206,7 +205,7 @@ private static String[] buildClassPathFromClassLocations(Collection<String> clas
// TODO refactor this class - better stateful than all statics
public static ClassBC parse(String fqClassName, String bytecode)
{
ClassBC classBytecode = new ClassBC();
ClassBC classBytecode = new ClassBC(fqClassName);

String[] lines = bytecode.split(S_NEWLINE);

Expand Down Expand Up @@ -263,7 +262,7 @@ public static ClassBC parse(String fqClassName, String bytecode)
logger.debug("New signature: {}", msp);
}

memberBytecode = new MemberBytecode(msp);
memberBytecode = new MemberBytecode(classBytecode, msp);

if (DEBUG_LOGGING_BYTECODE)
{
Expand Down Expand Up @@ -295,14 +294,19 @@ else if (line.startsWith(S_BYTECODE_MAJOR_VERSION))
else if (line.startsWith(S_BYTECODE_SOURCE_FILE))
{
classBytecode.setSourceFile(getSourceFile(line));

SourceMapper.addSourceClassMapping(classBytecode);
}
break;
case INNERCLASSES:
String innerClassName = getInnerClassNameOrNull(line);
InnerClassRelationship icr = InnerClassRelationship.parse(line);

if (innerClassName != null)
if (icr != null)
{
classBytecode.addInnerClassName(innerClassName);
if (fqClassName.equals(icr.getParentClass()))
{
classBytecode.addInnerClassName(icr.getChildClass());
}
}
else
{
Expand Down Expand Up @@ -350,29 +354,6 @@ else if (line.startsWith(S_BYTECODE_SOURCE_FILE))
return classBytecode;
}

public static String getInnerClassNameOrNull(String innerClassLine)
{
String result = null;

if (innerClassLine != null)
{
String tempResult = StringUtil.getSubstringBetween(innerClassLine, S_DOUBLE_SLASH, " of class");

if (tempResult != null)
{
int startIndex = tempResult.indexOf(S_SPACE);

if (startIndex != -1)
{
result = tempResult.substring(startIndex + 1);
}

}
}

return result;
}

public static void buildClassGenerics(String line, ClassBC classBytecode)
{
StringBuilder keyBuilder = new StringBuilder();
Expand Down Expand Up @@ -640,7 +621,7 @@ private static int getVersionPart(final String line)

return version;
}

private static String getSourceFile(final String line)
{
String result = null;
Expand All @@ -650,7 +631,7 @@ private static String getSourceFile(final String line)
if (colonPos != -1 && colonPos != line.length() - 1)
{
result = line.substring(colonPos + 1);

result = result.replace(S_DOUBLE_QUOTE, S_EMPTY).trim();
}

Expand Down
Expand Up @@ -41,7 +41,6 @@
import java.util.concurrent.ConcurrentHashMap;

import org.adoptopenjdk.jitwatch.model.assembly.AssemblyMethod;
import org.adoptopenjdk.jitwatch.model.bytecode.ClassBC;
import org.adoptopenjdk.jitwatch.util.ParseUtil;
import org.adoptopenjdk.jitwatch.util.StringUtil;
import org.slf4j.Logger;
Expand Down Expand Up @@ -487,9 +486,4 @@ public void addJournalEntry(Tag entry)
{
journal.addEntry(entry);
}

public ClassBC getClassBytecodeForMember(List<String> classLocations)
{
return getMetaClass().getClassBytecode(classLocations);
}
}
}
Expand Up @@ -5,7 +5,7 @@
*/
package org.adoptopenjdk.jitwatch.model;

import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.*;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C_CLOSE_ANGLE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C_COLON;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C_COMMA;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C_DOT;
Expand All @@ -16,8 +16,10 @@
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C_SPACE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.DEBUG_LOGGING;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.DEBUG_LOGGING_ASSEMBLY;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_BYTECODE_STATIC_INITIALISER_SIGNATURE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_CLOSE_PARENTHESES;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_COMMA;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_CONSTRUCTOR_INIT;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_DOT;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_DOUBLE_QUOTE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_EMPTY;
Expand All @@ -26,6 +28,7 @@
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_QUOTE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_SLASH;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_SPACE;
import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_STATIC_INIT;

import java.lang.reflect.Modifier;
import java.util.ArrayList;
Expand All @@ -37,6 +40,7 @@

import org.adoptopenjdk.jitwatch.model.bytecode.ClassBC;
import org.adoptopenjdk.jitwatch.util.ParseUtil;
import org.adoptopenjdk.jitwatch.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -84,6 +88,7 @@ private MemberSignatureParts()
modifier = 0;
}

//TODO really???
public void setClassBC(ClassBC classBytecode)
{
this.classBytecode = classBytecode;
Expand Down Expand Up @@ -495,6 +500,11 @@ public String getFullyQualifiedClassName()
{
return fullyQualifiedClassName;
}

public String getPackageName()
{
return StringUtil.getAbbreviatedFQName(getFullyQualifiedClassName());
}

@Override
public String toString()
Expand Down
28 changes: 26 additions & 2 deletions src/main/java/org/adoptopenjdk/jitwatch/model/MetaClass.java
Expand Up @@ -96,7 +96,7 @@ public void setMissingDef(boolean missingDef)
this.missingDef = missingDef;
}

public ClassBC getClassBytecode(List<String> classLocations)
public ClassBC getClassBytecode(IReadOnlyJITDataModel model, List<String> classLocations)
{
if (DEBUG_LOGGING_BYTECODE)
{
Expand All @@ -106,11 +106,36 @@ public ClassBC getClassBytecode(List<String> classLocations)
if (classBytecode == null)
{
classBytecode = BytecodeLoader.fetchBytecodeForClass(classLocations, getFullyQualifiedName());

if (classBytecode != null)
{
loadInnerClasses(classBytecode.getInnerClassNames(), model, classLocations);
}
}

return classBytecode;
}

private void loadInnerClasses(List<String> innerClassNames, IReadOnlyJITDataModel model, List<String> classLocations)
{
if (DEBUG_LOGGING_BYTECODE)
{
logger.info("innerClasses to load {}", innerClassNames.size());
}

for (String innerClassName : innerClassNames)
{
if (DEBUG_LOGGING_BYTECODE)
{
logger.info("innerClass {}", innerClassName);
}

MetaClass metaClassForInner = model.getPackageManager().getMetaClass(innerClassName);

metaClassForInner.getClassBytecode(model, classLocations);
}
}

public String toStringDetailed()
{
StringBuilder builder = new StringBuilder();
Expand Down Expand Up @@ -216,7 +241,6 @@ public IMetaMember getMemberForSignature(MemberSignatureParts msp)
return result;
}


public List<String> getTreePath()
{
MetaPackage metaPackage = getPackage();
Expand Down
42 changes: 18 additions & 24 deletions src/main/java/org/adoptopenjdk/jitwatch/model/bytecode/ClassBC.java
Expand Up @@ -18,10 +18,10 @@

import org.adoptopenjdk.jitwatch.model.IMetaMember;
import org.adoptopenjdk.jitwatch.model.MemberSignatureParts;
import org.adoptopenjdk.jitwatch.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

// 1 ClassBC -> n MemberBytecode -> 1 LineNumberTable
public class ClassBC
{
private ConstantPool constantPool;
Expand All @@ -30,6 +30,8 @@ public class ClassBC

private int majorVersion;
private int minorVersion;

private String fqClassName;

private List<MemberBytecode> memberBytecodeList = new ArrayList<>();

Expand All @@ -38,6 +40,21 @@ public class ClassBC
private Map<String, String> classGenericsMap = new LinkedHashMap<>();

private static final Logger logger = LoggerFactory.getLogger(ClassBC.class);

public ClassBC(String fqClassName)
{
this.fqClassName = fqClassName;
}

public String getFullyQualifiedClassName()
{
return fqClassName;
}

public String getPackageName()
{
return StringUtil.getPackageName(fqClassName);
}

public void addMemberBytecode(MemberBytecode memberBytecode)
{
Expand All @@ -49,29 +66,6 @@ public List<MemberBytecode> getMemberBytecodeList()
return Collections.unmodifiableList(memberBytecodeList);
}

public MemberBytecode getMemberBytecodeForSourceLine(int sourceLine)
{
MemberBytecode result = null;

for (MemberBytecode memberBytecode : memberBytecodeList)
{
if (DEBUG_LOGGING_BYTECODE)
{
logger.debug("checking lineTable for member {}", memberBytecode.getMemberSignatureParts().getMemberName());
}

LineTable lineTable = memberBytecode.getLineTable();

if (lineTable.sourceLineInRange(sourceLine))
{
result = memberBytecode;
break;
}
}

return result;
}

public void addGenericsMapping(String key, String value)
{
classGenericsMap.put(key, value);
Expand Down

0 comments on commit afb7b25

Please sign in to comment.