/[eiffelstudio]/branches/CAT_mono/Src/Eiffel/eiffel/genericity/cl_type_i.e
ViewVC logotype

Diff of /branches/CAT_mono/Src/Eiffel/eiffel/genericity/cl_type_i.e

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

revision 16188 by manus, Wed Aug 11 19:31:20 1999 UTC revision 26913 by manus, Sun Aug 12 23:50:20 2001 UTC
# Line 1  Line 1 
1  -- Type class  indexing
2            description: "Type class."
3            date: "$Date$"
4            revision: "$Revision$"
5    
6  class CL_TYPE_I  class CL_TYPE_I
7    
# Line 6  inherit Line 9  inherit
9          TYPE_I          TYPE_I
10                  redefine                  redefine
11                          is_reference,                          is_reference,
12                          is_expanded,                          is_true_expanded,
13                          is_separate,                          is_separate,
14                          is_valid,                          is_valid,
15                          is_explicit,                          is_explicit,
# Line 22  inherit Line 25  inherit
25                          generate_cid_init                          generate_cid_init
26                  end                  end
27    
28  feature  feature -- Access
29    
30          base_id: CLASS_ID          base_id: INTEGER
31                          -- Base class id of the type class                          -- Base class id of the type class
32    
         is_expanded: BOOLEAN  
                         -- Is the type expanded?  
   
         is_separate: BOOLEAN  
                         -- Is the type separate?  
   
         set_base_id (c: CLASS_ID) is  
                         -- Assign `c' to `base_id'.  
                 do  
                         base_id := c  
                 end  
   
         set_is_expanded (b: BOOLEAN) is  
                         -- Assign `b' to `is_expanded'.  
                 do  
                         is_expanded := b  
                 end  
   
         set_is_separate (b: BOOLEAN) is  
                         -- Assign `b' to `is_separate'.  
                 do  
                         is_separate := b  
                 end  
   
33          meta_generic: META_GENERIC is          meta_generic: META_GENERIC is
34                          -- Meta generic array describing the type class                          -- Meta generic array describing the type class
35                  do                  do
# Line 61  feature Line 40  feature
40                          -- Additional information for the creation                          -- Additional information for the creation
41                          -- of generic types with anchored parameters                          -- of generic types with anchored parameters
42    
         set_cr_info (cinfo : CREATE_INFO) is  
                         -- Set `cr_info' to `cinfo'.  
                 do  
                         cr_info := cinfo  
                 ensure  
                         cr_info_set : cr_info = cinfo  
                 end  
   
43          true_generics : ARRAY [TYPE_I] is          true_generics : ARRAY [TYPE_I] is
44                          -- Array of generics: no mapping reference -> REFERENCE_I                          -- Array of generics: no mapping reference -> REFERENCE_I
45                  do                  do
# Line 81  feature Line 52  feature
52                          Result := System.class_of_id (base_id)                          Result := System.class_of_id (base_id)
53                  end                  end
54    
55          is_valid: BOOLEAN is          type_a: CL_TYPE_A is
                         -- Is the base class still in the system ?  
                 do  
                         Result := base_class /= Void  
                 end  
   
         is_reference: BOOLEAN is  
                         -- Is the type a reference type ?  
                 do  
                         Result := not is_expanded  
                 end;  
   
         is_explicit: BOOLEAN is  
   
56                  do                  do
57                          Result := (cr_info = Void) or else (is_expanded or is_basic)                          create Result
58                            Result.set_is_true_expanded (is_true_expanded)
59                            Result.set_is_separate (is_separate)
60                            Result.set_base_class_id (base_id)
61                  end                  end
62    
63          same_as (other: TYPE_I): BOOLEAN is          il_type_name: STRING is
64                          -- Is `other' equal to Current ?                          -- Class name of current type.
                 local  
                         other_cl_type: CL_TYPE_I  
65                  do                  do
66                          other_cl_type ?= other                          Result := clone (base_class.external_class_name)
                         Result := other_cl_type /= Void -- FIXME  
                                         and then equal (other_cl_type.base_id, base_id)  
                                         and then other_cl_type.is_expanded = is_expanded  
                                         and then other_cl_type.is_separate = is_separate  
                                         and then other_cl_type.meta_generic = Void  
                                         and then other_cl_type.true_generics = Void  
67                  end                  end
68    
69          instantiation_in (other: GEN_TYPE_I): CL_TYPE_I is          instantiation_in (other: GEN_TYPE_I): CL_TYPE_I is
# Line 135  feature Line 88  feature
88                          exp: EXPANDED_DESC                          exp: EXPANDED_DESC
89                          ref: REFERENCE_DESC                          ref: REFERENCE_DESC
90                  do                  do
91                          if is_expanded then                          if is_true_expanded then
92                                  !! exp                                  !! exp
93                                  is_expanded := False                                  is_true_expanded := False
94                                  exp.set_class_type (base_class.types.conservative_search_item (Current))                                  exp.set_class_type (base_class.types.conservative_search_item (Current))
95                                  is_expanded := True                                  is_true_expanded := True
96                                  exp.set_type_i (Current)                                  exp.set_type_i (Current)
97                                  Result := exp                                  Result := exp
98                          elseif is_separate then                          elseif is_separate then
# Line 161  feature Line 114  feature
114                          Result := Reference_c_type                          Result := Reference_c_type
115                  end                  end
116    
         append_signature (st: STRUCTURED_TEXT) is  
                 do  
                         if is_expanded then  
                                 st.add_string ("expanded ")  
                         elseif is_separate then  
                                 st.add_string ("separate ")  
                         end  
                         base_class.append_signature (st)  
                 end  
   
         dump (buffer: GENERATION_BUFFER) is  
                 local  
                         s: STRING  
                 do  
                         if is_expanded then  
                                 buffer.putstring ("expanded ")  
                         elseif is_separate then  
                                 buffer.putstring ("separate ")  
                         end  
                         s := clone (base_class.name)  
                         s.to_upper  
                         buffer.putstring (s)  
                 end  
   
         has_associated_class_type: BOOLEAN is  
                         -- Has `Current' an associated class type?  
                 do  
                         if is_expanded then  
                                 is_expanded := False  
                                 Result := base_class.types.has_type (Current)  
                                 is_expanded := True  
                         elseif is_separate then  
                                 is_separate := False  
                                 Result := base_class.types.has_type (Current)  
                                 is_separate := True  
                         else  
                                 Result := base_class.types.has_type (Current)  
                         end  
                 end  
   
117          associated_class_type: CLASS_TYPE is          associated_class_type: CLASS_TYPE is
118                          -- Associated class type                          -- Associated class type
119                  require                  require
120                  --      has: has_associated_class_type                  --      has: has_associated_class_type
                 local  
                         types: TYPE_LIST  
121                  do                  do
122                          if is_expanded then                          if is_true_expanded then
123                                  is_expanded := False                                  is_true_expanded := False
124                                  Result := base_class.types.conservative_search_item (Current)                                  Result := base_class.types.conservative_search_item (Current)
125                                  is_expanded := True                                  is_true_expanded := True
126                          elseif is_separate then                          elseif is_separate then
127                                  is_separate := False                                  is_separate := False
128                                  Result := base_class.types.conservative_search_item (Current)                                  Result := base_class.types.conservative_search_item (Current)
# Line 230  feature Line 141  feature
141          expanded_type_id: INTEGER is          expanded_type_id: INTEGER is
142                          -- Type id of the corresponding expanded class type                          -- Type id of the corresponding expanded class type
143                  do                  do
144                          is_expanded := False                          is_true_expanded := False
145                          Result := base_class.types.conservative_search_item (Current).type_id                          Result := base_class.types.conservative_search_item (Current).type_id
146                          is_expanded := True                          is_true_expanded := True
147                  end                  end
148    
149          generate_cecil_value (buffer: GENERATION_BUFFER) is          sk_value: INTEGER is
150                          -- Generate cecil value                          -- Generate SK value associated to the current type.
151                  do                  do
152                                  -- FIXME????: separate                                  -- FIXME????: separate
153                          if not is_expanded then                          if not is_true_expanded then
154                                  buffer.putstring ("SK_DTYPE")                                  Result := Sk_ref + (type_id - 1)
155                          else                          else
156                                  buffer.putstring ("SK_EXP + (uint32) ")                                  is_true_expanded := False
157                                  buffer.putint (base_id.id)                                  Result := Sk_exp + (type_id - 1)
158                                    is_true_expanded := True
159                            end
160                    end
161    
162            cecil_value: INTEGER is
163                    do
164                                    -- FIXME????: separate
165                            if not is_true_expanded then
166                                    Result := Sk_dtype
167                            else
168                                    Result := Sk_exp + base_id
169                          end                          end
170                  end                  end
171    
172          hash_code: INTEGER is          hash_code: INTEGER is
173                          -- Hash code for current type                          -- Hash code for current type
174                  do                  do
175                          Result := Other_code + base_id.hash_code                          Result := Other_code + base_id
176                  end                  end
177    
178          sk_value: INTEGER is  feature -- Status
179                          -- Generate SK value associated to the current type.  
180            is_true_expanded: BOOLEAN
181                            -- Is the type expanded?
182    
183            is_separate: BOOLEAN
184                            -- Is the type separate?
185    
186            is_enum: BOOLEAN is
187                            -- Is current type an IL enum type?
188                            -- Useful to find out if some call optimization can be done
189                            -- in FEATURE_B.
190                    require
191                            il_generation: System.il_generation
192                  do                  do
193                                  -- FIXME????: separate                          Result := is_true_expanded and then base_class.is_enum
194                          if not is_expanded then                  end
195                                  Result := Sk_ref + (type_id - 1)  
196            is_valid: BOOLEAN is
197                            -- Is the base class still in the system ?
198                    do
199                            Result := base_class /= Void
200                    end
201    
202            is_reference: BOOLEAN is
203                            -- Is the type a reference type ?
204                    do
205                            Result := not is_true_expanded
206                    end;
207    
208            is_explicit: BOOLEAN is
209    
210                    do
211                            Result := (cr_info = Void) or else is_expanded
212                    end
213    
214            has_associated_class_type: BOOLEAN is
215                            -- Has `Current' an associated class type?
216                    do
217                            if is_true_expanded then
218                                    is_true_expanded := False
219                                    Result := base_class.types.has_type (Current)
220                                    is_true_expanded := True
221                            elseif is_separate then
222                                    is_separate := False
223                                    Result := base_class.types.has_type (Current)
224                                    is_separate := True
225                          else                          else
226                                  is_expanded := False                                  Result := base_class.types.has_type (Current)
                                 Result := Sk_exp + (type_id - 1)  
                                 is_expanded := True  
227                          end                          end
228                  end                  end
229    
230          cecil_value: INTEGER is          same_as (other: TYPE_I): BOOLEAN is
231                            -- Is `other' equal to Current ?
232                    local
233                            other_cl_type: CL_TYPE_I
234                    do
235                            other_cl_type ?= other
236                            Result := other_cl_type /= Void -- FIXME
237                                            and then other_cl_type.base_id = base_id
238                                            and then other_cl_type.is_true_expanded = is_true_expanded
239                                            and then other_cl_type.is_separate = is_separate
240                                            and then other_cl_type.meta_generic = Void
241                                            and then other_cl_type.true_generics = Void
242                    end
243    
244    feature -- Setting
245    
246            set_base_id (c: INTEGER) is
247                            -- Assign `c' to `base_id'.
248                    do
249                            base_id := c
250                    end
251    
252            set_is_true_expanded (b: BOOLEAN) is
253                            -- Assign `b' to `is_true_expanded'.
254                    do
255                            is_true_expanded := b
256                    end
257    
258            set_is_separate (b: BOOLEAN) is
259                            -- Assign `b' to `is_separate'.
260                    do
261                            is_separate := b
262                    end
263    
264            set_cr_info (cinfo : CREATE_INFO) is
265                            -- Set `cr_info' to `cinfo'.
266                    do
267                            cr_info := cinfo
268                    ensure
269                            cr_info_set : cr_info = cinfo
270                    end
271    
272    feature -- Formatting
273    
274            append_signature (st: STRUCTURED_TEXT) is
275                    do
276                            if is_true_expanded then
277                                    st.add_string ("expanded ")
278                            elseif is_separate then
279                                    st.add_string ("separate ")
280                            end
281                            base_class.append_signature (st)
282                    end
283    
284            dump (buffer: GENERATION_BUFFER) is
285                    local
286                            s: STRING
287                    do
288                            if is_true_expanded then
289                                    buffer.putstring ("expanded ")
290                            elseif is_separate then
291                                    buffer.putstring ("separate ")
292                            end
293                            s := clone (base_class.name)
294                            s.to_upper
295                            buffer.putstring (s)
296                    end
297    
298    feature -- C generation
299    
300            generate_cecil_value (buffer: GENERATION_BUFFER) is
301                            -- Generate cecil value
302                  do                  do
303                                  -- FIXME????: separate                                  -- FIXME????: separate
304                          if not is_expanded then                          if not is_true_expanded then
305                                  Result := Sk_dtype                                  buffer.putstring ("SK_DTYPE")
306                          else                          else
307                                  Result := Sk_exp + base_id.id                                  buffer.putstring ("SK_EXP + (uint32) ")
308                                    buffer.putint (base_id)
309                          end                          end
310                  end                  end
311    
# Line 290  feature {NONE} -- Array optimization Line 323  feature {NONE} -- Array optimization
323                          Result := System.array_class.compiled_class                          Result := System.array_class.compiled_class
324                  end                  end
325    
 feature  
   
         type_a: CL_TYPE_A is  
                 do  
                         !!Result  
                         Result.set_is_expanded (is_expanded)  
                         Result.set_is_separate (is_separate)  
                         Result.set_base_class_id (base_id)  
                 end  
   
326  feature -- Generic conformance  feature -- Generic conformance
327    
328          generated_id (final_mode : BOOLEAN) : INTEGER is          generated_id (final_mode : BOOLEAN) : INTEGER is
# Line 308  feature -- Generic conformance Line 331  feature -- Generic conformance
331                          if final_mode then                          if final_mode then
332                                  Result := type_id - 1                                  Result := type_id - 1
333                          else                          else
334                                  Result := associated_class_type.id.id-1                                  Result := associated_class_type.static_type_id-1
335                          end                          end
336    
337                          if is_expanded then                          if is_true_expanded then
338                                  Result := -256 - Result                                  Result := Expanded_level - Result
339                          end                          end
340                  end                  end
341    
# Line 321  feature -- Generic conformance Line 344  feature -- Generic conformance
344                  do                  do
345                          if                          if
346                                  use_info and then (cr_info /= Void)                                  use_info and then (cr_info /= Void)
347                                  and then not (is_expanded or is_basic)                                  and then not is_expanded
348                          then                          then
349                                  -- It's an anchored type                                  -- It's an anchored type
350                                  cr_info.generate_cid (buffer, final_mode)                                  cr_info.generate_cid (buffer, final_mode)
# Line 334  feature -- Generic conformance Line 357  feature -- Generic conformance
357                  do                  do
358                          if                          if
359                                  use_info and then (cr_info /= Void)                                  use_info and then (cr_info /= Void)
360                                  and then not (is_expanded or is_basic)                                  and then not is_expanded
361                          then                          then
362                                  -- It's an anchored type                                  -- It's an anchored type
363                                  cr_info.make_gen_type_byte_code (ba)                                  cr_info.make_gen_type_byte_code (ba)
# Line 349  feature -- Generic conformance Line 372  feature -- Generic conformance
372                  do                  do
373                          if                          if
374                                  use_info and then (cr_info /= Void)                                  use_info and then (cr_info /= Void)
375                                  and then not (is_expanded or is_basic)                                  and then not is_expanded
376                          then                          then
377                                  -- It's an anchored type                                  -- It's an anchored type
378                                  cr_info.generate_cid_array (buffer, final_mode, idx_cnt)                                  cr_info.generate_cid_array (buffer, final_mode, idx_cnt)
# Line 368  feature -- Generic conformance Line 391  feature -- Generic conformance
391                  do                  do
392                          if                          if
393                                  use_info and then (cr_info /= Void)                                  use_info and then (cr_info /= Void)
394                                  and then not (is_expanded or is_basic)                                  and then not is_expanded
395                          then                          then
396                                  -- It's an anchored type                                  -- It's an anchored type
397                                  cr_info.generate_cid_init (buffer, final_mode, idx_cnt)                                  cr_info.generate_cid_init (buffer, final_mode, idx_cnt)

Legend:
Removed from v.16188  
changed lines
  Added in v.26913

  ViewVC Help
Powered by ViewVC 1.1.23