Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
add missing file
  • Loading branch information
tlively committed Jun 12, 2024
commit d24572143eab78cfccbd2a0033003dc75950b902
97 changes: 97 additions & 0 deletions src/parser/wat-parser-internal.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
/*
* Copyright 2024 WebAssembly Community Group participants
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#include "contexts.h"
#include "parsers.h"

#ifndef parser_wat_parser_internal_h
#define parser_wat_parser_internal_h

namespace wasm::WATParser {

Result<> parseDecls(ParseDeclsCtx& decls);

Result<> parseTypeDefs(
ParseDeclsCtx& decls,
Lexer& input,
IndexMap& typeIndices,
std::vector<HeapType>& types,
std::unordered_map<HeapType, std::unordered_map<Name, Index>>& typeNames);

Result<>
parseImplicitTypeDefs(ParseDeclsCtx& decls,
Lexer& input,
IndexMap& typeIndices,
std::vector<HeapType>& types,
std::unordered_map<Index, HeapType>& implicitTypes);

Result<> parseModuleTypes(ParseDeclsCtx& decls,
Lexer& input,
IndexMap& typeIndices,
std::vector<HeapType>& types,
std::unordered_map<Index, HeapType>& implicitTypes);

Result<> parseDefinitions(
ParseDeclsCtx& decls,
Lexer& input,
IndexMap& typeIndices,
std::vector<HeapType>& types,
std::unordered_map<Index, HeapType>& implicitTypes,
std::unordered_map<HeapType, std::unordered_map<Name, Index>>& typeNames);

// RAII utility for temporarily changing the parsing position of a parsing
// context.
template<typename Ctx> struct WithPosition {
Ctx& ctx;
Index original;
std::vector<Annotation> annotations;

WithPosition(Ctx& ctx, Index pos)
: ctx(ctx), original(ctx.in.getPos()),
annotations(ctx.in.takeAnnotations()) {
ctx.in.setPos(pos);
}

~WithPosition() {
ctx.in.setPos(original);
ctx.in.setAnnotations(std::move(annotations));
}
};

template<typename Ctx>
Result<> parseDefs(Ctx& ctx,
const std::vector<DefPos>& defs,
MaybeResult<> (*parser)(Ctx&)) {
for (auto& def : defs) {
ctx.index = def.index;
WithPosition with(ctx, def.pos);
if (auto parsed = parser(ctx)) {
CHECK_ERR(parsed);
} else {
auto im = import_(ctx);
assert(im);
CHECK_ERR(im);
}
}
return Ok{};
}

// Deduction guide to satisfy -Wctad-maybe-unsupported.
template<typename Ctx> WithPosition(Ctx& ctx, Index) -> WithPosition<Ctx>;

} // namespace wasm::WATParser

#endif // parser_wat_parser_internal_h