]> granicus.if.org Git - php/commitdiff
GC fix
authorDmitry Stogov <dmitry@php.net>
Tue, 6 May 2008 16:02:50 +0000 (16:02 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 6 May 2008 16:02:50 +0000 (16:02 +0000)
Zend/zend_execute.c
Zend/zend_execute_API.c

index 29494387a6c05453ed1767df5ecad8a745b2abcb..5ceaec8cd0e54c705098f7a3c852bdd82077661e 100644 (file)
@@ -85,9 +85,13 @@ static inline void zend_pzval_unlock_func(zval *z, zend_free_op *should_free, in
 static inline void zend_pzval_unlock_free_func(zval *z) /* {{{ */
 {
        if (!Z_DELREF_P(z)) {
-               GC_REMOVE_ZVAL_FROM_BUFFER(z);
-               zval_dtor(z);
-               safe_free_zval_ptr(z);
+               TSRMLS_FETCH();
+
+               if (z != &EG(uninitialized_zval)) {
+                       GC_REMOVE_ZVAL_FROM_BUFFER(z);
+                       zval_dtor(z);
+                       efree(z);
+               }
        }
 }
 /* }}} */
@@ -778,9 +782,11 @@ static inline zval* zend_assign_to_variable(zval **variable_ptr_ptr, zval *value
                                } else {
                                        Z_ADDREF_P(value);
                                        *variable_ptr_ptr = value;
-                                       GC_REMOVE_ZVAL_FROM_BUFFER(variable_ptr);
-                                       zendi_zval_dtor(*variable_ptr);
-                                       safe_free_zval_ptr(variable_ptr);
+                                       if (variable_ptr != &EG(uninitialized_zval)) {
+                                               GC_REMOVE_ZVAL_FROM_BUFFER(variable_ptr);
+                                               zval_dtor(variable_ptr);
+                                               efree(variable_ptr);
+                                       }
                                        return value;
                                }
                        } else {
index ca4cc2b2987009e382537747c0bd2708d938426c..612d8069fba41e308e316311760861a8440e94af 100644 (file)
@@ -445,9 +445,13 @@ ZEND_API void _zval_ptr_dtor(zval **zval_ptr ZEND_FILE_LINE_DC) /* {{{ */
 #endif
        Z_DELREF_PP(zval_ptr);
        if (Z_REFCOUNT_PP(zval_ptr) == 0) {
-               GC_REMOVE_ZVAL_FROM_BUFFER(*zval_ptr);
-               zval_dtor(*zval_ptr);
-               safe_free_zval_ptr_rel(*zval_ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_CC);
+               TSRMLS_FETCH();
+
+               if (*zval_ptr != &EG(uninitialized_zval)) {
+                       GC_REMOVE_ZVAL_FROM_BUFFER(*zval_ptr);
+                       zval_dtor(*zval_ptr);
+                       efree_rel(*zval_ptr);
+               }
        } else {
                TSRMLS_FETCH();