Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!news.chainon-marquant.org!nntpfeed.proxad.net!proxad.net!feeder2-2.proxad.net!newsfeed.arcor.de!newsspool3.arcor-online.net!news.arcor.de.POSTED!not-for-mail Content-Type: text/plain; charset="UTF-8" Message-ID: <1932615.aqSPkdTlGX@PointedEars.de> From: Thomas 'PointedEars' Lahn Reply-To: Thomas 'PointedEars' Lahn Organization: PointedEars Software (PES) Date: Thu, 29 Dec 2011 12:18 +0100 User-Agent: KNode/4.4.11 Content-Transfer-Encoding: 8Bit Subject: Re: Simulate goto Newsgroups: comp.lang.javascript References: <4ef9a823$0$6842$e4fe514c@news2.news.xs4all.nl> <1931071.aqSPkdTlGX@PointedEars.de> <1367331.WGnKmheAe9@PointedEars.de> <9m1iteFodiU1@mid.uni-berlin.de> Followup-To: comp.lang.javascript MIME-Version: 1.0 Lines: 102 NNTP-Posting-Date: 29 Dec 2011 12:18:00 CET NNTP-Posting-Host: e0268169.newsspool1.arcor-online.net X-Trace: DXC=ZGaKCi7JJd7T2Rfi64Fo<]lROoR1<`=YMgDjhg2T`38E:`Ooj8DZm8W4\YJN X-Complaints-To: usenet-abuse@arcor.de Xref: x330-a1.tempe.blueboxinc.net comp.lang.javascript:9759 Jake Jarvis wrote: > On 28.12.2011 19:10, Thomas 'PointedEars' Lahn wrote: >> AIUI, it should be possible to use an enclosing /Statement/ (like a >> /Block/ statement) and a `break' statement here (section 12.8): >> >> function testGoto() >> { >> var isFirst = true; >> if (true) >> { >> skipPoint: >> window.alert("Using goto\n"); >> >> if (isFirst) >> { >> isFirst = false; >> break skipPoint; >> window.alert("This part is skipped"); >> } >> } >> } >> >> However, Google V8 3.5.10.9+ in Chromium 15.0.874.121 (Developer Build >> 109964 Linux) considers that a syntax error as well (same error message: >> "SyntaxError: Undefined label 'skipPoint'"). Is this a bug? > > No. > Why should it work? > I think there is slight confusion as to what it means for a statement to > be 'enclosing' another. No, but there was a misconception on my part as to the definition of a label set: | 12 Statements | | Semantics | | A /Statement/ can be part of a /LabelledStatement/, which itself can be | part of a /LabelledStatement/, and so on. The labels introduced this way | are collectively referred to as the "current label set" when describing | the semantics of individual statements. A /LabelledStatement/ has no | semantic meaning other than the introduction of a label to a /label set/. | The label set of an /IterationStatement/ or a /SwitchStatement/ initially | contains the single element empty. The label set of any other statement is | initially empty. | | […] | 12.12 Labelled Statements | | The production /Identifier/ : /Statement/ is evaluated by adding | /Identifier/ to the label set of /Statement/ and then evaluating | /Statement/. If the /LabelledStatement/ itself has a non-empty label set, | these labels are also added to the label set of /Statement/ before | evaluating it. If the result of evaluating Statement is (break, V, L) | where L is equal to /Identifier/, the production results in (normal, V, | empty). | | Prior to the evaluation of a /LabelledStatement/, the contained | /Statement/ is regarded as possessing an empty label set, unless it is an | /IterationStatement/ or a /SwitchStatement/, in which case it is regarded | as possessing a label set consisting of the single element, empty. That is, the label set of a statement consists of the labels used for *that* statement, _not_ the labels used *within* it. Therefore, the following is syntactically correct and compiles in the named implementation without error: function testGoto() { var counter = 0; skipPoint: { window.alert(counter); if (counter === 0) { ++counter; break skipPoint; window.alert("This part is skipped"); } } } However, this does _not_ "simulate goto", i. e. the counter is only shown once. That is – unless I am overlooking something – intended by the Specification: The `break' statement with /Identifier/ merely ends the evaluation of the so labelled statement prematurely: | A /BreakStatement/ with an /Identifier/ is evaluated as follows: | | 1. Return (break, empty, /Identifier/). See section 12.12 quoted above on how that result affects the evaluation of the enclosing statement labelled with /Identifier/. PointedEars -- When all you know is jQuery, every problem looks $(olvable).