File: run_feature_8.e

package info (click to toggle)
smarteiffel 1.1-11
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 12,288 kB
  • ctags: 40,785
  • sloc: ansic: 35,791; lisp: 4,036; sh: 1,783; java: 895; ruby: 613; python: 209; makefile: 115; csh: 78; cpp: 50
file content (345 lines) | stat: -rw-r--r-- 9,105 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
-- This file is part of SmartEiffel The GNU Eiffel Compiler Tools and Libraries
--
-- SmartEiffel is  free software;  you can redistribute it and/or  modify it
-- under  the terms of the  GNU General Public License, as published by  the
-- Free Software Foundation; either version 2, or (at your option) any later
-- version.
-- SmartEiffel is distributed in the hope that it will be useful but WITHOUT 
-- ANY WARRANTY;  without  even the implied warranty  of MERCHANTABILITY  or
-- FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-- more details.  You should have received a copy of  the GNU General Public
-- License along with SmartEiffel;  see the file COPYING.  If not,  write to
-- the Free Software Foundation,  Inc., 59 Temple Place - Suite 330,  Boston, 
-- MA 02111-1307, USA.
--
-- Copyright(C) 1994-2002: INRIA - LORIA (INRIA Lorraine) - ESIAL U.H.P.
--			   - University of Nancy 1 - FRANCE
-- Copyright(C) 2003:      INRIA - LORIA (INRIA Lorraine) - I.U.T. Charlemagne
--			   - University of Nancy 2 - FRANCE
--
--		 Dominique COLNET, Suzanne COLLIN, Olivier ZENDRA,
--			   Philippe RIBET, Cyril ADRIAN
--
-- http://SmartEiffel.loria.fr - SmartEiffel@loria.fr
--
class RUN_FEATURE_8

inherit RUN_FEATURE redefine base_feature, verify_scoop_expanded end

creation make

feature

   base_feature: EXTERNAL_FUNCTION

   arguments: FORMAL_ARG_LIST

   result_type: E_TYPE

   require_assertion: RUN_REQUIRE

   ensure_assertion: E_ENSURE

   is_deferred: BOOLEAN is False

   once_pre_computable: BOOLEAN is False

   side_effect_free: BOOLEAN is False

   is_once_procedure: BOOLEAN is False

   is_once_function: BOOLEAN is False

   arg_count: INTEGER is
      do
         if arguments /= Void then
            Result := arguments.count
         end
      end

   local_vars: LOCAL_VAR_LIST is do end

   routine_body: COMPOUND is do end

   rescue_compound: COMPOUND is do end

   afd_check is
      do
         routine_afd_check
      end

   simplify_2 is
      do
      end

   collect_c_tmp is
      do
         if result_type.is_user_expanded then
            if not result_type.is_dummy_expanded then
	       -- This may occurs when feature `twin':
               cpp.se_tmp_register(result_type)
            end
         end
      end

   mapping_c is
      local
         bf: like base_feature; native: NATIVE; bcn: STRING
	 unknown_position: POSITION; se_tmp_idx: INTEGER
      do
	 se_tmp_idx := cpp.se_tmp_open_expanded(result_type)
	 if in_scoop_wrapper then
            default_mapping_function
         else
            bf := base_feature
            native := bf.native
            bcn := bf.base_class.name.to_string
            native.c_mapping_function(Current,bcn,bf.first_name.to_string)
         end
	 if se_tmp_idx >= 0 then
	    cpp.se_tmp_close_expanded(se_tmp_idx)
	 end
      end

   c_define is
      local
         bf: like base_feature; native: NATIVE; bc: BASE_CLASS; bcn: STRING
      do
         bf := base_feature
         native := bf.native
	 bc := bf.base_class
	 if bc /= Void then
	    bcn := bc.name.to_string
	    native.c_define_function(Current,bcn,bf.first_name.to_string)
	 end
      end

   mapping_jvm is
      local
         bf: like base_feature; native: NATIVE; bcn: STRING
      do
         bf := base_feature
         native := bf.native
         bcn := bf.base_class.name.to_string
         native.jvm_mapping_function(Current,bcn,bf.first_name.to_string)
      end

feature {TYPE_BIT_2}

   integer_value(p: POSITION): INTEGER is
	 -- For some special constant only.
      local
         n: STRING
      do
	 n := name.to_string
	 debug
	    if eiffel_parser.case_insensitive then
	       check
		  as_integer_bits.is_equal(as_integer_bits.as_lower)
	       end
	    end
	 end
	 check
	    n = string_aliaser.item(n)
	    as_integer_bits = string_aliaser.item(as_integer_bits)
	 end
	 if as_integer_bits = n then
            Result := Integer_bits
         elseif as_character_bits = n then
            Result := Character_bits
         else
	    error_handler.add_position(p)
            error_handler.add_position(start_position)
            fatal_error(fz_iinaiv)
         end
      end

feature {RUN_CLASS}

   jvm_field_or_method is
      local
         bf: like base_feature; native: NATIVE; n, bcn: STRING
      do
         bf := base_feature
         n := bf.first_name.to_string
	 native := base_feature.native
	 bcn := bf.base_class.name.to_string
	 native.jvm_add_method_for_function(Current,bcn,n)
      end

   verify_scoop_expanded(p: POSITION) is
      do
         --default_verify_scoop_expanded(p)
      end

feature {JVM}

   jvm_define is
      local
         bf: like base_feature; native: NATIVE; n, bcn: STRING
      do
         bf := base_feature
         n := bf.first_name.to_string
	 native := bf.native
	 bcn := bf.base_class.name.to_string
	 native.jvm_define_function(Current,bcn,n)
      end

feature {NATIVE}

   external_c_prototype_from(p: POSITION) is
      do
         external_c_prototype(p,base_feature)
      end

   c_opening is
      do
         define_prototype
         c_define_opening
      end

   c_closing is
      do
         c_define_closing
         cpp.put_string(fz_15)
      end

   jvm_opening is
      do
         method_info_start
         jvm_define_opening
      end

   jvm_closing is
      do
         jvm_define_closing
         result_type.jvm_push_local(jvm_result_offset)
         result_type.run_type.jvm_return_code
         method_info.finish
      end

   jvm_closing_fast is
         -- Skip ensure and assume the result is already pushed.
      do
         result_type.run_type.jvm_return_code
         method_info.finish
      end

feature {ADDRESS_OF_POOL}

   address_of_c_define(caller: ADDRESS_OF) is
      do
      end

feature {ADDRESS_OF}

   address_of_c_mapping is
      do
	 cpp.put_string(base_feature.external_name)
      end

feature {RUN_FEATURE_8_VISITOR}

   accept(visitor: RUN_FEATURE_8_VISITOR) is
      do
         visitor.visit_run_feature_8(Current)
      end

feature {NONE}

   initialize is
      local
         n: STRING; rf: RUN_FEATURE; base_class: BASE_CLASS
      do
	 base_class := current_type.base_class
         n := base_feature.first_name.to_string
         arguments := base_feature.arguments
	 result_type := base_feature.result_type
	 if arguments = Void then
	    result_type := result_type.to_runnable(current_type)
	 elseif result_type.is_like_argument then
	    if not arguments.is_runnable(current_type) then
	       !!arguments.with(arguments,current_type)
	    end
	    result_type := result_type.to_runnable(current_type)
	 else
	    result_type := result_type.to_runnable(current_type)
	    if not arguments.is_runnable(current_type) then
	       !!arguments.with(arguments,current_type)
	    end
         end
         if base_class.require_check then
            require_assertion := base_class.run_require(Current)
         end
         if base_class.ensure_check then
            ensure_assertion := base_class.run_ensure(Current)
         end
         if n.has_prefix(fz_basic_) then
            smart_eiffel.register_sys_runtime_basic_of(n)
         elseif as_twin = n then
            rf := run_class.get_copy
         elseif as_se_argc = n then
            type_string.set_at_run_time
         elseif as_generating_type = n then
            smart_eiffel.set_generator_used
            smart_eiffel.set_generating_type_used
         elseif as_generator = n then
            smart_eiffel.set_generator_used
         elseif as_deep_twin = n then
            run_class.set_deep_twin_flag
         elseif as_is_deep_equal = n then
            run_class.set_is_deep_equal_flag
         elseif as_exception = n then
            exceptions_handler.set_used
         elseif as_signal_number = n then
            exceptions_handler.set_used
         end
	 base_feature.native.notify_external_assignments(arguments,
							 result_type)
      end

   c_define_body is
      local
         bf: like base_feature; native: NATIVE_SMART_EIFFEL; bcn: STRING
      do
         bf := base_feature
         native ?= bf.native
	 if native = Void then
	    not_yet_implemented
	 end
         bcn := bf.base_class.name.to_string
         native.scoop_define_function_body(Current,bcn,bf.first_name.to_string)
      end

   compute_use_current is
      do
         smart_eiffel.push(Current)
         if base_feature.use_current then
            use_current_state := True_state
         else
            std_compute_use_current
         end
         smart_eiffel.pop
      end

   compute_stupid_switch(run_time_set: RUN_TIME_SET) is
      do
         smart_eiffel.push(Current)
         if base_feature.native.stupid_switch_function(run_time_set,
						       name.to_string)
	  then
            stupid_switch_state := True_state
         else
            stupid_switch_state := False_state
         end
         smart_eiffel.pop
      end

   update_tmp_jvm_descriptor is
      do
         routine_update_tmp_jvm_descriptor
      end

   stupid_switch_comment: STRING is "SSERRF8"

end -- RUN_FEATURE_8