663 lines
11 KiB
JavaScript
663 lines
11 KiB
JavaScript
var definitions = {};
|
|
|
|
function defineType(typeName, metadata) {
|
|
definitions[typeName] = metadata;
|
|
}
|
|
|
|
defineType("Module", {
|
|
spec: {
|
|
wasm: "https://webassembly.github.io/spec/core/binary/modules.html#binary-module",
|
|
wat: "https://webassembly.github.io/spec/core/text/modules.html#text-module"
|
|
},
|
|
doc: "A module consists of a sequence of sections (termed fields in the text format).",
|
|
unionType: ["Node"],
|
|
fields: {
|
|
id: {
|
|
maybe: true,
|
|
type: "string"
|
|
},
|
|
fields: {
|
|
array: true,
|
|
type: "Node"
|
|
},
|
|
metadata: {
|
|
optional: true,
|
|
type: "ModuleMetadata"
|
|
}
|
|
}
|
|
});
|
|
defineType("ModuleMetadata", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
sections: {
|
|
array: true,
|
|
type: "SectionMetadata"
|
|
},
|
|
functionNames: {
|
|
optional: true,
|
|
array: true,
|
|
type: "FunctionNameMetadata"
|
|
},
|
|
localNames: {
|
|
optional: true,
|
|
array: true,
|
|
type: "ModuleMetadata"
|
|
},
|
|
producers: {
|
|
optional: true,
|
|
array: true,
|
|
type: "ProducersSectionMetadata"
|
|
}
|
|
}
|
|
});
|
|
defineType("ModuleNameMetadata", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
value: {
|
|
type: "string"
|
|
}
|
|
}
|
|
});
|
|
defineType("FunctionNameMetadata", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
value: {
|
|
type: "string"
|
|
},
|
|
index: {
|
|
type: "number"
|
|
}
|
|
}
|
|
});
|
|
defineType("LocalNameMetadata", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
value: {
|
|
type: "string"
|
|
},
|
|
localIndex: {
|
|
type: "number"
|
|
},
|
|
functionIndex: {
|
|
type: "number"
|
|
}
|
|
}
|
|
});
|
|
defineType("BinaryModule", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
id: {
|
|
maybe: true,
|
|
type: "string"
|
|
},
|
|
blob: {
|
|
array: true,
|
|
type: "string"
|
|
}
|
|
}
|
|
});
|
|
defineType("QuoteModule", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
id: {
|
|
maybe: true,
|
|
type: "string"
|
|
},
|
|
string: {
|
|
array: true,
|
|
type: "string"
|
|
}
|
|
}
|
|
});
|
|
defineType("SectionMetadata", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
section: {
|
|
type: "SectionName"
|
|
},
|
|
startOffset: {
|
|
type: "number"
|
|
},
|
|
size: {
|
|
type: "NumberLiteral"
|
|
},
|
|
vectorOfSize: {
|
|
comment: "Size of the vector in the section (if any)",
|
|
type: "NumberLiteral"
|
|
}
|
|
}
|
|
});
|
|
defineType("ProducersSectionMetadata", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
producers: {
|
|
array: true,
|
|
type: "ProducerMetadata"
|
|
}
|
|
}
|
|
});
|
|
defineType("ProducerMetadata", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
language: {
|
|
type: "ProducerMetadataVersionedName",
|
|
array: true
|
|
},
|
|
processedBy: {
|
|
type: "ProducerMetadataVersionedName",
|
|
array: true
|
|
},
|
|
sdk: {
|
|
type: "ProducerMetadataVersionedName",
|
|
array: true
|
|
}
|
|
}
|
|
});
|
|
defineType("ProducerMetadataVersionedName", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
name: {
|
|
type: "string"
|
|
},
|
|
version: {
|
|
type: "string"
|
|
}
|
|
}
|
|
});
|
|
/*
|
|
Instructions
|
|
*/
|
|
|
|
defineType("LoopInstruction", {
|
|
unionType: ["Node", "Block", "Instruction"],
|
|
fields: {
|
|
id: {
|
|
constant: true,
|
|
type: "string",
|
|
value: "loop"
|
|
},
|
|
label: {
|
|
maybe: true,
|
|
type: "Identifier"
|
|
},
|
|
resulttype: {
|
|
maybe: true,
|
|
type: "Valtype"
|
|
},
|
|
instr: {
|
|
array: true,
|
|
type: "Instruction"
|
|
}
|
|
}
|
|
});
|
|
defineType("Instr", {
|
|
unionType: ["Node", "Expression", "Instruction"],
|
|
fields: {
|
|
id: {
|
|
type: "string"
|
|
},
|
|
object: {
|
|
optional: true,
|
|
type: "Valtype"
|
|
},
|
|
args: {
|
|
array: true,
|
|
type: "Expression"
|
|
},
|
|
namedArgs: {
|
|
optional: true,
|
|
type: "Object"
|
|
}
|
|
}
|
|
});
|
|
defineType("IfInstruction", {
|
|
unionType: ["Node", "Instruction"],
|
|
fields: {
|
|
id: {
|
|
constant: true,
|
|
type: "string",
|
|
value: "if"
|
|
},
|
|
testLabel: {
|
|
comment: "only for WAST",
|
|
type: "Identifier"
|
|
},
|
|
test: {
|
|
array: true,
|
|
type: "Instruction"
|
|
},
|
|
result: {
|
|
maybe: true,
|
|
type: "Valtype"
|
|
},
|
|
consequent: {
|
|
array: true,
|
|
type: "Instruction"
|
|
},
|
|
alternate: {
|
|
array: true,
|
|
type: "Instruction"
|
|
}
|
|
}
|
|
});
|
|
/*
|
|
Concrete value types
|
|
*/
|
|
|
|
defineType("StringLiteral", {
|
|
unionType: ["Node", "Expression"],
|
|
fields: {
|
|
value: {
|
|
type: "string"
|
|
}
|
|
}
|
|
});
|
|
defineType("NumberLiteral", {
|
|
unionType: ["Node", "NumericLiteral", "Expression"],
|
|
fields: {
|
|
value: {
|
|
type: "number"
|
|
},
|
|
raw: {
|
|
type: "string"
|
|
}
|
|
}
|
|
});
|
|
defineType("LongNumberLiteral", {
|
|
unionType: ["Node", "NumericLiteral", "Expression"],
|
|
fields: {
|
|
value: {
|
|
type: "LongNumber"
|
|
},
|
|
raw: {
|
|
type: "string"
|
|
}
|
|
}
|
|
});
|
|
defineType("FloatLiteral", {
|
|
unionType: ["Node", "NumericLiteral", "Expression"],
|
|
fields: {
|
|
value: {
|
|
type: "number"
|
|
},
|
|
nan: {
|
|
optional: true,
|
|
type: "boolean"
|
|
},
|
|
inf: {
|
|
optional: true,
|
|
type: "boolean"
|
|
},
|
|
raw: {
|
|
type: "string"
|
|
}
|
|
}
|
|
});
|
|
defineType("Elem", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
table: {
|
|
type: "Index"
|
|
},
|
|
offset: {
|
|
array: true,
|
|
type: "Instruction"
|
|
},
|
|
funcs: {
|
|
array: true,
|
|
type: "Index"
|
|
}
|
|
}
|
|
});
|
|
defineType("IndexInFuncSection", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
index: {
|
|
type: "Index"
|
|
}
|
|
}
|
|
});
|
|
defineType("ValtypeLiteral", {
|
|
unionType: ["Node", "Expression"],
|
|
fields: {
|
|
name: {
|
|
type: "Valtype"
|
|
}
|
|
}
|
|
});
|
|
defineType("TypeInstruction", {
|
|
unionType: ["Node", "Instruction"],
|
|
fields: {
|
|
id: {
|
|
maybe: true,
|
|
type: "Index"
|
|
},
|
|
functype: {
|
|
type: "Signature"
|
|
}
|
|
}
|
|
});
|
|
defineType("Start", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
index: {
|
|
type: "Index"
|
|
}
|
|
}
|
|
});
|
|
defineType("GlobalType", {
|
|
unionType: ["Node", "ImportDescr"],
|
|
fields: {
|
|
valtype: {
|
|
type: "Valtype"
|
|
},
|
|
mutability: {
|
|
type: "Mutability"
|
|
}
|
|
}
|
|
});
|
|
defineType("LeadingComment", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
value: {
|
|
type: "string"
|
|
}
|
|
}
|
|
});
|
|
defineType("BlockComment", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
value: {
|
|
type: "string"
|
|
}
|
|
}
|
|
});
|
|
defineType("Data", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
memoryIndex: {
|
|
type: "Memidx"
|
|
},
|
|
offset: {
|
|
type: "Instruction"
|
|
},
|
|
init: {
|
|
type: "ByteArray"
|
|
}
|
|
}
|
|
});
|
|
defineType("Global", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
globalType: {
|
|
type: "GlobalType"
|
|
},
|
|
init: {
|
|
array: true,
|
|
type: "Instruction"
|
|
},
|
|
name: {
|
|
maybe: true,
|
|
type: "Identifier"
|
|
}
|
|
}
|
|
});
|
|
defineType("Table", {
|
|
unionType: ["Node", "ImportDescr"],
|
|
fields: {
|
|
elementType: {
|
|
type: "TableElementType"
|
|
},
|
|
limits: {
|
|
assertNodeType: true,
|
|
type: "Limit"
|
|
},
|
|
name: {
|
|
maybe: true,
|
|
type: "Identifier"
|
|
},
|
|
elements: {
|
|
array: true,
|
|
optional: true,
|
|
type: "Index"
|
|
}
|
|
}
|
|
});
|
|
defineType("Memory", {
|
|
unionType: ["Node", "ImportDescr"],
|
|
fields: {
|
|
limits: {
|
|
type: "Limit"
|
|
},
|
|
id: {
|
|
maybe: true,
|
|
type: "Index"
|
|
}
|
|
}
|
|
});
|
|
defineType("FuncImportDescr", {
|
|
unionType: ["Node", "ImportDescr"],
|
|
fields: {
|
|
id: {
|
|
type: "Identifier"
|
|
},
|
|
signature: {
|
|
type: "Signature"
|
|
}
|
|
}
|
|
});
|
|
defineType("ModuleImport", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
module: {
|
|
type: "string"
|
|
},
|
|
name: {
|
|
type: "string"
|
|
},
|
|
descr: {
|
|
type: "ImportDescr"
|
|
}
|
|
}
|
|
});
|
|
defineType("ModuleExportDescr", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
exportType: {
|
|
type: "ExportDescrType"
|
|
},
|
|
id: {
|
|
type: "Index"
|
|
}
|
|
}
|
|
});
|
|
defineType("ModuleExport", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
name: {
|
|
type: "string"
|
|
},
|
|
descr: {
|
|
type: "ModuleExportDescr"
|
|
}
|
|
}
|
|
});
|
|
defineType("Limit", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
min: {
|
|
type: "number"
|
|
},
|
|
max: {
|
|
optional: true,
|
|
type: "number"
|
|
}
|
|
}
|
|
});
|
|
defineType("Signature", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
params: {
|
|
array: true,
|
|
type: "FuncParam"
|
|
},
|
|
results: {
|
|
array: true,
|
|
type: "Valtype"
|
|
}
|
|
}
|
|
});
|
|
defineType("Program", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
body: {
|
|
array: true,
|
|
type: "Node"
|
|
}
|
|
}
|
|
});
|
|
defineType("Identifier", {
|
|
unionType: ["Node", "Expression"],
|
|
fields: {
|
|
value: {
|
|
type: "string"
|
|
},
|
|
raw: {
|
|
optional: true,
|
|
type: "string"
|
|
}
|
|
}
|
|
});
|
|
defineType("BlockInstruction", {
|
|
unionType: ["Node", "Block", "Instruction"],
|
|
fields: {
|
|
id: {
|
|
constant: true,
|
|
type: "string",
|
|
value: "block"
|
|
},
|
|
label: {
|
|
maybe: true,
|
|
type: "Identifier"
|
|
},
|
|
instr: {
|
|
array: true,
|
|
type: "Instruction"
|
|
},
|
|
result: {
|
|
maybe: true,
|
|
type: "Valtype"
|
|
}
|
|
}
|
|
});
|
|
defineType("CallInstruction", {
|
|
unionType: ["Node", "Instruction"],
|
|
fields: {
|
|
id: {
|
|
constant: true,
|
|
type: "string",
|
|
value: "call"
|
|
},
|
|
index: {
|
|
type: "Index"
|
|
},
|
|
instrArgs: {
|
|
array: true,
|
|
optional: true,
|
|
type: "Expression"
|
|
},
|
|
numeric: {
|
|
type: "Index",
|
|
optional: true
|
|
}
|
|
}
|
|
});
|
|
defineType("CallIndirectInstruction", {
|
|
unionType: ["Node", "Instruction"],
|
|
fields: {
|
|
id: {
|
|
constant: true,
|
|
type: "string",
|
|
value: "call_indirect"
|
|
},
|
|
signature: {
|
|
type: "SignatureOrTypeRef"
|
|
},
|
|
intrs: {
|
|
array: true,
|
|
optional: true,
|
|
type: "Expression"
|
|
}
|
|
}
|
|
});
|
|
defineType("ByteArray", {
|
|
unionType: ["Node"],
|
|
fields: {
|
|
values: {
|
|
array: true,
|
|
type: "Byte"
|
|
}
|
|
}
|
|
});
|
|
defineType("Func", {
|
|
unionType: ["Node", "Block"],
|
|
fields: {
|
|
name: {
|
|
maybe: true,
|
|
type: "Index"
|
|
},
|
|
signature: {
|
|
type: "SignatureOrTypeRef"
|
|
},
|
|
body: {
|
|
array: true,
|
|
type: "Instruction"
|
|
},
|
|
isExternal: {
|
|
comment: "means that it has been imported from the outside js",
|
|
optional: true,
|
|
type: "boolean"
|
|
},
|
|
metadata: {
|
|
optional: true,
|
|
type: "FuncMetadata"
|
|
}
|
|
}
|
|
});
|
|
/**
|
|
* Intrinsics
|
|
*/
|
|
|
|
defineType("InternalBrUnless", {
|
|
unionType: ["Node", "Intrinsic"],
|
|
fields: {
|
|
target: {
|
|
type: "number"
|
|
}
|
|
}
|
|
});
|
|
defineType("InternalGoto", {
|
|
unionType: ["Node", "Intrinsic"],
|
|
fields: {
|
|
target: {
|
|
type: "number"
|
|
}
|
|
}
|
|
});
|
|
defineType("InternalCallExtern", {
|
|
unionType: ["Node", "Intrinsic"],
|
|
fields: {
|
|
target: {
|
|
type: "number"
|
|
}
|
|
}
|
|
}); // function bodies are terminated by an `end` instruction but are missing a
|
|
// return instruction
|
|
//
|
|
// Since we can't inject a new instruction we are injecting a new instruction.
|
|
|
|
defineType("InternalEndAndReturn", {
|
|
unionType: ["Node", "Intrinsic"],
|
|
fields: {}
|
|
});
|
|
module.exports = definitions; |