2023-10-03 11:14:36 +08:00
|
|
|
/*
|
|
|
|
Language: WebAssembly
|
|
|
|
Website: https://webassembly.org
|
|
|
|
Description: Wasm is designed as a portable compilation target for programming languages, enabling deployment on the web for client and server applications.
|
|
|
|
Category: web, common
|
|
|
|
Audit: 2020
|
|
|
|
*/
|
|
|
|
|
|
|
|
/** @type LanguageFn */
|
|
|
|
function wasm(hljs) {
|
|
|
|
hljs.regex;
|
|
|
|
const BLOCK_COMMENT = hljs.COMMENT(/\(;/, /;\)/);
|
|
|
|
BLOCK_COMMENT.contains.push("self");
|
|
|
|
const LINE_COMMENT = hljs.COMMENT(/;;/, /$/);
|
|
|
|
|
|
|
|
const KWS = [
|
|
|
|
"anyfunc",
|
|
|
|
"block",
|
|
|
|
"br",
|
|
|
|
"br_if",
|
|
|
|
"br_table",
|
|
|
|
"call",
|
|
|
|
"call_indirect",
|
|
|
|
"data",
|
|
|
|
"drop",
|
|
|
|
"elem",
|
|
|
|
"else",
|
|
|
|
"end",
|
|
|
|
"export",
|
|
|
|
"func",
|
|
|
|
"global.get",
|
|
|
|
"global.set",
|
|
|
|
"local.get",
|
|
|
|
"local.set",
|
|
|
|
"local.tee",
|
|
|
|
"get_global",
|
|
|
|
"get_local",
|
|
|
|
"global",
|
|
|
|
"if",
|
|
|
|
"import",
|
|
|
|
"local",
|
|
|
|
"loop",
|
|
|
|
"memory",
|
|
|
|
"memory.grow",
|
|
|
|
"memory.size",
|
|
|
|
"module",
|
|
|
|
"mut",
|
|
|
|
"nop",
|
|
|
|
"offset",
|
|
|
|
"param",
|
|
|
|
"result",
|
|
|
|
"return",
|
|
|
|
"select",
|
|
|
|
"set_global",
|
|
|
|
"set_local",
|
|
|
|
"start",
|
|
|
|
"table",
|
|
|
|
"tee_local",
|
|
|
|
"then",
|
|
|
|
"type",
|
|
|
|
"unreachable"
|
|
|
|
];
|
|
|
|
|
|
|
|
const FUNCTION_REFERENCE = {
|
|
|
|
begin: [
|
|
|
|
/(?:func|call|call_indirect)/,
|
|
|
|
/\s+/,
|
|
|
|
/\$[^\s)]+/
|
|
|
|
],
|
|
|
|
className: {
|
|
|
|
1: "keyword",
|
|
|
|
3: "title.function"
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const ARGUMENT = {
|
|
|
|
className: "variable",
|
|
|
|
begin: /\$[\w_]+/
|
|
|
|
};
|
|
|
|
|
|
|
|
const PARENS = {
|
|
|
|
match: /(\((?!;)|\))+/,
|
|
|
|
className: "punctuation",
|
|
|
|
relevance: 0
|
|
|
|
};
|
|
|
|
|
|
|
|
const NUMBER = {
|
|
|
|
className: "number",
|
|
|
|
relevance: 0,
|
|
|
|
// borrowed from Prism, TODO: split out into variants
|
|
|
|
match: /[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/
|
|
|
|
};
|
|
|
|
|
|
|
|
const TYPE = {
|
|
|
|
// look-ahead prevents us from gobbling up opcodes
|
|
|
|
match: /(i32|i64|f32|f64)(?!\.)/,
|
|
|
|
className: "type"
|
|
|
|
};
|
|
|
|
|
|
|
|
const MATH_OPERATIONS = {
|
|
|
|
className: "keyword",
|
|
|
|
// borrowed from Prism, TODO: split out into variants
|
|
|
|
match: /\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/
|
|
|
|
};
|
|
|
|
|
|
|
|
const OFFSET_ALIGN = {
|
|
|
|
match: [
|
|
|
|
/(?:offset|align)/,
|
|
|
|
/\s*/,
|
|
|
|
/=/
|
|
|
|
],
|
|
|
|
className: {
|
|
|
|
1: "keyword",
|
|
|
|
3: "operator"
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
return {
|
|
|
|
name: 'WebAssembly',
|
|
|
|
keywords: {
|
|
|
|
$pattern: /[\w.]+/,
|
|
|
|
keyword: KWS
|
|
|
|
},
|
|
|
|
contains: [
|
|
|
|
LINE_COMMENT,
|
|
|
|
BLOCK_COMMENT,
|
|
|
|
OFFSET_ALIGN,
|
|
|
|
ARGUMENT,
|
|
|
|
PARENS,
|
|
|
|
FUNCTION_REFERENCE,
|
|
|
|
hljs.QUOTE_STRING_MODE,
|
|
|
|
TYPE,
|
|
|
|
MATH_OPERATIONS,
|
|
|
|
NUMBER
|
|
|
|
]
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = wasm;
|