diff options
Diffstat (limited to 'Zend/zend_execute.c')
-rw-r--r-- | Zend/zend_execute.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 77f39bd0aa..cb6b569fce 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2043,12 +2043,25 @@ send_by_ref: } NEXT_OPCODE(); case ZEND_FETCH_CONSTANT: - if (!zend_get_constant(EX(opline)->op1.u.constant.value.str.val, EX(opline)->op1.u.constant.value.str.len, &EX(Ts)[EX(opline)->result.u.var].tmp_var TSRMLS_CC)) { - zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", - EX(opline)->op1.u.constant.value.str.val, - EX(opline)->op1.u.constant.value.str.val); - EX(Ts)[EX(opline)->result.u.var].tmp_var = EX(opline)->op1.u.constant; - zval_copy_ctor(&EX(Ts)[EX(opline)->result.u.var].tmp_var); + if (EX(opline)->op1.op_type == IS_UNUSED) { + if (!zend_get_constant(EX(opline)->op2.u.constant.value.str.val, EX(opline)->op2.u.constant.value.str.len, &EX(Ts)[EX(opline)->result.u.var].tmp_var TSRMLS_CC)) { + zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", + EX(opline)->op2.u.constant.value.str.val, + EX(opline)->op2.u.constant.value.str.val); + EX(Ts)[EX(opline)->result.u.var].tmp_var = EX(opline)->op2.u.constant; + zval_copy_ctor(&EX(Ts)[EX(opline)->result.u.var].tmp_var); + } + } else { + zend_class_entry *ce = EX(Ts)[EX(opline)->op1.u.var].EA.class_entry; + zval **value; + + if (zend_hash_find(&ce->constants, EX(opline)->op2.u.constant.value.str.val, EX(opline)->op2.u.constant.value.str.len+1, (void **) &value) == SUCCESS) { + zval_update_constant(value, (void *) 1 TSRMLS_CC); + EX(Ts)[EX(opline)->result.u.var].tmp_var = **value; + zval_copy_ctor(&EX(Ts)[EX(opline)->result.u.var].tmp_var); + } else { + zend_error(E_ERROR, "Undefined constant. Improve this error message"); + } } NEXT_OPCODE(); case ZEND_INIT_ARRAY: |