summaryrefslogtreecommitdiff
path: root/Zend/zend_execute.c
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>2003-03-06 22:53:23 +0000
committerZeev Suraski <zeev@php.net>2003-03-06 22:53:23 +0000
commit0338111950edcec427cfa2f1610dd6efcd43a14c (patch)
treefcbc0fbbfed58389d438a29a51a16ecf22a90780 /Zend/zend_execute.c
parentaf4aa97d1ec853836f70601cb9666794476cd140 (diff)
downloadphp-git-0338111950edcec427cfa2f1610dd6efcd43a14c.tar.gz
Require abstract classes to be explicitly declared 'abstract', in order to
avoid making developers traverse the entire class/interface hierarchy before they can figure out whether a class is instantiable (ok, so it makes sense :)
Diffstat (limited to 'Zend/zend_execute.c')
-rw-r--r--Zend/zend_execute.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 46897d0967..f0a015293b 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -3125,7 +3125,7 @@ int zend_switch_free_handler(ZEND_OPCODE_HANDLER_ARGS)
int zend_new_handler(ZEND_OPCODE_HANDLER_ARGS)
{
- if (EX_T(EX(opline)->op1.u.var).EA.class_entry->ce_flags & ZEND_ACC_ABSTRACT) {
+ if (EX_T(EX(opline)->op1.u.var).EA.class_entry->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_ABSTRACT_CLASS)) {
char *class_type;
if (EX_T(EX(opline)->op1.u.var).EA.class_entry->ce_flags & ZEND_ACC_INTERFACE) {
@@ -4016,6 +4016,21 @@ int zend_verify_instanceof_handler(ZEND_OPCODE_HANDLER_ARGS)
}
+int zend_verify_abstract_class(ZEND_OPCODE_HANDLER_ARGS)
+{
+ zend_class_entry *ce = EX_T(EX(opline)->op1.u.var).EA.class_entry;
+ zend_bool declared_abstract = ce->ce_flags & ZEND_ACC_ABSTRACT_CLASS;
+ zend_bool detected_abstract = ce->ce_flags & ZEND_ACC_ABSTRACT;
+
+ if ((ce->ce_flags & ZEND_ACC_ABSTRACT)
+ && !(ce->ce_flags & ZEND_ACC_ABSTRACT_CLASS)) {
+ zend_error(E_ERROR, "Class %s contains abstract methods and must be declared abstract", ce->name);
+ }
+
+ NEXT_OPCODE();
+}
+
+
void zend_init_opcodes_handlers()
{
zend_opcode_handlers[ZEND_NOP] = zend_nop_handler;
@@ -4194,6 +4209,7 @@ void zend_init_opcodes_handlers()
zend_opcode_handlers[ZEND_ADD_INTERFACE] = zend_add_interface_handler;
zend_opcode_handlers[ZEND_VERIFY_INSTANCEOF] = zend_verify_instanceof_handler;
+ zend_opcode_handlers[ZEND_VERIFY_ABSTRACT_CLASS] = zend_verify_abstract_class;
}
/*