diff --git a/php/ext/google/protobuf/def.c b/php/ext/google/protobuf/def.c index 238a92478..db6aec701 100644 --- a/php/ext/google/protobuf/def.c +++ b/php/ext/google/protobuf/def.c @@ -28,6 +28,9 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#include +#include + #include "protobuf.h" // Forward declare. diff --git a/php/ext/google/protobuf/encode_decode.c b/php/ext/google/protobuf/encode_decode.c index 801b44d53..836b2f981 100644 --- a/php/ext/google/protobuf/encode_decode.c +++ b/php/ext/google/protobuf/encode_decode.c @@ -27,6 +27,9 @@ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +#include +#include #include "protobuf.h" #include "utf8.h" @@ -84,6 +87,8 @@ void stringsink_init(stringsink *sink) { void stringsink_uninit(stringsink *sink) { free(sink->ptr); } +void stringsink_uninit_opaque(void *sink) { stringsink_uninit(sink); } + /* stackenv *****************************************************************/ // Stack-allocated context during an encode/decode operation. Contains the upb @@ -1748,7 +1753,7 @@ PHP_METHOD(Message, serializeToString) { serialize_to_string(getThis(), return_value TSRMLS_CC); } -void merge_from_string(const char* data, int data_len, const Descriptor* desc, +void merge_from_string(const char* data, int data_len, Descriptor* desc, MessageHeader* msg) { const upb_pbdecodermethod* method = msgdef_decodermethod(desc); const upb_handlers* h = upb_pbdecodermethod_desthandlers(method); @@ -1900,7 +1905,7 @@ static void discard_unknown_fields(MessageHeader* msg) { for (map_begin(map_php, &map_it TSRMLS_CC); !map_done(&map_it); map_next(&map_it)) { upb_value value = map_iter_value(&map_it, &len); - void* memory = raw_value(upb_value_memory(&value), value_field); + const void* memory = raw_value(upb_value_memory(&value), value_field); #if PHP_MAJOR_VERSION < 7 MessageHeader *submsg = UNBOX(MessageHeader, *(zval**)memory); #else diff --git a/php/ext/google/protobuf/map.c b/php/ext/google/protobuf/map.c index c5b500b53..0ce10190e 100644 --- a/php/ext/google/protobuf/map.c +++ b/php/ext/google/protobuf/map.c @@ -167,7 +167,8 @@ static void map_begin_internal(Map *map, MapIter *iter) { upb_strtable_begin(&iter->it, &map->table); } -static HashTable *map_field_get_gc(zval *object, CACHED_VALUE **table, int *n) { +static HashTable *map_field_get_gc(zval *object, CACHED_VALUE **table, + int *n TSRMLS_DC) { // TODO(teboring): Unfortunately, zend engine does not support garbage // collection for custom array. We have to use zend engine's native array // instead. @@ -294,7 +295,7 @@ static bool map_field_read_dimension(zval *object, zval *key, int type, } } -static bool map_index_unset(Map *intern, const char* keyval, int length) { +static void map_index_unset(Map *intern, const char* keyval, int length) { upb_value old_value; if (upb_strtable_remove2(&intern->table, keyval, length, &old_value)) { switch (intern->value_type) { diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c index 08a4793ff..d883340f0 100644 --- a/php/ext/google/protobuf/message.c +++ b/php/ext/google/protobuf/message.c @@ -29,9 +29,16 @@ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include +#include #include #include +#if PHP_MAJOR_VERSION < 7 +#include +#else +#include +#endif + #include "protobuf.h" #include "utf8.h" @@ -83,7 +90,7 @@ static HashTable* message_get_properties(zval* object TSRMLS_DC); // Define object free method. PHP_PROTO_OBJECT_FREE_START(MessageHeader, message) if (*(void**)intern->data != NULL) { - stringsink_uninit(*(void**)intern->data); + stringsink_uninit_opaque(*(void**)intern->data); FREE(*(void**)intern->data); } FREE(intern->data); @@ -904,12 +911,11 @@ PHP_METHOD(Field_Cardinality, name) { case 3: PHP_PROTO_RETURN_STRING("CARDINALITY_REPEATED", 1); default: - zend_throw_exception( - NULL, + zend_throw_exception_ex( + NULL, 0 TSRMLS_CC, "Enum Google\\Protobuf\\Field_Cardinality has no name " "defined for value %d.", - value, - 0 TSRMLS_CC); + value); } } @@ -927,12 +933,11 @@ PHP_METHOD(Field_Cardinality, value) { if (strncmp(name, "CARDINALITY_REQUIRED", name_len) == 0) RETURN_LONG(2); if (strncmp(name, "CARDINALITY_REPEATED", name_len) == 0) RETURN_LONG(3); - zend_throw_exception( - NULL, + zend_throw_exception_ex( + NULL, 0 TSRMLS_CC, "Enum Google\\Protobuf\\Field_Cardinality has no value " "defined for name %s.", - name, - 0 TSRMLS_CC); + name); } // ----------------------------------------------------------------------------- @@ -1042,12 +1047,10 @@ PHP_METHOD(Field_Kind, name) { case 18: PHP_PROTO_RETURN_STRING("TYPE_SINT64", 1); default: - zend_throw_exception( - NULL, - "Enum Google\\Protobuf\\Field_Kind has no name " - "defined for value %d.", - value, - 0 TSRMLS_CC); + zend_throw_exception_ex(NULL, 0 TSRMLS_CC, + "Enum Google\\Protobuf\\Field_Kind has no name " + "defined for value %d.", + value); } } @@ -1080,12 +1083,10 @@ PHP_METHOD(Field_Kind, value) { if (strncmp(name, "TYPE_SINT32", name_len) == 0) RETURN_LONG(17); if (strncmp(name, "TYPE_SINT64", name_len) == 0) RETURN_LONG(18); - zend_throw_exception( - NULL, - "Enum Google\\Protobuf\\Field_Kind has no value " - "defined for name %s.", - name, - 0 TSRMLS_CC); + zend_throw_exception_ex(NULL, 0 TSRMLS_CC, + "Enum Google\\Protobuf\\Field_Kind has no value " + "defined for name %s.", + name); } // ----------------------------------------------------------------------------- @@ -1117,12 +1118,10 @@ PHP_METHOD(NullValue, name) { case 0: PHP_PROTO_RETURN_STRING("NULL_VALUE", 1); default: - zend_throw_exception( - NULL, - "Enum Google\\Protobuf\\NullValue has no name " - "defined for value %d.", - value, - 0 TSRMLS_CC); + zend_throw_exception_ex(NULL, 0 TSRMLS_CC, + "Enum Google\\Protobuf\\NullValue has no name " + "defined for value %d.", + value); } } @@ -1137,12 +1136,10 @@ PHP_METHOD(NullValue, value) { if (strncmp(name, "NULL_VALUE", name_len) == 0) RETURN_LONG(0); - zend_throw_exception( - NULL, - "Enum Google\\Protobuf\\NullValue has no value " - "defined for name %s.", - name, - 0 TSRMLS_CC); + zend_throw_exception_ex(NULL, 0 TSRMLS_CC, + "Enum Google\\Protobuf\\NullValue has no value " + "defined for name %s.", + name); } // ----------------------------------------------------------------------------- @@ -1178,12 +1175,10 @@ PHP_METHOD(Syntax, name) { case 1: PHP_PROTO_RETURN_STRING("SYNTAX_PROTO3", 1); default: - zend_throw_exception( - NULL, - "Enum Google\\Protobuf\\Syntax has no name " - "defined for value %d.", - value, - 0 TSRMLS_CC); + zend_throw_exception_ex(NULL, 0 TSRMLS_CC, + "Enum Google\\Protobuf\\Syntax has no name " + "defined for value %d.", + value); } } @@ -1199,12 +1194,10 @@ PHP_METHOD(Syntax, value) { if (strncmp(name, "SYNTAX_PROTO2", name_len) == 0) RETURN_LONG(0); if (strncmp(name, "SYNTAX_PROTO3", name_len) == 0) RETURN_LONG(1); - zend_throw_exception( - NULL, - "Enum Google\\Protobuf\\Syntax has no value " - "defined for name %s.", - name, - 0 TSRMLS_CC); + zend_throw_exception_ex(NULL, 0 TSRMLS_CC, + "Enum Google\\Protobuf\\Syntax has no value " + "defined for name %s.", + name); } // ----------------------------------------------------------------------------- diff --git a/php/ext/google/protobuf/protobuf.h b/php/ext/google/protobuf/protobuf.h index 5cbf348b0..c4ab8860d 100644 --- a/php/ext/google/protobuf/protobuf.h +++ b/php/ext/google/protobuf/protobuf.h @@ -310,8 +310,10 @@ static inline int php_proto_zend_hash_index_update_mem(HashTable* ht, ulong h, static inline int php_proto_zend_hash_update_zval(HashTable* ht, const char* key, uint key_len, zval* pData) { + void* result = NULL; zend_string* internal_key = zend_string_init(key, key_len, 0); - zend_hash_update(ht, internal_key, pData); + result = zend_hash_update(ht, internal_key, pData); + return result != NULL ? SUCCESS : FAILURE; } static inline int php_proto_zend_hash_update_mem(HashTable* ht, const char* key, @@ -682,6 +684,7 @@ void double_value_init(TSRMLS_D); void duration_init(TSRMLS_D); void empty_init(TSRMLS_D); void enum_descriptor_init(TSRMLS_D); +void enum_value_descriptor_init(TSRMLS_D); void enum_init(TSRMLS_D); void enum_value_init(TSRMLS_D); void field_cardinality_init(TSRMLS_D); @@ -711,8 +714,8 @@ void struct_init(TSRMLS_D); void syntax_init(TSRMLS_D); void timestamp_init(TSRMLS_D); void type_init(TSRMLS_D); -void uint32_value_init(TSRMLS_D); -void uint64_value_init(TSRMLS_D); +void u_int32_value_init(TSRMLS_D); +void u_int64_value_init(TSRMLS_D); void util_init(TSRMLS_D); void value_init(TSRMLS_D); @@ -966,7 +969,7 @@ PHP_METHOD(Message, __construct); const upb_pbdecodermethod *new_fillmsg_decodermethod(Descriptor *desc, const void *owner); void serialize_to_string(zval* val, zval* return_value TSRMLS_DC); -void merge_from_string(const char* data, int data_len, const Descriptor* desc, +void merge_from_string(const char* data, int data_len, Descriptor* desc, MessageHeader* msg); PHP_METHOD(Message, serializeToString); @@ -1448,6 +1451,7 @@ extern zend_class_entry* value_type; upb_fieldtype_t to_fieldtype(upb_descriptortype_t type); const zend_class_entry* field_type_class( const upb_fielddef* field PHP_PROTO_TSRMLS_DC); +void stringsink_uninit_opaque(void *sink); // ----------------------------------------------------------------------------- // Utilities. diff --git a/php/ext/google/protobuf/type_check.c b/php/ext/google/protobuf/type_check.c index 3fb9c5110..31dc44493 100644 --- a/php/ext/google/protobuf/type_check.c +++ b/php/ext/google/protobuf/type_check.c @@ -29,6 +29,7 @@ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include +#include #include "protobuf.h" #include "utf8.h" @@ -434,9 +435,9 @@ PHP_METHOD(Util, checkMessage) { RETURN_NULL(); } if (!instanceof_function(Z_OBJCE_P(val), klass TSRMLS_CC)) { - zend_throw_exception( - NULL, "Given value is not an instance of %s.", klass->name, - 0 TSRMLS_CC); + zend_throw_exception_ex(NULL, 0 TSRMLS_CC, + "Given value is not an instance of %s.", + klass->name); return; } RETURN_ZVAL(val, 1, 0); @@ -479,32 +480,27 @@ void check_repeated_field(const zend_class_entry* klass, PHP_PROTO_LONG type, } else if (Z_TYPE_P(val) == IS_OBJECT) { if (!instanceof_function(Z_OBJCE_P(val), repeated_field_type TSRMLS_CC)) { - zend_throw_exception( - NULL, "Given value is not an instance of %s.", - repeated_field_type->name, - 0 TSRMLS_CC); + zend_throw_exception_ex(NULL, 0 TSRMLS_CC, + "Given value is not an instance of %s.", + repeated_field_type->name); return; } RepeatedField* intern = UNBOX(RepeatedField, val); if (to_fieldtype(type) != intern->type) { - zend_throw_exception( - NULL, "Incorrect repeated field type.", - 0 TSRMLS_CC); + zend_throw_exception_ex(NULL, 0 TSRMLS_CC, + "Incorrect repeated field type."); return; } if (klass != NULL && intern->msg_ce != klass) { - zend_throw_exception( - NULL, "Expect a repeated field of %s, but %s is given.", - klass->name, - intern->msg_ce->name, - 0 TSRMLS_CC); + zend_throw_exception_ex(NULL, 0 TSRMLS_CC, + "Expect a repeated field of %s, but %s is given.", + klass->name, intern->msg_ce->name); return; } RETURN_ZVAL(val, 1, 0); } else { - zend_throw_exception( - NULL, "Incorrect repeated field type.", - 0 TSRMLS_CC); + zend_throw_exception_ex(NULL, 0 TSRMLS_CC, + "Incorrect repeated field type."); return; } } @@ -560,10 +556,9 @@ void check_map_field(const zend_class_entry* klass, PHP_PROTO_LONG key_type, RETURN_ZVAL(CACHED_TO_ZVAL_PTR(map_field), 1, 1); } else if (Z_TYPE_P(val) == IS_OBJECT) { if (!instanceof_function(Z_OBJCE_P(val), map_field_type TSRMLS_CC)) { - zend_throw_exception( - NULL, "Given value is not an instance of %s.", - map_field_type->name, - 0 TSRMLS_CC); + zend_throw_exception_ex(NULL, 0 TSRMLS_CC, + "Given value is not an instance of %s.", + map_field_type->name); return; } Map* intern = UNBOX(Map, val); @@ -580,10 +575,9 @@ void check_map_field(const zend_class_entry* klass, PHP_PROTO_LONG key_type, return; } if (klass != NULL && intern->msg_ce != klass) { - zend_throw_exception( - NULL, "Expect a map field of %s, but %s is given.", - klass->name, intern->msg_ce->name, - 0 TSRMLS_CC); + zend_throw_exception_ex(NULL, 0 TSRMLS_CC, + "Expect a map field of %s, but %s is given.", + klass->name, intern->msg_ce->name); return; } RETURN_ZVAL(val, 1, 0);