Skip to content

Commit 5efa505

Browse files
[NFC] Extract out function for parseModuleBody (#8080)
For use in #8058. In some cases (e.g. for parsing `(module definition ...)`), we want to parse the body of a module without the initial `(module name? ...)` S-expression. `parseModule` parses *either* the full `(module ...)` S-expression or just the module body since some cases consist only of a module body. Add `parseModuleBody` which only parses the module body.
1 parent d8ec1e0 commit 5efa505

File tree

5 files changed

+61
-28
lines changed

5 files changed

+61
-28
lines changed

src/parser/parse-1-decls.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
namespace wasm::WATParser {
2020

21-
Result<> parseDecls(ParseDeclsCtx& decls) { return module(decls); }
21+
Result<> parseModule(ParseDeclsCtx& decls) { return module(decls); }
22+
23+
Result<> parseModuleBody(ParseDeclsCtx& decls) { return moduleBody(decls); }
2224

2325
} // namespace wasm::WATParser

src/parser/parsers.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3882,6 +3882,15 @@ template<typename Ctx> MaybeResult<> modulefield(Ctx& ctx) {
38823882
return ctx.in.err("unrecognized module field");
38833883
}
38843884

3885+
// (m:modulefield)*
3886+
template<typename Ctx> Result<> moduleBody(Ctx& ctx) {
3887+
while (auto field = modulefield(ctx)) {
3888+
CHECK_ERR(field);
3889+
}
3890+
3891+
return Ok{};
3892+
}
3893+
38853894
// module ::= '(' 'module' id? (m:modulefield)* ')'
38863895
// | (m:modulefield)* eof
38873896
template<typename Ctx> Result<> module(Ctx& ctx) {
@@ -3893,9 +3902,7 @@ template<typename Ctx> Result<> module(Ctx& ctx) {
38933902
}
38943903
}
38953904

3896-
while (auto field = modulefield(ctx)) {
3897-
CHECK_ERR(field);
3898-
}
3905+
CHECK_ERR(moduleBody(ctx));
38993906

39003907
if (outer && !ctx.in.takeRParen()) {
39013908
return ctx.in.err("expected end of module");

src/parser/wat-parser-internal.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222

2323
namespace wasm::WATParser {
2424

25-
Result<> parseDecls(ParseDeclsCtx& decls);
25+
Result<> parseModule(ParseDeclsCtx& decls);
26+
27+
Result<> parseModuleBody(ParseDeclsCtx& decls);
2628

2729
Result<> parseTypeDefs(
2830
ParseDeclsCtx& decls,

src/parser/wat-parser.cpp

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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

124129
Result<> 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

131136
Result<> 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

136141
Result<> 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

src/parser/wat-parser.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ Result<> parseModule(Module& wasm,
3434
// file.
3535
Result<> parseModule(Module& wasm, Lexer& lexer);
3636

37+
// Similar to `parseModule`, parse the fields of a single WAT module (after the
38+
// initial module definition including its name) and stop at the ending right
39+
// paren.
40+
Result<> parseModuleBody(Module& wasm, Lexer& lexer);
41+
3742
Result<Literal> parseConst(Lexer& lexer);
3843

3944
#pragma GCC diagnostic push

0 commit comments

Comments
 (0)