Use better data structures (incomplete)

This commit is contained in:
Dmitry Stogov 2014-02-19 16:50:09 +04:00
parent b3aea904e0
commit ff61b46941
5 changed files with 61 additions and 23 deletions

View file

@ -428,7 +428,7 @@ ZEND_API void zend_create_closure(zval *res, zend_function *func, zend_class_ent
closure->func = *func; closure->func = *func;
closure->func.common.prototype = NULL; closure->func.common.prototype = NULL;
if ((scope == NULL) && (this_ptr != NULL)) { if ((scope == NULL) && (Z_TYPE_P(this_ptr) != IS_UNDEF)) {
/* use dummy scope if we're binding an object without specifying a scope */ /* use dummy scope if we're binding an object without specifying a scope */
/* maybe it would be better to create one for this purpose */ /* maybe it would be better to create one for this purpose */
scope = zend_ce_closure; scope = zend_ce_closure;

View file

@ -72,7 +72,8 @@ ZEND_API int zend_verify_arg_error(int error_type, const zend_function *zf, zend
static zend_always_inline void i_zval_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC TSRMLS_DC) static zend_always_inline void i_zval_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC TSRMLS_DC)
{ {
if (IS_REFCOUNTED(Z_TYPE_P(zval_ptr))) { //??? IS_CONSTANT_TYPE_MASK used only for some rare cases
if (IS_REFCOUNTED(Z_TYPE_P(zval_ptr) & IS_CONSTANT_TYPE_MASK)) {
if (!Z_DELREF_P(zval_ptr)) { if (!Z_DELREF_P(zval_ptr)) {
ZEND_ASSERT(zval_ptr != &EG(uninitialized_zval)); ZEND_ASSERT(zval_ptr != &EG(uninitialized_zval));
GC_REMOVE_ZVAL_FROM_BUFFER(zval_ptr); GC_REMOVE_ZVAL_FROM_BUFFER(zval_ptr);

View file

@ -299,6 +299,7 @@ ZEND_API int zval_copy_static_var(zval *p TSRMLS_DC, int num_args, va_list args,
} else { } else {
if (is_ref) { if (is_ref) {
SEPARATE_ZVAL_TO_MAKE_IS_REF(p); SEPARATE_ZVAL_TO_MAKE_IS_REF(p);
/*
if (!Z_ISREF_P(p)) { if (!Z_ISREF_P(p)) {
if (IS_REFCOUNTED(Z_TYPE_P(p)) && Z_REFCOUNT_P(p) > 1) { if (IS_REFCOUNTED(Z_TYPE_P(p)) && Z_REFCOUNT_P(p) > 1) {
Z_DELREF_P(p); Z_DELREF_P(p);
@ -309,6 +310,7 @@ ZEND_API int zval_copy_static_var(zval *p TSRMLS_DC, int num_args, va_list args,
ZVAL_NEW_REF(p, p); ZVAL_NEW_REF(p, p);
} }
} }
*/
} else if (Z_ISREF_P(p)) { } else if (Z_ISREF_P(p)) {
ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(p)); ZVAL_COPY_VALUE(&tmp, Z_REFVAL_P(p));
if (Z_REFCOUNTED(tmp) && Z_REFCOUNT(tmp) > 1) { if (Z_REFCOUNTED(tmp) && Z_REFCOUNT(tmp) > 1) {

View file

@ -2258,10 +2258,15 @@ ZEND_VM_HANDLER(56, ZEND_ADD_VAR, TMP|UNUSED, TMP|VAR|CV)
} }
if (Z_TYPE_P(var) != IS_STRING) { if (Z_TYPE_P(var) != IS_STRING) {
zend_make_printable_zval(var, &var_copy, &use_copy); if (Z_TYPE_P(var) == IS_REFERENCE) {
var = Z_REFVAL_P(var);
}
if (Z_TYPE_P(var) != IS_STRING) {
zend_make_printable_zval(var, &var_copy, &use_copy);
if (use_copy) { if (use_copy) {
var = &var_copy; var = &var_copy;
}
} }
} }
add_string_to_string(str, str, var); add_string_to_string(str, str, var);

View file

@ -9519,10 +9519,15 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_
} }
if (Z_TYPE_P(var) != IS_STRING) { if (Z_TYPE_P(var) != IS_STRING) {
zend_make_printable_zval(var, &var_copy, &use_copy); if (Z_TYPE_P(var) == IS_REFERENCE) {
var = Z_REFVAL_P(var);
}
if (Z_TYPE_P(var) != IS_STRING) {
zend_make_printable_zval(var, &var_copy, &use_copy);
if (use_copy) { if (use_copy) {
var = &var_copy; var = &var_copy;
}
} }
} }
add_string_to_string(str, str, var); add_string_to_string(str, str, var);
@ -10319,10 +10324,15 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_
} }
if (Z_TYPE_P(var) != IS_STRING) { if (Z_TYPE_P(var) != IS_STRING) {
zend_make_printable_zval(var, &var_copy, &use_copy); if (Z_TYPE_P(var) == IS_REFERENCE) {
var = Z_REFVAL_P(var);
}
if (Z_TYPE_P(var) != IS_STRING) {
zend_make_printable_zval(var, &var_copy, &use_copy);
if (use_copy) { if (use_copy) {
var = &var_copy; var = &var_copy;
}
} }
} }
add_string_to_string(str, str, var); add_string_to_string(str, str, var);
@ -11664,10 +11674,15 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_A
} }
if (Z_TYPE_P(var) != IS_STRING) { if (Z_TYPE_P(var) != IS_STRING) {
zend_make_printable_zval(var, &var_copy, &use_copy); if (Z_TYPE_P(var) == IS_REFERENCE) {
var = Z_REFVAL_P(var);
}
if (Z_TYPE_P(var) != IS_STRING) {
zend_make_printable_zval(var, &var_copy, &use_copy);
if (use_copy) { if (use_copy) {
var = &var_copy; var = &var_copy;
}
} }
} }
add_string_to_string(str, str, var); add_string_to_string(str, str, var);
@ -25226,10 +25241,15 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDL
} }
if (Z_TYPE_P(var) != IS_STRING) { if (Z_TYPE_P(var) != IS_STRING) {
zend_make_printable_zval(var, &var_copy, &use_copy); if (Z_TYPE_P(var) == IS_REFERENCE) {
var = Z_REFVAL_P(var);
}
if (Z_TYPE_P(var) != IS_STRING) {
zend_make_printable_zval(var, &var_copy, &use_copy);
if (use_copy) { if (use_copy) {
var = &var_copy; var = &var_copy;
}
} }
} }
add_string_to_string(str, str, var); add_string_to_string(str, str, var);
@ -26474,10 +26494,15 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDL
} }
if (Z_TYPE_P(var) != IS_STRING) { if (Z_TYPE_P(var) != IS_STRING) {
zend_make_printable_zval(var, &var_copy, &use_copy); if (Z_TYPE_P(var) == IS_REFERENCE) {
var = Z_REFVAL_P(var);
}
if (Z_TYPE_P(var) != IS_STRING) {
zend_make_printable_zval(var, &var_copy, &use_copy);
if (use_copy) { if (use_copy) {
var = &var_copy; var = &var_copy;
}
} }
} }
add_string_to_string(str, str, var); add_string_to_string(str, str, var);
@ -28121,10 +28146,15 @@ static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLE
} }
if (Z_TYPE_P(var) != IS_STRING) { if (Z_TYPE_P(var) != IS_STRING) {
zend_make_printable_zval(var, &var_copy, &use_copy); if (Z_TYPE_P(var) == IS_REFERENCE) {
var = Z_REFVAL_P(var);
}
if (Z_TYPE_P(var) != IS_STRING) {
zend_make_printable_zval(var, &var_copy, &use_copy);
if (use_copy) { if (use_copy) {
var = &var_copy; var = &var_copy;
}
} }
} }
add_string_to_string(str, str, var); add_string_to_string(str, str, var);