Skip to content

Commit

Permalink
Clean up
Browse files Browse the repository at this point in the history
  • Loading branch information
TeBoring committed Oct 10, 2019
1 parent d8b1fac commit e9012fc
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 78 deletions.
45 changes: 16 additions & 29 deletions php/ext/google/protobuf/encode_decode.c
Expand Up @@ -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.
// -----------------------------------------------------------------------------
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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) -
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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);
Expand All @@ -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;
Expand All @@ -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);
Expand Down
3 changes: 3 additions & 0 deletions php/ext/google/protobuf/protobuf.h
Expand Up @@ -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)

Expand Down
67 changes: 18 additions & 49 deletions php/ext/google/protobuf/storage.c
Expand Up @@ -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:
Expand All @@ -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)]
Expand All @@ -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)) {
Expand All @@ -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);
}
Expand Down Expand Up @@ -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)) {
Expand Down Expand Up @@ -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);
}
}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit e9012fc

Please sign in to comment.