mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
* Add an API macro users can use to ensure an array member can be modifed
before they modify it. * Fix a bug and remove redundant code in convert_to_long() (booleans and resources weren't changing their types
This commit is contained in:
parent
33f30aee64
commit
84aa8cce64
2 changed files with 17 additions and 7 deletions
17
Zend/zend.h
17
Zend/zend.h
|
@ -241,8 +241,23 @@ extern zend_utility_values zend_uv;
|
|||
(z)->EA.is_ref = 0; \
|
||||
(z)->EA.locks = 0;
|
||||
|
||||
#define MAKE_STD_ZVAL(zv) \
|
||||
#define MAKE_STD_ZVAL(zv) \
|
||||
zv = (zval *) emalloc(sizeof(zval)); \
|
||||
INIT_PZVAL(zv);
|
||||
|
||||
#define SEPARATE_ZVAL(ppzv) \
|
||||
{ \
|
||||
zval *orig_ptr = *(ppzv); \
|
||||
\
|
||||
if (orig_ptr->refcount>1) { \
|
||||
orig_ptr->refcount--; \
|
||||
*(ppzv) = (zval *) emalloc(sizeof(zval)); \
|
||||
**(ppzv) = *orig_ptr; \
|
||||
zval_copy_ctor(*(ppzv)); \
|
||||
(*(ppzv))->refcount=1; \
|
||||
(*(ppzv))->EA.is_ref = 0; \
|
||||
(*(ppzv))->EA.locks = 0; \
|
||||
} \
|
||||
}
|
||||
|
||||
#endif /* _ZEND_H */
|
||||
|
|
|
@ -162,34 +162,29 @@ ZEND_API void convert_to_long_base(zval *op, int base)
|
|||
case IS_BOOL:
|
||||
case IS_RESOURCE:
|
||||
case IS_LONG:
|
||||
return;
|
||||
break;
|
||||
case IS_DOUBLE:
|
||||
op->value.lval = (long) op->value.dval;
|
||||
op->type = IS_LONG;
|
||||
break;
|
||||
case IS_STRING:
|
||||
strval = op->value.str.val;
|
||||
op->value.lval = strtol(strval, NULL, base);
|
||||
op->type = IS_LONG;
|
||||
STR_FREE(strval);
|
||||
break;
|
||||
case IS_ARRAY:
|
||||
tmp = (zend_hash_num_elements(op->value.ht)?1:0);
|
||||
zval_dtor(op);
|
||||
op->value.lval = tmp;
|
||||
op->type = IS_LONG;
|
||||
break;
|
||||
case IS_OBJECT:
|
||||
tmp = (zend_hash_num_elements(op->value.obj.properties)?1:0);
|
||||
zval_dtor(op);
|
||||
op->value.lval = tmp;
|
||||
op->type = IS_LONG;
|
||||
break;
|
||||
default:
|
||||
zend_error(E_WARNING, "Cannot convert to ordinal value");
|
||||
zval_dtor(op);
|
||||
op->value.lval = 0;
|
||||
op->type = IS_LONG;
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue