github.com/bananabytelabs/wazero@v0.0.0-20240105073314-54b22a776da8/internal/testing/binaryencoding/section.go (about)

     1  package binaryencoding
     2  
     3  import (
     4  	"github.com/bananabytelabs/wazero/internal/leb128"
     5  	"github.com/bananabytelabs/wazero/internal/wasm"
     6  )
     7  
     8  // encodeSection encodes the sectionID, the size of its contents in bytes, followed by the contents.
     9  // See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#sections%E2%91%A0
    10  func encodeSection(sectionID wasm.SectionID, contents []byte) []byte {
    11  	return append([]byte{sectionID}, encodeSizePrefixed(contents)...)
    12  }
    13  
    14  // encodeTypeSection encodes a wasm.SectionIDType for the given imports in WebAssembly 1.0 (20191205) Binary
    15  // Format.
    16  //
    17  // See EncodeFunctionType
    18  // See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#type-section%E2%91%A0
    19  func encodeTypeSection(types []wasm.FunctionType) []byte {
    20  	contents := leb128.EncodeUint32(uint32(len(types)))
    21  	for i := range types {
    22  		t := &types[i]
    23  		contents = append(contents, EncodeFunctionType(t)...)
    24  	}
    25  	return encodeSection(wasm.SectionIDType, contents)
    26  }
    27  
    28  // encodeImportSection encodes a wasm.SectionIDImport for the given imports in WebAssembly 1.0 (20191205) Binary
    29  // Format.
    30  //
    31  // See EncodeImport
    32  // See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#import-section%E2%91%A0
    33  func encodeImportSection(imports []wasm.Import) []byte {
    34  	contents := leb128.EncodeUint32(uint32(len(imports)))
    35  	for i := range imports {
    36  		imp := &imports[i]
    37  		contents = append(contents, EncodeImport(imp)...)
    38  	}
    39  	return encodeSection(wasm.SectionIDImport, contents)
    40  }
    41  
    42  // EncodeFunctionSection encodes a wasm.SectionIDFunction for the type indices associated with module-defined
    43  // functions in WebAssembly 1.0 (20191205) Binary Format.
    44  //
    45  // See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#function-section%E2%91%A0
    46  func EncodeFunctionSection(typeIndices []wasm.Index) []byte {
    47  	contents := leb128.EncodeUint32(uint32(len(typeIndices)))
    48  	for _, index := range typeIndices {
    49  		contents = append(contents, leb128.EncodeUint32(index)...)
    50  	}
    51  	return encodeSection(wasm.SectionIDFunction, contents)
    52  }
    53  
    54  // encodeCodeSection encodes a wasm.SectionIDCode for the module-defined function in WebAssembly 1.0 (20191205)
    55  // Binary Format.
    56  //
    57  // See encodeCode
    58  // See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#code-section%E2%91%A0
    59  func encodeCodeSection(code []wasm.Code) []byte {
    60  	contents := leb128.EncodeUint32(uint32(len(code)))
    61  	for i := range code {
    62  		c := &code[i]
    63  		contents = append(contents, encodeCode(c)...)
    64  	}
    65  	return encodeSection(wasm.SectionIDCode, contents)
    66  }
    67  
    68  // encodeTableSection encodes a wasm.SectionIDTable for the module-defined function in WebAssembly 1.0
    69  // (20191205) Binary Format.
    70  //
    71  // See EncodeTable
    72  // See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#table-section%E2%91%A0
    73  func encodeTableSection(tables []wasm.Table) []byte {
    74  	var contents []byte = leb128.EncodeUint32(uint32(len(tables)))
    75  	for i := range tables {
    76  		table := &tables[i]
    77  		contents = append(contents, EncodeTable(table)...)
    78  	}
    79  	return encodeSection(wasm.SectionIDTable, contents)
    80  }
    81  
    82  // encodeMemorySection encodes a wasm.SectionIDMemory for the module-defined function in WebAssembly 1.0
    83  // (20191205) Binary Format.
    84  //
    85  // See EncodeMemory
    86  // See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#memory-section%E2%91%A0
    87  func encodeMemorySection(memory *wasm.Memory) []byte {
    88  	contents := append([]byte{1}, EncodeMemory(memory)...)
    89  	return encodeSection(wasm.SectionIDMemory, contents)
    90  }
    91  
    92  // encodeGlobalSection encodes a wasm.SectionIDGlobal for the given globals in WebAssembly 1.0 (20191205) Binary
    93  // Format.
    94  //
    95  // See encodeGlobal
    96  // See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#global-section%E2%91%A0
    97  func encodeGlobalSection(globals []wasm.Global) []byte {
    98  	contents := leb128.EncodeUint32(uint32(len(globals)))
    99  	for _, g := range globals {
   100  		contents = append(contents, encodeGlobal(g)...)
   101  	}
   102  	return encodeSection(wasm.SectionIDGlobal, contents)
   103  }
   104  
   105  // encodeExportSection encodes a wasm.SectionIDExport for the given exports in WebAssembly 1.0 (20191205) Binary
   106  // Format.
   107  //
   108  // See encodeExport
   109  // See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#export-section%E2%91%A0
   110  func encodeExportSection(exports []wasm.Export) []byte {
   111  	contents := leb128.EncodeUint32(uint32(len(exports)))
   112  	for i := range exports {
   113  		e := &exports[i]
   114  		contents = append(contents, encodeExport(e)...)
   115  	}
   116  	return encodeSection(wasm.SectionIDExport, contents)
   117  }
   118  
   119  // EncodeStartSection encodes a wasm.SectionIDStart for the given function index in WebAssembly 1.0 (20191205)
   120  // Binary Format.
   121  //
   122  // See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#start-section%E2%91%A0
   123  func EncodeStartSection(funcidx wasm.Index) []byte {
   124  	return encodeSection(wasm.SectionIDStart, leb128.EncodeUint32(funcidx))
   125  }
   126  
   127  // encodeEelementSection encodes a wasm.SectionIDElement for the elements in WebAssembly 1.0 (20191205)
   128  // Binary Format.
   129  //
   130  // See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#element-section%E2%91%A0
   131  func encodeElementSection(elements []wasm.ElementSegment) []byte {
   132  	contents := leb128.EncodeUint32(uint32(len(elements)))
   133  	for i := range elements {
   134  		e := &elements[i]
   135  		contents = append(contents, encodeElement(e)...)
   136  	}
   137  	return encodeSection(wasm.SectionIDElement, contents)
   138  }
   139  
   140  // encodeDataSection encodes a wasm.SectionIDData for the data in WebAssembly 1.0 (20191205)
   141  // Binary Format.
   142  //
   143  // See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#data-section%E2%91%A0
   144  func encodeDataSection(datum []wasm.DataSegment) []byte {
   145  	contents := leb128.EncodeUint32(uint32(len(datum)))
   146  	for i := range datum {
   147  		d := &datum[i]
   148  		contents = append(contents, encodeDataSegment(d)...)
   149  	}
   150  	return encodeSection(wasm.SectionIDData, contents)
   151  }