]> granicus.if.org Git - php/commitdiff
Callable typehint following the rules of is_callable($arg, false);
authorHannes Magnusson <bjori@php.net>
Tue, 16 Aug 2011 10:44:47 +0000 (10:44 +0000)
committerHannes Magnusson <bjori@php.net>
Tue, 16 Aug 2011 10:44:47 +0000 (10:44 +0000)
14 files changed:
NEWS
UPGRADING
Zend/tests/callable_type_hint_001.phpt [new file with mode: 0644]
Zend/tests/callable_type_hint_002.phpt [new file with mode: 0644]
Zend/tests/callable_type_hint_003.phpt [new file with mode: 0644]
Zend/zend.h
Zend/zend_API.c
Zend/zend_compile.c
Zend/zend_execute.c
Zend/zend_language_parser.y
Zend/zend_language_scanner.c
Zend/zend_language_scanner.l
ext/reflection/php_reflection.c
ext/tokenizer/tokenizer_data.c

diff --git a/NEWS b/NEWS
index 54562765dfc604dceecf1bd79e2db3e2d74581dd..32e17a569f1f7520646baaea9d9f5f77011ab52f 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,7 @@ PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? 2011, PHP 5.4.0 Beta
 - General improvements:
+  . Added callable typehint. (Hannes)
   . Turn on html_errors by default again in php.ini-production like it was in
     PHP 5.3, but only generate docref links when the docref_root INI setting is
     not empty.
index 056f2a3fb81459d3f51a8e4902713588ba182509..abb45b4737a6f9e6dbf10d1e19c7c90b7c3037e8 100755 (executable)
--- a/UPGRADING
+++ b/UPGRADING
@@ -362,6 +362,15 @@ UPGRADE NOTES - PHP X.Y
     foo()[0]
     $foo->bar()[0]
 
+- Callable typehint, argument must be callable (i.e. pass is_callable($arg, false))
+  example:
+  function foo(callable $do) {
+  }
+  foo("strcmp");
+  foo(function() {});
+  $o = new ArrayObject();
+  foo(array($o, "count"));
+
 ===================
 13. Windows support
 ===================
@@ -459,6 +468,7 @@ UPGRADE NOTES - PHP X.Y
          - ReflectionClass::getTraitNames()
          - ReflectionClass::getTraitAliases()
          - ReflectionParameter::canBePassedByValue()
+         - ReflectionParameter::isCallable()
        
        - RegexIterator
          - RegexIterator::getRegex()
diff --git a/Zend/tests/callable_type_hint_001.phpt b/Zend/tests/callable_type_hint_001.phpt
new file mode 100644 (file)
index 0000000..36643fa
--- /dev/null
@@ -0,0 +1,39 @@
+--TEST--
+callable type hint#001
+--FILE--
+<?php
+
+class bar {
+    function baz() {}
+    static function foo() {}
+}
+function foo(callable $bar) {
+    var_dump($bar);
+}
+$closure = function () {};
+
+foo("strpos");
+foo("foo");
+foo(array("bar", "baz"));
+foo(array("bar", "foo"));
+foo($closure);
+--EXPECTF--
+string(6) "strpos"
+string(3) "foo"
+
+Strict Standards: Non-static method bar::baz() should not be called statically in %scallable_type_hint_001.php on line %d
+array(2) {
+  [0]=>
+  string(3) "bar"
+  [1]=>
+  string(3) "baz"
+}
+array(2) {
+  [0]=>
+  string(3) "bar"
+  [1]=>
+  string(3) "foo"
+}
+object(Closure)#%d (0) {
+}
+
diff --git a/Zend/tests/callable_type_hint_002.phpt b/Zend/tests/callable_type_hint_002.phpt
new file mode 100644 (file)
index 0000000..b1b7339
--- /dev/null
@@ -0,0 +1,27 @@
+--TEST--
+callable type hint#002 - Reflection
+--FILE--
+<?php
+
+class bar {
+    static function foo(callable $arg) {}
+}
+function foo(callable $bar) {
+}
+$closure = function (callable $arg) {};
+
+$rf = new ReflectionFunction("foo");
+var_dump($rf->getParameters()[0]->isCallable());
+
+$rm = new ReflectionMethod("bar", "foo");
+var_dump($rm->getParameters()[0]->isCallable());
+
+$rc = new ReflectionFunction($closure);
+var_dump($rc->getParameters()[0]->isCallable());
+
+?>
+--EXPECT--
+bool(true)
+bool(true)
+bool(true)
+
diff --git a/Zend/tests/callable_type_hint_003.phpt b/Zend/tests/callable_type_hint_003.phpt
new file mode 100644 (file)
index 0000000..83f5090
--- /dev/null
@@ -0,0 +1,21 @@
+--TEST--
+callable type hint#003
+--FILE--
+<?php
+
+function foo(callable $a, $b, callable $c) {
+       var_dump($a, $b, $c);
+}
+function bar(callable $a = null) {
+       var_dump($a);
+}
+
+foo("strpos", 123, "strpos");
+bar("substr");
+?>
+--EXPECT--
+string(6) "strpos"
+int(123)
+string(6) "strpos"
+string(6) "substr"
+
index 8caa382326e9a64150ac4c93d1ce5a8dbf8d6be0..4e1290a5c0c866dfa45385b4307e652f70b4588d 100644 (file)
@@ -575,6 +575,7 @@ typedef int (*zend_write_func_t)(const char *str, uint str_length);
 #define IS_RESOURCE    7
 #define IS_CONSTANT    8
 #define IS_CONSTANT_ARRAY      9
+#define IS_CALLABLE    10
 
 /* Ugly hack to support constants as static array indices */
 #define IS_CONSTANT_TYPE_MASK          0x00f
index 96e5b13a6bc44c0e74fc1adc8270e03d25c095bf..5401483db758433e2730f3aefcbb4e77ef3fd8ed 100644 (file)
@@ -217,6 +217,8 @@ ZEND_API char *zend_get_type_by_const(int type) /* {{{ */
                        return "resource";
                case IS_NULL:
                        return "null";
+               case IS_CALLABLE:
+                       return "callable";
                case IS_ARRAY:
                        return "array";
                default:
index cd883cbe6ff15035ea11bbaadc50887f5909eb21..774c1e85eb01631418058d2266ecf1e86e09b31d 100644 (file)
@@ -1890,27 +1890,38 @@ void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, con
                cur_arg_info->allow_null = 0;
 
                if (class_type->u.constant.type != IS_NULL) {
-                       cur_arg_info->type_hint = IS_OBJECT;
-                       if (ZEND_FETCH_CLASS_DEFAULT == zend_get_class_fetch_type(Z_STRVAL(class_type->u.constant), Z_STRLEN(class_type->u.constant))) {
-                               zend_resolve_class_name(class_type, opline->extended_value, 1 TSRMLS_CC);
-                       }
-                       class_type->u.constant.value.str.val = zend_new_interned_string(class_type->u.constant.value.str.val, class_type->u.constant.value.str.len + 1, 1 TSRMLS_CC);
-                       cur_arg_info->class_name = class_type->u.constant.value.str.val;
-                       cur_arg_info->class_name_len = class_type->u.constant.value.str.len;
-                       if (op == ZEND_RECV_INIT) {
-                               if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL"))) {
-                                       cur_arg_info->allow_null = 1;
-                               } else {
-                                       zend_error(E_COMPILE_ERROR, "Default value for parameters with a class type hint can only be NULL");
+                       if (class_type->u.constant.type == IS_ARRAY) {
+                               cur_arg_info->type_hint = IS_ARRAY;
+                               if (op == ZEND_RECV_INIT) {
+                                       if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL"))) {
+                                               cur_arg_info->allow_null = 1;
+                                       } else if (Z_TYPE(initialization->u.constant) != IS_ARRAY && Z_TYPE(initialization->u.constant) != IS_CONSTANT_ARRAY) {
+                                               zend_error(E_COMPILE_ERROR, "Default value for parameters with array type hint can only be an array or NULL");
+                                       }
                                }
-                       }
-               } else {
-                       cur_arg_info->type_hint = IS_ARRAY;
-                       if (op == ZEND_RECV_INIT) {
-                               if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL"))) {
-                                       cur_arg_info->allow_null = 1;
-                               } else if (Z_TYPE(initialization->u.constant) != IS_ARRAY && Z_TYPE(initialization->u.constant) != IS_CONSTANT_ARRAY) {
-                                       zend_error(E_COMPILE_ERROR, "Default value for parameters with array type hint can only be an array or NULL");
+                       } else if (class_type->u.constant.type == IS_CALLABLE) {
+                               cur_arg_info->type_hint = IS_CALLABLE;
+                               if (op == ZEND_RECV_INIT) {
+                                       if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL"))) {
+                                               cur_arg_info->allow_null = 1;
+                                       } else {
+                                               zend_error(E_COMPILE_ERROR, "Default value for parameters with callable type hint can only be NULL");
+                                       }
+                               }
+                       } else {
+                               cur_arg_info->type_hint = IS_OBJECT;
+                               if (ZEND_FETCH_CLASS_DEFAULT == zend_get_class_fetch_type(Z_STRVAL(class_type->u.constant), Z_STRLEN(class_type->u.constant))) {
+                                       zend_resolve_class_name(class_type, opline->extended_value, 1 TSRMLS_CC);
+                               }
+                               class_type->u.constant.value.str.val = zend_new_interned_string(class_type->u.constant.value.str.val, class_type->u.constant.value.str.len + 1, 1 TSRMLS_CC);
+                               cur_arg_info->class_name = class_type->u.constant.value.str.val;
+                               cur_arg_info->class_name_len = class_type->u.constant.value.str.len;
+                               if (op == ZEND_RECV_INIT) {
+                                       if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL"))) {
+                                               cur_arg_info->allow_null = 1;
+                                       } else {
+                                               zend_error(E_COMPILE_ERROR, "Default value for parameters with a class type hint can only be NULL");
+                                       }
                                }
                        }
                }
index 83a3fff6b4dfd93a3d1e831849293430e645debf..90eb113fe2efc81c3b8692793c735ade777937cc 100644 (file)
@@ -626,13 +626,26 @@ static inline int zend_verify_arg_type(zend_function *zf, zend_uint arg_num, zva
                        need_msg = zend_verify_arg_class_kind(cur_arg_info, fetch_type, &class_name, &ce TSRMLS_CC);
                        return zend_verify_arg_error(E_RECOVERABLE_ERROR, zf, arg_num, need_msg, class_name, zend_zval_type_name(arg), "" TSRMLS_CC);
                }
-       } else if (cur_arg_info->type_hint && cur_arg_info->type_hint == IS_ARRAY) {
-               if (!arg) {
-                       return zend_verify_arg_error(E_RECOVERABLE_ERROR, zf, arg_num, "be of the type array", "", "none", "" TSRMLS_CC);
-               }
+       } else if (cur_arg_info->type_hint) {
+               switch(cur_arg_info->type_hint) {
+                       case IS_ARRAY:
+                               if (!arg) {
+                                       return zend_verify_arg_error(E_RECOVERABLE_ERROR, zf, arg_num, "be of the type array", "", "none", "" TSRMLS_CC);
+                               }
+
+                               if (Z_TYPE_P(arg) != IS_ARRAY && (Z_TYPE_P(arg) != IS_NULL || !cur_arg_info->allow_null)) {
+                                       return zend_verify_arg_error(E_RECOVERABLE_ERROR, zf, arg_num, "be of the type array", "", zend_zval_type_name(arg), "" TSRMLS_CC);
+                               }
+                               break;
+
+                       case IS_CALLABLE:
+                               if (!zend_is_callable(arg, IS_CALLABLE_CHECK_SILENT, NULL) && (Z_TYPE_P(arg) != IS_NULL || !cur_arg_info->allow_null)) {
+                                       return zend_verify_arg_error(E_RECOVERABLE_ERROR, zf, arg_num, "be callable", "", zend_zval_type_name(arg), "" TSRMLS_CC);
+                               }
+                               break;
 
-               if (Z_TYPE_P(arg) != IS_ARRAY && (Z_TYPE_P(arg) != IS_NULL || !cur_arg_info->allow_null)) {
-                       return zend_verify_arg_error(E_RECOVERABLE_ERROR, zf, arg_num, "be of the type array", "", zend_zval_type_name(arg), "" TSRMLS_CC);
+                       default:
+                               zend_error(E_ERROR, "Unknown typehint");
                }
        }
        return 1;
index ef390ffd5606dfefc9f1d04b25e0e2747005b232..0a52fe4a258b1583f4179ea0f821f76087987135 100644 (file)
@@ -186,6 +186,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
 %token T_DOUBLE_ARROW    "=> (T_DOUBLE_ARROW)"
 %token T_LIST            "list (T_LIST)"
 %token T_ARRAY           "array (T_ARRAY)"
+%token T_CALLABLE        "callable (T_CALLABLE)"
 %token T_CLASS_C         "__CLASS__ (T_CLASS_C)"
 %token T_TRAIT_C         "__TRAIT__ (T_TRAIT_C)"
 %token T_METHOD_C        "__METHOD__ (T_METHOD_C)"
@@ -523,7 +524,8 @@ non_empty_parameter_list:
 
 optional_class_type:
                /* empty */                                     { $$.op_type = IS_UNUSED; }
-       |       T_ARRAY                                         { $$.op_type = IS_CONST; Z_TYPE($$.u.constant)=IS_NULL; }
+       |       T_ARRAY                                         { $$.op_type = IS_CONST; Z_TYPE($$.u.constant)=IS_ARRAY; }
+       |       T_CALLABLE                                      { $$.op_type = IS_CONST; Z_TYPE($$.u.constant)=IS_CALLABLE; }
        |       fully_qualified_class_name                      { $$ = $1; }
 ;
 
index a34a8d87e5c0623c501618437de151b02c27d5c8..3678dd0d63fda9069825e8ecc585d8fd2b796e0f 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.13.5 on Sun Aug  7 18:07:40 2011 */
+/* Generated by re2c 0.13.5 on Tue Aug 16 10:45:19 2011 */
 #line 1 "Zend/zend_language_scanner.l"
 /*
    +----------------------------------------------------------------------+
@@ -1083,7 +1083,7 @@ yyc_INITIAL:
 yy3:
                YYDEBUG(3, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1764 "Zend/zend_language_scanner.l"
+#line 1768 "Zend/zend_language_scanner.l"
                {
        if (YYCURSOR > YYLIMIT) {
                return 0;
@@ -1161,7 +1161,7 @@ yy5:
 yy6:
                YYDEBUG(6, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1752 "Zend/zend_language_scanner.l"
+#line 1756 "Zend/zend_language_scanner.l"
                {
        if (CG(short_tags)) {
                zendlval->value.str.val = yytext; /* no copying - intentional */
@@ -1180,7 +1180,7 @@ yy7:
                if ((yych = *YYCURSOR) == '=') goto yy43;
                YYDEBUG(8, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1729 "Zend/zend_language_scanner.l"
+#line 1733 "Zend/zend_language_scanner.l"
                {
        if (CG(asp_tags)) {
                zendlval->value.str.val = yytext; /* no copying - intentional */
@@ -1378,7 +1378,7 @@ yy35:
                ++YYCURSOR;
                YYDEBUG(38, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1689 "Zend/zend_language_scanner.l"
+#line 1693 "Zend/zend_language_scanner.l"
                {
        YYCTYPE *bracket = zend_memrchr(yytext, '<', yyleng - (sizeof("script language=php>") - 1));
 
@@ -1422,7 +1422,7 @@ yy43:
                ++YYCURSOR;
                YYDEBUG(44, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1707 "Zend/zend_language_scanner.l"
+#line 1711 "Zend/zend_language_scanner.l"
                {
        if (CG(asp_tags)) {
                zendlval->value.str.val = yytext; /* no copying - intentional */
@@ -1440,7 +1440,7 @@ yy45:
                ++YYCURSOR;
                YYDEBUG(46, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1720 "Zend/zend_language_scanner.l"
+#line 1724 "Zend/zend_language_scanner.l"
                {
        zendlval->value.str.val = yytext; /* no copying - intentional */
        zendlval->value.str.len = yyleng;
@@ -1475,7 +1475,7 @@ yy50:
 yy51:
                YYDEBUG(51, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1742 "Zend/zend_language_scanner.l"
+#line 1746 "Zend/zend_language_scanner.l"
                {
        zendlval->value.str.val = yytext; /* no copying - intentional */
        zendlval->value.str.len = yyleng;
@@ -1555,7 +1555,7 @@ yyc_ST_BACKQUOTE:
 yy56:
                YYDEBUG(56, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2215 "Zend/zend_language_scanner.l"
+#line 2219 "Zend/zend_language_scanner.l"
                {
        if (YYCURSOR > YYLIMIT) {
                return 0;
@@ -1607,7 +1607,7 @@ yy58:
                ++YYCURSOR;
                YYDEBUG(59, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2159 "Zend/zend_language_scanner.l"
+#line 2163 "Zend/zend_language_scanner.l"
                {
        BEGIN(ST_IN_SCRIPTING);
        return '`';
@@ -1622,7 +1622,7 @@ yy61:
                ++YYCURSOR;
                YYDEBUG(62, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2146 "Zend/zend_language_scanner.l"
+#line 2150 "Zend/zend_language_scanner.l"
                {
        zendlval->value.lval = (long) '{';
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
@@ -1645,7 +1645,7 @@ yy63:
 yy65:
                YYDEBUG(65, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1846 "Zend/zend_language_scanner.l"
+#line 1850 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, (yytext+1), (yyleng-1));
        zendlval->type = IS_STRING;
@@ -1657,7 +1657,7 @@ yy66:
                ++YYCURSOR;
                YYDEBUG(67, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1431 "Zend/zend_language_scanner.l"
+#line 1435 "Zend/zend_language_scanner.l"
                {
        yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC);
        return T_DOLLAR_OPEN_CURLY_BRACES;
@@ -1676,7 +1676,7 @@ yy70:
                ++YYCURSOR;
                YYDEBUG(71, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1838 "Zend/zend_language_scanner.l"
+#line 1842 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 1);
        yy_push_state(ST_VAR_OFFSET TSRMLS_CC);
@@ -1702,7 +1702,7 @@ yy73:
                ++YYCURSOR;
                YYDEBUG(74, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1828 "Zend/zend_language_scanner.l"
+#line 1832 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 3);
        yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC);
@@ -1778,7 +1778,7 @@ yy77:
 yy78:
                YYDEBUG(78, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2165 "Zend/zend_language_scanner.l"
+#line 2169 "Zend/zend_language_scanner.l"
                {
        if (GET_DOUBLE_QUOTES_SCANNED_LENGTH()) {
                YYCURSOR += GET_DOUBLE_QUOTES_SCANNED_LENGTH() - 1;
@@ -1838,7 +1838,7 @@ yy80:
                ++YYCURSOR;
                YYDEBUG(81, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2154 "Zend/zend_language_scanner.l"
+#line 2158 "Zend/zend_language_scanner.l"
                {
        BEGIN(ST_IN_SCRIPTING);
        return '"';
@@ -1853,7 +1853,7 @@ yy83:
                ++YYCURSOR;
                YYDEBUG(84, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2146 "Zend/zend_language_scanner.l"
+#line 2150 "Zend/zend_language_scanner.l"
                {
        zendlval->value.lval = (long) '{';
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
@@ -1876,7 +1876,7 @@ yy85:
 yy87:
                YYDEBUG(87, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1846 "Zend/zend_language_scanner.l"
+#line 1850 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, (yytext+1), (yyleng-1));
        zendlval->type = IS_STRING;
@@ -1888,7 +1888,7 @@ yy88:
                ++YYCURSOR;
                YYDEBUG(89, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1431 "Zend/zend_language_scanner.l"
+#line 1435 "Zend/zend_language_scanner.l"
                {
        yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC);
        return T_DOLLAR_OPEN_CURLY_BRACES;
@@ -1907,7 +1907,7 @@ yy92:
                ++YYCURSOR;
                YYDEBUG(93, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1838 "Zend/zend_language_scanner.l"
+#line 1842 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 1);
        yy_push_state(ST_VAR_OFFSET TSRMLS_CC);
@@ -1933,7 +1933,7 @@ yy95:
                ++YYCURSOR;
                YYDEBUG(96, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1828 "Zend/zend_language_scanner.l"
+#line 1832 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 3);
        yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC);
@@ -1952,7 +1952,7 @@ yyc_ST_END_HEREDOC:
        ++YYCURSOR;
        YYDEBUG(100, *YYCURSOR);
        yyleng = YYCURSOR - SCNG(yy_text);
-#line 2133 "Zend/zend_language_scanner.l"
+#line 2137 "Zend/zend_language_scanner.l"
        {
        YYCURSOR += CG(heredoc_len) - 1;
        yyleng = CG(heredoc_len);
@@ -2026,7 +2026,7 @@ yy103:
 yy104:
                YYDEBUG(104, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2257 "Zend/zend_language_scanner.l"
+#line 2261 "Zend/zend_language_scanner.l"
                {
        int newline = 0;
 
@@ -2112,7 +2112,7 @@ yy107:
                ++YYCURSOR;
                YYDEBUG(108, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2146 "Zend/zend_language_scanner.l"
+#line 2150 "Zend/zend_language_scanner.l"
                {
        zendlval->value.lval = (long) '{';
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
@@ -2135,7 +2135,7 @@ yy109:
 yy111:
                YYDEBUG(111, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1846 "Zend/zend_language_scanner.l"
+#line 1850 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, (yytext+1), (yyleng-1));
        zendlval->type = IS_STRING;
@@ -2147,7 +2147,7 @@ yy112:
                ++YYCURSOR;
                YYDEBUG(113, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1431 "Zend/zend_language_scanner.l"
+#line 1435 "Zend/zend_language_scanner.l"
                {
        yy_push_state(ST_LOOKING_FOR_VARNAME TSRMLS_CC);
        return T_DOLLAR_OPEN_CURLY_BRACES;
@@ -2166,7 +2166,7 @@ yy116:
                ++YYCURSOR;
                YYDEBUG(117, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1838 "Zend/zend_language_scanner.l"
+#line 1842 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 1);
        yy_push_state(ST_VAR_OFFSET TSRMLS_CC);
@@ -2192,7 +2192,7 @@ yy119:
                ++YYCURSOR;
                YYDEBUG(120, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1828 "Zend/zend_language_scanner.l"
+#line 1832 "Zend/zend_language_scanner.l"
                {
        yyless(yyleng - 3);
        yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC);
@@ -2365,23 +2365,23 @@ yy123:
                YYDEBUG(-1, yych);
                switch ((yych = *YYCURSOR)) {
                case 'C':
-               case 'c':       goto yy719;
+               case 'c':       goto yy726;
                case 'L':
-               case 'l':       goto yy720;
+               case 'l':       goto yy727;
                case 'M':
-               case 'm':       goto yy721;
+               case 'm':       goto yy728;
                case 'N':
-               case 'n':       goto yy722;
+               case 'n':       goto yy729;
                case 'V':
-               case 'v':       goto yy723;
+               case 'v':       goto yy730;
                case 'X':
-               case 'x':       goto yy724;
+               case 'x':       goto yy731;
                default:        goto yy186;
                }
 yy124:
                YYDEBUG(124, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1869 "Zend/zend_language_scanner.l"
+#line 1873 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, yytext, yyleng);
        zendlval->type = IS_STRING;
@@ -2393,20 +2393,20 @@ yy125:
                yych = *++YYCURSOR;
                if (yych <= 'O') {
                        if (yych <= 'H') {
-                               if (yych == 'E') goto yy701;
+                               if (yych == 'E') goto yy708;
                                goto yy186;
                        } else {
-                               if (yych <= 'I') goto yy702;
+                               if (yych <= 'I') goto yy709;
                                if (yych <= 'N') goto yy186;
-                               goto yy703;
+                               goto yy710;
                        }
                } else {
                        if (yych <= 'h') {
-                               if (yych == 'e') goto yy701;
+                               if (yych == 'e') goto yy708;
                                goto yy186;
                        } else {
-                               if (yych <= 'i') goto yy702;
-                               if (yych == 'o') goto yy703;
+                               if (yych <= 'i') goto yy709;
+                               if (yych == 'o') goto yy710;
                                goto yy186;
                        }
                }
@@ -2415,20 +2415,20 @@ yy126:
                yych = *++YYCURSOR;
                if (yych <= 'U') {
                        if (yych <= 'N') {
-                               if (yych == 'I') goto yy680;
+                               if (yych == 'I') goto yy687;
                                goto yy186;
                        } else {
-                               if (yych <= 'O') goto yy681;
+                               if (yych <= 'O') goto yy688;
                                if (yych <= 'T') goto yy186;
-                               goto yy682;
+                               goto yy689;
                        }
                } else {
                        if (yych <= 'n') {
-                               if (yych == 'i') goto yy680;
+                               if (yych == 'i') goto yy687;
                                goto yy186;
                        } else {
-                               if (yych <= 'o') goto yy681;
-                               if (yych == 'u') goto yy682;
+                               if (yych <= 'o') goto yy688;
+                               if (yych == 'u') goto yy689;
                                goto yy186;
                        }
                }
@@ -2613,7 +2613,7 @@ yy137:
 yy138:
                YYDEBUG(138, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1420 "Zend/zend_language_scanner.l"
+#line 1424 "Zend/zend_language_scanner.l"
                {
        return yytext[0];
 }
@@ -2877,7 +2877,7 @@ yy167:
                ++YYCURSOR;
                YYDEBUG(168, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1425 "Zend/zend_language_scanner.l"
+#line 1429 "Zend/zend_language_scanner.l"
                {
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
        return '{';
@@ -2888,7 +2888,7 @@ yy169:
                ++YYCURSOR;
                YYDEBUG(170, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1437 "Zend/zend_language_scanner.l"
+#line 1441 "Zend/zend_language_scanner.l"
                {
        RESET_DOC_COMMENT();
        if (!zend_stack_is_empty(&SCNG(state_stack))) {
@@ -2924,7 +2924,7 @@ yy171:
 yy172:
                YYDEBUG(172, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1483 "Zend/zend_language_scanner.l"
+#line 1487 "Zend/zend_language_scanner.l"
                {
        if (yyleng < MAX_LENGTH_OF_LONG - 1) { /* Won't overflow */
                zendlval->value.lval = strtol(yytext, NULL, 0);
@@ -2973,7 +2973,7 @@ yy175:
 yy176:
                YYDEBUG(176, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1876 "Zend/zend_language_scanner.l"
+#line 1880 "Zend/zend_language_scanner.l"
                {
        while (YYCURSOR < YYLIMIT) {
                switch (*YYCURSOR++) {
@@ -3014,7 +3014,7 @@ yy177:
 yy178:
                YYDEBUG(178, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1967 "Zend/zend_language_scanner.l"
+#line 1971 "Zend/zend_language_scanner.l"
                {
        register char *s, *t;
        char *end;
@@ -3089,7 +3089,7 @@ yy179:
 yy180:
                YYDEBUG(180, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2036 "Zend/zend_language_scanner.l"
+#line 2040 "Zend/zend_language_scanner.l"
                {
        int bprefix = (yytext[0] != '"') ? 1 : 0;
 
@@ -3136,7 +3136,7 @@ yy181:
                ++YYCURSOR;
                YYDEBUG(182, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2127 "Zend/zend_language_scanner.l"
+#line 2131 "Zend/zend_language_scanner.l"
                {
        BEGIN(ST_BACKQUOTE);
        return '`';
@@ -3147,7 +3147,7 @@ yy183:
                ++YYCURSOR;
                YYDEBUG(184, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2385 "Zend/zend_language_scanner.l"
+#line 2389 "Zend/zend_language_scanner.l"
                {
        if (YYCURSOR > YYLIMIT) {
                return 0;
@@ -3183,7 +3183,7 @@ yy187:
 yy189:
                YYDEBUG(189, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1544 "Zend/zend_language_scanner.l"
+#line 1548 "Zend/zend_language_scanner.l"
                {
        zendlval->value.dval = zend_strtod(yytext, NULL);
        zendlval->type = IS_DOUBLE;
@@ -3281,7 +3281,7 @@ yy199:
                }
                YYDEBUG(201, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1462 "Zend/zend_language_scanner.l"
+#line 1466 "Zend/zend_language_scanner.l"
                {
        char *bin = yytext + 2; /* Skip "0b" */
        int len = yyleng - 2;
@@ -3314,7 +3314,7 @@ yy202:
                }
                YYDEBUG(204, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1504 "Zend/zend_language_scanner.l"
+#line 1508 "Zend/zend_language_scanner.l"
                {
        char *hex = yytext + 2; /* Skip "0x" */
        int len = yyleng - 2;
@@ -3344,7 +3344,7 @@ yy205:
 yy206:
                YYDEBUG(206, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1944 "Zend/zend_language_scanner.l"
+#line 1948 "Zend/zend_language_scanner.l"
                {
        zendlval->value.str.val = yytext; /* no copying - intentional */
        zendlval->value.str.len = yyleng;
@@ -3386,7 +3386,7 @@ yy209:
 yy211:
                YYDEBUG(211, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1846 "Zend/zend_language_scanner.l"
+#line 1850 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, (yytext+1), (yyleng-1));
        zendlval->type = IS_STRING;
@@ -3406,7 +3406,7 @@ yy213:
                }
                YYDEBUG(214, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1408 "Zend/zend_language_scanner.l"
+#line 1412 "Zend/zend_language_scanner.l"
                {
        return T_LOGICAL_XOR;
 }
@@ -3419,7 +3419,7 @@ yy215:
                }
                YYDEBUG(216, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1400 "Zend/zend_language_scanner.l"
+#line 1404 "Zend/zend_language_scanner.l"
                {
        return T_LOGICAL_OR;
 }
@@ -3429,7 +3429,7 @@ yy217:
                ++YYCURSOR;
                YYDEBUG(218, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1388 "Zend/zend_language_scanner.l"
+#line 1392 "Zend/zend_language_scanner.l"
                {
        return T_XOR_EQUAL;
 }
@@ -3439,7 +3439,7 @@ yy219:
                ++YYCURSOR;
                YYDEBUG(220, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1392 "Zend/zend_language_scanner.l"
+#line 1396 "Zend/zend_language_scanner.l"
                {
        return T_BOOLEAN_OR;
 }
@@ -3449,7 +3449,7 @@ yy221:
                ++YYCURSOR;
                YYDEBUG(222, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1384 "Zend/zend_language_scanner.l"
+#line 1388 "Zend/zend_language_scanner.l"
                {
        return T_OR_EQUAL;
 }
@@ -3459,7 +3459,7 @@ yy223:
                ++YYCURSOR;
                YYDEBUG(224, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1396 "Zend/zend_language_scanner.l"
+#line 1400 "Zend/zend_language_scanner.l"
                {
        return T_BOOLEAN_AND;
 }
@@ -3469,7 +3469,7 @@ yy225:
                ++YYCURSOR;
                YYDEBUG(226, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1380 "Zend/zend_language_scanner.l"
+#line 1384 "Zend/zend_language_scanner.l"
                {
        return T_AND_EQUAL;
 }
@@ -3482,7 +3482,7 @@ yy227:
 yy228:
                YYDEBUG(228, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1953 "Zend/zend_language_scanner.l"
+#line 1957 "Zend/zend_language_scanner.l"
                {
        if (CG(asp_tags)) {
                BEGIN(INITIAL);
@@ -3501,7 +3501,7 @@ yy229:
                ++YYCURSOR;
                YYDEBUG(230, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1368 "Zend/zend_language_scanner.l"
+#line 1372 "Zend/zend_language_scanner.l"
                {
        return T_MOD_EQUAL;
 }
@@ -3536,7 +3536,7 @@ yy235:
                ++YYCURSOR;
                YYDEBUG(236, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1364 "Zend/zend_language_scanner.l"
+#line 1368 "Zend/zend_language_scanner.l"
                {
        return T_CONCAT_EQUAL;
 }
@@ -3549,7 +3549,7 @@ yy237:
 yy238:
                YYDEBUG(238, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1910 "Zend/zend_language_scanner.l"
+#line 1914 "Zend/zend_language_scanner.l"
                {
        int doc_com;
 
@@ -3593,7 +3593,7 @@ yy240:
                ++YYCURSOR;
                YYDEBUG(241, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1360 "Zend/zend_language_scanner.l"
+#line 1364 "Zend/zend_language_scanner.l"
                {
        return T_DIV_EQUAL;
 }
@@ -3620,7 +3620,7 @@ yy245:
                ++YYCURSOR;
                YYDEBUG(246, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1356 "Zend/zend_language_scanner.l"
+#line 1360 "Zend/zend_language_scanner.l"
                {
        return T_MUL_EQUAL;
 }
@@ -3631,7 +3631,7 @@ yy247:
                if ((yych = *YYCURSOR) == '=') goto yy251;
                YYDEBUG(248, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1416 "Zend/zend_language_scanner.l"
+#line 1420 "Zend/zend_language_scanner.l"
                {
        return T_SR;
 }
@@ -3641,7 +3641,7 @@ yy249:
                ++YYCURSOR;
                YYDEBUG(250, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1344 "Zend/zend_language_scanner.l"
+#line 1348 "Zend/zend_language_scanner.l"
                {
        return T_IS_GREATER_OR_EQUAL;
 }
@@ -3651,7 +3651,7 @@ yy251:
                ++YYCURSOR;
                YYDEBUG(252, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1376 "Zend/zend_language_scanner.l"
+#line 1380 "Zend/zend_language_scanner.l"
                {
        return T_SR_EQUAL;
 }
@@ -3666,7 +3666,7 @@ yy253:
 yy254:
                YYDEBUG(254, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1412 "Zend/zend_language_scanner.l"
+#line 1416 "Zend/zend_language_scanner.l"
                {
        return T_SL;
 }
@@ -3682,7 +3682,7 @@ yy256:
                ++YYCURSOR;
                YYDEBUG(257, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1340 "Zend/zend_language_scanner.l"
+#line 1344 "Zend/zend_language_scanner.l"
                {
        return T_IS_SMALLER_OR_EQUAL;
 }
@@ -3693,7 +3693,7 @@ yy258:
 yy259:
                YYDEBUG(259, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1336 "Zend/zend_language_scanner.l"
+#line 1340 "Zend/zend_language_scanner.l"
                {
        return T_IS_NOT_EQUAL;
 }
@@ -3748,7 +3748,7 @@ yy267:
                ++YYCURSOR;
                YYDEBUG(268, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1372 "Zend/zend_language_scanner.l"
+#line 1376 "Zend/zend_language_scanner.l"
                {
        return T_SL_EQUAL;
 }
@@ -3857,7 +3857,7 @@ yy278:
 yy279:
                YYDEBUG(279, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2078 "Zend/zend_language_scanner.l"
+#line 2082 "Zend/zend_language_scanner.l"
                {
        char *s;
        int bprefix = (yytext[0] != '<') ? 1 : 0;
@@ -3945,7 +3945,7 @@ yy283:
                ++YYCURSOR;
                YYDEBUG(285, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1328 "Zend/zend_language_scanner.l"
+#line 1332 "Zend/zend_language_scanner.l"
                {
        return T_IS_NOT_IDENTICAL;
 }
@@ -3955,7 +3955,7 @@ yy286:
                ++YYCURSOR;
                YYDEBUG(287, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1348 "Zend/zend_language_scanner.l"
+#line 1352 "Zend/zend_language_scanner.l"
                {
        return T_PLUS_EQUAL;
 }
@@ -3965,7 +3965,7 @@ yy288:
                ++YYCURSOR;
                YYDEBUG(289, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1316 "Zend/zend_language_scanner.l"
+#line 1320 "Zend/zend_language_scanner.l"
                {
        return T_INC;
 }
@@ -3999,7 +3999,7 @@ yy294:
                if ((yych = *YYCURSOR) == '=') goto yy298;
                YYDEBUG(295, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1332 "Zend/zend_language_scanner.l"
+#line 1336 "Zend/zend_language_scanner.l"
                {
        return T_IS_EQUAL;
 }
@@ -4019,7 +4019,7 @@ yy298:
                ++YYCURSOR;
                YYDEBUG(299, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1324 "Zend/zend_language_scanner.l"
+#line 1328 "Zend/zend_language_scanner.l"
                {
        return T_IS_IDENTICAL;
 }
@@ -4153,7 +4153,7 @@ yy316:
                }
                YYDEBUG(319, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1679 "Zend/zend_language_scanner.l"
+#line 1683 "Zend/zend_language_scanner.l"
                {
        if (CG(current_namespace)) {
                *zendlval = *CG(current_namespace);
@@ -4183,7 +4183,7 @@ yy321:
                }
                YYDEBUG(324, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1652 "Zend/zend_language_scanner.l"
+#line 1656 "Zend/zend_language_scanner.l"
                {
        char *filename = zend_get_compiled_filename(TSRMLS_C);
        const size_t filename_len = strlen(filename);
@@ -4235,7 +4235,7 @@ yy327:
                }
                YYDEBUG(330, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1634 "Zend/zend_language_scanner.l"
+#line 1638 "Zend/zend_language_scanner.l"
                {
        zendlval->value.lval = CG(zend_lineno);
        zendlval->type = IS_LONG;
@@ -4276,7 +4276,7 @@ yy335:
                }
                YYDEBUG(338, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1613 "Zend/zend_language_scanner.l"
+#line 1617 "Zend/zend_language_scanner.l"
                {
        char *class_name = CG(active_class_entry) ? CG(active_class_entry)->name : NULL;
        char *func_name = CG(active_op_array)? CG(active_op_array)->function_name : NULL;
@@ -4348,7 +4348,7 @@ yy346:
                }
                YYDEBUG(349, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1597 "Zend/zend_language_scanner.l"
+#line 1601 "Zend/zend_language_scanner.l"
                {
        char *func_name = NULL;
 
@@ -4384,7 +4384,7 @@ yy351:
                }
                YYDEBUG(354, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1640 "Zend/zend_language_scanner.l"
+#line 1644 "Zend/zend_language_scanner.l"
                {
        char *filename = zend_get_compiled_filename(TSRMLS_C);
 
@@ -4426,7 +4426,7 @@ yy358:
                }
                YYDEBUG(361, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1577 "Zend/zend_language_scanner.l"
+#line 1581 "Zend/zend_language_scanner.l"
                {
        char *trait_name = NULL;
        
@@ -4476,7 +4476,7 @@ yy365:
                }
                YYDEBUG(368, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1550 "Zend/zend_language_scanner.l"
+#line 1554 "Zend/zend_language_scanner.l"
                {
        char *class_name = NULL;
        
@@ -5219,7 +5219,7 @@ yy485:
                ++YYCURSOR;
                YYDEBUG(486, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1352 "Zend/zend_language_scanner.l"
+#line 1356 "Zend/zend_language_scanner.l"
                {
        return T_MINUS_EQUAL;
 }
@@ -5229,7 +5229,7 @@ yy487:
                ++YYCURSOR;
                YYDEBUG(488, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1320 "Zend/zend_language_scanner.l"
+#line 1324 "Zend/zend_language_scanner.l"
                {
        return T_DEC;
 }
@@ -5632,7 +5632,7 @@ yy555:
                }
                YYDEBUG(556, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1404 "Zend/zend_language_scanner.l"
+#line 1408 "Zend/zend_language_scanner.l"
                {
        return T_LOGICAL_AND;
 }
@@ -6239,14 +6239,23 @@ yy652:
                YYDEBUG(652, *YYCURSOR);
                yych = *++YYCURSOR;
                if (yych <= 'T') {
-                       if (yych <= 'R') goto yy186;
-                       if (yych <= 'S') goto yy674;
-                       goto yy673;
+                       if (yych <= 'L') {
+                               if (yych <= 'K') goto yy186;
+                               goto yy675;
+                       } else {
+                               if (yych <= 'R') goto yy186;
+                               if (yych <= 'S') goto yy674;
+                               goto yy673;
+                       }
                } else {
-                       if (yych <= 'r') goto yy186;
-                       if (yych <= 's') goto yy674;
-                       if (yych <= 't') goto yy673;
-                       goto yy186;
+                       if (yych <= 'r') {
+                               if (yych == 'l') goto yy675;
+                               goto yy186;
+                       } else {
+                               if (yych <= 's') goto yy674;
+                               if (yych <= 't') goto yy673;
+                               goto yy186;
+                       }
                }
 yy653:
                YYDEBUG(653, *YYCURSOR);
@@ -6319,7 +6328,7 @@ yy661:
                {
        return T_CONTINUE;
 }
-#line 6323 "Zend/zend_language_scanner.c"
+#line 6332 "Zend/zend_language_scanner.c"
 yy663:
                YYDEBUG(663, *YYCURSOR);
                ++YYCURSOR;
@@ -6332,7 +6341,7 @@ yy663:
                {
        return T_CONST;
 }
-#line 6336 "Zend/zend_language_scanner.c"
+#line 6345 "Zend/zend_language_scanner.c"
 yy665:
                YYDEBUG(665, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6361,7 +6370,7 @@ yy668:
                {
        return T_CLONE;
 }
-#line 6365 "Zend/zend_language_scanner.c"
+#line 6374 "Zend/zend_language_scanner.c"
 yy670:
                YYDEBUG(670, *YYCURSOR);
                yych = *++YYCURSOR;
@@ -6379,724 +6388,763 @@ yy671:
                {
        return T_CLASS;
 }
-#line 6383 "Zend/zend_language_scanner.c"
+#line 6392 "Zend/zend_language_scanner.c"
 yy673:
                YYDEBUG(673, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'C') goto yy677;
-               if (yych == 'c') goto yy677;
+               if (yych == 'C') goto yy684;
+               if (yych == 'c') goto yy684;
                goto yy186;
 yy674:
                YYDEBUG(674, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'E') goto yy675;
-               if (yych != 'e') goto yy186;
+               if (yych == 'E') goto yy682;
+               if (yych == 'e') goto yy682;
+               goto yy186;
 yy675:
                YYDEBUG(675, *YYCURSOR);
+               yych = *++YYCURSOR;
+               if (yych == 'L') goto yy676;
+               if (yych != 'l') goto yy186;
+yy676:
+               YYDEBUG(676, *YYCURSOR);
+               yych = *++YYCURSOR;
+               if (yych == 'A') goto yy677;
+               if (yych != 'a') goto yy186;
+yy677:
+               YYDEBUG(677, *YYCURSOR);
+               yych = *++YYCURSOR;
+               if (yych == 'B') goto yy678;
+               if (yych != 'b') goto yy186;
+yy678:
+               YYDEBUG(678, *YYCURSOR);
+               yych = *++YYCURSOR;
+               if (yych == 'L') goto yy679;
+               if (yych != 'l') goto yy186;
+yy679:
+               YYDEBUG(679, *YYCURSOR);
+               yych = *++YYCURSOR;
+               if (yych == 'E') goto yy680;
+               if (yych != 'e') goto yy186;
+yy680:
+               YYDEBUG(680, *YYCURSOR);
                ++YYCURSOR;
                if (yybm[0+(yych = *YYCURSOR)] & 4) {
                        goto yy185;
                }
-               YYDEBUG(676, *YYCURSOR);
+               YYDEBUG(681, *YYCURSOR);
+               yyleng = YYCURSOR - SCNG(yy_text);
+#line 1316 "Zend/zend_language_scanner.l"
+               {
+ return T_CALLABLE;
+}
+#line 6442 "Zend/zend_language_scanner.c"
+yy682:
+               YYDEBUG(682, *YYCURSOR);
+               ++YYCURSOR;
+               if (yybm[0+(yych = *YYCURSOR)] & 4) {
+                       goto yy185;
+               }
+               YYDEBUG(683, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1102 "Zend/zend_language_scanner.l"
                {
        return T_CASE;
 }
-#line 6407 "Zend/zend_language_scanner.c"
-yy677:
-               YYDEBUG(677, *YYCURSOR);
+#line 6455 "Zend/zend_language_scanner.c"
+yy684:
+               YYDEBUG(684, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'H') goto yy678;
+               if (yych == 'H') goto yy685;
                if (yych != 'h') goto yy186;
-yy678:
-               YYDEBUG(678, *YYCURSOR);
+yy685:
+               YYDEBUG(685, *YYCURSOR);
                ++YYCURSOR;
                if (yybm[0+(yych = *YYCURSOR)] & 4) {
                        goto yy185;
                }
-               YYDEBUG(679, *YYCURSOR);
+               YYDEBUG(686, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1026 "Zend/zend_language_scanner.l"
                {
        return T_CATCH;
 }
-#line 6425 "Zend/zend_language_scanner.c"
-yy680:
-               YYDEBUG(680, *YYCURSOR);
+#line 6473 "Zend/zend_language_scanner.c"
+yy687:
+               YYDEBUG(687, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'N') goto yy697;
-               if (yych == 'n') goto yy697;
+               if (yych == 'N') goto yy704;
+               if (yych == 'n') goto yy704;
                goto yy186;
-yy681:
-               YYDEBUG(681, *YYCURSOR);
+yy688:
+               YYDEBUG(688, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'R') goto yy690;
-               if (yych == 'r') goto yy690;
+               if (yych == 'R') goto yy697;
+               if (yych == 'r') goto yy697;
                goto yy186;
-yy682:
-               YYDEBUG(682, *YYCURSOR);
+yy689:
+               YYDEBUG(689, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'N') goto yy683;
+               if (yych == 'N') goto yy690;
                if (yych != 'n') goto yy186;
-yy683:
-               YYDEBUG(683, *YYCURSOR);
+yy690:
+               YYDEBUG(690, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'C') goto yy684;
+               if (yych == 'C') goto yy691;
                if (yych != 'c') goto yy186;
-yy684:
-               YYDEBUG(684, *YYCURSOR);
+yy691:
+               YYDEBUG(691, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'T') goto yy685;
+               if (yych == 'T') goto yy692;
                if (yych != 't') goto yy186;
-yy685:
-               YYDEBUG(685, *YYCURSOR);
+yy692:
+               YYDEBUG(692, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'I') goto yy686;
+               if (yych == 'I') goto yy693;
                if (yych != 'i') goto yy186;
-yy686:
-               YYDEBUG(686, *YYCURSOR);
+yy693:
+               YYDEBUG(693, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'O') goto yy687;
+               if (yych == 'O') goto yy694;
                if (yych != 'o') goto yy186;
-yy687:
-               YYDEBUG(687, *YYCURSOR);
+yy694:
+               YYDEBUG(694, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'N') goto yy688;
+               if (yych == 'N') goto yy695;
                if (yych != 'n') goto yy186;
-yy688:
-               YYDEBUG(688, *YYCURSOR);
+yy695:
+               YYDEBUG(695, *YYCURSOR);
                ++YYCURSOR;
                if (yybm[0+(yych = *YYCURSOR)] & 4) {
                        goto yy185;
                }
-               YYDEBUG(689, *YYCURSOR);
+               YYDEBUG(696, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1010 "Zend/zend_language_scanner.l"
                {
        return T_FUNCTION;
 }
-#line 6480 "Zend/zend_language_scanner.c"
-yy690:
-               YYDEBUG(690, *YYCURSOR);
+#line 6528 "Zend/zend_language_scanner.c"
+yy697:
+               YYDEBUG(697, *YYCURSOR);
                ++YYCURSOR;
                if ((yych = *YYCURSOR) <= '^') {
                        if (yych <= '@') {
-                               if (yych <= '/') goto yy691;
+                               if (yych <= '/') goto yy698;
                                if (yych <= '9') goto yy185;
                        } else {
-                               if (yych == 'E') goto yy692;
+                               if (yych == 'E') goto yy699;
                                if (yych <= 'Z') goto yy185;
                        }
                } else {
                        if (yych <= 'd') {
                                if (yych != '`') goto yy185;
                        } else {
-                               if (yych <= 'e') goto yy692;
+                               if (yych <= 'e') goto yy699;
                                if (yych <= 'z') goto yy185;
                                if (yych >= 0x7F) goto yy185;
                        }
                }
-yy691:
-               YYDEBUG(691, *YYCURSOR);
+yy698:
+               YYDEBUG(698, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1062 "Zend/zend_language_scanner.l"
                {
        return T_FOR;
 }
-#line 6508 "Zend/zend_language_scanner.c"
-yy692:
-               YYDEBUG(692, *YYCURSOR);
+#line 6556 "Zend/zend_language_scanner.c"
+yy699:
+               YYDEBUG(699, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'A') goto yy693;
+               if (yych == 'A') goto yy700;
                if (yych != 'a') goto yy186;
-yy693:
-               YYDEBUG(693, *YYCURSOR);
+yy700:
+               YYDEBUG(700, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'C') goto yy694;
+               if (yych == 'C') goto yy701;
                if (yych != 'c') goto yy186;
-yy694:
-               YYDEBUG(694, *YYCURSOR);
+yy701:
+               YYDEBUG(701, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'H') goto yy695;
+               if (yych == 'H') goto yy702;
                if (yych != 'h') goto yy186;
-yy695:
-               YYDEBUG(695, *YYCURSOR);
+yy702:
+               YYDEBUG(702, *YYCURSOR);
                ++YYCURSOR;
                if (yybm[0+(yych = *YYCURSOR)] & 4) {
                        goto yy185;
                }
-               YYDEBUG(696, *YYCURSOR);
+               YYDEBUG(703, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1070 "Zend/zend_language_scanner.l"
                {
        return T_FOREACH;
 }
-#line 6536 "Zend/zend_language_scanner.c"
-yy697:
-               YYDEBUG(697, *YYCURSOR);
+#line 6584 "Zend/zend_language_scanner.c"
+yy704:
+               YYDEBUG(704, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'A') goto yy698;
+               if (yych == 'A') goto yy705;
                if (yych != 'a') goto yy186;
-yy698:
-               YYDEBUG(698, *YYCURSOR);
+yy705:
+               YYDEBUG(705, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'L') goto yy699;
+               if (yych == 'L') goto yy706;
                if (yych != 'l') goto yy186;
-yy699:
-               YYDEBUG(699, *YYCURSOR);
+yy706:
+               YYDEBUG(706, *YYCURSOR);
                ++YYCURSOR;
                if (yybm[0+(yych = *YYCURSOR)] & 4) {
                        goto yy185;
                }
-               YYDEBUG(700, *YYCURSOR);
+               YYDEBUG(707, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1284 "Zend/zend_language_scanner.l"
                {
        return T_FINAL;
 }
-#line 6559 "Zend/zend_language_scanner.c"
-yy701:
-               YYDEBUG(701, *YYCURSOR);
+#line 6607 "Zend/zend_language_scanner.c"
+yy708:
+               YYDEBUG(708, *YYCURSOR);
                yych = *++YYCURSOR;
                if (yych <= 'F') {
-                       if (yych == 'C') goto yy707;
+                       if (yych == 'C') goto yy714;
                        if (yych <= 'E') goto yy186;
-                       goto yy708;
+                       goto yy715;
                } else {
                        if (yych <= 'c') {
                                if (yych <= 'b') goto yy186;
-                               goto yy707;
+                               goto yy714;
                        } else {
-                               if (yych == 'f') goto yy708;
+                               if (yych == 'f') goto yy715;
                                goto yy186;
                        }
                }
-yy702:
-               YYDEBUG(702, *YYCURSOR);
+yy709:
+               YYDEBUG(709, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'E') goto yy705;
-               if (yych == 'e') goto yy705;
+               if (yych == 'E') goto yy712;
+               if (yych == 'e') goto yy712;
                goto yy186;
-yy703:
-               YYDEBUG(703, *YYCURSOR);
+yy710:
+               YYDEBUG(710, *YYCURSOR);
                ++YYCURSOR;
                if (yybm[0+(yych = *YYCURSOR)] & 4) {
                        goto yy185;
                }
-               YYDEBUG(704, *YYCURSOR);
+               YYDEBUG(711, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1058 "Zend/zend_language_scanner.l"
                {
        return T_DO;
 }
-#line 6594 "Zend/zend_language_scanner.c"
-yy705:
-               YYDEBUG(705, *YYCURSOR);
+#line 6642 "Zend/zend_language_scanner.c"
+yy712:
+               YYDEBUG(712, *YYCURSOR);
                ++YYCURSOR;
                if (yybm[0+(yych = *YYCURSOR)] & 4) {
                        goto yy185;
                }
-               YYDEBUG(706, *YYCURSOR);
+               YYDEBUG(713, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1006 "Zend/zend_language_scanner.l"
                {
        return T_EXIT;
 }
-#line 6607 "Zend/zend_language_scanner.c"
-yy707:
-               YYDEBUG(707, *YYCURSOR);
+#line 6655 "Zend/zend_language_scanner.c"
+yy714:
+               YYDEBUG(714, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'L') goto yy714;
-               if (yych == 'l') goto yy714;
+               if (yych == 'L') goto yy721;
+               if (yych == 'l') goto yy721;
                goto yy186;
-yy708:
-               YYDEBUG(708, *YYCURSOR);
+yy715:
+               YYDEBUG(715, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'A') goto yy709;
+               if (yych == 'A') goto yy716;
                if (yych != 'a') goto yy186;
-yy709:
-               YYDEBUG(709, *YYCURSOR);
+yy716:
+               YYDEBUG(716, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'U') goto yy710;
+               if (yych == 'U') goto yy717;
                if (yych != 'u') goto yy186;
-yy710:
-               YYDEBUG(710, *YYCURSOR);
+yy717:
+               YYDEBUG(717, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'L') goto yy711;
+               if (yych == 'L') goto yy718;
                if (yych != 'l') goto yy186;
-yy711:
-               YYDEBUG(711, *YYCURSOR);
+yy718:
+               YYDEBUG(718, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'T') goto yy712;
+               if (yych == 'T') goto yy719;
                if (yych != 't') goto yy186;
-yy712:
-               YYDEBUG(712, *YYCURSOR);
+yy719:
+               YYDEBUG(719, *YYCURSOR);
                ++YYCURSOR;
                if (yybm[0+(yych = *YYCURSOR)] & 4) {
                        goto yy185;
                }
-               YYDEBUG(713, *YYCURSOR);
+               YYDEBUG(720, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1106 "Zend/zend_language_scanner.l"
                {
        return T_DEFAULT;
 }
-#line 6646 "Zend/zend_language_scanner.c"
-yy714:
-               YYDEBUG(714, *YYCURSOR);
+#line 6694 "Zend/zend_language_scanner.c"
+yy721:
+               YYDEBUG(721, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'A') goto yy715;
+               if (yych == 'A') goto yy722;
                if (yych != 'a') goto yy186;
-yy715:
-               YYDEBUG(715, *YYCURSOR);
+yy722:
+               YYDEBUG(722, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'R') goto yy716;
+               if (yych == 'R') goto yy723;
                if (yych != 'r') goto yy186;
-yy716:
-               YYDEBUG(716, *YYCURSOR);
+yy723:
+               YYDEBUG(723, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'E') goto yy717;
+               if (yych == 'E') goto yy724;
                if (yych != 'e') goto yy186;
-yy717:
-               YYDEBUG(717, *YYCURSOR);
+yy724:
+               YYDEBUG(724, *YYCURSOR);
                ++YYCURSOR;
                if (yybm[0+(yych = *YYCURSOR)] & 4) {
                        goto yy185;
                }
-               YYDEBUG(718, *YYCURSOR);
+               YYDEBUG(725, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1078 "Zend/zend_language_scanner.l"
                {
        return T_DECLARE;
 }
-#line 6674 "Zend/zend_language_scanner.c"
-yy719:
-               YYDEBUG(719, *YYCURSOR);
+#line 6722 "Zend/zend_language_scanner.c"
+yy726:
+               YYDEBUG(726, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'H') goto yy781;
-               if (yych == 'h') goto yy781;
+               if (yych == 'H') goto yy788;
+               if (yych == 'h') goto yy788;
                goto yy186;
-yy720:
-               YYDEBUG(720, *YYCURSOR);
+yy727:
+               YYDEBUG(727, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'S') goto yy775;
-               if (yych == 's') goto yy775;
+               if (yych == 'S') goto yy782;
+               if (yych == 's') goto yy782;
                goto yy186;
-yy721:
-               YYDEBUG(721, *YYCURSOR);
+yy728:
+               YYDEBUG(728, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'P') goto yy771;
-               if (yych == 'p') goto yy771;
+               if (yych == 'P') goto yy778;
+               if (yych == 'p') goto yy778;
                goto yy186;
-yy722:
-               YYDEBUG(722, *YYCURSOR);
+yy729:
+               YYDEBUG(729, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'D') goto yy737;
-               if (yych == 'd') goto yy737;
+               if (yych == 'D') goto yy744;
+               if (yych == 'd') goto yy744;
                goto yy186;
-yy723:
-               YYDEBUG(723, *YYCURSOR);
+yy730:
+               YYDEBUG(730, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'A') goto yy734;
-               if (yych == 'a') goto yy734;
+               if (yych == 'A') goto yy741;
+               if (yych == 'a') goto yy741;
                goto yy186;
-yy724:
-               YYDEBUG(724, *YYCURSOR);
+yy731:
+               YYDEBUG(731, *YYCURSOR);
                yych = *++YYCURSOR;
                if (yych <= 'T') {
-                       if (yych == 'I') goto yy725;
+                       if (yych == 'I') goto yy732;
                        if (yych <= 'S') goto yy186;
-                       goto yy726;
+                       goto yy733;
                } else {
                        if (yych <= 'i') {
                                if (yych <= 'h') goto yy186;
                        } else {
-                               if (yych == 't') goto yy726;
+                               if (yych == 't') goto yy733;
                                goto yy186;
                        }
                }
-yy725:
-               YYDEBUG(725, *YYCURSOR);
+yy732:
+               YYDEBUG(732, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'T') goto yy732;
-               if (yych == 't') goto yy732;
+               if (yych == 'T') goto yy739;
+               if (yych == 't') goto yy739;
                goto yy186;
-yy726:
-               YYDEBUG(726, *YYCURSOR);
+yy733:
+               YYDEBUG(733, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'E') goto yy727;
+               if (yych == 'E') goto yy734;
                if (yych != 'e') goto yy186;
-yy727:
-               YYDEBUG(727, *YYCURSOR);
+yy734:
+               YYDEBUG(734, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'N') goto yy728;
+               if (yych == 'N') goto yy735;
                if (yych != 'n') goto yy186;
-yy728:
-               YYDEBUG(728, *YYCURSOR);
+yy735:
+               YYDEBUG(735, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'D') goto yy729;
+               if (yych == 'D') goto yy736;
                if (yych != 'd') goto yy186;
-yy729:
-               YYDEBUG(729, *YYCURSOR);
+yy736:
+               YYDEBUG(736, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'S') goto yy730;
+               if (yych == 'S') goto yy737;
                if (yych != 's') goto yy186;
-yy730:
-               YYDEBUG(730, *YYCURSOR);
+yy737:
+               YYDEBUG(737, *YYCURSOR);
                ++YYCURSOR;
                if (yybm[0+(yych = *YYCURSOR)] & 4) {
                        goto yy185;
                }
-               YYDEBUG(731, *YYCURSOR);
+               YYDEBUG(738, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1142 "Zend/zend_language_scanner.l"
                {
        return T_EXTENDS;
 }
-#line 6758 "Zend/zend_language_scanner.c"
-yy732:
-               YYDEBUG(732, *YYCURSOR);
+#line 6806 "Zend/zend_language_scanner.c"
+yy739:
+               YYDEBUG(739, *YYCURSOR);
                ++YYCURSOR;
                if (yybm[0+(yych = *YYCURSOR)] & 4) {
                        goto yy185;
                }
-               YYDEBUG(733, *YYCURSOR);
+               YYDEBUG(740, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1002 "Zend/zend_language_scanner.l"
                {
        return T_EXIT;
 }
-#line 6771 "Zend/zend_language_scanner.c"
-yy734:
-               YYDEBUG(734, *YYCURSOR);
+#line 6819 "Zend/zend_language_scanner.c"
+yy741:
+               YYDEBUG(741, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'L') goto yy735;
+               if (yych == 'L') goto yy742;
                if (yych != 'l') goto yy186;
-yy735:
-               YYDEBUG(735, *YYCURSOR);
+yy742:
+               YYDEBUG(742, *YYCURSOR);
                ++YYCURSOR;
                if (yybm[0+(yych = *YYCURSOR)] & 4) {
                        goto yy185;
                }
-               YYDEBUG(736, *YYCURSOR);
+               YYDEBUG(743, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1228 "Zend/zend_language_scanner.l"
                {
        return T_EVAL;
 }
-#line 6789 "Zend/zend_language_scanner.c"
-yy737:
-               YYDEBUG(737, *YYCURSOR);
+#line 6837 "Zend/zend_language_scanner.c"
+yy744:
+               YYDEBUG(744, *YYCURSOR);
                yych = *++YYCURSOR;
                YYDEBUG(-1, yych);
                switch (yych) {
                case 'D':
-               case 'd':       goto yy738;
+               case 'd':       goto yy745;
                case 'F':
-               case 'f':       goto yy739;
+               case 'f':       goto yy746;
                case 'I':
-               case 'i':       goto yy740;
+               case 'i':       goto yy747;
                case 'S':
-               case 's':       goto yy741;
+               case 's':       goto yy748;
                case 'W':
-               case 'w':       goto yy742;
+               case 'w':       goto yy749;
                default:        goto yy186;
                }
-yy738:
-               YYDEBUG(738, *YYCURSOR);
+yy745:
+               YYDEBUG(745, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'E') goto yy764;
-               if (yych == 'e') goto yy764;
+               if (yych == 'E') goto yy771;
+               if (yych == 'e') goto yy771;
                goto yy186;
-yy739:
-               YYDEBUG(739, *YYCURSOR);
+yy746:
+               YYDEBUG(746, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'O') goto yy756;
-               if (yych == 'o') goto yy756;
+               if (yych == 'O') goto yy763;
+               if (yych == 'o') goto yy763;
                goto yy186;
-yy740:
-               YYDEBUG(740, *YYCURSOR);
+yy747:
+               YYDEBUG(747, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'F') goto yy754;
-               if (yych == 'f') goto yy754;
+               if (yych == 'F') goto yy761;
+               if (yych == 'f') goto yy761;
                goto yy186;
-yy741:
-               YYDEBUG(741, *YYCURSOR);
+yy748:
+               YYDEBUG(748, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'W') goto yy748;
-               if (yych == 'w') goto yy748;
+               if (yych == 'W') goto yy755;
+               if (yych == 'w') goto yy755;
                goto yy186;
-yy742:
-               YYDEBUG(742, *YYCURSOR);
+yy749:
+               YYDEBUG(749, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'H') goto yy743;
+               if (yych == 'H') goto yy750;
                if (yych != 'h') goto yy186;
-yy743:
-               YYDEBUG(743, *YYCURSOR);
+yy750:
+               YYDEBUG(750, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'I') goto yy744;
+               if (yych == 'I') goto yy751;
                if (yych != 'i') goto yy186;
-yy744:
-               YYDEBUG(744, *YYCURSOR);
+yy751:
+               YYDEBUG(751, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'L') goto yy745;
+               if (yych == 'L') goto yy752;
                if (yych != 'l') goto yy186;
-yy745:
-               YYDEBUG(745, *YYCURSOR);
+yy752:
+               YYDEBUG(752, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'E') goto yy746;
+               if (yych == 'E') goto yy753;
                if (yych != 'e') goto yy186;
-yy746:
-               YYDEBUG(746, *YYCURSOR);
+yy753:
+               YYDEBUG(753, *YYCURSOR);
                ++YYCURSOR;
                if (yybm[0+(yych = *YYCURSOR)] & 4) {
                        goto yy185;
                }
-               YYDEBUG(747, *YYCURSOR);
+               YYDEBUG(754, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1054 "Zend/zend_language_scanner.l"
                {
        return T_ENDWHILE;
 }
-#line 6863 "Zend/zend_language_scanner.c"
-yy748:
-               YYDEBUG(748, *YYCURSOR);
+#line 6911 "Zend/zend_language_scanner.c"
+yy755:
+               YYDEBUG(755, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'I') goto yy749;
+               if (yych == 'I') goto yy756;
                if (yych != 'i') goto yy186;
-yy749:
-               YYDEBUG(749, *YYCURSOR);
+yy756:
+               YYDEBUG(756, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'T') goto yy750;
+               if (yych == 'T') goto yy757;
                if (yych != 't') goto yy186;
-yy750:
-               YYDEBUG(750, *YYCURSOR);
+yy757:
+               YYDEBUG(757, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'C') goto yy751;
+               if (yych == 'C') goto yy758;
                if (yych != 'c') goto yy186;
-yy751:
-               YYDEBUG(751, *YYCURSOR);
+yy758:
+               YYDEBUG(758, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'H') goto yy752;
+               if (yych == 'H') goto yy759;
                if (yych != 'h') goto yy186;
-yy752:
-               YYDEBUG(752, *YYCURSOR);
+yy759:
+               YYDEBUG(759, *YYCURSOR);
                ++YYCURSOR;
                if (yybm[0+(yych = *YYCURSOR)] & 4) {
                        goto yy185;
                }
-               YYDEBUG(753, *YYCURSOR);
+               YYDEBUG(760, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1098 "Zend/zend_language_scanner.l"
                {
        return T_ENDSWITCH;
 }
-#line 6896 "Zend/zend_language_scanner.c"
-yy754:
-               YYDEBUG(754, *YYCURSOR);
+#line 6944 "Zend/zend_language_scanner.c"
+yy761:
+               YYDEBUG(761, *YYCURSOR);
                ++YYCURSOR;
                if (yybm[0+(yych = *YYCURSOR)] & 4) {
                        goto yy185;
                }
-               YYDEBUG(755, *YYCURSOR);
+               YYDEBUG(762, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1042 "Zend/zend_language_scanner.l"
                {
        return T_ENDIF;
 }
-#line 6909 "Zend/zend_language_scanner.c"
-yy756:
-               YYDEBUG(756, *YYCURSOR);
+#line 6957 "Zend/zend_language_scanner.c"
+yy763:
+               YYDEBUG(763, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'R') goto yy757;
+               if (yych == 'R') goto yy764;
                if (yych != 'r') goto yy186;
-yy757:
-               YYDEBUG(757, *YYCURSOR);
+yy764:
+               YYDEBUG(764, *YYCURSOR);
                ++YYCURSOR;
                if ((yych = *YYCURSOR) <= '^') {
                        if (yych <= '@') {
-                               if (yych <= '/') goto yy758;
+                               if (yych <= '/') goto yy765;
                                if (yych <= '9') goto yy185;
                        } else {
-                               if (yych == 'E') goto yy759;
+                               if (yych == 'E') goto yy766;
                                if (yych <= 'Z') goto yy185;
                        }
                } else {
                        if (yych <= 'd') {
                                if (yych != '`') goto yy185;
                        } else {
-                               if (yych <= 'e') goto yy759;
+                               if (yych <= 'e') goto yy766;
                                if (yych <= 'z') goto yy185;
                                if (yych >= 0x7F) goto yy185;
                        }
                }
-yy758:
-               YYDEBUG(758, *YYCURSOR);
+yy765:
+               YYDEBUG(765, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1066 "Zend/zend_language_scanner.l"
                {
        return T_ENDFOR;
 }
-#line 6942 "Zend/zend_language_scanner.c"
-yy759:
-               YYDEBUG(759, *YYCURSOR);
+#line 6990 "Zend/zend_language_scanner.c"
+yy766:
+               YYDEBUG(766, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'A') goto yy760;
+               if (yych == 'A') goto yy767;
                if (yych != 'a') goto yy186;
-yy760:
-               YYDEBUG(760, *YYCURSOR);
+yy767:
+               YYDEBUG(767, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'C') goto yy761;
+               if (yych == 'C') goto yy768;
                if (yych != 'c') goto yy186;
-yy761:
-               YYDEBUG(761, *YYCURSOR);
+yy768:
+               YYDEBUG(768, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'H') goto yy762;
+               if (yych == 'H') goto yy769;
                if (yych != 'h') goto yy186;
-yy762:
-               YYDEBUG(762, *YYCURSOR);
+yy769:
+               YYDEBUG(769, *YYCURSOR);
                ++YYCURSOR;
                if (yybm[0+(yych = *YYCURSOR)] & 4) {
                        goto yy185;
                }
-               YYDEBUG(763, *YYCURSOR);
+               YYDEBUG(770, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1074 "Zend/zend_language_scanner.l"
                {
        return T_ENDFOREACH;
 }
-#line 6970 "Zend/zend_language_scanner.c"
-yy764:
-               YYDEBUG(764, *YYCURSOR);
+#line 7018 "Zend/zend_language_scanner.c"
+yy771:
+               YYDEBUG(771, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'C') goto yy765;
+               if (yych == 'C') goto yy772;
                if (yych != 'c') goto yy186;
-yy765:
-               YYDEBUG(765, *YYCURSOR);
+yy772:
+               YYDEBUG(772, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'L') goto yy766;
+               if (yych == 'L') goto yy773;
                if (yych != 'l') goto yy186;
-yy766:
-               YYDEBUG(766, *YYCURSOR);
+yy773:
+               YYDEBUG(773, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'A') goto yy767;
+               if (yych == 'A') goto yy774;
                if (yych != 'a') goto yy186;
-yy767:
-               YYDEBUG(767, *YYCURSOR);
+yy774:
+               YYDEBUG(774, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'R') goto yy768;
+               if (yych == 'R') goto yy775;
                if (yych != 'r') goto yy186;
-yy768:
-               YYDEBUG(768, *YYCURSOR);
+yy775:
+               YYDEBUG(775, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'E') goto yy769;
+               if (yych == 'E') goto yy776;
                if (yych != 'e') goto yy186;
-yy769:
-               YYDEBUG(769, *YYCURSOR);
+yy776:
+               YYDEBUG(776, *YYCURSOR);
                ++YYCURSOR;
                if (yybm[0+(yych = *YYCURSOR)] & 4) {
                        goto yy185;
                }
-               YYDEBUG(770, *YYCURSOR);
+               YYDEBUG(777, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1082 "Zend/zend_language_scanner.l"
                {
        return T_ENDDECLARE;
 }
-#line 7008 "Zend/zend_language_scanner.c"
-yy771:
-               YYDEBUG(771, *YYCURSOR);
+#line 7056 "Zend/zend_language_scanner.c"
+yy778:
+               YYDEBUG(778, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'T') goto yy772;
+               if (yych == 'T') goto yy779;
                if (yych != 't') goto yy186;
-yy772:
-               YYDEBUG(772, *YYCURSOR);
+yy779:
+               YYDEBUG(779, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'Y') goto yy773;
+               if (yych == 'Y') goto yy780;
                if (yych != 'y') goto yy186;
-yy773:
-               YYDEBUG(773, *YYCURSOR);
+yy780:
+               YYDEBUG(780, *YYCURSOR);
                ++YYCURSOR;
                if (yybm[0+(yych = *YYCURSOR)] & 4) {
                        goto yy185;
                }
-               YYDEBUG(774, *YYCURSOR);
+               YYDEBUG(781, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1268 "Zend/zend_language_scanner.l"
                {
        return T_EMPTY;
 }
-#line 7031 "Zend/zend_language_scanner.c"
-yy775:
-               YYDEBUG(775, *YYCURSOR);
+#line 7079 "Zend/zend_language_scanner.c"
+yy782:
+               YYDEBUG(782, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'E') goto yy776;
+               if (yych == 'E') goto yy783;
                if (yych != 'e') goto yy186;
-yy776:
-               YYDEBUG(776, *YYCURSOR);
+yy783:
+               YYDEBUG(783, *YYCURSOR);
                ++YYCURSOR;
                if ((yych = *YYCURSOR) <= '^') {
                        if (yych <= '@') {
-                               if (yych <= '/') goto yy777;
+                               if (yych <= '/') goto yy784;
                                if (yych <= '9') goto yy185;
                        } else {
-                               if (yych == 'I') goto yy778;
+                               if (yych == 'I') goto yy785;
                                if (yych <= 'Z') goto yy185;
                        }
                } else {
                        if (yych <= 'h') {
                                if (yych != '`') goto yy185;
                        } else {
-                               if (yych <= 'i') goto yy778;
+                               if (yych <= 'i') goto yy785;
                                if (yych <= 'z') goto yy185;
                                if (yych >= 0x7F) goto yy185;
                        }
                }
-yy777:
-               YYDEBUG(777, *YYCURSOR);
+yy784:
+               YYDEBUG(784, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1046 "Zend/zend_language_scanner.l"
                {
        return T_ELSE;
 }
-#line 7064 "Zend/zend_language_scanner.c"
-yy778:
-               YYDEBUG(778, *YYCURSOR);
+#line 7112 "Zend/zend_language_scanner.c"
+yy785:
+               YYDEBUG(785, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'F') goto yy779;
+               if (yych == 'F') goto yy786;
                if (yych != 'f') goto yy186;
-yy779:
-               YYDEBUG(779, *YYCURSOR);
+yy786:
+               YYDEBUG(786, *YYCURSOR);
                ++YYCURSOR;
                if (yybm[0+(yych = *YYCURSOR)] & 4) {
                        goto yy185;
                }
-               YYDEBUG(780, *YYCURSOR);
+               YYDEBUG(787, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1038 "Zend/zend_language_scanner.l"
                {
        return T_ELSEIF;
 }
-#line 7082 "Zend/zend_language_scanner.c"
-yy781:
-               YYDEBUG(781, *YYCURSOR);
+#line 7130 "Zend/zend_language_scanner.c"
+yy788:
+               YYDEBUG(788, *YYCURSOR);
                yych = *++YYCURSOR;
-               if (yych == 'O') goto yy782;
+               if (yych == 'O') goto yy789;
                if (yych != 'o') goto yy186;
-yy782:
-               YYDEBUG(782, *YYCURSOR);
+yy789:
+               YYDEBUG(789, *YYCURSOR);
                ++YYCURSOR;
                if (yybm[0+(yych = *YYCURSOR)] & 4) {
                        goto yy185;
                }
-               YYDEBUG(783, *YYCURSOR);
+               YYDEBUG(790, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1122 "Zend/zend_language_scanner.l"
                {
        return T_ECHO;
 }
-#line 7100 "Zend/zend_language_scanner.c"
+#line 7148 "Zend/zend_language_scanner.c"
        }
 /* *********************************** */
 yyc_ST_LOOKING_FOR_PROPERTY:
@@ -7135,39 +7183,39 @@ yyc_ST_LOOKING_FOR_PROPERTY:
                         64,  64,  64,  64,  64,  64,  64,  64, 
                         64,  64,  64,  64,  64,  64,  64,  64, 
                };
-               YYDEBUG(784, *YYCURSOR);
+               YYDEBUG(791, *YYCURSOR);
                YYFILL(2);
                yych = *YYCURSOR;
                if (yych <= '-') {
                        if (yych <= '\r') {
-                               if (yych <= 0x08) goto yy792;
-                               if (yych <= '\n') goto yy786;
-                               if (yych <= '\f') goto yy792;
+                               if (yych <= 0x08) goto yy799;
+                               if (yych <= '\n') goto yy793;
+                               if (yych <= '\f') goto yy799;
                        } else {
-                               if (yych == ' ') goto yy786;
-                               if (yych <= ',') goto yy792;
-                               goto yy788;
+                               if (yych == ' ') goto yy793;
+                               if (yych <= ',') goto yy799;
+                               goto yy795;
                        }
                } else {
                        if (yych <= '_') {
-                               if (yych <= '@') goto yy792;
-                               if (yych <= 'Z') goto yy790;
-                               if (yych <= '^') goto yy792;
-                               goto yy790;
+                               if (yych <= '@') goto yy799;
+                               if (yych <= 'Z') goto yy797;
+                               if (yych <= '^') goto yy799;
+                               goto yy797;
                        } else {
-                               if (yych <= '`') goto yy792;
-                               if (yych <= 'z') goto yy790;
-                               if (yych <= '~') goto yy792;
-                               goto yy790;
+                               if (yych <= '`') goto yy799;
+                               if (yych <= 'z') goto yy797;
+                               if (yych <= '~') goto yy799;
+                               goto yy797;
                        }
                }
-yy786:
-               YYDEBUG(786, *YYCURSOR);
+yy793:
+               YYDEBUG(793, *YYCURSOR);
                ++YYCURSOR;
                yych = *YYCURSOR;
-               goto yy798;
-yy787:
-               YYDEBUG(787, *YYCURSOR);
+               goto yy805;
+yy794:
+               YYDEBUG(794, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1155 "Zend/zend_language_scanner.l"
                {
@@ -7177,13 +7225,13 @@ yy787:
        HANDLE_NEWLINES(yytext, yyleng);
        return T_WHITESPACE;
 }
-#line 7181 "Zend/zend_language_scanner.c"
-yy788:
-               YYDEBUG(788, *YYCURSOR);
+#line 7229 "Zend/zend_language_scanner.c"
+yy795:
+               YYDEBUG(795, *YYCURSOR);
                ++YYCURSOR;
-               if ((yych = *YYCURSOR) == '>') goto yy795;
-yy789:
-               YYDEBUG(789, *YYCURSOR);
+               if ((yych = *YYCURSOR) == '>') goto yy802;
+yy796:
+               YYDEBUG(796, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1174 "Zend/zend_language_scanner.l"
                {
@@ -7191,14 +7239,14 @@ yy789:
        yy_pop_state(TSRMLS_C);
        goto restart;
 }
-#line 7195 "Zend/zend_language_scanner.c"
-yy790:
-               YYDEBUG(790, *YYCURSOR);
+#line 7243 "Zend/zend_language_scanner.c"
+yy797:
+               YYDEBUG(797, *YYCURSOR);
                ++YYCURSOR;
                yych = *YYCURSOR;
-               goto yy794;
-yy791:
-               YYDEBUG(791, *YYCURSOR);
+               goto yy801;
+yy798:
+               YYDEBUG(798, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1167 "Zend/zend_language_scanner.l"
                {
@@ -7207,43 +7255,43 @@ yy791:
        zendlval->type = IS_STRING;
        return T_STRING;
 }
-#line 7211 "Zend/zend_language_scanner.c"
-yy792:
-               YYDEBUG(792, *YYCURSOR);
+#line 7259 "Zend/zend_language_scanner.c"
+yy799:
+               YYDEBUG(799, *YYCURSOR);
                yych = *++YYCURSOR;
-               goto yy789;
-yy793:
-               YYDEBUG(793, *YYCURSOR);
+               goto yy796;
+yy800:
+               YYDEBUG(800, *YYCURSOR);
                ++YYCURSOR;
                YYFILL(1);
                yych = *YYCURSOR;
-yy794:
-               YYDEBUG(794, *YYCURSOR);
+yy801:
+               YYDEBUG(801, *YYCURSOR);
                if (yybm[0+yych] & 64) {
-                       goto yy793;
+                       goto yy800;
                }
-               goto yy791;
-yy795:
-               YYDEBUG(795, *YYCURSOR);
+               goto yy798;
+yy802:
+               YYDEBUG(802, *YYCURSOR);
                ++YYCURSOR;
-               YYDEBUG(796, *YYCURSOR);
+               YYDEBUG(803, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
 #line 1163 "Zend/zend_language_scanner.l"
                {
        return T_OBJECT_OPERATOR;
 }
-#line 7236 "Zend/zend_language_scanner.c"
-yy797:
-               YYDEBUG(797, *YYCURSOR);
+#line 7284 "Zend/zend_language_scanner.c"
+yy804:
+               YYDEBUG(804, *YYCURSOR);
                ++YYCURSOR;
                YYFILL(1);
                yych = *YYCURSOR;
-yy798:
-               YYDEBUG(798, *YYCURSOR);
+yy805:
+               YYDEBUG(805, *YYCURSOR);
                if (yybm[0+yych] & 128) {
-                       goto yy797;
+                       goto yy804;
                }
-               goto yy787;
+               goto yy794;
        }
 /* *********************************** */
 yyc_ST_LOOKING_FOR_VARNAME:
@@ -7282,27 +7330,27 @@ yyc_ST_LOOKING_FOR_VARNAME:
                        128, 128, 128, 128, 128, 128, 128, 128, 
                        128, 128, 128, 128, 128, 128, 128, 128, 
                };
-               YYDEBUG(799, *YYCURSOR);
+               YYDEBUG(806, *YYCURSOR);
                YYFILL(2);
                yych = *YYCURSOR;
                if (yych <= '_') {
-                       if (yych <= '@') goto yy803;
-                       if (yych <= 'Z') goto yy801;
-                       if (yych <= '^') goto yy803;
+                       if (yych <= '@') goto yy810;
+                       if (yych <= 'Z') goto yy808;
+                       if (yych <= '^') goto yy810;
                } else {
-                       if (yych <= '`') goto yy803;
-                       if (yych <= 'z') goto yy801;
-                       if (yych <= '~') goto yy803;
+                       if (yych <= '`') goto yy810;
+                       if (yych <= 'z') goto yy808;
+                       if (yych <= '~') goto yy810;
                }
-yy801:
-               YYDEBUG(801, *YYCURSOR);
+yy808:
+               YYDEBUG(808, *YYCURSOR);
                ++YYCURSOR;
                yych = *YYCURSOR;
-               goto yy806;
-yy802:
-               YYDEBUG(802, *YYCURSOR);
+               goto yy813;
+yy809:
+               YYDEBUG(809, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1446 "Zend/zend_language_scanner.l"
+#line 1450 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, yytext, yyleng);
        zendlval->type = IS_STRING;
@@ -7310,42 +7358,42 @@ yy802:
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
        return T_STRING_VARNAME;
 }
-#line 7314 "Zend/zend_language_scanner.c"
-yy803:
-               YYDEBUG(803, *YYCURSOR);
+#line 7362 "Zend/zend_language_scanner.c"
+yy810:
+               YYDEBUG(810, *YYCURSOR);
                ++YYCURSOR;
-               YYDEBUG(804, *YYCURSOR);
+               YYDEBUG(811, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1455 "Zend/zend_language_scanner.l"
+#line 1459 "Zend/zend_language_scanner.l"
                {
        yyless(0);
        yy_pop_state(TSRMLS_C);
        yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
        goto restart;
 }
-#line 7327 "Zend/zend_language_scanner.c"
-yy805:
-               YYDEBUG(805, *YYCURSOR);
+#line 7375 "Zend/zend_language_scanner.c"
+yy812:
+               YYDEBUG(812, *YYCURSOR);
                ++YYCURSOR;
                YYFILL(1);
                yych = *YYCURSOR;
-yy806:
-               YYDEBUG(806, *YYCURSOR);
+yy813:
+               YYDEBUG(813, *YYCURSOR);
                if (yybm[0+yych] & 128) {
-                       goto yy805;
+                       goto yy812;
                }
-               goto yy802;
+               goto yy809;
        }
 /* *********************************** */
 yyc_ST_NOWDOC:
-       YYDEBUG(807, *YYCURSOR);
+       YYDEBUG(814, *YYCURSOR);
        YYFILL(1);
        yych = *YYCURSOR;
-       YYDEBUG(809, *YYCURSOR);
+       YYDEBUG(816, *YYCURSOR);
        ++YYCURSOR;
-       YYDEBUG(810, *YYCURSOR);
+       YYDEBUG(817, *YYCURSOR);
        yyleng = YYCURSOR - SCNG(yy_text);
-#line 2329 "Zend/zend_language_scanner.l"
+#line 2333 "Zend/zend_language_scanner.l"
        {
        int newline = 0;
 
@@ -7400,7 +7448,7 @@ nowdoc_scan_done:
        HANDLE_NEWLINES(yytext, yyleng - newline);
        return T_ENCAPSED_AND_WHITESPACE;
 }
-#line 7404 "Zend/zend_language_scanner.c"
+#line 7452 "Zend/zend_language_scanner.c"
 /* *********************************** */
 yyc_ST_VAR_OFFSET:
        {
@@ -7438,76 +7486,76 @@ yyc_ST_VAR_OFFSET:
                         16,  16,  16,  16,  16,  16,  16,  16, 
                         16,  16,  16,  16,  16,  16,  16,  16, 
                };
-               YYDEBUG(811, *YYCURSOR);
+               YYDEBUG(818, *YYCURSOR);
                YYFILL(3);
                yych = *YYCURSOR;
                if (yych <= '/') {
                        if (yych <= ' ') {
                                if (yych <= '\f') {
-                                       if (yych <= 0x08) goto yy825;
-                                       if (yych <= '\n') goto yy821;
-                                       goto yy825;
+                                       if (yych <= 0x08) goto yy832;
+                                       if (yych <= '\n') goto yy828;
+                                       goto yy832;
                                } else {
-                                       if (yych <= '\r') goto yy821;
-                                       if (yych <= 0x1F) goto yy825;
-                                       goto yy821;
+                                       if (yych <= '\r') goto yy828;
+                                       if (yych <= 0x1F) goto yy832;
+                                       goto yy828;
                                }
                        } else {
                                if (yych <= '$') {
-                                       if (yych <= '"') goto yy820;
-                                       if (yych <= '#') goto yy821;
-                                       goto yy816;
+                                       if (yych <= '"') goto yy827;
+                                       if (yych <= '#') goto yy828;
+                                       goto yy823;
                                } else {
-                                       if (yych == '\'') goto yy821;
-                                       goto yy820;
+                                       if (yych == '\'') goto yy828;
+                                       goto yy827;
                                }
                        }
                } else {
                        if (yych <= '\\') {
                                if (yych <= '@') {
-                                       if (yych <= '0') goto yy813;
-                                       if (yych <= '9') goto yy815;
-                                       goto yy820;
+                                       if (yych <= '0') goto yy820;
+                                       if (yych <= '9') goto yy822;
+                                       goto yy827;
                                } else {
-                                       if (yych <= 'Z') goto yy823;
-                                       if (yych <= '[') goto yy820;
-                                       goto yy821;
+                                       if (yych <= 'Z') goto yy830;
+                                       if (yych <= '[') goto yy827;
+                                       goto yy828;
                                }
                        } else {
                                if (yych <= '_') {
-                                       if (yych <= ']') goto yy818;
-                                       if (yych <= '^') goto yy820;
-                                       goto yy823;
+                                       if (yych <= ']') goto yy825;
+                                       if (yych <= '^') goto yy827;
+                                       goto yy830;
                                } else {
-                                       if (yych <= '`') goto yy820;
-                                       if (yych <= 'z') goto yy823;
-                                       if (yych <= '~') goto yy820;
-                                       goto yy823;
+                                       if (yych <= '`') goto yy827;
+                                       if (yych <= 'z') goto yy830;
+                                       if (yych <= '~') goto yy827;
+                                       goto yy830;
                                }
                        }
                }
-yy813:
-               YYDEBUG(813, *YYCURSOR);
+yy820:
+               YYDEBUG(820, *YYCURSOR);
                yyaccept = 0;
                yych = *(YYMARKER = ++YYCURSOR);
                if (yych <= 'W') {
                        if (yych <= '9') {
-                               if (yych >= '0') goto yy837;
+                               if (yych >= '0') goto yy844;
                        } else {
-                               if (yych == 'B') goto yy834;
+                               if (yych == 'B') goto yy841;
                        }
                } else {
                        if (yych <= 'b') {
-                               if (yych <= 'X') goto yy836;
-                               if (yych >= 'b') goto yy834;
+                               if (yych <= 'X') goto yy843;
+                               if (yych >= 'b') goto yy841;
                        } else {
-                               if (yych == 'x') goto yy836;
+                               if (yych == 'x') goto yy843;
                        }
                }
-yy814:
-               YYDEBUG(814, *YYCURSOR);
+yy821:
+               YYDEBUG(821, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1525 "Zend/zend_language_scanner.l"
+#line 1529 "Zend/zend_language_scanner.l"
                { /* Offset could be treated as a long */
        if (yyleng < MAX_LENGTH_OF_LONG - 1 || (yyleng == MAX_LENGTH_OF_LONG - 1 && strcmp(yytext, long_min_digits) < 0)) {
                zendlval->value.lval = strtol(yytext, NULL, 10);
@@ -7519,81 +7567,81 @@ yy814:
        }
        return T_NUM_STRING;
 }
-#line 7523 "Zend/zend_language_scanner.c"
-yy815:
-               YYDEBUG(815, *YYCURSOR);
+#line 7571 "Zend/zend_language_scanner.c"
+yy822:
+               YYDEBUG(822, *YYCURSOR);
                yych = *++YYCURSOR;
-               goto yy833;
-yy816:
-               YYDEBUG(816, *YYCURSOR);
+               goto yy840;
+yy823:
+               YYDEBUG(823, *YYCURSOR);
                ++YYCURSOR;
                if ((yych = *YYCURSOR) <= '_') {
-                       if (yych <= '@') goto yy817;
-                       if (yych <= 'Z') goto yy829;
-                       if (yych >= '_') goto yy829;
+                       if (yych <= '@') goto yy824;
+                       if (yych <= 'Z') goto yy836;
+                       if (yych >= '_') goto yy836;
                } else {
-                       if (yych <= '`') goto yy817;
-                       if (yych <= 'z') goto yy829;
-                       if (yych >= 0x7F) goto yy829;
+                       if (yych <= '`') goto yy824;
+                       if (yych <= 'z') goto yy836;
+                       if (yych >= 0x7F) goto yy836;
                }
-yy817:
-               YYDEBUG(817, *YYCURSOR);
+yy824:
+               YYDEBUG(824, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1857 "Zend/zend_language_scanner.l"
+#line 1861 "Zend/zend_language_scanner.l"
                {
        /* Only '[' can be valid, but returning other tokens will allow a more explicit parse error */
        return yytext[0];
 }
-#line 7548 "Zend/zend_language_scanner.c"
-yy818:
-               YYDEBUG(818, *YYCURSOR);
+#line 7596 "Zend/zend_language_scanner.c"
+yy825:
+               YYDEBUG(825, *YYCURSOR);
                ++YYCURSOR;
-               YYDEBUG(819, *YYCURSOR);
+               YYDEBUG(826, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1852 "Zend/zend_language_scanner.l"
+#line 1856 "Zend/zend_language_scanner.l"
                {
        yy_pop_state(TSRMLS_C);
        return ']';
 }
-#line 7559 "Zend/zend_language_scanner.c"
-yy820:
-               YYDEBUG(820, *YYCURSOR);
+#line 7607 "Zend/zend_language_scanner.c"
+yy827:
+               YYDEBUG(827, *YYCURSOR);
                yych = *++YYCURSOR;
-               goto yy817;
-yy821:
-               YYDEBUG(821, *YYCURSOR);
+               goto yy824;
+yy828:
+               YYDEBUG(828, *YYCURSOR);
                ++YYCURSOR;
-               YYDEBUG(822, *YYCURSOR);
+               YYDEBUG(829, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1862 "Zend/zend_language_scanner.l"
+#line 1866 "Zend/zend_language_scanner.l"
                {
        /* Invalid rule to return a more explicit parse error with proper line number */
        yyless(0);
        yy_pop_state(TSRMLS_C);
        return T_ENCAPSED_AND_WHITESPACE;
 }
-#line 7576 "Zend/zend_language_scanner.c"
-yy823:
-               YYDEBUG(823, *YYCURSOR);
+#line 7624 "Zend/zend_language_scanner.c"
+yy830:
+               YYDEBUG(830, *YYCURSOR);
                ++YYCURSOR;
                yych = *YYCURSOR;
-               goto yy828;
-yy824:
-               YYDEBUG(824, *YYCURSOR);
+               goto yy835;
+yy831:
+               YYDEBUG(831, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1869 "Zend/zend_language_scanner.l"
+#line 1873 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, yytext, yyleng);
        zendlval->type = IS_STRING;
        return T_STRING;
 }
-#line 7591 "Zend/zend_language_scanner.c"
-yy825:
-               YYDEBUG(825, *YYCURSOR);
+#line 7639 "Zend/zend_language_scanner.c"
+yy832:
+               YYDEBUG(832, *YYCURSOR);
                ++YYCURSOR;
-               YYDEBUG(826, *YYCURSOR);
+               YYDEBUG(833, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 2385 "Zend/zend_language_scanner.l"
+#line 2389 "Zend/zend_language_scanner.l"
                {
        if (YYCURSOR > YYLIMIT) {
                return 0;
@@ -7602,118 +7650,118 @@ yy825:
        zend_error(E_COMPILE_WARNING,"Unexpected character in input:  '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE);
        goto restart;
 }
-#line 7606 "Zend/zend_language_scanner.c"
-yy827:
-               YYDEBUG(827, *YYCURSOR);
+#line 7654 "Zend/zend_language_scanner.c"
+yy834:
+               YYDEBUG(834, *YYCURSOR);
                ++YYCURSOR;
                YYFILL(1);
                yych = *YYCURSOR;
-yy828:
-               YYDEBUG(828, *YYCURSOR);
+yy835:
+               YYDEBUG(835, *YYCURSOR);
                if (yybm[0+yych] & 16) {
-                       goto yy827;
+                       goto yy834;
                }
-               goto yy824;
-yy829:
-               YYDEBUG(829, *YYCURSOR);
+               goto yy831;
+yy836:
+               YYDEBUG(836, *YYCURSOR);
                ++YYCURSOR;
                YYFILL(1);
                yych = *YYCURSOR;
-               YYDEBUG(830, *YYCURSOR);
+               YYDEBUG(837, *YYCURSOR);
                if (yych <= '^') {
                        if (yych <= '9') {
-                               if (yych >= '0') goto yy829;
+                               if (yych >= '0') goto yy836;
                        } else {
-                               if (yych <= '@') goto yy831;
-                               if (yych <= 'Z') goto yy829;
+                               if (yych <= '@') goto yy838;
+                               if (yych <= 'Z') goto yy836;
                        }
                } else {
                        if (yych <= '`') {
-                               if (yych <= '_') goto yy829;
+                               if (yych <= '_') goto yy836;
                        } else {
-                               if (yych <= 'z') goto yy829;
-                               if (yych >= 0x7F) goto yy829;
+                               if (yych <= 'z') goto yy836;
+                               if (yych >= 0x7F) goto yy836;
                        }
                }
-yy831:
-               YYDEBUG(831, *YYCURSOR);
+yy838:
+               YYDEBUG(838, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1846 "Zend/zend_language_scanner.l"
+#line 1850 "Zend/zend_language_scanner.l"
                {
        zend_copy_value(zendlval, (yytext+1), (yyleng-1));
        zendlval->type = IS_STRING;
        return T_VARIABLE;
 }
-#line 7648 "Zend/zend_language_scanner.c"
-yy832:
-               YYDEBUG(832, *YYCURSOR);
+#line 7696 "Zend/zend_language_scanner.c"
+yy839:
+               YYDEBUG(839, *YYCURSOR);
                ++YYCURSOR;
                YYFILL(1);
                yych = *YYCURSOR;
-yy833:
-               YYDEBUG(833, *YYCURSOR);
+yy840:
+               YYDEBUG(840, *YYCURSOR);
                if (yybm[0+yych] & 32) {
-                       goto yy832;
+                       goto yy839;
                }
-               goto yy814;
-yy834:
-               YYDEBUG(834, *YYCURSOR);
+               goto yy821;
+yy841:
+               YYDEBUG(841, *YYCURSOR);
                yych = *++YYCURSOR;
                if (yybm[0+yych] & 128) {
-                       goto yy842;
+                       goto yy849;
                }
-yy835:
-               YYDEBUG(835, *YYCURSOR);
+yy842:
+               YYDEBUG(842, *YYCURSOR);
                YYCURSOR = YYMARKER;
-               goto yy814;
-yy836:
-               YYDEBUG(836, *YYCURSOR);
+               goto yy821;
+yy843:
+               YYDEBUG(843, *YYCURSOR);
                yych = *++YYCURSOR;
                if (yybm[0+yych] & 64) {
-                       goto yy840;
+                       goto yy847;
                }
-               goto yy835;
-yy837:
-               YYDEBUG(837, *YYCURSOR);
+               goto yy842;
+yy844:
+               YYDEBUG(844, *YYCURSOR);
                ++YYCURSOR;
                YYFILL(1);
                yych = *YYCURSOR;
-               YYDEBUG(838, *YYCURSOR);
-               if (yych <= '/') goto yy839;
-               if (yych <= '9') goto yy837;
-yy839:
-               YYDEBUG(839, *YYCURSOR);
+               YYDEBUG(845, *YYCURSOR);
+               if (yych <= '/') goto yy846;
+               if (yych <= '9') goto yy844;
+yy846:
+               YYDEBUG(846, *YYCURSOR);
                yyleng = YYCURSOR - SCNG(yy_text);
-#line 1537 "Zend/zend_language_scanner.l"
+#line 1541 "Zend/zend_language_scanner.l"
                { /* Offset must be treated as a string */
        zendlval->value.str.val = (char *)estrndup(yytext, yyleng);
        zendlval->value.str.len = yyleng;
        zendlval->type = IS_STRING;
        return T_NUM_STRING;
 }
-#line 7695 "Zend/zend_language_scanner.c"
-yy840:
-               YYDEBUG(840, *YYCURSOR);
+#line 7743 "Zend/zend_language_scanner.c"
+yy847:
+               YYDEBUG(847, *YYCURSOR);
                ++YYCURSOR;
                YYFILL(1);
                yych = *YYCURSOR;
-               YYDEBUG(841, *YYCURSOR);
+               YYDEBUG(848, *YYCURSOR);
                if (yybm[0+yych] & 64) {
-                       goto yy840;
+                       goto yy847;
                }
-               goto yy839;
-yy842:
-               YYDEBUG(842, *YYCURSOR);
+               goto yy846;
+yy849:
+               YYDEBUG(849, *YYCURSOR);
                ++YYCURSOR;
                YYFILL(1);
                yych = *YYCURSOR;
-               YYDEBUG(843, *YYCURSOR);
+               YYDEBUG(850, *YYCURSOR);
                if (yybm[0+yych] & 128) {
-                       goto yy842;
+                       goto yy849;
                }
-               goto yy839;
+               goto yy846;
        }
 }
-#line 2394 "Zend/zend_language_scanner.l"
+#line 2398 "Zend/zend_language_scanner.l"
 
 }
index a5c7fd183365ba1ffc1cdf1298f395d7c3027d88..0e3583472f79eb43def689b07c5e7e0b34ecb51d 100644 (file)
@@ -1313,6 +1313,10 @@ NEWLINE ("\r"|"\n"|"\r\n")
        return T_ARRAY;
 }
 
+<ST_IN_SCRIPTING>"callable" {
+ return T_CALLABLE;
+}
+
 <ST_IN_SCRIPTING>"++" {
        return T_INC;
 }
index 9f770360d306be3f35043e3a6db9260719e3861d..3dfd2f276b7b9293ceb05d609b7823f49aeb2f52 100644 (file)
@@ -2383,6 +2383,22 @@ ZEND_METHOD(reflection_parameter, isArray)
 }
 /* }}} */
 
+/* {{{ proto public bool ReflectionParameter::isCallable()
+   Returns whether parameter MUST be callable */
+ZEND_METHOD(reflection_parameter, isCallable)
+{
+       reflection_object *intern;
+       parameter_reference *param;
+
+       if (zend_parse_parameters_none() == FAILURE) {
+               return;
+       }
+       GET_REFLECTION_OBJECT_PTR(param);
+
+       RETVAL_BOOL(param->arg_info->type_hint == IS_CALLABLE);
+}
+/* }}} */
+
 /* {{{ proto public bool ReflectionParameter::allowsNull()
    Returns whether NULL is allowed as this parameters's value */
 ZEND_METHOD(reflection_parameter, allowsNull)
@@ -5827,6 +5843,7 @@ static const zend_function_entry reflection_parameter_functions[] = {
        ZEND_ME(reflection_parameter, getDeclaringClass, arginfo_reflection__void, 0)
        ZEND_ME(reflection_parameter, getClass, arginfo_reflection__void, 0)
        ZEND_ME(reflection_parameter, isArray, arginfo_reflection__void, 0)
+       ZEND_ME(reflection_parameter, isCallable, arginfo_reflection__void, 0)
        ZEND_ME(reflection_parameter, allowsNull, arginfo_reflection__void, 0)
        ZEND_ME(reflection_parameter, getPosition, arginfo_reflection__void, 0)
        ZEND_ME(reflection_parameter, isOptional, arginfo_reflection__void, 0)
index 12d8b0a584b81d5bc11fd09c0fdb6794d589b192..54c10399a05f6209b92db933c891d0f0a3629963 100644 (file)
@@ -69,6 +69,7 @@ void tokenizer_register_constants(INIT_FUNC_ARGS) {
        REGISTER_LONG_CONSTANT("T_INT_CAST", T_INT_CAST, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("T_DEC", T_DEC, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("T_INC", T_INC, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("T_SCALAR_CAST", T_SCALAR_CAST, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("T_CLONE", T_CLONE, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("T_NEW", T_NEW, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("T_EXIT", T_EXIT, CONST_CS | CONST_PERSISTENT);
@@ -134,6 +135,7 @@ void tokenizer_register_constants(INIT_FUNC_ARGS) {
        REGISTER_LONG_CONSTANT("T_DOUBLE_ARROW", T_DOUBLE_ARROW, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("T_LIST", T_LIST, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("T_ARRAY", T_ARRAY, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("T_CALLABLE", T_CALLABLE, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("T_CLASS_C", T_CLASS_C, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("T_METHOD_C", T_METHOD_C, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("T_FUNC_C", T_FUNC_C, CONST_CS | CONST_PERSISTENT);
@@ -201,6 +203,7 @@ char *get_token_type_name(int token_type)
                case T_INT_CAST: return "T_INT_CAST";
                case T_DEC: return "T_DEC";
                case T_INC: return "T_INC";
+               case T_SCALAR_CAST: return "T_SCALAR_CAST";
                case T_CLONE: return "T_CLONE";
                case T_NEW: return "T_NEW";
                case T_EXIT: return "T_EXIT";
@@ -266,6 +269,7 @@ char *get_token_type_name(int token_type)
                case T_DOUBLE_ARROW: return "T_DOUBLE_ARROW";
                case T_LIST: return "T_LIST";
                case T_ARRAY: return "T_ARRAY";
+               case T_CALLABLE: return "T_CALLABLE";
                case T_CLASS_C: return "T_CLASS_C";
                case T_METHOD_C: return "T_METHOD_C";
                case T_FUNC_C: return "T_FUNC_C";