> > 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. > > > 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 ? Are you kidding? he is one of the main authors of PHP7.. > > > 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 ? > > 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. > > Regards > > François > > > > > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > >
Best, Wei Dai