1 /* This C file is generated by NIT to compile module separate_options. */
2 #include "separate_options._sep.h"
3 val_t
separate_options___ToolContext___separate_options(val_t p0
){
4 struct {struct stack_frame_t me
;} fra
;
7 fra
.me
.prev
= stack_frame_head
; stack_frame_head
= &fra
.me
;
8 fra
.me
.file
= LOCATE_separate_options
;
10 fra
.me
.meth
= LOCATE_separate_options___ToolContext___separate_options
;
13 fra
.me
.REG
[0] = NIT_NULL
;
15 /* ./separate_options.nit:10 */
16 REGB0
= TAG_Bool(ATTR_separate_options___ToolContext_____atseparate_options(fra
.me
.REG
[0])!=NIT_NULL
);
17 if (UNTAG_Bool(REGB0
)) {
19 nit_abort("Uninitialized attribute %s", "@separate_options", LOCATE_separate_options
, 10);
21 fra
.me
.REG
[0] = ATTR_separate_options___ToolContext_____atseparate_options(fra
.me
.REG
[0]);
22 stack_frame_head
= fra
.me
.prev
;
25 void separate_options___ToolContext___separate_options__eq(val_t p0
, val_t p1
){
26 struct {struct stack_frame_t me
; val_t MORE_REG
[1];} fra
;
28 fra
.me
.prev
= stack_frame_head
; stack_frame_head
= &fra
.me
;
29 fra
.me
.file
= LOCATE_separate_options
;
31 fra
.me
.meth
= LOCATE_separate_options___ToolContext___separate_options__eq
;
34 fra
.me
.REG
[0] = NIT_NULL
;
35 fra
.me
.REG
[1] = NIT_NULL
;
38 /* ./separate_options.nit:10 */
39 ATTR_separate_options___ToolContext_____atseparate_options(fra
.me
.REG
[0]) = fra
.me
.REG
[1];
40 stack_frame_head
= fra
.me
.prev
;
43 val_t
separate_options___ToolContext___opt_cc_lib_paths(val_t p0
){
44 struct {struct stack_frame_t me
;} fra
;
47 fra
.me
.prev
= stack_frame_head
; stack_frame_head
= &fra
.me
;
48 fra
.me
.file
= LOCATE_separate_options
;
50 fra
.me
.meth
= LOCATE_separate_options___ToolContext___opt_cc_lib_paths
;
53 fra
.me
.REG
[0] = NIT_NULL
;
55 /* ./separate_options.nit:12 */
56 REGB0
= TAG_Bool(ATTR_separate_options___ToolContext_____atopt_cc_lib_paths(fra
.me
.REG
[0])!=NIT_NULL
);
57 if (UNTAG_Bool(REGB0
)) {
59 nit_abort("Uninitialized attribute %s", "@opt_cc_lib_paths", LOCATE_separate_options
, 12);
61 fra
.me
.REG
[0] = ATTR_separate_options___ToolContext_____atopt_cc_lib_paths(fra
.me
.REG
[0]);
62 stack_frame_head
= fra
.me
.prev
;
65 void separate_options___ToolContext___opt_cc_lib_paths__eq(val_t p0
, val_t p1
){
66 struct {struct stack_frame_t me
; val_t MORE_REG
[1];} fra
;
68 fra
.me
.prev
= stack_frame_head
; stack_frame_head
= &fra
.me
;
69 fra
.me
.file
= LOCATE_separate_options
;
71 fra
.me
.meth
= LOCATE_separate_options___ToolContext___opt_cc_lib_paths__eq
;
74 fra
.me
.REG
[0] = NIT_NULL
;
75 fra
.me
.REG
[1] = NIT_NULL
;
78 /* ./separate_options.nit:12 */
79 ATTR_separate_options___ToolContext_____atopt_cc_lib_paths(fra
.me
.REG
[0]) = fra
.me
.REG
[1];
80 stack_frame_head
= fra
.me
.prev
;
83 val_t
separate_options___ToolContext___opt_cc_libs(val_t p0
){
84 struct {struct stack_frame_t me
;} fra
;
87 fra
.me
.prev
= stack_frame_head
; stack_frame_head
= &fra
.me
;
88 fra
.me
.file
= LOCATE_separate_options
;
90 fra
.me
.meth
= LOCATE_separate_options___ToolContext___opt_cc_libs
;
93 fra
.me
.REG
[0] = NIT_NULL
;
95 /* ./separate_options.nit:13 */
96 REGB0
= TAG_Bool(ATTR_separate_options___ToolContext_____atopt_cc_libs(fra
.me
.REG
[0])!=NIT_NULL
);
97 if (UNTAG_Bool(REGB0
)) {
99 nit_abort("Uninitialized attribute %s", "@opt_cc_libs", LOCATE_separate_options
, 13);
101 fra
.me
.REG
[0] = ATTR_separate_options___ToolContext_____atopt_cc_libs(fra
.me
.REG
[0]);
102 stack_frame_head
= fra
.me
.prev
;
103 return fra
.me
.REG
[0];
105 void separate_options___ToolContext___opt_cc_libs__eq(val_t p0
, val_t p1
){
106 struct {struct stack_frame_t me
; val_t MORE_REG
[1];} fra
;
108 fra
.me
.prev
= stack_frame_head
; stack_frame_head
= &fra
.me
;
109 fra
.me
.file
= LOCATE_separate_options
;
111 fra
.me
.meth
= LOCATE_separate_options___ToolContext___opt_cc_libs__eq
;
112 fra
.me
.has_broke
= 0;
114 fra
.me
.REG
[0] = NIT_NULL
;
115 fra
.me
.REG
[1] = NIT_NULL
;
118 /* ./separate_options.nit:13 */
119 ATTR_separate_options___ToolContext_____atopt_cc_libs(fra
.me
.REG
[0]) = fra
.me
.REG
[1];
120 stack_frame_head
= fra
.me
.prev
;
123 val_t
separate_options___ToolContext___opt_cc_include_paths(val_t p0
){
124 struct {struct stack_frame_t me
;} fra
;
127 fra
.me
.prev
= stack_frame_head
; stack_frame_head
= &fra
.me
;
128 fra
.me
.file
= LOCATE_separate_options
;
130 fra
.me
.meth
= LOCATE_separate_options___ToolContext___opt_cc_include_paths
;
131 fra
.me
.has_broke
= 0;
133 fra
.me
.REG
[0] = NIT_NULL
;
135 /* ./separate_options.nit:14 */
136 REGB0
= TAG_Bool(ATTR_separate_options___ToolContext_____atopt_cc_include_paths(fra
.me
.REG
[0])!=NIT_NULL
);
137 if (UNTAG_Bool(REGB0
)) {
139 nit_abort("Uninitialized attribute %s", "@opt_cc_include_paths", LOCATE_separate_options
, 14);
141 fra
.me
.REG
[0] = ATTR_separate_options___ToolContext_____atopt_cc_include_paths(fra
.me
.REG
[0]);
142 stack_frame_head
= fra
.me
.prev
;
143 return fra
.me
.REG
[0];
145 void separate_options___ToolContext___opt_cc_include_paths__eq(val_t p0
, val_t p1
){
146 struct {struct stack_frame_t me
; val_t MORE_REG
[1];} fra
;
148 fra
.me
.prev
= stack_frame_head
; stack_frame_head
= &fra
.me
;
149 fra
.me
.file
= LOCATE_separate_options
;
151 fra
.me
.meth
= LOCATE_separate_options___ToolContext___opt_cc_include_paths__eq
;
152 fra
.me
.has_broke
= 0;
154 fra
.me
.REG
[0] = NIT_NULL
;
155 fra
.me
.REG
[1] = NIT_NULL
;
158 /* ./separate_options.nit:14 */
159 ATTR_separate_options___ToolContext_____atopt_cc_include_paths(fra
.me
.REG
[0]) = fra
.me
.REG
[1];
160 stack_frame_head
= fra
.me
.prev
;
163 void separate_options___ToolContext___init(val_t p0
, int* init_table
){
164 int itpos0
= VAL2OBJ(p0
)->vft
[INIT_TABLE_POS_mmloader___ToolContext
].i
;
165 struct {struct stack_frame_t me
; val_t MORE_REG
[3];} fra
;
168 if (init_table
[itpos0
]) return;
169 fra
.me
.prev
= stack_frame_head
; stack_frame_head
= &fra
.me
;
170 fra
.me
.file
= LOCATE_separate_options
;
172 fra
.me
.meth
= LOCATE_separate_options___ToolContext___init
;
173 fra
.me
.has_broke
= 0;
175 fra
.me
.REG
[0] = NIT_NULL
;
176 fra
.me
.REG
[1] = NIT_NULL
;
177 fra
.me
.REG
[2] = NIT_NULL
;
178 fra
.me
.REG
[3] = NIT_NULL
;
180 /* ./separate_options.nit:16 */
181 fra
.me
.REG
[1] = fra
.me
.REG
[0];
182 /* ./separate_options.nit:18 */
183 CALL_SUPER_separate_options___ToolContext___init(fra
.me
.REG
[0])(fra
.me
.REG
[0], init_table
);
184 /* ./separate_options.nit:20 */
185 fra
.me
.REG
[0] = CALL_separate_options___ToolContext___separate_options(fra
.me
.REG
[1])(fra
.me
.REG
[1]);
187 fra
.me
.REG
[2] = NEW_Array_standard___collection___array___Array___with_capacity(REGB0
);
188 fra
.me
.REG
[3] = CALL_separate_options___ToolContext___opt_cc_lib_paths(fra
.me
.REG
[1])(fra
.me
.REG
[1]);
189 CALL_standard___collection___abstract_collection___SimpleCollection___add(fra
.me
.REG
[2])(fra
.me
.REG
[2], fra
.me
.REG
[3]);
190 CALL_opts___OptionContext___add_option(fra
.me
.REG
[0])(fra
.me
.REG
[0], fra
.me
.REG
[2]);
191 /* ./separate_options.nit:21 */
192 fra
.me
.REG
[2] = CALL_separate_options___ToolContext___separate_options(fra
.me
.REG
[1])(fra
.me
.REG
[1]);
194 fra
.me
.REG
[0] = NEW_Array_standard___collection___array___Array___with_capacity(REGB0
);
195 fra
.me
.REG
[3] = CALL_separate_options___ToolContext___opt_cc_libs(fra
.me
.REG
[1])(fra
.me
.REG
[1]);
196 CALL_standard___collection___abstract_collection___SimpleCollection___add(fra
.me
.REG
[0])(fra
.me
.REG
[0], fra
.me
.REG
[3]);
197 CALL_opts___OptionContext___add_option(fra
.me
.REG
[2])(fra
.me
.REG
[2], fra
.me
.REG
[0]);
198 /* ./separate_options.nit:22 */
199 fra
.me
.REG
[0] = CALL_separate_options___ToolContext___separate_options(fra
.me
.REG
[1])(fra
.me
.REG
[1]);
201 fra
.me
.REG
[2] = NEW_Array_standard___collection___array___Array___with_capacity(REGB0
);
202 fra
.me
.REG
[1] = CALL_separate_options___ToolContext___opt_cc_include_paths(fra
.me
.REG
[1])(fra
.me
.REG
[1]);
203 CALL_standard___collection___abstract_collection___SimpleCollection___add(fra
.me
.REG
[2])(fra
.me
.REG
[2], fra
.me
.REG
[1]);
204 CALL_opts___OptionContext___add_option(fra
.me
.REG
[0])(fra
.me
.REG
[0], fra
.me
.REG
[2]);
205 stack_frame_head
= fra
.me
.prev
;
206 init_table
[itpos0
] = 1;
209 void separate_options___ToolContext___integrate_separate_options(val_t p0
, val_t p1
){
210 struct {struct stack_frame_t me
; val_t MORE_REG
[3];} fra
;
214 static val_t once_value_1
; /* Once value */
215 static val_t once_value_2
; /* Once value */
216 static val_t once_value_3
; /* Once value */
217 static val_t once_value_4
; /* Once value */
218 fra
.me
.prev
= stack_frame_head
; stack_frame_head
= &fra
.me
;
219 fra
.me
.file
= LOCATE_separate_options
;
221 fra
.me
.meth
= LOCATE_separate_options___ToolContext___integrate_separate_options
;
222 fra
.me
.has_broke
= 0;
224 fra
.me
.REG
[0] = NIT_NULL
;
225 fra
.me
.REG
[1] = NIT_NULL
;
226 fra
.me
.REG
[2] = NIT_NULL
;
227 fra
.me
.REG
[3] = NIT_NULL
;
230 /* ./separate_options.nit:27 */
231 fra
.me
.REG
[2] = CALL_separate_options___ToolContext___separate_options(fra
.me
.REG
[0])(fra
.me
.REG
[0]);
232 REGB0
= TAG_Char(' ');
233 fra
.me
.REG
[1] = CALL_standard___string_search___String___split_with(fra
.me
.REG
[1])(fra
.me
.REG
[1], REGB0
);
234 CALL_opts___OptionContext___parse(fra
.me
.REG
[2])(fra
.me
.REG
[2], fra
.me
.REG
[1]);
235 /* ./separate_options.nit:28 */
236 fra
.me
.REG
[1] = CALL_separate_options___ToolContext___separate_options(fra
.me
.REG
[0])(fra
.me
.REG
[0]);
237 fra
.me
.REG
[1] = CALL_opts___OptionContext___rest(fra
.me
.REG
[1])(fra
.me
.REG
[1]);
238 /* ./../lib/standard//collection//array.nit:23 */
239 REGB0
= TAG_Bool(ATTR_standard___collection___array___AbstractArrayRead____length(fra
.me
.REG
[1])!=NIT_NULL
);
240 if (UNTAG_Bool(REGB0
)) {
242 nit_abort("Uninitialized attribute %s", "_length", LOCATE_standard___collection___array
, 23);
244 REGB0
= ATTR_standard___collection___array___AbstractArrayRead____length(fra
.me
.REG
[1]);
245 /* ./separate_options.nit:28 */
247 /* ./../lib/standard//kernel.nit:217 */
248 REGB1
= TAG_Bool(UNTAG_Int(REGB0
)>UNTAG_Int(REGB1
));
249 /* ./separate_options.nit:28 */
250 if (UNTAG_Bool(REGB1
)) {
251 /* ./separate_options.nit:29 */
253 fra
.me
.REG
[1] = NEW_Array_standard___collection___array___Array___with_capacity(REGB1
);
255 fra
.me
.REG
[2] = BOX_NativeString("module ");
257 fra
.me
.REG
[2] = NEW_String_standard___string___String___with_native(fra
.me
.REG
[2], REGB1
);
258 once_value_1
= fra
.me
.REG
[2];
259 register_static_object(&once_value_1
);
260 } else fra
.me
.REG
[2] = once_value_1
;
261 fra
.me
.REG
[2] = fra
.me
.REG
[2];
262 CALL_standard___collection___abstract_collection___SimpleCollection___add(fra
.me
.REG
[1])(fra
.me
.REG
[1], fra
.me
.REG
[2]);
263 fra
.me
.REG
[2] = CALL_standard___string___Object___to_s(fra
.me
.REG
[0])(fra
.me
.REG
[0]);
264 CALL_standard___collection___abstract_collection___SimpleCollection___add(fra
.me
.REG
[1])(fra
.me
.REG
[1], fra
.me
.REG
[2]);
266 fra
.me
.REG
[2] = BOX_NativeString(" args file has unknown args: ");
268 fra
.me
.REG
[2] = NEW_String_standard___string___String___with_native(fra
.me
.REG
[2], REGB1
);
269 once_value_2
= fra
.me
.REG
[2];
270 register_static_object(&once_value_2
);
271 } else fra
.me
.REG
[2] = once_value_2
;
272 fra
.me
.REG
[2] = fra
.me
.REG
[2];
273 CALL_standard___collection___abstract_collection___SimpleCollection___add(fra
.me
.REG
[1])(fra
.me
.REG
[1], fra
.me
.REG
[2]);
274 fra
.me
.REG
[2] = CALL_separate_options___ToolContext___separate_options(fra
.me
.REG
[0])(fra
.me
.REG
[0]);
275 fra
.me
.REG
[2] = CALL_opts___OptionContext___rest(fra
.me
.REG
[2])(fra
.me
.REG
[2]);
277 fra
.me
.REG
[3] = BOX_NativeString(", ");
279 fra
.me
.REG
[3] = NEW_String_standard___string___String___with_native(fra
.me
.REG
[3], REGB1
);
280 once_value_3
= fra
.me
.REG
[3];
281 register_static_object(&once_value_3
);
282 } else fra
.me
.REG
[3] = once_value_3
;
283 fra
.me
.REG
[3] = fra
.me
.REG
[3];
284 fra
.me
.REG
[3] = CALL_standard___string___Collection___join(fra
.me
.REG
[2])(fra
.me
.REG
[2], fra
.me
.REG
[3]);
285 CALL_standard___collection___abstract_collection___SimpleCollection___add(fra
.me
.REG
[1])(fra
.me
.REG
[1], fra
.me
.REG
[3]);
287 fra
.me
.REG
[3] = BOX_NativeString("");
289 fra
.me
.REG
[3] = NEW_String_standard___string___String___with_native(fra
.me
.REG
[3], REGB1
);
290 once_value_4
= fra
.me
.REG
[3];
291 register_static_object(&once_value_4
);
292 } else fra
.me
.REG
[3] = once_value_4
;
293 fra
.me
.REG
[3] = fra
.me
.REG
[3];
294 CALL_standard___collection___abstract_collection___SimpleCollection___add(fra
.me
.REG
[1])(fra
.me
.REG
[1], fra
.me
.REG
[3]);
295 fra
.me
.REG
[1] = CALL_standard___string___Object___to_s(fra
.me
.REG
[1])(fra
.me
.REG
[1]);
296 CALL_mmloader___ToolContext___warning(fra
.me
.REG
[0])(fra
.me
.REG
[0], NIT_NULL
, fra
.me
.REG
[1]);
298 /* ./separate_options.nit:32 */
299 fra
.me
.REG
[1] = CALL_compiling___compiling_base___ToolContext___cc_lib_paths(fra
.me
.REG
[0])(fra
.me
.REG
[0]);
300 fra
.me
.REG
[3] = CALL_separate_options___ToolContext___opt_cc_lib_paths(fra
.me
.REG
[0])(fra
.me
.REG
[0]);
301 fra
.me
.REG
[3] = CALL_opts___Option___value(fra
.me
.REG
[3])(fra
.me
.REG
[3]);
302 CALL_standard___collection___abstract_collection___Sequence___append(fra
.me
.REG
[1])(fra
.me
.REG
[1], fra
.me
.REG
[3]);
303 /* ./separate_options.nit:33 */
304 fra
.me
.REG
[3] = CALL_compiling___compiling_base___ToolContext___cc_libs(fra
.me
.REG
[0])(fra
.me
.REG
[0]);
305 fra
.me
.REG
[1] = CALL_separate_options___ToolContext___opt_cc_libs(fra
.me
.REG
[0])(fra
.me
.REG
[0]);
306 fra
.me
.REG
[1] = CALL_opts___Option___value(fra
.me
.REG
[1])(fra
.me
.REG
[1]);
307 CALL_standard___collection___abstract_collection___Sequence___append(fra
.me
.REG
[3])(fra
.me
.REG
[3], fra
.me
.REG
[1]);
308 /* ./separate_options.nit:34 */
309 fra
.me
.REG
[1] = CALL_compiling___compiling_base___ToolContext___cc_include_paths(fra
.me
.REG
[0])(fra
.me
.REG
[0]);
310 fra
.me
.REG
[0] = CALL_separate_options___ToolContext___opt_cc_include_paths(fra
.me
.REG
[0])(fra
.me
.REG
[0]);
311 fra
.me
.REG
[0] = CALL_opts___Option___value(fra
.me
.REG
[0])(fra
.me
.REG
[0]);
312 CALL_standard___collection___abstract_collection___Sequence___append(fra
.me
.REG
[1])(fra
.me
.REG
[1], fra
.me
.REG
[0]);
313 stack_frame_head
= fra
.me
.prev
;
316 void separate_options___MMSrcModule___compile_separate_module(val_t p0
, val_t p1
){
317 struct {struct stack_frame_t me
; val_t MORE_REG
[3];} fra
;
320 static val_t once_value_1
; /* Once value */
321 static val_t once_value_2
; /* Once value */
322 fra
.me
.prev
= stack_frame_head
; stack_frame_head
= &fra
.me
;
323 fra
.me
.file
= LOCATE_separate_options
;
325 fra
.me
.meth
= LOCATE_separate_options___MMSrcModule___compile_separate_module
;
326 fra
.me
.has_broke
= 0;
328 fra
.me
.REG
[0] = NIT_NULL
;
329 fra
.me
.REG
[1] = NIT_NULL
;
330 fra
.me
.REG
[2] = NIT_NULL
;
331 fra
.me
.REG
[3] = NIT_NULL
;
334 /* ./separate_options.nit:40 */
335 fra
.me
.REG
[2] = fra
.me
.REG
[0];
336 fra
.me
.REG
[3] = fra
.me
.REG
[1];
337 /* ./separate_options.nit:42 */
338 CALL_SUPER_separate_options___MMSrcModule___compile_separate_module(fra
.me
.REG
[0])(fra
.me
.REG
[0], fra
.me
.REG
[1]);
339 /* ./separate_options.nit:45 */
341 fra
.me
.REG
[1] = NEW_Array_standard___collection___array___Array___with_capacity(REGB0
);
343 fra
.me
.REG
[0] = BOX_NativeString("");
345 fra
.me
.REG
[0] = NEW_String_standard___string___String___with_native(fra
.me
.REG
[0], REGB0
);
346 once_value_1
= fra
.me
.REG
[0];
347 register_static_object(&once_value_1
);
348 } else fra
.me
.REG
[0] = once_value_1
;
349 fra
.me
.REG
[0] = fra
.me
.REG
[0];
350 CALL_standard___collection___abstract_collection___SimpleCollection___add(fra
.me
.REG
[1])(fra
.me
.REG
[1], fra
.me
.REG
[0]);
351 fra
.me
.REG
[2] = CALL_metamodel___abstractmetamodel___MMModule___location(fra
.me
.REG
[2])(fra
.me
.REG
[2]);
352 fra
.me
.REG
[2] = CALL_location___Location___file(fra
.me
.REG
[2])(fra
.me
.REG
[2]);
353 REGB0
= TAG_Bool(fra
.me
.REG
[2]==NIT_NULL
);
354 if (UNTAG_Bool(REGB0
)) {
355 nit_abort("Reciever is null", NULL
, LOCATE_separate_options
, 45);
357 fra
.me
.REG
[2] = CALL_location___SourceFile___filename(fra
.me
.REG
[2])(fra
.me
.REG
[2]);
358 CALL_standard___collection___abstract_collection___SimpleCollection___add(fra
.me
.REG
[1])(fra
.me
.REG
[1], fra
.me
.REG
[2]);
360 fra
.me
.REG
[2] = BOX_NativeString(".args");
362 fra
.me
.REG
[2] = NEW_String_standard___string___String___with_native(fra
.me
.REG
[2], REGB0
);
363 once_value_2
= fra
.me
.REG
[2];
364 register_static_object(&once_value_2
);
365 } else fra
.me
.REG
[2] = once_value_2
;
366 fra
.me
.REG
[2] = fra
.me
.REG
[2];
367 CALL_standard___collection___abstract_collection___SimpleCollection___add(fra
.me
.REG
[1])(fra
.me
.REG
[1], fra
.me
.REG
[2]);
368 fra
.me
.REG
[1] = CALL_standard___string___Object___to_s(fra
.me
.REG
[1])(fra
.me
.REG
[1]);
369 /* ./separate_options.nit:46 */
370 REGB0
= CALL_standard___file___String___file_exists(fra
.me
.REG
[1])(fra
.me
.REG
[1]);
371 if (UNTAG_Bool(REGB0
)) {
372 /* ./separate_options.nit:47 */
373 fra
.me
.REG
[1] = NEW_IFStream_standard___file___IFStream___open(fra
.me
.REG
[1]);
374 /* ./separate_options.nit:48 */
375 fra
.me
.REG
[2] = CALL_standard___stream___IStream___read_all(fra
.me
.REG
[1])(fra
.me
.REG
[1]);
376 /* ./separate_options.nit:49 */
377 CALL_standard___stream___IOS___close(fra
.me
.REG
[1])(fra
.me
.REG
[1]);
378 /* ./separate_options.nit:51 */
379 fra
.me
.REG
[3] = CALL_compiling___compiling_base___CProgram___program(fra
.me
.REG
[3])(fra
.me
.REG
[3]);
380 fra
.me
.REG
[3] = CALL_program___Program___tc(fra
.me
.REG
[3])(fra
.me
.REG
[3]);
381 CALL_separate_options___ToolContext___integrate_separate_options(fra
.me
.REG
[3])(fra
.me
.REG
[3], fra
.me
.REG
[2]);
383 stack_frame_head
= fra
.me
.prev
;