Improve expression parsing

Allow ':super' to be used as a member.
Search super types when locating field members.
Fixes #16
This commit is contained in:
adelphes
2017-01-28 15:54:26 +00:00
parent 6463558034
commit 6f3f5eee74
2 changed files with 59 additions and 20 deletions

View File

@@ -721,6 +721,15 @@ Debugger.prototype = {
});
},
getsuperinstance: function (local, extra) {
return this.getsupertype(local, {local,extra})
.then(function (supertypeinfo, x) {
var castobj = Object.assign({}, x.local);
castobj.type = supertypeinfo;
return $.Deferred().resolveWith(this, [castobj, x.extra]);
});
},
createstring: function (string, extra) {
return this.ensureconnected({ string: string, extra: extra })
.then(function (x) {
@@ -838,6 +847,25 @@ Debugger.prototype = {
});
},
getFieldValue: function(objvar, fieldname, includeInherited, extra) {
const findfield = x => {
return this.getfieldvalues(x.objvar, x)
.then((fields, x) => {
var field = fields.find(f => f.name === x.fieldname);
if (field) return $.Deferred().resolveWith(this,[field,x.extra]);
if (!x.includeInherited || x.objvar.type.signature==='Ljava/lang/Object;')
return $.Deferred().rejectWith(this,[new Error('No such field: '+x.fieldname), x.extra]);
// search supertype
return this.getsuperinstance(x.objvar, x)
.then((superobjvar,x) => {
x.objvar = superobjvar;
return x.findfield(x);
});
});
}
return findfield({findfield, objvar, fieldname, includeInherited, extra});
},
getExceptionLocal: function (ex_ref_value, extra) {
var x = {
ex_ref_value: ex_ref_value,