@@ -33,6 +33,7 @@ var outputEl = document.getElementById('output');
33
33
var jsLogEl = document . getElementById ( 'js_log' ) ;
34
34
var selectEl = document . getElementById ( 'select' ) ;
35
35
var downloadEl = document . getElementById ( 'download' ) ;
36
+ var runEl = document . getElementById ( 'run' ) ;
36
37
var downloadLink = document . getElementById ( 'downloadLink' ) ;
37
38
var buildLogEl = document . getElementById ( 'buildLog' ) ;
38
39
var base64El = document . getElementById ( 'base64' ) ;
@@ -49,16 +50,6 @@ for (const [f, v] of Object.entries(wabt.FEATURES)) {
49
50
} ) ;
50
51
}
51
52
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
-
62
53
var watEditor = CodeMirror ( ( elt ) => {
63
54
document . getElementById ( 'top-left' ) . appendChild ( elt ) ;
64
55
} , {
@@ -124,17 +115,33 @@ function compile() {
124
115
}
125
116
}
126
117
118
+ let activeWorker = null ;
127
119
function run ( ) {
120
+ if ( activeWorker != null ) stop ( ) ;
121
+ runEl . textContent = 'Stop' ;
128
122
jsLogEl . textContent = '' ;
129
123
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 ;
137
143
}
144
+ runEl . textContent = 'Run' ;
138
145
}
139
146
140
147
var onWatChange = debounce ( compile , kCompileMinMS ) ;
@@ -152,6 +159,14 @@ function onSelectChanged(e) {
152
159
setExample ( this . selectedIndex ) ;
153
160
}
154
161
162
+ function onRunClicked ( e ) {
163
+ if ( activeWorker != null ) {
164
+ stop ( ) ;
165
+ } else {
166
+ onJsChange ( ) ;
167
+ }
168
+ }
169
+
155
170
function onDownloadClicked ( e ) {
156
171
// See https://developer.mozilla.com/en-US/docs/Web/API/MouseEvent
157
172
var event = new MouseEvent ( 'click' , {
@@ -179,6 +194,7 @@ function onBase64Clicked(e) {
179
194
watEditor . on ( 'change' , onWatChange ) ;
180
195
jsEditor . on ( 'change' , onJsChange ) ;
181
196
selectEl . addEventListener ( 'change' , onSelectChanged ) ;
197
+ runEl . addEventListener ( 'click' , onRunClicked ) ;
182
198
downloadEl . addEventListener ( 'click' , onDownloadClicked ) ;
183
199
buildLogEl . addEventListener ( 'click' , onBuildLogClicked ) ;
184
200
base64El . addEventListener ( 'click' , onBase64Clicked ) ;
@@ -191,5 +207,6 @@ for (var i = 0; i < examples.length; ++i) {
191
207
}
192
208
selectEl . selectedIndex = 1 ;
193
209
setExample ( selectEl . selectedIndex ) ;
210
+ runEl . classList . remove ( 'disabled' ) ;
194
211
195
212
} ) ;
0 commit comments