return 1; /* method doesn't exist in child, copy from parent */
}
+ if (parent->common.fn_flags & ZEND_ACC_ABSTRACT
+ && child->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_IMPLEMENTED_ABSTRACT)) {
+ zend_error(E_COMPILE_ERROR, "Can't inherit abstract function %s::%s() (previously declared abstract in %s)",
+ parent->common.scope->name,
+ child->common.function_name,
+ child->common.prototype->common.scope->name);
+ }
+
if (parent_flags & ZEND_ACC_FINAL) {
zend_error(E_COMPILE_ERROR, "Cannot override final method %s::%s()", ZEND_FN_SCOPE_NAME(parent), child->common.function_name);
}
}
}
- if (parent_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_ABSTRACT)) {
+ if (parent_flags & ZEND_ACC_ABSTRACT) {
child->common.prototype = parent;
+ child->common.fn_flags |= ZEND_ACC_IMPLEMENTED_ABSTRACT;
} else if (parent->common.prototype) {
child->common.prototype = parent->common.prototype;
}
}
+#if 0
+/* This is a part of an incomplete patch, coming soon */
+ZEND_API void zend_do_extends(znode *result, znode *class_token, zend_bool is_first_parent TSRMLS_DC)
+{
+ zend_bool is_class = CG(active_class_entry)->ce_flags & ZEND_ACC_INTERFACE;
+
+ if (is_class) {
+ if (!is_first_parent) {
+ zend_error(E_COMPILE_ERROR, "Classes may extend only one parent");
+ } else {
+ *result = *class_token;
+ }
+ } else { /* interface */
+ }
+}
+#endif
+
void zend_do_implements_interface(znode *interface_znode TSRMLS_DC)
{
zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);