summaryrefslogtreecommitdiff
path: root/demo/wast2wasm/demo.js
blob: 1f297583f0f3da8b751478da243bc0538a5cde1d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*
 * Copyright 2016 WebAssembly Community Group participants
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

var kCompileMinMS = 100;

var editorEl = document.querySelector('.editor');
var outputEl = document.getElementById('output');
var selectEl = document.getElementById('select');
var downloadEl = document.getElementById('download');
var downloadLink = document.getElementById('downloadLink');
var binaryBuffer = null;
var binaryBlobUrl = null;

var wasmInstance = null;

var options = {mode: 'wast', lineNumbers: true};
var editor = CodeMirror.fromTextArea(editorEl, options);

function debounce(f, wait) {
  var lastTime = 0;
  var timeoutId = -1;
  var wrapped = function() {
    var time = +new Date();
    if (time - lastTime < wait) {
      if (timeoutId == -1)
        timeoutId = setTimeout(wrapped, (lastTime + wait) - time);
      return;
    }
    if (timeoutId != -1)
      clearTimeout(timeoutId);
    timeoutId = -1;
    lastTime = time;
    f.apply(null, arguments);
  };
  return wrapped;
}

function compile(text) {
  wabt.ready.then(function() {
    outputEl.textContent = '';
    try {
      var script = wabt.parseWast('test.wast', text);
      script.resolveNames();
      script.validate();
      var binaryOutput = script.toBinary({log: true});
      outputEl.textContent = binaryOutput.log;
      binaryBuffer = binaryOutput.buffer;
      var blob = new Blob([binaryOutput.buffer]);
      if (binaryBlobUrl) {
        URL.revokeObjectURL(binaryBlobUrl);
      }
      binaryBlobUrl = URL.createObjectURL(blob);
      downloadLink.setAttribute('href', binaryBlobUrl);
      downloadEl.classList.remove('disabled');
    } catch (e) {
      outputEl.textContent += e.toString();
      downloadEl.classList.add('disabled');
    } finally {
      if (script) script.destroy();
    }
  });
}

var compileInput =
    debounce(function() { compile(editor.getValue()); }, kCompileMinMS);

function onEditorChange(e) {
  compileInput();
}

function setExample(index) {
  var contents = examples[index].contents;
  editor.setValue(contents);
  compileInput();
}

function onSelectChanged(e) {
  setExample(this.selectedIndex);
}

function onDownloadClicked(e) {
  // See https://developer.mozilla.com/en-US/docs/Web/API/MouseEvent
  var event = new MouseEvent('click', {
    view: window,
    bubbles: true,
    cancelable: true,
  });
  downloadLink.dispatchEvent(event);
}

editor.on('change', onEditorChange);
selectEl.addEventListener('change', onSelectChanged);
downloadEl.addEventListener('click', onDownloadClicked);

for (var i = 0; i < examples.length; ++i) {
  var example = examples[i];
  var option = document.createElement('option');
  option.textContent = example.name;
  selectEl.appendChild(option);
}
selectEl.selectedIndex = 1;
setExample(selectEl.selectedIndex);