]> granicus.if.org Git - php/commitdiff
Refactor zend_mark_function_as_generator
authorLevi Morrison <levim@php.net>
Mon, 19 Oct 2015 07:25:16 +0000 (01:25 -0600)
committerXinchen Hui <laruence@gmail.com>
Mon, 19 Oct 2015 13:57:21 +0000 (06:57 -0700)
Zend/zend_compile.c

index 26655ad795428fdc7d94ed55994130bf039a02ba..f77d8b6ae7b6f4cf1b06272be293a862caf06f24 100644 (file)
@@ -1136,19 +1136,19 @@ static void zend_mark_function_as_generator() /* {{{ */
                zend_error_noreturn(E_COMPILE_ERROR,
                        "The \"yield\" expression can only be used inside a function");
        }
+
        if (CG(active_op_array)->fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
                const char *msg = "Generators may only declare a return type of Generator, Iterator or Traversable, %s is not permitted";
-               if (!CG(active_op_array)->arg_info[-1].class_name) {
-                       zend_error_noreturn(E_COMPILE_ERROR, msg,
-                               zend_get_type_by_const(CG(active_op_array)->arg_info[-1].type_hint));
-               }
-               if (!(ZSTR_LEN(CG(active_op_array)->arg_info[-1].class_name) == sizeof("Traversable")-1
-                               && zend_binary_strcasecmp(ZSTR_VAL(CG(active_op_array)->arg_info[-1].class_name), sizeof("Traversable")-1, "Traversable", sizeof("Traversable")-1) == 0) &&
-                       !(ZSTR_LEN(CG(active_op_array)->arg_info[-1].class_name) == sizeof("Iterator")-1
-                               && zend_binary_strcasecmp(ZSTR_VAL(CG(active_op_array)->arg_info[-1].class_name), sizeof("Iterator")-1, "Iterator", sizeof("Iterator")-1) == 0) &&
-                       !(ZSTR_LEN(CG(active_op_array)->arg_info[-1].class_name) == sizeof("Generator")-1
-                               && zend_binary_strcasecmp(ZSTR_VAL(CG(active_op_array)->arg_info[-1].class_name), sizeof("Generator")-1, "Generator", sizeof("Generator")-1) == 0)) {
-                       zend_error_noreturn(E_COMPILE_ERROR, msg, ZSTR_VAL(CG(active_op_array)->arg_info[-1].class_name));
+               zend_arg_info return_info = CG(active_op_array)->arg_info[-1];
+
+               if (!return_info.class_name) {
+                       zend_error_noreturn(E_COMPILE_ERROR, msg, zend_get_type_by_const(return_info.type_hint));
+               }
+
+               if (!zend_string_equals_literal_ci(return_info.class_name, "Traversable")
+                       && !zend_string_equals_literal_ci(return_info.class_name, "Iterator")
+                       && !zend_string_equals_literal_ci(return_info.class_name, "Generator")) {
+                       zend_error_noreturn(E_COMPILE_ERROR, msg, ZSTR_VAL(return_info.class_name));
                }
        }