You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
668 lines
11 KiB
668 lines
11 KiB
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" |
|
}, |
|
// Threads proposal, shared memory |
|
shared: { |
|
optional: true, |
|
type: "boolean" |
|
} |
|
} |
|
}); |
|
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; |