Skip to content

Commit 106b908

Browse files
committed
fix pb.types() iteration
1 parent acde663 commit 106b908

File tree

3 files changed

+26
-9
lines changed

3 files changed

+26
-9
lines changed

pb.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -1177,8 +1177,7 @@ static int Lpb_typesiter(lua_State *L) {
11771177
pb_Type *t = lpb_type(S, lua_tostring(L, 2));
11781178
if ((t == NULL && !lua_isnoneornil(L, 2)))
11791179
return 0;
1180-
while (pb_nexttype(S, &t) && t->field_count == 0)
1181-
continue;
1180+
pb_nexttype(S, &t);
11821181
return lpb_pushtype(L, t);
11831182
}
11841183

pb.h

+13-7
Original file line numberDiff line numberDiff line change
@@ -305,10 +305,11 @@ struct pb_Type {
305305
pb_Table field_tags;
306306
pb_Table field_names;
307307
pb_Table oneof_index;
308-
unsigned field_count : 29;
308+
unsigned field_count : 28;
309309
unsigned is_enum : 1;
310310
unsigned is_map : 1;
311311
unsigned is_proto3 : 1;
312+
unsigned is_dead : 1;
312313
};
313314

314315

@@ -1093,7 +1094,7 @@ PB_API pb_Type *pb_type(pb_State *S, pb_Name *tname) {
10931094
pb_TypeEntry *te = NULL;
10941095
if (S != NULL && tname != NULL)
10951096
te = (pb_TypeEntry*)pb_gettable(&S->types, (pb_Key)tname);
1096-
return te ? te->value : NULL;
1097+
return te && !te->value->is_dead ? te->value : NULL;
10971098
}
10981099

10991100
PB_API pb_Field *pb_fname(pb_Type *t, pb_Name *name) {
@@ -1115,7 +1116,7 @@ PB_API int pb_nexttype(pb_State *S, pb_Type **ptype) {
11151116
if (*ptype != NULL)
11161117
e = (pb_TypeEntry*)pb_gettable(&S->types, (pb_Key)(*ptype)->name);
11171118
while (pb_nextentry(&S->types, (pb_Entry**)&e))
1118-
if ((*ptype = e->value) != NULL)
1119+
if ((*ptype = e->value) != NULL && !(*ptype)->is_dead)
11191120
return 1;
11201121
}
11211122
*ptype = NULL;
@@ -1164,7 +1165,10 @@ PB_API pb_Type *pb_newtype(pb_State *S, pb_Name *tname) {
11641165
&S->types, (pb_Key)tname);
11651166
pb_Type *t;
11661167
if (te == NULL) return NULL;
1167-
if ((t = te->value) != NULL) return t;
1168+
if ((t = te->value) != NULL) {
1169+
t->is_dead = 0;
1170+
return t;
1171+
}
11681172
if (!(t = (pb_Type*)pb_poolalloc(&S->typepool))) return NULL;
11691173
pbT_inittype(t);
11701174
t->name = tname;
@@ -1194,6 +1198,7 @@ PB_API void pb_deltype(pb_State *S, pb_Type *t) {
11941198
pb_freetable(&t->field_names);
11951199
pb_freetable(&t->oneof_index);
11961200
t->field_count = 0;
1201+
t->is_dead = 1;
11971202
/*pb_delname(S, t->name); */
11981203
/*pb_poolfree(&S->typepool, t); */
11991204
}
@@ -1575,11 +1580,12 @@ static void pbL_loadField(pb_State *S, pbL_FieldInfo *info, pb_Loader *L, pb_Typ
15751580
f->scalar = f->type == NULL;
15761581
if (info->oneof_index != 0) {
15771582
pb_OneofEntry *fe, *e = (pb_OneofEntry*)pb_gettable(&t->oneof_index,
1578-
info->oneof_index);
1583+
info->oneof_index), saved;
15791584
if (e != NULL) {
1585+
saved = *e;
15801586
fe = (pb_OneofEntry*)pb_settable(&t->oneof_index, (pb_Key)f);
1581-
fe->name = pb_usename(e->name);
1582-
fe->index = e->index;
1587+
fe->name = pb_usename(saved.name);
1588+
fe->index = saved.index;
15831589
}
15841590
}
15851591
}

test.lua

+12
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,7 @@ end
486486

487487
function _G.test_packed()
488488
check_load [[
489+
message Empty {}
489490
message TestPacked {
490491
repeated int64 packs = 1 [packed=true];
491492
} ]]
@@ -497,10 +498,21 @@ function _G.test_packed()
497498
fail("table expected at field 'packs', got boolean",
498499
function() pb.encode("TestPacked", { packs = true }) end)
499500

501+
local hasEmpty
502+
for _, name in pb.types() do
503+
if name == "Empty" then
504+
hasEmpty = true
505+
break
506+
end
507+
end
508+
assert(hasEmpty)
509+
500510
pb.clear "TestPacked"
511+
pb.clear "Empty"
501512
eq(pb.type("TestPacked"), nil)
502513
for _, name in pb.types() do
503514
assert(name ~= "TestPacked", name)
515+
assert(name ~= "Empty", name)
504516
end
505517
eq(pb.types()(nil, "not-exists"), nil)
506518

0 commit comments

Comments
 (0)