@@ -33,6 +33,7 @@ var outputEl = document.getElementById('output');
3333var jsLogEl = document . getElementById ( 'js_log' ) ;
3434var selectEl = document . getElementById ( 'select' ) ;
3535var downloadEl = document . getElementById ( 'download' ) ;
36+ var runEl = document . getElementById ( 'run' ) ;
3637var downloadLink = document . getElementById ( 'downloadLink' ) ;
3738var buildLogEl = document . getElementById ( 'buildLog' ) ;
3839var base64El = document . getElementById ( 'base64' ) ;
@@ -49,16 +50,6 @@ for (const [f, v] of Object.entries(wabt.FEATURES)) {
4950 } ) ;
5051}
5152
52- var wasmInstance = null ;
53-
54- var wrappedConsole = Object . create ( console ) ;
55-
56- wrappedConsole . log = ( ...args ) => {
57- let line = args . map ( String ) . join ( '' ) + '\n' ;
58- jsLogEl . textContent += line ;
59- console . log ( ...args ) ;
60- }
61-
6253var watEditor = CodeMirror ( ( elt ) => {
6354 document . getElementById ( 'top-left' ) . appendChild ( elt ) ;
6455} , {
@@ -124,17 +115,33 @@ function compile() {
124115 }
125116}
126117
118+ let activeWorker = null ;
127119function run ( ) {
120+ if ( activeWorker != null ) stop ( ) ;
121+ runEl . textContent = 'Stop' ;
128122 jsLogEl . textContent = '' ;
129123 if ( binaryBuffer === null ) return ;
130- try {
131- let wasm = new WebAssembly . Module ( binaryBuffer ) ;
132- let js = jsEditor . getValue ( ) ;
133- let fn = new Function ( 'wasmModule' , 'console' , js + '//# sourceURL=demo.js' ) ;
134- fn ( wasm , wrappedConsole ) ;
135- } catch ( e ) {
136- jsLogEl . textContent += String ( e ) ;
124+ const js = jsEditor . getValue ( ) ;
125+ activeWorker = new Worker ( './worker.js' ) ;
126+ activeWorker . addEventListener ( 'message' , function ( event ) {
127+ switch ( event . data . type ) {
128+ case 'log' :
129+ jsLogEl . textContent += event . data . data ;
130+ break ;
131+ case 'done' :
132+ stop ( ) ;
133+ break ;
134+ }
135+ } ) ;
136+ activeWorker . postMessage ( { binaryBuffer : binaryBuffer . buffer , js } , [ ] ) ;
137+ }
138+
139+ function stop ( ) {
140+ if ( activeWorker != null ) {
141+ activeWorker . terminate ( ) ;
142+ activeWorker = null ;
137143 }
144+ runEl . textContent = 'Run' ;
138145}
139146
140147var onWatChange = debounce ( compile , kCompileMinMS ) ;
@@ -152,6 +159,14 @@ function onSelectChanged(e) {
152159 setExample ( this . selectedIndex ) ;
153160}
154161
162+ function onRunClicked ( e ) {
163+ if ( activeWorker != null ) {
164+ stop ( ) ;
165+ } else {
166+ onJsChange ( ) ;
167+ }
168+ }
169+
155170function onDownloadClicked ( e ) {
156171 // See https://developer.mozilla.com/en-US/docs/Web/API/MouseEvent
157172 var event = new MouseEvent ( 'click' , {
@@ -179,6 +194,7 @@ function onBase64Clicked(e) {
179194watEditor . on ( 'change' , onWatChange ) ;
180195jsEditor . on ( 'change' , onJsChange ) ;
181196selectEl . addEventListener ( 'change' , onSelectChanged ) ;
197+ runEl . addEventListener ( 'click' , onRunClicked ) ;
182198downloadEl . addEventListener ( 'click' , onDownloadClicked ) ;
183199buildLogEl . addEventListener ( 'click' , onBuildLogClicked ) ;
184200base64El . addEventListener ( 'click' , onBase64Clicked ) ;
@@ -191,5 +207,6 @@ for (var i = 0; i < examples.length; ++i) {
191207}
192208selectEl . selectedIndex = 1 ;
193209setExample ( selectEl . selectedIndex ) ;
210+ runEl . classList . remove ( 'disabled' ) ;
194211
195212} ) ;
0 commit comments