mirror of
https://github.com/adelphes/android-dev-ext.git
synced 2025-12-23 01:48:18 +00:00
Stop the Android runtime from barfing into logcat
Split field retrieval into statics and instances
This commit is contained in:
@@ -794,14 +794,38 @@ Debugger.prototype = {
|
|||||||
})
|
})
|
||||||
.then(function (typeinfo, x) {
|
.then(function (typeinfo, x) {
|
||||||
x.typeinfo = typeinfo;
|
x.typeinfo = typeinfo;
|
||||||
|
// the Android runtime now pointlessly barfs into logcat if an instance value is used
|
||||||
|
// to retrieve a static field. So, we now split into two calls...
|
||||||
|
x.splitfields = typeinfo.fields.reduce((z,f) => {
|
||||||
|
if (f.modbits & 8) z.static.push(f); else z.instance.push(f);
|
||||||
|
return z;
|
||||||
|
}, {instance:[],static:[]});
|
||||||
|
// if there are no instance fields, just resolve with an empty array
|
||||||
|
if (!x.splitfields.instance.length)
|
||||||
|
return $.Deferred().resolveWith(this,[[], x]);
|
||||||
return this.session.adbclient.jdwp_command({
|
return this.session.adbclient.jdwp_command({
|
||||||
ths: this,
|
ths: this,
|
||||||
extra: x,
|
extra: x,
|
||||||
cmd: this.JDWP.Commands.GetFieldValues(x.objvar.value, typeinfo.fields),
|
cmd: this.JDWP.Commands.GetFieldValues(x.objvar.value, x.splitfields.instance),
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
.then(function (fieldvalues, x) {
|
.then(function (instance_fieldvalues, x) {
|
||||||
return this._mapvalues('field', x.typeinfo.fields, fieldvalues, { objvar: x.objvar }, x);
|
x.instance_fieldvalues = instance_fieldvalues;
|
||||||
|
// and now the statics (with a type reference)
|
||||||
|
if (!x.splitfields.static.length)
|
||||||
|
return $.Deferred().resolveWith(this,[[], x]);
|
||||||
|
return this.session.adbclient.jdwp_command({
|
||||||
|
ths: this,
|
||||||
|
extra: x,
|
||||||
|
cmd: this.JDWP.Commands.GetStaticFieldValues(x.splitfields.static[0].typeid, x.splitfields.static),
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.then(function (static_fieldvalues, x) {
|
||||||
|
x.static_fieldvalues = static_fieldvalues;
|
||||||
|
// make sure the fields and values match up...
|
||||||
|
var fields = x.splitfields.instance.concat(x.splitfields.static);
|
||||||
|
var values = x.instance_fieldvalues.concat(x.static_fieldvalues);
|
||||||
|
return this._mapvalues('field', fields, values, { objvar: x.objvar }, x);
|
||||||
})
|
})
|
||||||
.then(function (res, x) {
|
.then(function (res, x) {
|
||||||
for (var i = 0; i < res.length; i++) {
|
for (var i = 0; i < res.length; i++) {
|
||||||
|
|||||||
26
src/jdwp.js
26
src/jdwp.js
@@ -627,6 +627,28 @@ function _JDWP() {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
GetStaticFieldValues:function(typeid, fields) {
|
||||||
|
return new Command('GetStaticFieldValues:'+typeid, 2, 6,
|
||||||
|
function() {
|
||||||
|
var res=[];
|
||||||
|
DataCoder.encodeRef(res, typeid);
|
||||||
|
DataCoder.encodeInt(res, fields.length);
|
||||||
|
for (var i in fields) {
|
||||||
|
DataCoder.encodeRef(res, fields[i].fieldid);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
},
|
||||||
|
function(o) {
|
||||||
|
var res = [];
|
||||||
|
var arrlen = DataCoder.decodeInt(o);
|
||||||
|
while (--arrlen>=0) {
|
||||||
|
var v = DataCoder.decodeValue(o);
|
||||||
|
res.push(v);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
},
|
||||||
sourcefile:function(ci) {
|
sourcefile:function(ci) {
|
||||||
return new Command('SourceFile:'+ci.name, 2, 7,
|
return new Command('SourceFile:'+ci.name, 2, 7,
|
||||||
function() {
|
function() {
|
||||||
@@ -650,7 +672,9 @@ function _JDWP() {
|
|||||||
var arrlen = DataCoder.decodeInt(o);
|
var arrlen = DataCoder.decodeInt(o);
|
||||||
var res = [];
|
var res = [];
|
||||||
while (--arrlen>=0) {
|
while (--arrlen>=0) {
|
||||||
res.push(DataCoder.decodeList(o, [{fieldid:'fref'},{name:'string'},{type:'signature'},{genericsig:'string'},{modbits:'int'}]));
|
var field = DataCoder.decodeList(o, [{fieldid:'fref'},{name:'string'},{type:'signature'},{genericsig:'string'},{modbits:'int'}]);
|
||||||
|
field.typeid = ci.info.typeid;
|
||||||
|
res.push(field);
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user