28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
# File 'ext/misc/integer/integer?.c', line 28
VALUE isNumber(volatile VALUE obj, volatile VALUE val) {
// But we don't expect anything other than String though as Argument.
// Note that raising ArgumentError or any kind of Error shouldn't be done here
// Otherwise Integer(n) is the best method in Ruby.
if (!RB_TYPE_P(val, T_STRING))
return Qnil ;
char *str = StringValuePtr(val) ;
char ch = str[0] ;
// If the string is empty, return false
if (!ch) return Qfalse ;
unsigned char i = ch == '-' ? 1 : 0 ;
if (!str[i]) return Qfalse ;
unsigned char max = UCHAR_MAX ;
# pragma GCC unroll 4
while((ch = str[i++])) {
if (ch < 48 || ch > 57)
return Qfalse ;
if (i == max)
return Qnil ;
}
return Qtrue ;
}
|