@@ -305,10 +305,11 @@ struct pb_Type {
305
305
pb_Table field_tags ;
306
306
pb_Table field_names ;
307
307
pb_Table oneof_index ;
308
- unsigned field_count : 29 ;
308
+ unsigned field_count : 28 ;
309
309
unsigned is_enum : 1 ;
310
310
unsigned is_map : 1 ;
311
311
unsigned is_proto3 : 1 ;
312
+ unsigned is_dead : 1 ;
312
313
};
313
314
314
315
@@ -1093,7 +1094,7 @@ PB_API pb_Type *pb_type(pb_State *S, pb_Name *tname) {
1093
1094
pb_TypeEntry * te = NULL ;
1094
1095
if (S != NULL && tname != NULL )
1095
1096
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 ;
1097
1098
}
1098
1099
1099
1100
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) {
1115
1116
if (* ptype != NULL )
1116
1117
e = (pb_TypeEntry * )pb_gettable (& S -> types , (pb_Key )(* ptype )-> name );
1117
1118
while (pb_nextentry (& S -> types , (pb_Entry * * )& e ))
1118
- if ((* ptype = e -> value ) != NULL )
1119
+ if ((* ptype = e -> value ) != NULL && !( * ptype ) -> is_dead )
1119
1120
return 1 ;
1120
1121
}
1121
1122
* ptype = NULL ;
@@ -1164,7 +1165,10 @@ PB_API pb_Type *pb_newtype(pb_State *S, pb_Name *tname) {
1164
1165
& S -> types , (pb_Key )tname );
1165
1166
pb_Type * t ;
1166
1167
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
+ }
1168
1172
if (!(t = (pb_Type * )pb_poolalloc (& S -> typepool ))) return NULL ;
1169
1173
pbT_inittype (t );
1170
1174
t -> name = tname ;
@@ -1194,6 +1198,7 @@ PB_API void pb_deltype(pb_State *S, pb_Type *t) {
1194
1198
pb_freetable (& t -> field_names );
1195
1199
pb_freetable (& t -> oneof_index );
1196
1200
t -> field_count = 0 ;
1201
+ t -> is_dead = 1 ;
1197
1202
/*pb_delname(S, t->name); */
1198
1203
/*pb_poolfree(&S->typepool, t); */
1199
1204
}
@@ -1575,11 +1580,12 @@ static void pbL_loadField(pb_State *S, pbL_FieldInfo *info, pb_Loader *L, pb_Typ
1575
1580
f -> scalar = f -> type == NULL ;
1576
1581
if (info -> oneof_index != 0 ) {
1577
1582
pb_OneofEntry * fe , * e = (pb_OneofEntry * )pb_gettable (& t -> oneof_index ,
1578
- info -> oneof_index );
1583
+ info -> oneof_index ), saved ;
1579
1584
if (e != NULL ) {
1585
+ saved = * e ;
1580
1586
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 ;
1583
1589
}
1584
1590
}
1585
1591
}
0 commit comments