| Index: src/wasm/module-decoder.cc | 
| diff --git a/src/wasm/module-decoder.cc b/src/wasm/module-decoder.cc | 
| index 10f2f31790697c792e5f31550f989a006b15dcf1..2a4752e0f6f5771c32bdb798bed18af1bea4e04b 100644 | 
| --- a/src/wasm/module-decoder.cc | 
| +++ b/src/wasm/module-decoder.cc | 
| @@ -1268,6 +1268,36 @@ AsmJsOffsetsResult DecodeAsmJsOffsets(const byte* tables_start, | 
| return decoder.toResult(std::move(table)); | 
| } | 
|  | 
| +std::vector<CustomSectionOffset> DecodeCustomSections(const byte* start, | 
| +                                                      const byte* end) { | 
| +  Decoder decoder(start, end); | 
| +  decoder.consume_bytes(4, "wasm magic"); | 
| +  decoder.consume_bytes(4, "wasm version"); | 
| + | 
| +  std::vector<CustomSectionOffset> result; | 
| + | 
| +  while (decoder.more()) { | 
| +    byte section_code = decoder.consume_u8("section code"); | 
| +    uint32_t section_length = decoder.consume_u32v("section length"); | 
| +    uint32_t section_start = decoder.pc_offset(); | 
| +    if (section_code != 0) { | 
| +      // Skip known sections. | 
| +      decoder.consume_bytes(section_length, "section bytes"); | 
| +      continue; | 
| +    } | 
| +    uint32_t name_length = decoder.consume_u32v("name length"); | 
| +    uint32_t name_offset = decoder.pc_offset(); | 
| +    decoder.consume_bytes(name_length, "section name"); | 
| +    uint32_t payload_offset = decoder.pc_offset(); | 
| +    uint32_t payload_length = section_length - (payload_offset - section_start); | 
| +    decoder.consume_bytes(payload_length); | 
| +    result.push_back({section_start, name_offset, name_length, payload_offset, | 
| +                      payload_length, section_length}); | 
| +  } | 
| + | 
| +  return result; | 
| +} | 
| + | 
| }  // namespace wasm | 
| }  // namespace internal | 
| }  // namespace v8 | 
|  |