diff options
Diffstat (limited to 'Zend/zend_vm_execute.h')
-rw-r--r-- | Zend/zend_vm_execute.h | 108 |
1 files changed, 92 insertions, 16 deletions
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 6a0c4bb49b..18f4e8584a 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1305,14 +1305,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_CLASS_SPEC_HANDLER(ZEN SAVE_OPLINE(); Z_CE_P(EX_VAR(opline->result.var)) = do_bind_class(&EX(func)->op_array, opline, EG(class_table), 0); - if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_CLASS) { - if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_BOUND) { - while (opline->opcode != ZEND_NEW) { - opline++; - } - ZEND_VM_JMP(opline); - } else Z_CE_P(EX_VAR(opline->result.var))->ce_flags |= ZEND_ACC_ANON_BOUND; - } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -1323,14 +1315,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_INHERITED_CLASS_SPEC_H SAVE_OPLINE(); Z_CE_P(EX_VAR(opline->result.var)) = do_bind_inherited_class(&EX(func)->op_array, opline, EG(class_table), Z_CE_P(EX_VAR(opline->extended_value)), 0); - if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_CLASS) { - if (Z_CE_P(EX_VAR(opline->result.var))->ce_flags & ZEND_ACC_ANON_BOUND) { - while (opline->opcode != ZEND_NEW) { - opline++; - } - ZEND_VM_JMP(opline); - } else Z_CE_P(EX_VAR(opline->result.var))->ce_flags |= ZEND_ACC_ANON_BOUND; - } CHECK_EXCEPTION(); ZEND_VM_NEXT_OPCODE(); } @@ -1350,6 +1334,48 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_INHERITED_CLASS_DELAYE ZEND_VM_NEXT_OPCODE(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + zend_class_entry *ce; + USE_OPLINE + + SAVE_OPLINE(); + ce = zend_hash_find_ptr(EG(class_table), Z_STR_P(EX_CONSTANT(opline->op2))); + Z_CE_P(EX_VAR(opline->result.var)) = ce; + ZEND_ASSERT(ce != NULL); + + if (ce->ce_flags & ZEND_ACC_ANON_BOUND) { + ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op1)); + } + + if (!(ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_IMPLEMENT_INTERFACES|ZEND_ACC_IMPLEMENT_TRAITS))) { + zend_verify_abstract_class(ce); + } + ce->ce_flags |= ZEND_ACC_ANON_BOUND; + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + zend_class_entry *ce; + USE_OPLINE + + SAVE_OPLINE(); + ce = zend_hash_find_ptr(EG(class_table), Z_STR_P(EX_CONSTANT(opline->op2))); + Z_CE_P(EX_VAR(opline->result.var)) = ce; + ZEND_ASSERT(ce != NULL); + + if (ce->ce_flags & ZEND_ACC_ANON_BOUND) { + ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op1)); + } + + zend_do_inheritance(ce, Z_CE_P(EX_VAR(opline->extended_value))); + ce->ce_flags |= ZEND_ACC_ANON_BOUND; + CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_FUNCTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -48776,6 +48802,56 @@ void zend_init_opcodes_handlers(void) ZEND_SPACESHIP_SPEC_CV_TMPVAR_HANDLER, ZEND_NULL_HANDLER, ZEND_SPACESHIP_SPEC_CV_CV_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, + ZEND_DECLARE_ANON_INHERITED_CLASS_SPEC_HANDLER, ZEND_NULL_HANDLER }; zend_opcode_handlers = labels; |