--- 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<? extends JsVariable> jsVars,
+ Set<? extends String> propertyNameBlackList,
Collection <? extends JsVariable> jsInternalProperties) {
List<Variable> vars = new ArrayList<Variable>(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> VARIABLE_COMPARATOR = new Comparator<Variable>() {
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