mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-11-26 10:49:17 +00:00
refactored worker into new CodeProject class
This commit is contained in:
parent
03bf70041d
commit
db11f31464
209
src/ui.js
209
src/ui.js
@ -64,6 +64,111 @@ var SourceFile = function(lines, text) {
|
|||||||
this.lineCount = function() { return this.line2offset.length; }
|
this.lineCount = function() { return this.line2offset.length; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var CodeProject = function(worker, platform_id, platform, store) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
self.callbackResendFiles = function() { }; // TODO?
|
||||||
|
self.callbackBuildResult = function(result) { };
|
||||||
|
self.callbackBuildStatus = function(busy) { };
|
||||||
|
|
||||||
|
var pendingWorkerMessages = 0;
|
||||||
|
|
||||||
|
var tools_preloaded = {};
|
||||||
|
function preloadWorker(path) {
|
||||||
|
var tool = platform.getToolForFilename(path);
|
||||||
|
if (tool && !tools_preloaded[tool]) {
|
||||||
|
worker.postMessage({preload:tool, platform:platform_id});
|
||||||
|
tools_preloaded[tool] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadFileDependencies(text, callback) {
|
||||||
|
var filenames = [];
|
||||||
|
if (platform_id == 'verilog') {
|
||||||
|
var re = /^(`include|[.]include)\s+"(.+?)"/gm;
|
||||||
|
var m;
|
||||||
|
while (m = re.exec(text)) {
|
||||||
|
filenames.push(m[2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var result = [];
|
||||||
|
function loadNextDependency() {
|
||||||
|
var fn = filenames.shift();
|
||||||
|
if (!fn) {
|
||||||
|
callback(result);
|
||||||
|
} else {
|
||||||
|
store.getItem(fn, function(err, value) {
|
||||||
|
result.push({
|
||||||
|
filename:fn,
|
||||||
|
prefix:platform_id,
|
||||||
|
text:value // might be null, that's ok
|
||||||
|
});
|
||||||
|
loadNextDependency();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
loadNextDependency(); // load first dependency
|
||||||
|
}
|
||||||
|
|
||||||
|
function okToSend() {
|
||||||
|
return pendingWorkerMessages++ == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateFileInStore(path, text) {
|
||||||
|
// protect against accidential whole-file deletion
|
||||||
|
if (text.trim().length) {
|
||||||
|
// TODO? (originalFileID != path || text != originalText)) {
|
||||||
|
store.setItem(path, text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.updateFile = function(path, text, isBinary) {
|
||||||
|
updateFileInStore(path, text); // TODO: isBinary
|
||||||
|
preloadWorker(path);
|
||||||
|
if (okToSend()) {
|
||||||
|
self.callbackBuildStatus(true);
|
||||||
|
loadFileDependencies(text, function(depends) {
|
||||||
|
worker.postMessage({
|
||||||
|
code:text,
|
||||||
|
dependencies:depends,
|
||||||
|
platform:platform_id,
|
||||||
|
tool:platform.getToolForFilename(path)
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function processBuildResult(data) {
|
||||||
|
if (data.listings) {
|
||||||
|
for (var lstname in data.listings) {
|
||||||
|
var lst = data.listings[lstname];
|
||||||
|
if (lst.lines)
|
||||||
|
lst.sourcefile = new SourceFile(lst.lines);
|
||||||
|
if (lst.asmlines)
|
||||||
|
lst.assemblyfile = new SourceFile(lst.asmlines, lst.text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
worker.onmessage = function(e) {
|
||||||
|
if (pendingWorkerMessages > 1) {
|
||||||
|
self.callbackResendFiles(); // TODO: we should handle this internally
|
||||||
|
pendingWorkerMessages = 0;
|
||||||
|
} else {
|
||||||
|
pendingWorkerMessages = 0;
|
||||||
|
}
|
||||||
|
self.callbackBuildStatus(false);
|
||||||
|
if (e.data && !e.data.unchanged) {
|
||||||
|
processBuildResult(e.data);
|
||||||
|
self.callbackBuildResult(e.data);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO: parse output, listings, files, etc
|
||||||
|
}
|
||||||
|
|
||||||
|
var current_project;
|
||||||
|
|
||||||
var TOOL_TO_SOURCE_STYLE = {
|
var TOOL_TO_SOURCE_STYLE = {
|
||||||
'dasm': '6502',
|
'dasm': '6502',
|
||||||
'acme': '6502',
|
'acme': '6502',
|
||||||
@ -76,7 +181,9 @@ var TOOL_TO_SOURCE_STYLE = {
|
|||||||
'jsasm': 'z80'
|
'jsasm': 'z80'
|
||||||
}
|
}
|
||||||
|
|
||||||
var worker = new Worker("./src/worker/workermain.js");
|
function newWorker() {
|
||||||
|
return new Worker("./src/worker/workermain.js");
|
||||||
|
}
|
||||||
|
|
||||||
var disasmview = CodeMirror(document.getElementById('disassembly'), {
|
var disasmview = CodeMirror(document.getElementById('disassembly'), {
|
||||||
mode: 'z80',
|
mode: 'z80',
|
||||||
@ -86,8 +193,6 @@ var disasmview = CodeMirror(document.getElementById('disassembly'), {
|
|||||||
styleActiveLine: true
|
styleActiveLine: true
|
||||||
});
|
});
|
||||||
|
|
||||||
var originalFileID;
|
|
||||||
var originalText;
|
|
||||||
var userPaused;
|
var userPaused;
|
||||||
|
|
||||||
var editor;
|
var editor;
|
||||||
@ -101,7 +206,6 @@ var addr2symbol;
|
|||||||
var compparams;
|
var compparams;
|
||||||
var trace_pending_at_pc;
|
var trace_pending_at_pc;
|
||||||
var store;
|
var store;
|
||||||
var pendingWorkerMessages = 0;
|
|
||||||
//scrollProfileView(disasmview);
|
//scrollProfileView(disasmview);
|
||||||
|
|
||||||
var currentDebugLine;
|
var currentDebugLine;
|
||||||
@ -171,23 +275,29 @@ function setLastPreset(id) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function updatePreset(fileid, text) {
|
|
||||||
// TODO: do we have to save all Verilog thingies?
|
|
||||||
if (text.trim().length &&
|
|
||||||
(originalFileID != fileid || text != originalText || platform_id=='verilog')) {
|
|
||||||
store.setItem(fileid, text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadCode(text, fileid) {
|
function loadCode(text, fileid) {
|
||||||
|
current_project = new CodeProject(newWorker(), platform_id, platform, store);
|
||||||
|
current_project.callbackResendFiles = function() {
|
||||||
|
setCode(editor.getValue()); // TODO
|
||||||
|
};
|
||||||
|
current_project.callbackBuildResult = function(result) {
|
||||||
|
setCompileOutput(result);
|
||||||
|
};
|
||||||
|
current_project.callbackBuildStatus = function(busy) {
|
||||||
|
if (busy) {
|
||||||
|
toolbar.addClass("is-busy");
|
||||||
|
} else {
|
||||||
|
toolbar.removeClass("is-busy");
|
||||||
|
}
|
||||||
|
$('#compile_spinner').css('visibility', busy ? 'visible' : 'hidden');
|
||||||
|
};
|
||||||
|
|
||||||
var tool = platform.getToolForFilename(fileid);
|
var tool = platform.getToolForFilename(fileid);
|
||||||
newEditor(tool && TOOL_TO_SOURCE_STYLE[tool]);
|
newEditor(tool && TOOL_TO_SOURCE_STYLE[tool]);
|
||||||
editor.setValue(text); // calls setCode()
|
editor.setValue(text); // calls setCode()
|
||||||
editor.clearHistory();
|
editor.clearHistory();
|
||||||
current_output = null;
|
current_output = null;
|
||||||
setLastPreset(fileid);
|
setLastPreset(fileid);
|
||||||
originalFileID = fileid;
|
|
||||||
originalText = text;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadFile(fileid, filename, preset) {
|
function loadFile(fileid, filename, preset) {
|
||||||
@ -228,7 +338,6 @@ function loadFile(fileid, filename, preset) {
|
|||||||
|
|
||||||
// can pass integer or string id
|
// can pass integer or string id
|
||||||
function loadPreset(preset_id) {
|
function loadPreset(preset_id) {
|
||||||
preloadWorker(preset_id); // TODO: what if multiple files
|
|
||||||
var index = parseInt(preset_id+""); // might fail -1
|
var index = parseInt(preset_id+""); // might fail -1
|
||||||
for (var i=0; i<PRESETS.length; i++)
|
for (var i=0; i<PRESETS.length; i++)
|
||||||
if (PRESETS[i].id == preset_id)
|
if (PRESETS[i].id == preset_id)
|
||||||
@ -395,52 +504,13 @@ function updateSelector() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadFileDependencies(text, callback) {
|
|
||||||
var filenames = [];
|
|
||||||
if (platform_id == 'verilog') {
|
|
||||||
var re = /^(`include|[.]include)\s+"(.+?)"/gm;
|
|
||||||
var m;
|
|
||||||
while (m = re.exec(text)) {
|
|
||||||
filenames.push(m[2]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var result = [];
|
|
||||||
function loadNextDependency() {
|
|
||||||
var fn = filenames.shift();
|
|
||||||
if (!fn) {
|
|
||||||
callback(result);
|
|
||||||
} else {
|
|
||||||
store.getItem(fn, function(err, value) {
|
|
||||||
result.push({
|
|
||||||
filename:fn,
|
|
||||||
prefix:platform_id,
|
|
||||||
text:value // might be null, that's ok
|
|
||||||
});
|
|
||||||
loadNextDependency();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
loadNextDependency(); // load first dependency
|
|
||||||
}
|
|
||||||
|
|
||||||
function setCode(text) {
|
function setCode(text) {
|
||||||
if (pendingWorkerMessages++ > 0)
|
current_project.updateFile(current_file_id, text, false);
|
||||||
return;
|
|
||||||
toolbar.addClass("is-busy");
|
|
||||||
$('#compile_spinner').css('visibility', 'visible');
|
|
||||||
loadFileDependencies(text, function(depends) {
|
|
||||||
worker.postMessage({
|
|
||||||
code:text,
|
|
||||||
dependencies:depends,
|
|
||||||
platform:platform_id,
|
|
||||||
tool:platform.getToolForFilename(current_file_id)
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function setCompileOutput(data) {
|
function setCompileOutput(data) {
|
||||||
if (data.unchanged) return;
|
|
||||||
// TODO: kills current selection
|
// TODO: kills current selection
|
||||||
|
// TODO: use current_project
|
||||||
// choose first listing (TODO:support multiple source files)
|
// choose first listing (TODO:support multiple source files)
|
||||||
sourcefile = null;
|
sourcefile = null;
|
||||||
assemblyfile = null;
|
assemblyfile = null;
|
||||||
@ -451,10 +521,8 @@ function setCompileOutput(data) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (lst) {
|
if (lst) {
|
||||||
sourcefile = new SourceFile(lst.lines);
|
sourcefile = lst.sourcefile;
|
||||||
if (lst.asmlines) {
|
assemblyfile = lst.assemblyfile;
|
||||||
assemblyfile = new SourceFile(lst.asmlines, lst.text);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!sourcefile) sourcefile = new SourceFile();
|
if (!sourcefile) sourcefile = new SourceFile();
|
||||||
@ -462,7 +530,6 @@ function setCompileOutput(data) {
|
|||||||
addr2symbol = invertMap(symbolmap);
|
addr2symbol = invertMap(symbolmap);
|
||||||
addr2symbol[0x10000] = '__END__'; // TODO?
|
addr2symbol[0x10000] = '__END__'; // TODO?
|
||||||
compparams = data.params;
|
compparams = data.params;
|
||||||
updatePreset(current_file_id, editor.getValue()); // update persisted entry
|
|
||||||
// errors?
|
// errors?
|
||||||
var lines2errmsg = [];
|
var lines2errmsg = [];
|
||||||
function addErrorMarker(line, msg) {
|
function addErrorMarker(line, msg) {
|
||||||
@ -555,18 +622,6 @@ function setCompileOutput(data) {
|
|||||||
trace_pending_at_pc = null;
|
trace_pending_at_pc = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
worker.onmessage = function(e) {
|
|
||||||
toolbar.removeClass("is-busy");
|
|
||||||
$('#compile_spinner').css('visibility', 'hidden');
|
|
||||||
if (pendingWorkerMessages > 1) {
|
|
||||||
pendingWorkerMessages = 0;
|
|
||||||
setCode(editor.getValue());
|
|
||||||
} else {
|
|
||||||
pendingWorkerMessages = 0;
|
|
||||||
}
|
|
||||||
setCompileOutput(e.data);
|
|
||||||
}
|
|
||||||
|
|
||||||
function setCurrentLine(line) {
|
function setCurrentLine(line) {
|
||||||
function addCurrentMarker(line) {
|
function addCurrentMarker(line) {
|
||||||
var div = document.createElement("div");
|
var div = document.createElement("div");
|
||||||
@ -1256,12 +1311,6 @@ var qs = (function (a) {
|
|||||||
return b;
|
return b;
|
||||||
})(window.location.search.substr(1).split('&'));
|
})(window.location.search.substr(1).split('&'));
|
||||||
|
|
||||||
// TODO: what if multiple files/tools?
|
|
||||||
function preloadWorker(fileid) {
|
|
||||||
var tool = platform.getToolForFilename(fileid);
|
|
||||||
if (tool) worker.postMessage({preload:tool, platform:platform_id});
|
|
||||||
}
|
|
||||||
|
|
||||||
function initPlatform() {
|
function initPlatform() {
|
||||||
store = createNewPersistentStore(platform_id);
|
store = createNewPersistentStore(platform_id);
|
||||||
}
|
}
|
||||||
@ -1332,7 +1381,7 @@ function loadSharedFile(sharekey) {
|
|||||||
console.log("Fetched " + newid, json);
|
console.log("Fetched " + newid, json);
|
||||||
platform_id = json['platform'];
|
platform_id = json['platform'];
|
||||||
initPlatform();
|
initPlatform();
|
||||||
updatePreset(newid, val.files[filename].content);
|
current_project.updateFile(newid, val.files[filename].content);
|
||||||
qs['file'] = newid;
|
qs['file'] = newid;
|
||||||
qs['platform'] = platform_id;
|
qs['platform'] = platform_id;
|
||||||
delete qs['sharekey'];
|
delete qs['sharekey'];
|
||||||
|
Loading…
Reference in New Issue
Block a user