668 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			668 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"
 | |
|     },
 | |
|     // 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; |