Skip to content

Commit 4cb51d5

Browse files
bmeurermarijnh
authored andcommitted
[wast] Add new wast mode (for WebAssembly disassembly)
This adds support for WebAssembly text format, as used in the browser DevTools (Firefox, Edge and Chrome DevTools all the like).
1 parent 08eee7c commit 4cb51d5

File tree

5 files changed

+152
-0
lines changed

5 files changed

+152
-0
lines changed

AUTHORS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ Bastian Müller
9797
belhaj
9898
Bem Jones-Bey
9999
benbro
100+
Benedikt Meurer
100101
Beni Cherniavsky-Paskin
101102
Benjamin DeCoste
102103
Benjamin Young

mode/wast/index.html

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<!DOCTYPE html>
2+
3+
<title>CodeMirror: Rust mode</title>
4+
<meta charset="utf-8" />
5+
<link rel=stylesheet href="../../doc/docs.css">
6+
7+
<link rel="stylesheet" href="../../lib/codemirror.css">
8+
<script src="../../lib/codemirror.js"></script>
9+
<script src="../../addon/mode/simple.js"></script>
10+
<script src="wast.js"></script>
11+
<style>
12+
.CodeMirror {
13+
border-top: 1px solid black;
14+
border-bottom: 1px solid black;
15+
}
16+
</style>
17+
<div id=nav>
18+
<a href="https://codemirror.net">
19+
<h1>CodeMirror</h1><img id=logo src="../../doc/logo.png" alt="">
20+
</a>
21+
22+
<ul>
23+
<li><a href="../../index.html">Home</a>
24+
<li><a href="../../doc/manual.html">Manual</a>
25+
<li><a href="https://github.com/codemirror/codemirror">Code</a>
26+
</ul>
27+
<ul>
28+
<li><a href="../index.html">Language modes</a>
29+
<li><a class=active href="#">WebAssembly</a>
30+
</ul>
31+
</div>
32+
33+
<article>
34+
<h2>WebAssembly mode</h2>
35+
36+
37+
<div><textarea id="code" name="code">
38+
/* Example WebAssembly */
39+
(module $foo
40+
(export "fac" (func $fac))
41+
(export "plus" (func $plus))
42+
43+
(func $fac (type $t0) (param $p0 i64) (result i64)
44+
(if $I0 (result i64)
45+
(i64.lt_s
46+
(local.get $p0)
47+
(i64.const 1))
48+
(then
49+
(i64.const 1))
50+
(else
51+
(i64.mul
52+
(local.get $p0)
53+
(call $fac
54+
(i64.sub
55+
(local.get $p0)
56+
(i64.const 1)))))))
57+
58+
(func $plus (param $x i32) (param $y i32) (result i32)
59+
(i32.add
60+
(local.get $x)
61+
(local.get $y))))</textarea></div>
62+
63+
<script>
64+
var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
65+
lineNumbers: true,
66+
lineWrapping: true,
67+
indentUnit: 4,
68+
mode: "wast"
69+
});
70+
</script>
71+
72+
<p><strong>MIME types defined:</strong> <code>text/webassembly</code>.</p>
73+
</article>

mode/wast/test.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// CodeMirror, copyright (c) by Marijn Haverbeke and others
2+
// Distributed under an MIT license: https://codemirror.net/LICENSE
3+
4+
(function() {
5+
var mode = CodeMirror.getMode({indentUnit: 4}, "wast");
6+
function MT(name) {test.mode(name, mode, Array.prototype.slice.call(arguments, 1));}
7+
8+
MT('number-test',
9+
'[number 0]',
10+
'[number 123]',
11+
'[number nan]',
12+
'[number inf]',
13+
'[number infinity]',
14+
'[number 0.1]',
15+
'[number 123.0]',
16+
'[number 12E+99]');
17+
18+
MT('string-literals-test',
19+
'[string "foo"]',
20+
'[string "\\"foo\\""]',
21+
'[string "foo #\\"# bar"]');
22+
23+
MT('atom-test',
24+
'[atom i32]',
25+
'[atom i64]',
26+
'[atom f32]',
27+
'[atom f64]');
28+
29+
MT('keyword-test',
30+
'[keyword br]',
31+
'[keyword if]',
32+
'[keyword loop]',
33+
'[keyword i32.add]',
34+
'[keyword local.get]')
35+
})();

mode/wast/wast.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// CodeMirror, copyright (c) by Marijn Haverbeke and others
2+
// Distributed under an MIT license: https://codemirror.net/LICENSE
3+
4+
(function(mod) {
5+
if (typeof exports == "object" && typeof module == "object") // CommonJS
6+
mod(require("../../lib/codemirror"), require("../../addon/mode/simple"));
7+
else if (typeof define == "function" && define.amd) // AMD
8+
define(["../../lib/codemirror", "../../addon/mode/simple"], mod);
9+
else // Plain browser env
10+
mod(CodeMirror);
11+
})(function(CodeMirror) {
12+
"use strict";
13+
14+
CodeMirror.defineSimpleMode('wast', {
15+
start: [
16+
{regex: /[+\-]?(?:nan(?::0x[0-9a-fA-F]+)?|infinity|inf|0x[0-9a-fA-F]+\.?[0-9a-fA-F]*p[+\/-]?\d+|\d+(?:\.\d*)?[eE][+\-]?\d*|\d+\.\d*|0x[0-9a-fA-F]+|\d+)/, token: "number"},
17+
{regex: /anyfunc|mut|nop|block|if|then|else|loop|br|br_if|br_table|call|call_indirect|drop|end|return|local\.get|local\.set|tee_local|global\.get|global\.set|i32\.load|i64\.load|f32\.load|f64\.load|i32\.store|i64\.store|f32\.store|f64\.store|i32\.load8_s|i64\.load8_s|i32\.load8_u|i64\.load8_u|i32\.load16_s|i64\.load16_s|i32\.load16_u|i64\.load16_u|i64\.load32_s|i64\.load32_u|i32\.store8|i64\.store8|i32\.store16|i64\.store16|i32\.const|i64\.const|f32\.const|f64\.const|i32\.eqz|i64\.eqz|i32\.clz|i64\.clz|i32\.ctz|i64\.ctz|i32\.popcnt|i64\.popcnt|f32\.neg|f64\.neg|f32\.abs|f64\.abs|f32\.sqrt|f64\.sqrt|f32\.ceil|f64\.ceil|f32\.floor|f64\.floor|f32\.trunc|f64\.trunc|f32\.nearest|f64\.nearest|i32\.add|i64\.add|i32\.sub|i64\.sub|i32\.mul|i64\.mul|i32\.div_s|i64\.div_s|i32\.div_u|i64\.div_u|i32\.rem_s|i64\.rem_s|i32\.rem_u|i64\.rem_u|i32\.and|i64\.and|i32\.or|i64\.or|i32\.xor|i64\.xor|i32\.shl|i64\.shl|i32\.shr_s|i64\.shr_s|i32\.shr_u|i64\.shr_u|i32\.rotl|i64\.rotl|i32\.rotr|i64\.rotr|f32\.add|f64\.add|f32\.sub|f64\.sub|f32\.mul|f64\.mul|f32\.div|f64\.div|f32\.min|f64\.min|f32\.max|f64\.max|f32\.copysign|f64\.copysign|i32\.eq|i64\.eq|i32\.ne|i64\.ne|i32\.lt_s|i64\.lt_s|i32\.lt_u|i64\.lt_u|i32\.le_s|i64\.le_s|i32\.le_u|i64\.le_u|i32\.gt_s|i64\.gt_s|i32\.gt_u|i64\.gt_u|i32\.ge_s|i64\.ge_s|i32\.ge_u|i64\.ge_u|f32\.eq|f64\.eq|f32\.ne|f64\.ne|f32\.lt|f64\.lt|f32\.le|f64\.le|f32\.gt|f64\.gt|f32\.ge|f64\.ge|i64\.extend_s\/i32|i64\.extend_u\/i32|i32\.wrap\/i64|i32\.trunc_s\/f32|i64\.trunc_s\/f32|i32\.trunc_s\/f64|i64\.trunc_s\/f64|i32\.trunc_u\/f32|i64\.trunc_u\/f32|i32\.trunc_u\/f64|i64\.trunc_u\/f64|f32\.convert_s\/i32|f64\.convert_s\/i32|f32\.convert_s\/i64|f64\.convert_s\/i64|f32\.convert_u\/i32|f64\.convert_u\/i32|f32\.convert_u\/i64|f64\.convert_u\/i64|f64\.promote\/f32|f32\.demote\/f64|f32\.reinterpret\/i32|i32\.reinterpret\/f32|f64\.reinterpret\/i64|i64\.reinterpret\/f64|select|unreachable|current_memory|memory.size|grow_memory|memory.grow|type|func|param|result|local|global|module|table|memory|start|elem|data|offset|import|export/, token: "keyword"},
18+
{regex: /\b(i32|i64|f32|f64)\b/, token: "atom"},
19+
{regex: /\$([a-zA-Z0-9_`\+\-\*\/\\\^~=<>!\?@#$%&|:\.]+)/, token: "variable-2"},
20+
{regex: /"(?:[^"\\\x00-\x1f\x7f]|\\[nt\\'"]|\\[0-9a-fA-F][0-9a-fA-F])*"/, token: "string"},
21+
{regex: /\(;.*?/, token: "comment", next: "comment"},
22+
{regex: /;;.*$/, token: "comment"},
23+
{regex: /\(/, indent: true},
24+
{regex: /\)/, dedent: true},
25+
],
26+
27+
comment: [
28+
{regex: /.*?;\)/, token: "comment", next: "start"},
29+
{regex: /.*/, token: "comment"},
30+
],
31+
32+
meta: {
33+
dontIndentStates: ['comment'],
34+
},
35+
});
36+
37+
// https://github.com/WebAssembly/design/issues/981 mentions text/webassembly,
38+
// which seems like a reasonable choice, although it's not standard right now.
39+
CodeMirror.defineMIME("text/webassembly", "wast");
40+
41+
});

test/index.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
<script src="../mode/rust/rust.js"></script>
5858
<script src="../mode/mscgen/mscgen.js"></script>
5959
<script src="../mode/dylan/dylan.js"></script>
60+
<script src="../mode/wast/wast.js"></script>
6061

6162
<style>
6263
.ok { color: #090; }
@@ -147,6 +148,7 @@ <h2>Test Suite</h2>
147148
<script src="../mode/xquery/test.js"></script>
148149
<script src="../mode/python/test.js"></script>
149150
<script src="../mode/rust/test.js"></script>
151+
<script src="../mode/wast/test.js"></script>
150152
<script src="../mode/mscgen/mscgen_test.js"></script>
151153
<script src="../mode/mscgen/xu_test.js"></script>
152154
<script src="../mode/mscgen/msgenny_test.js"></script>

0 commit comments

Comments
 (0)