summaryrefslogtreecommitdiffstats
path: root/33.patch
blob: 6e1f93588208414219461c11ca42602b68276bba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
From 4a3eb9f1c92e9dff6ce723bd94daef1580d080d2 Mon Sep 17 00:00:00 2001
From: Remi Collet <remi@remirepo.net>
Date: Wed, 4 Jul 2018 12:14:48 +0200
Subject: [PATCH] Fix for PHP 7.3

---
 .gitignore  |  2 ++
 .travis.yml |  3 +++
 emit.c      | 53 ++++++++++++++++++++++++++++++++++++++++++-----------
 3 files changed, 47 insertions(+), 11 deletions(-)

diff --git a/emit.c b/emit.c
index 993a666..fd3769e 100644
--- a/emit.c
+++ b/emit.c
@@ -173,7 +173,11 @@ static void y_scan_recursion(const y_emit_state_t *state, zval *data TSRMLS_DC)
 		return;
 	}
 
+#if PHP_VERSION_ID >= 70300
+	if (!(GC_FLAGS(ht) & GC_IMMUTABLE) && GC_IS_RECURSIVE(ht)) {
+#else
 	if (ZEND_HASH_APPLY_PROTECTION(ht) && ht->u.v.nApplyCount > 0) {
+#endif
 		zval tmp;
 		ZVAL_LONG(&tmp, (zend_ulong) ht);
 
@@ -182,17 +186,29 @@ static void y_scan_recursion(const y_emit_state_t *state, zval *data TSRMLS_DC)
 		return;
 	}
 
+#if PHP_VERSION_ID >= 70300
+	if (!(GC_FLAGS(ht) & GC_IMMUTABLE)) {
+		GC_PROTECT_RECURSION(ht);
+	}
+#else
 	if (ZEND_HASH_APPLY_PROTECTION(ht)) {
 		ht->u.v.nApplyCount++;
 	}
+#endif
 
 	ZEND_HASH_FOREACH_VAL(ht, elm) {
 		y_scan_recursion(state, elm TSRMLS_CC);
 	} ZEND_HASH_FOREACH_END();
 
+#if PHP_VERSION_ID >= 70300
+	if (!(GC_FLAGS(ht) & GC_IMMUTABLE)) {
+		GC_UNPROTECT_RECURSION(ht);
+	}
+#else
 	if (ZEND_HASH_APPLY_PROTECTION(ht)) {
 		ht->u.v.nApplyCount--;
 	}
+#endif
 
 	return;
 }
@@ -462,7 +478,6 @@ static int y_write_array(
 	zval key_zval;
 	zend_ulong kidx;
 	zend_string *kstr;
-	HashTable *tmp_ht;
 	zend_long recursive_idx = -1;
 	char *anchor = { 0 };
 	size_t anchor_size;
@@ -495,7 +510,11 @@ static int y_write_array(
 		anchor = (char*) emalloc(anchor_size + 1);
 		snprintf(anchor, anchor_size + 1, "refid%ld", recursive_idx + 1);
 
-		if (ZEND_HASH_APPLY_PROTECTION(ht) && ht->u.v.nApplyCount > 1) {
+#if PHP_VERSION_ID >= 70300
+		if (!(GC_FLAGS(ht) & GC_IMMUTABLE) && GC_IS_RECURSIVE(ht)) {
+#else
+		if (ZEND_HASH_APPLY_PROTECTION(ht) && ht->u.v.nApplyCount > 0) {
+#endif
 			/* node has been visited before */
 			status = yaml_alias_event_initialize(
 					&event, (yaml_char_t *) anchor);
@@ -536,6 +555,18 @@ static int y_write_array(
 		return FAILURE;
 	}
 
+#if PHP_VERSION_ID >= 70300
+	if (!(GC_FLAGS(ht) & GC_IMMUTABLE)) {
+		/* increment access count for hash */
+		GC_PROTECT_RECURSION(ht);
+	}
+#else
+	if (ZEND_HASH_APPLY_PROTECTION(ht)) {
+		/* increment access count for hash */
+		ht->u.v.nApplyCount++;
+	}
+#endif
+
 	/* emit array elements */
 	ZEND_HASH_FOREACH_KEY_VAL(ht, kidx, kstr, elm) {
 		ZVAL_DEREF(elm);
@@ -555,23 +586,23 @@ static int y_write_array(
 			}
 		}
 
-		tmp_ht = HASH_OF(elm);
-		if (tmp_ht && ZEND_HASH_APPLY_PROTECTION(tmp_ht)) {
-			/* increment access count for hash */
-			tmp_ht->u.v.nApplyCount++;
-		}
-
 		status = y_write_zval(state, elm, NULL TSRMLS_CC);
 
-		if (tmp_ht && ZEND_HASH_APPLY_PROTECTION(tmp_ht)) {
-			tmp_ht->u.v.nApplyCount--;
-		}
 
 		if (SUCCESS != status) {
 			return FAILURE;
 		}
 	} ZEND_HASH_FOREACH_END();
 
+#if PHP_VERSION_ID >= 70300
+	if (!(GC_FLAGS(ht) & GC_IMMUTABLE)) {
+		GC_UNPROTECT_RECURSION(ht);
+	}
+#else
+	if (ZEND_HASH_APPLY_PROTECTION(ht)) {
+		ht->u.v.nApplyCount--;
+	}
+#endif
 
 	if (Y_ARRAY_SEQUENCE == array_type) {
 		status = yaml_sequence_end_event_initialize(&event);