Browse Source

Fixed compile warnings for PHP extension. (#5589)

* Fixed compile warnings for PHP extension.

* Fixed some compile errors on PHP <7 and with TSR enabled.

* One more fix for TSRM builds.
Joshua Haberman 6 years ago
parent
commit
dd7127d23d

+ 3 - 0
php/ext/google/protobuf/def.c

@@ -28,6 +28,9 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
+#include <php.h>
+#include <Zend/zend_exceptions.h>
+
 #include "protobuf.h"
 #include "protobuf.h"
 
 
 // Forward declare.
 // Forward declare.

+ 7 - 2
php/ext/google/protobuf/encode_decode.c

@@ -27,6 +27,9 @@
 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+#include <php.h>
+#include <Zend/zend_exceptions.h>
 
 
 #include "protobuf.h"
 #include "protobuf.h"
 #include "utf8.h"
 #include "utf8.h"
@@ -84,6 +87,8 @@ void stringsink_init(stringsink *sink) {
 
 
 void stringsink_uninit(stringsink *sink) { free(sink->ptr); }
 void stringsink_uninit(stringsink *sink) { free(sink->ptr); }
 
 
+void stringsink_uninit_opaque(void *sink) { stringsink_uninit(sink); }
+
 /* stackenv *****************************************************************/
 /* stackenv *****************************************************************/
 
 
 // Stack-allocated context during an encode/decode operation. Contains the upb
 // 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);
   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) {
                        MessageHeader* msg) {
   const upb_pbdecodermethod* method = msgdef_decodermethod(desc);
   const upb_pbdecodermethod* method = msgdef_decodermethod(desc);
   const upb_handlers* h = upb_pbdecodermethod_desthandlers(method);
   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);
       for (map_begin(map_php, &map_it TSRMLS_CC);
            !map_done(&map_it); map_next(&map_it)) {
            !map_done(&map_it); map_next(&map_it)) {
         upb_value value = map_iter_value(&map_it, &len);
         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
 #if PHP_MAJOR_VERSION < 7
         MessageHeader *submsg = UNBOX(MessageHeader, *(zval**)memory);
         MessageHeader *submsg = UNBOX(MessageHeader, *(zval**)memory);
 #else
 #else

+ 3 - 2
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);
   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
   // TODO(teboring): Unfortunately, zend engine does not support garbage
   // collection for custom array. We have to use zend engine's native array
   // collection for custom array. We have to use zend engine's native array
   // instead.
   // 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;
   upb_value old_value;
   if (upb_strtable_remove2(&intern->table, keyval, length, &old_value)) {
   if (upb_strtable_remove2(&intern->table, keyval, length, &old_value)) {
     switch (intern->value_type) {
     switch (intern->value_type) {

+ 38 - 45
php/ext/google/protobuf/message.c

@@ -29,9 +29,16 @@
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
 #include <php.h>
 #include <php.h>
+#include <Zend/zend_exceptions.h>
 #include <stdlib.h>
 #include <stdlib.h>
 #include <inttypes.h>
 #include <inttypes.h>
 
 
+#if PHP_MAJOR_VERSION < 7
+#include <Zend/zend_compile.h>
+#else
+#include <Zend/zend_inheritance.h>
+#endif
+
 #include "protobuf.h"
 #include "protobuf.h"
 #include "utf8.h"
 #include "utf8.h"
 
 
@@ -83,7 +90,7 @@ static HashTable* message_get_properties(zval* object TSRMLS_DC);
 // Define object free method.
 // Define object free method.
 PHP_PROTO_OBJECT_FREE_START(MessageHeader, message)
 PHP_PROTO_OBJECT_FREE_START(MessageHeader, message)
   if (*(void**)intern->data != NULL) {
   if (*(void**)intern->data != NULL) {
-    stringsink_uninit(*(void**)intern->data);
+    stringsink_uninit_opaque(*(void**)intern->data);
     FREE(*(void**)intern->data);
     FREE(*(void**)intern->data);
   }
   }
   FREE(intern->data);
   FREE(intern->data);
@@ -904,12 +911,11 @@ PHP_METHOD(Field_Cardinality, name) {
     case 3:
     case 3:
       PHP_PROTO_RETURN_STRING("CARDINALITY_REPEATED", 1);
       PHP_PROTO_RETURN_STRING("CARDINALITY_REPEATED", 1);
     default:
     default:
-      zend_throw_exception(
-          NULL,
+      zend_throw_exception_ex(
+          NULL, 0 TSRMLS_CC,
           "Enum Google\\Protobuf\\Field_Cardinality has no name "
           "Enum Google\\Protobuf\\Field_Cardinality has no name "
           "defined for value %d.",
           "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_REQUIRED", name_len) == 0) RETURN_LONG(2);
   if (strncmp(name, "CARDINALITY_REPEATED", name_len) == 0) RETURN_LONG(3);
   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 "
       "Enum Google\\Protobuf\\Field_Cardinality has no value "
       "defined for name %s.",
       "defined for name %s.",
-      name,
-      0 TSRMLS_CC);
+      name);
 }
 }
 
 
 // -----------------------------------------------------------------------------
 // -----------------------------------------------------------------------------
@@ -1042,12 +1047,10 @@ PHP_METHOD(Field_Kind, name) {
     case 18:
     case 18:
       PHP_PROTO_RETURN_STRING("TYPE_SINT64", 1);
       PHP_PROTO_RETURN_STRING("TYPE_SINT64", 1);
     default:
     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_SINT32", name_len) == 0) RETURN_LONG(17);
   if (strncmp(name, "TYPE_SINT64", name_len) == 0) RETURN_LONG(18);
   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:
     case 0:
       PHP_PROTO_RETURN_STRING("NULL_VALUE", 1);
       PHP_PROTO_RETURN_STRING("NULL_VALUE", 1);
     default:
     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);
   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:
     case 1:
       PHP_PROTO_RETURN_STRING("SYNTAX_PROTO3", 1);
       PHP_PROTO_RETURN_STRING("SYNTAX_PROTO3", 1);
     default:
     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_PROTO2", name_len) == 0) RETURN_LONG(0);
   if (strncmp(name, "SYNTAX_PROTO3", name_len) == 0) RETURN_LONG(1);
   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);
 }
 }
 
 
 // -----------------------------------------------------------------------------
 // -----------------------------------------------------------------------------

+ 8 - 4
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,
 static inline int php_proto_zend_hash_update_zval(HashTable* ht,
                                                   const char* key, uint key_len,
                                                   const char* key, uint key_len,
                                                   zval* pData) {
                                                   zval* pData) {
+  void* result = NULL;
   zend_string* internal_key = zend_string_init(key, key_len, 0);
   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,
 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 duration_init(TSRMLS_D);
 void empty_init(TSRMLS_D);
 void empty_init(TSRMLS_D);
 void enum_descriptor_init(TSRMLS_D);
 void enum_descriptor_init(TSRMLS_D);
+void enum_value_descriptor_init(TSRMLS_D);
 void enum_init(TSRMLS_D);
 void enum_init(TSRMLS_D);
 void enum_value_init(TSRMLS_D);
 void enum_value_init(TSRMLS_D);
 void field_cardinality_init(TSRMLS_D);
 void field_cardinality_init(TSRMLS_D);
@@ -711,8 +714,8 @@ void struct_init(TSRMLS_D);
 void syntax_init(TSRMLS_D);
 void syntax_init(TSRMLS_D);
 void timestamp_init(TSRMLS_D);
 void timestamp_init(TSRMLS_D);
 void type_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 util_init(TSRMLS_D);
 void value_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 upb_pbdecodermethod *new_fillmsg_decodermethod(Descriptor *desc,
                                                      const void *owner);
                                                      const void *owner);
 void serialize_to_string(zval* val, zval* return_value TSRMLS_DC);
 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);
                        MessageHeader* msg);
 
 
 PHP_METHOD(Message, serializeToString);
 PHP_METHOD(Message, serializeToString);
@@ -1448,6 +1451,7 @@ extern zend_class_entry* value_type;
 upb_fieldtype_t to_fieldtype(upb_descriptortype_t type);
 upb_fieldtype_t to_fieldtype(upb_descriptortype_t type);
 const zend_class_entry* field_type_class(
 const zend_class_entry* field_type_class(
     const upb_fielddef* field PHP_PROTO_TSRMLS_DC);
     const upb_fielddef* field PHP_PROTO_TSRMLS_DC);
+void stringsink_uninit_opaque(void *sink);
 
 
 // -----------------------------------------------------------------------------
 // -----------------------------------------------------------------------------
 // Utilities.
 // Utilities.

+ 20 - 26
php/ext/google/protobuf/type_check.c

@@ -29,6 +29,7 @@
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
 #include <Zend/zend_operators.h>
 #include <Zend/zend_operators.h>
+#include <Zend/zend_exceptions.h>
 
 
 #include "protobuf.h"
 #include "protobuf.h"
 #include "utf8.h"
 #include "utf8.h"
@@ -434,9 +435,9 @@ PHP_METHOD(Util, checkMessage) {
     RETURN_NULL();
     RETURN_NULL();
   }
   }
   if (!instanceof_function(Z_OBJCE_P(val), klass TSRMLS_CC)) {
   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;
   }
   }
   RETURN_ZVAL(val, 1, 0);
   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) {
   } else if (Z_TYPE_P(val) == IS_OBJECT) {
     if (!instanceof_function(Z_OBJCE_P(val), repeated_field_type TSRMLS_CC)) {
     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;
       return;
     }
     }
     RepeatedField* intern = UNBOX(RepeatedField, val);
     RepeatedField* intern = UNBOX(RepeatedField, val);
     if (to_fieldtype(type) != intern->type) {
     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;
       return;
     }
     }
     if (klass != NULL && intern->msg_ce != klass) {
     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;
     }
     }
     RETURN_ZVAL(val, 1, 0);
     RETURN_ZVAL(val, 1, 0);
   } else {
   } 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;
     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);
     RETURN_ZVAL(CACHED_TO_ZVAL_PTR(map_field), 1, 1);
   } else if (Z_TYPE_P(val) == IS_OBJECT) {
   } else if (Z_TYPE_P(val) == IS_OBJECT) {
     if (!instanceof_function(Z_OBJCE_P(val), map_field_type TSRMLS_CC)) {
     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;
       return;
     }
     }
     Map* intern = UNBOX(Map, val);
     Map* intern = UNBOX(Map, val);
@@ -580,10 +575,9 @@ void check_map_field(const zend_class_entry* klass, PHP_PROTO_LONG key_type,
       return;
       return;
     }
     }
     if (klass != NULL && intern->msg_ce != klass) {
     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;
     }
     }
     RETURN_ZVAL(val, 1, 0);
     RETURN_ZVAL(val, 1, 0);