summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-02-25 15:23:06 +0400
committerDmitry Stogov <dmitry@zend.com>2014-02-25 15:23:06 +0400
commitb965647e44c4574ba4c22bfc92b5b7f587451c9d (patch)
tree2d0a144c7156edcbdca88b626ddd19447b87f0fb
parentcabfbf712850d31081f7a9d0ebe03576b6ae980b (diff)
parent40a9132de8337f95aba153a5a6fcdb43eb02f681 (diff)
downloadphp-git-b965647e44c4574ba4c22bfc92b5b7f587451c9d.tar.gz
Merge branch 'refactoring2' of github.com:zendtech/php into refactoring2
Conflicts: Zend/zend_object_handlers.c
-rw-r--r--Zend/zend_execute_API.c4
-rw-r--r--Zend/zend_object_handlers.c8
-rw-r--r--Zend/zend_operators.c4
-rw-r--r--ext/spl/php_spl.c11
-rw-r--r--ext/standard/incomplete_class.c4
-rw-r--r--ext/standard/var.c3
-rw-r--r--ext/standard/var_unserializer.c46
-rw-r--r--ext/standard/var_unserializer.re16
8 files changed, 50 insertions, 46 deletions
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 7fb89bc046..425a04756b 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -371,10 +371,10 @@ ZEND_API const char *get_active_function_name(TSRMLS_D) /* {{{ */
}
switch (EG(current_execute_data)->function_state.function->type) {
case ZEND_USER_FUNCTION: {
- const char *function_name = ((zend_op_array *) EG(current_execute_data)->function_state.function)->function_name->val;
+ zend_string *function_name = ((zend_op_array *) EG(current_execute_data)->function_state.function)->function_name;
if (function_name) {
- return function_name;
+ return function_name->val;
} else {
return "main";
}
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index 1f9d5f24d0..48f1bc641a 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -86,7 +86,9 @@ ZEND_API void rebuild_object_properties(zend_object *zobj) /* {{{ */
prop_info->offset >= 0 &&
Z_TYPE(zobj->properties_table[prop_info->offset]) != IS_UNDEF) {
zval *zv = zend_hash_add(zobj->properties, prop_info->name, &zobj->properties_table[prop_info->offset]);
- ZVAL_INDIRECT(&zobj->properties_table[prop_info->offset], zv);
+ if (EXPECTED(zv)) {
+ ZVAL_INDIRECT(&zobj->properties_table[prop_info->offset], zv);
+ }
}
}
while (ce->parent && ce->parent->default_properties_count) {
@@ -100,7 +102,7 @@ ZEND_API void rebuild_object_properties(zend_object *zobj) /* {{{ */
prop_info->offset >= 0 &&
Z_TYPE(zobj->properties_table[prop_info->offset]) != IS_UNDEF) {
zval *zv = zend_hash_add(zobj->properties, prop_info->name, &zobj->properties_table[prop_info->offset]);
- if (zv) {
+ if (EXPECTED(zv != NULL)) {
ZVAL_INDIRECT(&zobj->properties_table[prop_info->offset], zv);
}
}
@@ -567,7 +569,7 @@ found:
/* To check: can't *variable_ptr be some system variable like error_zval here? */
ZVAL_COPY_VALUE(Z_REFVAL_P(variable_ptr), value);
- if (Z_REFCOUNT_P(value) > 0) {
+ if (Z_REFCOUNTED_P(value) && Z_REFCOUNT_P(value) > 0) {
zval_copy_ctor(Z_REFVAL_P(variable_ptr));
}
zval_dtor(&garbage);
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index 849f4d3bd3..2c3d657d0b 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -1704,7 +1704,7 @@ ZEND_API int compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {
}
/* }}} */
-static int hash_zval_identical_function(const zval **z1, const zval **z2) /* {{{ */
+static int hash_zval_identical_function(const zval *z1, const zval *z2) /* {{{ */
{
zval result;
TSRMLS_FETCH();
@@ -1714,7 +1714,7 @@ static int hash_zval_identical_function(const zval **z1, const zval **z2) /* {{{
* whereas this comparison function is expected to return 0 on identity,
* and non zero otherwise.
*/
- if (is_identical_function(&result, (zval *) *z1, (zval *) *z2 TSRMLS_CC)==FAILURE) {
+ if (is_identical_function(&result, z1, z2 TSRMLS_CC)==FAILURE) {
return 1;
}
return !Z_LVAL(result);
diff --git a/ext/spl/php_spl.c b/ext/spl/php_spl.c
index 26f39eb513..002820b6fc 100644
--- a/ext/spl/php_spl.c
+++ b/ext/spl/php_spl.c
@@ -394,14 +394,16 @@ typedef struct {
zend_class_entry *ce;
} autoload_func_info;
-static void autoload_func_info_dtor(autoload_func_info *alfi)
+static void autoload_func_info_dtor(zval *element)
{
+ autoload_func_info *alfi = (autoload_func_info*)Z_PTR_P(element);
if (alfi->obj) {
zval_ptr_dtor(alfi->obj);
}
if (alfi->closure) {
zval_ptr_dtor(alfi->closure);
}
+ efree(alfi);
}
/* {{{ proto void spl_autoload_call(string class_name)
@@ -553,10 +555,9 @@ PHP_FUNCTION(spl_autoload_register)
alfi.closure = zcallable;
Z_ADDREF_P(zcallable);
- lc_name = STR_ALLOC(func_name_len + 2 + sizeof(zend_uint), 0);
+ lc_name = STR_ALLOC(func_name_len + sizeof(zend_uint), 0);
zend_str_tolower_copy(lc_name->val, func_name, func_name_len);
memcpy(lc_name->val + func_name_len, &Z_OBJ_HANDLE_P(zcallable), sizeof(zend_uint));
- lc_name->len += sizeof(zend_uint);
lc_name->val[lc_name->len] = '\0';
} else {
lc_name = STR_ALLOC(func_name_len, 0);
@@ -597,14 +598,14 @@ PHP_FUNCTION(spl_autoload_register)
spl_alfi.ce = NULL;
spl_alfi.closure = NULL;
zend_hash_str_add_mem(SPL_G(autoload_functions), "spl_autoload", sizeof("spl_autoload") - 1,
- (void *)&spl_alfi, sizeof(autoload_func_info));
+ &spl_alfi, sizeof(autoload_func_info));
if (prepend && SPL_G(autoload_functions)->nNumOfElements > 1) {
/* Move the newly created element to the head of the hashtable */
HT_MOVE_TAIL_TO_HEAD(SPL_G(autoload_functions));
}
}
- if (zend_hash_add_mem(SPL_G(autoload_functions), lc_name, &alfi.func_ptr, sizeof(autoload_func_info)) == NULL) {
+ if (zend_hash_add_mem(SPL_G(autoload_functions), lc_name, &alfi, sizeof(autoload_func_info)) == NULL) {
if (obj_ptr && !(alfi.func_ptr->common.fn_flags & ZEND_ACC_STATIC)) {
Z_DELREF_P(alfi.obj);
}
diff --git a/ext/standard/incomplete_class.c b/ext/standard/incomplete_class.c
index d8aa461b05..3cbe70479d 100644
--- a/ext/standard/incomplete_class.c
+++ b/ext/standard/incomplete_class.c
@@ -41,10 +41,10 @@ static void incomplete_class_message(zval *object, int error_type TSRMLS_DC)
class_name = php_lookup_class_name(object);
if (class_name) {
- php_error_docref(NULL TSRMLS_CC, error_type, INCOMPLETE_CLASS_MSG, "unknown");
- } else {
php_error_docref(NULL TSRMLS_CC, error_type, INCOMPLETE_CLASS_MSG, class_name->val);
STR_RELEASE(class_name);
+ } else {
+ php_error_docref(NULL TSRMLS_CC, error_type, INCOMPLETE_CLASS_MSG, "unknown");
}
}
/* }}} */
diff --git a/ext/standard/var.c b/ext/standard/var.c
index fa67905f12..a074ea2c12 100644
--- a/ext/standard/var.c
+++ b/ext/standard/var.c
@@ -810,6 +810,7 @@ static void php_var_serialize_intern(smart_str *buf, zval *struc, HashTable *var
BG(serialize_lock)++;
res = call_user_function_ex(CG(function_table), struc, &fname, &retval, 0, 0, 1, NULL TSRMLS_CC);
BG(serialize_lock)--;
+ zval_dtor(&fname);
if (EG(exception)) {
zval_ptr_dtor(&retval);
@@ -830,9 +831,9 @@ static void php_var_serialize_intern(smart_str *buf, zval *struc, HashTable *var
}
return;
}
+ zval_ptr_dtor(&retval);
}
- zval_ptr_dtor(&retval);
/* fall-through */
}
case IS_ARRAY: {
diff --git a/ext/standard/var_unserializer.c b/ext/standard/var_unserializer.c
index 8d640f7fc8..90502dc1f1 100644
--- a/ext/standard/var_unserializer.c
+++ b/ext/standard/var_unserializer.c
@@ -306,7 +306,6 @@ static inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTable *ht, long
if (!php_var_unserialize(&data, p, max, var_hash TSRMLS_CC)) {
zval_dtor(&key);
- zval_dtor(&data);
return 0;
}
@@ -409,10 +408,10 @@ static inline int object_common2(UNSERIALIZE_PARAMETER, long elements)
BG(serialize_lock)++;
call_user_function_ex(CG(function_table), rval, &fname, &retval, 0, 0, 1, NULL TSRMLS_CC);
BG(serialize_lock)--;
+ zval_dtor(&fname);
+ zval_dtor(&retval);
}
- zval_ptr_dtor(&retval);
-
if (EG(exception)) {
return 0;
}
@@ -445,7 +444,7 @@ PHPAPI int php_var_unserialize(UNSERIALIZE_PARAMETER)
-#line 449 "ext/standard/var_unserializer.c"
+#line 448 "ext/standard/var_unserializer.c"
{
YYCTYPE yych;
static const unsigned char yybm[] = {
@@ -507,7 +506,7 @@ yy2:
yy3:
#line 785 "ext/standard/var_unserializer.re"
{ return 0; }
-#line 511 "ext/standard/var_unserializer.c"
+#line 510 "ext/standard/var_unserializer.c"
yy4:
yych = *(YYMARKER = ++YYCURSOR);
if (yych == ':') goto yy89;
@@ -556,7 +555,7 @@ yy14:
php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Unexpected end of serialized data");
return 0; /* not sure if it should be 0 or 1 here? */
}
-#line 560 "ext/standard/var_unserializer.c"
+#line 559 "ext/standard/var_unserializer.c"
yy16:
yych = *++YYCURSOR;
goto yy3;
@@ -586,7 +585,7 @@ yy20:
yych = *++YYCURSOR;
if (yych != '"') goto yy18;
++YYCURSOR;
-#line 641 "ext/standard/var_unserializer.re"
+#line 640 "ext/standard/var_unserializer.re"
{
size_t len, len2, len3, maxlen;
long elements;
@@ -663,12 +662,13 @@ yy20:
/* Call unserialize callback */
ZVAL_STRING(&user_func, PG(unserialize_callback_func));
- ZVAL_STR(&args[0], class_name);
+
+ ZVAL_STR(&args[0], STR_COPY(class_name));
BG(serialize_lock)++;
if (call_user_function_ex(CG(function_table), NULL, &user_func, &retval, 1, args, 0, NULL TSRMLS_CC) != SUCCESS) {
BG(serialize_lock)--;
if (EG(exception)) {
- STR_FREE(class_name);
+ STR_RELEASE(class_name);
zval_ptr_dtor(&user_func);
zval_ptr_dtor(&args[0]);
return 0;
@@ -683,7 +683,7 @@ yy20:
BG(serialize_lock)--;
zval_ptr_dtor(&retval);
if (EG(exception)) {
- STR_FREE(class_name);
+ STR_RELEASE(class_name);
zval_ptr_dtor(&user_func);
zval_ptr_dtor(&args[0]);
return 0;
@@ -711,7 +711,7 @@ yy20:
if (ret && incomplete_class) {
php_store_class_name(rval, class_name->val, len2);
}
- STR_FREE(class_name);
+ STR_RELEASE(class_name);
return ret;
}
@@ -720,7 +720,7 @@ yy20:
if (incomplete_class) {
php_store_class_name(rval, class_name->val, len2);
}
- STR_FREE(class_name);
+ STR_RELEASE(class_name);
return object_common2(UNSERIALIZE_PASSTHRU, elements);
}
@@ -749,7 +749,7 @@ yy27:
yych = *++YYCURSOR;
if (yych != '"') goto yy18;
++YYCURSOR;
-#line 633 "ext/standard/var_unserializer.re"
+#line 632 "ext/standard/var_unserializer.re"
{
//??? INIT_PZVAL(rval);
@@ -778,7 +778,7 @@ yy34:
yych = *++YYCURSOR;
if (yych != '{') goto yy18;
++YYCURSOR;
-#line 615 "ext/standard/var_unserializer.re"
+#line 614 "ext/standard/var_unserializer.re"
{
long elements = parse_iv(start + 2);
/* use iv() not uiv() in order to check data range */
@@ -817,7 +817,7 @@ yy41:
yych = *++YYCURSOR;
if (yych != '"') goto yy18;
++YYCURSOR;
-#line 586 "ext/standard/var_unserializer.re"
+#line 585 "ext/standard/var_unserializer.re"
{
size_t len, maxlen;
char *str;
@@ -867,7 +867,7 @@ yy48:
yych = *++YYCURSOR;
if (yych != '"') goto yy18;
++YYCURSOR;
-#line 559 "ext/standard/var_unserializer.re"
+#line 558 "ext/standard/var_unserializer.re"
{
size_t len, maxlen;
char *str;
@@ -982,7 +982,7 @@ yy61:
}
yy63:
++YYCURSOR;
-#line 550 "ext/standard/var_unserializer.re"
+#line 549 "ext/standard/var_unserializer.re"
{
#if SIZEOF_LONG == 4
use_double:
@@ -1050,7 +1050,7 @@ yy73:
yych = *++YYCURSOR;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 534 "ext/standard/var_unserializer.re"
+#line 533 "ext/standard/var_unserializer.re"
{
*p = YYCURSOR;
@@ -1093,7 +1093,7 @@ yy79:
if (yych <= '9') goto yy79;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 508 "ext/standard/var_unserializer.re"
+#line 507 "ext/standard/var_unserializer.re"
{
#if SIZEOF_LONG == 4
int digits = YYCURSOR - start - 3;
@@ -1127,7 +1127,7 @@ yy83:
yych = *++YYCURSOR;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 502 "ext/standard/var_unserializer.re"
+#line 501 "ext/standard/var_unserializer.re"
{
*p = YYCURSOR;
ZVAL_BOOL(rval, parse_iv(start + 2));
@@ -1136,7 +1136,7 @@ yy83:
#line 1137 "ext/standard/var_unserializer.c"
yy87:
++YYCURSOR;
-#line 496 "ext/standard/var_unserializer.re"
+#line 495 "ext/standard/var_unserializer.re"
{
*p = YYCURSOR;
ZVAL_NULL(rval);
@@ -1165,7 +1165,7 @@ yy91:
if (yych <= '9') goto yy91;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 473 "ext/standard/var_unserializer.re"
+#line 472 "ext/standard/var_unserializer.re"
{
long id;
@@ -1211,7 +1211,7 @@ yy97:
if (yych <= '9') goto yy97;
if (yych != ';') goto yy18;
++YYCURSOR;
-#line 453 "ext/standard/var_unserializer.re"
+#line 452 "ext/standard/var_unserializer.re"
{
long id;
diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re
index c22f5c0c69..6e644905dc 100644
--- a/ext/standard/var_unserializer.re
+++ b/ext/standard/var_unserializer.re
@@ -310,7 +310,6 @@ static inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTable *ht, long
if (!php_var_unserialize(&data, p, max, var_hash TSRMLS_CC)) {
zval_dtor(&key);
- zval_dtor(&data);
return 0;
}
@@ -413,10 +412,10 @@ static inline int object_common2(UNSERIALIZE_PARAMETER, long elements)
BG(serialize_lock)++;
call_user_function_ex(CG(function_table), rval, &fname, &retval, 0, 0, 1, NULL TSRMLS_CC);
BG(serialize_lock)--;
+ zval_dtor(&fname);
+ zval_dtor(&retval);
}
- zval_ptr_dtor(&retval);
-
if (EG(exception)) {
return 0;
}
@@ -714,12 +713,13 @@ object ":" uiv ":" ["] {
/* Call unserialize callback */
ZVAL_STRING(&user_func, PG(unserialize_callback_func));
- ZVAL_STR(&args[0], class_name);
+
+ ZVAL_STR(&args[0], STR_COPY(class_name));
BG(serialize_lock)++;
if (call_user_function_ex(CG(function_table), NULL, &user_func, &retval, 1, args, 0, NULL TSRMLS_CC) != SUCCESS) {
BG(serialize_lock)--;
if (EG(exception)) {
- STR_FREE(class_name);
+ STR_RELEASE(class_name);
zval_ptr_dtor(&user_func);
zval_ptr_dtor(&args[0]);
return 0;
@@ -734,7 +734,7 @@ object ":" uiv ":" ["] {
BG(serialize_lock)--;
zval_ptr_dtor(&retval);
if (EG(exception)) {
- STR_FREE(class_name);
+ STR_RELEASE(class_name);
zval_ptr_dtor(&user_func);
zval_ptr_dtor(&args[0]);
return 0;
@@ -762,7 +762,7 @@ object ":" uiv ":" ["] {
if (ret && incomplete_class) {
php_store_class_name(rval, class_name->val, len2);
}
- STR_FREE(class_name);
+ STR_RELEASE(class_name);
return ret;
}
@@ -771,7 +771,7 @@ object ":" uiv ":" ["] {
if (incomplete_class) {
php_store_class_name(rval, class_name->val, len2);
}
- STR_FREE(class_name);
+ STR_RELEASE(class_name);
return object_common2(UNSERIALIZE_PASSTHRU, elements);
}