Skip to content

Commit

Permalink
fix
Browse files Browse the repository at this point in the history
  • Loading branch information
felipensp committed Apr 11, 2024
1 parent fa321ed commit fab4e1b
Showing 1 changed file with 78 additions and 19 deletions.
97 changes: 78 additions & 19 deletions vlib/v/gen/c/array.v
Original file line number Diff line number Diff line change
Expand Up @@ -463,15 +463,19 @@ fn (mut g Gen) array_init_with_fields(node ast.ArrayInit, elem_type Type, is_amp
}
}

fn (mut g Gen) write_closure_fn(mut expr ast.AnonFn, var_name string) {
past := g.past_tmp_var_new()
fn_ptr_name := g.fn_var_signature(expr.decl.return_type, expr.decl.params.map(it.typ),
past.tmp_var)
g.write('${fn_ptr_name} = ')
g.gen_anon_fn(mut expr)
g.writeln(';')
g.past_tmp_var_done(past)
g.write('(${var_name})') // usually `it`
fn (mut g Gen) write_closure_fn(mut expr ast.AnonFn, var_name string, declared_var string) {
if declared_var == '' {
past := g.past_tmp_var_new()
fn_ptr_name := g.fn_var_signature(expr.decl.return_type, expr.decl.params.map(it.typ),
past.tmp_var)
g.write('${fn_ptr_name} = ')
g.gen_anon_fn(mut expr)
g.writeln(';')
g.past_tmp_var_done(past)
g.write('(${var_name})') // usually `it`
} else {
g.write('${declared_var}(${var_name})')
}
}

// `nums.map(it % 2 == 0)`
Expand Down Expand Up @@ -515,6 +519,19 @@ fn (mut g Gen) gen_array_map(node ast.CallExpr) {
has_infix_left_var_name := g.write_prepared_tmp_value(past.tmp_var, node, ret_typ,
'{0}')
g.writeln('${past.tmp_var} = __new_array${noscan}(0, ${past.tmp_var}_len, sizeof(${ret_elem_type}));\n')

mut closure_var := ''
if mut expr is ast.AnonFn {
if expr.inherited_vars.len > 0 {
closure_var = g.new_tmp_var()
fn_ptr_name := g.fn_var_signature(expr.decl.return_type, expr.decl.params.map(it.typ),
closure_var)
g.write('${fn_ptr_name} = ')
g.gen_anon_fn(mut expr)
g.writeln(';')
}
}

i := g.new_tmp_var()
g.writeln('for (int ${i} = 0; ${i} < ${past.tmp_var}_len; ++${i}) {')
g.indent++
Expand All @@ -526,7 +543,7 @@ fn (mut g Gen) gen_array_map(node ast.CallExpr) {
ast.AnonFn {
g.write('${ret_elem_type} ${tmp_map_expr_result_name} = ')
if expr.inherited_vars.len > 0 {
g.write_closure_fn(mut expr, var_name)
g.write_closure_fn(mut expr, var_name, closure_var)
} else {
g.gen_anon_fn_decl(mut expr)
g.write('${expr.decl.name}(${var_name})')
Expand Down Expand Up @@ -769,19 +786,33 @@ fn (mut g Gen) gen_array_filter(node ast.CallExpr) {
noscan := g.check_noscan(info.elem_type)
has_infix_left_var_name := g.write_prepared_tmp_value(past.tmp_var, node, styp, '{0}')
g.writeln('${past.tmp_var} = __new_array${noscan}(0, ${past.tmp_var}_len, sizeof(${elem_type_str}));\n')

mut expr := node.args[0].expr
var_name := g.get_array_expr_param_name(mut expr)

mut closure_var := ''
if mut expr is ast.AnonFn {
if expr.inherited_vars.len > 0 {
closure_var = g.new_tmp_var()
fn_ptr_name := g.fn_var_signature(expr.decl.return_type, expr.decl.params.map(it.typ),
closure_var)
g.write('${fn_ptr_name} = ')
g.gen_anon_fn(mut expr)
g.writeln(';')
}
}

i := g.new_tmp_var()
g.writeln('for (int ${i} = 0; ${i} < ${past.tmp_var}_len; ++${i}) {')
g.indent++
mut expr := node.args[0].expr
var_name := g.get_array_expr_param_name(mut expr)
g.write_prepared_var(var_name, info, elem_type_str, past.tmp_var, i)
g.set_current_pos_as_last_stmt_pos()
mut is_embed_map_filter := false
match mut expr {
ast.AnonFn {
g.write('if (')
if expr.inherited_vars.len > 0 {
g.write_closure_fn(mut expr, var_name)
g.write_closure_fn(mut expr, var_name, closure_var)
} else {
g.gen_anon_fn_decl(mut expr)
g.write('${expr.decl.name}(${var_name})')
Expand Down Expand Up @@ -1163,19 +1194,33 @@ fn (mut g Gen) gen_array_any(node ast.CallExpr) {
elem_type_str := g.typ(info.elem_type)
has_infix_left_var_name := g.write_prepared_tmp_value(past.tmp_var, node, 'bool',
'false')

mut expr := node.args[0].expr
var_name := g.get_array_expr_param_name(mut expr)

mut closure_var := ''
if mut expr is ast.AnonFn {
if expr.inherited_vars.len > 0 {
closure_var = g.new_tmp_var()
fn_ptr_name := g.fn_var_signature(expr.decl.return_type, expr.decl.params.map(it.typ),
closure_var)
g.write('${fn_ptr_name} = ')
g.gen_anon_fn(mut expr)
g.writeln(';')
}
}
i := g.new_tmp_var()
g.writeln('for (int ${i} = 0; ${i} < ${past.tmp_var}_len; ++${i}) {')
g.indent++
mut expr := node.args[0].expr
var_name := g.get_array_expr_param_name(mut expr)

g.write_prepared_var(var_name, info, elem_type_str, past.tmp_var, i)
g.set_current_pos_as_last_stmt_pos()
mut is_embed_map_filter := false
match mut expr {
ast.AnonFn {
g.write('if (')
if expr.inherited_vars.len > 0 {
g.write_closure_fn(mut expr, var_name)
g.write_closure_fn(mut expr, var_name, closure_var)
} else {
g.gen_anon_fn_decl(mut expr)
g.write('${expr.decl.name}(${var_name})')
Expand Down Expand Up @@ -1244,10 +1289,24 @@ fn (mut g Gen) gen_array_all(node ast.CallExpr) {
has_infix_left_var_name := g.write_prepared_tmp_value(past.tmp_var, node, 'bool',
'true')
i := g.new_tmp_var()
g.writeln('for (int ${i} = 0; ${i} < ${past.tmp_var}_len; ++${i}) {')
g.indent++

mut expr := node.args[0].expr
var_name := g.get_array_expr_param_name(mut expr)

mut closure_var := ''
if mut expr is ast.AnonFn {
if expr.inherited_vars.len > 0 {
closure_var = g.new_tmp_var()
fn_ptr_name := g.fn_var_signature(expr.decl.return_type, expr.decl.params.map(it.typ),
closure_var)
g.write('${fn_ptr_name} = ')
g.gen_anon_fn(mut expr)
g.writeln(';')
}
}

g.writeln('for (int ${i} = 0; ${i} < ${past.tmp_var}_len; ++${i}) {')
g.indent++
g.write_prepared_var(var_name, info, elem_type_str, past.tmp_var, i)
g.empty_line = true
g.set_current_pos_as_last_stmt_pos()
Expand All @@ -1256,7 +1315,7 @@ fn (mut g Gen) gen_array_all(node ast.CallExpr) {
ast.AnonFn {
g.write('if (!(')
if expr.inherited_vars.len > 0 {
g.write_closure_fn(mut expr, var_name)
g.write_closure_fn(mut expr, var_name, closure_var)
} else {
g.gen_anon_fn_decl(mut expr)
g.write('${expr.decl.name}(${var_name})')
Expand Down

0 comments on commit fab4e1b

Please sign in to comment.