Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:81280 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 84086 invoked from network); 28 Jan 2015 04:59:23 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 28 Jan 2015 04:59:23 -0000 Authentication-Results: pb1.pair.com header.from=dmitry@zend.com; sender-id=pass Authentication-Results: pb1.pair.com smtp.mail=dmitry@zend.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain zend.com designates 209.85.220.176 as permitted sender) X-PHP-List-Original-Sender: dmitry@zend.com X-Host-Fingerprint: 209.85.220.176 mail-vc0-f176.google.com Received: from [209.85.220.176] ([209.85.220.176:34351] helo=mail-vc0-f176.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 47/16-45774-7AC68C45 for ; Tue, 27 Jan 2015 23:59:23 -0500 Received: by mail-vc0-f176.google.com with SMTP id kv7so6137822vcb.7 for ; Tue, 27 Jan 2015 20:59:16 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=Q9shROuEgUxaeJdwbWy+nRrqTGMjvzvaLWhdq4lJtdY=; b=Yq17MWYUxeeQfOBeK7M2uUMQ83g7cTuyECOtCVCWRrj0xVt+OrK2Ecrpudd2gOU9Nv cUqDtwtRcah7KSl95fQyPSD5s+SzsAwyll0naFScJ0vp/9Xe06iIPtmjtvUC8gsyiOsn lcXDXgsfwbjxHnjZrF9FBUKI/WCuwskU8RXySuT53cTExr1FA2M8KaxiKjamx5seFNSj VGhbp1m3skjaDv1idxbOY8UI4udnvMY6KyxhKWU2wBVeyyK7l62Di6mPk3K+xc+HiFER V6OrU6m5ZCaAHBFV9ilhLBDkquYWFpJnW3HuCq5WUN/KqW6WIQHNpVOiQJUmasue33hm J65w== X-Gm-Message-State: ALoCoQmH4qcc0U1z9W+a/gK4dTwvyE5HNUfOKhJY8pdVePIquY0dI/R70Z654/lr88NRDAZtRIBhjYgWDCnTLIjKo3SlbnsMKHxekM7yBSM1qdZEhq9JFC+43YcWYnBkGHHiCdE4kkCtY4I4py5ijlPXUUqARpcrpg== MIME-Version: 1.0 X-Received: by 10.52.37.230 with SMTP id b6mr774139vdk.49.1422421156346; Tue, 27 Jan 2015 20:59:16 -0800 (PST) Received: by 10.52.26.40 with HTTP; Tue, 27 Jan 2015 20:59:16 -0800 (PST) In-Reply-To: References: <20150122103807.DD8255F8EE@mx.zeyon.net> Date: Wed, 28 Jan 2015 08:59:16 +0400 Message-ID: To: Nikita Popov Cc: Benjamin Coutu , Xinchen Hui , "internals@lists.php.net" Content-Type: multipart/alternative; boundary=bcaec51d2104bed518050daf3b9d Subject: Re: [PHP-DEV] Improvements to for-each implementation From: dmitry@zend.com (Dmitry Stogov) --bcaec51d2104bed518050daf3b9d Content-Type: text/plain; charset=UTF-8 I've created a branch and pull request for easier collaboration and tracking. https://github.com/php/php-src/pull/1034 It's the same diff I published yesterday. Nothing changed or added yet. Thanks. Dmitry. On Wed, Jan 28, 2015 at 1:36 AM, Nikita Popov wrote: > On Tue, Jan 27, 2015 at 5:55 PM, Dmitry Stogov wrote: > >> Hi, >> >> I'm working on a PoC, implementing the proposed behavior - >> https://gist.github.com/dstogov/a311e8b0b2cabee4dab4 >> >> Only few PHPT tests had to be changed to confirm new behavior and >> actually they started to behave as HHVM. >> 2 tests are still unfixed XFAILed. Foreach by reference is still need to >> be improved to support different array modifications. >> >> The patch makes ~1% improvement on Wordpress-3.6 (saving duplication and >> destruction of 200 arrays on each request) >> >> Thanks. Dmitry. >> > > I quickly looked over the patch, some notes: > > * 171: Can directly use GET_OP1_ZVAL_PTR_DEREF > * For iterator failures (exception) you use FREE_OP1_IF_VAR(). Is this > enough? If the object is a TMP_VAR, don't we have to free it as well? > * For objects it will still be possible to modify the hashtable during > iteration even in the _R case, correct? I assume we just don't care about > this edge case. > * 315: In RESET_RW you now always create a reference for VAR|CV operands. > However for the get_iterator case we don't need this, right? > * 328: In the non VAR|CV case SEPARTE_ARRAY is not used. As we're going to > change the IAP, this is probably necessary in this case as well. > * For RW iterator failures FREE_OP1_VAR_PTR() is used. This probably > leaks in the TMP case. (Same for the "invalid argument" case.) > > What concerns me a bit is the new FETCH_RW implementation, because it no > longer checks the internal pointer against the external one. This > effectively means that foreach by reference behavior will be influenced a > lot by details of the hashtable implementation. An example: > > $array = [0, 1, 2, 3, 4, 5, 6, 7]; > unset($array[0], $array[1], $array[2], $array[3]); > foreach ($array as &$ref) { > var_dump($ref); > //$array[42] = 42; > } > > Without the commented line this will just print the numbers 4, 5, 6, 7. If > you uncomment the line it will only print 4. (Because the append caused a > rehash and arData was compacted, so the position now points past all > elements). The previous output would have been 4, 5, 6, 7, 42, which is > closer to what you would expect. Maybe better to keep the pos != > nInternalPointer code? > > Thanks, > Nikita > --bcaec51d2104bed518050daf3b9d--