Skip to content

Commit

Permalink
do compilation and execution in a webworker, and prepare for interact…
Browse files Browse the repository at this point in the history
…ive mode
  • Loading branch information
btzy committed Apr 2, 2017
1 parent 1298524 commit 13d7930
Show file tree
Hide file tree
Showing 9 changed files with 1,867 additions and 3 deletions.
2 changes: 1 addition & 1 deletion index-notworking.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<script src="wasm32codegen.max.js" type="text/javascript"></script>
<script src="jelly-bf-compiler-notworking.js" type="text/javascript"></script>
<script src="jelly-bf.js" type="text/javascript"></script>
<script src="main.js" type="text/javascript"></script>
<script src="main-old.js" type="text/javascript"></script>
</head>
<body>
<h2 class="area">Jelly Brainfuck Compiler</h2>
Expand Down
83 changes: 83 additions & 0 deletions jelly-bf-sync.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
var JellyBFSync={
compile:function(str,options){
return WebAssembly.Module(JellyBFCompiler.compile(str,options));
},
execute:function(module,inputuint8array,options){
options.eof_value=options.eof_value||0;
var inputindex=0;
var outputdata=new ResizableUint8Array();
var get_input=function(){
if(inputindex<inputuint8array.length){
return inputuint8array[inputindex++];
}
else{
return options.eof_value;
}
};
var put_output=function(byte){
outputdata.push(byte);
};
var instance=WebAssembly.Instance(module,{
interaction:{
input:get_input,
output:put_output
}
});
instance.exports.main();
return outputdata.toUint8Array();
},
executeInteractive:function(module,inputuint8array,outputuint8array,inputwaitint32array,outputwaitint32array,options){
var WaitArrayId={
READ_HEAD:0,
WRITE_HEAD:1,
TERMINATED_FLAG:2
};
options.bufferlength=options.bufferlength||1024; // 1024 element buffer by default
options.eof_value=options.eof_value||0;
// two elements - next read index, next write index
var input_read_head=0,input_write_head=0,input_terminated=false; // cache values
var get_input=function(){
if(input_read_head===input_write_head){
Atomics.wait(inputwaitint32array,WaitArrayId.WRITE_HEAD,input_write_head);
input_write_head=Atomics.load(inputwaitint32array,WaitArrayId.WRITE_HEAD);
if(!input_terminated){
input_terminated=(Atomics.load(inputwaitint32array,WaitArrayId.TERMINATED_FLAG)!==0);
}
}
if(!input_terminated||input_read_head+1<input_write_head){
var val=Atomics.load(inputuint8array,(input_read_head++)%options.bufferlength);
Atomics.store(inputwaitint32array,WaitArrayId.READ_HEAD,input_read_head);
return val;
}
else{
return options.eof_value;
}
};
var output_read_head=0,output_write_head=0,output_terminated=false; // cache values
var put_output=function(byte){
if(output_read_head+options.bufferlength===output_write_head){
Atomics.wait(outputwaitint32array,WaitArrayId.READ_HEAD,output_read_head);
output_read_head=Atomics.load(outputwaitint32array,WaitArrayId.READ_HEAD);
}
Atomics.store(outputuint8array,(output_write_head++)%options.bufferlength,byte);
Atomics.store(outputwaitint32array,WaitArrayId.WRITE_HEAD,output_write_head);
};
var terminate_output=function(){
if(output_read_head+options.bufferlength===output_write_head){
Atomics.wait(outputwaitint32array,WaitArrayId.READ_HEAD,output_read_head);
output_read_head=Atomics.load(outputwaitint32array,WaitArrayId.READ_HEAD);
}
Atomics.store(outputwaitint32array,WaitArrayId.TERMINATED_FLAG,1);
Atomics.store(outputwaitint32array,WaitArrayId.WRITE_HEAD,output_write_head+1);
};
var instance=WebAssembly.Instance(module,{
interaction:{
input:get_input,
output:put_output
}
});
instance.exports.main();
terminate_output();
return true;
}
};
33 changes: 33 additions & 0 deletions jelly-bf-worker.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
(function(){
var module=undefined;
self.addEventListener("message",function(e){
var message=e.data;
switch(message.type){
case "compile":
var sourcecode=message.sourcecode;
var options=message.options;
module=JellyBFSync.compile(sourcecode,options);
self.postMessage({type:"compiled"});
break;
case "execute-interactive":
var inputbuffer=message.inputbuffer; // circular buffer
var outputbuffer=message.outputbuffer;
var inputwaitbuffer=message.inputwaitbuffer; // three elements - next read index, next write index, terminated (1-yes) - these are never decreasing
// write index must be increased by 1 when stream is terminated
var outputwaitbuffer=message.outputwaitbuffer;
// all wait buffers expected to be zeroed
var options=message.options;
JellyBFSync.executeInteractive(module,UInt8Array(inputbuffer),UInt8Array(outputbuffer),Int32Array(inputwaitbuffer),Int32Array(outputwaitbuffer),options);
self.postMessage({type:"executed"});
break;
case "execute":
var inputuint8array=message.inputuint8array;
var options=message.options;
var outputuint8array=JellyBFSync.execute(module,inputuint8array,options);
self.postMessage({type:"executed",outputuint8array:outputuint8array},[outputuint8array.buffer]);
break;
}
});

self.postMessage({type:"ready"});
})();
Loading

0 comments on commit 13d7930

Please sign in to comment.