public TableType(BinaryReader reader)
            {
                sbyte type = LEB128.ReadInt7(reader);

                if (type != (int)WebAssemblyType.anyfunc)
                {
                    throw new Exception($"File is invalid. Expected byte '{WebAssemblyType.anyfunc}', received '{type}'.");
                }
                element_type = WebAssemblyType.anyfunc;
                limits       = new ResizeLimit(reader);
            }
        public void ReadTest(MemoryStream stream)
        {
            BinaryReader reader = new BinaryReader(stream);

            Assert.AreEqual(LEB128.ReadUInt32(reader), 0xFF00FF00u);
            Assert.AreEqual(LEB128.ReadUInt32(reader), 0xAABBAAu);
            Assert.AreEqual(LEB128.ReadUInt32(reader), 0xCCu);
            Assert.AreEqual(LEB128.ReadUInt7(reader), 0x11u);
            Assert.AreEqual(LEB128.ReadUInt7(reader), 0x7Fu);
            Assert.AreEqual(LEB128.ReadInt32(reader), 0x7F00FF00);
            Assert.AreEqual(LEB128.ReadInt32(reader), 0xAABBAA);
            Assert.AreEqual(LEB128.ReadInt32(reader), 0xCC);
            Assert.AreEqual(LEB128.ReadInt32(reader), -1);
            Assert.AreEqual(LEB128.ReadInt7(reader), 0x11);
            Assert.AreEqual(LEB128.ReadInt7(reader), -1);
        }
            public FuncType(BinaryReader reader)
            {
                int form = LEB128.ReadInt7(reader);

                if (form != (int)WebAssemblyType.func)
                {
                    throw new Exception($"File is invalid. Expected byte '{WebAssemblyType.func}', received '{form}'.");
                }

                uint param_count = LEB128.ReadUInt32(reader);

                if (param_count > int.MaxValue)
                {
                    throw new NotImplementedException($"Count larger than {int.MaxValue} bytes not supported.");
                }
                param_types = new WebAssemblyType[param_count];

                for (uint i = 0; i < param_count; i++)
                {
                    param_types[i] = (WebAssemblyType)LEB128.ReadInt7(reader);
                    if (!WebAssemblyHelper.IsValueType(param_types[i]))
                    {
                        throw new Exception($"File is invalid. Expected valid value type, received '{param_types[i]}'.");
                    }
                }

                int return_count = LEB128.ReadInt7(reader);

                if (return_count != 0 && return_count != 1)
                {
                    throw new Exception($"File is invalid. Expected byte 0 or 1, received {return_count}.");
                }

                if (return_count == 1)
                {
                    return_type = (WebAssemblyType)LEB128.ReadInt7(reader);
                    if (!WebAssemblyHelper.IsValueType((WebAssemblyType)return_type))
                    {
                        throw new Exception($"File is invalid. Expected valid value type, received '{return_type}'.");
                    }
                }
            }