Hi Nikita,

I wouldn't object, but I ask you to wait a bit (at least till New Year).
May be we would come back with proposal of some kind of scalar type hinting.
Also, currently, zend_parse_parameters() takes significant time (about 4%
on wordpress-3.6.1 home page) and may be it makes sense to use some chipper
parameter parsing mechanism.

Thanks. Dmitry.


On Thu, Nov 28, 2013 at 12:06 PM, Nikita Popov <nikita....@gmail.com> wrote:

> On Thu, Nov 28, 2013 at 8:44 AM, Dmitry Stogov <dmi...@php.net> wrote:
>
>> Commit:    57c1335fec064d8022d3d86b01ceb4eea0a027a7
>> Author:    Dmitry Stogov <dmi...@zend.com>         Thu, 28 Nov 2013
>> 11:44:14 +0400
>> Parents:   fcb98cbce8b85326763f352cb789581b55d85ec8
>> Branches:  PHP-5.6 master
>>
>> Link:
>> http://git.php.net/?p=php-src.git;a=commitdiff;h=57c1335fec064d8022d3d86b01ceb4eea0a027a7
>>
>> Log:
>> Don't check argument types for internal functions without type hinting
>>
>> Changed paths:
>>   M  Zend/zend_API.c
>>   M  Zend/zend_compile.h
>>   M  Zend/zend_vm_def.h
>>   M  Zend/zend_vm_execute.h
>>
>>
>> Diff:
>> diff --git a/Zend/zend_API.c b/Zend/zend_API.c
>> index 56b1fda..23729ea 100644
>> --- a/Zend/zend_API.c
>> +++ b/Zend/zend_API.c
>> @@ -2138,6 +2138,19 @@ ZEND_API int
>> zend_register_functions(zend_class_entry *scope, const zend_functio
>>                         str_efree(lowercase_name);
>>                         break;
>>                 }
>> +
>> +               /* If types of arguments have to be checked */
>> +               if (reg_function->common.arg_info &&
>> reg_function->common.num_args) {
>> +                       int i;
>> +                       for (i = 0; i < reg_function->common.num_args;
>> i++) {
>> +                               if
>> (reg_function->common.arg_info[i].class_name ||
>> +
>> reg_function->common.arg_info[i].type_hint) {
>> +                                   reg_function->common.fn_flags |=
>> ZEND_ACC_HAS_TYPE_HINTS;
>> +                                       break;
>> +                               }
>> +                       }
>> +               }
>> +
>>                 if (scope) {
>>                         /* Look for ctor, dtor, clone
>>                          * If it's an old-style constructor, store it
>> only if we don't have
>> diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h
>> index 23c5b22..5e28488 100644
>> --- a/Zend/zend_compile.h
>> +++ b/Zend/zend_compile.h
>> @@ -212,6 +212,9 @@ typedef struct _zend_try_catch_element {
>>  #define ZEND_ACC_RETURN_REFERENCE              0x4000000
>>  #define ZEND_ACC_DONE_PASS_TWO                 0x8000000
>>
>> +/* function has arguments with type hinting */
>> +#define ZEND_ACC_HAS_TYPE_HINTS                        0x10000000
>> +
>>  char *zend_visibility_string(zend_uint fn_flags);
>>
>>
>> diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
>> index 45cfe90..6eca6d0 100644
>> --- a/Zend/zend_vm_def.h
>> +++ b/Zend/zend_vm_def.h
>> @@ -1951,7 +1951,7 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY,
>> ANY)
>>         LOAD_OPLINE();
>>
>>         if (fbc->type == ZEND_INTERNAL_FUNCTION) {
>> -               if (fbc->common.arg_info) {
>> +               if (fbc->common.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) {
>>                         zend_uint i=0;
>>                         zval **p = (zval**)EX(function_state).arguments;
>>                         ulong arg_count = opline->extended_value;
>> diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
>> index 107e460..dcb1183 100644
>> --- a/Zend/zend_vm_execute.h
>> +++ b/Zend/zend_vm_execute.h
>> @@ -530,7 +530,7 @@ static int ZEND_FASTCALL
>> zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_AR
>>         LOAD_OPLINE();
>>
>>         if (fbc->type == ZEND_INTERNAL_FUNCTION) {
>> -               if (fbc->common.arg_info) {
>> +               if (fbc->common.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) {
>>                         zend_uint i=0;
>>                         zval **p = (zval**)EX(function_state).arguments;
>>                         ulong arg_count = opline->extended_value;
>>
>
> I wonder whether we should drop arginfo type checking for internal
> functions altogether. Normally the checking is handled by zpp and doing the
> same checks in arginfo is just a perf loss. To avoid that nearly no
> internal functions specify type hints in arginfo. They are usually written
> commented-outed next to a generic arg (e.g. see
> http://lxr.php.net/xref/PHP_TRUNK/ext/standard/basic_functions.c#218).
> Disabling arginfo checks for internal functions would allow us to have
> better reflection information about argument types without incurring a perf
> loss.
>
> Nikita
>

Reply via email to