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.
		
		
		
		
		
			
		
			
				
					
					
						
							663 lines
						
					
					
						
							11 KiB
						
					
					
				
			
		
		
	
	
							663 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" | 
						|
    } | 
						|
  } | 
						|
}); | 
						|
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; |