…lines 1–41 unchanged (41 lines)
42 upb_Arena* arena;
43 upb_strtable syms; // full_name -> packed def ptr
44 upb_strtable files; // file_name -> (upb_FileDef*)
45 upb_inttable exts; // (upb_MiniTableExtension*) -> (upb_FieldDef*)
46 upb_ExtensionRegistry* extreg;
47 const upb_GeneratedRegistryRef* generated_extreg;
48 const UPB_DESC(FeatureSetDefaults) * feature_set_defaults;
49 upb_MiniTablePlatform platform;
50 void* scratch_data;
51 size_t scratch_size;
52 size_t bytes_loaded;
53 bool disable_closed_enum_checking;
54};
…lines 55–106 unchanged (52 lines)
107}
108
109bool upb_DefPool_ClosedEnumCheckingDisabled(const upb_DefPool* s) {
110 return s->disable_closed_enum_checking;
111}
112
113const UPB_DESC(FeatureSetDefaults) *
114 upb_DefPool_FeatureSetDefaults(const upb_DefPool* s) {
115 return s->feature_set_defaults;
116}
117
118bool upb_DefPool_SetFeatureSetDefaults(upb_DefPool* s,
119 const char* serialized_defaults,
120 size_t serialized_len,
121 upb_Status* status) {
122 const UPB_DESC(FeatureSetDefaults)* defaults = UPB_DESC(
123 FeatureSetDefaults_parse)(serialized_defaults, serialized_len, s->arena);
124 if (!defaults) {
125 upb_Status_SetErrorFormat(status, "Failed to parse defaults");
126 return false;
127 }
128 if (upb_strtable_count(&s->files) > 0) {
129 upb_Status_SetErrorFormat(status,
130 "Feature set defaults can't be changed once the "
131 "pool has started building");
132 return false;
133 }
134 int min_edition = UPB_DESC(FeatureSetDefaults_minimum_edition(defaults));
135 int max_edition = UPB_DESC(FeatureSetDefaults_maximum_edition(defaults));
136 if (min_edition > max_edition) {
137 upb_Status_SetErrorFormat(status, "Invalid edition range %s to %s",
138 upb_FileDef_EditionName(min_edition),
139 upb_FileDef_EditionName(max_edition));
140 return false;
141 }
142 size_t size;
143 const UPB_DESC(
144 FeatureSetDefaults_FeatureSetEditionDefault)* const* default_list =
145 UPB_DESC(FeatureSetDefaults_defaults(defaults, &size));
146 int prev_edition = UPB_DESC(EDITION_UNKNOWN);
147 for (size_t i = 0; i < size; ++i) {
148 int edition = UPB_DESC(
149 FeatureSetDefaults_FeatureSetEditionDefault_edition(default_list[i]));
150 if (edition == UPB_DESC(EDITION_UNKNOWN)) {
151 upb_Status_SetErrorFormat(status, "Invalid edition UNKNOWN specified");
152 return false;
153 }
154 if (edition <= prev_edition) {
155 upb_Status_SetErrorFormat(status,
156 "Feature set defaults are not strictly "
157 "increasing, %s is greater than or equal to %s",
158 upb_FileDef_EditionName(prev_edition),
159 upb_FileDef_EditionName(edition));
…lines 160–374 unchanged (215 lines)
375 if (f == file) upb_strtable_removeiter(&s->syms, &iter);
376 }
377}
378
379static const upb_FileDef* upb_DefBuilder_AddFileToPool(
380 upb_DefBuilder* const builder, upb_DefPool* const s,
381 const UPB_DESC(FileDescriptorProto) * const file_proto,
382 const upb_StringView name, upb_Status* const status) {
383 if (UPB_SETJMP(builder->err) != 0) {
384 UPB_ASSERT(!upb_Status_IsOk(status));
385 if (builder->file) {
386 remove_filedef(s, builder->file);
387 builder->file = NULL;
388 }
389 } else if (!builder->arena || !builder->tmp_arena ||
390 !upb_strtable_init(&builder->feature_cache, 16,
391 builder->tmp_arena) ||
392 !(builder->legacy_features =
393 UPB_DESC(FeatureSet_new)(builder->tmp_arena))) {
394 _upb_DefBuilder_OomErr(builder);
395 } else {
396 _upb_FileDef_Create(builder, file_proto);
397 upb_strtable_insert(&s->files, name.data, name.size,
398 upb_value_constptr(builder->file), builder->arena);
399 UPB_ASSERT(upb_Status_IsOk(status));
400 upb_Arena_Fuse(s->arena, builder->arena);
401 }
402
403 if (builder->arena) upb_Arena_Free(builder->arena);
404 if (builder->tmp_arena) upb_Arena_Free(builder->tmp_arena);
405 return builder->file;
406}
407
408static const upb_FileDef* _upb_DefPool_AddFile(
409 upb_DefPool* s, const UPB_DESC(FileDescriptorProto) * file_proto,
410 const upb_MiniTableFile* layout, upb_Status* status) {
411 const upb_StringView name = UPB_DESC(FileDescriptorProto_name)(file_proto);
412
413 // Determine whether we already know about this file.
414 {
415 upb_value v;
416 if (upb_strtable_lookup2(&s->files, name.data, name.size, &v)) {
417 upb_Status_SetErrorFormat(status,
…lines 418–435 unchanged (18 lines)
436 .tmp_arena = upb_Arena_New(),
437 };
438
439 return upb_DefBuilder_AddFileToPool(&ctx, s, file_proto, name, status);
440}
441
442const upb_FileDef* upb_DefPool_AddFile(upb_DefPool* s,
443 const UPB_DESC(FileDescriptorProto) *
444 file_proto,
445 upb_Status* status) {
446 return _upb_DefPool_AddFile(s, file_proto, NULL, status);
447}
448
449bool _upb_DefPool_LoadDefInitEx(upb_DefPool* s, const _upb_DefPool_Init* init,
450 bool rebuild_minitable) {
451 /* Since this function should never fail (it would indicate a bug in upb) we
452 * print errors to stderr instead of returning error status to the user. */
453 _upb_DefPool_Init** deps = init->deps;
454 UPB_DESC(FileDescriptorProto) * file;
455 upb_Arena* arena;
456 upb_Status status;
457
458 upb_Status_Clear(&status);
459
460 if (upb_DefPool_FindFileByName(s, init->filename)) {
461 return true;
462 }
463
464 arena = upb_Arena_New();
465
466 for (; *deps; deps++) {
467 if (!_upb_DefPool_LoadDefInitEx(s, *deps, rebuild_minitable)) goto err;
468 }
469
470 file = UPB_DESC(FileDescriptorProto_parse_ex)(
471 init->descriptor.data, init->descriptor.size, NULL,
472 kUpb_DecodeOption_AliasString, arena);
473 s->bytes_loaded += init->descriptor.size;
474
475 if (!file) {
476 upb_Status_SetErrorFormat(
477 &status,
478 "Failed to parse compiled-in descriptor for file '%s'. This should "
…lines 479–562 unchanged (84 lines)