mirror of https://github.com/geohot/qira
all working without mongo
This commit is contained in:
parent
86dc3e66c1
commit
33baacd806
|
@ -24,8 +24,8 @@ maxclnum = 1
|
|||
|
||||
# python db has two indexes
|
||||
# types are I, r, m
|
||||
# (addr, type) -> [clnums]
|
||||
# (clnum, type) -> [changes]
|
||||
# pydb_addr: (addr, type) -> [clnums]
|
||||
# pydb_clnum: (clnum, type) -> [changes]
|
||||
pydb_addr = defaultdict(list)
|
||||
pydb_clnum = defaultdict(list)
|
||||
|
||||
|
@ -101,10 +101,25 @@ def connect():
|
|||
emit('maxclnum', maxclnum)
|
||||
emit('pmaps', pmaps)
|
||||
|
||||
@socketio.on('getclnum', namespace='/qira')
|
||||
def getclnum(m):
|
||||
print "getclnum",m
|
||||
if m == None or 'clnum' not in m or 'types' not in m or 'limit' not in m:
|
||||
return
|
||||
ret = []
|
||||
for t in m['types']:
|
||||
key = (m['clnum'], t)
|
||||
for c in pydb_clnum[key]:
|
||||
ret.append(c)
|
||||
if len(ret) >= m['limit']:
|
||||
break
|
||||
if len(ret) >= m['limit']:
|
||||
break
|
||||
emit('clnum', ret)
|
||||
|
||||
@socketio.on('getchanges', namespace='/qira')
|
||||
def getchanges(m):
|
||||
print "getchanges",m
|
||||
#print "getchanges",m
|
||||
if m == None or 'address' not in m or 'type' not in m or m['address'] == None or m['type'] == None:
|
||||
return
|
||||
key = (m['address'], m['type'])
|
||||
|
@ -145,7 +160,12 @@ def getregisters(clnum):
|
|||
ret = []
|
||||
for i in range(0, len(REGS)):
|
||||
if i*4 in regs.daddr:
|
||||
ret.append({"name": REGS[i], "address": i*4, "value": regs.daddr[i*4].fetch(clnum)})
|
||||
rret = {"name": REGS[i], "address": i*4, "value": regs.daddr[i*4].fetch(clnum), "regactions": ""}
|
||||
if clnum in pydb_addr[(i*4, 'R')]:
|
||||
rret['regactions'] += " regread"
|
||||
if clnum in pydb_addr[(i*4, 'W')]:
|
||||
rret['regactions'] += " regwrite"
|
||||
ret.append(rret)
|
||||
emit('registers', ret)
|
||||
|
||||
def run_socketio():
|
||||
|
|
|
@ -32,3 +32,14 @@ function zoom_out_max(dontforce) {
|
|||
else Session.set("cview", [0, max]);
|
||||
}
|
||||
|
||||
var baseevents = {
|
||||
'click .datamemory': function(e) {
|
||||
var daddr = parseInt(e.target.innerHTML, 16);
|
||||
update_dview(daddr);
|
||||
},
|
||||
'click .datainstruction': function(e) {
|
||||
var iaddr = parseInt(e.target.innerHTML, 16);
|
||||
Session.set('iaddr', iaddr);
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -88,16 +88,6 @@ stream.on('memory', function(msg) {
|
|||
$("#hexdump")[0].innerHTML = html;
|
||||
});
|
||||
|
||||
var baseevents = {
|
||||
'click .datamemory': function(e) {
|
||||
var daddr = parseInt(e.target.innerHTML, 16);
|
||||
update_dview(daddr);
|
||||
},
|
||||
'click .datainstruction': function(e) {
|
||||
var iaddr = parseInt(e.target.innerHTML, 16);
|
||||
Session.set('iaddr', iaddr);
|
||||
},
|
||||
};
|
||||
|
||||
Template.memviewer.events({
|
||||
'dblclick .datamemory': function(e) {
|
||||
|
@ -114,21 +104,8 @@ Template.memviewer.events({
|
|||
},
|
||||
});
|
||||
|
||||
Template.datachanges.events(baseevents);
|
||||
Template.regviewer.events(baseevents);
|
||||
|
||||
|
||||
Template.regviewer.regactions = function() {
|
||||
var ret = "";
|
||||
var cur = Change.find({address: this.address,
|
||||
$or: [{type: "R"}, {type: "W"}]});
|
||||
cur.forEach(function(post) {
|
||||
if (post.type == "R") ret += " regread";
|
||||
if (post.type == "W") ret += " regwrite";
|
||||
});
|
||||
return ret;
|
||||
};
|
||||
|
||||
Template.regviewer.hexvalue = function() {
|
||||
return hex(this.value);
|
||||
};
|
||||
|
@ -137,12 +114,49 @@ Template.regviewer.datatype = function() {
|
|||
return get_data_type(this.value);
|
||||
};
|
||||
|
||||
Template.datachanges.memactions = function() {
|
||||
// keep these updated
|
||||
Deps.autorun(function() {
|
||||
var daddr = Session.get('daddr');
|
||||
var dview = Session.get('dview');
|
||||
var clnum = Session.get('clnum');
|
||||
stream.emit('getmemory', {"clnum":clnum-1, "address":dview, "len":0x100});
|
||||
});
|
||||
|
||||
Deps.autorun(function() {
|
||||
stream.emit('getregisters', Session.get('clnum')-1);
|
||||
});
|
||||
|
||||
stream.on('registers', function(msg) {
|
||||
$('#regviewer')[0].innerHTML = "";
|
||||
UI.insert(UI.renderWithData(Template.regviewer, {regs: msg}), $('#regviewer')[0]);
|
||||
});
|
||||
|
||||
// hacks to keep iaddr in sync with clnum
|
||||
|
||||
// move to vtimeline?
|
||||
/*Deps.autorun(function(){ Meteor.subscribe('dat_iaddr', Session.get("iaddr"), {onReady: function() {
|
||||
var closest = undefined;
|
||||
var diff = 0;
|
||||
var clnum = Session.get("clnum");
|
||||
var cur = Change.find({clnum: clnum,
|
||||
$or: [{type: "L"}, {type: "S"}]}, {limit: 3});
|
||||
return cur;
|
||||
};
|
||||
Change.find({"address": Session.get("iaddr"), "type": "I"}).forEach(function(x) {
|
||||
var ldiff = Math.abs(x.clnum - clnum);
|
||||
if (closest == undefined || diff > ldiff) {
|
||||
closest = x.clnum;
|
||||
diff = ldiff;
|
||||
return;
|
||||
}
|
||||
});
|
||||
//p("nearest change is "+closest);
|
||||
if (closest !== undefined && closest !== clnum) {
|
||||
Session.set("clnum", closest);
|
||||
}
|
||||
}}); });*/
|
||||
|
||||
Deps.autorun(function(){ Meteor.subscribe('dat_daddr', Session.get("daddr")); });
|
||||
|
||||
// *** datachanges ***
|
||||
|
||||
Template.datachanges.events(baseevents);
|
||||
|
||||
Template.datachanges.hexaddress = function() {
|
||||
return hex(this.address);
|
||||
|
@ -165,44 +179,14 @@ Template.datachanges.datatype = function() {
|
|||
return get_data_type(this.data);
|
||||
};
|
||||
|
||||
// keep these updated
|
||||
Deps.autorun(function() {
|
||||
var daddr = Session.get('daddr');
|
||||
var dview = Session.get('dview');
|
||||
var clnum = Session.get('clnum');
|
||||
stream.emit('getmemory', {"clnum":clnum-1, "address":dview, "len":0x100});
|
||||
stream.emit('getclnum', {'clnum': Session.get('clnum'), 'types': ['L', 'S'], 'limit': 3});
|
||||
});
|
||||
|
||||
Deps.autorun(function() {
|
||||
stream.emit('getregisters', Session.get('clnum')-1);
|
||||
stream.on('clnum', function(msg) {
|
||||
$('#datachanges')[0].innerHTML = "";
|
||||
UI.insert(UI.renderWithData(Template.datachanges, {memactions: msg}), $('#datachanges')[0]);
|
||||
});
|
||||
|
||||
stream.on('registers', function(msg) {
|
||||
$('#regviewer')[0].innerHTML = "";
|
||||
UI.insert(UI.renderWithData(Template.regviewer, {regs: msg}), $('#regviewer')[0]);
|
||||
});
|
||||
|
||||
// hacks to keep iaddr in sync with clnum
|
||||
|
||||
// moved to vtimeline
|
||||
/*Deps.autorun(function(){ Meteor.subscribe('dat_iaddr', Session.get("iaddr"), {onReady: function() {
|
||||
var closest = undefined;
|
||||
var diff = 0;
|
||||
var clnum = Session.get("clnum");
|
||||
Change.find({"address": Session.get("iaddr"), "type": "I"}).forEach(function(x) {
|
||||
var ldiff = Math.abs(x.clnum - clnum);
|
||||
if (closest == undefined || diff > ldiff) {
|
||||
closest = x.clnum;
|
||||
diff = ldiff;
|
||||
return;
|
||||
}
|
||||
});
|
||||
//p("nearest change is "+closest);
|
||||
if (closest !== undefined && closest !== clnum) {
|
||||
Session.set("clnum", closest);
|
||||
}
|
||||
}}); });*/
|
||||
|
||||
Deps.autorun(function(){ Meteor.subscribe('dat_daddr', Session.get("daddr")); });
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue