Change soft-fail to use the config, rather than env
[rbx.git] / kernel / core / fixnum.rb
blobbc7d74ce0f525841bcab0ec6c1f10944107162c2
1 # depends on: integer.rb class.rb
3 ##
4 #--
5 # NOTE do not define to_sym or id2name. It's been deprecated for 5 years and
6 # we've decided to remove it.
7 #++
9 class Fixnum < Integer
11   MAX = Platform::Fixnum.MAX
13   def self.induced_from(obj)
14     case obj
15     when Fixnum
16       return obj
17     when Float, Bignum
18       value = obj.to_i
19       if value.is_a? Bignum
20         raise RangeError, "Object is out of range for a Fixnum"
21       else
22         return value
23       end
24     else
25       value = Type.coerce_to(obj, Integer, :to_int)
26       return self.induced_from(value)
27     end
28   end
30   #--
31   # see README-DEVELOPERS regarding safe math compiler plugin
32   #++
34   alias_method :/, :divide
35   alias_method :modulo, :%
36   
37   def <<(c)
38     c = Type.coerce_to(c, Integer, :to_int)
39     raise RangeError, "Object is out of range for a Fixnum" unless c.is_a?(Fixnum)
40     return self >> -c if c < 0
42     bits = self.size * 8 - 1
43     if (c > bits || self >> bits - c > 0 || c.kind_of?(Bignum))
44       return __bignum_new__(self) << c
45     end
46     __fixnum_left_shift__(c)
47   end
49   def >>(c)
50     c = Type.coerce_to(c, Integer, :to_int)
51     return self << -c if c < 0
52     if c > self.abs
53       return  0 if self >= 0
54       return -1 if self <  0
55     end
56     
57     if c.kind_of?(Bignum)
58       return __bignum_new__(self) >> c
59     end
61     __fixnum_right_shift__(c)
62   end
63   
64   def to_s(base=10)
65     raise ArgumentError, 'base must be between 2 and 36' unless base.between?(2, 36)
66     based_to_s(base)
67   end
68   private :base_to_s
70   # taint and untaint are noops on Fixnum
71   def taint
72     self
73   end
74   
75   def untaint
76     self
77   end
78 end