From 9e70d7672dd646b8c9b29ccc452e4dc5aa015437 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 4 Feb 2015 15:24:13 +0300 Subject: Move zend_object->guards into additional slot of zend_object->properties_table[]. As result size of objects without __get/__set/__unset/__isset magic methods is reduced. --- Zend/zend_API.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'Zend/zend_API.c') diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 440e96d311..7abbf31cb2 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2086,12 +2086,16 @@ ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_functio __tostring = reg_function; } else if (zend_string_equals_literal(lowercase_name, ZEND_GET_FUNC_NAME)) { __get = reg_function; + scope->ce_flags |= ZEND_ACC_USE_GUARDS; } else if (zend_string_equals_literal(lowercase_name, ZEND_SET_FUNC_NAME)) { __set = reg_function; + scope->ce_flags |= ZEND_ACC_USE_GUARDS; } else if (zend_string_equals_literal(lowercase_name, ZEND_UNSET_FUNC_NAME)) { __unset = reg_function; + scope->ce_flags |= ZEND_ACC_USE_GUARDS; } else if (zend_string_equals_literal(lowercase_name, ZEND_ISSET_FUNC_NAME)) { __isset = reg_function; + scope->ce_flags |= ZEND_ACC_USE_GUARDS; } else if (zend_string_equals_literal(lowercase_name, ZEND_DEBUGINFO_FUNC_NAME)) { __debugInfo = reg_function; } else { -- cgit v1.2.1 From bff4c47fa7f2b356bddd0a87f07ed32d61ec56fe Mon Sep 17 00:00:00 2001 From: Reeze Xia Date: Thu, 5 Feb 2015 01:04:54 +0800 Subject: Implemented internal function return types --- Zend/zend_API.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'Zend/zend_API.c') diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 440e96d311..66381f3c22 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2002,6 +2002,10 @@ 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); + } + internal_function->fn_flags |= ZEND_ACC_HAS_RETURN_TYPE; } } else { -- cgit v1.2.1 From 601fcc31af502fcf7aa36b8de53dfd4004fda613 Mon Sep 17 00:00:00 2001 From: Reeze Xia Date: Thu, 5 Feb 2015 11:22:11 +0800 Subject: Add load time return type checking to match user land logic --- Zend/zend_API.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'Zend/zend_API.c') 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; -- cgit v1.2.1