diff --git a/debugger/assets/styles/app.css b/debugger/assets/styles/app.css
index f3b80a4df..fd7b6a8de 100644
--- a/debugger/assets/styles/app.css
+++ b/debugger/assets/styles/app.css
@@ -231,6 +231,28 @@ body {
bottom: 0;
height: 100%;
}
+.debugger-fnview-gutter-icon {
+ width: 30px;
+}
+.debugger-fnview-gutter-icon-el {
+}
+.debugger-fnview-gutter-addr {
+ width: 70px;
+}
+.debugger-fnview-gutter-addr-el {
+}
+.debugger-fnview-gutter-addr-el-inactive {
+ color: #999;
+}
+.debugger-fnview-gutter-code {
+ width: 76px;
+ background-color: #fff;
+ border-left: 1px solid #ddd;
+}
+.debugger-fnview-gutter-code-el {
+ padding-left: 6px;
+ color: #aaa;
+}
.debugger-fnview-graphview {
order: 2;
flex: 0 0 auto;
diff --git a/debugger/assets/ui/code/function-view.js b/debugger/assets/ui/code/function-view.js
index 865cc1cc6..b929a698e 100644
--- a/debugger/assets/ui/code/function-view.js
+++ b/debugger/assets/ui/code/function-view.js
@@ -42,22 +42,116 @@ module.controller('FunctionViewController', function(
theme: 'default',
indentUnit: 2,
tabSize: 2,
- lineNumbers: true,
- firstLineNumber: 0,
- lineNumberFormatter: function(line) {
- return String(line);
- },
- gutters: [],
+ lineNumbers: false,
+ gutters: [
+ 'debugger-fnview-gutter-icon',
+ 'debugger-fnview-gutter-addr',
+ 'debugger-fnview-gutter-code'
+ ],
readOnly: true
});
- function updateCode() {
- var codeType = $scope.codeType;
- var value = '';
- if ($scope.fn) {
- value = $scope.fn.disasm[codeType];
+ function hex32(number) {
+ var str = "" + number.toString(16).toUpperCase();
+ while (str.length < 8) str = "0" + str;
+ return str;
+ };
+
+ function updateSourceCode(fn) {
+ var cm = $scope.codeMirror;
+ if (!fn) {
+ $scope.sourceLines = [];
+ cm.setValue('');
+ return;
+ }
+
+ var doc = cm.getDoc();
+
+ var lines = fn.disasm.source.lines;
+ $scope.sourceLines = lines;
+
+ var textContent = [];
+ for (var n = 0; n < lines.length; n++) {
+ var line = lines[n];
+ textContent.push(line[3]);
+ }
+ cm.setValue(textContent.join('\n'));
+
+ for (var n = 0; n < lines.length; n++) {
+ var line = lines[n];
+
+ var el = document.createElement('div');
+ el.classList.add('debugger-fnview-gutter-addr-el');
+ el.innerText = hex32(line[1]);
+ cm.setGutterMarker(n, 'debugger-fnview-gutter-addr', el);
+ if (line[0] != 'i') {
+ el.classList.add('debugger-fnview-gutter-addr-el-inactive');
+ }
+
+ if (line[0] == 'i') {
+ el = document.createElement('div');
+ el.classList.add('debugger-fnview-gutter-code-el');
+ el.innerText = hex32(line[2]);
+ cm.setGutterMarker(n, 'debugger-fnview-gutter-code', el);
+ }
+ }
+ };
+ function updateCode() {
+ var cm = $scope.codeMirror;
+ var fn = $scope.fn || null;
+ var codeType = $scope.codeType;
+
+ var gutters;
+ switch (codeType) {
+ case 'source':
+ gutters = [
+ 'debugger-fnview-gutter-icon',
+ 'debugger-fnview-gutter-addr',
+ 'debugger-fnview-gutter-code'
+ ];
+ break;
+ default:
+ gutters = [
+ 'debugger-fnview-gutter-icon',
+ 'debugger-fnview-gutter-addr'
+ ];
+ break;
+ }
+ cm.setOption('gutters', gutters);
+
+ cm.clearGutter('debugger-fnview-gutter-icon');
+ cm.clearGutter('debugger-fnview-gutter-addr');
+ cm.clearGutter('debugger-fnview-gutter-code');
+
+ // Set last to make all option changes stick.
+ switch (codeType) {
+ case 'source':
+ updateSourceCode(fn);
+ break;
+ default:
+ var value = fn ? fn.disasm[codeType] : null;
+ cm.setValue(value || '');
+ break;
}
- $scope.codeMirror.setValue(value || '');
};
$scope.$watch('codeType', updateCode);
+
+ $scope.codeMirror.on('gutterClick', function(
+ instance, line, gutterClass, e) {
+ if (e.which == 1) {
+ if (gutterClass == 'debugger-fnview-gutter-icon') {
+ console.log('click', e);
+ }
+ }
+ });
+// $scope.codeMirror.on('gutterContextMenu', function(
+// instance, line, gutterClass, e) {
+// console.log('context menu');
+// e.preventDefault();
+// });
+// $scope.codeMirror.on('contextmenu', function(
+// instance, e) {
+// console.log('context menu main');
+// e.preventDefault();
+// });
});
diff --git a/debugger/assets/ui/navbar.html b/debugger/assets/ui/navbar.html
index c73759112..c2a64c9ec 100644
--- a/debugger/assets/ui/navbar.html
+++ b/debugger/assets/ui/navbar.html
@@ -3,11 +3,11 @@
Xenia
diff --git a/debugger/src/app.js b/debugger/src/app.js
index a29e80f5a..ea729108d 100644
--- a/debugger/src/app.js
+++ b/debugger/src/app.js
@@ -105,7 +105,10 @@ module.service('app', function(
});
-module.run(function($rootScope, app, log) {
+module.run(function($rootScope, $state, $stateParams, app, log) {
+ $rootScope.$state = $state;
+ $rootScope.$stateParams = $stateParams;
+
$rootScope.app = app;
$rootScope.log = log;
});
diff --git a/src/alloy/frontend/ppc/ppc_scanner.cc b/src/alloy/frontend/ppc/ppc_scanner.cc
index 22be03733..cab6894e9 100644
--- a/src/alloy/frontend/ppc/ppc_scanner.cc
+++ b/src/alloy/frontend/ppc/ppc_scanner.cc
@@ -9,6 +9,8 @@
#include
+#include