diff --git a/php/ext/google/protobuf/encode_decode.c b/php/ext/google/protobuf/encode_decode.c index d9ecb4d5097..af3169c41f8 100644 --- a/php/ext/google/protobuf/encode_decode.c +++ b/php/ext/google/protobuf/encode_decode.c @@ -118,17 +118,6 @@ static void stackenv_uninit(stackenv* se) { } } -// ----------------------------------------------------------------------------- -// Utility. -// ----------------------------------------------------------------------------- - -static CACHED_VALUE* find_cache(MessageHeader* msg, const upb_fielddef* field) { - int property_cache_index = - msg->descriptor->layout->fields[upb_fielddef_index(field)] - .cache_index; - return OBJ_PROP(&msg->std, property_cache_index); -} - // ----------------------------------------------------------------------------- // Parsing. // ----------------------------------------------------------------------------- @@ -244,7 +233,7 @@ static const void *newoneofhandlerdata(upb_handlers *h, static void *startseq_handler(void* closure, const void* hd) { MessageHeader* msg = closure; const upb_fielddef** field = hd; - CACHED_VALUE* cache = find_cache(msg, *field); + CACHED_VALUE* cache = find_zval_property(msg, *field); TSRMLS_FETCH(); repeated_field_insure_created(*field, cache PHP_PROTO_TSRMLS_CC); return CACHED_PTR_TO_ZVAL_PTR(cache); @@ -384,7 +373,7 @@ static bool str_end_handler(void *closure, const void *hd) { const upb_fielddef **field = hd; MessageHeader* msg = (MessageHeader*)frame->closure; - CACHED_VALUE* cached = find_cache(msg, *field); + CACHED_VALUE* cached = find_zval_property(msg, *field); new_php_string(cached, frame->sink.ptr, frame->sink.len); @@ -454,7 +443,7 @@ static void *submsg_handler(void *closure, const void *hd) { zval* submsg_php; MessageHeader* submsg; - CACHED_VALUE* cached = find_cache(msg, submsgdata->fd); + CACHED_VALUE* cached = find_zval_property(msg, submsgdata->fd); if (Z_TYPE_P(CACHED_PTR_TO_ZVAL_PTR(cached)) == IS_NULL) { #if PHP_MAJOR_VERSION < 7 @@ -670,7 +659,7 @@ static void map_slot_value(upb_fieldtype_t type, const void* from, static void *startmapentry_handler(void *closure, const void *hd) { MessageHeader* msg = closure; const map_handlerdata_t* mapdata = hd; - CACHED_VALUE* cache = find_cache(msg, mapdata->fd); + CACHED_VALUE* cache = find_zval_property(msg, mapdata->fd); TSRMLS_FETCH(); map_field_insure_created(mapdata->fd, cache PHP_PROTO_TSRMLS_CC); zval* map = CACHED_PTR_TO_ZVAL_PTR(cache); @@ -1174,8 +1163,6 @@ static void putjsonstruct( static void putstr(zval* str, const upb_fielddef* f, upb_sink sink, bool force_default); -static void putstr2(MessageHeader* msg, const upb_fielddef* f, upb_sink sink, - bool force_default); static void putrawstr(const char* str, int len, const upb_fielddef* f, upb_sink sink, bool force_default); @@ -1229,7 +1216,7 @@ static void put_optional_value(const void* memory, int len, break; case UPB_TYPE_MESSAGE: { #if PHP_MAJOR_VERSION < 7 - MessageHeader *submsg = submsg = UNBOX(MessageHeader, *(zval**)memory); + MessageHeader *submsg = UNBOX(MessageHeader, *(zval**)memory); #else MessageHeader *submsg = (MessageHeader*)((char*)(*(zend_object**)memory) - @@ -1339,7 +1326,7 @@ static void putjsonany(MessageHeader* msg, const Descriptor* desc, upb_sink_startmsg(sink); /* Handle type url */ - type_url_php_str = CACHED_PTR_TO_ZVAL_PTR(find_cache(msg, type_field)); + type_url_php_str = CACHED_PTR_TO_ZVAL_PTR(find_zval_property(msg, type_field)); if (Z_STRLEN_P(type_url_php_str) > 0) { putstr(type_url_php_str, type_field, sink, false); } @@ -1369,7 +1356,7 @@ static void putjsonany(MessageHeader* msg, const Descriptor* desc, const char* value_str; size_t value_len; - value_php_str = CACHED_PTR_TO_ZVAL_PTR(find_cache(msg, value_field)); + value_php_str = CACHED_PTR_TO_ZVAL_PTR(find_zval_property(msg, value_field)); value_str = Z_STRVAL_P(value_php_str); value_len = Z_STRLEN_P(value_php_str); @@ -1423,7 +1410,7 @@ static void putjsonlistvalue( upb_sink_startmsg(sink); - array = CACHED_PTR_TO_ZVAL_PTR(find_cache(msg, f)); + array = CACHED_PTR_TO_ZVAL_PTR(find_zval_property(msg, f)); if (ZVAL_IS_NULL(array)) { upb_sink_startseq(sink, getsel(f, UPB_HANDLER_STARTSEQ), &subsink); upb_sink_endseq(sink, getsel(f, UPB_HANDLER_ENDSEQ)); @@ -1456,7 +1443,7 @@ static void putjsonstruct( upb_sink_startmsg(sink); - map = CACHED_PTR_TO_ZVAL_PTR(find_cache(msg, f)); + map = CACHED_PTR_TO_ZVAL_PTR(find_zval_property(msg, f)); if (ZVAL_IS_NULL(map)) { upb_sink_startseq(sink, getsel(f, UPB_HANDLER_STARTSEQ), &subsink); upb_sink_endseq(sink, getsel(f, UPB_HANDLER_ENDSEQ)); @@ -1531,23 +1518,23 @@ static void putrawmsg(MessageHeader* msg, const Descriptor* desc, } if (is_map_field(f)) { - zval* map = CACHED_PTR_TO_ZVAL_PTR(find_cache(msg, f)); + zval* map = CACHED_PTR_TO_ZVAL_PTR(find_zval_property(msg, f)); if (!ZVAL_IS_NULL(map)) { putmap(map, f, sink, depth, is_json TSRMLS_CC); } } else if (upb_fielddef_isseq(f)) { - zval* array = CACHED_PTR_TO_ZVAL_PTR(find_cache(msg, f)); + zval* array = CACHED_PTR_TO_ZVAL_PTR(find_zval_property(msg, f)); if (!ZVAL_IS_NULL(array)) { putarray(array, f, sink, depth, is_json TSRMLS_CC); } } else if (upb_fielddef_isstring(f)) { - zval* str = CACHED_PTR_TO_ZVAL_PTR(find_cache(msg, f)); + zval* str = CACHED_PTR_TO_ZVAL_PTR(find_zval_property(msg, f)); if (containing_oneof || (is_json && is_wrapper_msg(desc->msgdef)) || Z_STRLEN_P(str) > 0) { putstr(str, f, sink, is_json && is_wrapper_msg(desc->msgdef)); } } else if (upb_fielddef_issubmsg(f)) { - zval* submsg = CACHED_PTR_TO_ZVAL_PTR(find_cache(msg, f)); + zval* submsg = CACHED_PTR_TO_ZVAL_PTR(find_zval_property(msg, f)); putsubmsg(submsg, f, sink, depth, is_json TSRMLS_CC); } else { upb_selector_t sel = getsel(f, upb_handlers_getprimitivehandlertype(f)); @@ -1919,7 +1906,7 @@ static void discard_unknown_fields(MessageHeader* msg) { value_field = map_field_value(f); if (!upb_fielddef_issubmsg(value_field)) continue; - zval* map_php = CACHED_PTR_TO_ZVAL_PTR(find_cache(msg, f)); + zval* map_php = CACHED_PTR_TO_ZVAL_PTR(find_zval_property(msg, f)); if (ZVAL_IS_NULL(map_php)) continue; Map* intern = UNBOX(Map, map_php); @@ -1939,7 +1926,7 @@ static void discard_unknown_fields(MessageHeader* msg) { } else if (upb_fielddef_isseq(f)) { if (!upb_fielddef_issubmsg(f)) continue; - zval* array_php = CACHED_PTR_TO_ZVAL_PTR(find_cache(msg, f)); + zval* array_php = CACHED_PTR_TO_ZVAL_PTR(find_zval_property(msg, f)); if (ZVAL_IS_NULL(array_php)) continue; int size, i; @@ -1960,7 +1947,7 @@ static void discard_unknown_fields(MessageHeader* msg) { discard_unknown_fields(submsg); } } else if (upb_fielddef_issubmsg(f)) { - zval* submsg_php = CACHED_PTR_TO_ZVAL_PTR(find_cache(msg, f)); + zval* submsg_php = CACHED_PTR_TO_ZVAL_PTR(find_zval_property(msg, f)); if (Z_TYPE_P(submsg_php) == IS_NULL) continue; MessageHeader* submsg = UNBOX(MessageHeader, submsg_php); discard_unknown_fields(submsg); diff --git a/php/ext/google/protobuf/protobuf.h b/php/ext/google/protobuf/protobuf.h index d6561267505..be955e1d379 100644 --- a/php/ext/google/protobuf/protobuf.h +++ b/php/ext/google/protobuf/protobuf.h @@ -1495,6 +1495,9 @@ size_t stringsink_string(void *_sink, const void *hd, const char *ptr, #define FREE(object) efree(object) #define PEFREE(object) pefree(object, 1) +// Find corresponding zval property for the field. +CACHED_VALUE* find_zval_property(MessageHeader* msg, const upb_fielddef* field); + // String argument. #define STR(str) (str), strlen(str) diff --git a/php/ext/google/protobuf/storage.c b/php/ext/google/protobuf/storage.c index 4ea555835bc..e9766d0b39f 100644 --- a/php/ext/google/protobuf/storage.c +++ b/php/ext/google/protobuf/storage.c @@ -762,42 +762,11 @@ void layout_init(MessageLayout* layout, void* storage, memcpy(storage, layout->empty_template, layout->size); } -// For non-singular fields, the related memory needs to point to the actual -// zval in properties table first. -static void* value_memory(const upb_fielddef* field, void* memory) { - switch (upb_fielddef_type(field)) { - case UPB_TYPE_STRING: - case UPB_TYPE_BYTES: - case UPB_TYPE_MESSAGE: - memory = DEREF(memory, CACHED_VALUE*); - break; - default: - // No operation - break; - } - return memory; -} - -static void* value_memory2( - MessageHeader* header, const upb_fielddef* field, void* memory) { - switch (upb_fielddef_type(field)) { - case UPB_TYPE_STRING: - case UPB_TYPE_BYTES: - case UPB_TYPE_MESSAGE: { - int property_cache_index = - header->descriptor->layout->fields[upb_fielddef_index(field)] - .cache_index; - return OBJ_PROP(&header->std, property_cache_index); - break; - } - default: - // No operation - break; - } - return memory; -} - -static void* value_memory3( +// Switch memory for processing for singular fields based on field type. +// * primitive fields: memory +// * others (string, bytes and message): cache (the correspond zval +// property) +static void* value_memory( upb_fieldtype_t type, void* memory, CACHED_VALUE* cache) { switch (type) { case UPB_TYPE_STRING: @@ -811,7 +780,7 @@ static void* value_memory3( return memory; } -static CACHED_VALUE* find_cache( +CACHED_VALUE* find_zval_property( MessageHeader* header, const upb_fielddef* field) { int property_cache_index = header->descriptor->layout->fields[upb_fielddef_index(field)] @@ -830,9 +799,9 @@ zval* layout_get(MessageLayout* layout, MessageHeader* header, native_slot_get_default(upb_fielddef_type(field), cache TSRMLS_CC); } else { upb_fieldtype_t type = upb_fielddef_type(field); - CACHED_VALUE* stored_cache = find_cache(header, field); + CACHED_VALUE* stored_cache = find_zval_property(header, field); native_slot_get( - type, value_memory3(type, memory, stored_cache), cache TSRMLS_CC); + type, value_memory(type, memory, stored_cache), cache TSRMLS_CC); } return CACHED_PTR_TO_ZVAL_PTR(cache); } else if (is_map_field(field)) { @@ -843,7 +812,7 @@ zval* layout_get(MessageLayout* layout, MessageHeader* header, return CACHED_PTR_TO_ZVAL_PTR(cache); } else { upb_fieldtype_t type = upb_fielddef_type(field); - native_slot_get(type, value_memory3(type, memory, cache), + native_slot_get(type, value_memory(type, memory, cache), cache TSRMLS_CC); return CACHED_PTR_TO_ZVAL_PTR(cache); } @@ -886,7 +855,7 @@ void layout_set(MessageLayout* layout, MessageHeader* header, *oneof_case = upb_fielddef_number(field); } else if (upb_fielddef_label(field) == UPB_LABEL_REPEATED) { // Works for both repeated and map fields - CACHED_VALUE* cached = find_cache(header, field); + CACHED_VALUE* cached = find_zval_property(header, field); zval* property_ptr = CACHED_PTR_TO_ZVAL_PTR(cached); if (EXPECTED(property_ptr != val)) { @@ -934,9 +903,9 @@ void layout_set(MessageLayout* layout, MessageHeader* header, Descriptor* desc = UNBOX_HASHTABLE_VALUE(Descriptor, get_def_obj(msg)); ce = desc->klass; } - CACHED_VALUE* cache = find_cache(header, field); + CACHED_VALUE* cache = find_zval_property(header, field); native_slot_set( - type, ce, value_memory3(upb_fielddef_type(field), memory, cache), + type, ce, value_memory(upb_fielddef_type(field), memory, cache), val TSRMLS_CC); } } @@ -1089,8 +1058,8 @@ void layout_merge(MessageLayout* layout, MessageHeader* from, int size, key_length, value_length; MapIter map_it; - CACHED_VALUE* from_cache = find_cache(from, field); - CACHED_VALUE* to_cache = find_cache(to, field); + CACHED_VALUE* from_cache = find_zval_property(from, field); + CACHED_VALUE* to_cache = find_zval_property(to, field); if (Z_TYPE_P(CACHED_PTR_TO_ZVAL_PTR(from_cache)) == IS_NULL) { continue; @@ -1125,8 +1094,8 @@ void layout_merge(MessageLayout* layout, MessageHeader* from, } } else if (upb_fielddef_label(field) == UPB_LABEL_REPEATED) { - CACHED_VALUE* from_cache = find_cache(from, field); - CACHED_VALUE* to_cache = find_cache(to, field); + CACHED_VALUE* from_cache = find_zval_property(from, field); + CACHED_VALUE* to_cache = find_zval_property(to, field); if (Z_TYPE_P(CACHED_PTR_TO_ZVAL_PTR(from_cache)) == IS_NULL) { continue; @@ -1168,8 +1137,8 @@ void layout_merge(MessageLayout* layout, MessageHeader* from, case UPB_TYPE_STRING: case UPB_TYPE_BYTES: case UPB_TYPE_MESSAGE: { - CACHED_VALUE* from_cache = find_cache(from, field); - CACHED_VALUE* to_cache = find_cache(to, field); + CACHED_VALUE* from_cache = find_zval_property(from, field); + CACHED_VALUE* to_cache = find_zval_property(to, field); native_slot_merge(field, from_cache, to_cache PHP_PROTO_TSRMLS_CC); break; }