Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:92073 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 66396 invoked from network); 3 Apr 2016 01:17:41 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 3 Apr 2016 01:17:41 -0000 Authentication-Results: pb1.pair.com smtp.mail=mtkocak@gmail.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=mtkocak@gmail.com; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.217.174 as permitted sender) X-PHP-List-Original-Sender: mtkocak@gmail.com X-Host-Fingerprint: 209.85.217.174 mail-lb0-f174.google.com Received: from [209.85.217.174] ([209.85.217.174:33766] helo=mail-lb0-f174.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 82/05-29546-23F60075 for ; Sat, 02 Apr 2016 20:17:40 -0500 Received: by mail-lb0-f174.google.com with SMTP id u8so111303455lbk.0 for ; Sat, 02 Apr 2016 18:17:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:message-id:mime-version:subject:date:references:to:in-reply-to; bh=9ZiQAnu0sDFz4D+/NSQVhvFw14QZ1bJ/Si3g+ZCtX7E=; b=dlGYYm/QEuiMmijGAyW7pPwgKX6buZhTgprovOOYnddvE1Hb7oZgc9neSpZ01GXFY+ lCMI4XRZttKPrrPn17nUkCaHYvRZiaNuaTb0tPIm/IloL/rMIi+vC7FMslnFDP+KNAAv fWQI74xbNKMj8OI8Gx9nGx1MTfAGWQG1BeKMqpZpLHBPZdRc0CGuax0KRAQzUUhQaLyr 1oNRA12/2C9Q5G2CCaJaOwJYRaI3pDh0vZJVuFnEh8pb2U7Yig7yDiEzMHZQ4tXrhqi8 jRENTP+AOux/Ewjd52DudjEEkDBOMdRsdLXPtfZNWGGoKkqqxf0+pqKAlr+ySEJ4iq9c qD0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:message-id:mime-version:subject:date :references:to:in-reply-to; bh=9ZiQAnu0sDFz4D+/NSQVhvFw14QZ1bJ/Si3g+ZCtX7E=; b=M5wYhf2Tgoy9ubsXDTZ59a1mFFcr95FfGBzCbu2IugSXBDz23gI6sioBxbppdXKyoK I+j9Pra2KjglubR3raUrz02Jm+a0LL6bf04N2cVftHGAWfFx1OqwcQNO//k1reQNRDuN c4Mn/XPB9QKPafR/VN6ZXMNjiXHhT5Wa2a2NgLbo1FdlmnTMxwWHF6461ZCdcqJG780A fXRm+GkUNSD8u+aOWAwb8VIeNtTid/SDWz737C6odKfLf9SJr5f6IFR2rPtQSwTqvlr9 crosxg1fH8QBM1ItHa4jfbjZpKgq4zBqrYqyrztIpL+RflEBLHHhkCRWj72UcF8ODeGN sxUg== X-Gm-Message-State: AD7BkJI8JE55J5MyfLuyqj6QyMriOhO3sL8v+MqfL2lhObzLZN4UnGvZSdss3pa4F2PMcQ== X-Received: by 10.28.16.141 with SMTP id 135mr5273259wmq.67.1459646255129; Sat, 02 Apr 2016 18:17:35 -0700 (PDT) Received: from [10.0.0.3] (26.85.broadband11.iol.cz. [90.178.85.26]) by smtp.gmail.com with ESMTPSA id jk1sm19928729wjb.27.2016.04.02.18.17.33 (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 02 Apr 2016 18:17:33 -0700 (PDT) Content-Type: multipart/alternative; boundary="Apple-Mail=_F55C0ECE-60D1-4DF4-9B52-AA64D9D6AB9C" Message-ID: <63C58928-255D-41A1-9D6E-4773CF9DB356@gmail.com> Mime-Version: 1.0 (Mac OS X Mail 9.3 \(3124\)) Date: Sun, 3 Apr 2016 03:17:32 +0200 References: <9399032E-5BAA-4ABF-81AD-13716790D8DB@gmail.com> To: Nikita Popov , PHP internals In-Reply-To: X-Mailer: Apple Mail (2.3124) Subject: [PHP-DEV] Tests for null coalescing assignment operator From: mtkocak@gmail.com (Midori Kocak) --Apple-Mail=_F55C0ECE-60D1-4DF4-9B52-AA64D9D6AB9C Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Dear All, Based on the concerns I wrote some tests. Can you check those and give = feedback? Also, in ruby, $a ||=3D $b, the implementation is not equal to = $a =3D $a || $b, but is equal to $a || $a =3D $b; I am a little bit = confused, I am not entirely sure, but I guess this approach would solve = our problems. https://gist.github.com/midorikocak/abc9fd9b6ca30359d201bc859edba9ee = We can use these examples as the part of the new documentation and as a = guideline for implementation tests. Can you add also any extreme cases = that should raise errors to my test? Yours, Midori > On 25 Mar 2016, at 13:42, Nikita Popov wrote: >=20 > On Fri, Mar 25, 2016 at 11:59 AM, Midori Kocak > wrote: > Hi Everyone, >=20 > I think it's better idea to combine those two assignment operator = RFC=E2=80=99s. So I am going to close the current one and open ??=3D = with ?:=3D > What do you think? And we have to find better names. >=20 > Wishes, > Midori Kocak >=20 > I'd prefer to keep them separate, or at least keep their votes = separate. The ??=3D operator vote is currently unanimous at 24:0, while = the ?:=3D vote was closed at something like 9:2, so there clearly are = differences of opinion regarding these two operators. >=20 > I'll use this chance for some comments on the proposal. I can see the = general usefulness of ??=3D, but right now the RFC is severely = underspecified and I'm uncomfortable voting on it in it's current form = as so much will depend on the final implementation. So, what do I mean = by underspecified? >=20 > The only statement the RFC essentially makes is that $a ??=3D $b will = be the same as $a =3D $a ?? $b, for variable-expression $a and = expression $b. This statement, while a good high-level illustration, = does not explain the exact behavior of this operator. >=20 > For example, consider the expression $a[print 'X'] ??=3D $b. A simple = desugaring into $a[print 'X'] =3D $a[print 'X'] ?? $b will result in 'X' = being printed twice. However, this is not how all other existing = compound assignment operators behave: They will print X only once, as = the LHS is only evaluated once. I assume that ??=3D would behave the = same way. >=20 > However, with ??=3D the problem becomes more complicated. Let us = assume that $a is an ArrayAccess object and consider the expression = $a[0] ??=3D $b. Let us further assume that $x =3D $a->offsetGet(0) is = non-null. Will $a[0] ??=3D $b result in a call to $a->offsetSet(0, $x)? = This is what would normally happen with a compound assignment operator = and what would be implied by the desugaring $a[0] =3D $a[0] ?? $b. = However this assignment is not really necessary, as we're just = reassigning the same value. So, does the call happen or not? Is the = proper desugaring maybe if (!isset($a[0])) $a[0] =3D $b? >=20 > Let us now assume that $a is a recursive ArrayAccess object with = by-reference offsetGet() and consider the expression $a[0][1] ??=3D = expr. For a normal compound assignment operator, this would issue the = call sequence >=20 > $b =3D expr; > $x =3D& $a->offsetGet(0); > $y =3D $x->offsetGet(1); > $y OP=3D $b; > $x->offsetSet(1, $y); >=20 > Note that we only issue one offsetSet() at the end. We do not refetch = $x via $a->offsetGet(0). How would the same work with the ??=3D = operator? As the RHS is evaluated lazily, it is my opinion that only = performing the offsetSet() call without refetching $x beforehand would = violate PHP's indirection memory model. Additionally as ??=3D has to = fetch offsets in BP_VAR_IS mode, we likely wouldn't be able to write = them without refetching anymore. >=20 > So, what would be the desugared call sequence for $a[0][1] ??=3D expr? = Something like this? >=20 > if (!$a->offsetHas(0)) { > goto assign; > } > $x =3D $a->offsetGet(0); > if (x =3D=3D=3D null) { > goto assign; > } > if (!$x->offsetHas(0)) { > goto assign; > } > $y =3D $x->offsetGet(0); > if ($y =3D=3D=3D null) { > goto assign; > } > goto done; > assign: > $b =3D expr; > $x =3D& $a->offsetGet(0); > $x->offsetSet(1, $b); > done: >=20 > That would be some first thoughts on the issue, though I'm sure there = are more subtleties involved. I'd like to see the exact behavior of ??=3D = (and ?:=3D) specified. >=20 > I'm also pretty sure that writing a patch for this will not be = entirely easy. The combination of execute-once LHS side-effects and lazy = RHS execution does not translate well to PHP's VM constraints. >=20 > Regards, > Nikita --Apple-Mail=_F55C0ECE-60D1-4DF4-9B52-AA64D9D6AB9C--