convert_to_long_base(op, 10);
break;
case IS_NULL:
- Z_TYPE_P(op) = IS_LONG;
- Z_LVAL_P(op) = 0;
+ ZVAL_LONG(op, 0);
break;
}
} \
case IS_BOOL: \
case IS_RESOURCE: \
- Z_LVAL(holder) = Z_LVAL_P(op); \
- Z_TYPE(holder) = IS_LONG; \
+ ZVAL_LONG(&(holder), Z_LVAL_P(op)); \
(op) = &(holder); \
break; \
case IS_NULL: \
- Z_LVAL(holder) = 0; \
- Z_TYPE(holder) = IS_LONG; \
+ ZVAL_LONG(&(holder), 0); \
(op) = &(holder); \
break; \
case IS_OBJECT: \
(holder) = (*(op)); \
zval_copy_ctor(&(holder)); \
convert_to_long_base(&(holder), 10); \
- if (Z_TYPE(holder) == IS_LONG) { \
+ if (Z_TYPE(holder) == IS_LONG) { \
(op) = &(holder); \
} \
break; \
} \
break; \
case IS_UNICODE: \
- if (Z_USTRLEN_P(op) == 0 \
- || (Z_USTRLEN_P(op)==1 && \
+ if (Z_USTRLEN_P(op) == 0 \
+ || (Z_USTRLEN_P(op)==1 && \
(Z_USTRVAL_P(op)[0]=='0'))) { \
Z_LVAL(holder) = 0; \
} else { \
if (Z_OBJ_HT_P(op)->cast_object) { \
zval dst; \
if (Z_OBJ_HT_P(op)->cast_object(op, &dst, ctype, NULL TSRMLS_CC) == FAILURE) { \
- zend_error(E_RECOVERABLE_ERROR, \
+ zend_error(E_RECOVERABLE_ERROR, \
"Object of class %v could not be converted to %s", Z_OBJCE_P(op)->name, \
- zend_get_type_by_const(ctype)); \
+ zend_get_type_by_const(ctype)); \
} else { \
zval_dtor(op); \
Z_TYPE_P(op) = ctype; \
op->value = dst.value; \
+ retval = SUCCESS; \
} \
} else { \
if (Z_OBJ_HT_P(op)->get) { \
zval_dtor(op); \
*op = *newop; \
FREE_ZVAL(newop); \
- conv_func(op); \
+ retval = conv_func(op); \
} \
} \
}
case IS_STRING:
{
char *strval = Z_STRVAL_P(op);
+
Z_LVAL_P(op) = strtol(strval, NULL, base);
STR_FREE(strval);
}
case IS_OBJECT: {
int retval = FAILURE;
- if (Z_OBJ_HT_P(op)->cast_object) {
- zval dst;
- if (Z_OBJ_HT_P(op)->cast_object(op, &dst, IS_UNICODE, conv TSRMLS_CC) == FAILURE) {
- zend_error(E_RECOVERABLE_ERROR,
- "Object of class %v could not be converted to %s",
- Z_OBJCE_P(op)->name, zend_get_type_by_const(IS_UNICODE));
- } else {
- zval_dtor(op);
- Z_TYPE_P(op) = IS_UNICODE;
- op->value = dst.value;
- retval = SUCCESS;
- }
- } else {
- if (Z_OBJ_HT_P(op)->get) {
- zval *newop = Z_OBJ_HT_P(op)->get(op TSRMLS_CC);
- if (Z_TYPE_P(newop) != IS_OBJECT) {
- /* for safety - avoid loop */
- zval_dtor(op);
- *op = *newop;
- FREE_ZVAL(newop);
- retval = convert_to_string_with_converter(op, conv);
- }
- }
- }
+ convert_object_to_type(op, IS_UNICODE, convert_to_unicode);
if (retval == SUCCESS && Z_TYPE_P(op) == IS_UNICODE) {
return SUCCESS;
int retval = FAILURE;
TSRMLS_FETCH();
- if (Z_OBJ_HT_P(op)->cast_object) {
- zval dst;
- if (Z_OBJ_HT_P(op)->cast_object(op, &dst, IS_STRING, conv TSRMLS_CC) == FAILURE) {
- zend_error(E_RECOVERABLE_ERROR,
- "Object of class %v could not be converted to %s",
- Z_OBJCE_P(op)->name, zend_get_type_by_const(IS_STRING));
- } else {
- zval_dtor(op);
- Z_TYPE_P(op) = IS_STRING;
- op->value = dst.value;
- retval = SUCCESS;
- }
- } else {
- if (Z_OBJ_HT_P(op)->get) {
- zval *newop = Z_OBJ_HT_P(op)->get(op TSRMLS_CC);
- if (Z_TYPE_P(newop) != IS_OBJECT) {
- /* for safety - avoid loop */
- zval_dtor(op);
- *op = *newop;
- FREE_ZVAL(newop);
- retval = convert_to_string_with_converter(op, conv);
- }
- }
- }
+ convert_object_to_type(op, IS_STRING, convert_to_string);
if (retval == SUCCESS && Z_TYPE_P(op) == IS_STRING) {
return SUCCESS;
{
/* OBJECTS_OPTIMIZE */
TSRMLS_FETCH();
-
object_init(op);
zend_hash_update(Z_OBJPROP_P(op), "scalar", sizeof("scalar"), (void *) &entry, sizeof(zval *), NULL);
}
ZEND_API int convert_to_object(zval *op) /* {{{ */
{
TSRMLS_FETCH();
+
switch (Z_TYPE_P(op)) {
case IS_ARRAY:
{
zend_error(E_ERROR, "Unsupported operand types");
return FAILURE; /* unknown datatype */
}
- }
- }
+ }
+ }
}
/* }}} */
return SUCCESS;
}
- Z_TYPE_P(result) = IS_LONG;
- Z_LVAL_P(result) = Z_LVAL_P(op1) % Z_LVAL_P(op2);
+ ZVAL_LONG(result, Z_LVAL_P(op1) % Z_LVAL_P(op2));
return SUCCESS;
}
/* }}} */
{
zval op1_copy, op2_copy;
- Z_TYPE_P(result) = IS_BOOL;
-
zendi_convert_to_boolean(op1, op1_copy, result);
zendi_convert_to_boolean(op2, op2_copy, result);
- Z_LVAL_P(result) = Z_LVAL_P(op1) ^ Z_LVAL_P(op2);
+ ZVAL_BOOL(result, Z_LVAL_P(op1) ^ Z_LVAL_P(op2));
return SUCCESS;
}
/* }}} */
zval op1_copy;
zendi_convert_to_boolean(op1, op1_copy, result);
-
- Z_TYPE_P(result) = IS_BOOL;
- Z_LVAL_P(result) = !Z_LVAL_P(op1);
+ ZVAL_BOOL(result, !Z_LVAL_P(op1));
return SUCCESS;
}
/* }}} */
ZVAL_LONG(result, ~Z_LVAL_P(op1));
return SUCCESS;
} else if (Z_TYPE_P(op1) == IS_DOUBLE) {
- ZVAL_LONG(result, ~(long)Z_DVAL_P(op1));
+ ZVAL_LONG(result, ~(long) Z_DVAL_P(op1));
return SUCCESS;
} else if (Z_TYPE_P(op1) == IS_STRING) {
int i;
- Z_TYPE_P(result) = Z_TYPE_P(op1);
+ Z_TYPE_P(result) = IS_STRING;
Z_STRVAL_P(result) = estrndup(Z_STRVAL_P(op1), Z_STRLEN_P(op1));
Z_STRLEN_P(result) = Z_STRLEN_P(op1);
for (i = 0; i < Z_STRLEN_P(op1); i++) {
shorter = op1;
}
- Z_TYPE_P(result) = Z_TYPE_P(op1);
+ Z_TYPE_P(result) = IS_STRING;
result_len = Z_STRLEN_P(longer);
result_str = estrndup(Z_STRVAL_P(longer), Z_STRLEN_P(longer));
for (i = 0; i < Z_STRLEN_P(shorter); i++) {
Z_STRLEN_P(result) = result_len;
return SUCCESS;
}
+
if (Z_TYPE_P(op1) == IS_UNICODE && Z_TYPE_P(op2) == IS_UNICODE) {
zend_error(E_ERROR, "Unsupported operand types");
return FAILURE;
}
+
zendi_convert_to_long(op1, op1_copy, result);
zendi_convert_to_long(op2, op2_copy, result);
- Z_TYPE_P(result) = IS_LONG;
- Z_LVAL_P(result) = Z_LVAL_P(op1) | Z_LVAL_P(op2);
+ ZVAL_LONG(result, Z_LVAL_P(op1) | Z_LVAL_P(op2));
return SUCCESS;
}
/* }}} */
shorter = op1;
}
- Z_TYPE_P(result) = Z_TYPE_P(op1);
+ Z_TYPE_P(result) = IS_STRING;
result_len = Z_STRLEN_P(shorter);
result_str = estrndup(Z_STRVAL_P(shorter), Z_STRLEN_P(shorter));
for (i = 0; i < Z_STRLEN_P(shorter); i++) {
zendi_convert_to_long(op1, op1_copy, result);
zendi_convert_to_long(op2, op2_copy, result);
- Z_TYPE_P(result) = IS_LONG;
- Z_LVAL_P(result) = Z_LVAL_P(op1) & Z_LVAL_P(op2);
+ ZVAL_LONG(result, Z_LVAL_P(op1) & Z_LVAL_P(op2));
return SUCCESS;
}
/* }}} */
shorter = op1;
}
- Z_TYPE_P(result) = Z_TYPE_P(op1);
+ Z_TYPE_P(result) = IS_STRING;
result_len = Z_STRLEN_P(shorter);
result_str = estrndup(Z_STRVAL_P(shorter), Z_STRLEN_P(shorter));
for (i = 0; i < Z_STRLEN_P(shorter); i++) {
zendi_convert_to_long(op1, op1_copy, result);
zendi_convert_to_long(op2, op2_copy, result);
- Z_TYPE_P(result) = IS_LONG;
- Z_LVAL_P(result) = Z_LVAL_P(op1) ^ Z_LVAL_P(op2);
+ ZVAL_LONG(result, Z_LVAL_P(op1) ^ Z_LVAL_P(op2));
return SUCCESS;
}
/* }}} */
zendi_convert_to_long(op1, op1_copy, result);
zendi_convert_to_long(op2, op2_copy, result);
- Z_LVAL_P(result) = Z_LVAL_P(op1) << Z_LVAL_P(op2);
- Z_TYPE_P(result) = IS_LONG;
+ ZVAL_LONG(result, Z_LVAL_P(op1) << Z_LVAL_P(op2));
return SUCCESS;
}
/* }}} */
zendi_convert_to_long(op1, op1_copy, result);
zendi_convert_to_long(op2, op2_copy, result);
- Z_LVAL_P(result) = Z_LVAL_P(op1) >> Z_LVAL_P(op2);
- Z_TYPE_P(result) = IS_LONG;
+ ZVAL_LONG(result, Z_LVAL_P(op1) >> Z_LVAL_P(op2));
return SUCCESS;
}
/* }}} */
op2 = &op2_copy;
}
- Z_LVAL_P(result) = zend_u_binary_zval_strcmp(op1, op2);
- Z_TYPE_P(result) = IS_LONG;
+ ZVAL_LONG(result, zend_u_binary_zval_strcmp(op1, op2));
if (use_copy1) {
zval_dtor(op1);
if (use_copy2) {
zval_dtor(op2);
}
-
return SUCCESS;
}
/* }}} */
Z_LVAL_P(result) = (Z_DVAL_P(op1) == Z_DVAL_P(op2));
break;
case IS_STRING:
- if ((Z_STRLEN_P(op1) == Z_STRLEN_P(op2))
- && (!memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)))) {
- Z_LVAL_P(result) = 1;
- } else {
- Z_LVAL_P(result) = 0;
- }
+ Z_LVAL_P(result) = (Z_STRLEN_P(op1) == Z_STRLEN_P(op2))
+ && (!memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)));
break;
case IS_UNICODE:
- if ((Z_USTRLEN_P(op1) == Z_USTRLEN_P(op2))
- && (!memcmp(Z_USTRVAL_P(op1), Z_USTRVAL_P(op2), UBYTES(Z_USTRLEN_P(op1))))) {
- Z_LVAL_P(result) = 1;
- } else {
- Z_LVAL_P(result) = 0;
- }
+ Z_LVAL_P(result) = (Z_USTRLEN_P(op1) == Z_USTRLEN_P(op2))
+ && (!memcmp(Z_USTRVAL_P(op1), Z_USTRVAL_P(op2), UBYTES(Z_USTRLEN_P(op1))));
break;
case IS_ARRAY:
- if (zend_hash_compare(Z_ARRVAL_P(op1), Z_ARRVAL_P(op2), (compare_func_t) hash_zval_identical_function, 1 TSRMLS_CC)==0) {
- Z_LVAL_P(result) = 1;
- } else {
- Z_LVAL_P(result) = 0;
- }
+ Z_LVAL_P(result) = zend_hash_compare(Z_ARRVAL_P(op1), Z_ARRVAL_P(op2), (compare_func_t) hash_zval_identical_function, 1 TSRMLS_CC)==0;
break;
case IS_OBJECT:
if (Z_OBJ_HT_P(op1) == Z_OBJ_HT_P(op2)) {
Z_DVAL_P(op1) = Z_DVAL_P(op1) + 1;
break;
case IS_NULL:
- Z_LVAL_P(op1) = 1;
- Z_TYPE_P(op1) = IS_LONG;
+ ZVAL_LONG(op1, 1);
break;
case IS_STRING: {
long lval;
double d = (double)lval;
ZVAL_DOUBLE(op1, d+1);
} else {
- Z_LVAL_P(op1) = lval+1;
- Z_TYPE_P(op1) = IS_LONG;
+ ZVAL_LONG(op1, lval+1);
}
break;
case IS_DOUBLE:
efree(Z_STRVAL_P(op1));
- Z_DVAL_P(op1) = dval+1;
- Z_TYPE_P(op1) = IS_DOUBLE;
+ ZVAL_DOUBLE(op1, dval+1);
break;
default:
/* Perl style string increment */
double d = (double)lval;
ZVAL_DOUBLE(op1, d+1);
} else {
- Z_LVAL_P(op1) = lval+1;
- Z_TYPE_P(op1) = IS_LONG;
+ ZVAL_LONG(op1, lval+1);
}
break;
case IS_DOUBLE:
efree(Z_USTRVAL_P(op1));
- Z_DVAL_P(op1) = dval+1;
- Z_TYPE_P(op1) = IS_DOUBLE;
+ ZVAL_DOUBLE(op1, dval+1);
break;
default:
/* Perl style string increment */
case IS_STRING: /* Like perl we only support string increment */
if (Z_STRLEN_P(op1) == 0) { /* consider as 0 */
STR_FREE(Z_STRVAL_P(op1));
- Z_LVAL_P(op1) = -1;
- Z_TYPE_P(op1) = IS_LONG;
+ ZVAL_LONG(op1, -1);
break;
}
switch (is_numeric_string(Z_STRVAL_P(op1), Z_STRLEN_P(op1), &lval, &dval, 0)) {
double d = (double)lval;
ZVAL_DOUBLE(op1, d-1);
} else {
- Z_LVAL_P(op1) = lval-1;
- Z_TYPE_P(op1) = IS_LONG;
+ ZVAL_LONG(op1, lval-1);
}
break;
case IS_DOUBLE:
STR_FREE(Z_STRVAL_P(op1));
- Z_DVAL_P(op1) = dval - 1;
- Z_TYPE_P(op1) = IS_DOUBLE;
+ ZVAL_DOUBLE(op1, dval - 1);
break;
}
break;
case IS_UNICODE:
if (Z_USTRLEN_P(op1) == 0) { /* consider as 0 */
USTR_FREE(Z_USTRVAL_P(op1));
- Z_LVAL_P(op1) = -1;
- Z_TYPE_P(op1) = IS_LONG;
+ ZVAL_LONG(op1, -1);
break;
}
switch (is_numeric_unicode(Z_USTRVAL_P(op1), Z_USTRLEN_P(op1), &lval, &dval, 0)) {
double d = (double)lval;
ZVAL_DOUBLE(op1, d-1);
} else {
- Z_LVAL_P(op1) = lval-1;
- Z_TYPE_P(op1) = IS_LONG;
+ ZVAL_LONG(op1, lval-1);
}
break;
case IS_DOUBLE:
USTR_FREE(Z_USTRVAL_P(op1));
- Z_DVAL_P(op1) = dval - 1;
- Z_TYPE_P(op1) = IS_DOUBLE;
+ ZVAL_DOUBLE(op1, dval - 1);
break;
}
break;
} else {
string_cmp:
Z_LVAL_P(result) = zend_binary_zval_strcmp(s1, s2);
- Z_LVAL_P(result) = ZEND_NORMALIZE_BOOL(Z_LVAL_P(result));
- Z_TYPE_P(result) = IS_LONG;
+ ZVAL_LONG(result, ZEND_NORMALIZE_BOOL(Z_LVAL_P(result)));
}
- return;
}
/* }}} */
} else {
string_cmp:
Z_LVAL_P(result) = zend_u_binary_zval_strcmp(s1, s2);
- Z_LVAL_P(result) = ZEND_NORMALIZE_BOOL(Z_LVAL_P(result));
- Z_TYPE_P(result) = IS_LONG;
+ ZVAL_LONG(result, ZEND_NORMALIZE_BOOL(Z_LVAL_P(result)));
}
if (use_copy1) {
if (use_copy2) {
zval_dtor(s2);
}
- return;
}
/* }}} */
ZEND_API void zend_compare_symbol_tables(zval *result, HashTable *ht1, HashTable *ht2 TSRMLS_DC) /* {{{ */
{
- Z_TYPE_P(result) = IS_LONG;
- Z_LVAL_P(result) = zend_hash_compare(ht1, ht2, (compare_func_t) hash_zval_compare_function, 0 TSRMLS_CC);
+ ZVAL_LONG(result, zend_hash_compare(ht1, ht2, (compare_func_t) hash_zval_compare_function, 0 TSRMLS_CC));
}
/* }}} */