return when desugaring to closures

Brendan Eich brendan at mozilla.com
Thu Oct 16 16:29:28 PDT 2008


On Oct 16, 2008, at 3:33 PM, Brendan Eich wrote:

> SpiderMonkey historically used SyntaxError, not ReferenceError, and  
> throw at compile-time. This pre-dates ES1. Another example not  
> involving let expressions:
>
> js> a + b = c
> typein:1: SyntaxError: invalid assignment left-hand side:
> typein:1: a + b = c
> typein:1: ......^
>
> From ES3 chapter 16:
>
> An implementation may treat any instance of the following kinds of  
> runtime errors as a syntax error and therefore
> report it early:
> • Improper uses of return, break, and continue.
> • Using the eval property other than via a direct call.
> • Errors in regular expression literals.
> • Attempts to call PutValue on a value that is not a reference (for  
> example, executing the assignment statement
> 3=4).
>
> You may object that we should throw ReferenceError not SyntaxError  
> -- that is not entirely clear from the chapter 16 wording,


"An implementation may treat any instance of the following kinds of  
runtime errors as a syntax error and therefore report it early" seems  
clear enough: an implementation that does choose ("may") to report the  
ReferenceError from 8.7.2 PutValue step 1 *must* treat that runtime  
error as a syntax error -- throw a SyntaxError, in other words.  
There's no SpiderMonkey bug here, and it would be incorrect to do  
other than change ReferenceError to SyntaxError when reporting the  
PutValue error at compile time.

Again, this is not a grammatical error. The ES3 grammar is not enough  
to decide what syntax errors might result from feeding a given program  
source to an implementation.

/be


More information about the Es-discuss mailing list