@@ -297,6 +297,19 @@ enum class TypeEntryKind {
297297 Array,
298298};
299299
300+ struct TypeEntryGCTypeExtension {
301+ TypeEntryGCTypeExtension (bool is_final_sub_type)
302+ : is_final_sub_type(is_final_sub_type) {}
303+
304+ void InitSubTypes (Index* sub_type_list, Index sub_type_count);
305+
306+ bool is_final_sub_type;
307+ // The binary/text format allows any number of subtypes,
308+ // so parsers must handle them. The validator rejects
309+ // lists which size is greater than 1.
310+ VarVector sub_types;
311+ };
312+
300313class TypeEntry {
301314 public:
302315 WABT_DISALLOW_COPY_AND_ASSIGN (TypeEntry);
@@ -307,12 +320,17 @@ class TypeEntry {
307320
308321 Location loc;
309322 std::string name;
323+ TypeEntryGCTypeExtension gc_ext;
310324
311325 protected:
312326 explicit TypeEntry (TypeEntryKind kind,
327+ bool is_final_sub_type,
313328 std::string_view name = std::string_view(),
314329 const Location& loc = Location())
315- : loc(loc), name(name), kind_(kind) {}
330+ : loc(loc),
331+ name(name),
332+ gc_ext(is_final_sub_type),
333+ kind_(kind) {}
316334
317335 TypeEntryKind kind_;
318336};
@@ -323,8 +341,8 @@ class FuncType : public TypeEntry {
323341 return entry->kind () == TypeEntryKind::Func;
324342 }
325343
326- explicit FuncType (std::string_view name = std::string_view())
327- : TypeEntry(TypeEntryKind::Func, name) {}
344+ explicit FuncType (bool is_final_sub_type, std::string_view name = std::string_view())
345+ : TypeEntry(TypeEntryKind::Func, is_final_sub_type, name) {}
328346
329347 Index GetNumParams () const { return sig.GetNumParams (); }
330348 Index GetNumResults () const { return sig.GetNumResults (); }
@@ -353,8 +371,8 @@ class StructType : public TypeEntry {
353371 return entry->kind () == TypeEntryKind::Struct;
354372 }
355373
356- explicit StructType (std::string_view name = std::string_view())
357- : TypeEntry(TypeEntryKind::Struct) {}
374+ explicit StructType (bool is_final_sub_type, std::string_view name = std::string_view())
375+ : TypeEntry(TypeEntryKind::Struct, is_final_sub_type, name ) {}
358376
359377 std::vector<Field> fields;
360378};
@@ -365,12 +383,19 @@ class ArrayType : public TypeEntry {
365383 return entry->kind () == TypeEntryKind::Array;
366384 }
367385
368- explicit ArrayType (std::string_view name = std::string_view())
369- : TypeEntry(TypeEntryKind::Array) {}
386+ explicit ArrayType (bool is_final_sub_type, std::string_view name = std::string_view())
387+ : TypeEntry(TypeEntryKind::Array, is_final_sub_type, name ) {}
370388
371389 Field field;
372390};
373391
392+ struct RecursiveRange {
393+ Index first_type_index;
394+ Index type_count;
395+
396+ Index EndTypeIndex () const { return first_type_index + type_count; }
397+ };
398+
374399struct FuncDeclaration {
375400 Index GetNumParams () const { return sig.GetNumParams (); }
376401 Index GetNumResults () const { return sig.GetNumResults (); }
@@ -1107,7 +1132,8 @@ enum class ModuleFieldType {
11071132 Memory,
11081133 DataSegment,
11091134 Start,
1110- Tag
1135+ Tag,
1136+ EmptyRec
11111137};
11121138
11131139class ModuleField : public intrusive_list_base <ModuleField> {
@@ -1234,6 +1260,12 @@ class TagModuleField : public ModuleFieldMixin<ModuleFieldType::Tag> {
12341260 Tag tag;
12351261};
12361262
1263+ class EmptyRecModuleField : public ModuleFieldMixin <ModuleFieldType::EmptyRec> {
1264+ public:
1265+ explicit EmptyRecModuleField (const Location& loc = Location())
1266+ : ModuleFieldMixin<ModuleFieldType::EmptyRec>(loc) {}
1267+ };
1268+
12371269class StartModuleField : public ModuleFieldMixin <ModuleFieldType::Start> {
12381270 public:
12391271 explicit StartModuleField (Var start = Var(), const Location& loc = Location())
@@ -1293,6 +1325,7 @@ struct Module {
12931325 void AppendField (std::unique_ptr<ExportModuleField>);
12941326 void AppendField (std::unique_ptr<FuncModuleField>);
12951327 void AppendField (std::unique_ptr<TypeModuleField>);
1328+ void AppendField (std::unique_ptr<EmptyRecModuleField>);
12961329 void AppendField (std::unique_ptr<GlobalModuleField>);
12971330 void AppendField (std::unique_ptr<ImportModuleField>);
12981331 void AppendField (std::unique_ptr<MemoryModuleField>);
@@ -1319,6 +1352,8 @@ struct Module {
13191352 std::vector<Import*> imports;
13201353 std::vector<Export*> exports;
13211354 std::vector<TypeEntry*> types;
1355+ // Ordered list of recursive ranges.
1356+ std::vector<RecursiveRange> recursive_ranges;
13221357 std::vector<Table*> tables;
13231358 std::vector<ElemSegment*> elem_segments;
13241359 std::vector<Memory*> memories;
0 commit comments