Skip to content

Commit

Permalink
* ext/psych/lib/psych/scalar_scanner.rb: avoid raising exceptions when
Browse files Browse the repository at this point in the history
  parsing Floats and Integers. Thanks riffraff [ruby-core:44426]
* test/psych/test_numeric.rb: associated test

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37697 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
tenderlove committed Nov 17, 2012
1 parent 262cb37 commit 24c6a7c
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 13 deletions.
6 changes: 6 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
Sat Nov 17 12:03:41 2012 Aaron Patterson <[email protected]>

* ext/psych/lib/psych/scalar_scanner.rb: avoid raising exceptions when
parsing Floats and Integers. Thanks riffraff [ruby-core:44426]
* test/psych/test_numeric.rb: associated test

Sat Nov 17 11:34:31 2012 Hiroshi Shirosaki <[email protected]>

* st.c (st_update): pass the key in st_table so that we can free
Expand Down
34 changes: 21 additions & 13 deletions ext/psych/lib/psych/scalar_scanner.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,17 @@ class ScalarScanner
TIME = /^\d{4}-\d{1,2}-\d{1,2}([Tt]|\s+)\d{1,2}:\d\d:\d\d(\.\d*)?(\s*Z|[-+]\d{1,2}(:\d\d)?)?/

# Taken from http://yaml.org/type/float.html
FLOAT = /^(?:[-+]?([0-9][0-9_,]*)?\.[0-9.]*([eE][-+][0-9]+)?(?# base 10)
FLOAT = /^(?:[-+]?([0-9][0-9_,]*)?\.[0-9]*([eE][-+][0-9]+)?(?# base 10)
|[-+]?[0-9][0-9_,]*(:[0-5]?[0-9])+\.[0-9_]*(?# base 60)
|[-+]?\.(inf|Inf|INF)(?# infinity)
|\.(nan|NaN|NAN)(?# not a number))$/x

# Taken from http://yaml.org/type/int.html
INTEGER = /^(?:[-+]?0b[0-1_]+ (?# base 2)
|[-+]?0[0-7_]+ (?# base 8)
|[-+]?(?:0|[1-9][0-9_]*) (?# base 10)
|[-+]?0x[0-9a-fA-F_]+ (?# base 16))$/x

# Create a new scanner
def initialize
@string_cache = {}
Expand Down Expand Up @@ -86,26 +92,28 @@ def tokenize string
end
i
when FLOAT
begin
return Float(string.gsub(/[,_]/, ''))
rescue ArgumentError
if string == '.'
@string_cache[string] = true
string
else
Float(string.gsub(/[,_]/, ''))
end

@string_cache[string] = true
string
else
if string.count('.') < 2
begin
return Integer(string.gsub(/[,_]/, ''))
rescue ArgumentError
end
end
int = parse_int string.gsub(/[,_]/, '')
return int if int

@string_cache[string] = true
string
end
end

###
# Parse and return an int from +string+
def parse_int string
return unless INTEGER === string
Integer(string)
end

###
# Parse and return a Time from +string+
def parse_time string
Expand Down
16 changes: 16 additions & 0 deletions test/psych/test_numeric.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,15 @@ module Psych
# http://yaml.org/type/float.html
# http://yaml.org/type/int.html
class TestNumeric < TestCase
def setup
@old_debug = $DEBUG
$DEBUG = true
end

def teardown
$DEBUG = @old_debug
end

def test_non_float_with_0
str = Psych.load('--- 090')
assert_equal '090', str
Expand All @@ -21,5 +30,12 @@ def test_big_decimal_round_trip
decimal = BigDecimal("12.34")
assert_cycle decimal
end

def test_does_not_attempt_numeric
str = Psych.load('--- 4 roses')
assert_equal '4 roses', str
str = Psych.load('--- 1.1.1')
assert_equal '1.1.1', str
end
end
end

0 comments on commit 24c6a7c

Please sign in to comment.