Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@ public class ThrowableTest {

@Test
public void testStackTraceElementToString() throws Exception {
String expected = "[this=" + this + ", boolArg=true, byteArg=100, " +
String expected = "[this=" + this.toString().replace("stackparam.", "s.") +
", boolArg=true, byteArg=100, " +
"charArg=e, shortArg=102, intArg=103, longArg=104, " +
"floatArg=105.6, doubleArg=106.7, nullArg=null, " +
"objectExactArg=" + CONST_OBJ + ", stringVarArgs=[foo, bar, baz]]";
"objectExactArg=" + CONST_OBJ.toString().replace("java.lang", "j.l") +
", stringVarArgs=[foo, bar, baz]]";
StackTraceElement elem = getTestElement();
String traceStr = elem.toString();
traceStr = traceStr.substring(traceStr.indexOf('['));
Expand Down
37 changes: 35 additions & 2 deletions javalib/native/src/main/java/stackparam/StackParamNative.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package stackparam;

import java.util.Arrays;
import java.lang.reflect.Method;

public class StackParamNative {

Expand All @@ -10,6 +11,15 @@ public class StackParamNative {
*/
public static int MAX_PARAM_STR_LEN = 50;

public static Method DEFAULT_TO_STRING;
static {
try {
DEFAULT_TO_STRING = Object.class.getMethod("toString");
} catch (Exception e) {
//can't happen
}
}

/**
* Returns the stack params of the given thread for the given depth. It is
* returned with closest depth first.
Expand Down Expand Up @@ -60,14 +70,18 @@ public static String appendParamsToFrameString(String frameString, Object[] para
if (param.length() <= MAX_PARAM_STR_LEN) ret.append(param);
else ret.append(param, 0, MAX_PARAM_STR_LEN).append("...");
}
return ret.append("]").toString();
return ret.append("]").toString().replace("\n", "\\n");
} catch (Exception e) {
return frameString + "[failed getting params: " + e + "]";
}
}

private static String paramValToString(Object paramVal) {
if (paramVal != null && paramVal.getClass().isArray()) {
if (paramVal == null) {
return "null";
}

if (paramVal.getClass().isArray()) {
if (paramVal instanceof boolean[]) return Arrays.toString((boolean[]) paramVal);
else if (paramVal instanceof byte[]) return Arrays.toString((byte[]) paramVal);
else if (paramVal instanceof char[]) return Arrays.toString((char[]) paramVal);
Expand All @@ -78,6 +92,25 @@ private static String paramValToString(Object paramVal) {
else if (paramVal instanceof double[]) return Arrays.toString((double[]) paramVal);
else return Arrays.toString((Object[]) paramVal);
}

// Collapse package names to first letters when using default toString for objects
try {
Method toStringMethod = paramVal.getClass().getMethod("toString");
if (DEFAULT_TO_STRING.equals(toStringMethod)) {
String tmp = paramVal.toString();
String[] split = tmp.split("\\.");
StringBuilder out = new StringBuilder();
for(int i=0; i<split.length - 1; i++) {
String s = split[i];
out.append(s.charAt(0)).append(".");
}
out.append(split[split.length-1]);
return out.toString();
}
} catch(Exception e) {
//all objects have toString methods, so can't happen
throw new RuntimeException("Can't happen", e);
}
return String.valueOf(paramVal);
}
}