Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:92079 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 11111 invoked from network); 3 Apr 2016 16:17:23 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 3 Apr 2016 16:17:23 -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.178 as permitted sender) X-PHP-List-Original-Sender: mtkocak@gmail.com X-Host-Fingerprint: 209.85.217.178 mail-lb0-f178.google.com Received: from [209.85.217.178] ([209.85.217.178:35805] helo=mail-lb0-f178.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id CE/B9-29546-21241075 for ; Sun, 03 Apr 2016 12:17:23 -0400 Received: by mail-lb0-f178.google.com with SMTP id bc4so127194685lbc.2 for ; Sun, 03 Apr 2016 09:17:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:subject:from:in-reply-to:date:cc:message-id:references :to; bh=e2A1Hwc7pi0+w9OX9zNpXvbH+fG8WH3F08dFzu28qKo=; b=u9NKecfqBKplEObXStZG3v8cSGSEkZw6iXDOmAhOUd3N7Oo56s5WeNjDryo6cQ8I00 HrTDl7F11B+Z3kGuPX8BxLi3ffU4qQ9aEkpKYuJi4EMcewSxCQuv9LC595O/FMWg3PPn M6Hbp6GjyHCDxyqB9c/qCuCT6XX8biqyug6MyDB9IE5n8/Ul4T26flf4q0b8t8MFzKgW lfsxFG3Cj3hUinztgQ8vR+MMCZsQOt+v7h7W0tm+4ho2iUTYSpk79rx9Y8y4YGq+7t29 azZNbLra0RL8M6Zl1fFY9s7GW+VnGSmJwOGULHwkbT0STB9BQwUGQ7uVFrJ8agSA8Uy/ I1qQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:subject:from:in-reply-to:date:cc :message-id:references:to; bh=e2A1Hwc7pi0+w9OX9zNpXvbH+fG8WH3F08dFzu28qKo=; b=PAyMfOnz/1bn5VPBysxuL7dMcE9TFlOeCcxEmF3vFgI0ZYAPzpd5K5ICT+gic2Y3Si uUijYACnvhYgQnseVqFzyAFPL5RyxIJ8Vxwsq81x5kXtTzcGaNo3QeWKvsVNiRK38WqA k5s1edyuS/zGhaeXDw1lPbqqGNcX82KBfeCVrPucZSs/JrFNLqWaA1pcGeM6W32iL3KW VvkWpWxorb+C1Q/kyZhF4klQLFR64857wZqYwBS8NF/AokryUfvSucy4nOASduqWs0NQ 3Eh6vzndccETaukYw0vVRPxQwd/8IwpprRJ83/Ph/hFtwJVJ/m+fwziJXEscHz9caBfW 2emw== X-Gm-Message-State: AD7BkJKLqTaLRQh0Qy93XmIfhhMehfmtrSUeZptXAwAdNedWs6sBakOm/Aub/WFYkPM4pw== X-Received: by 10.28.188.5 with SMTP id m5mr7886178wmf.35.1459700240239; Sun, 03 Apr 2016 09:17:20 -0700 (PDT) Received: from [10.0.0.3] (26.85.broadband11.iol.cz. [90.178.85.26]) by smtp.gmail.com with ESMTPSA id i5sm24419756wja.23.2016.04.03.09.17.18 (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 03 Apr 2016 09:17:19 -0700 (PDT) Content-Type: multipart/alternative; boundary="Apple-Mail=_869576F1-7288-40FC-9C78-930C5FCE92F6" Mime-Version: 1.0 (Mac OS X Mail 9.3 \(3124\)) In-Reply-To: Date: Sun, 3 Apr 2016 18:17:17 +0200 Cc: =?utf-8?Q?Bj=C3=B6rn_Larsson?= , Nikita Popov , PHP internals Message-ID: References: <9399032E-5BAA-4ABF-81AD-13716790D8DB@gmail.com> <63C58928-255D-41A1-9D6E-4773CF9DB356@gmail.com> <5700FB39.2030303@telia.com> To: Joe Watkins X-Mailer: Apple Mail (2.3124) Subject: Re: [PHP-DEV] Tests for null coalescing assignment operator From: mtkocak@gmail.com (Midori Kocak) --Apple-Mail=_869576F1-7288-40FC-9C78-930C5FCE92F6 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Hello Joe, Those were examples for your feedback. Thanks, Midori > On 03 Apr 2016, at 18:16, Joe Watkins wrote: >=20 > Morning Midori, >=20 > PHP doesn't use PHPUnit tests. >=20 > Please see: https://qa.php.net/write-test.php = >=20 > Cheers > Joe >=20 > On Sun, Apr 3, 2016 at 3:41 PM, Midori Kocak > wrote: > Yes, I think I should too. But still no feedbacks :( >=20 > > On 03 Apr 2016, at 13:15, Bj=C3=B6rn Larsson = > wrote: > > > > Hi Midori, > > > > Will you update the RFC also? Even if it's not the normal way of = doing > > things, one should keep in mind that RFC's are often listed as = references > > in books about PHP, being the first piece of documentation. Two such > > examples are: > > - https://daveyshafik.com/archives/book/upgrading-to-php-7 = > > # In Appendix B > > - http://www.php7book.com > > # At the end of every chapter > > > > Regards //Bj=C3=B6rn Larsson > > > > PS Maybe best to finish implementation and tests first. > > > > Den 2016-04-03 kl. 03:17, skrev Midori Kocak: > >> 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: > >>> > >>> On Fri, Mar 25, 2016 at 11:59 AM, Midori Kocak >> wrote: > >>> Hi Everyone, > >>> > >>> 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. > >>> > >>> Wishes, > >>> Midori Kocak > >>> > >>> 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. > >>> > >>> 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? > >>> > >>> 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. > >>> > >>> 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. > >>> > >>> 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? > >>> > >>> 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 > >>> > >>> $b =3D expr; > >>> $x =3D& $a->offsetGet(0); > >>> $y =3D $x->offsetGet(1); > >>> $y OP=3D $b; > >>> $x->offsetSet(1, $y); > >>> > >>> 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. > >>> > >>> So, what would be the desugared call sequence for $a[0][1] ??=3D = expr? Something like this? > >>> > >>> 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: > >>> > >>> 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. > >>> > >>> 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. > >>> > >>> Regards, > >>> Nikita > >> > > >=20 >=20 > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php = >=20 >=20 --Apple-Mail=_869576F1-7288-40FC-9C78-930C5FCE92F6--