Fixed clone_obj for PHP8. (#8252)
PHP8 has a different method signature for clone_obj that takes a
zend_object* instead of a zval*.
diff --git a/php/ext/google/protobuf/array.c b/php/ext/google/protobuf/array.c
index 36ebb8d..3a2f734 100644
--- a/php/ext/google/protobuf/array.c
+++ b/php/ext/google/protobuf/array.c
@@ -118,8 +118,8 @@
*
* $rf2 = clone $rf1;
*/
-static zend_object *RepeatedField_clone_obj(zval *object) {
- RepeatedField* intern = (RepeatedField*)Z_OBJ_P(object);
+static zend_object *RepeatedField_clone_obj(PROTO_VAL *object) {
+ RepeatedField* intern = PROTO_VAL_P(object);
upb_arena *arena = Arena_Get(&intern->arena);
upb_array *clone = upb_array_new(arena, intern->type.type);
size_t n = upb_array_size(intern->array);
diff --git a/php/ext/google/protobuf/map.c b/php/ext/google/protobuf/map.c
index 3df3ed3..babd638 100644
--- a/php/ext/google/protobuf/map.c
+++ b/php/ext/google/protobuf/map.c
@@ -133,8 +133,8 @@
*
* $map2 = clone $map1;
*/
-static zend_object *MapField_clone_obj(zval *object) {
- MapField* intern = (MapField*)Z_OBJ_P(object);
+static zend_object *MapField_clone_obj(PROTO_VAL *object) {
+ MapField* intern = PROTO_VAL_P(object);
upb_arena *arena = Arena_Get(&intern->arena);
upb_map *clone =
upb_map_new(arena, intern->type.key_type, intern->type.val_type.type);
diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c
index 9016d36..7f27670 100644
--- a/php/ext/google/protobuf/message.c
+++ b/php/ext/google/protobuf/message.c
@@ -259,7 +259,7 @@
static int Message_has_property(PROTO_VAL *obj, PROTO_STR *member,
int has_set_exists,
void **cache_slot) {
- Message* intern = PROTO_MSG_P(obj);
+ Message* intern = PROTO_VAL_P(obj);
const upb_fielddef *f = get_field(intern, member);
if (!f) return 0;
@@ -294,7 +294,7 @@
*/
static void Message_unset_property(PROTO_VAL *obj, PROTO_STR *member,
void **cache_slot) {
- Message* intern = PROTO_MSG_P(obj);
+ Message* intern = PROTO_VAL_P(obj);
const upb_fielddef *f = get_field(intern, member);
if (!f) return;
@@ -331,7 +331,7 @@
*/
static zval *Message_read_property(PROTO_VAL *obj, PROTO_STR *member,
int type, void **cache_slot, zval *rv) {
- Message* intern = PROTO_MSG_P(obj);
+ Message* intern = PROTO_VAL_P(obj);
const upb_fielddef *f = get_field(intern, member);
if (!f) return NULL;
@@ -362,7 +362,7 @@
*/
static PROTO_RETURN_VAL Message_write_property(
PROTO_VAL *obj, PROTO_STR *member, zval *val, void **cache_slot) {
- Message* intern = PROTO_MSG_P(obj);
+ Message* intern = PROTO_VAL_P(obj);
const upb_fielddef *f = get_field(intern, member);
if (f && Message_set(intern, f, val)) {
@@ -400,8 +400,8 @@
*
* $msg2 = clone $msg;
*/
-static zend_object *Message_clone_obj(zval *object) {
- Message* intern = PROTO_MSG_P(object);
+static zend_object *Message_clone_obj(PROTO_VAL *object) {
+ Message* intern = PROTO_VAL_P(object);
upb_msg *clone = upb_msg_new(intern->desc->msgdef, Arena_Get(&intern->arena));
// TODO: copy unknown fields?
diff --git a/php/ext/google/protobuf/protobuf.h b/php/ext/google/protobuf/protobuf.h
index 322567e..2325282 100644
--- a/php/ext/google/protobuf/protobuf.h
+++ b/php/ext/google/protobuf/protobuf.h
@@ -58,13 +58,13 @@
#if PHP_VERSION_ID < 80000
#define PROTO_VAL zval
#define PROTO_STR zval
-#define PROTO_MSG_P(obj) (Message*)Z_OBJ_P(obj)
+#define PROTO_VAL_P(obj) Z_OBJ_P(obj)
#define PROTO_STRVAL_P(obj) Z_STRVAL_P(obj)
#define PROTO_STRLEN_P(obj) Z_STRLEN_P(obj)
#else
#define PROTO_VAL zend_object
#define PROTO_STR zend_string
-#define PROTO_MSG_P(obj) (Message*)(obj)
+#define PROTO_VAL_P(obj) (void*)(obj)
#define PROTO_STRVAL_P(obj) ZSTR_VAL(obj)
#define PROTO_STRLEN_P(obj) ZSTR_LEN(obj)
#endif