From 287d33e2ab2764b243ed3088b7a06a116688e477 Mon Sep 17 00:00:00 2001 From: Hitalo Souza Date: Sun, 21 Jun 2026 06:31:32 -0300 Subject: [PATCH] wasm: resolve fixed-array `.len` instead of aborting with "could not find field len" (#27518) --- vlib/v/gen/wasm/gen.v | 8 +++++++- vlib/v/gen/wasm/tests/arrays.vv | 10 ++++++++++ vlib/v/gen/wasm/tests/arrays.vv.out | 3 +++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/vlib/v/gen/wasm/gen.v b/vlib/v/gen/wasm/gen.v index 916e488d0..4374f6215 100644 --- a/vlib/v/gen/wasm/gen.v +++ b/vlib/v/gen/wasm/gen.v @@ -1016,7 +1016,13 @@ pub fn (mut g Gen) expr(node ast.Expr, expected ast.Type) { g.get(v) } ast.SelectorExpr { - if v := g.get_var_from_expr(node) { + final := g.table.final_sym(node.expr_type) + if node.field_name == 'len' && final.info is ast.ArrayFixed { + // a fixed array's `.len` is a compile-time constant; the checker + // types it as `int` but emits no field, so resolve it here rather + // than aborting in get_field_offset ("could not find field len"). + g.func.i32_const(i32(final.info.size)) + } else if v := g.get_var_from_expr(node) { if g.needs_address { if !v.is_address { g.v_error("cannot take the address of a value that doesn't live on the stack. this is a current limitation.", diff --git a/vlib/v/gen/wasm/tests/arrays.vv b/vlib/v/gen/wasm/tests/arrays.vv index 6a05c881f..4d025fca5 100644 --- a/vlib/v/gen/wasm/tests/arrays.vv +++ b/vlib/v/gen/wasm/tests/arrays.vv @@ -62,6 +62,13 @@ fn selector_index_assign() { println(app.frame[app.idx]) } +fn fixed_array_len() { + a := [10, 12, 150]! + println(a.len) + b := [8]int{} + println(b.len) +} + fn main() { println('--- static_arrays()') a, b, c := static_arrays() @@ -83,4 +90,7 @@ fn main() { println('--- selector_index_assign()') selector_index_assign() + + println('--- fixed_array_len()') + fixed_array_len() } diff --git a/vlib/v/gen/wasm/tests/arrays.vv.out b/vlib/v/gen/wasm/tests/arrays.vv.out index f020c11b5..53eaec65a 100644 --- a/vlib/v/gen/wasm/tests/arrays.vv.out +++ b/vlib/v/gen/wasm/tests/arrays.vv.out @@ -16,3 +16,6 @@ 0 123 123 +--- fixed_array_len() +3 +8 -- 2.39.5