Example #1
0
        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));
        }
Example #2
0
        /// <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;
            }
        }