/[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 40771 by manus, Thu Dec 11 23:36:44 2003 UTC revision 41824 by manus, Sat Mar 6 01:51:40 2004 UTC
# Line 9  inherit Line 9  inherit
9          TYPE_I          TYPE_I
10                  redefine                  redefine
11                          is_reference,                          is_reference,
12                          is_true_expanded,                          is_expanded,
13                          is_separate,                          is_separate,
14                          is_valid,                          is_valid,
15                          is_explicit,                          is_explicit,
16                          is_external,                          is_external,
17                          same_as,                          same_as,
18                          c_type,                          c_type,
                         instantiation_in,  
                         complete_instantiation_in,  
19                          conforms_to_array,                          conforms_to_array,
20                          generated_id,                          generated_id,
21                          generate_cid,                          generate_cid,
# Line 25  inherit Line 23  inherit
23                          generate_cid_array,                          generate_cid_array,
24                          generate_cid_init,                          generate_cid_init,
25                          generate_gen_type_il,                          generate_gen_type_il,
26                          generate_expanded_creation                          generate_expanded_creation,
27                  end                          instantiation_in,
28                                    generic_derivation,
29          DEBUG_OUTPUT                          is_generated_as_single_type
                 export  
                         {NONE} all  
30                  end                  end
31    
32          SHARED_IL_CASING          SHARED_IL_CASING
# Line 60  feature {NONE} -- Initialization Line 56  feature {NONE} -- Initialization
56                          valid_id: id > 0                          valid_id: id > 0
57                  do                  do
58                          class_id := id                          class_id := id
59                            if is_basic then
60                                            -- We know for sure that it is expanded then.
61                                    is_expanded := True
62                            end
63                  ensure                  ensure
64                          class_id_set: class_id = id                          class_id_set: class_id = id
65                  end                  end
# Line 91  feature -- Access Line 91  feature -- Access
91                          Result := System.class_of_id (class_id)                          Result := System.class_of_id (class_id)
92                  end                  end
93    
94            generic_derivation: CL_TYPE_I is
95                            -- Precise generic derivation of current type.
96                            -- That is to say given a type, it gives the associated TYPE_I
97                            -- which can be used to search its associated CLASS_TYPE.
98                    do
99                            Result := Current
100                    end
101                    
102          type_a: CL_TYPE_A is          type_a: CL_TYPE_A is
103                  do                  do
104                          create Result.make (class_id)                          create Result.make (class_id)
105                          Result.set_is_true_expanded (is_true_expanded)                          Result.set_is_expanded (is_expanded)
106                          Result.set_is_separate (is_separate)                          Result.set_is_separate (is_separate)
107                  end                  end
108    
109            name: STRING is
110                            -- String that should be displayed in debugger to represent `Current'.
111                    local
112                            l_base_class: like base_class
113                    do
114                            create Result.make (32)
115                            l_base_class := base_class
116                            if is_expanded and not l_base_class.is_expanded then
117                                    Result.append ("expanded ")
118                            elseif not is_expanded and l_base_class.is_expanded then
119                                    Result.append ("reference ")
120                            elseif is_separate then
121                                    Result.append ("separate ")
122                            end
123                            Result.append (l_base_class.name_in_upper)
124                    end
125    
126            instantiation_in (other: GEN_TYPE_I): CL_TYPE_I is
127                            -- Instantation of Current in `other'
128                    do
129                            Result := Current
130                    end
131                    
132          il_type_name (a_prefix: STRING): STRING is          il_type_name (a_prefix: STRING): STRING is
133                          -- Class name of current type.                          -- Class name of current type.
134                  local                  local
# Line 106  feature -- Access Line 137  feature -- Access
137                          l_cl_type: like associated_class_type                          l_cl_type: like associated_class_type
138                  do                  do
139                          l_class_c := base_class                          l_class_c := base_class
140                          if l_class_c.is_external then                          if is_external then
141                                  Result := l_class_c.external_class_name.twin                                  Result := l_class_c.external_class_name.twin
142                          else                          else
143                                  l_is_precompiled := l_class_c.is_precompiled                                  l_is_precompiled := l_class_c.is_precompiled
# Line 123  feature -- Access Line 154  feature -- Access
154                          end                          end
155                  end                  end
156    
         instantiation_in (other: GEN_TYPE_I): CL_TYPE_I is  
                         -- Instantiation of Current in context of `other'  
                 require else  
                         True  
                 do  
                         Result := Current  
                 end  
   
         complete_instantiation_in (other: GEN_TYPE_I): CL_TYPE_I is  
                         -- Instantiation of Current in context of `other'  
                 require else  
                         True  
                 do  
                         Result := Current  
                 end  
   
157          description: ATTR_DESC is          description: ATTR_DESC is
158                          -- Type description for skeletons                          -- Type description for skeletons
159                  local                  local
160                          exp: EXPANDED_DESC                          exp: EXPANDED_DESC
161                          ref: REFERENCE_DESC                          ref: REFERENCE_DESC
162                  do                  do
163                          if is_true_expanded then                          if is_expanded then
164                                  create exp                                  create exp
                                 is_true_expanded := False  
165                                  exp.set_class_type (base_class.types.search_item (Current))                                  exp.set_class_type (base_class.types.search_item (Current))
                                 is_true_expanded := True  
166                                  exp.set_type_i (Current)                                  exp.set_type_i (Current)
167                                  Result := exp                                  Result := exp
                         elseif is_separate then  
                                 -- FIXME  
                                 Result := c_type.description  
168                          else                          else
169                                  Result := c_type.description                                  Result := c_type.description
170                          end                          end
# Line 176  feature -- Access Line 186  feature -- Access
186                  require                  require
187                  --      has: has_associated_class_type                  --      has: has_associated_class_type
188                  do                  do
189                          if is_true_expanded then                          Result := base_class.types.search_item (Current)
                                 is_true_expanded := False  
                                 Result := base_class.types.search_item (Current)  
                                 is_true_expanded := True  
                         elseif is_separate then  
                                 is_separate := False  
                                 Result := base_class.types.search_item (Current)  
                                 is_separate := True  
                         else  
                                 Result := base_class.types.search_item (Current)  
                         end  
190                  end                  end
191    
192          type_id: INTEGER is          type_id: INTEGER is
# Line 198  feature -- Access Line 198  feature -- Access
198          sk_value: INTEGER is          sk_value: INTEGER is
199                          -- Generate SK value associated to the current type.                          -- Generate SK value associated to the current type.
200                  do                  do
201                                  -- FIXME????: separate                          if is_expanded then
                         if not is_true_expanded then  
                                 Result := Sk_ref | (type_id - 1)  
                         else  
                                 is_true_expanded := False  
202                                  Result := Sk_exp | (type_id - 1)                                  Result := Sk_exp | (type_id - 1)
203                                  is_true_expanded := True                          else
204                                    Result := Sk_ref | (type_id - 1)
205                          end                          end
206                  end                  end
207    
208          cecil_value: INTEGER is          cecil_value: INTEGER is
209                  do                  do
210                                  -- FIXME????: separate                          if not is_expanded then
                         if not is_true_expanded then  
211                                  Result := Sk_dtype                                  Result := Sk_dtype
212                          else                          else
213                                  Result := Sk_exp | class_id                                  Result := Sk_exp | class_id
# Line 229  feature -- Status Line 225  feature -- Status
225          element_type: INTEGER_8 is          element_type: INTEGER_8 is
226                          -- Void element type                          -- Void element type
227                  do                  do
228                          if is_expanded and base_class.is_external then                          if is_expanded then
229                                          -- We only support expanded for external class at the moment.                                          -- We only support expanded for external class at the moment.
230                                  Result := feature {MD_SIGNATURE_CONSTANTS}.Element_type_valuetype                                                                Result := feature {MD_SIGNATURE_CONSTANTS}.Element_type_valuetype                              
231                          else                          else
# Line 243  feature -- Status Line 239  feature -- Status
239                          end                          end
240                  end                  end
241    
242          is_true_expanded: BOOLEAN          tuple_code: INTEGER_8 is
243                            -- Tuple code for class type
244                    do
245                            Result := feature {SHARED_GEN_CONF_LEVEL}.reference_tuple_code
246                    end
247                    
248            is_expanded: BOOLEAN
249                          -- Is the type expanded?                          -- Is the type expanded?
250    
251          is_separate: BOOLEAN          is_separate: BOOLEAN
# Line 256  feature -- Status Line 258  feature -- Status
258                  require                  require
259                          il_generation: System.il_generation                          il_generation: System.il_generation
260                  do                  do
261                          Result := is_true_expanded and then base_class.is_enum                          Result := is_expanded and then base_class.is_enum
262                  end                  end
263    
264          is_external: BOOLEAN is          is_external: BOOLEAN is
265                          -- Is current type an IL enum type?                          -- Is current type based on an external class?
266                          -- Useful to find out if some call optimization can be done                  local
267                          -- in FEATURE_B.                          l_base_class: like base_class
268                  do                  do
269                          Result := base_class.is_external                                  -- All Eiffel basic types are externals, and only basic types used
270                                    -- as reference are not external.
271                            l_base_class := base_class
272                            Result := is_basic or (not l_base_class.is_basic and l_base_class.is_external)
273                    end
274                    
275            is_generated_as_single_type: BOOLEAN is
276                            -- Is associated type generated as a single type or as an interface type and
277                            -- an implementation type.
278                    local
279                            l_class: CLASS_C
280                    do
281                                    -- Expanded types do not have an interface since no polymorphic calls
282                                    -- are done on them.
283                            Result := is_expanded
284                            if not Result then
285                                    l_class := base_class
286                                            -- When `base_class' is a basic class and that we are here, it means
287                                            -- that we are handling the reference version of the basic type, which
288                                            -- needs to be generated with the interface type and the implementation type
289                                    if not l_class.is_basic then
290                                                    -- External classes, or classes marked `frozen', or that
291                                                    -- inherites from external classes have only one generated type.
292                                            Result := l_class.is_single or l_class.is_frozen or l_class.is_external
293                                    end
294                            end
295                  end                  end
296    
297          is_valid: BOOLEAN is          is_valid: BOOLEAN is
298                          -- Is the base class still in the system and matches its specification?                          -- Is the base class still in the system and matches its specification?
299                    local
300                            l_base_class: like base_class
301                  do                  do
302                          Result := base_class /= Void and then (base_class.generics = Void)                          l_base_class := base_class
303                            Result := l_base_class /= Void and then (l_base_class.generics = Void)
304                  end                  end
305    
306          is_reference: BOOLEAN is          is_reference: BOOLEAN is
307                          -- Is the type a reference type ?                          -- Is the type a reference type ?
308                  do                  do
309                          Result := not is_true_expanded                          Result := not is_expanded
310                  end;                  end;
311    
312          is_explicit: BOOLEAN is          is_explicit: BOOLEAN is
# Line 292  feature -- Status Line 322  feature -- Status
322          has_associated_class_type: BOOLEAN is          has_associated_class_type: BOOLEAN is
323                          -- Has `Current' an associated class type?                          -- Has `Current' an associated class type?
324                  do                  do
325                          if is_true_expanded then                          Result := base_class.types.has_type (Current)
                                 is_true_expanded := False  
                                 Result := base_class.types.has_type (Current)  
                                 is_true_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  
326                  end                  end
327    
328          same_as (other: TYPE_I): BOOLEAN is          same_as (other: TYPE_I): BOOLEAN is
# Line 313  feature -- Status Line 333  feature -- Status
333                          other_cl_type ?= other                          other_cl_type ?= other
334                          Result := other_cl_type /= Void -- FIXME                          Result := other_cl_type /= Void -- FIXME
335                                          and then other_cl_type.class_id = class_id                                          and then other_cl_type.class_id = class_id
336                                          and then other_cl_type.is_true_expanded = is_true_expanded                                          and then other_cl_type.is_expanded = is_expanded
337                                          and then other_cl_type.is_separate = is_separate                                          and then other_cl_type.is_separate = is_separate
338                                          and then other_cl_type.meta_generic = Void                                          and then other_cl_type.meta_generic = Void
339                                          and then other_cl_type.true_generics = Void                                          and then other_cl_type.true_generics = Void
# Line 321  feature -- Status Line 341  feature -- Status
341    
342  feature -- Setting  feature -- Setting
343    
344          set_is_true_expanded (b: BOOLEAN) is          set_is_expanded (b: BOOLEAN) is
345                          -- Assign `b' to `is_true_expanded'.                          -- Assign `b' to `is_expanded'.
346                  do                  do
347                          is_true_expanded := b                          is_expanded := b
348                  ensure                  ensure
349                          is_true_expanded_set: is_true_expanded = b                          is_expanded_set: is_expanded = b
350                  end                  end
351    
352          set_is_separate (b: BOOLEAN) is          set_is_separate (b: BOOLEAN) is
# Line 341  feature -- Setting Line 361  feature -- Setting
361                          -- Set `cr_info' to `cinfo'.                          -- Set `cr_info' to `cinfo'.
362                  require                  require
363                          create_info_not_void: cinfo /= Void                          create_info_not_void: cinfo /= Void
364                            not_expanded: not is_expanded
365                  do                  do
366                          cr_info := cinfo                          cr_info := cinfo
367                  ensure                  ensure
368                          cr_info_set : cr_info = cinfo                          cr_info_set : cr_info = cinfo
369                  end                  end
370    
 feature -- Formatting  
   
         append_signature (st: STRUCTURED_TEXT) is  
                 do  
                         if is_true_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  
                 do  
                         buffer.putstring (debug_output)  
                 end  
   
371  feature -- C generation  feature -- C generation
372    
373          generate_expanded_creation (byte_code: BYTE_CODE; reg: REGISTRABLE; workbench_mode: BOOLEAN) is          generate_expanded_creation (byte_code: BYTE_CODE; reg: REGISTRABLE; workbench_mode: BOOLEAN) is
# Line 435  feature -- C generation Line 439  feature -- C generation
439          generate_cecil_value (buffer: GENERATION_BUFFER) is          generate_cecil_value (buffer: GENERATION_BUFFER) is
440                          -- Generate cecil value                          -- Generate cecil value
441                  do                  do
442                                  -- FIXME????: separate                          if not is_expanded then
                         if not is_true_expanded then  
443                                  buffer.putstring ("SK_DTYPE")                                  buffer.putstring ("SK_DTYPE")
444                          else                          else
445                                  buffer.putstring ("SK_EXP + (uint32) ")                                  buffer.putstring ("SK_EXP + (uint32) ")
# Line 466  feature -- Generic conformance Line 469  feature -- Generic conformance
469                          if final_mode then                          if final_mode then
470                                  Result := type_id - 1                                  Result := type_id - 1
471                          else                          else
472                                  Result := associated_class_type.static_type_id-1                                  Result := associated_class_type.static_type_id - 1
                         end  
   
                         if is_true_expanded then  
                                 Result := Expanded_level - Result  
473                          end                          end
474                  end                  end
475    
# Line 554  feature -- Generic conformance for IL Line 553  feature -- Generic conformance for IL
553                          end                              end    
554                  end                  end
555    
 feature -- Output  
   
         debug_output: STRING is  
                         -- String that should be displayed in debugger to represent `Current'.  
                 do  
                         create Result.make (32)  
                         if is_true_expanded then  
                                 Result.append ("expanded ")  
                         elseif is_separate then  
                                 Result.append ("separate ")  
                         end  
                         Result.append (base_class.name_in_upper)  
                 end  
   
556  feature {NONE} -- Implementation  feature {NONE} -- Implementation
557    
558          internal_il_type_name (a_base_name, a_prefix: STRING): STRING is          frozen internal_il_type_name (a_base_name, a_prefix: STRING): STRING is
559                          -- Full type name of `a_base_name' using `a_prefix' in IL code generation                          -- Full type name of `a_base_name' using `a_prefix' in IL code generation
560                          -- with namespace specification                          -- with namespace specification
561                  require                  require
562                          a_base_name_not_void: a_base_name /= Void                          a_base_name_not_void: a_base_name /= Void
563                  local                  local
564                          l_name: STRING                          l_name: STRING
565                            l_base_class: like base_class
566                  do                  do
567                          Result := a_base_name                          l_base_class := base_class
568                          l_name := base_class.lace_class.actual_namespace                                  -- Result needs to be in lower case because that's
569                                    -- what our casing conversion routines require to perform
570                                    -- a good job.
571                            if
572                                    (is_expanded and l_base_class.is_expanded) or
573                                    (not is_expanded and not l_base_class.is_expanded)
574                            then
575                                    Result := a_base_name.as_lower
576                            else
577                                    if is_expanded then
578                                            create Result.make (6 + a_base_name.count)
579                                            Result.append ("VALUE_")
580                                    else
581                                            create Result.make (10 + a_base_name.count)
582                                            Result.append ("REFERENCE_")
583                                    end
584                                    Result.append (a_base_name)
585                                    Result.to_lower
586                            end
587                            l_name := l_base_class.lace_class.actual_namespace
588                          if a_prefix /= Void then                          if a_prefix /= Void then
589                                  if l_name.is_empty then                                  if l_name.is_empty then
590                                          l_name := a_prefix + "."                                          l_name := a_prefix + "."
# Line 600  feature {NONE} -- Implementation Line 605  feature {NONE} -- Implementation
605                          internal_il_type_name_not_empty: not Result.is_empty                          internal_il_type_name_not_empty: not Result.is_empty
606                  end                  end
607    
608    invariant
609            class_id_positive: class_id > 0
610    
611  end  end

Legend:
Removed from v.40771  
changed lines
  Added in v.41824

  ViewVC Help
Powered by ViewVC 1.1.23