I'm going to commit this, if nobody objects. Thanks. Dmitry.
On Mon, Dec 1, 2014 at 2:08 PM, Dmitry Stogov <dmi...@zend.com> wrote: > See the updated patch: > https://gist.github.com/dstogov/08b545de6bf113113f58 > it can be safely applied again and simplifies inheritance code (thanks to > Levi). > > The patch saves 60K (0.5%) of code segment, and make very slight speed > improvement (visible with callgrind) > All tests are passed. > > I think now the inheritance code is clear enough. > > Thanks. Dmitry. > > On Mon, Dec 1, 2014 at 11:02 AM, Dmitry Stogov <dmi...@zend.com> wrote: > >> Hi Levi, >> >> I understood, that you don't see a big problems with the patch. :) >> >> According to your suggestions, It's possible to do it in this way, but >> it's going to be slower, because it would require additional memory >> allocation, but I agree that duplicating logic in the code isn't good. >> It must be better to write something like the following (I didn't test >> it, but it'll work): >> >> I'll update the patch. >> >> Thanks. Dmitry. >> >> char *class_name; >> size_t class_name_len; >> >> if (fe->type == ZEND_INTERNAL_FUNCTION) { >> class_name = ((zend_internal_arg_info*)fe_ >> arg_info)->class_name; >> class_name_len = strlen(class_name); >> } else { >> class_name = fe_arg_info->class_name->val; >> class_name_len = fe_arg_info-> >> class_name->len; >> } >> >> if (class_name_len == sizeof("parent")-1 && >> !zend_binary_strcasecmp(class_name, "parent", sizeof("parent")-1, >> sizeof("parent")-1) && >> proto->common.scope) { >> fe_class_name = zend_string_copy(proto->common.scope->name); >> } else if (class_name_len == sizeof("self")-1 && >> !zend_binary_strcasecmp(class_name, "self", sizeof("self")-1, >> sizeof("self")-1) && >> fe->common.scope) { >> fe_class_name = zend_string_copy(fe->common.scope->name); >> } else { >> fe_class_name = class_name; >> } >> >> >> On Fri, Nov 28, 2014 at 11:19 PM, Levi Morrison <le...@php.net> wrote: >> >>> > Please review the patch >>> https://gist.github.com/dstogov/47a39aff37f0a6441ea0 >>> >>> Instead of duplicating logic in two places I'd rather grab the >>> relevant data first, then do the logic once: >>> >>> zend_string *class_name; >>> if (fe->type == ZEND_INTERNAL_FUNCTION) { >>> class_name = zend_string_init( >>> ((zend_internal_arg_info*)fe_arg_info)->class_name, >>> strlen(((zend_internal_arg_info*)fe_arg_info)->class_name), 0 >>> ); >>> } else { >>> class_name = zend_string_dup(fe_arg_info->class_name); >>> } >>> >>> if (!zend_string_equals_literal_ci(class_name, "parent") && >>> proto->common.scope) { >>> fe_class_name = zend_string_copy(proto->common.scope->name); >>> } else if (!zend_string_equals_literal_ci(class_name, "self") && >>> fe->common.scope) { >>> fe_class_name = zend_string_copy(fe->common.scope->name); >>> } else { >>> fe_class_name = class_name; >>> } >>> zend_string_release(class_name); >>> >> >> >