> On Jun 29, 2015, at 7:37 PM, Bob Weinand <bobw...@hotmail.com> wrote: > > Hey Anatol, > >> Am 29.06.2015 um 22:41 schrieb Anatol Belski <anatol....@belski.net>: >> >> Hi Bob, >> >>> -----Original Message----- >>> From: Bob Weinand [mailto:bobw...@hotmail.com] >>> Sent: Monday, June 29, 2015 6:44 PM >>> To: Dmitry Stogov >>> Cc: francois; Anatol Belski; Anatol Belski; PHP Internals >>> Subject: Re: [PHP-DEV] Improved zend_string API >>> >>> Hey, looks like I'm a bit late to the party, but I'd like to object against >>> the >>> accessor macros on zend_string. >>> >>> What does it help to replace very nice ->val, ->len etc. with macros? >>> >>> ZSTR_VAL(str)[ZSTR_LEN(str)] = 0; or str->val[str->len] = 0; >>> zend_string_set_len(str, ZSTR_LEN(str) - 2); or str->len -= 2; Also, that >>> particular >>> function suggests to me that the string is expanded if lengths don't match. >>> >>> I much prefer direct accessors which indicate a) no side-effects happening >>> here, >>> b) less functions to remember (you just look at the struct and know >>> everything >>> about it) and c) end up being more readable. >>> >>> Yes, I'm totally aware that when we ever want to change the API (I don't see >>> coming it in near future anyway), it could help having wrappers. But >>> wrappers >>> don't help against every API change… let's say for some reason we'd want to >>> go >>> back to the old char*/int; would wrappers help? no. (Yes, that's maybe a bad >>> example, but just trying to show that, while it has maybe a theoretical >>> gain, I >>> don't see a real practical benefit.) zend_string is really a core structure >>> and >>> extremely simple. Please don't trade simplicity for a small other benefit. >>> >>> Also, we still leave zend_string struct exposed (presumably for allowing >>> inlining). >>> At the point where we are now, many extension authors probably already are >>> also accessing zend_string directly. We're going to have a colorful mix of >>> code >>> using the APIs and not using it, which is the worst we can get now. >>> >>> To end up, I very much like unifying prefixes (ZSTR_*), but I strongly >>> dislike >>> hurting readability and consistency so much for such little benefit. >>> >> I can only express my background on accepting this patch. >> >> In first place, the names ZSTR_* are really speaking, like (z)end_(str)ing >> and the rest mirros the name of the actual member. That is better than >> STR_*. Or like IS_INTERNED vs ZSTR_IS_INTERNED, talking about what happens. >> With the set len function - yep, probably a bit misleading. >> >> Thinking also about the new foreach macros for hash or even >> zend_hash_num_elements symbol which has survived from PHP5 among others. >> Same here, access to one member encapsulated. Though direct accesses >> ->nNumOfElements is still here and there, where it's useful or no care >> taken. Just to name one analogue. A macro doesn't cost anything, while it >> does its job abstracting things. >> >> The PR is closed. It's not about forcing anyone to not to use ->val and >> alike (maybe indeed it is), but about what one calls application programming >> interface. aka API. ->val is not an API. For the outer codes it's probably >> the own responsibility on using the APIs vs direct access. >> >> Regards >> >> Anatol > > They're definitely speaking and as I said "I very much like unifying > prefixes". That's totally fine and not what I'm complaining about. > > Generally, I'm really just disliking ZSTR_LEN, ZSTR_VAL(), > zend_string_set_len() and zend_string_revert_hash(). > > Sure, but who wants to type that? nNumberOfElements? I don't feel like you > can remember that very well. oh… and wait. It's called nNumOfElements… See? > That's why we needed a wrapper here. > > Point here is that it doesn't abstract anything, it just renames it. It costs > the confusion it creates. Should I directly access it or not? There it was > directly accessed, but there not. If we'd done that, we should have done that > at the very beginning IMHO. Not now. > > And still, using a struct is an API. The members have a well defined meaning > what they do. The struct itself is an API, it is an interface giving you the > offset from base zend_string * address. Using "my_len = *((size_t*)((char > *)zend_string) + 16))" would be an example of not programming to the API. > That's what a struct provides. A layer of abstraction over the offset. Hence > it's already a level of abstraction. > > I'd like to urge you to not have two (used) APIs. And considering, that IMHO > the direct accessors are much more readable than the macros and currently > also much more widely used, I'd like to remove these 4 macros/inline > functions. > > Thanks, > Bob > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php >
I’m very much in agreement with Bob on the confusion that these macros create. Most of the source still uses zend_string->val or zend_string->len, while now a few places now use ZSTR_VAL(zend_string) and ZSTR_LEN(zend_string). Which am I suppose to use? Do you intend to change every occurrence of direct access to the struct members to use the macros instead? Regards, Aaron Piotrowski -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php