From 3640f9c992746867c5cf4cead11077e36a51eb7c Mon Sep 17 00:00:00 2001 From: Thomas Lively Date: Wed, 8 Nov 2023 02:04:41 +0100 Subject: [Parser] Parse `call` and `return_call` (#6086) To support parsing calls, add support for parsing function indices and building calls with IRBuilder. --- src/parser/contexts.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'src/parser/contexts.h') diff --git a/src/parser/contexts.h b/src/parser/contexts.h index eb47dd502..e360a7175 100644 --- a/src/parser/contexts.h +++ b/src/parser/contexts.h @@ -280,6 +280,7 @@ struct NullInstrParserCtx { using ExprT = Ok; using FieldIdxT = Ok; + using FuncIdxT = Ok; using LocalIdxT = Ok; using GlobalIdxT = Ok; using MemoryIdxT = Ok; @@ -296,6 +297,8 @@ struct NullInstrParserCtx { template FieldIdxT getFieldFromName(HeapTypeT, Name) { return Ok{}; } + FuncIdxT getFuncFromIdx(uint32_t) { return Ok{}; } + FuncIdxT getFuncFromName(Name) { return Ok{}; } LocalIdxT getLocalFromIdx(uint32_t) { return Ok{}; } LocalIdxT getLocalFromName(Name) { return Ok{}; } GlobalIdxT getGlobalFromIdx(uint32_t) { return Ok{}; } @@ -378,6 +381,7 @@ struct NullInstrParserCtx { Result<> makeMemoryCopy(Index, MemoryIdxT*, MemoryIdxT*) { return Ok{}; } Result<> makeMemoryFill(Index, MemoryIdxT*) { return Ok{}; } + Result<> makeCall(Index, FuncIdxT, bool) { return Ok{}; } Result<> makeBreak(Index, LabelIdxT) { return Ok{}; } Result<> makeReturn(Index) { return Ok{}; } template Result<> makeRefNull(Index, HeapTypeT) { @@ -802,6 +806,7 @@ struct ParseDefsCtx : TypeParserCtx { using ExprT = Expression*; using FieldIdxT = Index; + using FuncIdxT = Name; using LocalIdxT = Index; using LabelIdxT = Index; using GlobalIdxT = Name; @@ -895,6 +900,20 @@ struct ParseDefsCtx : TypeParserCtx { return idx; } + Result getFuncFromIdx(uint32_t idx) { + if (idx >= wasm.functions.size()) { + return in.err("function index out of bounds"); + } + return wasm.functions[idx]->name; + } + + Result getFuncFromName(Name name) { + if (!wasm.getFunctionOrNull(name)) { + return in.err("function $" + name.toString() + " does not exist"); + } + return name; + } + Result getLocalFromName(Name name) { if (!func) { return in.err("cannot access locals outside of a function"); @@ -1220,6 +1239,10 @@ struct ParseDefsCtx : TypeParserCtx { return withLoc(pos, irBuilder.makeMemoryFill(*m)); } + Result<> makeCall(Index pos, Name func, bool isReturn) { + return withLoc(pos, irBuilder.makeCall(func, isReturn)); + } + Result<> makeBreak(Index pos, Index label) { return withLoc(pos, irBuilder.makeBreak(label)); } -- cgit v1.2.3