add robustness to generated loop code #841
Conversation
@@ -2350,6 +2350,9 @@ class exports.For extends While | |||
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]+$/ |
vendethiel
Feb 5, 2016
Contributor
This seems a bit too specific
This seems a bit too specific
rhendric
Feb 5, 2016
Author
Collaborator
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.)
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.)
vendethiel
Feb 5, 2016
Contributor
(JS doesn't even have negative literals)
(JS doesn't even have negative literals)
rhendric
Feb 5, 2016
Author
Collaborator
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?
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?
vendethiel
Feb 6, 2016
Contributor
Not really, but I never had this kind of error
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.
(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.