@@ -463,15 +463,23 @@ fn (mut g Gen) array_init_with_fields(node ast.ArrayInit, elem_type Type, is_amp
463
463
}
464
464
}
465
465
466
- fn (mut g Gen) write_closure_fn (mut expr ast.AnonFn, var_name string ) {
467
- past := g.past_tmp_var_new ()
468
- fn_ptr_name := g.fn_var_signature (expr.decl.return_type, expr.decl.params.map (it .typ),
469
- past.tmp_var)
470
- g.write ('${fn_ptr_name} = ' )
466
+ fn (mut g Gen) declare_closure_fn (mut expr ast.AnonFn, var_name string ) {
467
+ decl_var := g.fn_var_signature (expr.decl.return_type, expr.decl.params.map (it .typ),
468
+ var_name)
469
+ g.write ('${decl_var} = ' )
471
470
g.gen_anon_fn (mut expr)
472
471
g.writeln (';' )
473
- g.past_tmp_var_done (past)
474
- g.write ('(${var_name} )' ) // usually `it`
472
+ }
473
+
474
+ fn (mut g Gen) write_closure_fn (mut expr ast.AnonFn, var_name string , declared_var string ) {
475
+ if declared_var == '' {
476
+ past := g.past_tmp_var_new ()
477
+ g.declare_closure_fn (mut expr, past.var_name)
478
+ g.past_tmp_var_done (past)
479
+ g.write ('(${var_name} )' ) // usually `it`
480
+ } else {
481
+ g.write ('${declared_var} (${var_name} )' )
482
+ }
475
483
}
476
484
477
485
// `nums.map(it % 2 == 0)`
@@ -515,6 +523,15 @@ fn (mut g Gen) gen_array_map(node ast.CallExpr) {
515
523
has_infix_left_var_name := g.write_prepared_tmp_value (past.tmp_var, node, ret_typ,
516
524
'{0}' )
517
525
g.writeln ('${past.tmp_var} = __new_array${noscan} (0, ${past.tmp_var} _len, sizeof(${ret_elem_type} ));\n ' )
526
+
527
+ mut closure_var := ''
528
+ if mut expr is ast.AnonFn {
529
+ if expr.inherited_vars.len > 0 {
530
+ closure_var = g.new_tmp_var ()
531
+ g.declare_closure_fn (mut expr, closure_var)
532
+ }
533
+ }
534
+
518
535
i := g.new_tmp_var ()
519
536
g.writeln ('for (int ${i} = 0; ${i} < ${past.tmp_var} _len; ++${i} ) {' )
520
537
g.indent++
@@ -526,7 +543,7 @@ fn (mut g Gen) gen_array_map(node ast.CallExpr) {
526
543
ast.AnonFn {
527
544
g.write ('${ret_elem_type} ${tmp_map_expr_result_name} = ' )
528
545
if expr.inherited_vars.len > 0 {
529
- g.write_closure_fn (mut expr, var_name)
546
+ g.write_closure_fn (mut expr, var_name, closure_var )
530
547
} else {
531
548
g.gen_anon_fn_decl (mut expr)
532
549
g.write ('${expr.decl.name} (${var_name} )' )
@@ -769,19 +786,29 @@ fn (mut g Gen) gen_array_filter(node ast.CallExpr) {
769
786
noscan := g.check_noscan (info.elem_type)
770
787
has_infix_left_var_name := g.write_prepared_tmp_value (past.tmp_var, node, styp, '{0}' )
771
788
g.writeln ('${past.tmp_var} = __new_array${noscan} (0, ${past.tmp_var} _len, sizeof(${elem_type_str} ));\n ' )
789
+
790
+ mut expr := node.args[0 ].expr
791
+ var_name := g.get_array_expr_param_name (mut expr)
792
+
793
+ mut closure_var := ''
794
+ if mut expr is ast.AnonFn {
795
+ if expr.inherited_vars.len > 0 {
796
+ closure_var = g.new_tmp_var ()
797
+ g.declare_closure_fn (mut expr, closure_var)
798
+ }
799
+ }
800
+
772
801
i := g.new_tmp_var ()
773
802
g.writeln ('for (int ${i} = 0; ${i} < ${past.tmp_var} _len; ++${i} ) {' )
774
803
g.indent++
775
- mut expr := node.args[0 ].expr
776
- var_name := g.get_array_expr_param_name (mut expr)
777
804
g.write_prepared_var (var_name, info, elem_type_str, past.tmp_var, i)
778
805
g.set_current_pos_as_last_stmt_pos ()
779
806
mut is_embed_map_filter := false
780
807
match mut expr {
781
808
ast.AnonFn {
782
809
g.write ('if (' )
783
810
if expr.inherited_vars.len > 0 {
784
- g.write_closure_fn (mut expr, var_name)
811
+ g.write_closure_fn (mut expr, var_name, closure_var )
785
812
} else {
786
813
g.gen_anon_fn_decl (mut expr)
787
814
g.write ('${expr.decl.name} (${var_name} )' )
@@ -1163,19 +1190,29 @@ fn (mut g Gen) gen_array_any(node ast.CallExpr) {
1163
1190
elem_type_str := g.typ (info.elem_type)
1164
1191
has_infix_left_var_name := g.write_prepared_tmp_value (past.tmp_var, node, 'bool' ,
1165
1192
'false' )
1193
+
1194
+ mut expr := node.args[0 ].expr
1195
+ var_name := g.get_array_expr_param_name (mut expr)
1196
+
1197
+ mut closure_var := ''
1198
+ if mut expr is ast.AnonFn {
1199
+ if expr.inherited_vars.len > 0 {
1200
+ closure_var = g.new_tmp_var ()
1201
+ g.declare_closure_fn (mut expr, closure_var)
1202
+ }
1203
+ }
1166
1204
i := g.new_tmp_var ()
1167
1205
g.writeln ('for (int ${i} = 0; ${i} < ${past.tmp_var} _len; ++${i} ) {' )
1168
1206
g.indent++
1169
- mut expr := node.args[0 ].expr
1170
- var_name := g.get_array_expr_param_name (mut expr)
1207
+
1171
1208
g.write_prepared_var (var_name, info, elem_type_str, past.tmp_var, i)
1172
1209
g.set_current_pos_as_last_stmt_pos ()
1173
1210
mut is_embed_map_filter := false
1174
1211
match mut expr {
1175
1212
ast.AnonFn {
1176
1213
g.write ('if (' )
1177
1214
if expr.inherited_vars.len > 0 {
1178
- g.write_closure_fn (mut expr, var_name)
1215
+ g.write_closure_fn (mut expr, var_name, closure_var )
1179
1216
} else {
1180
1217
g.gen_anon_fn_decl (mut expr)
1181
1218
g.write ('${expr.decl.name} (${var_name} )' )
@@ -1244,10 +1281,20 @@ fn (mut g Gen) gen_array_all(node ast.CallExpr) {
1244
1281
has_infix_left_var_name := g.write_prepared_tmp_value (past.tmp_var, node, 'bool' ,
1245
1282
'true' )
1246
1283
i := g.new_tmp_var ()
1247
- g.writeln ('for (int ${i} = 0; ${i} < ${past.tmp_var} _len; ++${i} ) {' )
1248
- g.indent++
1284
+
1249
1285
mut expr := node.args[0 ].expr
1250
1286
var_name := g.get_array_expr_param_name (mut expr)
1287
+
1288
+ mut closure_var := ''
1289
+ if mut expr is ast.AnonFn {
1290
+ if expr.inherited_vars.len > 0 {
1291
+ closure_var = g.new_tmp_var ()
1292
+ g.declare_closure_fn (mut expr, closure_var)
1293
+ }
1294
+ }
1295
+
1296
+ g.writeln ('for (int ${i} = 0; ${i} < ${past.tmp_var} _len; ++${i} ) {' )
1297
+ g.indent++
1251
1298
g.write_prepared_var (var_name, info, elem_type_str, past.tmp_var, i)
1252
1299
g.empty_line = true
1253
1300
g.set_current_pos_as_last_stmt_pos ()
@@ -1256,7 +1303,7 @@ fn (mut g Gen) gen_array_all(node ast.CallExpr) {
1256
1303
ast.AnonFn {
1257
1304
g.write ('if (!(' )
1258
1305
if expr.inherited_vars.len > 0 {
1259
- g.write_closure_fn (mut expr, var_name)
1306
+ g.write_closure_fn (mut expr, var_name, closure_var )
1260
1307
} else {
1261
1308
g.gen_anon_fn_decl (mut expr)
1262
1309
g.write ('${expr.decl.name} (${var_name} )' )
0 commit comments