public IWasmicSyntaxTree ParseText(string text) { var lexer = new WasmicLexer(text); var functionMap = new FunctionMap(); var functions = new List <IWasmicSyntaxTree>(); var functionDefinitionGenerator = new FunctionDefinitionParser(); var heap = new LinearHeap(); while (lexer.Next.TokenType != TokenType.EndOfText) { switch (lexer.Next.TokenType) { case TokenType.Extern: lexer.Advance(); // eat extern var functionDefinition = functionDefinitionGenerator.Generate(lexer); functionMap.Add(functionDefinition); functions.Add(new Import(functionDefinition.Name.Split('.'), functionDefinition)); break; default: var functionGenerator = new FunctionParser( lexer, functionMap, functionDefinitionGenerator, heap ); var function = functionGenerator.GetFunction(); functions.Add(function); break; } if (lexer.Next.TokenType == TokenType.SemiColon) { lexer.Advance(); } } if (heap.IsAllocated) { functions = new[] { new Memory() } .Concat(heap.GetAllocatedStrings().Select(v => new Data(v.offset, v.value) as IWasmicSyntaxTree)) .Concat(functions).ToList(); } return(new Module(functions)); }
/// <summary> /// /// </summary> /// <param name="cs"></param> public NameSection(CustomSection cs) { var stream = new MemoryStream((byte[])cs.Content); var reader = new Reader(stream); var previousSection = NameSubsection.Module; var preSectionOffset = reader.Offset; while (reader.TryReadVarUInt7(out var id)) //At points where TryRead is used, the stream can safely end. { if (id != 0 && (NameSubsection)id < previousSection) { throw new ModuleLoadException($"Sections out of order; section {(NameSubsection)id} encounterd after {previousSection}.", preSectionOffset); } var payloadLength = reader.ReadVarUInt32(); switch ((NameSubsection)id) { case NameSubsection.Module: { var nameLength = reader.ReadVarUInt32(); Name = reader.ReadString(nameLength); } break; case NameSubsection.Function: { var count = reader.ReadVarUInt32(); Functions = new FunctionMap((int)count); for (int i = 0; i < count; i++) { var index = reader.ReadVarUInt32(); var nameLength = reader.ReadVarUInt32(); var name = reader.ReadString(nameLength); Functions.Add(index, name); } } break; case NameSubsection.Local: { var fun_count = reader.ReadVarUInt32(); Locals = new LocalMap((int)fun_count); for (int f = 0; f < fun_count; f++) { var fun_index = reader.ReadVarUInt32(); var count = reader.ReadVarUInt32(); var nameMap = new NameMap((int)count); Locals.Add(fun_index, nameMap); for (int i = 0; i < count; i++) { var index = reader.ReadVarUInt32(); var nameLength = reader.ReadVarUInt32(); var name = reader.ReadString(nameLength); nameMap.Add(index, name); } } } break; } previousSection = (NameSubsection)id; } }