@@ -295,12 +295,77 @@ typedef union _zvalue_value {
295
295
struct _zval_struct {
296
296
/* Variable information */
297
297
zvalue_value value ; /* value */
298
- zend_uint refcount ;
298
+ zend_uint refcount__gc ;
299
299
zend_uchar type ; /* active type */
300
- zend_uchar is_ref ;
300
+ zend_uchar is_ref__gc ;
301
301
zend_uchar idx_type ; /* type of element's index in constant array */
302
302
};
303
303
304
+ #define Z_REFCOUNT_PP (ppz ) Z_REFCOUNT_P(*(ppz))
305
+ #define Z_SET_REFCOUNT_PP (ppz , rc ) Z_SET_REFCOUNT_P(*(ppz), rc)
306
+ #define Z_ADDREF_PP (ppz ) Z_ADDREF_P(*(ppz))
307
+ #define Z_DELREF_PP (ppz ) Z_DELREF_P(*(ppz))
308
+ #define Z_ISREF_PP (ppz ) Z_ISREF_P(*(ppz))
309
+ #define Z_SET_ISREF_PP (ppz ) Z_SET_ISREF_P(*(ppz))
310
+ #define Z_UNSET_ISREF_PP (ppz ) Z_UNSET_ISREF_P(*(ppz))
311
+ #define Z_SET_ISREF_TO_PP (ppz , isref ) Z_SET_ISREF_TO_P(*(ppz), isref)
312
+
313
+ #define Z_REFCOUNT_P (pz ) zval_refcount_p(pz)
314
+ #define Z_SET_REFCOUNT_P (pz , rc ) zval_set_refcount_p(pz, rc)
315
+ #define Z_ADDREF_P (pz ) zval_addref_p(pz)
316
+ #define Z_DELREF_P (pz ) zval_delref_p(pz)
317
+ #define Z_ISREF_P (pz ) zval_isref_p(pz)
318
+ #define Z_SET_ISREF_P (pz ) zval_set_isref_p(pz)
319
+ #define Z_UNSET_ISREF_P (pz ) zval_unset_isref_p(pz)
320
+ #define Z_SET_ISREF_TO_P (pz , isref ) zval_set_isref_to_p(pz, isref)
321
+
322
+ #define Z_REFCOUNT (z ) Z_REFCOUNT_P(&(z))
323
+ #define Z_SET_REFCOUNT (z , rc ) Z_SET_REFCOUNT_P(&(z), rc)
324
+ #define Z_ADDREF (z ) Z_ADDREF_P(&(z))
325
+ #define Z_DELREF (z ) Z_DELREF_P(&(z))
326
+ #define Z_ISREF (z ) Z_ISREF_P(&(z))
327
+ #define Z_SET_ISREF (z ) Z_SET_ISREF_P(&(z))
328
+ #define Z_UNSET_ISREF (z ) Z_UNSET_ISREF_P(&(z))
329
+ #define Z_SET_ISREF_TO (z , isref ) Z_SET_ISREF_TO_P(&(z), isref)
330
+
331
+ #if defined(__GNUC__ )
332
+ #define always_inline inline __attribute__((always_inline))
333
+ #elif defined(_MSC_VER )
334
+ #define always_inline __forceinline
335
+ #else
336
+ #define always_inline inline
337
+ #endif
338
+
339
+ static always_inline zend_uint zval_refcount_p (zval * pz ) {
340
+ return pz -> refcount__gc ;
341
+ }
342
+
343
+ static always_inline zend_uint zval_set_refcount_p (zval * pz , zend_uint rc ) {
344
+ return pz -> refcount__gc = rc ;
345
+ }
346
+
347
+ static always_inline zend_uint zval_addref_p (zval * pz ) {
348
+ return ++ pz -> refcount__gc ;
349
+ }
350
+
351
+ static always_inline zend_uint zval_delref_p (zval * pz ) {
352
+ return -- pz -> refcount__gc ;
353
+ }
354
+
355
+ static always_inline zend_bool zval_isref_p (zval * pz ) {
356
+ return pz -> is_ref__gc ;
357
+ }
358
+
359
+ static always_inline zend_bool zval_set_isref_p (zval * pz ) {
360
+ return pz -> is_ref__gc = 1 ;
361
+ }
362
+
363
+ static always_inline zend_bool zval_unset_isref_p (zval * pz ) {
364
+ return pz -> is_ref__gc = 0 ;
365
+ }
366
+ static always_inline zend_bool zval_set_isref_to_p (zval * pz , zend_bool isref ) {
367
+ return pz -> is_ref__gc = isref ;
368
+ }
304
369
305
370
/* excpt.h on Digital Unix 4.0 defines function_table */
306
371
#undef function_table
@@ -561,14 +626,9 @@ END_EXTERN_C()
561
626
#define ZMSG_LOG_SCRIPT_NAME 6L
562
627
#define ZMSG_MEMORY_LEAKS_GRAND_TOTAL 7L
563
628
564
-
565
- #define ZVAL_ADDREF (pz ) (++(pz)->refcount)
566
- #define ZVAL_DELREF (pz ) (--(pz)->refcount)
567
- #define ZVAL_REFCOUNT (pz ) ((pz)->refcount)
568
-
569
629
#define INIT_PZVAL (z ) \
570
- (z)->refcount = 1; \
571
- (z)->is_ref = 0;
630
+ (z)->refcount__gc = 1; \
631
+ (z)->is_ref__gc = 0;
572
632
573
633
#define INIT_ZVAL (z ) z = zval_used_for_init;
574
634
@@ -580,19 +640,19 @@ END_EXTERN_C()
580
640
ALLOC_ZVAL(zv); \
581
641
INIT_PZVAL(zv);
582
642
583
- #define PZVAL_IS_REF (z ) ((z)->is_ref )
643
+ #define PZVAL_IS_REF (z ) Z_ISREF_P(z )
584
644
585
645
#define SEPARATE_ZVAL (ppzv ) \
586
646
{ \
587
647
zval *orig_ptr = *(ppzv); \
588
648
\
589
- if (orig_ptr->refcount >1) { \
590
- orig_ptr->refcount-- ; \
649
+ if (Z_REFCOUNT_P( orig_ptr) >1) { \
650
+ Z_DELREF_P( orig_ptr) ; \
591
651
ALLOC_ZVAL(*(ppzv)); \
592
652
**(ppzv) = *orig_ptr; \
593
653
zval_copy_ctor(*(ppzv)); \
594
- (*( ppzv))->refcount=1 ; \
595
- (*( ppzv))->is_ref = 0 ; \
654
+ Z_SET_REFCOUNT_PP( ppzv, 1) ; \
655
+ Z_UNSET_ISREF_PP( ppzv); \
596
656
} \
597
657
}
598
658
@@ -604,14 +664,14 @@ END_EXTERN_C()
604
664
#define SEPARATE_ZVAL_TO_MAKE_IS_REF (ppzv ) \
605
665
if (!PZVAL_IS_REF(*ppzv)) { \
606
666
SEPARATE_ZVAL(ppzv); \
607
- (*( ppzv))->is_ref = 1 ; \
667
+ Z_SET_ISREF_PP( ppzv); \
608
668
}
609
669
610
670
#define COPY_PZVAL_TO_ZVAL (zv , pzv ) \
611
671
(zv) = *(pzv); \
612
- if ((pzv)->refcount >1) { \
672
+ if (Z_REFCOUNT_P (pzv)>1) { \
613
673
zval_copy_ctor(&(zv)); \
614
- (pzv)->refcount-- ; \
674
+ Z_DELREF_P (pzv); \
615
675
} else { \
616
676
FREE_ZVAL(pzv); \
617
677
} \
@@ -621,15 +681,15 @@ END_EXTERN_C()
621
681
int is_ref, refcount; \
622
682
\
623
683
SEPARATE_ZVAL_IF_NOT_REF(ppzv_dest); \
624
- is_ref = (* ppzv_dest)->is_ref ; \
625
- refcount = (* ppzv_dest)->refcount ; \
684
+ is_ref = Z_ISREF_PP( ppzv_dest); \
685
+ refcount = Z_REFCOUNT_PP( ppzv_dest); \
626
686
zval_dtor(*ppzv_dest); \
627
687
**ppzv_dest = *pzv_src; \
628
688
if (copy) { \
629
689
zval_copy_ctor(*ppzv_dest); \
630
690
} \
631
- (* ppzv_dest)->is_ref = is_ref; \
632
- (* ppzv_dest)->refcount = refcount; \
691
+ Z_SET_ISREF_TO_PP( ppzv_dest, is_ref) ; \
692
+ Z_SET_REFCOUNT_PP( ppzv_dest, refcount) ; \
633
693
}
634
694
635
695
#define SEPARATE_ARG_IF_REF (varptr ) \
@@ -638,15 +698,15 @@ END_EXTERN_C()
638
698
ALLOC_ZVAL(varptr); \
639
699
varptr->value = original_var->value; \
640
700
varptr->type = original_var->type; \
641
- varptr->is_ref = 0 ; \
642
- varptr->refcount = 1 ; \
701
+ Z_UNSET_ISREF_P( varptr) ; \
702
+ Z_SET_REFCOUNT_P( varptr, 1) ; \
643
703
zval_copy_ctor(varptr); \
644
704
} else { \
645
- varptr->refcount++ ; \
705
+ Z_ADDREF_P( varptr) ; \
646
706
}
647
707
648
708
#define READY_TO_DESTROY (zv ) \
649
- ((zv)->refcount == 1 && \
709
+ (Z_REFCOUNT_P (zv) == 1 && \
650
710
(Z_TYPE_P(zv) != IS_OBJECT || \
651
711
zend_objects_store_get_refcount(zv TSRMLS_CC) == 1))
652
712
0 commit comments