Skip to content

Commit 343ea6e

Browse files
committed
v3: address transitive init and mut for reviews
1 parent a4daa4c commit 343ea6e

4 files changed

Lines changed: 42 additions & 8 deletions

File tree

vlib/v3/gen/c/cleanc.v

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -366,9 +366,7 @@ fn (g &FlatGen) visit_module_init(mod string, module_to_init map[string]string,
366366
}
367367
visiting[mod] = true
368368
for dep in g.module_imports[mod] or { []string{} } {
369-
if dep in module_to_init {
370-
g.visit_module_init(dep, module_to_init, mut visiting, mut visited, mut result)
371-
}
369+
g.visit_module_init(dep, module_to_init, mut visiting, mut visited, mut result)
372370
}
373371
visiting.delete(mod)
374372
visited[mod] = true

vlib/v3/tests/type_checker_errors_test.v

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,9 @@ fn test_type_checker_reports_core_semantic_errors() {
180180
mut_array_for_out := run_good(v3_bin, 'mut_array_for_in',
181181
'struct Item {\nmut:\n\tn int\n}\n\nfn main() {\n\tmut xs := []Item{}\n\txs << Item{n: 1}\n\tfor mut item in xs {\n\t\titem.n = 7\n\t}\n\tprintln(int_str(xs[0].n))\n}\n')
182182
assert mut_array_for_out == '7'
183+
mut_array_for_scalar_out := run_good(v3_bin, 'mut_array_for_scalar_updates',
184+
'fn main() {\n\tmut xs := []int{}\n\txs << 1\n\txs << 2\n\tfor mut x in xs {\n\t\tx++\n\t\tx += 10\n\t}\n\tprintln(int_str(xs[0]))\n\tprintln(int_str(xs[1]))\n}\n')
185+
assert mut_array_for_scalar_out == '12\n13'
183186
const_forward_out := run_good(v3_bin, 'const_forward',
184187
'const first_value = second_value\nconst second_value = 2\nfn main() {\n\tprintln(int_str(first_value))\n}\n')
185188
assert const_forward_out == '2'
@@ -206,6 +209,12 @@ fn test_type_checker_reports_core_semantic_errors() {
206209
'parent/child/child.v': 'module child\n\n__global flag int\n\nfn init() {\n\tflag = 41\n}\n\npub fn value() int {\n\treturn flag\n}\n'
207210
}, 'main.v')
208211
assert hier_init_order_out == '41\n41'
212+
transitive_init_order_out := run_good_project(v3_bin, 'transitive_module_init_order', {
213+
'main.v': 'module main\n\nimport moda\n\n__global seen int\n\nfn init() {\n\tseen = moda.value()\n}\n\nfn main() {\n\tprintln(int_str(seen))\n\tprintln(int_str(moda.value()))\n}\n'
214+
'moda/moda.v': 'module moda\n\nimport modb\n\npub fn value() int {\n\treturn modb.value()\n}\n'
215+
'modb/modb.v': 'module modb\n\n__global flag int\n\nfn init() {\n\tflag = 41\n}\n\npub fn value() int {\n\treturn flag\n}\n'
216+
}, 'main.v')
217+
assert transitive_init_order_out == '41\n41'
209218
global_amp_out := run_good(v3_bin, 'global_amp_initializers',
210219
'struct Point {\n\tx int\n\ty int\n}\n\ninterface Reader {\n\tn int\n\tread() int\n}\n\nstruct Box {\n\tn int\n}\n\nfn (b Box) read() int {\n\treturn b.n + 1\n}\n\n__global (\n\tbase_point = Point{x: 1, y: 2}\n\tassoc_point = &Point{...base_point, y: 5}\n\treader_box = Box{n: 7}\n\treader_ref = &Reader(reader_box)\n)\n\nfn main() {\n\tprintln(int_str(assoc_point.y))\n\tprintln(int_str(reader_ref.n))\n\tprintln(int_str(reader_ref.read()))\n}\n')
211220
assert global_amp_out == '5\n7\n8'

vlib/v3/transform/for.v

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,9 +329,22 @@ fn (mut t Transformer) lower_indexed_for_in(id flat.NodeId, node flat.Node, key_
329329
t.make_index(container, t.make_ident(idx_name), elem_type)
330330
}
331331
elem_decl := t.make_decl_assign_typed(elem_name, elem_expr, elem_var_type)
332+
mut transformed_body := []flat.NodeId{}
333+
if elem_needs_ref {
334+
had_pointer_value_lvalue := t.pointer_value_lvalues[elem_name] or { false }
335+
t.pointer_value_lvalues[elem_name] = true
336+
transformed_body = t.transform_stmts(body_ids)
337+
if had_pointer_value_lvalue {
338+
t.pointer_value_lvalues[elem_name] = true
339+
} else {
340+
t.pointer_value_lvalues.delete(elem_name)
341+
}
342+
} else {
343+
transformed_body = t.transform_stmts(body_ids)
344+
}
332345
mut new_body := []flat.NodeId{}
333346
new_body << elem_decl
334-
new_body << t.transform_stmts(body_ids)
347+
new_body << transformed_body
335348
prefix << t.make_for_stmt(init, cond, post, new_body, node)
336349
return prefix
337350
}

vlib/v3/transform/transform.v

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ mut:
5959
cur_fn_name string
6060
cur_fn_ret_type string
6161
var_types []VarTypeBinding
62+
pointer_value_lvalues map[string]bool
6263
temp_counter int
6364
pending_stmts []flat.NodeId
6465
smartcast_stack []SmartcastContext
@@ -113,8 +114,9 @@ struct VarTypeBinding {
113114

114115
pub fn transform(mut a flat.FlatAst, tc &types.TypeChecker) {
115116
mut t := Transformer{
116-
a: a
117-
tc: unsafe { tc }
117+
a: a
118+
tc: unsafe { tc }
119+
pointer_value_lvalues: map[string]bool{}
118120
}
119121
t.collect_types()
120122
t.collect_const_suffixes()
@@ -1475,7 +1477,7 @@ fn (t &Transformer) type_info_sum_name() ?string {
14751477
}
14761478

14771479
fn (mut t Transformer) try_lower_pointer_value_assign(node flat.Node) ?[]flat.NodeId {
1478-
if node.kind != .assign || node.op != .assign || node.children_count != 2 {
1480+
if node.kind != .assign || node.children_count != 2 {
14791481
return none
14801482
}
14811483
lhs_id := t.a.child(&node, 0)
@@ -1493,6 +1495,13 @@ fn (mut t Transformer) try_lower_pointer_value_assign(node flat.Node) ?[]flat.No
14931495
rhs_id := t.a.child(&node, 1)
14941496
rhs_type := t.node_type(rhs_id)
14951497
lhs_value_type := t.normalize_type_alias(lhs_type[1..])
1498+
if node.op != .assign {
1499+
if !t.pointer_value_lvalues[lhs.value] {
1500+
return none
1501+
}
1502+
new_lhs := t.make_prefix(.mul, t.make_ident(lhs.value))
1503+
return arr1(t.make_assign_op(new_lhs, t.transform_expr(rhs_id), node.op))
1504+
}
14961505
if rhs_type.len == 0
14971506
|| (rhs_type != lhs_value_type && !t.type_alias_targets_type(lhs_type[1..], rhs_type)) {
14981507
return none
@@ -3446,7 +3455,12 @@ fn (mut t Transformer) transform_postfix_expr(id flat.NodeId, node flat.Node) fl
34463455
return id
34473456
}
34483457
child_id := t.a.child(&node, 0)
3449-
new_child := t.transform_expr(child_id)
3458+
child := t.a.nodes[int(child_id)]
3459+
new_child := if child.kind == .ident && t.pointer_value_lvalues[child.value] {
3460+
t.make_paren(t.make_prefix(.mul, t.make_ident(child.value)))
3461+
} else {
3462+
t.transform_expr(child_id)
3463+
}
34503464
start := t.a.children.len
34513465
t.a.children << new_child
34523466
return t.a.add_node(flat.Node{

0 commit comments

Comments
 (0)