Conversation
src/ast.ls
Outdated
| then "#idx #{ '<>'char-at pvar < 0 }#eq #tvar" | ||
| else "#pvar < 0 ? #idx >#eq #tvar : #idx <#eq #tvar" | ||
| else | ||
| if @source instanceof Literal and @source.value is /^[0-9]+$/ |
There was a problem hiding this comment.
This seems a bit too specific
There was a problem hiding this comment.
I thought so at first too, but all of the following are handled gracefully by JavaScript:
- 1e8
- 0.0
- true/false/null
This is the most general case I could find that triggers the syntax error. (Ah crap, I just found one more: negatives. I'll throw a -? in there.)
There was a problem hiding this comment.
(JS doesn't even have negative literals)
There was a problem hiding this comment.
And yet -42.length triggers a syntax error anyway.
I'm starting to have misgivings about this approach; maybe I should be adding robustness (generating (42).length) instead of trying to catch the problem cases and raise errors? I was reluctant to do that at first because errors seem better than compiling things that I know are wrong, but this is turning into a slightly awkward patch. Do you have an opinion?
There was a problem hiding this comment.
Not really, but I never had this kind of error
Certain expressions--integers (with or without a preceding +/-), null, and void--when used as sources of for loops resulted in illegal JavaScript being generated. While (42).length is a silly but legal thing to do, 42.length is an actual SyntaxError in JS. This commit adds checks to wrap potentially problematic expressions in parentheses.
146284f to
4a20718
Compare
|
(For why-the-heck-does-he-want-this background: I was working on #162 and kept getting very annoying-to-diagnose errors from the test suite. I had to binary search the files with comments, because of course the JavaScript SyntaxErrors didn't give me a line number. Not fun. I'm just trying to help out the next guy who goes experimenting with loop, slice, or spread syntax.) |
add robustness to generated loop code
Certain expressions—integers (with or without a preceding +/-), null,
and void—when used as sources of for loops resulted in illegal
JavaScript being generated. While (42).length is a silly but legal thing
to do, 42.length is an actual SyntaxError in JS. This commit adds checks
to wrap potentially problematic expressions in parentheses.