diff -r 12c2ea2194c7 -r f2f4a1259de8 org.chromium.debug.core/src/org/chromium/debug/core/model/StackFrame.java --- a/org.chromium.debug.core/src/org/chromium/debug/core/model/StackFrame.java Thu Mar 18 11:10:35 2010 -0700 +++ b/org.chromium.debug.core/src/org/chromium/debug/core/model/StackFrame.java Thu Mar 18 11:56:59 2010 -0700 @@ -9,6 +9,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Set; import org.chromium.debug.core.ChromiumDebugPlugin; import org.chromium.sdk.CallFrame; @@ -79,16 +80,22 @@ static IVariable[] wrapVariables( DebugTargetImpl debugTarget, Collection jsVars, + Set propertyNameBlackList, Collection jsInternalProperties) { List vars = new ArrayList(jsVars.size()); for (JsVariable jsVar : jsVars) { + if (propertyNameBlackList.contains(jsVar.getName())) { + continue; + } vars.add(new Variable(debugTarget, jsVar, false)); } // Sort all regular properties by name. Collections.sort(vars, VARIABLE_COMPARATOR); // Always put internal properties in the end. - for (JsVariable jsMetaVar : jsInternalProperties) { - vars.add(new Variable(debugTarget, jsMetaVar, true)); + if (jsInternalProperties != null) { + for (JsVariable jsMetaVar : jsInternalProperties) { + vars.add(new Variable(debugTarget, jsMetaVar, true)); + } } return vars.toArray(new IVariable[vars.size()]); } @@ -194,7 +201,6 @@ } public int getLineNumber() throws DebugException { - // convert 0-based to 1-based return getDebugTarget().getLineNumber(stackFrame); } @@ -307,8 +313,40 @@ private final static Comparator VARIABLE_COMPARATOR = new Comparator() { public int compare(Variable var1, Variable var2) { - return var1.getName().compareTo(var2.getName()); + return compareNameObjects(getNameObject(var1), getNameObject(var2)); + } + // Get property name as String or Integer. + private Object getNameObject(Variable var) { + String name = var.getName(); + int len = name.length(); + if (len >= 3 && name.charAt(0) == '[' && name.charAt(len-1) == ']') { + Integer i = Integer.valueOf(name.substring(1, len - 1)); + return i; + } + return name; } + // Compare property name (either string or integer). + private int compareNameObjects(Object nameObj1, Object nameObj2) { + if (nameObj1 instanceof Integer) { + Integer i1 = (Integer) nameObj1; + if (nameObj2 instanceof Integer) { + Integer i2 = (Integer) nameObj2; + return i1.compareTo(i2); + } else { + return COMPARE_INT_WITH_STRING; + } + } else { + String s1 = (String) nameObj1; + if (nameObj2 instanceof String) { + String s2 = (String) nameObj2; + return s1.compareTo(s2); + } else { + return -COMPARE_INT_WITH_STRING; + } + } + } + // Strings go before numbers. + private static final int COMPARE_INT_WITH_STRING = 1; }; @Override