@@ -83,58 +83,75 @@ void propagateDebugLocations(Module& wasm) {
8383 runner.run ();
8484}
8585
86- // Parse module-level declarations.
87-
88- // Parse type definitions.
89-
90- // Parse implicit type definitions and map typeuses without explicit types to
91- // the correct types.
92-
93- Result<> doParseModule (Module& wasm, Lexer& input, bool allowExtra) {
94- ParseDeclsCtx decls (input, wasm);
95- CHECK_ERR (parseDecls (decls));
96- if (!allowExtra && !decls.in .empty ()) {
97- return decls.in .err (" Unexpected tokens after module" );
98- }
99-
86+ // After doing the initial pass, parse types, imports, etc.
87+ Result<> parseModuleWithDecls (ParseDeclsCtx& decls) {
10088 auto typeIndices = createIndexMap (decls.in , decls.typeDefs );
10189 CHECK_ERR (typeIndices);
10290
10391 std::vector<HeapType> types;
10492 std::unordered_map<HeapType, std::unordered_map<Name, Index>> typeNames;
105- CHECK_ERR (parseTypeDefs (decls, input , *typeIndices, types, typeNames));
93+ CHECK_ERR (parseTypeDefs (decls, decls. in , *typeIndices, types, typeNames));
10694
95+ // Parse implicit type definitions and map typeuses without explicit types to
96+ // the correct types.
10797 std::unordered_map<Index, HeapType> implicitTypes;
10898 CHECK_ERR (
109- parseImplicitTypeDefs (decls, input , *typeIndices, types, implicitTypes));
99+ parseImplicitTypeDefs (decls, decls. in , *typeIndices, types, implicitTypes));
110100
111- CHECK_ERR (parseModuleTypes (decls, input, *typeIndices, types, implicitTypes));
101+ CHECK_ERR (
102+ parseModuleTypes (decls, decls.in , *typeIndices, types, implicitTypes));
112103
113104 CHECK_ERR (parseDefinitions (
114- decls, input , *typeIndices, types, implicitTypes, typeNames));
105+ decls, decls. in , *typeIndices, types, implicitTypes, typeNames));
115106
116- propagateDebugLocations (wasm);
117- input = decls.in ;
107+ propagateDebugLocations (decls.wasm );
118108
119109 return Ok{};
120110}
121111
112+ Result<> doParseModule (Module& wasm, Lexer& input, bool allowExtra) {
113+ ParseDeclsCtx decls (input, wasm);
114+ CHECK_ERR (parseModule (decls));
115+ if (!allowExtra && !decls.in .empty ()) {
116+ return decls.in .err (" Unexpected tokens after module" );
117+ }
118+
119+ CHECK_ERR (parseModuleWithDecls (decls));
120+
121+ // decls / parseModule made a copy of `input`. Advance `input` past the parsed
122+ // module.
123+ input = decls.in ;
124+ return Ok{};
125+ }
126+
122127} // anonymous namespace
123128
124129Result<> parseModule (Module& wasm,
125130 std::string_view in,
126131 std::optional<std::string> filename) {
127132 Lexer lexer (in, filename);
128- return doParseModule (wasm, lexer, false );
133+ return doParseModule (wasm, lexer, /* allowExtra= */ false );
129134}
130135
131136Result<> parseModule (Module& wasm, std::string_view in) {
132137 Lexer lexer (in);
133- return doParseModule (wasm, lexer, false );
138+ return doParseModule (wasm, lexer, /* allowExtra= */ false );
134139}
135140
136141Result<> parseModule (Module& wasm, Lexer& lexer) {
137- return doParseModule (wasm, lexer, true );
142+ return doParseModule (wasm, lexer, /* allowExtra=*/ true );
143+ }
144+
145+ Result<> parseModuleBody (Module& wasm, Lexer& lexer) {
146+ ParseDeclsCtx decls (lexer, wasm);
147+ CHECK_ERR (parseModuleBody (decls));
148+ CHECK_ERR (parseModuleWithDecls (decls));
149+
150+ // decls / parseModuleBody made a copy of `input`. Advance `input` past the
151+ // parsed module.
152+ lexer = decls.in ;
153+
154+ return Ok{};
138155}
139156
140157} // namespace wasm::WATParser
0 commit comments