diff --git a/upb/mini_descriptor/decode.c b/upb/mini_descriptor/decode.c index 7b56c7d8d99aa..db15ae9a0ee87 100644 --- a/upb/mini_descriptor/decode.c +++ b/upb/mini_descriptor/decode.c @@ -824,8 +824,11 @@ static upb_MiniTable* upb_MtDecoder_DoBuildMiniTableWithBuf( #if UPB_FASTTABLE upb_DecodeFast_TableEntry fasttable[32]; - int fasttable_size = upb_DecodeFast_BuildTable(&decoder->table, fasttable); - mt_size += fasttable_size * sizeof(fasttable[0]); + int fasttable_size = 0; + if (decoder->platform == kUpb_MiniTablePlatform_64Bit) { + fasttable_size = upb_DecodeFast_BuildTable(&decoder->table, fasttable); + mt_size += fasttable_size * sizeof(fasttable[0]); + } #endif upb_MiniTable* ret = upb_Arena_Malloc(decoder->arena, mt_size); diff --git a/upb/mini_descriptor/internal/encode_test.cc b/upb/mini_descriptor/internal/encode_test.cc index 92765d01354dd..124ce66364ce7 100644 --- a/upb/mini_descriptor/internal/encode_test.cc +++ b/upb/mini_descriptor/internal/encode_test.cc @@ -339,3 +339,22 @@ TEST_P(MiniTableTest, Extendible) { EXPECT_EQ(kUpb_ExtMode_Extendable, table->UPB_PRIVATE(ext) & kUpb_ExtMode_Extendable); } + +TEST(MiniTableTest, Build32BitMiniTableWithSubmessagesNoFastTableAssert) { + upb::Arena arena; + upb::MtDataEncoder e; + + ASSERT_TRUE(e.StartMessage(0)); + ASSERT_TRUE(e.PutField(kUpb_FieldType_Message, 1, 0)); + ASSERT_TRUE(e.PutField(kUpb_FieldType_Message, 2, 0)); + ASSERT_TRUE(e.PutField(kUpb_FieldType_Message, 3, 0)); + + upb::Status status; + upb_MiniTable* table = _upb_MiniTable_Build(e.data().data(), e.data().size(), + kUpb_MiniTablePlatform_32Bit, + arena.ptr(), status.ptr()); + + ASSERT_NE(nullptr, table) << status.error_message(); + EXPECT_EQ(3, upb_MiniTable_FieldCount(table)); + EXPECT_EQ(0xff, table->UPB_PRIVATE(table_mask)); +}