diff options
| -rw-r--r-- | 0001-fix-missing-return-after-exception.patch | 39 | ||||
| -rw-r--r-- | PHPINFO | 2 | ||||
| -rw-r--r-- | REFLECTION | 84 | ||||
| -rw-r--r-- | ds-php81.patch | 1345 | ||||
| -rw-r--r-- | php-pecl-ds.spec | 36 | 
5 files changed, 57 insertions, 1449 deletions
diff --git a/0001-fix-missing-return-after-exception.patch b/0001-fix-missing-return-after-exception.patch deleted file mode 100644 index 68b3a99..0000000 --- a/0001-fix-missing-return-after-exception.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 465cf909d98eb4f7c00c13ecb73e3d4c50e22e91 Mon Sep 17 00:00:00 2001 -From: Remi Collet <remi@remirepo.net> -Date: Tue, 3 Nov 2020 10:34:40 +0100 -Subject: [PATCH 1/2] fix missing return after exception - ---- - src/php/handlers/php_common_handlers.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/src/php/handlers/php_common_handlers.c b/src/php/handlers/php_common_handlers.c -index 7d84dfb..e2441b2 100644 ---- a/src/php/handlers/php_common_handlers.c -+++ b/src/php/handlers/php_common_handlers.c -@@ -38,6 +38,7 @@ zval *php_ds_read_dimension_by_key_not_supported - (zval *obj, zval *offset, int type, zval *rv) { - #endif -     ARRAY_ACCESS_BY_KEY_NOT_SUPPORTED(); -+    return NULL; - } -  - int php_ds_has_dimension_by_key_not_supported -@@ -47,6 +48,7 @@ int php_ds_has_dimension_by_key_not_supported - (zval *obj, zval *offset, int check_empty) { - #endif -     ARRAY_ACCESS_BY_KEY_NOT_SUPPORTED(); -+    return 0; - } -  - void php_ds_unset_dimension_by_key_not_supported -@@ -56,4 +58,4 @@ void php_ds_unset_dimension_by_key_not_supported - (zval *obj, zval *offset) { - #endif -     ARRAY_ACCESS_BY_KEY_NOT_SUPPORTED(); --} -\ No newline at end of file -+} ---  -2.25.4 - @@ -2,4 +2,4 @@  ds  ds support => enabled -ds version => 1.3.0 +ds version => 1.4.0 @@ -1,4 +1,4 @@ -Extension [ <persistent> extension #120 ds version 1.3.0 ] { +Extension [ <persistent> extension #120 ds version 1.4.0 ] {    - Dependencies {      Dependency [ json (Required) ] @@ -383,7 +383,7 @@ Extension [ <persistent> extension #120 ds version 1.3.0 ] {            - Parameters [0] {            } -          - Return [ ?Traversable ] +          - Return [ Traversable ]          }          Method [ <internal:ds, prototype Ds\Sequence> public method allocate ] { @@ -492,22 +492,22 @@ Extension [ <persistent> extension #120 ds version 1.3.0 ] {          Method [ <internal:ds, prototype ArrayAccess> public method offsetGet ] {            - Parameters [1] { -            Parameter #0 [ <required> $offset ] +            Parameter #0 [ <required> mixed $offset ]            }          }          Method [ <internal:ds, prototype ArrayAccess> public method offsetSet ] {            - Parameters [2] { -            Parameter #0 [ <required> $offset ] -            Parameter #1 [ <required> $value ] +            Parameter #0 [ <required> mixed $offset ] +            Parameter #1 [ <required> mixed $value ]            }          }          Method [ <internal:ds, prototype ArrayAccess> public method offsetUnset ] {            - Parameters [1] { -            Parameter #0 [ <required> $offset ] +            Parameter #0 [ <required> mixed $offset ]            }          } @@ -679,7 +679,7 @@ Extension [ <persistent> extension #120 ds version 1.3.0 ] {            - Parameters [0] {            } -          - Return [ ?Traversable ] +          - Return [ Traversable ]          }          Method [ <internal:ds, prototype Ds\Collection> public method clear ] { @@ -828,22 +828,22 @@ Extension [ <persistent> extension #120 ds version 1.3.0 ] {          Method [ <internal:ds, prototype ArrayAccess> public method offsetGet ] {            - Parameters [1] { -            Parameter #0 [ <required> $offset ] +            Parameter #0 [ <required> mixed $offset ]            }          }          Method [ <internal:ds, prototype ArrayAccess> public method offsetSet ] {            - Parameters [2] { -            Parameter #0 [ <required> $offset ] -            Parameter #1 [ <required> $value ] +            Parameter #0 [ <required> mixed $offset ] +            Parameter #1 [ <required> mixed $value ]            }          }          Method [ <internal:ds, prototype ArrayAccess> public method offsetUnset ] {            - Parameters [1] { -            Parameter #0 [ <required> $offset ] +            Parameter #0 [ <required> mixed $offset ]            }          } @@ -1007,7 +1007,7 @@ Extension [ <persistent> extension #120 ds version 1.3.0 ] {            - Parameters [0] {            } -          - Return [ ?Traversable ] +          - Return [ Traversable ]          }          Method [ <internal:ds, prototype ArrayAccess> public method offsetExists ] { @@ -1021,22 +1021,22 @@ Extension [ <persistent> extension #120 ds version 1.3.0 ] {          Method [ <internal:ds, prototype ArrayAccess> public method offsetGet ] {            - Parameters [1] { -            Parameter #0 [ <required> $offset ] +            Parameter #0 [ <required> mixed $offset ]            }          }          Method [ <internal:ds, prototype ArrayAccess> public method offsetSet ] {            - Parameters [2] { -            Parameter #0 [ <required> $offset ] -            Parameter #1 [ <required> $value ] +            Parameter #0 [ <required> mixed $offset ] +            Parameter #1 [ <required> mixed $value ]            }          }          Method [ <internal:ds, prototype ArrayAccess> public method offsetUnset ] {            - Parameters [1] { -            Parameter #0 [ <required> $offset ] +            Parameter #0 [ <required> mixed $offset ]            }          } @@ -1082,7 +1082,7 @@ Extension [ <persistent> extension #120 ds version 1.3.0 ] {        }      } -    Class [ <internal:ds> <iterateable> final class Ds\Queue implements Ds\Collection, JsonSerializable, Countable, Traversable, IteratorAggregate ] { +    Class [ <internal:ds> <iterateable> final class Ds\Queue implements Ds\Collection, JsonSerializable, Countable, Traversable, IteratorAggregate, ArrayAccess ] {        - Constants [1] {          Constant [ public int MIN_CAPACITY ] { 8 } @@ -1142,10 +1142,10 @@ Extension [ <persistent> extension #120 ds version 1.3.0 ] {            - Parameters [0] {            } -          - Return [ ?Traversable ] +          - Return [ Traversable ]          } -        Method [ <internal:ds> public method offsetExists ] { +        Method [ <internal:ds, prototype ArrayAccess> public method offsetExists ] {            - Parameters [1] {              Parameter #0 [ <required> $offset ] @@ -1153,25 +1153,25 @@ Extension [ <persistent> extension #120 ds version 1.3.0 ] {            - Return [ bool ]          } -        Method [ <internal:ds> public method offsetGet ] { +        Method [ <internal:ds, prototype ArrayAccess> public method offsetGet ] {            - Parameters [1] { -            Parameter #0 [ <required> $offset ] +            Parameter #0 [ <required> mixed $offset ]            }          } -        Method [ <internal:ds> public method offsetSet ] { +        Method [ <internal:ds, prototype ArrayAccess> public method offsetSet ] {            - Parameters [2] { -            Parameter #0 [ <required> $offset ] -            Parameter #1 [ <required> $value ] +            Parameter #0 [ <required> mixed $offset ] +            Parameter #1 [ <required> mixed $value ]            }          } -        Method [ <internal:ds> public method offsetUnset ] { +        Method [ <internal:ds, prototype ArrayAccess> public method offsetUnset ] {            - Parameters [1] { -            Parameter #0 [ <required> $offset ] +            Parameter #0 [ <required> mixed $offset ]            }          } @@ -1477,7 +1477,7 @@ Extension [ <persistent> extension #120 ds version 1.3.0 ] {            - Parameters [0] {            } -          - Return [ ?Traversable ] +          - Return [ Traversable ]          }          Method [ <internal:ds, prototype ArrayAccess> public method offsetExists ] { @@ -1491,22 +1491,22 @@ Extension [ <persistent> extension #120 ds version 1.3.0 ] {          Method [ <internal:ds, prototype ArrayAccess> public method offsetGet ] {            - Parameters [1] { -            Parameter #0 [ <required> $offset ] +            Parameter #0 [ <required> mixed $offset ]            }          }          Method [ <internal:ds, prototype ArrayAccess> public method offsetSet ] {            - Parameters [2] { -            Parameter #0 [ <required> $offset ] -            Parameter #1 [ <required> $value ] +            Parameter #0 [ <required> mixed $offset ] +            Parameter #1 [ <required> mixed $value ]            }          }          Method [ <internal:ds, prototype ArrayAccess> public method offsetUnset ] {            - Parameters [1] { -            Parameter #0 [ <required> $offset ] +            Parameter #0 [ <required> mixed $offset ]            }          } @@ -1552,7 +1552,7 @@ Extension [ <persistent> extension #120 ds version 1.3.0 ] {        }      } -    Class [ <internal:ds> <iterateable> final class Ds\Set implements Ds\Collection, JsonSerializable, Countable, Traversable, IteratorAggregate ] { +    Class [ <internal:ds> <iterateable> final class Ds\Set implements Ds\Collection, JsonSerializable, Countable, Traversable, IteratorAggregate, ArrayAccess ] {        - Constants [1] {          Constant [ public int MIN_CAPACITY ] { 8 } @@ -1748,10 +1748,10 @@ Extension [ <persistent> extension #120 ds version 1.3.0 ] {            - Parameters [0] {            } -          - Return [ ?Traversable ] +          - Return [ Traversable ]          } -        Method [ <internal:ds> public method offsetExists ] { +        Method [ <internal:ds, prototype ArrayAccess> public method offsetExists ] {            - Parameters [1] {              Parameter #0 [ <required> $offset ] @@ -1759,25 +1759,25 @@ Extension [ <persistent> extension #120 ds version 1.3.0 ] {            - Return [ bool ]          } -        Method [ <internal:ds> public method offsetGet ] { +        Method [ <internal:ds, prototype ArrayAccess> public method offsetGet ] {            - Parameters [1] { -            Parameter #0 [ <required> $offset ] +            Parameter #0 [ <required> mixed $offset ]            }          } -        Method [ <internal:ds> public method offsetSet ] { +        Method [ <internal:ds, prototype ArrayAccess> public method offsetSet ] {            - Parameters [2] { -            Parameter #0 [ <required> $offset ] -            Parameter #1 [ <required> $value ] +            Parameter #0 [ <required> mixed $offset ] +            Parameter #1 [ <required> mixed $value ]            }          } -        Method [ <internal:ds> public method offsetUnset ] { +        Method [ <internal:ds, prototype ArrayAccess> public method offsetUnset ] {            - Parameters [1] { -            Parameter #0 [ <required> $offset ] +            Parameter #0 [ <required> mixed $offset ]            }          } @@ -1883,7 +1883,7 @@ Extension [ <persistent> extension #120 ds version 1.3.0 ] {            - Parameters [0] {            } -          - Return [ ?Traversable ] +          - Return [ Traversable ]          }          Method [ <internal:ds, prototype Ds\Collection> public method clear ] { diff --git a/ds-php81.patch b/ds-php81.patch deleted file mode 100644 index 470ab65..0000000 --- a/ds-php81.patch +++ /dev/null @@ -1,1345 +0,0 @@ -diff --git a/src/common.h b/src/common.h -index cd90519..5ff8cd4 100644 ---- a/src/common.h -+++ b/src/common.h -@@ -222,6 +222,17 @@ int name##_unserialize(                 \ -     zend_ce_error, \ -     "Immutable objects may not be changed") -  -+// https://bugs.php.net/bug.php?id=80816 -+#if PHP_VERSION_ID >= 80100 -+#define spl_ce_Aggregate     zend_ce_aggregate -+#define spl_ce_ArrayAccess   zend_ce_arrayaccess -+#define spl_ce_Countable     zend_ce_countable -+#define spl_ce_Iterator      zend_ce_iterator -+#define spl_ce_Serializable  zend_ce_serializable -+#define spl_ce_Stringable    zend_ce_stringable -+#define spl_ce_Traversable   zend_ce_traversable -+#endif -+ - /** -  * -  */ -diff --git a/src/php/arginfo.h b/src/php/arginfo.h -index 9b2e4b8..605d63e 100644 ---- a/src/php/arginfo.h -+++ b/src/php/arginfo.h -@@ -82,6 +82,75 @@ ZEND_ARG_TYPE_INFO(0, i, IS_LONG, 0) \ - ZEND_ARG_VARIADIC_INFO(0, v) \ - ZEND_END_ARG_INFO() -  -+#if PHP_VERSION_ID >= 80100 -+ -+#define ARGINFO_OFFSET_GET(name) \ -+    ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_##name, 0, 1, IS_MIXED, 0) \ -+	ZEND_ARG_TYPE_INFO(0, offset, IS_MIXED, 0) \ -+    ZEND_END_ARG_INFO() -+ -+#define ARGINFO_OFFSET_SET(name) \ -+    ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_##name, 0, 2, IS_VOID, 0) \ -+	ZEND_ARG_TYPE_INFO(0, offset, IS_MIXED, 0) \ -+	ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) \ -+    ZEND_END_ARG_INFO() -+ -+#define ARGINFO_OFFSET_UNSET(name) \ -+    ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_##name, 0, 1, IS_VOID, 0) \ -+	ZEND_ARG_TYPE_INFO(0, offset, IS_MIXED, 0) \ -+    ZEND_END_ARG_INFO() -+ -+#elif PHP_VERSION_ID >= 80000 -+ -+#define ARGINFO_OFFSET_GET(name) \ -+    ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 1) \ -+	ZEND_ARG_TYPE_INFO(0, offset, IS_MIXED, 0) \ -+    ZEND_END_ARG_INFO() -+ -+#define ARGINFO_OFFSET_SET(name) \ -+    ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 2) \ -+	ZEND_ARG_TYPE_INFO(0, offset, IS_MIXED, 0) \ -+	ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) \ -+    ZEND_END_ARG_INFO() -+ -+#define ARGINFO_OFFSET_UNSET(name) \ -+    ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 1) \ -+	ZEND_ARG_TYPE_INFO(0, offset, IS_MIXED, 0) \ -+    ZEND_END_ARG_INFO() -+ -+#else -+ -+#define ARGINFO_OFFSET_GET(name) \ -+    ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 1) \ -+    ZEND_ARG_INFO(0, offset) \ -+    ZEND_END_ARG_INFO() -+ -+#define ARGINFO_OFFSET_SET(name) \ -+    ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 2) \ -+    ZEND_ARG_INFO(0, offset) \ -+    ZEND_ARG_INFO(0, value) \ -+    ZEND_END_ARG_INFO() -+ -+#define ARGINFO_OFFSET_UNSET(name) \ -+    ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 1) \ -+    ZEND_ARG_INFO(0, offset) \ -+    ZEND_END_ARG_INFO() -+ -+#endif -+ -+#if PHP_VERSION_ID >= 80100 -+ -+#define ARGINFO_NONE_RETURN_TYPE(name, type) \ -+    ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_##name, 0, 0, type, 0) \ -+    ZEND_END_ARG_INFO() -+#else -+ -+#define ARGINFO_NONE_RETURN_TYPE(name, type) \ -+    ZEND_BEGIN_ARG_INFO_EX(arginfo_##name, 0, 0, 0) \ -+    ZEND_END_ARG_INFO() -+ -+#endif -+ - #if PHP_VERSION_ID >= 80000 - #define DS_BEGIN_ARG_WITH_RETURN_DS_INFO_EX(name, pass_by_ref, required_num_args, class_name, allow_null) \ -     static const zend_internal_arg_info arginfo_##name[] = { \ -@@ -110,7 +179,11 @@ ZEND_END_ARG_INFO() - 		{ (const char*)(zend_uintptr_t)(required_num_args), class_name, IS_OBJECT, pass_by_ref, allow_null, 0 }, - #endif -  --#if PHP_VERSION_ID >= 80000 -+#if PHP_VERSION_ID >= 80100 -+#define DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, pass_by_ref, required_num_args, type, allow_null) \ -+    static const zend_internal_arg_info arginfo_##name[] = { \ -+        { (const char*)(zend_uintptr_t)(required_num_args), ZEND_TYPE_INIT_CODE(type, allow_null, _ZEND_ARG_INFO_FLAGS(pass_by_ref, 0, 0)) }, -+#elif PHP_VERSION_ID >= 80000 - #define DS_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, pass_by_ref, required_num_args, type, allow_null) \ -     static const zend_internal_arg_info arginfo_##name[] = { \ -         { (const char*)(zend_uintptr_t)(required_num_args), ZEND_TYPE_INIT_CODE(type, allow_null, _ZEND_ARG_INFO_FLAGS(pass_by_ref, 0)) }, -@@ -178,7 +251,7 @@ ZEND_END_ARG_INFO() -     ZEND_END_ARG_INFO() -  - #define ARGINFO_NONE_RETURN_OBJ(name, class_name) \ --    DS_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(name, 0, 0, #class_name, 1) \ -+    DS_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(name, 0, 0, #class_name, 0) \ -     ZEND_END_ARG_INFO() -  - #define ARGINFO_NONE_RETURN_BOOL(name) \ -diff --git a/src/php/classes/php_collection_ce.h b/src/php/classes/php_collection_ce.h -index 101ac94..83aec6b 100644 ---- a/src/php/classes/php_collection_ce.h -+++ b/src/php/classes/php_collection_ce.h -@@ -21,7 +21,7 @@ ARGINFO_NONE_RETURN_DS(     Collection_copy, Collection); - ARGINFO_NONE(               Collection_clear); - ARGINFO_NONE_RETURN_LONG(   Collection_count); - ARGINFO_NONE_RETURN_BOOL(   Collection_isEmpty); --ARGINFO_NONE(               Collection_jsonSerialize); -+ARGINFO_NONE_RETURN_TYPE(   Collection_jsonSerialize, IS_MIXED); - ARGINFO_NONE_RETURN_ARRAY(  Collection_toArray); -  - void php_ds_register_collection(); -diff --git a/src/php/classes/php_map_ce.h b/src/php/classes/php_map_ce.h -index e36f670..c732af2 100644 ---- a/src/php/classes/php_map_ce.h -+++ b/src/php/classes/php_map_ce.h -@@ -27,7 +27,7 @@ ARGINFO_NONE_RETURN_DS(                     Map_keys, Set); - ARGINFO_NONE_RETURN_DS(                     Map_last, Pair); - ARGINFO_ZVAL_RETURN_DS(                     Map_merge, values, Map); - ARGINFO_NONE_RETURN_DS(                     Map_pairs, Sequence); --ARGINFO_NONE(                               Map_jsonSerialize); -+ARGINFO_NONE_RETURN_TYPE(                   Map_jsonSerialize, IS_MIXED); - ARGINFO_OPTIONAL_CALLABLE_RETURN_DS(        Map_filter, callback, Map); - ARGINFO_NONE_RETURN_DS(                     Map_first, Pair); - ARGINFO_CALLABLE_OPTIONAL_ZVAL(             Map_reduce, callback, initial); -@@ -43,9 +43,9 @@ ARGINFO_DS_RETURN_DS(                       Map_xor, map, Map, Map); - ARGINFO_NONE_RETURN_OBJ(					Map_getIterator, Traversable); -  - ARGINFO_ZVAL_RETURN_BOOL(                   Map_offsetExists, offset); --ARGINFO_ZVAL(                               Map_offsetGet, offset); --ARGINFO_ZVAL_ZVAL(                          Map_offsetSet, offset, value); --ARGINFO_ZVAL(                               Map_offsetUnset, offset); -+ARGINFO_OFFSET_GET(                         Map_offsetGet); -+ARGINFO_OFFSET_SET(                         Map_offsetSet); -+ARGINFO_OFFSET_UNSET(                       Map_offsetUnset); -  - void php_ds_register_map(); -  -diff --git a/src/php/classes/php_pair_ce.h b/src/php/classes/php_pair_ce.h -index bcbbe74..1ffc95d 100644 ---- a/src/php/classes/php_pair_ce.h -+++ b/src/php/classes/php_pair_ce.h -@@ -10,7 +10,7 @@ extern zend_class_entry *php_ds_pair_ce; - ARGINFO_OPTIONAL_ZVAL_OPTIONAL_ZVAL(    Pair___construct, key, value); - ARGINFO_NONE_RETURN_DS(                 Pair_copy, Pair); - ARGINFO_NONE_RETURN_ARRAY(              Pair_toArray); --ARGINFO_NONE(                           Pair_jsonSerialize); -+ARGINFO_NONE_RETURN_TYPE(               Pair_jsonSerialize, IS_MIXED); -  - void php_ds_register_pair(); -  -diff --git a/src/php/classes/php_queue_ce.c b/src/php/classes/php_queue_ce.c -index cdec675..d7bfd45 100644 ---- a/src/php/classes/php_queue_ce.c -+++ b/src/php/classes/php_queue_ce.c -@@ -152,7 +152,11 @@ void php_ds_register_queue() -     php_ds_queue_ce->unserialize    = php_ds_queue_unserialize; -  -     zend_declare_class_constant_long(php_ds_queue_ce, STR_AND_LEN("MIN_CAPACITY"), DS_DEQUE_MIN_CAPACITY); --    zend_class_implements(php_ds_queue_ce, 1, collection_ce); -+ -+    zend_class_implements(php_ds_queue_ce, 2, -+        collection_ce, -+        zend_ce_arrayaccess -+    ); -  -     php_ds_register_queue_handlers(); - } -diff --git a/src/php/classes/php_queue_ce.h b/src/php/classes/php_queue_ce.h -index dcd02d4..acdddb8 100644 ---- a/src/php/classes/php_queue_ce.h -+++ b/src/php/classes/php_queue_ce.h -@@ -16,9 +16,9 @@ ARGINFO_NONE(                   Queue_peek); - ARGINFO_NONE_RETURN_OBJ(		Queue_getIterator, Traversable); -  - ARGINFO_ZVAL_RETURN_BOOL(       Queue_offsetExists, offset); --ARGINFO_ZVAL(                   Queue_offsetGet, offset); --ARGINFO_ZVAL_ZVAL(              Queue_offsetSet, offset, value); --ARGINFO_ZVAL(                   Queue_offsetUnset, offset); -+ARGINFO_OFFSET_GET(             Queue_offsetGet); -+ARGINFO_OFFSET_SET(             Queue_offsetSet); -+ARGINFO_OFFSET_UNSET(           Queue_offsetUnset); -  - void php_ds_register_queue(); -  -diff --git a/src/php/classes/php_sequence_ce.h b/src/php/classes/php_sequence_ce.h -index ec56282..dff20f6 100644 ---- a/src/php/classes/php_sequence_ce.h -+++ b/src/php/classes/php_sequence_ce.h -@@ -55,9 +55,9 @@ ARGINFO_NONE(                           Sequence_last); - ARGINFO_CALLABLE_RETURN_DS(             Sequence_map, callback, Sequence); - ARGINFO_ZVAL_RETURN_DS(                 Sequence_merge, values, Sequence); - ARGINFO_ZVAL_RETURN_BOOL(              	Sequence_offsetExists, offset); --ARGINFO_ZVAL(    						Sequence_offsetGet, offset); --ARGINFO_ZVAL_ZVAL(                      Sequence_offsetSet, offset, value); --ARGINFO_ZVAL(                  		    Sequence_offsetUnset, offset); -+ARGINFO_OFFSET_GET(         		    Sequence_offsetGet); -+ARGINFO_OFFSET_SET(                     Sequence_offsetSet); -+ARGINFO_OFFSET_UNSET(          		    Sequence_offsetUnset); - ARGINFO_NONE(                           Sequence_pop); - ARGINFO_VARIADIC_ZVAL(                  Sequence_push, values); - ARGINFO_CALLABLE_OPTIONAL_ZVAL(         Sequence_reduce, callback, initial); -diff --git a/src/php/classes/php_set_ce.c b/src/php/classes/php_set_ce.c -index e3940f2..7087a1f 100644 ---- a/src/php/classes/php_set_ce.c -+++ b/src/php/classes/php_set_ce.c -@@ -309,6 +309,10 @@ void php_ds_register_set() -         DS_HTABLE_MIN_CAPACITY -     ); -  --    zend_class_implements(php_ds_set_ce, 1, collection_ce); -+    zend_class_implements(php_ds_set_ce, 2, -+        collection_ce, -+        zend_ce_arrayaccess -+    ); -+ -     php_ds_register_set_handlers(); - } -diff --git a/src/php/classes/php_set_ce.h b/src/php/classes/php_set_ce.h -index b3c6e65..bdda6d1 100644 ---- a/src/php/classes/php_set_ce.h -+++ b/src/php/classes/php_set_ce.h -@@ -34,9 +34,9 @@ ARGINFO_NONE(                               Set_sum); - ARGINFO_NONE_RETURN_OBJ(                    Set_getIterator, Traversable); -  - ARGINFO_ZVAL_RETURN_BOOL(                   Set_offsetExists, offset); --ARGINFO_ZVAL(                               Set_offsetGet, offset); --ARGINFO_ZVAL_ZVAL(                          Set_offsetSet, offset, value); --ARGINFO_ZVAL(                               Set_offsetUnset, offset); -+ARGINFO_OFFSET_GET( 	                    Set_offsetGet); -+ARGINFO_OFFSET_SET(                         Set_offsetSet); -+ARGINFO_OFFSET_UNSET(                       Set_offsetUnset); -  - void php_ds_register_set(); -  -diff --git a/src/php/classes/php_stack_ce.h b/src/php/classes/php_stack_ce.h -index 1119b0f..c63a6cd 100644 ---- a/src/php/classes/php_stack_ce.h -+++ b/src/php/classes/php_stack_ce.h -@@ -16,9 +16,9 @@ ARGINFO_NONE(                   Stack_peek); - ARGINFO_NONE_RETURN_OBJ(        Stack_getIterator, Traversable); -  - ARGINFO_ZVAL_RETURN_BOOL(       Stack_offsetExists, offset); --ARGINFO_ZVAL(                   Stack_offsetGet, offset); --ARGINFO_ZVAL_ZVAL(              Stack_offsetSet, offset, value); --ARGINFO_ZVAL(                   Stack_offsetUnset, offset); -+ARGINFO_OFFSET_GET(             Stack_offsetGet); -+ARGINFO_OFFSET_SET(             Stack_offsetSet); -+ARGINFO_OFFSET_UNSET(           Stack_offsetUnset); -  - void php_ds_register_stack(); -  -diff --git a/src/php/handlers/php_common_handlers.c b/src/php/handlers/php_common_handlers.c -index 7d84dfb..e2441b2 100644 ---- a/src/php/handlers/php_common_handlers.c -+++ b/src/php/handlers/php_common_handlers.c -@@ -38,6 +38,7 @@ zval *php_ds_read_dimension_by_key_not_supported - (zval *obj, zval *offset, int type, zval *rv) { - #endif -     ARRAY_ACCESS_BY_KEY_NOT_SUPPORTED(); -+    return NULL; - } -  - int php_ds_has_dimension_by_key_not_supported -@@ -47,6 +48,7 @@ int php_ds_has_dimension_by_key_not_supported - (zval *obj, zval *offset, int check_empty) { - #endif -     ARRAY_ACCESS_BY_KEY_NOT_SUPPORTED(); -+    return 0; - } -  - void php_ds_unset_dimension_by_key_not_supported -@@ -56,4 +58,4 @@ void php_ds_unset_dimension_by_key_not_supported - (zval *obj, zval *offset) { - #endif -     ARRAY_ACCESS_BY_KEY_NOT_SUPPORTED(); --} -\ No newline at end of file -+} -diff --git a/src/php/handlers/php_deque_handlers.c b/src/php/handlers/php_deque_handlers.c -index 0bfe187..07ba92c 100644 ---- a/src/php/handlers/php_deque_handlers.c -+++ b/src/php/handlers/php_deque_handlers.c -@@ -9,7 +9,7 @@ zend_object_handlers php_deque_handlers; - static zval *php_ds_deque_read_dimension - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval *offset, int type, zval *return_value) { --    ds_deque_t *deque = ((php_ds_deque_t*)obj)->deque; -+    ds_deque_t *deque = php_ds_deque_fetch_object(obj)->deque; - #else - (zval *obj, zval *offset, int type, zval *return_value) { -     ds_deque_t *deque = Z_DS_DEQUE_P(obj); -@@ -47,7 +47,7 @@ static zval *php_ds_deque_read_dimension - static void php_ds_deque_write_dimension - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval *offset, zval *value) { --    ds_deque_t *deque = ((php_ds_deque_t*)obj)->deque; -+    ds_deque_t *deque = php_ds_deque_fetch_object(obj)->deque; - #else - (zval *obj, zval *offset, zval *value) { -     ds_deque_t *deque = Z_DS_DEQUE_P(obj); -@@ -69,7 +69,7 @@ static void php_ds_deque_write_dimension - static int php_ds_deque_has_dimension - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval *offset, int check_empty) { --    ds_deque_t *deque = ((php_ds_deque_t*)obj)->deque; -+    ds_deque_t *deque = php_ds_deque_fetch_object(obj)->deque; - #else - (zval *obj, zval *offset, int check_empty) { -     ds_deque_t *deque = Z_DS_DEQUE_P(obj); -@@ -86,7 +86,7 @@ static int php_ds_deque_has_dimension - static void php_ds_deque_unset_dimension - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval *offset) { --    ds_deque_t *deque = ((php_ds_deque_t*)obj)->deque; -+    ds_deque_t *deque = php_ds_deque_fetch_object(obj)->deque; - #else - (zval *obj, zval *offset) { -     ds_deque_t *deque = Z_DS_DEQUE_P(obj); -@@ -111,24 +111,25 @@ static void php_ds_deque_unset_dimension - static int php_ds_deque_count_elements - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zend_long *count) { --    *count = ((php_ds_deque_t*)obj)->deque->size; return SUCCESS; -+    *count = php_ds_deque_fetch_object(obj)->deque->size; - #else - (zval *obj, zend_long *count) { --    *count = Z_DS_DEQUE_P(obj)->size; return SUCCESS; -+    *count = Z_DS_DEQUE_P(obj)->size; - #endif -+    return SUCCESS; - } -  - static void php_ds_deque_free_object(zend_object *object) - { --    php_ds_deque_t *obj = (php_ds_deque_t*) object; --    zend_object_std_dtor(&obj->std); -+    php_ds_deque_t *obj = php_ds_deque_fetch_object(object); -     ds_deque_free(obj->deque); -+    zend_object_std_dtor(&obj->std); - } -  - static HashTable *php_ds_deque_get_debug_info - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, int *is_temp) { --    ds_deque_t *deque = ((php_ds_deque_t*)obj)->deque; -+    ds_deque_t *deque = php_ds_deque_fetch_object(obj)->deque; - #else - (zval *obj, int *is_temp) { -     ds_deque_t *deque = Z_DS_DEQUE_P(obj); -@@ -142,7 +143,7 @@ static HashTable *php_ds_deque_get_debug_info - static zend_object *php_ds_deque_clone_obj - #if PHP_VERSION_ID >= 80000 - (zend_object *obj) { --    return php_ds_deque_create_clone(((php_ds_deque_t*)obj)->deque); -+    return php_ds_deque_create_clone(php_ds_deque_fetch_object(obj)->deque); - #else  - (zval *obj) { -     return php_ds_deque_create_clone(Z_DS_DEQUE_P(obj)); -@@ -152,7 +153,7 @@ static zend_object *php_ds_deque_clone_obj - static HashTable *php_ds_deque_get_gc - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval **gc_data, int *gc_count) { --    ds_deque_t *deque = ((php_ds_deque_t*)obj)->deque; -+    ds_deque_t *deque = php_ds_deque_fetch_object(obj)->deque; - #else - (zval *obj, zval **gc_data, int *gc_count) { -     ds_deque_t *deque = Z_DS_DEQUE_P(obj); -diff --git a/src/php/handlers/php_map_handlers.c b/src/php/handlers/php_map_handlers.c -index 852842e..0b46c5a 100644 ---- a/src/php/handlers/php_map_handlers.c -+++ b/src/php/handlers/php_map_handlers.c -@@ -8,7 +8,7 @@ zend_object_handlers php_map_handlers; - static zval *php_ds_map_read_dimension - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval *offset, int type, zval *rv) { --    ds_map_t *map = ((php_ds_map_t*)obj)->map; -+    ds_map_t *map = php_ds_map_fetch_object(obj)->map; - #else - (zval *obj, zval *offset, int type, zval *rv) { -     ds_map_t *map = Z_DS_MAP_P(obj); -@@ -46,7 +46,7 @@ static zval *php_ds_map_read_dimension - static void php_ds_map_write_dimension - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval *offset, zval *value) { --    ds_map_t *map = ((php_ds_map_t*)obj)->map; -+    ds_map_t *map = php_ds_map_fetch_object(obj)->map; - #else - (zval *obj, zval *offset, zval *value) { -     ds_map_t *map = Z_DS_MAP_P(obj); -@@ -62,7 +62,7 @@ static void php_ds_map_write_dimension - static int php_ds_map_has_dimension - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval *offset, int check_empty) { --    ds_map_t *map = ((php_ds_map_t*)obj)->map; -+    ds_map_t *map = php_ds_map_fetch_object(obj)->map; - #else - (zval *obj, zval *offset, int check_empty) { -     ds_map_t *map = Z_DS_MAP_P(obj); -@@ -74,7 +74,7 @@ static int php_ds_map_has_dimension - static void php_ds_map_unset_dimension - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval *offset) { --    ds_map_t *map = ((php_ds_map_t*)obj)->map; -+    ds_map_t *map = php_ds_map_fetch_object(obj)->map; - #else - (zval *obj, zval *offset) { -     ds_map_t *map = Z_DS_MAP_P(obj); -@@ -86,7 +86,7 @@ static void php_ds_map_unset_dimension - static int php_ds_map_count_elements - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zend_long *count) { --    ds_map_t *map = ((php_ds_map_t*)obj)->map; -+    ds_map_t *map = php_ds_map_fetch_object(obj)->map; - #else - (zval *obj, zend_long *count) { -     ds_map_t *map = Z_DS_MAP_P(obj); -@@ -97,15 +97,15 @@ static int php_ds_map_count_elements -  - static void php_ds_map_free_object(zend_object *object) - { --    php_ds_map_t *intern = (php_ds_map_t*) object; --    zend_object_std_dtor(&intern->std); -+    php_ds_map_t *intern = php_ds_map_fetch_object(object); -     ds_map_free(intern->map); -+    zend_object_std_dtor(&intern->std); - } -  - static HashTable *php_ds_map_get_debug_info - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, int *is_temp) { --    ds_map_t *map = ((php_ds_map_t*)obj)->map; -+    ds_map_t *map = php_ds_map_fetch_object(obj)->map; - #else - (zval *obj, int *is_temp) { -     ds_map_t *map = Z_DS_MAP_P(obj); -@@ -117,7 +117,7 @@ static HashTable *php_ds_map_get_debug_info - static zend_object *php_ds_map_clone_obj - #if PHP_VERSION_ID >= 80000 - (zend_object *obj) { --    ds_map_t *map = ((php_ds_map_t*)obj)->map; -+    ds_map_t *map = php_ds_map_fetch_object(obj)->map; - #else - (zval *obj) { -     ds_map_t *map = Z_DS_MAP_P(obj); -@@ -128,7 +128,7 @@ static zend_object *php_ds_map_clone_obj - static HashTable *php_ds_map_get_gc - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval **gc_data, int *gc_size) { --    ds_map_t *map = ((php_ds_map_t*)obj)->map; -+    ds_map_t *map = php_ds_map_fetch_object(obj)->map; - #else - (zval *obj, zval **gc_data, int *gc_size) { -     ds_map_t *map = Z_DS_MAP_P(obj); -@@ -147,7 +147,7 @@ void php_ds_register_map_handlers() - { -     memcpy(&php_map_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); -  --    php_map_handlers.offset             = 0; -+    php_map_handlers.offset             = XtOffsetOf(php_ds_map_t, std); -     php_map_handlers.dtor_obj           = zend_objects_destroy_object; -     php_map_handlers.get_gc             = php_ds_map_get_gc; -     php_map_handlers.free_obj           = php_ds_map_free_object; -diff --git a/src/php/handlers/php_priority_queue_handlers.c b/src/php/handlers/php_priority_queue_handlers.c -index 99cf7e6..cae059e 100644 ---- a/src/php/handlers/php_priority_queue_handlers.c -+++ b/src/php/handlers/php_priority_queue_handlers.c -@@ -8,19 +8,19 @@ zend_object_handlers php_priority_queue_handlers; -  - static void php_ds_priority_queue_free_object(zend_object *object) - { --    php_ds_priority_queue_t *queue = (php_ds_priority_queue_t*) object; --    zend_object_std_dtor(&queue->std); -+    php_ds_priority_queue_t *queue = php_ds_priority_queue_fetch_object(object); -     ds_priority_queue_free(queue->queue); -  -     if (queue->gc_data != NULL) { -         efree(queue->gc_data); -     } -+    zend_object_std_dtor(&queue->std); - } -  - static int php_ds_priority_queue_count_elements - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zend_long *count) { --    ds_priority_queue_t *pq = ((php_ds_priority_queue_t *) obj)->queue; -+    ds_priority_queue_t *pq = php_ds_priority_queue_fetch_object(obj)->queue; - #else - (zval *obj, zend_long *count) { -     ds_priority_queue_t *pq = Z_DS_PRIORITY_QUEUE_P(obj); -@@ -32,7 +32,7 @@ static int php_ds_priority_queue_count_elements - static zend_object *php_ds_priority_queue_clone_obj - #if PHP_VERSION_ID >= 80000 - (zend_object *obj) { --    ds_priority_queue_t *pq = ((php_ds_priority_queue_t *) obj)->queue; -+    ds_priority_queue_t *pq = php_ds_priority_queue_fetch_object(obj)->queue; - #else - (zval *obj) { -     ds_priority_queue_t *pq = Z_DS_PRIORITY_QUEUE_P(obj); -@@ -43,7 +43,7 @@ static zend_object *php_ds_priority_queue_clone_obj - static HashTable *php_ds_priority_queue_get_debug_info - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, int *is_temp) { --    ds_priority_queue_t *pq = ((php_ds_priority_queue_t *) obj)->queue; -+    ds_priority_queue_t *pq = php_ds_priority_queue_fetch_object(obj)->queue; - #else - (zval *obj, int *is_temp) { -     ds_priority_queue_t *pq = Z_DS_PRIORITY_QUEUE_P(obj); -@@ -57,7 +57,7 @@ static HashTable *php_ds_priority_queue_get_debug_info - static HashTable *php_ds_priority_queue_get_gc - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval **gc_data, int *gc_size) { --    ds_priority_queue_t *pq = ((php_ds_priority_queue_t *) obj)->queue; -+    ds_priority_queue_t *pq = php_ds_priority_queue_fetch_object(obj)->queue; - #else - (zval *obj, zval **gc_data, int *gc_size) { -     ds_priority_queue_t *pq = Z_DS_PRIORITY_QUEUE_P(obj); -diff --git a/src/php/handlers/php_queue_handlers.c b/src/php/handlers/php_queue_handlers.c -index 7a00c9e..cd0c78e 100644 ---- a/src/php/handlers/php_queue_handlers.c -+++ b/src/php/handlers/php_queue_handlers.c -@@ -10,7 +10,7 @@ zend_object_handlers php_queue_handlers; - static void php_ds_queue_write_dimension - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval *offset, zval *value) { --    ds_queue_t *queue = ((php_ds_queue_t*)obj)->queue; -+    ds_queue_t *queue = php_ds_queue_fetch_object(obj)->queue; - #else - (zval *obj, zval *offset, zval *value) { -     ds_queue_t *queue = Z_DS_QUEUE_P(obj); -@@ -24,15 +24,15 @@ static void php_ds_queue_write_dimension -  - static void php_ds_queue_free_object(zend_object *object) - { --    php_ds_queue_t *queue = (php_ds_queue_t*) object; --    zend_object_std_dtor(&queue->std); -+    php_ds_queue_t *queue = php_ds_queue_fetch_object(object); -     ds_queue_free(queue->queue); -+    zend_object_std_dtor(&queue->std); - } -  - static int php_ds_queue_count_elements - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zend_long *count) { --    ds_queue_t *queue = ((php_ds_queue_t*)obj)->queue; -+    ds_queue_t *queue = php_ds_queue_fetch_object(obj)->queue; - #else - (zval *obj, zend_long *count) { -     ds_queue_t *queue = Z_DS_QUEUE_P(obj); -@@ -44,7 +44,7 @@ static int php_ds_queue_count_elements - static zend_object *php_ds_queue_clone_obj - #if PHP_VERSION_ID >= 80000 - (zend_object *obj) { --    ds_queue_t *queue = ((php_ds_queue_t*)obj)->queue; -+    ds_queue_t *queue = php_ds_queue_fetch_object(obj)->queue; - #else - (zval *obj) { -     ds_queue_t *queue = Z_DS_QUEUE_P(obj); -@@ -55,7 +55,7 @@ static zend_object *php_ds_queue_clone_obj - static HashTable *php_ds_queue_get_debug_info - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, int *is_temp) { --    ds_queue_t *queue = ((php_ds_queue_t*)obj)->queue; -+    ds_queue_t *queue = php_ds_queue_fetch_object(obj)->queue; - #else - (zval *obj, int *is_temp) { -     ds_queue_t *queue = Z_DS_QUEUE_P(obj); -@@ -69,7 +69,7 @@ static HashTable *php_ds_queue_get_debug_info - static HashTable *php_ds_queue_get_gc - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval **gc_data, int *gc_count) { --    ds_queue_t *queue = ((php_ds_queue_t*)obj)->queue; -+    ds_queue_t *queue = php_ds_queue_fetch_object(obj)->queue; - #else - (zval *obj, zval **gc_data, int *gc_count) { -     ds_queue_t *queue = Z_DS_QUEUE_P(obj); -diff --git a/src/php/handlers/php_set_handlers.c b/src/php/handlers/php_set_handlers.c -index 93319ec..44dc001 100644 ---- a/src/php/handlers/php_set_handlers.c -+++ b/src/php/handlers/php_set_handlers.c -@@ -9,7 +9,7 @@ zend_object_handlers php_ds_set_handlers; - static zval *php_ds_set_read_dimension - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval *offset, int type, zval *rv) { --    ds_set_t *set = ((php_ds_set_t*)obj)->set; -+    ds_set_t *set = php_ds_set_fetch_object(obj)->set; - #else - (zval *obj, zval *offset, int type, zval *rv) { -     ds_set_t *set = Z_DS_SET_P(obj); -@@ -30,7 +30,7 @@ static zval *php_ds_set_read_dimension - static void php_ds_set_write_dimension - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval *offset, zval *value) { --    ds_set_t *set = ((php_ds_set_t*)obj)->set; -+    ds_set_t *set = php_ds_set_fetch_object(obj)->set; - #else - (zval *obj, zval *offset, zval *value) { -     ds_set_t *set = Z_DS_SET_P(obj); -@@ -45,7 +45,7 @@ static void php_ds_set_write_dimension - static int php_ds_set_count_elements - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zend_long *count) { --    ds_set_t *set = ((php_ds_set_t*)obj)->set; -+    ds_set_t *set = php_ds_set_fetch_object(obj)->set; - #else - (zval *obj, zend_long *count) { -     ds_set_t *set = Z_DS_SET_P(obj); -@@ -56,15 +56,15 @@ static int php_ds_set_count_elements -  - static void php_ds_set_free_object(zend_object *object) - { --    php_ds_set_t *obj = (php_ds_set_t*) object; --    zend_object_std_dtor(&obj->std); -+    php_ds_set_t *obj = php_ds_set_fetch_object(object); -     ds_set_free(obj->set); -+    zend_object_std_dtor(&obj->std); - } -  - static HashTable *php_ds_set_get_debug_info - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, int *is_temp) { --    ds_set_t *set = ((php_ds_set_t*)obj)->set; -+    ds_set_t *set = php_ds_set_fetch_object(obj)->set; - #else - (zval *obj, int *is_temp) { -     ds_set_t *set = Z_DS_SET_P(obj); -@@ -79,7 +79,7 @@ static HashTable *php_ds_set_get_debug_info - static zend_object *php_ds_set_clone_obj - #if PHP_VERSION_ID >= 80000 - (zend_object *obj) { --    ds_set_t *set = ((php_ds_set_t*)obj)->set; -+    ds_set_t *set = php_ds_set_fetch_object(obj)->set; - #else - (zval *obj) { -     ds_set_t *set = Z_DS_SET_P(obj); -@@ -90,7 +90,7 @@ static zend_object *php_ds_set_clone_obj - static HashTable *php_ds_set_get_gc - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval **gc_data, int *gc_count) { --    ds_set_t *set = ((php_ds_set_t*)obj)->set; -+    ds_set_t *set = php_ds_set_fetch_object(obj)->set; - #else - (zval *obj, zval **gc_data, int *gc_count) { -     ds_set_t *set = Z_DS_SET_P(obj); -@@ -110,7 +110,7 @@ void php_ds_register_set_handlers() - { -     memcpy(&php_ds_set_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); -  --    php_ds_set_handlers.offset = 0; // XtOffsetOf(php_ds_set_t, std); -+    php_ds_set_handlers.offset = XtOffsetOf(php_ds_set_t, std); -  -     php_ds_set_handlers.cast_object     = php_ds_default_cast_object; -     php_ds_set_handlers.clone_obj       = php_ds_set_clone_obj; -diff --git a/src/php/handlers/php_stack_handlers.c b/src/php/handlers/php_stack_handlers.c -index 7fe5a7c..a08f15d 100644 ---- a/src/php/handlers/php_stack_handlers.c -+++ b/src/php/handlers/php_stack_handlers.c -@@ -8,7 +8,7 @@ zend_object_handlers php_ds_stack_handlers; - static void php_ds_stack_write_dimension - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval *offset, zval *value) { --    ds_stack_t *stack = ((php_ds_stack_t*)obj)->stack; -+    ds_stack_t *stack = php_ds_stack_fetch_object(obj)->stack; - #else - (zval *obj, zval *offset, zval *value) { -     ds_stack_t *stack = Z_DS_STACK_P(obj); -@@ -22,15 +22,18 @@ static void php_ds_stack_write_dimension -  - static void php_ds_stack_free_object(zend_object *object) - { --    php_ds_stack_t *obj = (php_ds_stack_t*) object; -+    php_ds_stack_t *obj = php_ds_stack_fetch_object(object); -+	if (obj->stack) { -+	    ds_stack_free(obj->stack); -+		obj->stack = NULL; -+	} -     zend_object_std_dtor(&obj->std); --    ds_stack_free(obj->stack); - } -  - static int php_ds_stack_count_elements - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zend_long *count) { --    ds_stack_t *stack = ((php_ds_stack_t*)obj)->stack; -+    ds_stack_t *stack = php_ds_stack_fetch_object(obj)->stack; - #else - (zval *obj, zend_long *count) { -     ds_stack_t *stack = Z_DS_STACK_P(obj); -@@ -42,7 +45,7 @@ static int php_ds_stack_count_elements - static zend_object *php_ds_stack_clone_obj - #if PHP_VERSION_ID >= 80000 - (zend_object *obj) { --    ds_stack_t *stack = ((php_ds_stack_t*)obj)->stack; -+    ds_stack_t *stack = php_ds_stack_fetch_object(obj)->stack; - #else - (zval *obj) { -     ds_stack_t *stack = Z_DS_STACK_P(obj); -@@ -53,7 +56,7 @@ static zend_object *php_ds_stack_clone_obj - static HashTable *php_ds_stack_get_debug_info - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, int *is_temp) { --    ds_stack_t *stack = ((php_ds_stack_t*)obj)->stack; -+    ds_stack_t *stack = php_ds_stack_fetch_object(obj)->stack; - #else - (zval *obj, int *is_temp) { -     ds_stack_t *stack = Z_DS_STACK_P(obj); -@@ -68,7 +71,7 @@ static HashTable *php_ds_stack_get_debug_info - static HashTable *php_ds_stack_get_gc - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval **gc_data, int *gc_count) { --    ds_stack_t *stack = ((php_ds_stack_t*)obj)->stack; -+    ds_stack_t *stack = php_ds_stack_fetch_object(obj)->stack; - #else - (zval *obj, zval **gc_data, int *gc_count) { -     ds_stack_t *stack = Z_DS_STACK_P(obj); -diff --git a/src/php/handlers/php_vector_handlers.c b/src/php/handlers/php_vector_handlers.c -index c126be8..58fe1e7 100644 ---- a/src/php/handlers/php_vector_handlers.c -+++ b/src/php/handlers/php_vector_handlers.c -@@ -9,7 +9,7 @@ zend_object_handlers php_vector_handlers; - static zval *php_ds_vector_read_dimension - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval *offset, int type, zval *return_value) { --    ds_vector_t *vector = ((php_ds_vector_t*)obj)->vector; -+    ds_vector_t *vector = php_ds_vector_fetch_object(obj)->vector; - #else - (zval *obj, zval *offset, int type, zval *return_value) { -     ds_vector_t *vector = Z_DS_VECTOR_P(obj); -@@ -47,7 +47,7 @@ static zval *php_ds_vector_read_dimension - static void php_ds_vector_write_dimension - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval *offset, zval *value) { --    ds_vector_t *vector = ((php_ds_vector_t*)obj)->vector; -+    ds_vector_t *vector = php_ds_vector_fetch_object(obj)->vector; - #else - (zval *obj, zval *offset, zval *value) { -     ds_vector_t *vector = Z_DS_VECTOR_P(obj); -@@ -69,7 +69,7 @@ static void php_ds_vector_write_dimension - static int php_ds_vector_has_dimension - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval *offset, int check_empty) { --    ds_vector_t *vector = ((php_ds_vector_t*)obj)->vector; -+    ds_vector_t *vector = php_ds_vector_fetch_object(obj)->vector; - #else - (zval *obj, zval *offset, int check_empty) { -     ds_vector_t *vector = Z_DS_VECTOR_P(obj); -@@ -85,7 +85,7 @@ static int php_ds_vector_has_dimension - static void php_ds_vector_unset_dimension - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval *offset) { --    ds_vector_t *vector = ((php_ds_vector_t*)obj)->vector; -+    ds_vector_t *vector = php_ds_vector_fetch_object(obj)->vector; - #else - (zval *obj, zval *offset) { -     ds_vector_t *vector = Z_DS_VECTOR_P(obj); -@@ -110,7 +110,7 @@ static void php_ds_vector_unset_dimension - static int php_ds_vector_count_elements - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zend_long *count) { --    *count = ((php_ds_vector_t*)obj)->vector->size; return SUCCESS; -+    *count = php_ds_vector_fetch_object(obj)->vector->size; return SUCCESS; - #else  - (zval *obj, zend_long *count) { -     *count = Z_DS_VECTOR_P(obj)->size; return SUCCESS; -@@ -119,15 +119,15 @@ static int php_ds_vector_count_elements -  - static void php_ds_vector_free_object(zend_object *obj) - { --    php_ds_vector_t *vector = (php_ds_vector_t*) obj; --    zend_object_std_dtor(&vector->std); -+    php_ds_vector_t *vector = php_ds_vector_fetch_object(obj); -     ds_vector_free(vector->vector); -+    zend_object_std_dtor(&vector->std); - } -  - static HashTable *php_ds_vector_get_debug_info - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, int *is_temp) { --    ds_vector_t *vector = ((php_ds_vector_t*)obj)->vector; -+    ds_vector_t *vector = php_ds_vector_fetch_object(obj)->vector; - #else - (zval *obj, int *is_temp) { -     ds_vector_t *vector = Z_DS_VECTOR_P(obj); -@@ -141,7 +141,7 @@ static HashTable *php_ds_vector_get_debug_info - static zend_object *php_ds_vector_clone_obj - #if PHP_VERSION_ID >= 80000 - (zend_object *obj) { --    return php_ds_vector_create_clone(((php_ds_vector_t*)obj)->vector); -+    return php_ds_vector_create_clone(php_ds_vector_fetch_object(obj)->vector); - #else  - (zval *obj) { -     return php_ds_vector_create_clone(Z_DS_VECTOR_P(obj)); -@@ -151,7 +151,7 @@ static zend_object *php_ds_vector_clone_obj - static HashTable *php_ds_vector_get_gc - #if PHP_VERSION_ID >= 80000 - (zend_object *obj, zval **gc_data, int *gc_count) { --    ds_vector_t *vector = ((php_ds_vector_t*)obj)->vector; -+    ds_vector_t *vector = php_ds_vector_fetch_object(obj)->vector; - #else  - (zval *obj, zval **gc_data, int *gc_count) { -     ds_vector_t *vector = Z_DS_VECTOR_P(obj); -diff --git a/src/php/iterators/php_queue_iterator.c b/src/php/iterators/php_queue_iterator.c -index 3a5ebe5..3930b72 100644 ---- a/src/php/iterators/php_queue_iterator.c -+++ b/src/php/iterators/php_queue_iterator.c -@@ -4,9 +4,9 @@ -  - static void php_ds_queue_iterator_dtor(zend_object_iterator *iter) - { --    zval tmp; --    ZVAL_OBJ(&tmp, (zend_object *) ((ds_queue_iterator_t *) iter)->queue); --    zval_ptr_dtor(&tmp); -+    ds_queue_iterator_t *iterator = (ds_queue_iterator_t *) iter; -+ -+    OBJ_RELEASE(iterator->object); - } -  - static int php_ds_queue_iterator_valid(zend_object_iterator *iter) -@@ -23,12 +23,12 @@ static void php_ds_queue_iterator_get_current_key(zend_object_iterator *iter, zv -     ZVAL_LONG(key, ((ds_queue_iterator_t *) iter)->position); - } -  --static void php_ds_queue_iterator_set_current(php_ds_queue_t *queue, zval *data) -+static void php_ds_queue_iterator_set_current(ds_queue_t *queue, zval *data) - { --    if (QUEUE_IS_EMPTY(queue->queue)) { -+    if (QUEUE_IS_EMPTY(queue)) { -         ZVAL_UNDEF(data); -     } else { --        ds_queue_pop(queue->queue, data); -+        ds_queue_pop(queue, data); -         Z_TRY_DELREF_P(data); -     } - } -@@ -69,15 +69,16 @@ zend_object_iterator *php_ds_queue_get_iterator(zend_class_entry *ce, zval *obje -     zend_iterator_init((zend_object_iterator*) iterator); -  -     iterator->intern.funcs = &php_ds_queue_iterator_funcs; --    iterator->queue        = (php_ds_queue_t*) (Z_OBJ_P(object)); -+    iterator->queue        = Z_DS_QUEUE_P(object); -+    iterator->object       = Z_OBJ_P(object); -     iterator->position     = 0; -  -     // Add a reference to the object so that it doesn't get collected when -     // the iterated object is implict, eg. foreach ($obj->getInstance() as $value){ ... } - #if PHP_VERSION_ID >= 70300 --    GC_ADDREF((zend_object *) iterator->queue); -+    GC_ADDREF(iterator->object); - #else --    ++GC_REFCOUNT((zend_object *) iterator->queue); -+    ++GC_REFCOUNT(iterator->object); - #endif -  -     return (zend_object_iterator *) iterator; -diff --git a/src/php/iterators/php_queue_iterator.h b/src/php/iterators/php_queue_iterator.h -index 9221827..ce4295b 100644 ---- a/src/php/iterators/php_queue_iterator.h -+++ b/src/php/iterators/php_queue_iterator.h -@@ -7,7 +7,8 @@ - typedef struct _ds_queue_iterator_t { -     zend_object_iterator     intern; -     zend_long                position; --    php_ds_queue_t          *queue; -+    zend_object             *object; -+    ds_queue_t              *queue; - } ds_queue_iterator_t; -  - zend_object_iterator *php_ds_queue_get_iterator(zend_class_entry *ce, zval *object, int by_ref); -diff --git a/src/php/iterators/php_stack_iterator.c b/src/php/iterators/php_stack_iterator.c -index f53eb5b..9b62498 100644 ---- a/src/php/iterators/php_stack_iterator.c -+++ b/src/php/iterators/php_stack_iterator.c -@@ -4,9 +4,9 @@ -  - static void php_ds_stack_iterator_dtor(zend_object_iterator *iter) - { --    zval tmp; --    ZVAL_OBJ(&tmp, (zend_object *) ((php_ds_stack_iterator_t *) iter)->stack); --    zval_ptr_dtor(&tmp); -+    php_ds_stack_iterator_t *iterator = (php_ds_stack_iterator_t *) iter; -+ -+    OBJ_RELEASE(iterator->object); - } -  - static int php_ds_stack_iterator_valid(zend_object_iterator *iter) -@@ -23,12 +23,12 @@ static void php_ds_stack_iterator_get_current_key(zend_object_iterator *iter, zv -     ZVAL_LONG(key, ((php_ds_stack_iterator_t *) iter)->position); - } -  --static void php_ds_stack_iterator_set_current(php_ds_stack_t *stack, zval *data) -+static void php_ds_stack_iterator_set_current(ds_stack_t *stack, zval *data) - { --    if (DS_STACK_IS_EMPTY(stack->stack)) { -+    if (DS_STACK_IS_EMPTY(stack)) { -         ZVAL_UNDEF(data); -     } else { --        ds_stack_pop(stack->stack, data); -+        ds_stack_pop(stack, data); -         Z_TRY_DELREF_P(data); -     } - } -@@ -69,15 +69,16 @@ zend_object_iterator *php_ds_stack_get_iterator(zend_class_entry *ce, zval *obje -     zend_iterator_init((zend_object_iterator*) iterator); -  -     iterator->intern.funcs = &php_ds_stack_iterator_funcs; --    iterator->stack        = (php_ds_stack_t *) Z_OBJ_P(object); -+    iterator->stack        = Z_DS_STACK_P(object); -+    iterator->object       = Z_OBJ_P(object); -     iterator->position     = 0; -  -     // Add a reference to the object so that it doesn't get collected when -     // the iterated object is implict, eg. foreach ($obj->getInstance() as $value){ ... } - #if PHP_VERSION_ID >= 70300 --    GC_ADDREF((zend_object *) iterator->stack); -+    GC_ADDREF(iterator->object); - #else --    ++GC_REFCOUNT((zend_object *) iterator->stack); -+    ++GC_REFCOUNT(iterator->object); - #endif -  -     return (zend_object_iterator *) iterator; -diff --git a/src/php/iterators/php_stack_iterator.h b/src/php/iterators/php_stack_iterator.h -index 9ea6857..78563f5 100644 ---- a/src/php/iterators/php_stack_iterator.h -+++ b/src/php/iterators/php_stack_iterator.h -@@ -7,7 +7,8 @@ - typedef struct _php_ds_stack_iterator_t { -     zend_object_iterator     intern; -     zend_long                position; --    php_ds_stack_t          *stack; -+    zend_object             *object; -+    ds_stack_t              *stack; - } php_ds_stack_iterator_t; -  - zend_object_iterator *php_ds_stack_get_iterator(zend_class_entry *ce, zval *object, int by_ref); -diff --git a/src/php/objects/php_deque.c b/src/php/objects/php_deque.c -index e8633bf..a27e9b4 100644 ---- a/src/php/objects/php_deque.c -+++ b/src/php/objects/php_deque.c -@@ -6,7 +6,11 @@ -  - zend_object *php_ds_deque_create_object_ex(ds_deque_t *deque) - { --    php_ds_deque_t *obj = ecalloc(1, sizeof(php_ds_deque_t)); -+#if PHP_VERSION_ID < 70300 -+	php_ds_deque_t *obj = ecalloc(1, sizeof(php_ds_deque_t) + zend_object_properties_size(php_ds_deque_ce)); -+#else -+    php_ds_deque_t *obj = zend_object_alloc(sizeof(php_ds_deque_t), php_ds_deque_ce); -+#endif -     zend_object_std_init(&obj->std, php_ds_deque_ce); -     obj->std.handlers = &php_deque_handlers; -     obj->deque = deque; -diff --git a/src/php/objects/php_deque.h b/src/php/objects/php_deque.h -index 5c95cfe..ddaf354 100644 ---- a/src/php/objects/php_deque.h -+++ b/src/php/objects/php_deque.h -@@ -3,7 +3,16 @@ -  - #include "../../ds/ds_deque.h" -  --#define Z_DS_DEQUE(z)   ((php_ds_deque_t*) Z_OBJ(z))->deque -+typedef struct php_ds_deque { -+    ds_deque_t  *deque; -+    zend_object  std; -+} php_ds_deque_t; -+ -+static inline php_ds_deque_t *php_ds_deque_fetch_object(zend_object *obj) { -+	return (php_ds_deque_t *)((char*)(obj) - XtOffsetOf(php_ds_deque_t, std)); -+} -+ -+#define Z_DS_DEQUE(z)   (php_ds_deque_fetch_object(Z_OBJ(z))->deque) - #define Z_DS_DEQUE_P(z) Z_DS_DEQUE(*z) - #define THIS_DS_DEQUE() Z_DS_DEQUE_P(getThis()) -  -@@ -21,14 +30,6 @@ do {                                        \ - } while(0) -  -  --/** -- * -- */ --typedef struct php_ds_deque { --    zend_object  std; --    ds_deque_t  *deque; --} php_ds_deque_t; -- - /** -  * Creates a new zend_object using an existing deque. -  */ -diff --git a/src/php/objects/php_map.c b/src/php/objects/php_map.c -index 820f452..e36e162 100644 ---- a/src/php/objects/php_map.c -+++ b/src/php/objects/php_map.c -@@ -6,7 +6,11 @@ -  - zend_object *php_ds_map_create_object_ex(ds_map_t *map) - { --    php_ds_map_t *obj = ecalloc(1, sizeof(php_ds_map_t)); -+#if PHP_VERSION_ID < 70300 -+    php_ds_map_t *obj = ecalloc(1, sizeof(php_ds_map_t) + zend_object_properties_size(php_ds_map_ce)); -+#else -+    php_ds_map_t *obj = zend_object_alloc(sizeof(php_ds_map_t), php_ds_map_ce); -+#endif -     zend_object_std_init(&obj->std, php_ds_map_ce); -     obj->std.handlers = &php_map_handlers; -     obj->map = map; -diff --git a/src/php/objects/php_map.h b/src/php/objects/php_map.h -index 8d5ef0a..a3805b4 100644 ---- a/src/php/objects/php_map.h -+++ b/src/php/objects/php_map.h -@@ -3,7 +3,16 @@ -  - #include "../../ds/ds_map.h" -  --#define Z_DS_MAP(z)   (((php_ds_map_t*)(Z_OBJ(z)))->map) -+typedef struct _php_ds_map_t { -+    ds_map_t    *map; -+    zend_object  std; -+} php_ds_map_t; -+ -+static inline php_ds_map_t *php_ds_map_fetch_object(zend_object *obj) { -+	return (php_ds_map_t *)((char*)(obj) - XtOffsetOf(php_ds_map_t, std)); -+} -+ -+#define Z_DS_MAP(z)   (php_ds_map_fetch_object(Z_OBJ(z))->map) - #define Z_DS_MAP_P(z) Z_DS_MAP(*z) - #define THIS_DS_MAP() Z_DS_MAP_P(getThis()) -  -@@ -20,11 +29,6 @@ do {                                        \ -     return;                                 \ - } while(0) -  --typedef struct _php_ds_map_t { --    zend_object  std; --    ds_map_t    *map; --} php_ds_map_t; -- - zend_object *php_ds_map_create_object_ex(ds_map_t *map); - zend_object *php_ds_map_create_object(zend_class_entry *ce); - zend_object *php_ds_map_create_clone(ds_map_t *map); -diff --git a/src/php/objects/php_pair.c b/src/php/objects/php_pair.c -index 078b9e2..c71a92a 100644 ---- a/src/php/objects/php_pair.c -+++ b/src/php/objects/php_pair.c -@@ -4,9 +4,13 @@ -  - zend_object *php_ds_pair_create_object(zend_class_entry *ce) - { -+#if PHP_VERSION_ID < 70300 -     php_ds_pair_t *obj = ecalloc(1, sizeof(php_ds_pair_t) + zend_object_properties_size(ce)); --    zend_object_std_init(&obj->std, php_ds_pair_ce); --    object_properties_init(&obj->std, php_ds_pair_ce); -+#else -+    php_ds_pair_t *obj = zend_object_alloc(sizeof(php_ds_pair_t), ce); -+#endif -+    zend_object_std_init(&obj->std, ce); -+    object_properties_init(&obj->std, ce); -     obj->std.handlers = &php_pair_handlers; -  -     return &obj->std; -diff --git a/src/php/objects/php_priority_queue.c b/src/php/objects/php_priority_queue.c -index 7fa50c0..7edb9f0 100644 ---- a/src/php/objects/php_priority_queue.c -+++ b/src/php/objects/php_priority_queue.c -@@ -6,7 +6,11 @@ -  - zend_object *php_ds_priority_queue_create_object_ex(ds_priority_queue_t *queue) - { --    php_ds_priority_queue_t *obj = ecalloc(1, sizeof(php_ds_priority_queue_t)); -+#if PHP_VERSION_ID < 70300 -+    php_ds_priority_queue_t *obj = ecalloc(1, sizeof(php_ds_priority_queue_t) + zend_object_properties_size(php_ds_priority_queue_ce)); -+#else -+    php_ds_priority_queue_t *obj = zend_object_alloc(sizeof(php_ds_priority_queue_t), php_ds_priority_queue_ce); -+#endif -     zend_object_std_init(&obj->std, php_ds_priority_queue_ce); -     obj->std.handlers = &php_priority_queue_handlers; -  -diff --git a/src/php/objects/php_priority_queue.h b/src/php/objects/php_priority_queue.h -index f7a38dc..e26434d 100644 ---- a/src/php/objects/php_priority_queue.h -+++ b/src/php/objects/php_priority_queue.h -@@ -3,7 +3,18 @@ -  - #include "../../ds/ds_priority_queue.h" -  --#define Z_DS_PRIORITY_QUEUE(z)   (((php_ds_priority_queue_t*)(Z_OBJ(z)))->queue) -+typedef struct _php_ds_priority_queue_t { -+    ds_priority_queue_t *queue; -+    zval                *gc_data; -+    int                  gc_size; -+    zend_object          std; -+} php_ds_priority_queue_t; -+ -+static inline php_ds_priority_queue_t *php_ds_priority_queue_fetch_object(zend_object *obj) { -+	return (php_ds_priority_queue_t *)((char*)(obj) - XtOffsetOf(php_ds_priority_queue_t, std)); -+} -+ -+#define Z_DS_PRIORITY_QUEUE(z)   (php_ds_priority_queue_fetch_object(Z_OBJ(z))->queue) - #define Z_DS_PRIORITY_QUEUE_P(z) Z_DS_PRIORITY_QUEUE(*z) - #define THIS_DS_PRIORITY_QUEUE() Z_DS_PRIORITY_QUEUE_P(getThis()) -  -@@ -21,14 +32,6 @@ do {                                                    \ -     return;                                             \ - } while(0) -  --typedef struct _php_ds_priority_queue_t { --    zend_object          std; --    ds_priority_queue_t *queue; --    zval                *gc_data; --    int                  gc_size; -- --} php_ds_priority_queue_t; -- - zend_object *php_ds_priority_queue_create_object_ex(ds_priority_queue_t *queue); - zend_object *php_ds_priority_queue_create_object(zend_class_entry *ce); - zend_object *php_ds_priority_queue_create_clone(ds_priority_queue_t *queue); -diff --git a/src/php/objects/php_queue.c b/src/php/objects/php_queue.c -index 7de656d..fc5d7d9 100644 ---- a/src/php/objects/php_queue.c -+++ b/src/php/objects/php_queue.c -@@ -6,7 +6,11 @@ -  - zend_object *php_ds_queue_create_object_ex(ds_queue_t *queue) - { --    php_ds_queue_t *obj = ecalloc(1, sizeof(php_ds_queue_t)); -+#if PHP_VERSION_ID < 70300 -+    php_ds_queue_t *obj = ecalloc(1, sizeof(php_ds_queue_t) + zend_object_properties_size(php_ds_queue_ce)); -+#else -+    php_ds_queue_t *obj = zend_object_alloc(sizeof(php_ds_queue_t), php_ds_queue_ce); -+#endif -     zend_object_std_init(&obj->std, php_ds_queue_ce); -     obj->std.handlers = &php_queue_handlers; -     obj->queue = queue; -diff --git a/src/php/objects/php_queue.h b/src/php/objects/php_queue.h -index dc76385..0d2e55c 100644 ---- a/src/php/objects/php_queue.h -+++ b/src/php/objects/php_queue.h -@@ -3,7 +3,16 @@ -  - #include "../../ds/ds_queue.h" -  --#define Z_DS_QUEUE(z)   (((php_ds_queue_t*)(Z_OBJ(z)))->queue) -+typedef struct _php_ds_queue_t { -+    ds_queue_t    *queue; -+    zend_object    std; -+} php_ds_queue_t; -+ -+static inline php_ds_queue_t *php_ds_queue_fetch_object(zend_object *obj) { -+	return (php_ds_queue_t *)((char*)(obj) - XtOffsetOf(php_ds_queue_t, std)); -+} -+ -+#define Z_DS_QUEUE(z)   php_ds_queue_fetch_object(Z_OBJ(z))->queue - #define Z_DS_QUEUE_P(z) Z_DS_QUEUE(*z) - #define THIS_DS_QUEUE() Z_DS_QUEUE_P(getThis()) -  -@@ -21,11 +30,6 @@ do {                                        \ -     return;                                 \ - } while(0) -  --typedef struct _php_ds_queue_t { --    zend_object    std; --    ds_queue_t    *queue; --} php_ds_queue_t; -- - zend_object *php_ds_queue_create_object_ex(ds_queue_t *queue); - zend_object *php_ds_queue_create_object(zend_class_entry *ce); - zend_object *php_ds_queue_create_clone(ds_queue_t *queue); -diff --git a/src/php/objects/php_set.c b/src/php/objects/php_set.c -index 70d82c0..85027f7 100644 ---- a/src/php/objects/php_set.c -+++ b/src/php/objects/php_set.c -@@ -6,7 +6,11 @@ -  - zend_object *php_ds_set_create_object_ex(ds_set_t *set) - { --    php_ds_set_t *obj = ecalloc(1, sizeof(php_ds_set_t)); -+#if PHP_VERSION_ID < 70300 -+    php_ds_set_t *obj = ecalloc(1, sizeof(php_ds_set_t) + zend_object_properties_size(php_ds_set_ce)); -+#else -+    php_ds_set_t *obj = zend_object_alloc(sizeof(php_ds_set_t), php_ds_set_ce); -+#endif -     zend_object_std_init(&obj->std, php_ds_set_ce); -     obj->std.handlers = &php_ds_set_handlers; -     obj->set = set; -diff --git a/src/php/objects/php_set.h b/src/php/objects/php_set.h -index 8f94b33..5c2760d 100644 ---- a/src/php/objects/php_set.h -+++ b/src/php/objects/php_set.h -@@ -3,7 +3,16 @@ -  - #include "../../ds/ds_set.h" -  --#define Z_DS_SET(z)   (((php_ds_set_t*)(Z_OBJ(z)))->set) -+typedef struct _php_ds_set_t { -+    ds_set_t      *set; -+    zend_object    std; -+} php_ds_set_t; -+ -+static inline php_ds_set_t *php_ds_set_fetch_object(zend_object *obj) { -+	return (php_ds_set_t *)((char*)(obj) - XtOffsetOf(php_ds_set_t, std)); -+} -+ -+#define Z_DS_SET(z)   (php_ds_set_fetch_object(Z_OBJ(z))->set) - #define Z_DS_SET_P(z) Z_DS_SET(*z) - #define THIS_DS_SET() Z_DS_SET_P(getThis()) -  -@@ -20,11 +29,6 @@ do {                                        \ -     return;                                 \ - } while(0) -  --typedef struct _php_ds_set_t { --    zend_object    std; --    ds_set_t      *set; --} php_ds_set_t; -- - zend_object *php_ds_set_create_object_ex(ds_set_t *set); - zend_object *php_ds_set_create_object(zend_class_entry *ce); - zend_object *php_ds_set_create_clone(ds_set_t *set); -diff --git a/src/php/objects/php_stack.c b/src/php/objects/php_stack.c -index 8b2ac61..e583ba3 100644 ---- a/src/php/objects/php_stack.c -+++ b/src/php/objects/php_stack.c -@@ -6,7 +6,11 @@ -  - zend_object *php_ds_stack_create_object_ex(ds_stack_t *stack) - { --    php_ds_stack_t *obj = ecalloc(1, sizeof(php_ds_stack_t)); -+#if PHP_VERSION_ID < 70300 -+    php_ds_stack_t *obj = ecalloc(1, sizeof(php_ds_stack_t) + zend_object_properties_size(php_ds_stack_ce)); -+#else -+    php_ds_stack_t *obj = zend_object_alloc(sizeof(php_ds_stack_t), php_ds_stack_ce); -+#endif -     zend_object_std_init(&obj->std, php_ds_stack_ce); -     obj->std.handlers = &php_ds_stack_handlers; -     obj->stack = stack; -diff --git a/src/php/objects/php_stack.h b/src/php/objects/php_stack.h -index c34934b..219f306 100644 ---- a/src/php/objects/php_stack.h -+++ b/src/php/objects/php_stack.h -@@ -3,7 +3,16 @@ -  - #include "../../ds/ds_stack.h" -  --#define Z_DS_STACK(z)   (((php_ds_stack_t*)(Z_OBJ(z)))->stack) -+typedef struct _php_ds_stack_t { -+    ds_stack_t      *stack; -+    zend_object      std; -+} php_ds_stack_t; -+ -+static inline php_ds_stack_t *php_ds_stack_fetch_object(zend_object *obj) { -+	return (php_ds_stack_t *)((char*)(obj) - XtOffsetOf(php_ds_stack_t, std)); -+} -+ -+#define Z_DS_STACK(z)   php_ds_stack_fetch_object(Z_OBJ(z))->stack - #define Z_DS_STACK_P(z) Z_DS_STACK(*z) - #define THIS_DS_STACK() Z_DS_STACK_P(getThis()) -  -@@ -20,11 +29,6 @@ do {                                        \ -     return;                                 \ - } while(0) -  --typedef struct _php_ds_stack_t { --    zend_object      std; --    ds_stack_t      *stack; --} php_ds_stack_t; -- - zend_object *php_ds_stack_create_object_ex(ds_stack_t *stack); - zend_object *php_ds_stack_create_object(zend_class_entry *ce); - zend_object *php_ds_stack_create_clone(ds_stack_t *stack); -diff --git a/src/php/objects/php_vector.c b/src/php/objects/php_vector.c -index f415c43..f3402ab 100644 ---- a/src/php/objects/php_vector.c -+++ b/src/php/objects/php_vector.c -@@ -6,7 +6,11 @@ -  - zend_object *php_ds_vector_create_object_ex(ds_vector_t *vector) - { --    php_ds_vector_t *obj = ecalloc(1, sizeof(php_ds_vector_t)); -+#if PHP_VERSION_ID < 70300 -+    php_ds_vector_t *obj = ecalloc(1, sizeof(php_ds_vector_t) + zend_object_properties_size(php_ds_vector_ce)); -+#else -+    php_ds_vector_t *obj = zend_object_alloc(sizeof(php_ds_vector_t), php_ds_vector_ce); -+#endif -     zend_object_std_init(&obj->std, php_ds_vector_ce); -     obj->std.handlers = &php_vector_handlers; -     obj->vector = vector; -diff --git a/src/php/objects/php_vector.h b/src/php/objects/php_vector.h -index 63b4b7f..43399e6 100644 ---- a/src/php/objects/php_vector.h -+++ b/src/php/objects/php_vector.h -@@ -3,7 +3,16 @@ -  - #include "../../ds/ds_vector.h" -  --#define Z_DS_VECTOR(z)   (((php_ds_vector_t*)(Z_OBJ(z)))->vector) -+typedef struct php_ds_vector { -+    ds_vector_t     *vector; -+    zend_object      std; -+} php_ds_vector_t; -+ -+static inline php_ds_vector_t *php_ds_vector_fetch_object(zend_object *obj) { -+	return (php_ds_vector_t *)((char*)(obj) - XtOffsetOf(php_ds_vector_t, std)); -+} -+ -+#define Z_DS_VECTOR(z)   (php_ds_vector_fetch_object(Z_OBJ(z))->vector) - #define Z_DS_VECTOR_P(z) Z_DS_VECTOR(*z) - #define THIS_DS_VECTOR() Z_DS_VECTOR_P(getThis()) -  -@@ -20,11 +29,6 @@ do {                                        \ -     return;                                 \ - } while(0) -  --typedef struct php_ds_vector { --    zend_object      std; --    ds_vector_t     *vector; --} php_ds_vector_t; -- - zend_object *php_ds_vector_create_object_ex(ds_vector_t *vector); - zend_object *php_ds_vector_create_object(zend_class_entry *ce); - zend_object *php_ds_vector_create_clone(ds_vector_t *vector); diff --git a/php-pecl-ds.spec b/php-pecl-ds.spec index 8c673f3..4c3e87d 100644 --- a/php-pecl-ds.spec +++ b/php-pecl-ds.spec @@ -25,7 +25,7 @@  %global ini_name     40-%{pecl_name}.ini  # For test suite, see https://github.com/php-ds/tests/commits/master -%global gh_commit    5323dffd6130d733b308e53cc8017eb41d278f3a +%global gh_commit    d4f0a9123a82764841d57aa59b2cf1172a413f1d  %global gh_short     %(c=%{gh_commit}; echo ${c:0:7})  %global gh_owner     php-ds  %global gh_project   tests @@ -33,8 +33,8 @@  Summary:        Data Structures for PHP  Name:           %{?sub_prefix}php-pecl-%{pecl_name} -Version:        1.3.0 -Release:        6%{?dist}%{!?scl:%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}} +Version:        1.4.0 +Release:        1%{?dist}%{!?scl:%{!?nophptag:%(%{__php} -r 'echo ".".PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')}}  License:        MIT  URL:            https://pecl.php.net/package/%{pecl_name}  Source0:        https://pecl.php.net/get/%{pecl_name}-%{version}.tgz @@ -42,18 +42,14 @@ Source0:        https://pecl.php.net/get/%{pecl_name}-%{version}.tgz  # in composer.json:  "require-dev": {  "php-ds/tests": "dev-master" }  Source1:        https://github.com/%{gh_owner}/%{gh_project}/archive/%{gh_commit}/%{gh_project}-%{gh_short}.tar.gz -Patch0:         0001-fix-missing-return-after-exception.patch -# output from: git diff v1.3.0 -- src -Patch1:         %{pecl_name}-php81.patch -  BuildRequires:  make  BuildRequires:  %{?dtsprefix}gcc -BuildRequires:  %{?scl_prefix}php-devel >= 7.0 +BuildRequires:  %{?scl_prefix}php-devel >= 7.3  BuildRequires:  %{?scl_prefix}php-pear  BuildRequires:  %{?scl_prefix}php-gmp  BuildRequires:  %{?scl_prefix}php-json  %if %{with tests} -BuildRequires:  %{_bindir}/phpunit7 +BuildRequires:  %{_bindir}/phpunit8  BuildRequires:  %{_bindir}/phpab  %endif  #BuildRequires:  php-debuginfo @@ -74,9 +70,7 @@ Provides:       %{?scl_prefix}php-pecl-%{pecl_name}%{?_isa}  = %{version}-%{rele  %endif  %if "%{?packager}" == "Remi Collet" && 0%{!?scl:1} && 0%{?rhel} -%if "%{php_version}" > "7.3"  Obsoletes:     php73-pecl-%{pecl_name} <= %{version} -%endif  %if "%{php_version}" > "7.4"  Obsoletes:     php74-pecl-%{pecl_name} <= %{version}  %endif @@ -105,12 +99,6 @@ mv %{gh_project}-%{gh_commit} tests  %{?_licensedir:sed -e '/LICENSE/s/role="doc"/role="src"/' -i package.xml}  cd NTS -%if "%{php_version}" > "8.1" -%patch1 -p1 -%else -%patch0 -p1 -%endif -  # Sanity check, really often broken  extver=$(sed -n '/#define PHP_DS_VERSION/{s/.* "//;s/".*$//;p}' php_ds.h)  if test "x${extver}" != "x%{version}%{?prever:-%{prever}}"; then @@ -199,9 +187,8 @@ fi  %check -modules="-d extension=json.so" +[ -f %{php_extdir}/json.so ] && modules="-d extension=json.so" -cd NTS  : Minimal load test for NTS extension  %{__php} --no-php-ini \      $modules \ @@ -209,14 +196,12 @@ cd NTS      --modules | grep '^%{pecl_name}$'  %if %{with_zts} -cd ../ZTS  : Minimal load test for ZTS extension  %{__ztsphp} --no-php-ini \      $modules \      --define extension=%{buildroot}%{php_ztsextdir}/%{pecl_name}.so \      --modules | grep '^%{pecl_name}$'  %endif -cd ..  %if %{with tests}  : Generate autoloader for tests @@ -227,7 +212,8 @@ cd ..  : Run upstream test suite  %{_bindir}/php \     -d extension=%{buildroot}%{php_extdir}/%{pecl_name}.so \ -   %{_bindir}/phpunit7 \ +   %{_bindir}/phpunit8 \ +      --do-not-cache-result \        --bootstrap tests/autoload.php \        --verbose tests  %endif @@ -248,6 +234,12 @@ cd ..  %changelog +* Tue Dec 14 2021 Remi Collet <remi@remirepo.net> - 1.4.0-1 +- update to 1.4.0 +- raise dependency on PHP 7.3 +- drop all patches merged upstream +- switch to phpunit8 +  * Wed Nov  3 2021 Remi Collet <remi@remirepo.net> - 1.3.0-6  - add patches for PHP 8.1 from upstream and from    https://github.com/php-ds/ext-ds/pull/187  | 
