-#define HT_IS_RECURSIVE(ht) GC_IS_RECURSIVE(ht)
-#define HT_PROTECT_RECURSION(ht) GC_PROTECT_RECURSION(ht)
-#define HT_UNPROTECT_RECURSION(ht) GC_UNPROTECT_RECURSION(ht)
-
-#ifndef convert_to_explicit_type
-# define convert_to_explicit_type(pzv, type) \
- do { \
- switch (type) { \
- case IS_NULL: \
- convert_to_null(pzv); \
- break; \
- case IS_LONG: \
- convert_to_long(pzv); \
- break; \
- case IS_DOUBLE: \
- convert_to_double(pzv); \
- break; \
- case _IS_BOOL: \
- convert_to_boolean(pzv); \
- break; \
- case IS_ARRAY: \
- convert_to_array(pzv); \
- break; \
- case IS_OBJECT: \
- convert_to_object(pzv); \
- break; \
- case IS_STRING: \
- convert_to_string(pzv); \
- break; \
- default: \
- assert(0); \
- break; \
- } \
- } while (0);
+#ifdef ZEND_HASH_GET_APPLY_COUNT
+# define HT_IS_RECURSIVE(ht) (ZEND_HASH_GET_APPLY_COUNT(ht) > 0)
+#else
+# define HT_IS_RECURSIVE(ht) GC_IS_RECURSIVE(ht)
+#endif
+#ifdef ZEND_HASH_INC_APPLY_COUNT
+# define HT_PROTECT_RECURSION(ht) ZEND_HASH_INC_APPLY_COUNT(ht)
+#else
+# define HT_PROTECT_RECURSION(ht) GC_PROTECT_RECURSION(ht)
+#endif
+#ifdef ZEND_HASH_DEC_APPLY_COUNT
+# define HT_UNPROTECT_RECURSION(ht) ZEND_HASH_DEC_APPLY_COUNT(ht)
+#else
+# define HT_UNPROTECT_RECURSION(ht) GC_UNPROTECT_RECURSION(ht)
+#endif