Skip to content

Commit 018be97

Browse files
committed
Fixed support for undefined constants in RECV_INIT
1 parent 712dd6c commit 018be97

File tree

3 files changed

+39
-4
lines changed

3 files changed

+39
-4
lines changed

Zend/zend_execute_API.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -531,17 +531,16 @@ ZEND_API int zval_update_constant_ex(zval *p, void *arg, zend_class_entry *scope
531531
zend_error(E_ERROR, "Undefined constant '%s'", save->val);
532532
}
533533
if (inline_change) {
534-
//??? STR_RELEASE(save);
534+
STR_RELEASE(save);
535535
}
536536
save = NULL;
537537
}
538-
if (inline_change && save && save->val != actual) {
539-
//??? STR_RELEASE(save);
540-
}
541538
zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", actual, actual);
542539
p->type = IS_STRING;
543540
if (!inline_change) {
544541
ZVAL_STRINGL(p, actual, actual_len);
542+
} else if (save) {
543+
STR_RELEASE(save);
545544
}
546545
}
547546
} else {

Zend/zend_vm_def.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3376,12 +3376,30 @@ ZEND_VM_HANDLER(64, ZEND_RECV_INIT, ANY, CONST)
33763376
var_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->result.var TSRMLS_CC);
33773377
zval_ptr_dtor(var_ptr);
33783378
if (param == NULL) {
3379+
//???
3380+
#if 1
3381+
if (IS_CONSTANT_TYPE(Z_TYPE_P(opline->op2.zv))) {
3382+
zval tmp;
3383+
3384+
ZVAL_COPY_VALUE(&tmp, opline->op2.zv);
3385+
zval_update_constant(&tmp, 0 TSRMLS_CC);
3386+
//???: var_ptr may become INDIRECT
3387+
if (Z_TYPE_P(var_ptr) == IS_INDIRECT) {
3388+
var_ptr = Z_INDIRECT_P(var_ptr);
3389+
}
3390+
ZVAL_COPY_VALUE(var_ptr, &tmp);
3391+
} else {
3392+
ZVAL_COPY_VALUE(var_ptr, opline->op2.zv);
3393+
zval_copy_ctor(var_ptr);
3394+
}
3395+
#else
33793396
ZVAL_COPY_VALUE(var_ptr, opline->op2.zv);
33803397
if (IS_CONSTANT_TYPE(Z_TYPE_P(var_ptr))) {
33813398
zval_update_constant(var_ptr, 0 TSRMLS_CC);
33823399
} else {
33833400
zval_copy_ctor(var_ptr);
33843401
}
3402+
#endif
33853403
} else {
33863404
ZVAL_COPY(var_ptr, param);
33873405
}

Zend/zend_vm_execute.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1603,12 +1603,30 @@ static int ZEND_FASTCALL ZEND_RECV_INIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_
16031603
var_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->result.var TSRMLS_CC);
16041604
zval_ptr_dtor(var_ptr);
16051605
if (param == NULL) {
1606+
//???
1607+
#if 1
1608+
if (IS_CONSTANT_TYPE(Z_TYPE_P(opline->op2.zv))) {
1609+
zval tmp;
1610+
1611+
ZVAL_COPY_VALUE(&tmp, opline->op2.zv);
1612+
zval_update_constant(&tmp, 0 TSRMLS_CC);
1613+
//???: var_ptr may become INDIRECT
1614+
if (Z_TYPE_P(var_ptr) == IS_INDIRECT) {
1615+
var_ptr = Z_INDIRECT_P(var_ptr);
1616+
}
1617+
ZVAL_COPY_VALUE(var_ptr, &tmp);
1618+
} else {
1619+
ZVAL_COPY_VALUE(var_ptr, opline->op2.zv);
1620+
zval_copy_ctor(var_ptr);
1621+
}
1622+
#else
16061623
ZVAL_COPY_VALUE(var_ptr, opline->op2.zv);
16071624
if (IS_CONSTANT_TYPE(Z_TYPE_P(var_ptr))) {
16081625
zval_update_constant(var_ptr, 0 TSRMLS_CC);
16091626
} else {
16101627
zval_copy_ctor(var_ptr);
16111628
}
1629+
#endif
16121630
} else {
16131631
ZVAL_COPY(var_ptr, param);
16141632
}

0 commit comments

Comments
 (0)