summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReeze Xia <reeze@php.net>2015-02-05 11:22:11 +0800
committerReeze Xia <reeze@php.net>2015-02-05 11:22:11 +0800
commit601fcc31af502fcf7aa36b8de53dfd4004fda613 (patch)
tree6468e6c91dcfcca8c039f60697e2d922031db066
parent2c84006f5ac11cb9b2409401cb381abb4d7a19e5 (diff)
downloadphp-git-601fcc31af502fcf7aa36b8de53dfd4004fda613.tar.gz
Add load time return type checking to match user land logic
-rw-r--r--Zend/zend_API.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index 66381f3c22..80ff470740 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -2002,8 +2002,11 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio
internal_function->num_args--;
}
if (info->type_hint) {
- if (info->type_hint == IS_OBJECT) {
- ZEND_ASSERT(info->class_name);
+ if (info->class_name) {
+ ZEND_ASSERT(info->type_hint == IS_OBJECT);
+ if (!strcasecmp(info->class_name, "self") && !scope) {
+ zend_error(E_CORE_ERROR, "Cannot declare a return type of self outside of a class scope");
+ }
}
internal_function->fn_flags |= ZEND_ACC_HAS_RETURN_TYPE;
@@ -2206,6 +2209,18 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio
zend_error(error_type, "Method %s::%s() cannot be static", scope->name->val, __debugInfo->common.function_name->val);
}
}
+
+ if (ctor && ctor->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE && ctor->common.fn_flags & ZEND_ACC_CTOR) {
+ zend_error(E_CORE_ERROR, "Constructor %s::%s() cannot declare a return type", scope->name->val, ctor->common.function_name->val);
+ }
+
+ if (dtor && dtor->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE && dtor->common.fn_flags & ZEND_ACC_DTOR) {
+ zend_error(E_CORE_ERROR, "Destructor %s::%s() cannot declare a return type", scope->name->val, dtor->common.function_name->val);
+ }
+
+ if (clone && clone->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE && dtor->common.fn_flags & ZEND_ACC_DTOR) {
+ zend_error(E_CORE_ERROR, "%s::%s() cannot declare a return type", scope->name->val, clone->common.function_name->val);
+ }
efree((char*)lc_class_name);
}
return SUCCESS;