summaryrefslogtreecommitdiff
path: root/Zend/zend_vm_execute.h
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_vm_execute.h')
-rw-r--r--Zend/zend_vm_execute.h108
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;