Skip to content

Commit 4470a3c

Browse files
Address PR comments about parsing, style
1 parent 077f174 commit 4470a3c

File tree

6 files changed

+62
-35
lines changed

6 files changed

+62
-35
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
@@ -3881,6 +3881,15 @@ template<typename Ctx> MaybeResult<> modulefield(Ctx& ctx) {
38813881
return ctx.in.err("unrecognized module field");
38823882
}
38833883

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

3895-
while (auto field = modulefield(ctx)) {
3896-
CHECK_ERR(field);
3897-
}
3904+
CHECK_ERR(moduleBody(ctx));
38983905

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

src/parser/wast-parser.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -485,11 +485,11 @@ MaybeResult<ModuleInstantiation> instantiation(Lexer& in) {
485485
}
486486

487487
auto instanceId = in.takeID();
488-
if (!instanceId.has_value()) {
488+
if (!instanceId) {
489489
return in.err("expected an instance id in module instantiation");
490490
}
491491
auto moduleId = in.takeID();
492-
if (!moduleId.has_value()) {
492+
if (!moduleId) {
493493
return in.err("expected a module id in module instantiation");
494494
}
495495

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: 43 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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

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

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

136157
Result<> parseModule(Module& wasm, Lexer& lexer) {
137-
return doParseModule(wasm, lexer, true);
158+
return doParseModule(wasm, lexer, /*allowExtra=*/true);
138159
}
139160

140161
Result<> parseModuleBody(Module& wasm, Lexer& lexer) {
141-
return doParseModule(wasm, lexer, true);
162+
return doParseModuleBody(wasm, lexer, /*allowExtra=*/true);
142163
}
143164

144165
} // namespace wasm::WATParser

src/tools/wasm-shell.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,7 @@ struct Shell {
137137
return Ok{};
138138
}
139139

140-
using InstanceInfo = std::pair<std::shared_ptr<ShellExternalInterface>,
141-
std::shared_ptr<ModuleRunner>>;
142-
143140
Result<> instantiate(Module& wasm, Name instanceName) {
144-
145141
std::shared_ptr<ShellExternalInterface> interface;
146142
std::shared_ptr<ModuleRunner> instance;
147143
try {
@@ -179,8 +175,7 @@ struct Shell {
179175
}
180176

181177
Result<> addRegistration(Register& reg) {
182-
wasm::Name instanceName =
183-
reg.instanceName.has_value() ? *reg.instanceName : lastModule;
178+
Name instanceName = reg.instanceName ? *reg.instanceName : lastModule;
184179

185180
auto instance = instances[instanceName];
186181
if (!instance) {

0 commit comments

Comments
 (0)