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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 28618 - (hide annotations)
Wed Oct 31 04:02:12 2001 UTC (18 years, 3 months ago) by manus
Original Path: trunk/Src/bench/Eiffel/eiffel/genericity/cl_type_i.e
File size: 8853 byte(s)
Implemented `typecode' that returns the typecode for elements in a TUPLE.

1 manus 26913 indexing
2     description: "Type class."
3     date: "$Date$"
4     revision: "$Revision$"
5 grator 18
6     class CL_TYPE_I
7    
8     inherit
9     TYPE_I
10     redefine
11     is_reference,
12 manus 26913 is_true_expanded,
13 xavierl 4623 is_separate,
14 grator 236 is_valid,
15 manus 11218 is_explicit,
16 manus 28380 is_external,
17 grator 18 same_as,
18     c_type,
19 grator 930 instantiation_in,
20 manus 10818 complete_instantiation_in,
21     conforms_to_array,
22     generated_id,
23 manus 11298 generate_cid,
24 manus 14013 make_gen_type_byte_code,
25     generate_cid_array,
26     generate_cid_init
27 grator 18 end
28    
29 manus 26913 feature -- Access
30 grator 18
31 manus 26913 base_id: INTEGER
32 grator 18 -- Base class id of the type class
33    
34     meta_generic: META_GENERIC is
35     -- Meta generic array describing the type class
36     do
37     -- No meta generic in non-generic type
38 manus 9655 end
39 grator 18
40 manus 10890 cr_info : CREATE_INFO
41     -- Additional information for the creation
42     -- of generic types with anchored parameters
43    
44 manus 10818 true_generics : ARRAY [TYPE_I] is
45     -- Array of generics: no mapping reference -> REFERENCE_I
46     do
47     -- Non generic types don't have them
48     end
49    
50 grator 18 base_class: CLASS_C is
51     -- Base class associated to the class type
52     do
53 manus 9655 Result := System.class_of_id (base_id)
54     end
55 grator 18
56 manus 26913 type_a: CL_TYPE_A is
57 grator 236 do
58 manus 26913 create Result
59     Result.set_is_true_expanded (is_true_expanded)
60     Result.set_is_separate (is_separate)
61     Result.set_base_class_id (base_id)
62 manus 9655 end
63 grator 236
64 manus 26913 il_type_name: STRING is
65     -- Class name of current type.
66 grator 18 do
67 manus 26913 Result := clone (base_class.external_class_name)
68 manus 11218 end
69    
70 grator 18 instantiation_in (other: GEN_TYPE_I): CL_TYPE_I is
71     -- Instantiation of Current in context of `other'
72 grator 282 require else
73     True
74 grator 18 do
75 manus 9655 Result := Current
76     end
77 grator 18
78 manus 10818 complete_instantiation_in (other: GEN_TYPE_I): CL_TYPE_I is
79     -- Instantiation of Current in context of `other'
80     require else
81     True
82     do
83     Result := Current
84     end
85    
86 grator 18 description: ATTR_DESC is
87     -- Type description for skeletons
88     local
89 michaels 7681 exp: EXPANDED_DESC
90     ref: REFERENCE_DESC
91 grator 485 do
92 manus 26913 if is_true_expanded then
93 manus 10140 !! exp
94 manus 26913 is_true_expanded := False
95 manus 10196 exp.set_class_type (base_class.types.conservative_search_item (Current))
96 manus 26913 is_true_expanded := True
97 manus 13232 exp.set_type_i (Current)
98 manus 9655 Result := exp
99 xavierl 4623 elseif is_separate then
100     -- FIXME
101     Result := c_type.description
102 grator 18 else
103 manus 9655 Result := c_type.description
104     end
105 michaels 7681
106     ref ?= Result
107     if ref /= Void then
108     ref.set_class_type_i (Current)
109     end
110 manus 9655 end
111 grator 18
112     c_type: TYPE_C is
113     -- Associated C type
114     do
115 manus 9655 Result := Reference_c_type
116     end
117 grator 18
118 manus 28618 typecode: INTEGER is
119     -- Typecode for TUPLE element.
120     do
121     Result := feature {SHARED_TYPECODE}.reference_code
122     end
123    
124 grator 18 associated_class_type: CLASS_TYPE is
125     -- Associated class type
126 michaels 7681 require
127 manus 16188 -- has: has_associated_class_type
128 grator 485 do
129 manus 26913 if is_true_expanded then
130     is_true_expanded := False
131 manus 11065 Result := base_class.types.conservative_search_item (Current)
132 manus 26913 is_true_expanded := True
133 xavierl 4623 elseif is_separate then
134 manus 11065 is_separate := False
135     Result := base_class.types.conservative_search_item (Current)
136     is_separate := True
137 grator 485 else
138 manus 10196 Result := base_class.types.conservative_search_item (Current)
139 manus 9655 end
140     end
141 grator 18
142     type_id: INTEGER is
143     -- Type id of the correponding class type
144     do
145 manus 9655 Result := associated_class_type.type_id
146     end
147 grator 18
148     expanded_type_id: INTEGER is
149     -- Type id of the corresponding expanded class type
150     do
151 manus 26913 is_true_expanded := False
152 manus 11065 Result := base_class.types.conservative_search_item (Current).type_id
153 manus 26913 is_true_expanded := True
154 manus 9655 end
155 grator 18
156 manus 26913 sk_value: INTEGER is
157     -- Generate SK value associated to the current type.
158 grator 18 do
159 xavierl 4623 -- FIXME????: separate
160 manus 26913 if not is_true_expanded then
161     Result := Sk_ref + (type_id - 1)
162 grator 18 else
163 manus 26913 is_true_expanded := False
164     Result := Sk_exp + (type_id - 1)
165     is_true_expanded := True
166 manus 9655 end
167     end
168 grator 18
169 manus 26913 cecil_value: INTEGER is
170     do
171     -- FIXME????: separate
172     if not is_true_expanded then
173     Result := Sk_dtype
174     else
175     Result := Sk_exp + base_id
176     end
177     end
178    
179 grator 18 hash_code: INTEGER is
180     -- Hash code for current type
181     do
182 manus 26913 Result := Other_code + base_id
183 manus 9655 end
184 grator 18
185 manus 26913 feature -- Status
186    
187     is_true_expanded: BOOLEAN
188     -- Is the type expanded?
189    
190     is_separate: BOOLEAN
191     -- Is the type separate?
192    
193     is_enum: BOOLEAN is
194     -- Is current type an IL enum type?
195     -- Useful to find out if some call optimization can be done
196     -- in FEATURE_B.
197     require
198     il_generation: System.il_generation
199 grator 18 do
200 manus 26913 Result := is_true_expanded and then base_class.is_enum
201     end
202    
203 manus 28380 is_external: BOOLEAN is
204     -- Is current type an IL enum type?
205     -- Useful to find out if some call optimization can be done
206     -- in FEATURE_B.
207     do
208     Result := base_class.is_external
209     end
210    
211 manus 26913 is_valid: BOOLEAN is
212     -- Is the base class still in the system ?
213     do
214     Result := base_class /= Void
215     end
216    
217     is_reference: BOOLEAN is
218     -- Is the type a reference type ?
219     do
220     Result := not is_true_expanded
221     end;
222    
223     is_explicit: BOOLEAN is
224    
225     do
226     Result := (cr_info = Void) or else is_expanded
227     end
228    
229     has_associated_class_type: BOOLEAN is
230     -- Has `Current' an associated class type?
231     do
232     if is_true_expanded then
233     is_true_expanded := False
234     Result := base_class.types.has_type (Current)
235     is_true_expanded := True
236     elseif is_separate then
237     is_separate := False
238     Result := base_class.types.has_type (Current)
239     is_separate := True
240 grator 18 else
241 manus 26913 Result := base_class.types.has_type (Current)
242 manus 9655 end
243     end
244 grator 18
245 manus 26913 same_as (other: TYPE_I): BOOLEAN is
246     -- Is `other' equal to Current ?
247     local
248     other_cl_type: CL_TYPE_I
249 grator 508 do
250 manus 26913 other_cl_type ?= other
251     Result := other_cl_type /= Void -- FIXME
252     and then other_cl_type.base_id = base_id
253     and then other_cl_type.is_true_expanded = is_true_expanded
254     and then other_cl_type.is_separate = is_separate
255     and then other_cl_type.meta_generic = Void
256     and then other_cl_type.true_generics = Void
257     end
258    
259     feature -- Setting
260    
261     set_base_id (c: INTEGER) is
262     -- Assign `c' to `base_id'.
263     do
264     base_id := c
265     end
266    
267     set_is_true_expanded (b: BOOLEAN) is
268     -- Assign `b' to `is_true_expanded'.
269     do
270     is_true_expanded := b
271     end
272    
273     set_is_separate (b: BOOLEAN) is
274     -- Assign `b' to `is_separate'.
275     do
276     is_separate := b
277     end
278    
279     set_cr_info (cinfo : CREATE_INFO) is
280     -- Set `cr_info' to `cinfo'.
281     do
282     cr_info := cinfo
283     ensure
284     cr_info_set : cr_info = cinfo
285     end
286    
287     feature -- Formatting
288    
289     append_signature (st: STRUCTURED_TEXT) is
290     do
291     if is_true_expanded then
292     st.add_string ("expanded ")
293     elseif is_separate then
294     st.add_string ("separate ")
295     end
296     base_class.append_signature (st)
297     end
298    
299     dump (buffer: GENERATION_BUFFER) is
300     local
301     s: STRING
302     do
303     if is_true_expanded then
304     buffer.putstring ("expanded ")
305     elseif is_separate then
306     buffer.putstring ("separate ")
307     end
308     s := clone (base_class.name)
309     s.to_upper
310     buffer.putstring (s)
311     end
312    
313     feature -- C generation
314    
315     generate_cecil_value (buffer: GENERATION_BUFFER) is
316     -- Generate cecil value
317     do
318 xavierl 4623 -- FIXME????: separate
319 manus 26913 if not is_true_expanded then
320     buffer.putstring ("SK_DTYPE")
321 grator 508 else
322 manus 26913 buffer.putstring ("SK_EXP + (uint32) ")
323     buffer.putint (base_id)
324 manus 9655 end
325     end
326 grator 508
327 grator 930 feature -- Array optimization
328    
329     conforms_to_array: BOOLEAN is
330     do
331     Result := base_class.conform_to (array_class_c)
332 manus 9655 end
333 grator 930
334     feature {NONE} -- Array optimization
335    
336     array_class_c: CLASS_C is
337     once
338     Result := System.array_class.compiled_class
339 manus 9655 end
340 grator 930
341 manus 10818 feature -- Generic conformance
342    
343     generated_id (final_mode : BOOLEAN) : INTEGER is
344 manus 11298
345 manus 10818 do
346 manus 11298 if final_mode then
347     Result := type_id - 1
348 manus 10818 else
349 manus 26913 Result := associated_class_type.static_type_id-1
350 manus 10818 end
351 manus 11298
352 manus 26913 if is_true_expanded then
353     Result := Expanded_level - Result
354 manus 11298 end
355 manus 10818 end
356    
357 manus 11599 generate_cid (buffer : GENERATION_BUFFER; final_mode, use_info : BOOLEAN) is
358 manus 11298
359 manus 10818 do
360 manus 11209 if
361     use_info and then (cr_info /= Void)
362 manus 26913 and then not is_expanded
363 manus 11209 then
364     -- It's an anchored type
365 manus 11599 cr_info.generate_cid (buffer, final_mode)
366 manus 10890 end
367 manus 11599 buffer.putint (generated_id (final_mode))
368     buffer.putstring (", ")
369 manus 10818 end
370    
371 manus 10890 make_gen_type_byte_code (ba : BYTE_ARRAY; use_info : BOOLEAN) is
372 manus 10818 do
373 manus 11209 if
374     use_info and then (cr_info /= Void)
375 manus 26913 and then not is_expanded
376 manus 11209 then
377     -- It's an anchored type
378 manus 10890 cr_info.make_gen_type_byte_code (ba)
379     end
380 manus 10818 ba.append_short_integer (generated_id (False))
381     end
382    
383 manus 14013 generate_cid_array (buffer : GENERATION_BUFFER;
384     final_mode, use_info : BOOLEAN; idx_cnt : COUNTER) is
385     local
386     dummy : INTEGER
387     do
388     if
389     use_info and then (cr_info /= Void)
390 manus 26913 and then not is_expanded
391 manus 14013 then
392     -- It's an anchored type
393     cr_info.generate_cid_array (buffer, final_mode, idx_cnt)
394     end
395     buffer.putint (generated_id (final_mode))
396     buffer.putstring (", ")
397    
398     -- Increment counter
399     dummy := idx_cnt.next
400     end
401    
402     generate_cid_init (buffer : GENERATION_BUFFER;
403     final_mode, use_info : BOOLEAN; idx_cnt : COUNTER) is
404     local
405     dummy : INTEGER
406     do
407     if
408     use_info and then (cr_info /= Void)
409 manus 26913 and then not is_expanded
410 manus 14013 then
411     -- It's an anchored type
412     cr_info.generate_cid_init (buffer, final_mode, idx_cnt)
413     end
414    
415     dummy := idx_cnt.next
416     end
417 grator 18 end

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

  ViewVC Help
Powered by ViewVC 1.1.23