}
}
+static zend_always_inline void _zval_copy_ctor_no_imm(zval *zvalue ZEND_FILE_LINE_DC)
+{
+ if (Z_REFCOUNTED_P(zvalue)) {
+ if (Z_COPYABLE_P(zvalue)) {
+ _zval_copy_ctor_func(zvalue ZEND_FILE_LINE_RELAY_CC);
+ } else {
+ Z_ADDREF_P(zvalue);
+ }
+ }
+}
+
+static zend_always_inline void _zval_opt_copy_ctor_no_imm(zval *zvalue ZEND_FILE_LINE_DC)
+{
+ if (Z_OPT_REFCOUNTED_P(zvalue)) {
+ if (Z_OPT_COPYABLE_P(zvalue)) {
+ _zval_copy_ctor_func(zvalue ZEND_FILE_LINE_RELAY_CC);
+ } else {
+ Z_ADDREF_P(zvalue);
+ }
+ }
+}
+
ZEND_API int zval_copy_static_var(zval *p TSRMLS_DC, int num_args, va_list args, zend_hash_key *key);
ZEND_API int zend_print_variable(zval *var TSRMLS_DC);
ZEND_API void _zval_dtor_wrapper(zval *zvalue);
#define zval_copy_ctor(zvalue) _zval_copy_ctor((zvalue) ZEND_FILE_LINE_CC)
#define zval_opt_copy_ctor(zvalue) _zval_opt_copy_ctor((zvalue) ZEND_FILE_LINE_CC)
+#define zval_copy_ctor_no_imm(zvalue) _zval_copy_ctor_no_imm((zvalue) ZEND_FILE_LINE_CC)
+#define zval_opt_copy_ctor_no_imm(zvalue) _zval_opt_copy_ctor_no_imm((zvalue) ZEND_FILE_LINE_CC)
#define zval_dtor(zvalue) _zval_dtor((zvalue) ZEND_FILE_LINE_CC)
#define zval_ptr_dtor(zval_ptr) _zval_ptr_dtor((zval_ptr) ZEND_FILE_LINE_CC)
#define zval_internal_dtor(zvalue) _zval_internal_dtor((zvalue) ZEND_FILE_LINE_CC)
} else {
if (OP1_TYPE == IS_CONST || OP1_TYPE == IS_TMP_VAR) {
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
- if (OP1_TYPE == IS_CONST && !Z_OPT_IMMUTABLE_P(EX(return_value))) {
- zval_opt_copy_ctor(EX(return_value));
+ if (OP1_TYPE == IS_CONST) {
+ zval_opt_copy_ctor_no_imm(EX(return_value));
}
} else if (Z_ISREF_P(retval_ptr)) {
ZVAL_DUP(EX(return_value), Z_REFVAL_P(retval_ptr));
}
} else {
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
- if (OP1_TYPE != IS_TMP_VAR && !Z_OPT_IMMUTABLE_P(EX(return_value))) {
- zval_opt_copy_ctor(EX(return_value));
+ if (OP1_TYPE != IS_TMP_VAR) {
+ zval_opt_copy_ctor_no_imm(EX(return_value));
}
}
break;
if (OP1_TYPE == IS_CONST) {
/* Immutable arrays may be passed without copying ??? */
/* some internal functions may try to modify them !!! */
- if (!Z_OPT_IMMUTABLE_P(top)) {
- zval_opt_copy_ctor(top);
- }
+ zval_opt_copy_ctor_no_imm(top);
}
ZEND_VM_NEXT_OPCODE();
}
ZVAL_COPY_VALUE(top, Z_REFVAL_P(varptr));
/* Immutable arrays may be passed without copying ??? */
/* some internal functions may try to modify them !!! */
- if (!Z_OPT_IMMUTABLE_P(top)) {
- zval_opt_copy_ctor(top);
- }
+ zval_opt_copy_ctor_no_imm(top);
FREE_OP1();
} else {
ZVAL_COPY_VALUE(top, varptr);
ZVAL_COPY_VALUE(top, Z_REFVAL_P(varptr));
/* Immutable arrays may be passed without copying ??? */
/* some internal functions may try to modify them !!! */
- if (!Z_OPT_IMMUTABLE_P(top)) {
- zval_opt_copy_ctor(top);
- }
+ zval_opt_copy_ctor_no_imm(top);
FREE_OP1();
} else {
ZVAL_COPY_VALUE(top, varptr);
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
if (!IS_OP1_TMP_FREE()) {
- if (!Z_OPT_IMMUTABLE_P(EX_VAR(opline->result.var))) {
- zval_opt_copy_ctor(EX_VAR(opline->result.var));
- }
+ zval_opt_copy_ctor_no_imm(EX_VAR(opline->result.var));
}
FREE_OP1_IF_VAR();
CHECK_EXCEPTION();
} else {
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
if (!IS_OP1_TMP_FREE()) {
- if (!Z_OPT_IMMUTABLE_P(EX_VAR(opline->result.var))) {
- zval_opt_copy_ctor(EX_VAR(opline->result.var));
- }
+ zval_opt_copy_ctor_no_imm(EX_VAR(opline->result.var));
}
}
} else {
if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
- if (IS_CONST == IS_CONST && !Z_OPT_IMMUTABLE_P(EX(return_value))) {
- zval_opt_copy_ctor(EX(return_value));
+ if (IS_CONST == IS_CONST) {
+ zval_opt_copy_ctor_no_imm(EX(return_value));
}
} else if (Z_ISREF_P(retval_ptr)) {
ZVAL_DUP(EX(return_value), Z_REFVAL_P(retval_ptr));
}
} else {
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
- if (IS_CONST != IS_TMP_VAR && !Z_OPT_IMMUTABLE_P(EX(return_value))) {
- zval_opt_copy_ctor(EX(return_value));
+ if (IS_CONST != IS_TMP_VAR) {
+ zval_opt_copy_ctor_no_imm(EX(return_value));
}
}
break;
if (IS_CONST == IS_CONST) {
/* Immutable arrays may be passed without copying ??? */
/* some internal functions may try to modify them !!! */
- if (!Z_OPT_IMMUTABLE_P(top)) {
- zval_opt_copy_ctor(top);
- }
+ zval_opt_copy_ctor_no_imm(top);
}
ZEND_VM_NEXT_OPCODE();
}
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
if (!0) {
- if (!Z_OPT_IMMUTABLE_P(EX_VAR(opline->result.var))) {
- zval_opt_copy_ctor(EX_VAR(opline->result.var));
- }
+ zval_opt_copy_ctor_no_imm(EX_VAR(opline->result.var));
}
CHECK_EXCEPTION();
} else {
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
if (!0) {
- if (!Z_OPT_IMMUTABLE_P(EX_VAR(opline->result.var))) {
- zval_opt_copy_ctor(EX_VAR(opline->result.var));
- }
+ zval_opt_copy_ctor_no_imm(EX_VAR(opline->result.var));
}
}
} else {
if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
- if (IS_TMP_VAR == IS_CONST && !Z_OPT_IMMUTABLE_P(EX(return_value))) {
- zval_opt_copy_ctor(EX(return_value));
+ if (IS_TMP_VAR == IS_CONST) {
+ zval_opt_copy_ctor_no_imm(EX(return_value));
}
} else if (Z_ISREF_P(retval_ptr)) {
ZVAL_DUP(EX(return_value), Z_REFVAL_P(retval_ptr));
}
} else {
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
- if (IS_TMP_VAR != IS_TMP_VAR && !Z_OPT_IMMUTABLE_P(EX(return_value))) {
- zval_opt_copy_ctor(EX(return_value));
+ if (IS_TMP_VAR != IS_TMP_VAR) {
+ zval_opt_copy_ctor_no_imm(EX(return_value));
}
}
break;
if (IS_TMP_VAR == IS_CONST) {
/* Immutable arrays may be passed without copying ??? */
/* some internal functions may try to modify them !!! */
- if (!Z_OPT_IMMUTABLE_P(top)) {
- zval_opt_copy_ctor(top);
- }
+ zval_opt_copy_ctor_no_imm(top);
}
ZEND_VM_NEXT_OPCODE();
}
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
if (!1) {
- if (!Z_OPT_IMMUTABLE_P(EX_VAR(opline->result.var))) {
- zval_opt_copy_ctor(EX_VAR(opline->result.var));
- }
+ zval_opt_copy_ctor_no_imm(EX_VAR(opline->result.var));
}
CHECK_EXCEPTION();
} else {
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
if (!1) {
- if (!Z_OPT_IMMUTABLE_P(EX_VAR(opline->result.var))) {
- zval_opt_copy_ctor(EX_VAR(opline->result.var));
- }
+ zval_opt_copy_ctor_no_imm(EX_VAR(opline->result.var));
}
}
} else {
if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
- if (IS_VAR == IS_CONST && !Z_OPT_IMMUTABLE_P(EX(return_value))) {
- zval_opt_copy_ctor(EX(return_value));
+ if (IS_VAR == IS_CONST) {
+ zval_opt_copy_ctor_no_imm(EX(return_value));
}
} else if (Z_ISREF_P(retval_ptr)) {
ZVAL_DUP(EX(return_value), Z_REFVAL_P(retval_ptr));
}
} else {
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
- if (IS_VAR != IS_TMP_VAR && !Z_OPT_IMMUTABLE_P(EX(return_value))) {
- zval_opt_copy_ctor(EX(return_value));
+ if (IS_VAR != IS_TMP_VAR) {
+ zval_opt_copy_ctor_no_imm(EX(return_value));
}
}
break;
ZVAL_COPY_VALUE(top, Z_REFVAL_P(varptr));
/* Immutable arrays may be passed without copying ??? */
/* some internal functions may try to modify them !!! */
- if (!Z_OPT_IMMUTABLE_P(top)) {
- zval_opt_copy_ctor(top);
- }
+ zval_opt_copy_ctor_no_imm(top);
zval_ptr_dtor_nogc(free_op1.var);
} else {
ZVAL_COPY_VALUE(top, varptr);
ZVAL_COPY_VALUE(top, Z_REFVAL_P(varptr));
/* Immutable arrays may be passed without copying ??? */
/* some internal functions may try to modify them !!! */
- if (!Z_OPT_IMMUTABLE_P(top)) {
- zval_opt_copy_ctor(top);
- }
+ zval_opt_copy_ctor_no_imm(top);
zval_ptr_dtor_nogc(free_op1.var);
} else {
ZVAL_COPY_VALUE(top, varptr);
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
if (!0) {
- if (!Z_OPT_IMMUTABLE_P(EX_VAR(opline->result.var))) {
- zval_opt_copy_ctor(EX_VAR(opline->result.var));
- }
+ zval_opt_copy_ctor_no_imm(EX_VAR(opline->result.var));
}
zval_ptr_dtor_nogc(free_op1.var);
CHECK_EXCEPTION();
} else {
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
if (!0) {
- if (!Z_OPT_IMMUTABLE_P(EX_VAR(opline->result.var))) {
- zval_opt_copy_ctor(EX_VAR(opline->result.var));
- }
+ zval_opt_copy_ctor_no_imm(EX_VAR(opline->result.var));
}
}
} else {
if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
- if (IS_CV == IS_CONST && !Z_OPT_IMMUTABLE_P(EX(return_value))) {
- zval_opt_copy_ctor(EX(return_value));
+ if (IS_CV == IS_CONST) {
+ zval_opt_copy_ctor_no_imm(EX(return_value));
}
} else if (Z_ISREF_P(retval_ptr)) {
ZVAL_DUP(EX(return_value), Z_REFVAL_P(retval_ptr));
}
} else {
ZVAL_COPY_VALUE(EX(return_value), retval_ptr);
- if (IS_CV != IS_TMP_VAR && !Z_OPT_IMMUTABLE_P(EX(return_value))) {
- zval_opt_copy_ctor(EX(return_value));
+ if (IS_CV != IS_TMP_VAR) {
+ zval_opt_copy_ctor_no_imm(EX(return_value));
}
}
break;
ZVAL_COPY_VALUE(top, Z_REFVAL_P(varptr));
/* Immutable arrays may be passed without copying ??? */
/* some internal functions may try to modify them !!! */
- if (!Z_OPT_IMMUTABLE_P(top)) {
- zval_opt_copy_ctor(top);
- }
+ zval_opt_copy_ctor_no_imm(top);
} else {
ZVAL_COPY_VALUE(top, varptr);
ZVAL_COPY_VALUE(top, Z_REFVAL_P(varptr));
/* Immutable arrays may be passed without copying ??? */
/* some internal functions may try to modify them !!! */
- if (!Z_OPT_IMMUTABLE_P(top)) {
- zval_opt_copy_ctor(top);
- }
+ zval_opt_copy_ctor_no_imm(top);
} else {
ZVAL_COPY_VALUE(top, varptr);
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
if (!0) {
- if (!Z_OPT_IMMUTABLE_P(EX_VAR(opline->result.var))) {
- zval_opt_copy_ctor(EX_VAR(opline->result.var));
- }
+ zval_opt_copy_ctor_no_imm(EX_VAR(opline->result.var));
}
CHECK_EXCEPTION();
} else {
ZVAL_COPY_VALUE(EX_VAR(opline->result.var), value);
if (!0) {
- if (!Z_OPT_IMMUTABLE_P(EX_VAR(opline->result.var))) {
- zval_opt_copy_ctor(EX_VAR(opline->result.var));
- }
+ zval_opt_copy_ctor_no_imm(EX_VAR(opline->result.var));
}
}
Create an array containing the range of integers or characters from low to high (inclusive) */
PHP_FUNCTION(range)
{
- zval *zlow, *zhigh, *zstep = NULL;
+ zval *zlow, *zhigh, *zstep = NULL, tmp;
int err = 0, is_step_double = 0;
double step = 1.0;
/* If the range is given as strings, generate an array of characters. */
if (Z_TYPE_P(zlow) == IS_STRING && Z_TYPE_P(zhigh) == IS_STRING && Z_STRLEN_P(zlow) >= 1 && Z_STRLEN_P(zhigh) >= 1) {
int type1, type2;
- unsigned char *low, *high;
+ unsigned char low, high;
long lstep = (long) step;
type1 = is_numeric_string(Z_STRVAL_P(zlow), Z_STRLEN_P(zlow), NULL, NULL, 0);
goto long_str;
}
- low = (unsigned char *)Z_STRVAL_P(zlow);
- high = (unsigned char *)Z_STRVAL_P(zhigh);
-
- if (*low > *high) { /* Negative Steps */
- unsigned char ch = *low;
+ low = (unsigned char *)Z_STRVAL_P(zlow)[0];
+ high = (unsigned char *)Z_STRVAL_P(zhigh)[0];
+ if (low > high) { /* Negative Steps */
if (lstep <= 0) {
err = 1;
goto err;
}
- for (; ch >= *high; ch -= (unsigned int)lstep) {
- add_next_index_stringl(return_value, (const char *)&ch, 1);
- if (((signed int)ch - lstep) < 0) {
+ for (; low >= high; low -= (unsigned int)lstep) {
+ if (CG(one_char_string)[low]) {
+ ZVAL_INT_STR(&tmp, CG(one_char_string)[low]);
+ } else {
+ ZVAL_STRINGL(&tmp, &low, 1);
+ }
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &tmp);
+ if (((signed int)low - lstep) < 0) {
break;
}
}
- } else if (*high > *low) { /* Positive Steps */
- unsigned char ch = *low;
-
+ } else if (high > low) { /* Positive Steps */
if (lstep <= 0) {
err = 1;
goto err;
}
- for (; ch <= *high; ch += (unsigned int)lstep) {
- add_next_index_stringl(return_value, (const char *)&ch, 1);
- if (((signed int)ch + lstep) > 255) {
+ for (; low <= high; low += (unsigned int)lstep) {
+ if (CG(one_char_string)[low]) {
+ ZVAL_INT_STR(&tmp, CG(one_char_string)[low]);
+ } else {
+ ZVAL_STRINGL(&tmp, &low, 1);
+ }
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &tmp);
+ if (((signed int)low + lstep) > 255) {
break;
}
}
} else {
- add_next_index_stringl(return_value, (const char *)low, 1);
+ if (CG(one_char_string)[low]) {
+ ZVAL_INT_STR(&tmp, CG(one_char_string)[low]);
+ } else {
+ ZVAL_STRINGL(&tmp, (char*)&low, 1);
+ }
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &tmp);
}
} else if (Z_TYPE_P(zlow) == IS_DOUBLE || Z_TYPE_P(zhigh) == IS_DOUBLE || is_step_double) {
high = zval_get_double(zhigh);
i = 0;
+ Z_TYPE_INFO(tmp) = IS_DOUBLE;
if (low > high) { /* Negative steps */
if (low - high < step || step <= 0) {
err = 1;
}
for (value = low; value >= (high - DOUBLE_DRIFT_FIX); value = low - (++i * step)) {
- add_next_index_double(return_value, value);
+ Z_DVAL(tmp) = value;
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &tmp);
}
} else if (high > low) { /* Positive steps */
if (high - low < step || step <= 0) {
}
for (value = low; value <= (high + DOUBLE_DRIFT_FIX); value = low + (++i * step)) {
- add_next_index_double(return_value, value);
+ Z_DVAL(tmp) = value;
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &tmp);
}
} else {
- add_next_index_double(return_value, low);
+ Z_DVAL(tmp) = low;
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &tmp);
}
} else {
double low, high;
high = zval_get_double(zhigh);
lstep = (long) step;
+ Z_TYPE_INFO(tmp) = IS_LONG;
if (low > high) { /* Negative steps */
if (low - high < lstep || lstep <= 0) {
err = 1;
goto err;
}
for (; low >= high; low -= lstep) {
- add_next_index_long(return_value, (long)low);
+ Z_LVAL(tmp) = (long)low;
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &tmp);
}
} else if (high > low) { /* Positive steps */
if (high - low < lstep || lstep <= 0) {
goto err;
}
for (; low <= high; low += lstep) {
- add_next_index_long(return_value, (long)low);
+ Z_LVAL(tmp) = (long)low;
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &tmp);
}
} else {
- add_next_index_long(return_value, (long)low);
+ Z_LVAL(tmp) = (long)low;
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &tmp);
}
}
err: