Skip to content

Commit 4432757

Browse files
committed
fix #142
1 parent 87978c3 commit 4432757

File tree

11 files changed

+51
-94
lines changed

11 files changed

+51
-94
lines changed

msgpack_pack.c

Lines changed: 23 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,15 @@ static inline void msgpack_serialize_class(smart_str *buf, zval *val, zval *retv
197197
}
198198
/* }}} */
199199

200+
#if PHP_VERSION_ID < 70300
201+
# define Z_IS_RECURSIVE_P(zv) ZEND_HASH_GET_APPLY_COUNT(Z_ARRVAL_P(zv))
202+
# define Z_PROTECT_RECURSION_P(zv) ZEND_HASH_INC_APPLY_COUNT(Z_ARRVAL_P(zv))
203+
# define Z_UNPROTECT_RECURSION_P(zv) ZEND_HASH_DEC_APPLY_COUNT(Z_ARRVAL_P(zv))
204+
# define Z_CAN_PROTECT_RECURSION_P(zv) ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(zv))
205+
#else
206+
# define Z_CAN_PROTECT_RECURSION_P(zv) Z_REFCOUNTED_P(zv)
207+
#endif
208+
200209
static inline void msgpack_serialize_array(smart_str *buf, zval *val, HashTable *var_hash, zend_bool object, char* class_name, uint32_t name_len, zend_bool incomplete_class) /* {{{ */ {
201210
uint32_t n;
202211
HashTable *ht;
@@ -290,41 +299,21 @@ static inline void msgpack_serialize_array(smart_str *buf, zval *val, HashTable
290299
value_noref = value;
291300
}
292301

293-
if (Z_TYPE_P(value_noref) == IS_ARRAY &&
294-
#if PHP_VERSION_ID < 70300
295-
ZEND_HASH_GET_APPLY_COUNT(Z_ARRVAL_P(value_noref))
296-
#else
297-
Z_IS_RECURSIVE_P(value_noref)
298-
#endif
299-
) {
300-
msgpack_pack_nil(buf);
302+
if (Z_TYPE_P(value_noref) == IS_ARRAY && Z_IS_RECURSIVE_P(value_noref)) {
303+
if (MSGPACK_G(php_only)) {
304+
/* pack ref */
305+
msgpack_serialize_zval(buf, value, var_hash);
306+
} else {
307+
/* you lose */
308+
msgpack_pack_nil(buf);
309+
}
301310
} else {
302-
if (Z_TYPE_P(value_noref) == IS_ARRAY &&
303-
#if PHP_VERSION_ID < 70300
304-
ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(value_noref))
305-
#else
306-
Z_REFCOUNTED_P(value_noref)
307-
#endif
308-
) {
309-
#if PHP_VERSION_ID < 70300
310-
ZEND_HASH_INC_APPLY_COUNT(Z_ARRVAL_P(value_noref));
311-
#else
311+
if (Z_TYPE_P(value_noref) == IS_ARRAY && Z_CAN_PROTECT_RECURSION_P(value_noref)) {
312312
Z_PROTECT_RECURSION_P(value_noref);
313-
#endif
314313
}
315314
msgpack_serialize_zval(buf, value, var_hash);
316-
if (Z_TYPE_P(value_noref) == IS_ARRAY &&
317-
#if PHP_VERSION_ID < 70300
318-
ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(value_noref))
319-
#else
320-
Z_REFCOUNTED_P(value_noref)
321-
#endif
322-
) {
323-
#if PHP_VERSION_ID < 70300
324-
ZEND_HASH_DEC_APPLY_COUNT(Z_ARRVAL_P(value_noref));
325-
#else
315+
if (Z_TYPE_P(value_noref) == IS_ARRAY && Z_CAN_PROTECT_RECURSION_P(value_noref)) {
326316
Z_UNPROTECT_RECURSION_P(value_noref);
327-
#endif
328317
}
329318
}
330319
} ZEND_HASH_FOREACH_END();
@@ -333,21 +322,9 @@ static inline void msgpack_serialize_array(smart_str *buf, zval *val, HashTable
333322
zval *data, *data_noref;
334323

335324
for (i = 0; i < n; i++) {
336-
if ((data = zend_hash_index_find(ht, i)) == NULL || &data == &val || (Z_TYPE_P(data) == IS_ARRAY &&
337-
#if PHP_VERSION_ID < 70300
338-
ZEND_HASH_GET_APPLY_COUNT(Z_ARRVAL_P(data))
339-
#else
340-
Z_IS_RECURSIVE_P(data)
341-
#endif
342-
)) {
325+
if ((data = zend_hash_index_find(ht, i)) == NULL || &data == &val || (Z_TYPE_P(data) == IS_ARRAY && Z_IS_RECURSIVE_P(data))) {
343326
msgpack_pack_nil(buf);
344-
} else if (Z_TYPE_P(data) == IS_REFERENCE && Z_TYPE_P(Z_REFVAL_P(data)) == IS_ARRAY &&
345-
#if PHP_VERSION_ID < 70300
346-
ZEND_HASH_GET_APPLY_COUNT(Z_ARRVAL_P(Z_REFVAL_P(data)))
347-
#else
348-
Z_IS_RECURSIVE_P(Z_REFVAL_P(data))
349-
#endif
350-
) {
327+
} else if (Z_TYPE_P(data) == IS_REFERENCE && Z_TYPE_P(Z_REFVAL_P(data)) == IS_ARRAY && Z_IS_RECURSIVE_P(Z_REFVAL_P(data))) {
351328
msgpack_pack_nil(buf);
352329
} else {
353330
if (Z_TYPE_P(data) == IS_REFERENCE) {
@@ -356,34 +333,14 @@ static inline void msgpack_serialize_array(smart_str *buf, zval *val, HashTable
356333
data_noref = data;
357334
}
358335

359-
if (Z_TYPE_P(data_noref) == IS_ARRAY &&
360-
#if PHP_VERSION_ID < 70300
361-
ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data_noref))
362-
#else
363-
Z_REFCOUNTED_P(data_noref)
364-
#endif
365-
) {
366-
#if PHP_VERSION_ID < 70300
367-
ZEND_HASH_INC_APPLY_COUNT(Z_ARRVAL_P(data_noref));
368-
#else
336+
if (Z_TYPE_P(data_noref) == IS_ARRAY && Z_CAN_PROTECT_RECURSION_P(data_noref)) {
369337
Z_PROTECT_RECURSION_P(data_noref);
370-
#endif
371338
}
372339

373340
msgpack_serialize_zval(buf, data, var_hash);
374341

375-
if (Z_TYPE_P(data_noref) == IS_ARRAY &&
376-
#if PHP_VERSION_ID < 70300
377-
ZEND_HASH_APPLY_PROTECTION(Z_ARRVAL_P(data_noref))
378-
#else
379-
Z_REFCOUNTED_P(data_noref)
380-
#endif
381-
) {
382-
#if PHP_VERSION_ID < 70300
383-
ZEND_HASH_DEC_APPLY_COUNT(Z_ARRVAL_P(data_noref));
384-
#else
342+
if (Z_TYPE_P(data_noref) == IS_ARRAY && Z_CAN_PROTECT_RECURSION_P(data_noref)) {
385343
Z_UNPROTECT_RECURSION_P(data_noref);
386-
#endif
387344
}
388345
}
389346
}

tests/009.phpt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,14 @@ array(2) {
6969
}
7070
OK
7171
cyclic
72-
9182c0010082c00100c0
72+
9182c0010082c0010082c0020002
7373
array(1) {
7474
[0]=>
75-
array(1) {
75+
&array(1) {
7676
[0]=>
7777
array(1) {
7878
[0]=>
79-
NULL
79+
*RECURSION*
8080
}
8181
}
8282
}
@@ -93,11 +93,11 @@ array(1) {
9393
}
9494
array(1) {
9595
[0]=>
96-
array(1) {
96+
&array(1) {
9797
[0]=>
9898
array(1) {
9999
[0]=>
100-
NULL
100+
*RECURSION*
101101
}
102102
}
103103
}

tests/026.phpt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ var_dump($k);
4545
?>
4646
--EXPECT--
4747
array
48-
82a16182a162a163a164a165a16683c001a16182a162a163a164a165a166c0
48+
82a16182a162a163a164a165a16683c001a16182a162a163a164a165a16682c0020003
4949
array(2) {
5050
["a"]=>
5151
array(2) {
@@ -55,7 +55,7 @@ array(2) {
5555
string(1) "e"
5656
}
5757
["f"]=>
58-
array(2) {
58+
&array(2) {
5959
["a"]=>
6060
array(2) {
6161
["b"]=>
@@ -64,7 +64,7 @@ array(2) {
6464
string(1) "e"
6565
}
6666
["f"]=>
67-
NULL
67+
*RECURSION*
6868
}
6969
}
7070
OK
@@ -84,29 +84,29 @@ array(1) {
8484
}
8585
array(1) {
8686
["foo"]=>
87-
array(3) {
87+
&array(3) {
8888
[0]=>
8989
int(1)
9090
[1]=>
9191
int(2)
9292
[2]=>
9393
array(1) {
9494
["foo"]=>
95-
NULL
95+
*RECURSION*
9696
}
9797
}
9898
}
9999
array(1) {
100100
["foo"]=>
101-
array(3) {
101+
&array(3) {
102102
[0]=>
103103
int(1)
104104
[1]=>
105105
string(1) "b"
106106
[2]=>
107107
array(1) {
108108
["foo"]=>
109-
NULL
109+
*RECURSION*
110110
}
111111
}
112112
}

tests/060.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,11 +238,11 @@ array(2) {
238238
OK
239239
array(1) {
240240
[0]=>
241-
array(1) {
241+
&array(1) {
242242
[0]=>
243243
array(1) {
244244
[0]=>
245-
NULL
245+
*RECURSION*
246246
}
247247
}
248248
}

tests/061.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,11 +243,11 @@ array(2) {
243243
OK
244244
array(1) {
245245
[0]=>
246-
array(1) {
246+
&array(1) {
247247
[0]=>
248248
array(1) {
249249
[0]=>
250-
NULL
250+
*RECURSION*
251251
}
252252
}
253253
}

tests/064.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -240,11 +240,11 @@ array(2) {
240240
OK
241241
array(1) {
242242
[0]=>
243-
array(1) {
243+
&array(1) {
244244
[0]=>
245245
array(1) {
246246
[0]=>
247-
NULL
247+
*RECURSION*
248248
}
249249
}
250250
}

tests/065.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,11 +245,11 @@ array(2) {
245245
OK
246246
array(1) {
247247
[0]=>
248-
array(1) {
248+
&array(1) {
249249
[0]=>
250250
array(1) {
251251
[0]=>
252-
NULL
252+
*RECURSION*
253253
}
254254
}
255255
}

tests/070.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,11 +222,11 @@ array(2) {
222222
OK
223223
array(1) {
224224
[0]=>
225-
array(1) {
225+
&array(1) {
226226
[0]=>
227227
array(1) {
228228
[0]=>
229-
NULL
229+
*RECURSION*
230230
}
231231
}
232232
}

tests/071.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,11 +224,11 @@ array(2) {
224224
OK
225225
array(1) {
226226
[0]=>
227-
array(1) {
227+
&array(1) {
228228
[0]=>
229229
array(1) {
230230
[0]=>
231-
NULL
231+
*RECURSION*
232232
}
233233
}
234234
}

tests/072.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,11 +264,11 @@ array(2) {
264264
OK
265265
array(1) {
266266
[0]=>
267-
array(1) {
267+
&array(1) {
268268
[0]=>
269269
array(1) {
270270
[0]=>
271-
NULL
271+
*RECURSION*
272272
}
273273
}
274274
}

0 commit comments

Comments
 (0)