Added expanding member pointer variables (TODO: make pointer member symbol customizable)

This commit is contained in:
WebFreak001 2016-03-05 00:36:16 +01:00
commit b81a7bc1c2
2 changed files with 56 additions and 34 deletions

View file

@ -1,28 +1,9 @@
/*
{
quit = false,
_views = {
{
view = 0x7ffff7ece1e8,
renderer = 0x7ffff7eccc50,
world = 0x7ffff7ece480
}
},
deltaTimer = {
_flagStarted = false,
_timeStart = {length = 0},
_timeMeasured = {length = 0}
},
_start = {callbacks = 0x0},
_stop = {callbacks = 0x0}
}
*/
const resultRegex = /^([a-zA-Z_\-][a-zA-Z0-9_\-]*)\s*=\s*/; const resultRegex = /^([a-zA-Z_\-][a-zA-Z0-9_\-]*)\s*=\s*/;
const variableRegex = /^[a-zA-Z_\-][a-zA-Z0-9_\-]*/; const variableRegex = /^[a-zA-Z_\-][a-zA-Z0-9_\-]*/;
const errorRegex = /^\<.+?\>/; const errorRegex = /^\<.+?\>/;
const referenceRegex = /^0x[0-9a-fA-F]+/; const referenceRegex = /^0x[0-9a-fA-F]+/;
const numberRegex = /^[0-9]+/; const numberRegex = /^[0-9]+/;
const pointerCombineChar = ".";
export function isExpandable(value: string): number { export function isExpandable(value: string): number {
let primitive: any; let primitive: any;
@ -40,7 +21,7 @@ export function isExpandable(value: string): number {
else return 0; else return 0;
} }
export function expandValue(variableCreate: Function, value: string): any { export function expandValue(variableCreate: Function, value: string, root: string = ""): any {
let parseCString = () => { let parseCString = () => {
value = value.trim(); value = value.trim();
if (value[0] != '"') if (value[0] != '"')
@ -65,7 +46,35 @@ export function expandValue(variableCreate: Function, value: string): any {
return str; return str;
}; };
let stack = [root];
let parseValue, parseCommaResult, parseCommaValue, parseResult, createValue; let parseValue, parseCommaResult, parseCommaValue, parseResult, createValue;
let variable = "";
let getNamespace = (variable) => {
let namespace = "";
let prefix = "";
stack.push(variable);
stack.forEach(name => {
prefix = "";
if (name != "") {
if (name.startsWith("["))
namespace = namespace + name;
else {
if (namespace) {
while (name.startsWith("*")) {
prefix += "*";
name = name.substr(1);
}
namespace = namespace + pointerCombineChar + name;
}
else
namespace = name;
}
}
});
stack.pop();
return prefix + namespace;
};
let parseTupleOrList = () => { let parseTupleOrList = () => {
value = value.trim(); value = value.trim();
@ -83,21 +92,30 @@ export function expandValue(variableCreate: Function, value: string): any {
newValPos = newValPos2; newValPos = newValPos2;
if (newValPos != -1 && eqPos > newValPos || eqPos == -1) { // is value list if (newValPos != -1 && eqPos > newValPos || eqPos == -1) { // is value list
let values = []; let values = [];
stack.push("[0]");
let val = parseValue(); let val = parseValue();
stack.pop();
values.push(createValue("[0]", val)); values.push(createValue("[0]", val));
let remaining = value; let remaining = value;
let i = 0; let i = 0;
while (val = parseCommaValue()) while (true) {
values.push(createValue("[" + (++i) + "]", val)); stack.push("[" + (++i) + "]");
if (!(val = parseCommaValue())) {
stack.pop();
break;
}
stack.pop();
values.push(createValue("[" + i + "]", val));
}
value = value.substr(1).trim(); // } value = value.substr(1).trim(); // }
return values; return values;
} }
let result = parseResult(); let result = parseResult(true);
if (result) { if (result) {
let results = []; let results = [];
results.push(result); results.push(result);
while (result = parseCommaResult()) while (result = parseCommaResult(true))
results.push(result); results.push(result);
value = value.substr(1).trim(); // } value = value.substr(1).trim(); // }
return results; return results;
@ -156,15 +174,19 @@ export function expandValue(variableCreate: Function, value: string): any {
return parsePrimitive(); return parsePrimitive();
}; };
parseResult = () => { parseResult = (pushToStack: boolean = false) => {
value = value.trim(); value = value.trim();
let variableMatch = resultRegex.exec(value); let variableMatch = resultRegex.exec(value);
if (!variableMatch) if (!variableMatch)
return undefined; return undefined;
value = value.substr(variableMatch[0].length).trim(); value = value.substr(variableMatch[0].length).trim();
let variable = variableMatch[1]; let name = variable = variableMatch[1];
if (pushToStack)
stack.push(variable);
let val = parseValue(); let val = parseValue();
return createValue(variable, val); if (pushToStack)
stack.pop();
return createValue(name, val);
}; };
createValue = (name, val) => { createValue = (name, val) => {
@ -174,7 +196,7 @@ export function expandValue(variableCreate: Function, value: string): any {
val = "Object"; val = "Object";
} }
if (typeof val == "string" && val.startsWith("*0x")) { if (typeof val == "string" && val.startsWith("*0x")) {
ref = variableCreate("*" + name); ref = variableCreate(getNamespace("*" + name));
val = "Object@" + val; val = "Object@" + val;
} }
return { return {
@ -192,12 +214,12 @@ export function expandValue(variableCreate: Function, value: string): any {
return parseValue(); return parseValue();
}; };
parseCommaResult = () => { parseCommaResult = (pushToStack: boolean = false) => {
value = value.trim(); value = value.trim();
if (value[0] != ',') if (value[0] != ',')
return undefined; return undefined;
value = value.substr(1).trim(); value = value.substr(1).trim();
return parseResult(); return parseResult(pushToStack);
}; };

View file

@ -121,17 +121,17 @@ suite("GDB Value Expansion", () => {
{ {
name: "view", name: "view",
value: "Object@*0x7ffff7ece1e8", value: "Object@*0x7ffff7ece1e8",
variablesReference: { expanded: "*view" } variablesReference: { expanded: "*_views[0].view" }
}, },
{ {
name: "renderer", name: "renderer",
value: "Object@*0x7ffff7eccc50", value: "Object@*0x7ffff7eccc50",
variablesReference: { expanded: "*renderer" } variablesReference: { expanded: "*_views[0].renderer" }
}, },
{ {
name: "world", name: "world",
value: "Object@*0x7ffff7ece480", value: "Object@*0x7ffff7ece480",
variablesReference: { expanded: "*world" } variablesReference: { expanded: "*_views[0].world" }
} }
] ]
} }