/[eiffelstudio]/branches/eth/eve/Src/Eiffel/API/evaluated_type/like_current.e
ViewVC logotype

Diff of /branches/eth/eve/Src/Eiffel/API/evaluated_type/like_current.e

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

revision 72418 by alexk, Sat Dec 29 06:34:55 2007 UTC revision 72419 by manus, Sat Feb 23 00:45:27 2008 UTC
# Line 11  class Line 11  class
11  inherit  inherit
12          LIKE_TYPE_A          LIKE_TYPE_A
13                  redefine                  redefine
14                          actual_type, associated_class, conform_to, conformance_type, convert_to,                          actual_type, associated_class, associated_class_type, conform_to, conformance_type, convert_to,
15                          generics, has_associated_class, instantiated_in, duplicate,                          generics, has_associated_class, has_associated_class_type, instantiated_in, duplicate,
16                          is_basic, is_expanded, is_external, is_like_current, is_none, is_reference,                          is_basic, is_expanded, is_external, is_like_current, is_none, is_reference,
17                          meta_type, set_actual_type, type_i, evaluated_type_in_descendant, is_tuple,                          meta_type, set_actual_type, evaluated_type_in_descendant, is_tuple,
18                          set_attached_mark, set_detachable_mark                          set_attached_mark, set_detachable_mark, description, c_type, is_explicit,
19                            generated_id, generate_cid, generate_cid_array, generate_cid_init,
20                            make_gen_type_byte_code, generate_gen_type_il, internal_is_valid_for_class,
21                            maximum_interval_value, minimum_interval_value, is_optimized_as_frozen,
22                            is_generated_as_single_type, heaviest, instantiation_in, adapted_in,
23                            hash_code, internal_generic_derivation, internal_same_generic_derivation_as,
24                            is_class_valid, skeleton_adapted_in, good_generics, has_like_current
25                  end                  end
26    
27  feature -- Visitor  feature -- Visitor
# Line 37  feature -- Properties Line 43  feature -- Properties
43          has_associated_class: BOOLEAN is          has_associated_class: BOOLEAN is
44                          -- Does Current have an associated class?                          -- Does Current have an associated class?
45                  do                  do
46                          Result :=                          Result := conformance_type /= Void and then conformance_type.has_associated_class
                                 conformance_type /= Void and then  
                                 conformance_type.has_associated_class  
47                  end                  end
48    
49          is_like_current: BOOLEAN is True          has_associated_class_type (a_context_type: TYPE_A): BOOLEAN is
50                            -- Does Current have an associated class?
51                    do
52                            Result := conformance_type /= Void and then conformance_type.has_associated_class_type (a_context_type)
53                    end
54    
55            is_class_valid: BOOLEAN is
56                    do
57                            Result := conformance_type /= Void and then conformance_type.is_class_valid
58                    end
59    
60            has_like_current, is_like_current: BOOLEAN is True
61                          -- Is the current type an anchored type on Current ?                          -- Is the current type an anchored type on Current ?
62    
63            is_explicit: BOOLEAN is False
64                            -- Is type fixed at compile time without anchors or formals?
65                            --| Ideally, it is explicit if at runtime there is no descendants and
66                            --| that conformance_type is also explicit (to prevent case
67                            --| where like Current represents A [G] for which we can have
68                            --| many types) using the following code
69                            --|     Result := associated_class.direct_descendants.is_empty and then
70                            --|             conformance_type.is_explicit
71                            --| Unfortunately it does not work because code generation is still
72                            --| generating `dftype' instead which cannot be used in static array
73                            --| type initialization.
74    
75          is_expanded: BOOLEAN is          is_expanded: BOOLEAN is
76                          -- Is type expanded?                          -- Is type expanded?
77                  do                  do
# Line 75  feature -- Properties Line 102  feature -- Properties
102          is_none: BOOLEAN is False          is_none: BOOLEAN is False
103                          -- Is current actual type NONE?                          -- Is current actual type NONE?
104    
105          is_basic: BOOLEAN is False          is_basic: BOOLEAN is
106                          -- Is the current actual type a basic one?                          -- Is the current actual type a basic one?
107                    do
108                            if conformance_type /= Void then
109                                    Result := conformance_type.is_basic
110                            end
111                    end
112    
113          same_as (other: TYPE_A): BOOLEAN is          same_as (other: TYPE_A): BOOLEAN is
114                          -- Is the current type the same as `other' ?                          -- Is the current type the same as `other' ?
# Line 89  feature -- Properties Line 121  feature -- Properties
121                          end                          end
122                  end                  end
123    
124            good_generics: BOOLEAN is True
125                            --| A current type always has the right number of generic parameter.
126    
127  feature -- Access  feature -- Access
128    
129            hash_code: INTEGER is
130                    do
131                            Result := {SHARED_HASH_CODE}.other_code
132                    end
133    
134          associated_class: CLASS_C is          associated_class: CLASS_C is
135                          -- Associated class                          -- Associated class
136                  do                  do
137                          Result := conformance_type.associated_class                          Result := conformance_type.associated_class
138                  end                  end
139    
140            associated_class_type (a_context_type: TYPE_A): CLASS_TYPE is
141                            -- Associated class
142                    do
143                            Result := conformance_type.associated_class_type (a_context_type)
144                    end
145    
146          generics: ARRAY [TYPE_A] is          generics: ARRAY [TYPE_A] is
147                          -- Actual generic types                          -- Actual generic types
148                  do                  do
# Line 105  feature -- Access Line 151  feature -- Access
151                          end                          end
152                  end                  end
153    
154            description: GENERIC_DESC is
155                    do
156                            create Result
157                            Result.set_type_i (Current)
158                    end
159    
160            c_type: TYPE_C is
161                    do
162                            if conformance_type /= Void then
163                                    Result := conformance_type.c_type
164                            else
165                                    Result := reference_c_type
166                            end
167                    end
168    
169  feature -- Comparison  feature -- Comparison
170    
171          is_equivalent (other: like Current): BOOLEAN is          is_equivalent (other: like Current): BOOLEAN is
# Line 134  feature -- Output Line 195  feature -- Output
195    
196          ext_append_to (st: TEXT_FORMATTER; c: CLASS_C) is          ext_append_to (st: TEXT_FORMATTER; c: CLASS_C) is
197                  do                  do
198                          st.process_symbol_text (ti_L_bracket)                          st.process_symbol_text ({SHARED_TEXT_ITEMS}.ti_L_bracket)
199                          if has_attached_mark then                          if has_attached_mark then
200                                  st.process_symbol_text (ti_exclamation)                                  st.process_symbol_text ({SHARED_TEXT_ITEMS}.ti_exclamation)
201                          elseif has_detachable_mark then                          elseif has_detachable_mark then
202                                  st.process_symbol_text (ti_question)                                  st.process_symbol_text ({SHARED_TEXT_ITEMS}.ti_question)
203                          end                          end
204                          st.process_keyword_text (ti_Like_keyword, Void)                          st.process_keyword_text ({SHARED_TEXT_ITEMS}.ti_Like_keyword, Void)
205                          st.add_space                          st.add_space
206                          st.process_keyword_text (ti_Current, Void)                          st.process_keyword_text ({SHARED_TEXT_ITEMS}.ti_Current, Void)
207                          st.process_symbol_text (ti_R_bracket)                          st.process_symbol_text ({SHARED_TEXT_ITEMS}.ti_R_bracket)
208                          st.add_space                          st.add_space
209                          conformance_type.ext_append_to (st, c)                          conformance_type.ext_append_to (st, c)
210                  end                  end
211    
212    feature -- IL code generation
213    
214            minimum_interval_value: INTERVAL_VAL_B is
215                    require else
216                            valid_type: conformance_type.is_integer or conformance_type.is_natural or conformance_type.is_character
217                    do
218                            Result := conformance_type.minimum_interval_value
219                    end
220    
221            maximum_interval_value: INTERVAL_VAL_B is
222                    require else
223                            valid_type: conformance_type.is_integer or conformance_type.is_natural or conformance_type.is_character
224                    do
225                            Result := conformance_type.maximum_interval_value
226                    end
227    
228            heaviest (other: TYPE_A): TYPE_A
229                    do
230                            Result := conformance_type.heaviest (other)
231                    end
232    
233            is_optimized_as_frozen: BOOLEAN is
234                    do
235                            Result := conformance_type.is_optimized_as_frozen
236                    end
237    
238            is_generated_as_single_type: BOOLEAN is
239                            -- Is associated type generated as a single type or as an interface type and
240                            -- an implementation type.
241                    do
242                            Result := conformance_type.is_generated_as_single_type
243                    end
244    
245    feature -- Generic conformance
246    
247            generated_id (final_mode: BOOLEAN; a_context_type: TYPE_A): NATURAL_16 is
248                            -- Id of a `like xxx'.
249                    do
250                            Result := {SHARED_GEN_CONF_LEVEL}.like_current_type
251                    end
252    
253            generate_cid (buffer: GENERATION_BUFFER; final_mode, use_info: BOOLEAN; a_context_type: TYPE_A) is
254                            -- Generate mode dependent sequence of type id's
255                            -- separated by commas. `use_info' is true iff
256                            -- we generate code for a creation instruction.
257                    do
258                            if use_info then
259                                    create_info.generate_cid (buffer, final_mode)
260                            else
261                                    conformance_type.generate_cid (buffer, final_mode, use_info, a_context_type)
262                            end
263                    end
264    
265            generate_cid_array (buffer: GENERATION_BUFFER; final_mode, use_info: BOOLEAN; idx_cnt: COUNTER; a_context_type: TYPE_A) is
266                    do
267                            if use_info then
268                                    create_info.generate_cid_array (buffer, final_mode, idx_cnt)
269                            else
270                                    conformance_type.generate_cid_array (buffer, final_mode, use_info, idx_cnt, a_context_type)
271                            end
272                    end
273    
274            generate_cid_init (buffer: GENERATION_BUFFER; final_mode, use_info: BOOLEAN; idx_cnt: COUNTER; a_level: NATURAL) is
275                    do
276                            if use_info then
277                                    create_info.generate_cid_init (buffer, final_mode, idx_cnt, a_level)
278                            else
279                                    conformance_type.generate_cid_init (buffer, final_mode, use_info, idx_cnt, a_level)
280                            end
281                    end
282    
283            make_gen_type_byte_code (ba: BYTE_ARRAY; use_info: BOOLEAN; a_context_type: TYPE_A) is
284                    do
285                            if use_info then
286                                    create_info.make_gen_type_byte_code (ba)
287                            else
288                                    conformance_type.make_gen_type_byte_code (ba, use_info, a_context_type)
289                            end
290                    end
291    
292            generate_gen_type_il (il_generator: IL_CODE_GENERATOR; use_info: BOOLEAN) is
293                            -- `use_info' is true iff we generate code for a
294                            -- creation instruction.
295                    do
296                            il_generator.generate_current_as_reference
297                            il_generator.load_type
298                    end
299    
300    feature {TYPE_A} -- Helpers
301    
302            internal_is_valid_for_class (a_class: CLASS_C): BOOLEAN is
303                            -- Is current type valid?
304                    do
305                                    -- If no `conformance_type' is specified, then `like Current' makes sense.
306                                    -- If one is specified, then it should be correct.
307                            Result := conformance_type = Void or else conformance_type.internal_is_valid_for_class (a_class)
308                    end
309    
310            internal_generic_derivation (a_level: INTEGER_32): TYPE_A is
311                    do
312                                    -- We keep the same level since we are merely forwarding the call.
313                            Result := conformance_type.internal_generic_derivation (a_level)
314                    end
315    
316            internal_same_generic_derivation_as (current_type, other: TYPE_A; a_level: INTEGER_32): BOOLEAN is
317                    do
318                                    -- We keep the same level since we are merely forwarding the call.
319                            Result := conformance_type.internal_same_generic_derivation_as (current_type, other, a_level)
320                    end
321    
322  feature {COMPILER_EXPORTER} -- Modification  feature {COMPILER_EXPORTER} -- Modification
323    
324          set_actual_type (a: TYPE_A) is          set_actual_type (a: TYPE_A) is
# Line 235  feature {COMPILER_EXPORTER} -- Primitive Line 406  feature {COMPILER_EXPORTER} -- Primitive
406                          end                          end
407                  end                  end
408    
409            adapted_in, skeleton_adapted_in (a_class_type: CLASS_TYPE): CL_TYPE_A is
410                            -- Instantiation of Current in context of `other'.
411                    do
412                            Result := a_class_type.type
413                    end
414    
415          instantiated_in (class_type: TYPE_A): TYPE_A is          instantiated_in (class_type: TYPE_A): TYPE_A is
416                          -- Instantiation of Current in the context of `class_type'                          -- Instantiation of Current in the context of `class_type'
417                          -- assuming that Current is written in the associated class                          -- assuming that Current is written in the associated class
# Line 277  feature {COMPILER_EXPORTER} -- Primitive Line 454  feature {COMPILER_EXPORTER} -- Primitive
454                          end                          end
455                  end                  end
456    
457          create_info: CREATE_CURRENT is          create_info, shared_create_info: CREATE_CURRENT is
458                          -- Byte code information for entity type creation                          -- Byte code information for entity type creation
459                  once                  once
460                          create Result                          create Result
# Line 296  feature {COMPILER_EXPORTER} -- Primitive Line 473  feature {COMPILER_EXPORTER} -- Primitive
473                          Result := conformance_type.convert_to (a_context_class, a_target_type)                          Result := conformance_type.convert_to (a_context_class, a_target_type)
474                  end                  end
475    
476          type_i: TYPE_I is          meta_type: TYPE_A is
                         -- C type.  
                 once  
                         create {LIKE_CURRENT_I} Result  
                 end  
   
         meta_type: TYPE_I is  
477                          -- Meta type.                          -- Meta type.
478                  do                  do
479                          Result := type_i                          Result := conformance_type.meta_type
480                  end                  end
481    
482  indexing  indexing

Legend:
Removed from v.72418  
changed lines
  Added in v.72419

  ViewVC Help
Powered by ViewVC 1.1.23