@@ -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