;
object_property:
- object_dim_list { znode tmp_znode; do_pop_object(&tmp_znode CLS_CC); do_fetch_property(&$$, &tmp_znode, &$1 CLS_CC);}
+ object_dim_list { $$ = $1; }
| cvar_without_objects { do_end_variable_parse(BP_VAR_R, 0 CLS_CC); } { znode tmp_znode; do_pop_object(&tmp_znode CLS_CC); do_fetch_property(&$$, &tmp_znode, &$1 CLS_CC);}
;
object_dim_list:
object_dim_list '[' dim_offset ']' { fetch_array_dim(&$$, &$1, &$3 CLS_CC); }
| object_dim_list '{' expr '}' { fetch_string_offset(&$$, &$1, &$3 CLS_CC); }
- | variable_name
+ | variable_name { znode tmp_znode; do_pop_object(&tmp_znode CLS_CC); do_fetch_property(&$$, &tmp_znode, &$1 CLS_CC);}
;
variable_name:
#define PZVAL_LOCK(z) ((z)->refcount++)
#define PZVAL_UNLOCK(z) { ((z)->refcount--); \
- if (!(z)->refcount && !EG(suspend_garbage)) { \
+ if (!(z)->refcount) { \
+ (z)->refcount = 1; \
+ (z)->is_ref = 0; \
EG(garbage)[EG(garbage_ptr)++] = (z); \
if (EG(garbage_ptr) == 4) { \
- zval_dtor(EG(garbage)[0]); \
- FREE_ZVAL(EG(garbage)[0]); \
- zval_dtor(EG(garbage)[1]); \
- FREE_ZVAL(EG(garbage)[1]); \
+ if (EG(garbage)[0]->refcount==1) { \
+ zval_ptr_dtor(&EG(garbage)[0]); \
+ } \
+ if (EG(garbage)[1]->refcount==1) { \
+ zval_ptr_dtor(&EG(garbage)[1]); \
+ } \
EG(garbage)[0] = EG(garbage)[2]; \
EG(garbage)[1] = EG(garbage)[3]; \
EG(garbage_ptr) -= 2; \
} \
}
-#define SUSPEND_GARBAGE() (EG(suspend_garbage)=1)
-#define RESUME_GARBAGE() (EG(suspend_garbage)=0)
-
#define SELECTIVE_PZVAL_LOCK(pzv, pzn) if (!((pzn)->u.EA.type & EXT_TYPE_UNUSED)) { PZVAL_LOCK(pzv); }
NEXT_OPCODE();
case ZEND_ASSIGN: {
zval *value;
- SUSPEND_GARBAGE();
value = get_zval_ptr(&opline->op2, Ts, &EG(free_op2), BP_VAR_R);
- RESUME_GARBAGE();
zend_assign_to_variable(&opline->result, &opline->op1, &opline->op2, value, (EG(free_op2)?IS_TMP_VAR:opline->op2.op_type), Ts ELS_CC);
/* zend_assign_to_variable() always takes care of op2, never free it! */
}
NEXT_OPCODE();
case ZEND_ASSIGN_REF:
- SUSPEND_GARBAGE();
zend_assign_to_variable_reference(&opline->result, get_zval_ptr_ptr(&opline->op1, Ts, BP_VAR_W), get_zval_ptr_ptr(&opline->op2, Ts, BP_VAR_W), Ts ELS_CC);
- RESUME_GARBAGE();
NEXT_OPCODE();
case ZEND_JMP:
#if DEBUG_ZEND>=2
zval *retval_ptr;
zval **retval_ptr_ptr;
- SUSPEND_GARBAGE();
if ((EG(active_op_array)->return_reference == ZEND_RETURN_REF) &&
(opline->op1.op_type != IS_CONST) &&
(opline->op1.op_type != IS_TMP_VAR)) {
(*EG(return_value_ptr_ptr))->is_ref = 0;
}
}
- RESUME_GARBAGE();
#if SUPPORT_INTERACTIVE
op_array->last_executed_op_number = opline-op_array->opcodes;
#endif
}
{
zval *varptr;
- SUSPEND_GARBAGE();
varptr = get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R);
- RESUME_GARBAGE();
if (varptr == &EG(uninitialized_zval)) {
ALLOC_ZVAL(varptr);
case ZEND_SEND_REF: {
zval **varptr_ptr;
zval *varptr;
- SUSPEND_GARBAGE();
varptr_ptr = get_zval_ptr_ptr(&opline->op1, Ts, BP_VAR_W);
- RESUME_GARBAGE();
varptr = *varptr_ptr;
zval *expr_ptr, **expr_ptr_ptr = NULL;
zval *offset=get_zval_ptr(&opline->op2, Ts, &EG(free_op2), BP_VAR_R);
- SUSPEND_GARBAGE();
if (opline->extended_value) {
expr_ptr_ptr=get_zval_ptr_ptr(&opline->op1, Ts, BP_VAR_R);
expr_ptr = *expr_ptr_ptr;
} else {
expr_ptr=get_zval_ptr(&opline->op1, Ts, &EG(free_op1), BP_VAR_R);
}
- RESUME_GARBAGE();
if (opline->opcode==ZEND_INIT_ARRAY) {
array_init(array_ptr);
signal(SIGSEGV, original_sigsegv_handler);
#endif
while (EG(garbage_ptr)--) {
- zval_dtor(EG(garbage)[EG(garbage_ptr)]);
- FREE_ZVAL(EG(garbage)[EG(garbage_ptr)]);
+ if (EG(garbage)[EG(garbage_ptr)]->refcount==1) {
+ zval_ptr_dtor(&EG(garbage)[EG(garbage_ptr)]);
+ }
}
zend_hash_destroy(&EG(imported_files));