Skip to content

Commit e0ec397

Browse files
committed
Merge pull request #2061 from geraldalewis/uppercase_radix_prefixes
Issue #2060 Disallow uppercase radix prefixes and exponential notation
2 parents 8ac440f + 34e517d commit e0ec397

File tree

3 files changed

+30
-19
lines changed

3 files changed

+30
-19
lines changed

lib/coffee-script/lexer.js

Lines changed: 13 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/lexer.coffee

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -133,14 +133,18 @@ exports.Lexer = class Lexer
133133
numberToken: ->
134134
return 0 unless match = NUMBER.exec @chunk
135135
number = match[0]
136+
if /[E]/.test number
137+
@error "exponential notation must be indicated with a lowercase 'e'"
138+
else if /[BOX]/.test number
139+
@error "radix prefixes must be lowercase '#{number}'"
140+
else if /^0[89]/.test number
141+
@error "decimal literals '#{number}' must not be prefixed with '0'"
142+
else if /^0[0-7]/.test number
143+
@error "octal literals '#{number}' must be prefixed with '0o'"
136144
lexedLength = number.length
137-
if nonStrictOctalLiteral = /^0\d+/.test number
138-
dec = if /[89]/.test number then "\"#{number}\" " else ''
139-
oct = if dec then '' else "\"#{number}\" "
140-
@error "decimal literals #{dec}must not be prefixed with '0'; octal literals #{oct}must be prefixed with '0o'"
141-
if octalLiteral = /0o([0-7]+)/i.exec number
145+
if octalLiteral = /0o([0-7]+)/.exec number
142146
number = (parseInt octalLiteral[1], 8).toString()
143-
if binaryLiteral = /0b([01]+)/i.exec number
147+
if binaryLiteral = /0b([01]+)/.exec number
144148
number = (parseInt binaryLiteral[1], 2).toString()
145149
@token 'NUMBER', number
146150
lexedLength
@@ -596,9 +600,9 @@ IDENTIFIER = /// ^
596600
///
597601

598602
NUMBER = ///
599-
^ 0x[\da-f]+ | # hex
600603
^ 0b[01]+ | # binary
601604
^ 0o[0-7]+ | # octal
605+
^ 0x[\da-f]+ | # hex
602606
^ \d*\.?\d+ (?:e[+-]?\d+)? # decimal
603607
///i
604608

test/numbers.coffee

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
test "Parser recognises binary numbers", ->
1717
eq 4, 0b100
18-
eq 5, 0B101
1918

2019
# Decimal Integer Literals
2120

@@ -57,12 +56,16 @@ test '#1168: leading floating point suppresses newline', ->
5756

5857
test "Python-style octal literal notation '0o777'", ->
5958
eq 511, 0o777
60-
eq 511, 0O777
6159
eq 1, 0o1
62-
eq 1, 0O1
6360
eq 1, 0o00001
6461
eq parseInt('0777', 8), 0o777
6562
eq '777', 0o777.toString 8
6663
eq 4, 0o4.valueOf()
6764
eq Number::toString, 0o777['toString']
6865
eq Number::toString, 0o777.toString
66+
67+
test "#2060: Disallow uppercase radix prefixes and exponential notation", ->
68+
for char in ['b', 'o', 'x', 'e']
69+
program = "0#{char}0"
70+
doesNotThrow -> CoffeeScript.compile program, bare: yes
71+
throws -> CoffeeScript.compile program.toUpperCase(), bare: yes

0 commit comments

Comments
 (0)