derick Tue, 19 Oct 2010 10:42:38 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=304509
Log: - Strip out the typehint *checks* only. They are still parsed, and they are still accessible through the reflection API. Changed paths: U php/php-src/trunk/NEWS D php/php-src/trunk/Zend/tests/hint/param_type_hint_001.phpt D php/php-src/trunk/Zend/tests/hint/param_type_hint_003.phpt D php/php-src/trunk/Zend/tests/hint/param_type_hint_004.phpt D php/php-src/trunk/Zend/tests/hint/param_type_hint_005.phpt D php/php-src/trunk/Zend/tests/hint/param_type_hint_011.phpt D php/php-src/trunk/Zend/tests/hint/param_type_hint_012.phpt D php/php-src/trunk/Zend/tests/hint/param_type_hint_013.phpt D php/php-src/trunk/Zend/tests/hint/param_type_hint_014.phpt D php/php-src/trunk/Zend/tests/hint/param_type_hint_015.phpt D php/php-src/trunk/Zend/tests/hint/param_type_hint_019.phpt D php/php-src/trunk/Zend/tests/hint/param_type_hint_021.phpt U php/php-src/trunk/Zend/zend_execute.c U php/php-src/trunk/Zend/zend_execute.h
Modified: php/php-src/trunk/NEWS =================================================================== --- php/php-src/trunk/NEWS 2010-10-19 10:16:58 UTC (rev 304508) +++ php/php-src/trunk/NEWS 2010-10-19 10:42:38 UTC (rev 304509) @@ -56,7 +56,7 @@ FR #51815. (Pierrick) - Added iterator support in MySQLi. mysqli_result implements Traversable. (Andrey, Johannes) -- Added scalar typehinting. (Ilia, Derick) +- Added scalar typehints to the parser and the reflection API. (Ilia, Derick) - Added support for JSON_NUMERIC_CHECK option in json_encode() that converts numeric strings to integers. (Ilia) - Added support for object references in recursive serialize() calls. FR #36424. Deleted: php/php-src/trunk/Zend/tests/hint/param_type_hint_001.phpt =================================================================== --- php/php-src/trunk/Zend/tests/hint/param_type_hint_001.phpt 2010-10-19 10:16:58 UTC (rev 304508) +++ php/php-src/trunk/Zend/tests/hint/param_type_hint_001.phpt 2010-10-19 10:42:38 UTC (rev 304509) @@ -1,38 +0,0 @@ ---TEST-- -Parameter type hint - Testing integer hint ---FILE-- -<?php - -function test_int($x, int $a = 1) { -} - -test_int(1); -print "Ok\n"; - -test_int('1211'); -print "Ok\n"; - -test_int(null); -print "Ok\n"; - -test_int(1, 1); -print "Ok\n"; - -test_int(null, '1211'); -print "Ok\n"; - -?> ---EXPECTF-- -Ok -Ok -Ok -Ok - -Catchable fatal error: Argument 2 passed to test_int() must be of the type integer, string given, called in %s on line %d and defined in %s on line %d ---UEXPECTF-- -Ok -Ok -Ok -Ok - -Catchable fatal error: Argument 2 passed to test_int() must be of the type integer, Unicode string given, called in %s on line %d and defined in %s on line %d Deleted: php/php-src/trunk/Zend/tests/hint/param_type_hint_003.phpt =================================================================== --- php/php-src/trunk/Zend/tests/hint/param_type_hint_003.phpt 2010-10-19 10:16:58 UTC (rev 304508) +++ php/php-src/trunk/Zend/tests/hint/param_type_hint_003.phpt 2010-10-19 10:42:38 UTC (rev 304509) @@ -1,16 +0,0 @@ ---TEST-- -Parameter type hint - Wrong parameter for integer ---FILE-- -<?php - -function test_int(int $a) { - echo $a, "\n"; -} - -test_int('+1'); - -?> ---EXPECTF-- -Catchable fatal error: Argument 1 passed to test_int() must be of the type integer, string given, called in %s on line %d and defined in %s on line %d ---UEXPECTF-- -Catchable fatal error: Argument 1 passed to test_int() must be of the type integer, Unicode string given, called in %s on line %d and defined in %s on line %d Deleted: php/php-src/trunk/Zend/tests/hint/param_type_hint_004.phpt =================================================================== --- php/php-src/trunk/Zend/tests/hint/param_type_hint_004.phpt 2010-10-19 10:16:58 UTC (rev 304508) +++ php/php-src/trunk/Zend/tests/hint/param_type_hint_004.phpt 2010-10-19 10:42:38 UTC (rev 304509) @@ -1,16 +0,0 @@ ---TEST-- -Parameter type hint - Wrong parameter for double ---FILE-- -<?php - -function test_double(real $a) { - echo $a, "\n"; -} - -test_double('+1.1'); - -?> ---EXPECTF-- -Catchable fatal error: Argument 1 passed to test_double() must be of the type double, string given, called in %s on line %d and defined in %s on line %d ---UEXPECTF-- -Catchable fatal error: Argument 1 passed to test_double() must be of the type double, Unicode string given, called in %s on line %d and defined in %s on line %d Deleted: php/php-src/trunk/Zend/tests/hint/param_type_hint_005.phpt =================================================================== --- php/php-src/trunk/Zend/tests/hint/param_type_hint_005.phpt 2010-10-19 10:16:58 UTC (rev 304508) +++ php/php-src/trunk/Zend/tests/hint/param_type_hint_005.phpt 2010-10-19 10:42:38 UTC (rev 304509) @@ -1,23 +0,0 @@ ---TEST-- -Parameter type hint - Wrong parameter for string ---FILE-- -<?php - -function test_str(string $a) { - echo $a, "\n"; -} - -test_str('+1.1'); -test_str('-.1'); -test_str('11213111112321312'); -test_str(''); -test_str(null); - -?> ---EXPECTF-- -+1.1 --.1 -11213111112321312 - - -Catchable fatal error: Argument 1 passed to test_str() must be of the type string, null given, called in %s on line %d and defined in %s on line %d Deleted: php/php-src/trunk/Zend/tests/hint/param_type_hint_011.phpt =================================================================== --- php/php-src/trunk/Zend/tests/hint/param_type_hint_011.phpt 2010-10-19 10:16:58 UTC (rev 304508) +++ php/php-src/trunk/Zend/tests/hint/param_type_hint_011.phpt 2010-10-19 10:42:38 UTC (rev 304509) @@ -1,15 +0,0 @@ ---TEST-- -Parameter type hint - Testing with undefined variable ---FILE-- -<?php - -function test(string $a) { -} - -test($x); - -?> ---EXPECTF-- -Notice: Undefined variable: x in %s on line %d - -Catchable fatal error: Argument 1 passed to test() must be of the type string, null given, called in %s on line %d and defined in %s on line %d Deleted: php/php-src/trunk/Zend/tests/hint/param_type_hint_012.phpt =================================================================== --- php/php-src/trunk/Zend/tests/hint/param_type_hint_012.phpt 2010-10-19 10:16:58 UTC (rev 304508) +++ php/php-src/trunk/Zend/tests/hint/param_type_hint_012.phpt 2010-10-19 10:42:38 UTC (rev 304509) @@ -1,18 +0,0 @@ ---TEST-- -Parameter type hint - Testing with lambda function ---FILE-- -<?php - -$test = create_function('integer $i', 'return $i + 1;'); -var_dump($test(1)); -var_dump($test('foo')); - -?> ---EXPECTF-- -int(2) - -Catchable fatal error: Argument 1 passed to __lambda_func() must be of the type integer, string given, called in %s on line %d and defined in %s(%d) : runtime-created function on line %d ---UEXPECTF-- -int(2) - -Catchable fatal error: Argument 1 passed to __lambda_func() must be of the type integer, Unicode string given, called in %s on line %d and defined in %s(%d) : runtime-created function on line %d Deleted: php/php-src/trunk/Zend/tests/hint/param_type_hint_013.phpt =================================================================== --- php/php-src/trunk/Zend/tests/hint/param_type_hint_013.phpt 2010-10-19 10:16:58 UTC (rev 304508) +++ php/php-src/trunk/Zend/tests/hint/param_type_hint_013.phpt 2010-10-19 10:42:38 UTC (rev 304509) @@ -1,16 +0,0 @@ ---TEST-- -Parameter type hint - Testing with lambda function using 2 parameters ---FILE-- -<?php - -$test = create_function('integer $i, string $j', 'return $i + $j;'); -var_dump($test(1, 'foo')); -var_dump($test(1, '1')); -var_dump($test(1, NULL)); - -?> ---EXPECTF-- -int(1) -int(2) - -Catchable fatal error: Argument 2 passed to __lambda_func() must be of the type string, null given, called in %s on line %d and defined in %s(%d) : runtime-created function on line %d Deleted: php/php-src/trunk/Zend/tests/hint/param_type_hint_014.phpt =================================================================== --- php/php-src/trunk/Zend/tests/hint/param_type_hint_014.phpt 2010-10-19 10:16:58 UTC (rev 304508) +++ php/php-src/trunk/Zend/tests/hint/param_type_hint_014.phpt 2010-10-19 10:42:38 UTC (rev 304509) @@ -1,16 +0,0 @@ ---TEST-- -Parameter type hint - Testing in function inside function ---FILE-- -<?php - -function a() { - function b(real $c) { - } - return b(1); -} - -a(); - -?> ---EXPECTF-- -Catchable fatal error: Argument 1 passed to b() must be of the type double, integer given, called in %s on line %d and defined in %s on line %d Deleted: php/php-src/trunk/Zend/tests/hint/param_type_hint_015.phpt =================================================================== --- php/php-src/trunk/Zend/tests/hint/param_type_hint_015.phpt 2010-10-19 10:16:58 UTC (rev 304508) +++ php/php-src/trunk/Zend/tests/hint/param_type_hint_015.phpt 2010-10-19 10:42:38 UTC (rev 304509) @@ -1,19 +0,0 @@ ---TEST-- -Parameter type hint - Testing with call_user_func() ---FILE-- -<?php - -function test(bool $b) { - print "ok\n"; -} - -call_user_func('test', true); -call_user_func('test', false); -call_user_func('test', NULL); - -?> ---EXPECTF-- -ok -ok - -Catchable fatal error: Argument 1 passed to test() must be of the type boolean, null given in %s on line %d Deleted: php/php-src/trunk/Zend/tests/hint/param_type_hint_019.phpt =================================================================== --- php/php-src/trunk/Zend/tests/hint/param_type_hint_019.phpt 2010-10-19 10:16:58 UTC (rev 304508) +++ php/php-src/trunk/Zend/tests/hint/param_type_hint_019.phpt 2010-10-19 10:42:38 UTC (rev 304509) @@ -1,37 +0,0 @@ ---TEST-- -Parameter type hint - scalar type hints ---FILE-- -<?php - -function x($error, $msg) { var_dump($msg); } -set_error_handler('x', E_RECOVERABLE_ERROR); - -function foo(scalar $param) { var_dump($param); } - -foo(1); -foo(true); -foo(NULL); -foo(array(1)); -foo("foo"); -foo(111.222); -foo(new Stdclass); -foo(tmpfile()); - -?> ---EXPECTF-- -int(1) -bool(true) -string(%d) "Argument 1 passed to foo() must be of the type scalar, null given, called in %s on line %d and defined" -NULL -string(%d) "Argument 1 passed to foo() must be of the type scalar, array given, called in %s on line %d and defined" -array(1) { - [0]=> - int(1) -} -string(3) "foo" -float(111.222) -string(%d) "Argument 1 passed to foo() must be of the type scalar, object given, called in %s on line %d and defined" -object(stdClass)#1 (0) { -} -string(%d) "Argument 1 passed to foo() must be of the type scalar, resource given, called in %s on line %d and defined" -resource(4) of type (stream) Deleted: php/php-src/trunk/Zend/tests/hint/param_type_hint_021.phpt =================================================================== --- php/php-src/trunk/Zend/tests/hint/param_type_hint_021.phpt 2010-10-19 10:16:58 UTC (rev 304508) +++ php/php-src/trunk/Zend/tests/hint/param_type_hint_021.phpt 2010-10-19 10:42:38 UTC (rev 304509) @@ -1,46 +0,0 @@ ---TEST-- -Parameter type hint - numeric type hints ---FILE-- -<?php - -function x($error, $msg) { var_dump($msg); } -set_error_handler('x', E_RECOVERABLE_ERROR); - -function foo(numeric $param) { var_dump($param); } - -foo(1); -foo(true); -foo(NULL); -foo(array(1)); -foo("foo"); -foo("123.33"); -foo("123"); -foo(""); -foo(111.222); -foo(new Stdclass); -foo(tmpfile()); - -?> ---EXPECTF-- -int(1) -string(%d) "Argument 1 passed to foo() must be of the type numeric, boolean given, called in %s on line %d and defined" -bool(true) -string(%d) "Argument 1 passed to foo() must be of the type numeric, null given, called in %s on line %d and defined" -NULL -string(%d) "Argument 1 passed to foo() must be of the type numeric, array given, called in %s on line %d and defined" -array(1) { - [0]=> - int(1) -} -string(%d) "Argument 1 passed to foo() must be of the type numeric, string given, called in %s on line %d and defined" -string(3) "foo" -string(6) "123.33" -string(3) "123" -string(%d) "Argument 1 passed to foo() must be of the type numeric, string given, called in %s on line %d and defined" -string(0) "" -float(111.222) -string(%d) "Argument 1 passed to foo() must be of the type numeric, object given, called in %s on line %d and defined" -object(stdClass)#1 (0) { -} -string(%d) "Argument 1 passed to foo() must be of the type numeric, resource given, called in %s on line %d and defined" -resource(4) of type (stream) Modified: php/php-src/trunk/Zend/zend_execute.c =================================================================== --- php/php-src/trunk/Zend/zend_execute.c 2010-10-19 10:16:58 UTC (rev 304508) +++ php/php-src/trunk/Zend/zend_execute.c 2010-10-19 10:42:38 UTC (rev 304509) @@ -577,7 +577,7 @@ } } -static inline char * zend_verify_arg_class_kind(const zend_arg_info *cur_arg_info, ulong fetch_type, const char **class_name, zend_class_entry **pce TSRMLS_DC) +ZEND_API char * zend_verify_arg_class_kind(const zend_arg_info *cur_arg_info, ulong fetch_type, const char **class_name, zend_class_entry **pce TSRMLS_DC) { *pce = zend_fetch_class(cur_arg_info->class_name, cur_arg_info->class_name_len, (fetch_type | ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD) TSRMLS_CC); @@ -589,7 +589,7 @@ } } -static inline int zend_verify_arg_error(const zend_function *zf, zend_uint arg_num, const char *need_msg, const char *need_kind, const char *given_msg, char *given_kind TSRMLS_DC) +ZEND_API int zend_verify_arg_error(int error_type, const zend_function *zf, zend_uint arg_num, const char *need_msg, const char *need_kind, const char *given_msg, char *given_kind TSRMLS_DC) { zend_execute_data *ptr = EG(current_execute_data)->prev_execute_data; char *fname = zf->common.function_name; @@ -605,9 +605,9 @@ } if (ptr && ptr->op_array) { - zend_error(E_RECOVERABLE_ERROR, "Argument %d passed to %s%s%s() must %s%s, %s%s given, called in %s on line %d and defined", arg_num, fclass, fsep, fname, need_msg, need_kind, given_msg, given_kind, ptr->op_array->filename, ptr->opline->lineno); + zend_error(error_type, "Argument %d passed to %s%s%s() must %s%s, %s%s given, called in %s on line %d and defined", arg_num, fclass, fsep, fname, need_msg, need_kind, given_msg, given_kind, ptr->op_array->filename, ptr->opline->lineno); } else { - zend_error(E_RECOVERABLE_ERROR, "Argument %d passed to %s%s%s() must %s%s, %s%s given", arg_num, fclass, fsep, fname, need_msg, need_kind, given_msg, given_kind); + zend_error(error_type, "Argument %d passed to %s%s%s() must %s%s, %s%s given", arg_num, fclass, fsep, fname, need_msg, need_kind, given_msg, given_kind); } return 0; } @@ -630,44 +630,25 @@ if (!arg) { need_msg = zend_verify_arg_class_kind(cur_arg_info, fetch_type, &class_name, &ce TSRMLS_CC); - return zend_verify_arg_error(zf, arg_num, need_msg, class_name, "none", "" TSRMLS_CC); + return zend_verify_arg_error(E_RECOVERABLE_ERROR, zf, arg_num, need_msg, class_name, "none", "" TSRMLS_CC); } if (Z_TYPE_P(arg) == IS_OBJECT) { need_msg = zend_verify_arg_class_kind(cur_arg_info, fetch_type, &class_name, &ce TSRMLS_CC); if (!ce || !instanceof_function(Z_OBJCE_P(arg), ce TSRMLS_CC)) { - return zend_verify_arg_error(zf, arg_num, need_msg, class_name, "instance of ", Z_OBJCE_P(arg)->name TSRMLS_CC); + return zend_verify_arg_error(E_RECOVERABLE_ERROR, zf, arg_num, need_msg, class_name, "instance of ", Z_OBJCE_P(arg)->name TSRMLS_CC); } } else if (Z_TYPE_P(arg) != IS_NULL || !cur_arg_info->allow_null) { need_msg = zend_verify_arg_class_kind(cur_arg_info, fetch_type, &class_name, &ce TSRMLS_CC); - return zend_verify_arg_error(zf, arg_num, need_msg, class_name, zend_zval_type_name(arg), "" 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) { + } else if (cur_arg_info->type_hint && cur_arg_info->type_hint == IS_ARRAY) { if (!arg) { - return zend_verify_arg_error(zf, arg_num, "be of the type ", zend_get_type_by_const(cur_arg_info->type_hint), "none", "" TSRMLS_CC); + return zend_verify_arg_error(E_RECOVERABLE_ERROR, zf, arg_num, "be of the type array", "", "none", "" TSRMLS_CC); } - /* existing type already matches the hint or forced type */ - if (Z_TYPE_P(arg) == cur_arg_info->type_hint) { - return 1; + 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); } - - /* NULL type given, check if parameter is optional */ - if (Z_TYPE_P(arg) == IS_NULL && cur_arg_info->allow_null) { - return 1; - } - - if (cur_arg_info->type_hint == IS_SCALAR && Z_TYPE_P(arg) != IS_NULL && Z_TYPE_P(arg) != IS_ARRAY && Z_TYPE_P(arg) != IS_OBJECT && Z_TYPE_P(arg) != IS_RESOURCE) { - return 1; - } - - if (cur_arg_info->type_hint == IS_NUMERIC && ( - (Z_TYPE_P(arg) == IS_LONG || Z_TYPE_P(arg) == IS_DOUBLE) - || (Z_TYPE_P(arg) == IS_STRING && is_numeric_string(Z_STRVAL_P(arg), Z_STRLEN_P(arg), NULL, NULL, 0)) - )) { - return 1; - } - - return zend_verify_arg_error(zf, arg_num, "be of the type ", zend_get_type_by_const(cur_arg_info->type_hint), "", zend_zval_type_name(arg) TSRMLS_CC); } return 1; } Modified: php/php-src/trunk/Zend/zend_execute.h =================================================================== --- php/php-src/trunk/Zend/zend_execute.h 2010-10-19 10:16:58 UTC (rev 304508) +++ php/php-src/trunk/Zend/zend_execute.h 2010-10-19 10:42:38 UTC (rev 304509) @@ -77,6 +77,9 @@ ZEND_API int zend_eval_string_ex(char *str, zval *retval_ptr, char *string_name, int handle_exceptions TSRMLS_DC); ZEND_API int zend_eval_stringl_ex(char *str, int str_len, zval *retval_ptr, char *string_name, int handle_exceptions TSRMLS_DC); +ZEND_API char * zend_verify_arg_class_kind(const zend_arg_info *cur_arg_info, ulong fetch_type, const char **class_name, zend_class_entry **pce TSRMLS_DC); +ZEND_API int zend_verify_arg_error(int error_type, const zend_function *zf, zend_uint arg_num, const char *need_msg, const char *need_kind, const char *given_msg, char *given_kind TSRMLS_DC); + static zend_always_inline void i_zval_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC) { if (!Z_DELREF_P(zval_ptr)) {
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php