@@ -83,37 +83,58 @@ void propagateDebugLocations(Module& wasm) {
8383 runner.run ();
8484}
8585
86- // Parse module-level declarations.
86+ // After doing the initial pass, parse types, imports, et.c
87+ Result<> parseModuleWithDecls (ParseDeclsCtx& decls) {
88+ auto typeIndices = createIndexMap (decls.in , decls.typeDefs );
89+ CHECK_ERR (typeIndices);
90+
91+ std::vector<HeapType> types;
92+ std::unordered_map<HeapType, std::unordered_map<Name, Index>> typeNames;
93+ CHECK_ERR (parseTypeDefs (decls, decls.in , *typeIndices, types, typeNames));
8794
88- // Parse type definitions.
95+ // Parse implicit type definitions and map typeuses without explicit types to
96+ // the correct types.
97+ std::unordered_map<Index, HeapType> implicitTypes;
98+ CHECK_ERR (
99+ parseImplicitTypeDefs (decls, decls.in , *typeIndices, types, implicitTypes));
89100
90- // Parse implicit type definitions and map typeuses without explicit types to
91- // the correct types.
101+ CHECK_ERR (
102+ parseModuleTypes (decls, decls.in , *typeIndices, types, implicitTypes));
103+
104+ CHECK_ERR (parseDefinitions (
105+ decls, decls.in , *typeIndices, types, implicitTypes, typeNames));
106+
107+ propagateDebugLocations (decls.wasm );
108+
109+ return Ok{};
110+ }
92111
93112Result<> doParseModule (Module& wasm, Lexer& input, bool allowExtra) {
94113 ParseDeclsCtx decls (input, wasm);
95- CHECK_ERR (parseDecls (decls));
114+ CHECK_ERR (parseModule (decls));
96115 if (!allowExtra && !decls.in .empty ()) {
97116 return decls.in .err (" Unexpected tokens after module" );
98117 }
99118
100- auto typeIndices = createIndexMap (decls.in , decls.typeDefs );
101- CHECK_ERR (typeIndices);
102-
103- std::vector<HeapType> types;
104- std::unordered_map<HeapType, std::unordered_map<Name, Index>> typeNames;
105- CHECK_ERR (parseTypeDefs (decls, input, *typeIndices, types, typeNames));
119+ CHECK_ERR (parseModuleWithDecls (decls));
106120
107- std::unordered_map<Index, HeapType> implicitTypes;
108- CHECK_ERR (
109- parseImplicitTypeDefs (decls, input, *typeIndices, types, implicitTypes));
121+ // decls / parseModule made a copy of `input`. Advance `input` past the parsed
122+ // module.
123+ input = decls.in ;
124+ return Ok{};
125+ }
110126
111- CHECK_ERR (parseModuleTypes (decls, input, *typeIndices, types, implicitTypes));
127+ Result<> doParseModuleBody (Module& wasm, Lexer& input, bool allowExtra) {
128+ ParseDeclsCtx decls (input, wasm);
129+ CHECK_ERR (parseModuleBody (decls));
130+ if (!allowExtra && !decls.in .empty ()) {
131+ return decls.in .err (" Unexpected tokens after module" );
132+ }
112133
113- CHECK_ERR (parseDefinitions (
114- decls, input, *typeIndices, types, implicitTypes, typeNames));
134+ CHECK_ERR (parseModuleWithDecls (decls));
115135
116- propagateDebugLocations (wasm);
136+ // decls / parseModuleBody made a copy of `input`. Advance `input` past the
137+ // parsed module.
117138 input = decls.in ;
118139
119140 return Ok{};
@@ -125,20 +146,20 @@ Result<> parseModule(Module& wasm,
125146 std::string_view in,
126147 std::optional<std::string> filename) {
127148 Lexer lexer (in, filename);
128- return doParseModule (wasm, lexer, false );
149+ return doParseModule (wasm, lexer, /* allowExtra= */ false );
129150}
130151
131152Result<> parseModule (Module& wasm, std::string_view in) {
132153 Lexer lexer (in);
133- return doParseModule (wasm, lexer, false );
154+ return doParseModule (wasm, lexer, /* allowExtra= */ false );
134155}
135156
136157Result<> parseModule (Module& wasm, Lexer& lexer) {
137- return doParseModule (wasm, lexer, true );
158+ return doParseModule (wasm, lexer, /* allowExtra= */ true );
138159}
139160
140161Result<> parseModuleBody (Module& wasm, Lexer& lexer) {
141- return doParseModule (wasm, lexer, true );
162+ return doParseModuleBody (wasm, lexer, /* allowExtra= */ true );
142163}
143164
144165} // namespace wasm::WATParser
0 commit comments