Skip to content

Commit a9f4757

Browse files
committed
v3: fix interface globals and disabled methods
1 parent f379d3f commit a9f4757

3 files changed

Lines changed: 16 additions & 6 deletions

File tree

vlib/v3/gen/c/struct.v

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,12 @@ fn (mut g FlatGen) gen_heap_struct_init(node flat.Node) {
158158
g.write('(${name}*)memdup(&(${name}){')
159159
mut set_fields := map[string]bool{}
160160
mut has_field := false
161+
if g.is_interface_type_name(node.value) {
162+
if tid := g.interface_init_typ_id(node) {
163+
g.write('._typ = ${tid}')
164+
has_field = true
165+
}
166+
}
161167
for i in 0 .. node.children_count {
162168
field := g.a.child_node(&node, i)
163169
if has_field {

vlib/v3/parser/parser.v

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1090,10 +1090,9 @@ fn (mut p Parser) mark_disabled_fn(name string) {
10901090
if name.len == 0 {
10911091
return
10921092
}
1093-
if p.cur_module.len > 0 && p.cur_module != 'main' && p.cur_module != 'builtin'
1094-
&& !name.contains('.') {
1095-
p.a.disabled_fns['${p.cur_module}.${name}'] = true
1096-
return
1093+
if p.cur_module.len > 0 && p.cur_module != 'main' && p.cur_module != 'builtin' {
1094+
qname := if name.starts_with('${p.cur_module}.') { name } else { '${p.cur_module}.${name}' }
1095+
p.a.disabled_fns[qname] = true
10971096
}
10981097
p.a.disabled_fns[name] = true
10991098
}

vlib/v3/tests/type_checker_errors_test.v

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,8 @@ fn test_type_checker_reports_core_semantic_errors() {
207207
}, 'main.v')
208208
assert hier_init_order_out == '41\n41'
209209
global_amp_out := run_good(v3_bin, 'global_amp_initializers',
210-
'struct Point {\n\tx int\n\ty int\n}\n\ninterface Reader {\n\tn int\n}\n\nstruct Box {\n\tn int\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}\n')
211-
assert global_amp_out == '5\n7'
210+
'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')
211+
assert global_amp_out == '5\n7\n8'
212212
disabled_if_out := run_good(v3_bin, 'disabled_if_call_elides_args',
213213
'__global hit int\n\n@[if trace ?]\nfn trace(x int) {}\n\nfn side_effect() int {\n\thit = 99\n\treturn 1\n}\n\nfn main() {\n\ttrace(side_effect())\n\tprintln(int_str(hit))\n}\n')
214214
assert disabled_if_out == '0'
@@ -217,6 +217,11 @@ fn test_type_checker_reports_core_semantic_errors() {
217217
'moda/moda.v': 'module moda\n\n@[if trace ?]\npub fn trace(x int) {}\n'
218218
}, 'main.v')
219219
assert disabled_if_alias_out == '0'
220+
disabled_if_method_out := run_good_project(v3_bin, 'disabled_if_method_call_elides_args', {
221+
'main.v': 'module main\n\nimport moda\n\nfn main() {\n\tprintln(int_str(moda.run()))\n}\n'
222+
'moda/moda.v': 'module moda\n\n__global hit int\n\nstruct Tracer {}\n\n@[if trace ?]\nfn (t Tracer) trace(x int) {}\n\nfn side_effect() int {\n\thit = 99\n\treturn 1\n}\n\npub fn run() int {\n\tt := Tracer{}\n\tt.trace(side_effect())\n\treturn hit\n}\n'
223+
}, 'main.v')
224+
assert disabled_if_method_out == '0'
220225
cross_module_array_append_c := gen_c_project(v3_bin, 'array_append_distinct_module_types', {
221226
'main.v': 'module main\n\nimport moda\nimport modb\n\nfn main() {\n\tmut xs := []moda.Foo{}\n\tys := []modb.Foo{}\n\txs << ys\n}\n'
222227
'moda/moda.v': 'module moda\n\nstruct Foo {\n\ta int\n}\n'

0 commit comments

Comments
 (0)