@@ -126,6 +126,26 @@ fn (mut g Gen) read_field(struct_type ast.Type, field_name string, var_name stri
126
126
}
127
127
}
128
128
129
+ // read_map generates C code for reading option/no-option struct field
130
+ @[inline]
131
+ fn (mut g Gen) read_map_from_option (typ ast.Type, var_name string ) string {
132
+ return if typ.has_flag (.option) {
133
+ return '(${g.base_type(typ)} *)&${var_name} .data'
134
+ } else {
135
+ var_name
136
+ }
137
+ }
138
+
139
+ // read_map_field generates C code for reading option/no-option struct field
140
+ @[inline]
141
+ fn (mut g Gen) read_map_field_from_option (typ ast.Type, field_name string , var_name string ) string {
142
+ return if typ.has_flag (.option) {
143
+ '(*(${g.base_type(typ)} *)${var_name} .data).${field_name} '
144
+ } else {
145
+ '${var_name} .${field_name} '
146
+ }
147
+ }
148
+
129
149
// read_opt_field generates C code for reading option/no-option struct field
130
150
@[inline]
131
151
fn (mut g Gen) read_opt_field (struct_type ast.Type, field_name string , var_name string , field_typ ast.Type) string {
@@ -136,6 +156,16 @@ fn (mut g Gen) read_opt_field(struct_type ast.Type, field_name string, var_name
136
156
}
137
157
}
138
158
159
+ // read_map_opt_field generates C code for reading option/no-option map field
160
+ @[inline]
161
+ fn (mut g Gen) read_map_opt_field (struct_type ast.Type, field_name string , var_name string , field_typ ast.Type) string {
162
+ return if field_typ.has_flag (.option) {
163
+ '*(${g.base_type(field_typ)} *)${g.read_field(struct_type, field_name, var_name)} .data'
164
+ } else {
165
+ g.read_field (struct_type, field_name, var_name)
166
+ }
167
+ }
168
+
139
169
fn (mut g Gen) gen_struct_equality_fn (left_type ast.Type) string {
140
170
left := g.unwrap (left_type)
141
171
ptr_styp := g.typ (left.typ.set_nr_muls (0 ))
@@ -429,64 +459,71 @@ fn (mut g Gen) gen_map_equality_fn(left_type ast.Type) string {
429
459
ptr_value_styp := g.typ (value.typ)
430
460
g.definitions.writeln ('static bool ${ptr_styp} _map_eq(${ptr_styp} a, ${ptr_styp} b); // auto' )
431
461
462
+ left_len := g.read_map_field_from_option (left.typ, 'len' , 'a' )
463
+ right_len := g.read_map_field_from_option (left.typ, 'len' , 'b' )
464
+ key_values := g.read_map_field_from_option (left.typ, 'key_values' , 'a' )
465
+
466
+ a := if left.typ.has_flag (.option) { g.read_map_from_option (left.typ, 'a' ) } else { '&a' }
467
+ b := if left.typ.has_flag (.option) { g.read_map_from_option (left.typ, 'b' ) } else { '&b' }
468
+
432
469
mut fn_builder := strings.new_builder (512 )
433
470
fn_builder.writeln ('static bool ${ptr_styp} _map_eq(${ptr_styp} a, ${ptr_styp} b) {' )
434
- fn_builder.writeln ('\t if (a.len != b.len ) {' )
471
+ fn_builder.writeln ('\t if (${left_len} != ${right_len} ) {' )
435
472
fn_builder.writeln ('\t\t return false;' )
436
473
fn_builder.writeln ('\t }' )
437
- fn_builder.writeln ('\t for (int i = 0; i < a. key_values.len; ++i) {' )
438
- fn_builder.writeln ('\t\t if (!DenseArray_has_index(&a. key_values, i)) continue;' )
439
- fn_builder.writeln ('\t\t voidptr k = DenseArray_key(&a. key_values, i);' )
440
- fn_builder.writeln ('\t\t if (!map_exists(&b , k)) return false;' )
474
+ fn_builder.writeln ('\t for (int i = 0; i < ${ key_values} .len; ++i) {' )
475
+ fn_builder.writeln ('\t\t if (!DenseArray_has_index(&${ key_values} , i)) continue;' )
476
+ fn_builder.writeln ('\t\t voidptr k = DenseArray_key(&${ key_values} , i);' )
477
+ fn_builder.writeln ('\t\t if (!map_exists(${b} , k)) return false;' )
441
478
kind := g.table.type_kind (value.typ)
442
479
if kind == .function {
443
480
info := value.sym.info as ast.FnType
444
481
sig := g.fn_var_signature (info.func.return_type, info.func.params.map (it .typ),
445
482
'v' )
446
- fn_builder.writeln ('\t\t ${sig} = *(voidptr*)map_get(&a , k, &(voidptr[]){ 0 });' )
483
+ fn_builder.writeln ('\t\t ${sig} = *(voidptr*)map_get(${a} , k, &(voidptr[]){ 0 });' )
447
484
} else {
448
- fn_builder.writeln ('\t\t ${ptr_value_styp} v = *(${ptr_value_styp} *)map_get(&a , k, &(${ptr_value_styp} []){ 0 });' )
485
+ fn_builder.writeln ('\t\t ${ptr_value_styp} v = *(${ptr_value_styp} *)map_get(${a} , k, &(${ptr_value_styp} []){ 0 });' )
449
486
}
450
487
match kind {
451
488
.string {
452
- fn_builder.writeln ('\t\t if (!fast_string_eq(*(string*)map_get(&b , k, &(string[]){_SLIT("")}), v)) {' )
489
+ fn_builder.writeln ('\t\t if (!fast_string_eq(*(string*)map_get(${b} , k, &(string[]){_SLIT("")}), v)) {' )
453
490
}
454
491
.sum_type {
455
492
eq_fn := g.gen_sumtype_equality_fn (value.typ)
456
- fn_builder.writeln ('\t\t if (!${eq_fn} _sumtype_eq(*(${ptr_value_styp} *)map_get(&b , k, &(${ptr_value_styp} []){ 0 }), v)) {' )
493
+ fn_builder.writeln ('\t\t if (!${eq_fn} _sumtype_eq(*(${ptr_value_styp} *)map_get(${b} , k, &(${ptr_value_styp} []){ 0 }), v)) {' )
457
494
}
458
495
.struct_ {
459
496
eq_fn := g.gen_struct_equality_fn (value.typ)
460
- fn_builder.writeln ('\t\t if (!${eq_fn} _struct_eq(*(${ptr_value_styp} *)map_get(&b , k, &(${ptr_value_styp} []){ 0 }), v)) {' )
497
+ fn_builder.writeln ('\t\t if (!${eq_fn} _struct_eq(*(${ptr_value_styp} *)map_get(${b} , k, &(${ptr_value_styp} []){ 0 }), v)) {' )
461
498
}
462
499
.interface_ {
463
500
eq_fn := g.gen_interface_equality_fn (value.typ)
464
- fn_builder.writeln ('\t\t if (!${eq_fn} _interface_eq(*(${ptr_value_styp} *)map_get(&b , k, &(${ptr_value_styp} []){ 0 }), v)) {' )
501
+ fn_builder.writeln ('\t\t if (!${eq_fn} _interface_eq(*(${ptr_value_styp} *)map_get(${b} , k, &(${ptr_value_styp} []){ 0 }), v)) {' )
465
502
}
466
503
.array {
467
504
eq_fn := g.gen_array_equality_fn (value.typ)
468
- fn_builder.writeln ('\t\t if (!${eq_fn} _arr_eq(*(${ptr_value_styp} *)map_get(&b , k, &(${ptr_value_styp} []){ 0 }), v)) {' )
505
+ fn_builder.writeln ('\t\t if (!${eq_fn} _arr_eq(*(${ptr_value_styp} *)map_get(${b} , k, &(${ptr_value_styp} []){ 0 }), v)) {' )
469
506
}
470
507
.array_fixed {
471
508
eq_fn := g.gen_fixed_array_equality_fn (value.typ)
472
- fn_builder.writeln ('\t\t if (!${eq_fn} _arr_eq(*(${ptr_value_styp} *)map_get(&b , k, &(${ptr_value_styp} []){ 0 }), v)) {' )
509
+ fn_builder.writeln ('\t\t if (!${eq_fn} _arr_eq(*(${ptr_value_styp} *)map_get(${b} , k, &(${ptr_value_styp} []){ 0 }), v)) {' )
473
510
}
474
511
.map {
475
512
eq_fn := g.gen_map_equality_fn (value.typ)
476
- fn_builder.writeln ('\t\t if (!${eq_fn} _map_eq(*(${ptr_value_styp} *)map_get(&b , k, &(${ptr_value_styp} []){ 0 }), v)) {' )
513
+ fn_builder.writeln ('\t\t if (!${eq_fn} _map_eq(*(${ptr_value_styp} *)map_get(${b} , k, &(${ptr_value_styp} []){ 0 }), v)) {' )
477
514
}
478
515
.alias {
479
516
eq_fn := g.gen_alias_equality_fn (value.typ)
480
- fn_builder.writeln ('\t\t if (!${eq_fn} _alias_eq(*(${ptr_value_styp} *)map_get(&b , k, &(${ptr_value_styp} []){ 0 }), v)) {' )
517
+ fn_builder.writeln ('\t\t if (!${eq_fn} _alias_eq(*(${ptr_value_styp} *)map_get(${b} , k, &(${ptr_value_styp} []){ 0 }), v)) {' )
481
518
}
482
519
.function {
483
- fn_builder.writeln ('\t\t if (*(voidptr*)map_get(&b , k, &(voidptr[]){ 0 }) != v) {' )
520
+ fn_builder.writeln ('\t\t if (*(voidptr*)map_get(${b} , k, &(voidptr[]){ 0 }) != v) {' )
484
521
}
485
522
else {
486
523
if value.typ.has_flag (.option) {
487
- fn_builder.writeln ('\t\t if (memcmp(v.data, ((${ptr_value_styp} *)map_get(&b , k, &(${ptr_value_styp} []){ 0 }))->data, sizeof(${g.base_type(value.typ)} )) != 0) {' )
524
+ fn_builder.writeln ('\t\t if (memcmp(v.data, ((${ptr_value_styp} *)map_get(${b} , k, &(${ptr_value_styp} []){ 0 }))->data, sizeof(${g.base_type(value.typ)} )) != 0) {' )
488
525
} else {
489
- fn_builder.writeln ('\t\t if (*(${ptr_value_styp} *)map_get(&b , k, &(${ptr_value_styp} []){ 0 }) != v) {' )
526
+ fn_builder.writeln ('\t\t if (*(${ptr_value_styp} *)map_get(${b} , k, &(${ptr_value_styp} []){ 0 }) != v) {' )
490
527
}
491
528
}
492
529
}
0 commit comments