Skip to content

Commit b4fdc96

Browse files
committed
Implement descriptor API
1 parent 0855fa2 commit b4fdc96

9 files changed

Lines changed: 983 additions & 105 deletions

File tree

php/ext/google/protobuf/hhvm/def.cpp

Lines changed: 108 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -192,66 +192,44 @@ void InternalDescriptorPool_add_generated_file(
192192
for (i = 0; i < upb_filedef_defcount(files[0]); i++) {
193193
const upb_def *def = upb_filedef_def(files[0], i);
194194
switch (upb_def_type(def)) {
195-
case UPB_DEF_MSG: {
196-
const upb_msgdef *msgdef = upb_downcast_msgdef(def);
197-
const char *fullname = upb_msgdef_fullname(msgdef);
198-
const char *php_namespace = upb_filedef_phpnamespace(files[0]);
199-
const char *prefix_given = upb_filedef_phpprefix(files[0]);
200-
size_t classname_len = strlen(fullname) + 5;
201-
if (prefix_given != NULL) {
202-
classname_len += strlen(prefix_given);
203-
}
204-
if (php_namespace != NULL) {
205-
classname_len += strlen(php_namespace);
206-
}
207-
char *classname = ALLOC_N(char, classname_len);
208-
memset(classname, 0, classname_len);
209-
const char *package = upb_filedef_package(files[0]);
210-
classname_no_prefix(fullname, package, classname);
211-
const char *prefix = classname_prefix(classname, prefix_given, package);
212-
convert_to_class_name_inplace(package, php_namespace, prefix, classname);
213-
register_upbdef(classname, def);
214-
FREE(classname);
215-
break;
216-
}
217-
// #define CASE_TYPE(def_type, def_type_lower, desc_type, desc_type_lower) \
218-
// case UPB_DEF_##def_type: { \
219-
// const upb_##def_type_lower *def_type_lower = \
220-
// upb_downcast_##def_type_lower(def); \
221-
// /* Unlike other messages, MapEntry is shared by all map fields and doesn't \
222-
// * have generated PHP class.*/ \
223-
// if (upb_def_type(def) == UPB_DEF_MSG && \
224-
// upb_msgdef_mapentry(upb_downcast_msgdef(def))) { \
225-
// break; \
226-
// } \
227-
// /* Prepend '.' to package name to make it absolute. In the 5 additional \
228-
// * bytes allocated, one for '.', one for trailing 0, and 3 for 'GPB' if \
229-
// * given message is google.protobuf.Empty.*/ \
230-
// const char *fullname = upb_##def_type_lower##_fullname(def_type_lower); \
231-
// const char *php_namespace = upb_filedef_phpnamespace(files[0]); \
232-
// const char *prefix_given = upb_filedef_phpprefix(files[0]); \
233-
// size_t classname_len = strlen(fullname) + 5; \
234-
// if (prefix_given != NULL) { \
235-
// classname_len += strlen(prefix_given); \
236-
// } \
237-
// if (php_namespace != NULL) { \
238-
// classname_len += strlen(php_namespace); \
239-
// } \
240-
// char *classname = ALLOC_N(char, classname_len); \
241-
// const char *package = upb_filedef_package(files[0]); \
242-
// classname_no_prefix(fullname, package, classname); \
243-
// const char *prefix = classname_prefix(classname, prefix_given, package); \
244-
// convert_to_class_name_inplace(package, php_namespace, prefix, classname); \
245-
// PROTO_CLASS* klass = lookup_class(classname); \
246-
// add_class2def(klass, def); \
247-
// FREE(classname); \
248-
// break; \
249-
// }
250-
//
251-
// CASE_TYPE(MSG, msgdef, Descriptor, descriptor)
252-
// CASE_TYPE(ENUM, enumdef, EnumDescriptor, enum_descriptor)
253-
// #undef CASE_TYPE
254-
//
195+
#define CASE_TYPE(def_type, def_type_lower, desc_type) \
196+
case UPB_DEF_##def_type: { \
197+
const upb_##def_type_lower *def_type_lower = \
198+
upb_downcast_##def_type_lower(def); \
199+
/* Unlike other messages, MapEntry is shared by all map fields and doesn't \
200+
* have generated PHP class.*/ \
201+
if (upb_def_type(def) == UPB_DEF_MSG && \
202+
upb_msgdef_mapentry(upb_downcast_msgdef(def))) { \
203+
break; \
204+
} \
205+
/* Prepend '.' to package name to make it absolute. In the 5 additional \
206+
* bytes allocated, one for '.', one for trailing 0, and 3 for 'GPB' if \
207+
* given message is google.protobuf.Empty.*/ \
208+
const char *fullname = upb_##def_type_lower##_fullname(def_type_lower); \
209+
const char *php_namespace = upb_filedef_phpnamespace(files[0]); \
210+
const char *prefix_given = upb_filedef_phpprefix(files[0]); \
211+
size_t classname_len = strlen(fullname) + 5; \
212+
if (prefix_given != NULL) { \
213+
classname_len += strlen(prefix_given); \
214+
} \
215+
if (php_namespace != NULL) { \
216+
classname_len += strlen(php_namespace); \
217+
} \
218+
char *classname = ALLOC_N(char, classname_len); \
219+
memset(classname, 0, classname_len); \
220+
const char *package = upb_filedef_package(files[0]); \
221+
classname_no_prefix(fullname, package, classname); \
222+
const char *prefix = classname_prefix(classname, prefix_given, package); \
223+
convert_to_class_name_inplace(package, php_namespace, prefix, classname); \
224+
register_upbdef(classname, def); \
225+
FREE(classname); \
226+
break; \
227+
}
228+
229+
CASE_TYPE(MSG, msgdef, Descriptor)
230+
CASE_TYPE(ENUM, enumdef, EnumDescriptor)
231+
#undef CASE_TYPE
232+
255233
default:
256234
break;
257235
}
@@ -271,3 +249,73 @@ void InternalDescriptorPool_add_generated_file(
271249
upb_filedef_unref(files[0], &pool);
272250
upb_gfree(files);
273251
}
252+
253+
void DescriptorPool_init_c_instance(
254+
DescriptorPool *pool TSRMLS_DC) {
255+
pool->intern = NULL;
256+
}
257+
258+
void DescriptorPool_free_c(
259+
DescriptorPool *pool TSRMLS_DC) {}
260+
261+
// -----------------------------------------------------------------------------
262+
// Descriptor
263+
// -----------------------------------------------------------------------------
264+
265+
void Descriptor_init_c_instance(
266+
Descriptor *self TSRMLS_DC) {
267+
self->intern = NULL;
268+
self->klass = NULL;
269+
}
270+
271+
void Descriptor_free_c(
272+
Descriptor *self TSRMLS_DC) {}
273+
274+
// -----------------------------------------------------------------------------
275+
// EnumDescriptor
276+
// -----------------------------------------------------------------------------
277+
278+
void EnumDescriptor_init_c_instance(
279+
EnumDescriptor *self TSRMLS_DC) {
280+
self->intern = NULL;
281+
}
282+
283+
void EnumDescriptor_free_c(
284+
EnumDescriptor *self TSRMLS_DC) {}
285+
286+
// -----------------------------------------------------------------------------
287+
// EnumValueDescriptor
288+
// -----------------------------------------------------------------------------
289+
290+
void EnumValueDescriptor_init_c_instance(
291+
EnumValueDescriptor *self TSRMLS_DC) {
292+
self->name = NULL;
293+
self->number = 0;
294+
}
295+
296+
void EnumValueDescriptor_free_c(
297+
EnumValueDescriptor *self TSRMLS_DC) {}
298+
299+
// -----------------------------------------------------------------------------
300+
// FieldDescriptor
301+
// -----------------------------------------------------------------------------
302+
303+
void FieldDescriptor_init_c_instance(
304+
FieldDescriptor *self TSRMLS_DC) {
305+
self->intern = NULL;
306+
}
307+
308+
void FieldDescriptor_free_c(
309+
FieldDescriptor *self TSRMLS_DC) {}
310+
311+
// -----------------------------------------------------------------------------
312+
// OneofDescriptor
313+
// -----------------------------------------------------------------------------
314+
315+
void OneofDescriptor_init_c_instance(
316+
OneofDescriptor *self TSRMLS_DC) {
317+
self->intern = NULL;
318+
}
319+
320+
void OneofDescriptor_free_c(
321+
OneofDescriptor *self TSRMLS_DC) {}

0 commit comments

Comments
 (0)