static int zval_update_class_constant(zval *pp, int is_static, int offset TSRMLS_DC) /* {{{ */
{
ZVAL_DEREF(pp);
- if (Z_TYPE_FLAGS_P(pp) & IS_TYPE_CONSTANT) {
+ if (Z_CONSTANT_P(pp)) {
zend_class_entry **scope = EG(in_execution)?&EG(scope):&CG(active_class_entry);
if ((*scope)->parent) {
int i;
if (ast->kind == ZEND_CONST) {
- return !(Z_TYPE_FLAGS(ast->u.val) & IS_TYPE_CONSTANT);
+ return !Z_CONSTANT(ast->u.val);
} else {
for (i = 0; i < ast->children; i++) {
if ((&ast->u.child)[i]) {
break;
case ZEND_CONST:
ZVAL_DUP(result, &ast->u.val);
- if (Z_TYPE_FLAGS_P(result) & IS_TYPE_CONSTANT) {
+ if (Z_CONSTANT_P(result)) {
zval_update_constant_ex(result, (void *) 1, scope TSRMLS_CC);
}
break;
/* this is necessary to make it able to work with default array
* properties, returned to user */
- if (Z_TYPE_FLAGS(prop_copy) & IS_TYPE_CONSTANT) {
+ if (Z_CONSTANT(prop_copy)) {
zval_update_constant(&prop_copy, 0 TSRMLS_CC);
}
if (all_internal_constants_substitution &&
(c->flags & CONST_PERSISTENT) &&
!(CG(compiler_options) & ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION) &&
- !(Z_TYPE_FLAGS(c->value) & IS_TYPE_CONSTANT)) {
+ !Z_CONSTANT(c->value)) {
return c;
}
return NULL;
#define Z_OBJ_DEC_APPLY_COUNT_P(zv) Z_OBJ_DEC_APPLY_COUNT(*(zv))
/* All data types < IS_STRING have their constructor/destructors skipped */
+#define Z_CONSTANT(zval) ((Z_TYPE_FLAGS(zval) & IS_TYPE_CONSTANT) != 0)
+#define Z_CONSTANT_P(zval_p) Z_CONSTANT(*(zval_p))
+
#define Z_REFCOUNTED(zval) ((Z_TYPE_FLAGS(zval) & IS_TYPE_REFCOUNTED) != 0)
#define Z_REFCOUNTED_P(zval_p) Z_REFCOUNTED(*(zval_p))
#define Z_OPT_TYPE(zval) (Z_TYPE_INFO(zval) & 0xff)
#define Z_OPT_TYPE_P(zval_p) Z_OPT_TYPE(*(zval_p))
+#define Z_OPT_CONSTANT(zval) ((Z_TYPE_INFO(zval) & (IS_TYPE_CONSTANT << Z_TYPE_FLAGS_SHIFT)) != 0)
+#define Z_OPT_CONSTANT_P(zval_p) Z_OPT_CONSTANT(*(zval_p))
+
#define Z_OPT_REFCOUNTED(zval) ((Z_TYPE_INFO(zval) & (IS_TYPE_REFCOUNTED << Z_TYPE_FLAGS_SHIFT)) != 0)
#define Z_OPT_REFCOUNTED_P(zval_p) Z_OPT_REFCOUNTED(*(zval_p))
{
USE_OPLINE
zend_uint arg_num = opline->op1.num;
- zval *param = zend_vm_stack_get_arg(arg_num TSRMLS_CC);
+ zval *param = zend_vm_stack_get_arg_ex(EX(prev_execute_data), arg_num TSRMLS_CC);
SAVE_OPLINE();
if (UNEXPECTED(param == NULL)) {
{
USE_OPLINE
zend_uint arg_num = opline->op1.num;
- zval *param = zend_vm_stack_get_arg(arg_num TSRMLS_CC);
+ zval *param = zend_vm_stack_get_arg_ex(EX(prev_execute_data), arg_num TSRMLS_CC);
zval *var_ptr;
SAVE_OPLINE();
var_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->result.var TSRMLS_CC);
zval_ptr_dtor(var_ptr);
if (param == NULL) {
- if (Z_TYPE_FLAGS_P(opline->op2.zv) & IS_TYPE_CONSTANT) {
- zval tmp;
-
- ZVAL_COPY_VALUE(&tmp, opline->op2.zv);
- zval_update_constant(&tmp, 0 TSRMLS_CC);
- ZVAL_COPY_VALUE(var_ptr, &tmp);
+ ZVAL_COPY_VALUE(var_ptr, opline->op2.zv);
+ if (Z_OPT_CONSTANT_P(var_ptr)) {
+ zval_update_constant(var_ptr, 0 TSRMLS_CC);
} else {
- ZVAL_DUP(var_ptr, opline->op2.zv);
+ /* IS_CONST can't be IS_OBJECT, IS_RESOURCE or IS_REFERENCE */
+ if (UNEXPECTED(Z_OPT_COPYABLE_P(var_ptr))) {
+ _zval_copy_ctor_func(var_ptr ZEND_FILE_LINE_CC);
+ }
}
} else {
ZVAL_COPY(var_ptr, param);
{
USE_OPLINE
zend_uint arg_num = opline->op1.num;
- zend_uint arg_count = zend_vm_stack_get_args_count(TSRMLS_C);
+ zend_uint arg_count = zend_vm_stack_get_args_count_ex(EX(prev_execute_data) TSRMLS_CC);
zval *params;
SAVE_OPLINE();
}
for (; arg_num <= arg_count; ++arg_num) {
- zval *param = zend_vm_stack_get_arg(arg_num TSRMLS_CC);
+ zval *param = zend_vm_stack_get_arg_ex(EX(prev_execute_data), arg_num TSRMLS_CC);
zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, param, opline->extended_value TSRMLS_CC);
zend_hash_next_index_insert(Z_ARRVAL_P(params), param);
if (Z_REFCOUNTED_P(param)) {
}
if (EXPECTED((value = zend_hash_find(&ce->constants_table, Z_STR_P(opline->op2.zv))) != NULL)) {
- if (Z_TYPE_FLAGS_P(value) & IS_TYPE_CONSTANT) {
+ if (Z_CONSTANT_P(value)) {
zend_class_entry *old_scope = EG(scope);
EG(scope) = ce;
name = GET_OP1_ZVAL_PTR(BP_VAR_R);
val = GET_OP2_ZVAL_PTR(BP_VAR_R);
- if (Z_TYPE_FLAGS_P(val) & IS_TYPE_CONSTANT) {
- ZVAL_COPY_VALUE(&c.value, val);
+ ZVAL_COPY_VALUE(&c.value, val);
+ if (Z_OPT_CONSTANT(c.value)) {
if (Z_TYPE_P(val) == IS_CONSTANT_ARRAY) {
zval_opt_copy_ctor(&c.value);
}
zval_update_constant(&c.value, NULL TSRMLS_CC);
} else {
- ZVAL_DUP(&c.value, val);
+ /* IS_CONST can't be IS_OBJECT, IS_RESOURCE or IS_REFERENCE */
+ if (UNEXPECTED(Z_OPT_COPYABLE(c.value))) {
+ _zval_copy_ctor_func(&c.value ZEND_FILE_LINE_CC);
+ }
}
c.flags = CONST_CS; /* non persistent, case sensetive */
c.name = STR_DUP(Z_STR_P(name), 0);
{
USE_OPLINE
zend_uint arg_num = opline->op1.num;
- zval *param = zend_vm_stack_get_arg(arg_num TSRMLS_CC);
+ zval *param = zend_vm_stack_get_arg_ex(EX(prev_execute_data), arg_num TSRMLS_CC);
SAVE_OPLINE();
if (UNEXPECTED(param == NULL)) {
{
USE_OPLINE
zend_uint arg_num = opline->op1.num;
- zend_uint arg_count = zend_vm_stack_get_args_count(TSRMLS_C);
+ zend_uint arg_count = zend_vm_stack_get_args_count_ex(EX(prev_execute_data) TSRMLS_CC);
zval *params;
SAVE_OPLINE();
}
for (; arg_num <= arg_count; ++arg_num) {
- zval *param = zend_vm_stack_get_arg(arg_num TSRMLS_CC);
+ zval *param = zend_vm_stack_get_arg_ex(EX(prev_execute_data), arg_num TSRMLS_CC);
zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, param, opline->extended_value TSRMLS_CC);
zend_hash_next_index_insert(Z_ARRVAL_P(params), param);
if (Z_REFCOUNTED_P(param)) {
{
USE_OPLINE
zend_uint arg_num = opline->op1.num;
- zval *param = zend_vm_stack_get_arg(arg_num TSRMLS_CC);
+ zval *param = zend_vm_stack_get_arg_ex(EX(prev_execute_data), arg_num TSRMLS_CC);
zval *var_ptr;
SAVE_OPLINE();
var_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->result.var TSRMLS_CC);
zval_ptr_dtor(var_ptr);
if (param == NULL) {
- if (Z_TYPE_FLAGS_P(opline->op2.zv) & IS_TYPE_CONSTANT) {
- zval tmp;
-
- ZVAL_COPY_VALUE(&tmp, opline->op2.zv);
- zval_update_constant(&tmp, 0 TSRMLS_CC);
- ZVAL_COPY_VALUE(var_ptr, &tmp);
+ ZVAL_COPY_VALUE(var_ptr, opline->op2.zv);
+ if (Z_OPT_CONSTANT_P(var_ptr)) {
+ zval_update_constant(var_ptr, 0 TSRMLS_CC);
} else {
- ZVAL_DUP(var_ptr, opline->op2.zv);
+ /* IS_CONST can't be IS_OBJECT, IS_RESOURCE or IS_REFERENCE */
+ if (UNEXPECTED(Z_OPT_COPYABLE_P(var_ptr))) {
+ _zval_copy_ctor_func(var_ptr ZEND_FILE_LINE_CC);
+ }
}
} else {
ZVAL_COPY(var_ptr, param);
}
if (EXPECTED((value = zend_hash_find(&ce->constants_table, Z_STR_P(opline->op2.zv))) != NULL)) {
- if (Z_TYPE_FLAGS_P(value) & IS_TYPE_CONSTANT) {
+ if (Z_CONSTANT_P(value)) {
zend_class_entry *old_scope = EG(scope);
EG(scope) = ce;
name = opline->op1.zv;
val = opline->op2.zv;
- if (Z_TYPE_FLAGS_P(val) & IS_TYPE_CONSTANT) {
- ZVAL_COPY_VALUE(&c.value, val);
+ ZVAL_COPY_VALUE(&c.value, val);
+ if (Z_OPT_CONSTANT(c.value)) {
if (Z_TYPE_P(val) == IS_CONSTANT_ARRAY) {
zval_opt_copy_ctor(&c.value);
}
zval_update_constant(&c.value, NULL TSRMLS_CC);
} else {
- ZVAL_DUP(&c.value, val);
+ /* IS_CONST can't be IS_OBJECT, IS_RESOURCE or IS_REFERENCE */
+ if (UNEXPECTED(Z_OPT_COPYABLE(c.value))) {
+ _zval_copy_ctor_func(&c.value ZEND_FILE_LINE_CC);
+ }
}
c.flags = CONST_CS; /* non persistent, case sensetive */
c.name = STR_DUP(Z_STR_P(name), 0);
}
if (EXPECTED((value = zend_hash_find(&ce->constants_table, Z_STR_P(opline->op2.zv))) != NULL)) {
- if (Z_TYPE_FLAGS_P(value) & IS_TYPE_CONSTANT) {
+ if (Z_CONSTANT_P(value)) {
zend_class_entry *old_scope = EG(scope);
EG(scope) = ce;
}
if (EXPECTED((value = zend_hash_find(&ce->constants_table, Z_STR_P(opline->op2.zv))) != NULL)) {
- if (Z_TYPE_FLAGS_P(value) & IS_TYPE_CONSTANT) {
+ if (Z_CONSTANT_P(value)) {
zend_class_entry *old_scope = EG(scope);
EG(scope) = ce;
ZVAL_COPY_VALUE(return_value, precv->op2.zv);
//??? INIT_PZVAL(return_value);
- if (!(Z_TYPE_FLAGS_P(return_value) & IS_TYPE_CONSTANT)) {
+ if (!Z_CONSTANT_P(return_value)) {
zval_copy_ctor(return_value);
}
zval_update_constant_ex(return_value, (void*)0, param->fptr->common.scope TSRMLS_CC);
/* this is necessary to make it able to work with default array
* properties, returned to user */
- if (Z_TYPE_FLAGS(prop_copy) & IS_TYPE_CONSTANT) {
+ if (Z_CONSTANT(prop_copy)) {
zval_update_constant(&prop_copy, (void *) 1 TSRMLS_CC);
}