From ca1f47a742f751b0e8790c21af1211e61a49add3 Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Wed, 1 Jul 2020 11:48:46 +0300 Subject: [PATCH] cgen: fix `for k,_ in map { x << k }` --- vlib/builtin/map_test.v | 13 +++++++++++++ vlib/v/gen/cgen.v | 9 +++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/vlib/builtin/map_test.v b/vlib/builtin/map_test.v index 2af22576c6..7ab6e72f53 100644 --- a/vlib/builtin/map_test.v +++ b/vlib/builtin/map_test.v @@ -290,3 +290,16 @@ fn test_plus_assign_string() { assert m.len == 1 assert m['one'] == '1' } + + +fn test_map_keys_to_array() { + m := {'a': 'b', 'c': 'd'} + mut arr := []string{} + for k, _ in m { + arr << k + } + sarr := arr.str() + println(sarr) + assert sarr == "['a', 'c']" +} + diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index 449457a94e..69e3a5fac9 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -864,9 +864,14 @@ fn (mut g Gen) for_in(it ast.ForInStmt) { g.writeln(';') g.writeln('array_$key_styp $keys_tmp = map_keys(&$atmp);') g.writeln('for (int $idx = 0; $idx < ${keys_tmp}.len; ++$idx) {') - g.writeln('\t$key_styp $key = (($key_styp*)${keys_tmp}.data)[$idx];') + // TODO: analyze whether it.key_type has a .clone() method and call .clone() for all types: + if it.key_type == table.string_type { + g.writeln('\t$key_styp $key = /*kkkk*/ string_clone( (($key_styp*)${keys_tmp}.data)[$idx] );') + } else { + g.writeln('\t$key_styp $key = /*kkkk*/ (($key_styp*)${keys_tmp}.data)[$idx];') + } if it.val_var != '_' { - g.write('\t$val_styp ${c_name(it.val_var)} = (*($val_styp*)map_get($atmp') + g.write('\t$val_styp ${c_name(it.val_var)} = /*vvv*/ (*($val_styp*)map_get($atmp') g.writeln(', $key, &($val_styp[]){ $zero }));') } g.stmts(it.stmts)