Skip to content

Commit 7bd6341

Browse files
author
Dorothy Chen
committed
collapse/expand members of types
1 parent 44431b3 commit 7bd6341

File tree

8 files changed

+152
-61
lines changed

8 files changed

+152
-61
lines changed

app/app.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,5 @@ def get_types():
415415
executable = executables[filename]
416416
return jsonify(executable.get_type_info(addr))
417417

418-
# debug=True auto reloads whenever server code changes
419418
if __name__ == '__main__':
420419
app.run(debug=True, port=8000)

app/die_information.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,6 @@ def __init__(self, die):
148148
subtype = "(cannot find the type)"
149149

150150
members = getMembers(die)
151-
152151
vtable = getVtable(die)
153152

154153
dict.__init__(self,
@@ -240,7 +239,6 @@ def getVtable(typeDie):
240239
elem_location = child.attributes.get('DW_AT_vtable_elem_location')
241240
if elem_location.form == 'DW_FORM_exprloc':
242241
loc_pieces = describe_DWARF_expr(elem_location.value, child.cu.structs)
243-
print loc_pieces, child.attributes["DW_AT_name"].value
244242
index = loc_pieces[0]
245243
if child.attributes.get('DW_AT_linkage_name'):
246244
name = child.attributes.get('DW_AT_linkage_name').value
@@ -253,4 +251,4 @@ def getVtable(typeDie):
253251
print 'Cannot currently handle form DW_FORM_loclistptr'
254252
else:
255253
print 'Unexpected form {} for vtable_elem_location'.format(elem_location.form)
256-
return vtable
254+
return vtable

app/executable.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,7 @@ def get_type_info(self, addr):
578578
if dieInfo:
579579
type_dies[dieInfo['name']] = dieInfo
580580
self.type_dies[CU.cu_offset] = type_dies
581-
return type_dies
581+
return type_dies
582582

583583
def printChildren(die):
584584
for child in die.iter_children():

app/static/js/disassemble.js

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ var type_ctrl = {
5757
selectedTypeClicked: selectedTypeClicked,
5858
showTypeSearchResults: true,
5959
queryString: "",
60+
expandMember: expandMember,
61+
collapseMember: collapseMember,
6062
};
6163

6264
rivets.formatters.displayData = function(data) {
@@ -463,16 +465,33 @@ function get_function_assembly() {
463465
addr: parseInt(assembly.contents[0]['address'], 16)
464466
})
465467
.done(function(data) {
466-
console.log("Done loading type data.");
467468
typeData = data;
468469
})
469470
.fail(function() {
470471
console.log("Unable to load type data.");
471472
typeData = [];
472473
})
473474
.always(function() {
475+
// add member expandable, mark top-level as default expanded
476+
Object.keys(typeData).forEach(function(typeName) {
477+
var members = typeData[typeName]["members"];
478+
members = members.map(function(member, i) {
479+
if (member.depth == 0) {
480+
member["expanded"] = true;
481+
}
482+
if (i == members.length - 1) {
483+
member["expandable"] = false;
484+
}
485+
else {
486+
var memberHasChildren = members[i+1]["depth"] > member["depth"];
487+
member["expandable"] = memberHasChildren;
488+
}
489+
return member;
490+
});
491+
});
492+
474493
type_ctrl.typeData = typeData;
475-
494+
476495
// For some FASCINATING, unknown reason, despite defaulting to true, the related data will
477496
// appear as though showTypeSearchResults were false. This can be fixed by setting it to false
478497
// then back to true.
@@ -521,9 +540,6 @@ function wrapNumbersInElem(elem) {
521540
else if (charOne >= '0' && charTwo <= '9') {
522541
elem.setAttribute('value', 'twosCompDec64');
523542
}
524-
else {
525-
console.log("Unknown data type:");
526-
console.log(elem) }
527543
}
528544

529545
// wrap registers for register tracking

app/static/js/disassembly_analysis.js

Lines changed: 67 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -311,12 +311,12 @@ rivets.formatters.formatIndentation = function(depth) {
311311

312312
function _selectedTypeClicked(typeName) {
313313
var typeData = type_ctrl.typeData[typeName];
314-
if (typeData) {
315-
type_ctrl.selected_type = typeData;
316-
type_ctrl.showTypeSearchResults = false;
317-
}
318-
else
319-
return;
314+
if (typeData) {
315+
type_ctrl.selected_type = typeData;
316+
type_ctrl.showTypeSearchResults = false;
317+
}
318+
else
319+
return;
320320
}
321321

322322
function memberTypeClicked(e, model) {
@@ -361,15 +361,8 @@ $('#type-name-input').on('keyup', function() {
361361
newRes.appendChild(innerSpan);
362362
$(newRes).click(function(event) {
363363
var typeName = event.delegateTarget.getAttribute('data-name');
364-
var typeData = type_ctrl.typeData[typeName];
365-
if (typeData) {
366-
type_ctrl.selected_type = typeData;
367-
type_ctrl.showTypeSearchResults = false;
368-
}
369-
else
370-
return;
364+
_selectedTypeClicked(typeName);
371365
});
372-
373366
dataTypesEl.appendChild(newRes);
374367
}
375368
}
@@ -387,9 +380,65 @@ rivets.formatters.getQueryResults = function(query) {
387380
}
388381
}
389382
return queryResults;
390-
391383
};
392384

393-
rivets.binders.querystring = function(el, queryString) {
394-
console.log(queryString);
395-
}
385+
386+
rivets.formatters.endOfLine = function(member) {
387+
return !member.expandable && !member.collapsable;
388+
}
389+
390+
function expandMember(event, model) {
391+
var members = type_ctrl.selected_type.members;
392+
var thisDepth = model.member.depth;
393+
var i = model.index + 1;
394+
while (members[i].depth > thisDepth) {
395+
if (members[i].depth == thisDepth + 1) {
396+
members[i].expanded = true;
397+
}
398+
i += 1;
399+
members[model.index].expandable = false;
400+
members[model.index].collapsable = true;
401+
}
402+
}
403+
404+
function collapseMember(event, model) {
405+
var members = type_ctrl.selected_type.members;
406+
var thisDepth = model.member.depth;
407+
var i = model.index + 1;
408+
while (members[i].depth > thisDepth) {
409+
members[i].expanded = false;
410+
if (members[i].collapsable) {
411+
members[i].expandable = true;
412+
members[i].collapsable = false;
413+
}
414+
i += 1;
415+
members[model.index].expandable = true;
416+
members[model.index].collapsable = false;
417+
}
418+
}
419+
420+
// handlers for collapsing/expanding all
421+
$(".collapse-all").on("click", function() {
422+
type_ctrl.selected_type.members.forEach(function(member) {
423+
if (member.collapsable) {
424+
member.collapsable = false;
425+
member.expandable = true;
426+
}
427+
member.expanded = member.depth == 0;
428+
});
429+
});
430+
431+
$(".expand-all").on("click", function() {
432+
type_ctrl.selected_type.members.forEach(function(member) {
433+
if (member.expandable) {
434+
member.collapsable = true;
435+
member.expandable = false;
436+
}
437+
member.expanded = true;
438+
});
439+
});
440+
441+
442+
443+
444+

app/static/scss/disassemble.scss

Lines changed: 41 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -561,18 +561,14 @@ $jump-color1: rgb(255,245,157);
561561
margin-bottom: 15px;
562562
}
563563

564+
.type-search {
565+
height: 100%;
566+
}
567+
564568
input#type-name-input {
565569
font-size: 1.2em !important;
566570
}
567571

568-
// input#type-name-input,
569-
// input#type-name-input:focus + .bottom-border {
570-
// width: 80% !important;
571-
// }
572-
// .bottom-border {
573-
// width: 0% !important;
574-
// }
575-
576572
.type {
577573
text-decoration: none;
578574
color: black;
@@ -610,30 +606,47 @@ $type-bg: rgb(178,223,219);
610606
}
611607

612608
#selected-type {
609+
height: calc(100% - 38px);
613610
overflow-y: scroll;
614-
}
615-
616-
.type-attr, .members {
617-
font-weight: bold;
618-
}
611+
612+
.type-attr, .members {
613+
font-weight: bold;
614+
font-family: "Open Sans";
615+
span {
616+
font-weight: normal;
617+
font-family: "Space Mono", monospace;
618+
}
619+
}
619620

620-
.type-attr {
621-
display: block;
622-
span {
623-
font-weight: normal;
624-
font-family: "Space Mono", monospace;
621+
.type-attr {
622+
display: block;
625623
}
626-
}
627624

628-
li.type-attr {
629-
margin-bottom: 3px;
630-
}
625+
.members {
626+
.collapse-all, .expand-all {
627+
font-family: "Open Sans";
628+
background-color: rgb(248,187,208);
629+
padding-left: 8px;
630+
padding-right: 8px;
631+
margin-right: 10px;
632+
633+
cursor: pointer;
634+
}
635+
.collapse-all:hover, .expand-all:hover {
636+
background-color: rgb(244,143,177);
637+
}
631638

632-
.type-member-attribute {
633-
display: block;
639+
.expand i, .collapse i {
640+
cursor: pointer;
641+
}
642+
643+
li.member {
644+
list-style-type: none;
645+
margin-bottom: 3px;
646+
.name {
647+
color: #6699ff;
648+
}
649+
}
650+
}
634651
}
635652

636-
.name {
637-
font-family: "Space Mono", monospace;
638-
color: #6699ff;
639-
}

app/templates/disassemble.jinja.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<link rel="stylesheet" href="static/css/colorbox.css">
1212
{% assets "disassemble_css" %} <link rel="stylesheet" href="{{ ASSET_URL }}"> {% endassets %}
1313
<link href="https://fonts.googleapis.com/css?family=Space+Mono" rel="stylesheet">
14-
<link href='https://fonts.googleapis.com/css?family=Open+Sans' rel='stylesheet' type='text/css'>
14+
<link href='https://fonts.googleapis.com/css?family=Open+Sans:400,700' rel='stylesheet' type='text/css'>
1515
<script src="https://use.fontawesome.com/d826d0fa82.js"></script>
1616
<title>Disasm | {{ func_name }}</title>
1717
</head>

app/templates/type_search.partial.html

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,31 @@
1616
</div>
1717
<div class="type-attr">Tag: <span rv-text="type_ctrl.selected_type.tag"></span></div>
1818
<div class="members">Members:
19+
<span class='change-all collapse-all'>collapse all</span>
20+
<span class='change-all expand-all'>expand all</span>
1921
<ul>
20-
<li class="type-attr"
21-
rv-each-member="type_ctrl.selected_type.members">
22+
<li class="member"
23+
rv-each-member="type_ctrl.selected_type.members"
24+
rv-show="member.expanded">
2225
<span class="indent" rv-text="member.depth | formatIndentation"></span>
26+
27+
<span class='expand' rv-show="member.expandable">
28+
<i class="fa fa-plus-square-o" aria-hidden="true"
29+
rv-on-click="type_ctrl.expandMember"></i>
30+
</span>
31+
<span class='collapse' rv-show="member.collapsable">
32+
<i class="fa fa-minus-square-o" aria-hidden="true"
33+
rv-on-click="type_ctrl.collapseMember"></i>
34+
</span>
35+
<span rv-show="member | endOfLine" style="opacity:0;">
36+
<i class="fa fa-square-o" aria-hidden="true"></i>
37+
</span>
38+
2339
<!-- Offset -->
2440
<span class="offset"
25-
rv-show="member.offset | displayData">&lt;+{member.offset}&gt;</span>
41+
rv-show="member.offset | displayData">&lt;{member.offset}&gt;</span>
2642
<span class="offset-unknown"
27-
rv-hide="member.offset | displayData">(offset unknown)</span>
43+
rv-hide="member.offset | displayData">&lt;?&gt;</span>
2844
<!-- Member name -->
2945
<span class="name"
3046
rv-show="member.name | displayData"

0 commit comments

Comments
 (0)