Hey: On Mon, Feb 2, 2015 at 3:35 PM, Anatol Belski <anatol....@belski.net> wrote: > Hi, > > On Mon, February 2, 2015 08:11, Xinchen Hui wrote: >> Hey: >> >> >> On Mon, Feb 2, 2015 at 2:51 PM, François Laupretre <franc...@tekwire.net> >> wrote: >> >>>> De : Xinchen Hui [mailto:larue...@php.net] >>>> we used to use lval of zval as a handle to access resource type.. >>>> >>>> but now, we introduced a new type IS_RESOURCE, which make the >>>> handle(id) sort of redundant . >>> >>> Wrong. The IS_RESOURCE type has nothing to do with PHP 7. Only >>> zend_resource is new. And handle is not redundant. >> of course it's a typo. I meant zend_resource >>> >>>> further more, the common usage when handling resource is like: >>>> >>>> if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &result, &offset) == >>>> FAILURE) { >>>> return; } >>>> ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL >>>> result", le_result); >>>> >>>> as you can see, we use "r" to receive a IS_RESOURCE type, that means, >>>> check the type in ZEND_FETCH_RESOURCE is overhead.. >>> >>> There's no overhead here. Zend_parse_parameters checks that received >>> arg is IS_RESOURCE. Fetch then checks that received resource is one of >>> the accepted resource types. Sorry to say that, but are you sure you >>> understand the difference between zval types and resource types ? >> ..... do you really read the FETCH_RESOURCE? >> >> >> ZEND_API void *zend_fetch_resource(zval *passed_id, int default_id, >> const char *resource_type_name, int *found_resource_type, int >> num_resource_types, ...) { >> int actual_resource_type; // void *resource; >> va_list resource_types; int i; zend_resource *res; const char *space; const >> char *class_name; >> >> if (default_id==-1) { /* use id */ if (!passed_id) { if >> (resource_type_name) { >> class_name = get_active_class_name(&space); zend_error(E_WARNING, >> "%s%s%s(): no %s resource >> supplied", class_name, space, get_active_function_name(), >> resource_type_name); } >> return NULL; } else if (Z_TYPE_P(passed_id) != IS_RESOURCE) { // < === what >> are this? if (resource_type_name) { class_name = >> get_active_class_name(&space); zend_error(E_WARNING, "%s%s%s(): supplied >> argument is not a valid %s resource", class_name, space, >> get_active_function_name(), resource_type_name); } >> return NULL; } >> >> >> >>> >>>> ZEND_API void *zend_fetch_resource(zval *passed_id, int default_id, >>>> const char *resource_type_name, int *found_resource_type, int >>>> num_resource_types, ...) >>>> >>>> we use va_args to passing resource type, that means, the rescue type >>>> arguments can not be passed by register but by stack.. which is a >>>> little low effiicient . >>> >>> What do you mean with 'rescue' type ? >>> >> expected resource_type >>> >>> Fetch is supposed to check for a variable number of possible resource >>> types. It could probably be restricted to 2 possible types as, >>> generally, it is the maximum (one for non-persistent, one for >>> persistent). But I am not sure the overhead of passing arg on the stack >>> justifies a change. Remember that id is searched in an array, which >>> takes probably much more time that pushing/popping one or two >>> arguments. >>> >>>> so, I'd like propose a zend_resource handling API cleanup.. >>>> >>>> 1. DROP ZEND_REGISTER_RESOURCE/FETCH_RESOURCE. >>>> >>>> >>>> 2. add : >>>> >>>> >>>> ZEND_API void *zend_fetch_resource(zend_resource *res, const >>>> char *resource_type_name, int resource_type); ZEND_API void >>>> *zend_fetch_resource2(zend_resource *res, const char >>>> *resource_type_name, int *found_type, int resource_type, int >>>> resource_type2); ZEND_API void *zend_fetch_resource_ex(zval *res, const >>>> char *resource_type_name, int resource_type); >>>> ZEND_API void *zend_fetch_resource2_ex(zval *res, const char >>>> *resource_type_name, int *found_type, int resource_type, int >>>> resource_type2); >>> >>> If you drop ZEND_REGISTER_RESOURCE, how do you register new resources ? >>> Or do you mean you don't register them any more ? But registering them >>> is mandatory if we want them to be freed when request ends. >>> >>>> furthermore, I'd like to discuss remove the handle in zend_resource >>>> struct.. >>>> >>>> it may breaks some usage (use resource as long/double/string) >>>> >>>> case IS_RESOURCE: { char buf[sizeof("Resource id #") + >>>> MAX_LENGTH_OF_LONG]; >>>> int len; >>>> >>>> len = snprintf(buf, sizeof(buf), "Resource id #" ZEND_LONG_FMT, >>>> (zend_long)Z_RES_HANDLE_P(op)); >>>> return zend_string_init(buf, len, 0); } >>>> >>> >>> OK. You want to remove resource registration. But resources don't work >>> this way (see >>> http://devzone.zend.com/446/extension-writing-part-iii-resources/). If >>> you remove the handle, you remove the whole zend_list API. >>> >>> The zend_resource struct is not a structure you may fill with random >>> data. Using the handle to store long/double/string is not a legitimate >>> usage. >> ....I think you don't understand what I am talking about. sorry >> >> > I was writing about it last year as well > http://marc.info/?l=php-internals&m=142006455308305&w=2 , slightly > different idea. Annd there is also a short piece of code to illustrate: > https://gist.github.com/weltling/9367db5e242ef7e60042 ... > > The integer resource looks like is needed at some places, so my suggestion > was to split zend_fetch_resource function like illustrated in the patch. > At 99% of places that integer link is just passed as -1, so then having it > be present always in the signature is just a waste of "resources" :) for now, we still keep the handle which could be accessed by Z_RES_HANDLE_P
I just talked about remove it later maybe. thanks > > Regards > > Anatol > -- Xinchen Hui @Laruence http://www.laruence.com/ -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php