/[eiffelstudio]/FreeELKS/trunk/library/kernel/integer_overflow_checker.e
ViewVC logotype

Diff of /FreeELKS/trunk/library/kernel/integer_overflow_checker.e

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 91476 by ericb, Sat Feb 4 16:56:42 2006 UTC revision 91477 by ericb, Sun Jan 14 09:47:13 2007 UTC
# Line 8  indexing Line 8  indexing
8    
9  class  class
10          INTEGER_OVERFLOW_CHECKER          INTEGER_OVERFLOW_CHECKER
11            
12  inherit  inherit
13          NUMERIC_INFORMATION          NUMERIC_INFORMATION
14    
# Line 18  create Line 18  create
18  feature{NONE} -- Initialization  feature{NONE} -- Initialization
19    
20          make is          make is
21                          --                          -- Initialize.
22                  do                  do
23                          create integer_overflow_state1.make (1, type_count * 2)                          create integer_overflow_state1.make (1, type_count * 2)
24                          create integer_overflow_state2.make (1, type_count * 2)                                          create integer_overflow_state2.make (1, type_count * 2)
25                            
26                          integer_overflow_state1.put (({INTEGER_8}.max_value // 10).to_natural_64, 1)                          integer_overflow_state1.put (({INTEGER_8}.max_value // 10).to_natural_64, 1)
27                          integer_overflow_state2.put (({INTEGER_8}.max_value \\ 10).to_natural_64, 1)                          integer_overflow_state2.put (({INTEGER_8}.max_value \\ 10).to_natural_64, 1)
28                          integer_overflow_state1.put (({INTEGER_16}.max_value // 10).to_natural_64, 2)                          integer_overflow_state1.put (({INTEGER_16}.max_value // 10).to_natural_64, 2)
# Line 33  feature{NONE} -- Initialization Line 33  feature{NONE} -- Initialization
33                          integer_overflow_state2.put (({INTEGER_64}.max_value \\ 10).to_natural_64, 4)                          integer_overflow_state2.put (({INTEGER_64}.max_value \\ 10).to_natural_64, 4)
34    
35                          integer_overflow_state1.put ((-({INTEGER_8}.min_value // 10)).to_natural_64, 5)                          integer_overflow_state1.put ((-({INTEGER_8}.min_value // 10)).to_natural_64, 5)
36                          integer_overflow_state2.put ((-({INTEGER_8}.min_value \\ 10)).to_natural_64, 5)                                  integer_overflow_state2.put ((-({INTEGER_8}.min_value \\ 10)).to_natural_64, 5)
37                          integer_overflow_state1.put ((-({INTEGER_16}.min_value // 10)).to_natural_64, 6)                          integer_overflow_state1.put ((-({INTEGER_16}.min_value // 10)).to_natural_64, 6)
38                          integer_overflow_state2.put ((-({INTEGER_16}.min_value \\ 10)).to_natural_64, 6)                                          integer_overflow_state2.put ((-({INTEGER_16}.min_value \\ 10)).to_natural_64, 6)
39                          integer_overflow_state1.put ((-({INTEGER}.min_value // 10)).to_natural_64, 7)                          integer_overflow_state1.put ((-({INTEGER}.min_value // 10)).to_natural_64, 7)
40                          integer_overflow_state2.put ((-({INTEGER}.min_value \\ 10)).to_natural_64, 7)                                    integer_overflow_state2.put ((-({INTEGER}.min_value \\ 10)).to_natural_64, 7)
41                          integer_overflow_state1.put ((-({INTEGER_64}.min_value // 10)).to_natural_64, 8)                          integer_overflow_state1.put ((-({INTEGER_64}.min_value // 10)).to_natural_64, 8)
42                          integer_overflow_state2.put ((-({INTEGER_64}.min_value \\ 10)).to_natural_64, 8)                          integer_overflow_state2.put ((-({INTEGER_64}.min_value \\ 10)).to_natural_64, 8)
43    
44                          create natural_overflow_state1.make (1, type_count)                          create natural_overflow_state1.make (1, type_count)
45                          create natural_overflow_state2.make (1, type_count)                          create natural_overflow_state2.make (1, type_count)
46                            
47                          natural_overflow_state1.put (({NATURAL_8}.max_value // 10).to_natural_64, 1)                          natural_overflow_state1.put (({NATURAL_8}.max_value // 10).to_natural_64, 1)
48                          natural_overflow_state2.put (({NATURAL_8}.max_value \\ 10).to_natural_64, 1)                          natural_overflow_state2.put (({NATURAL_8}.max_value \\ 10).to_natural_64, 1)
49                          natural_overflow_state1.put (({NATURAL_16}.max_value // 10).to_natural_64, 2)                          natural_overflow_state1.put (({NATURAL_16}.max_value // 10).to_natural_64, 2)
# Line 51  feature{NONE} -- Initialization Line 51  feature{NONE} -- Initialization
51                          natural_overflow_state1.put (({NATURAL_32}.max_value // 10).to_natural_64, 3)                          natural_overflow_state1.put (({NATURAL_32}.max_value // 10).to_natural_64, 3)
52                          natural_overflow_state2.put (({NATURAL_32}.max_value \\ 10).to_natural_64, 3)                          natural_overflow_state2.put (({NATURAL_32}.max_value \\ 10).to_natural_64, 3)
53                          natural_overflow_state1.put (({NATURAL_64}.max_value // 10).to_natural_64, 4)                          natural_overflow_state1.put (({NATURAL_64}.max_value // 10).to_natural_64, 4)
54                          natural_overflow_state2.put (({NATURAL_64}.max_value \\ 10).to_natural_64, 4)                                                                                    natural_overflow_state2.put (({NATURAL_64}.max_value \\ 10).to_natural_64, 4)
55                  end                  end
56    
57  feature -- Overflow checking  feature -- Overflow checking
58                    
59          will_overflow (part1: like max_natural_type; part2: like max_natural_type; type: INTEGER; sign: INTEGER): BOOLEAN is          will_overflow (part1: like max_natural_type; part2: like max_natural_type; type: INTEGER; sign: INTEGER): BOOLEAN is
60                          -- Will `part1' * 10 + `part2' with `sign' overflow                          -- Will `part1' * 10 + `part2' with `sign' overflow
61                          -- if we convert it to an number of `type'?                                              -- if we convert it to an number of `type'?                    
62                  require                  require
63                          type_valid: integer_natural_type_valid (type)                          type_valid: integer_natural_type_valid (type)
64                  local                  local
65                          l_index: INTEGER                          l_index: INTEGER
66                  do                        do
67                          if type = type_no_limitation then                          if type = type_no_limitation then
68                                  Result := False                                  Result := False
69                          else                              else
70                                  if (type = type_integer_8) or                                  if (type = type_integer_8) or
71                                     (type = type_integer_16) or                                     (type = type_integer_16) or
72                                     (type = type_integer_32) or                                     (type = type_integer_32) or
# Line 81  feature -- Overflow checking Line 81  feature -- Overflow checking
81                                          if sign = 1 then                                          if sign = 1 then
82                                                  Result := (part1 > 0) or (part2 > 0)                                                  Result := (part1 > 0) or (part2 > 0)
83                                          else                                          else
84                                            
85                                                  Result := (part1 > natural_overflow_state1.item (l_index)) or                                                  Result := (part1 > natural_overflow_state1.item (l_index)) or
86                                                                    ((part1 = natural_overflow_state1.item (l_index)) and                                                                    ((part1 = natural_overflow_state1.item (l_index)) and
87                                                                    (part2 > natural_overflow_state2.item (l_index)))                                                                    (part2 > natural_overflow_state2.item (l_index)))
88                                  end                                      end
89                          end                                                              end
90                  end                  end
91          end          end
92    
93  feature{NONE} -- Implementation  feature{NONE} -- Implementation
94    
95          integer_overflow_state1: ARRAY [like max_natural_type]                    integer_overflow_state1: ARRAY [like max_natural_type]
96          integer_overflow_state2: ARRAY [like max_natural_type]            integer_overflow_state2: ARRAY [like max_natural_type]
97          natural_overflow_state1: ARRAY [like max_natural_type]                    natural_overflow_state1: ARRAY [like max_natural_type]
98          natural_overflow_state2: ARRAY [like max_natural_type]          natural_overflow_state2: ARRAY [like max_natural_type]
99                          -- Arrays to check conversion overflow                          -- Arrays to check conversion overflow
100                            
101  end  end

Legend:
Removed from v.91476  
changed lines
  Added in v.91477

  ViewVC Help
Powered by ViewVC 1.1.23