summaryrefslogtreecommitdiff
path: root/Zend/zend_compile.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_compile.c')
-rw-r--r--Zend/zend_compile.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index c609fa28a1..1f89b7e0af 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -2214,9 +2214,7 @@ void zend_do_begin_class_declaration(znode *class_token, znode *class_name, znod
new_class_entry->num_interfaces = 0;
zend_initialize_class_data(new_class_entry, 1 TSRMLS_CC);
- if (class_token->u.constant.value.lval == T_INTERFACE) {
- new_class_entry->ce_flags |= ZEND_ACC_INTERFACE;
- }
+ new_class_entry->ce_flags |= class_token->u.constant.value.lval;
if (parent_class_name->op_type != IS_UNUSED) {
doing_inheritance = 1;
@@ -2250,12 +2248,27 @@ void zend_do_begin_class_declaration(znode *class_token, znode *class_name, znod
}
-void zend_do_end_class_declaration(znode *class_token TSRMLS_DC)
+static do_verify_abstract_class(TSRMLS_D)
+{
+ zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
+
+ opline->opcode = ZEND_VERIFY_ABSTRACT_CLASS;
+ opline->op1 = CG(implementing_class);
+}
+
+
+void zend_do_end_class_declaration(znode *class_token, znode *parent_token TSRMLS_DC)
{
do_inherit_parent_constructor(CG(active_class_entry));
+
if (CG(active_class_entry)->num_interfaces > 0) {
CG(active_class_entry)->interfaces = (zend_class_entry **) emalloc(sizeof(zend_class_entry *)*CG(active_class_entry)->num_interfaces);
}
+ if (!(CG(active_class_entry)->ce_flags & ZEND_ACC_INTERFACE)
+ && !(CG(active_class_entry)->ce_flags & ZEND_ACC_ABSTRACT_CLASS)
+ && ((parent_token->op_type != IS_UNUSED) || (CG(active_class_entry)->num_interfaces > 0))) {
+ do_verify_abstract_class(TSRMLS_C);
+ }
CG(active_class_entry) = NULL;
}