Skip to content

Commit f71c2d4

Browse files
committed
vhdl: ignore duplicate map keys
1 parent 11086bf commit f71c2d4

File tree

2 files changed

+23
-3
lines changed

2 files changed

+23
-3
lines changed

impls/vhdl/core.vhdl

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,9 +260,13 @@ package body core is
260260
end procedure fn_vector_q;
261261

262262
procedure fn_hash_map(args: inout mal_val_ptr; result: out mal_val_ptr; err: out mal_val_ptr) is
263+
variable new_map: mal_val_ptr;
263264
begin
264-
args.val_type := mal_hashmap;
265-
result := args;
265+
new_empty_hashmap(new_map);
266+
for i in 0 to args.seq_val'length / 2 - 1 loop
267+
hashmap_put(new_map, args.seq_val(2*i), args.seq_val(2*i+1));
268+
end loop;
269+
result := new_map;
266270
end procedure fn_hash_map;
267271

268272
procedure fn_map_q(args: inout mal_val_ptr; result: out mal_val_ptr; err: out mal_val_ptr) is

impls/vhdl/reader.vhdl

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,22 @@ package body reader is
273273
new_seq_obj(list_type, seq, result);
274274
end procedure read_sequence;
275275

276+
procedure read_map(r: inout reader_class; result: out mal_val_ptr; err: out mal_val_ptr) is
277+
variable sub_result, sub_err, new_map: mal_val_ptr;
278+
begin
279+
read_sequence(mal_hashmap, "}", r, sub_result, sub_err);
280+
if sub_err = null then
281+
new_empty_hashmap(new_map);
282+
for i in 0 to sub_result.seq_val'length / 2 - 1 loop
283+
hashmap_put(new_map, result.seq_val(2*i), result.seq_val(2*i + 1));
284+
end loop;
285+
result := new_map;
286+
else
287+
err := sub_err;
288+
result := null;
289+
end if;
290+
end procedure read_map;
291+
276292
procedure reader_macro(r: inout reader_class; result: out mal_val_ptr; err: out mal_val_ptr; sym_name: in string) is
277293
variable token, sym_line: line;
278294
variable seq: mal_seq_ptr;
@@ -343,7 +359,7 @@ package body reader is
343359
when ')' => new_string("unexcepted ')'", err);
344360
when '[' => read_sequence(mal_vector, "]", r, result, err);
345361
when ']' => new_string("unexcepted ']'", err);
346-
when '{' => read_sequence(mal_hashmap, "}", r, result, err);
362+
when '{' => read_map(r, result, err);
347363
when '}' => new_string("unexcepted '}'", err);
348364
when others => read_atom(r, result, err);
349365
end case;

0 commit comments

Comments
 (0)