@@ -53,10 +53,11 @@ fn (mut g Gen) gen_sumtype_equality_fn(left_type ast.Type) string {
53
53
left := g.unwrap (left_type)
54
54
ptr_styp := g.typ (left.typ.set_nr_muls (0 ))
55
55
56
- if left_type in g.generated_eq_fns {
56
+ left_no_ptr := left_type.set_nr_muls (0 )
57
+ if left_no_ptr in g.generated_eq_fns {
57
58
return ptr_styp
58
59
}
59
- g.generated_eq_fns << left_type
60
+ g.generated_eq_fns << left_no_ptr
60
61
61
62
info := left.sym.sumtype_info ()
62
63
g.definitions.writeln ('static bool ${ptr_styp} _sumtype_eq(${ptr_styp} a, ${ptr_styp} b); // auto' )
@@ -129,7 +130,17 @@ fn (mut g Gen) read_field(struct_type ast.Type, field_name string, var_name stri
129
130
@[inline]
130
131
fn (mut g Gen) read_opt_field (struct_type ast.Type, field_name string , var_name string , field_typ ast.Type) string {
131
132
return if field_typ.has_flag (.option) {
132
- '*(${g.base_type(field_typ)} *)${g.read_field(struct_type, field_name, var_name)} .data'
133
+ field_typ_ := if g.table.sym (field_typ).kind in [.interface_, .string] && field_typ.is_ptr () {
134
+ field_typ.deref ()
135
+ } else {
136
+ field_typ
137
+ }
138
+ opt := if g.table.sym (field_typ).kind == .interface_ && field_typ.is_ptr () {
139
+ '_option_'
140
+ } else {
141
+ ''
142
+ }
143
+ '*(${opt}${g.base_type(field_typ_)} *)${g.read_field(struct_type, field_name, var_name)} .data'
133
144
} else {
134
145
g.read_field (struct_type, field_name, var_name)
135
146
}
@@ -139,10 +150,13 @@ fn (mut g Gen) gen_struct_equality_fn(left_type ast.Type) string {
139
150
left := g.unwrap (left_type)
140
151
ptr_styp := g.typ (left.typ.set_nr_muls (0 ))
141
152
fn_name := ptr_styp.replace ('struct ' , '' )
142
- if left_type in g.generated_eq_fns {
153
+
154
+ left_no_ptr := left_type.set_nr_muls (0 )
155
+ if left_no_ptr in g.generated_eq_fns {
143
156
return fn_name
144
157
}
145
- g.generated_eq_fns << left_type
158
+ g.generated_eq_fns << left_no_ptr
159
+
146
160
info := left.sym.struct_info ()
147
161
g.definitions.writeln ('static bool ${fn_name} _struct_eq(${ptr_styp} a, ${ptr_styp} b); // auto' )
148
162
@@ -176,6 +190,8 @@ fn (mut g Gen) gen_struct_equality_fn(left_type ast.Type) string {
176
190
left_arg_opt := g.read_opt_field (left_type, field_name, 'a' , field.typ)
177
191
right_arg_opt := g.read_opt_field (left_type, field_name, 'b' , field.typ)
178
192
fn_builder.write_string ('(((${left_arg_opt} ).len == (${right_arg_opt} ).len && (${left_arg_opt} ).len == 0) || string__eq(${left_arg_opt} , ${right_arg_opt} ))' )
193
+ } else if field.typ.is_ptr () {
194
+ fn_builder.write_string ('((${left_arg} ->len == ${right_arg} ->len && ${left_arg} ->len == 0) || string__eq(*(${left_arg} ), *(${right_arg} )))' )
179
195
} else {
180
196
fn_builder.write_string ('((${left_arg} .len == ${right_arg} .len && ${left_arg} .len == 0) || string__eq(${left_arg} , ${right_arg} ))' )
181
197
}
@@ -200,9 +216,37 @@ fn (mut g Gen) gen_struct_equality_fn(left_type ast.Type) string {
200
216
} else if field_type.sym.kind == .function && ! field.typ.has_flag (.option) {
201
217
fn_builder.write_string ('*((voidptr*)(${left_arg} )) == *((voidptr*)(${right_arg} ))' )
202
218
} else if field_type.sym.kind == .interface_ {
203
- ptr := if field.typ.is_ptr () { '*' .repeat (field.typ.nr_muls ()) } else { '' }
204
- eq_fn := g.gen_interface_equality_fn (field.typ)
205
- fn_builder.write_string ('${eq_fn} _interface_eq(${ptr}${left_arg} , ${ptr}${right_arg} )' )
219
+ if field.typ.has_flag (.option) {
220
+ field_typ_ := if field.typ.is_ptr () {
221
+ field.typ.deref ()
222
+ } else {
223
+ field.typ
224
+ }
225
+ if field.typ.is_ptr () {
226
+ left_arg_opt := g.read_opt_field (left_type, field_name, 'a' , field.typ)
227
+ right_arg_opt := g.read_opt_field (left_type, field_name, 'b' ,
228
+ field.typ)
229
+ ptr := if field_typ_.is_ptr () {
230
+ '*' .repeat (field_typ_.nr_muls ())
231
+ } else {
232
+ ''
233
+ }
234
+ eq_fn := g.gen_interface_equality_fn (field_typ_)
235
+ fn_builder.write_string ('${eq_fn} _interface_eq(${ptr}${left_arg_opt} , ${ptr}${right_arg_opt} )' )
236
+ } else {
237
+ ptr := if field_typ_.is_ptr () {
238
+ '*' .repeat (field_typ_.nr_muls ())
239
+ } else {
240
+ ''
241
+ }
242
+ eq_fn := g.gen_interface_equality_fn (field_typ_)
243
+ fn_builder.write_string ('${eq_fn} _interface_eq(${ptr}${left_arg} , ${ptr}${right_arg} )' )
244
+ }
245
+ } else {
246
+ ptr := if field.typ.is_ptr () { '*' .repeat (field.typ.nr_muls ()) } else { '' }
247
+ eq_fn := g.gen_interface_equality_fn (field.typ)
248
+ fn_builder.write_string ('${eq_fn} _interface_eq(${ptr}${left_arg} , ${ptr}${right_arg} )' )
249
+ }
206
250
} else if field.typ.has_flag (.option) {
207
251
fn_builder.write_string ('${left_arg} .state == ${right_arg} .state && !memcmp(&${left_arg} .data, &${right_arg} .data, sizeof(${g.base_type(field.typ)} ))' )
208
252
} else {
@@ -220,10 +264,13 @@ fn (mut g Gen) gen_struct_equality_fn(left_type ast.Type) string {
220
264
fn (mut g Gen) gen_alias_equality_fn (left_type ast.Type) string {
221
265
left := g.unwrap (left_type)
222
266
ptr_styp := g.typ (left.typ.set_nr_muls (0 ))
223
- if left_type in g.generated_eq_fns {
267
+
268
+ left_no_ptr := left_type.set_nr_muls (0 )
269
+ if left_no_ptr in g.generated_eq_fns {
224
270
return ptr_styp
225
271
}
226
- g.generated_eq_fns << left_type
272
+ g.generated_eq_fns << left_no_ptr
273
+
227
274
info := left.sym.info as ast.Alias
228
275
g.definitions.writeln ('static bool ${ptr_styp} _alias_eq(${ptr_styp} a, ${ptr_styp} b); // auto' )
229
276
@@ -277,10 +324,13 @@ fn (mut g Gen) gen_alias_equality_fn(left_type ast.Type) string {
277
324
fn (mut g Gen) gen_array_equality_fn (left_type ast.Type) string {
278
325
left := g.unwrap (left_type)
279
326
ptr_styp := g.typ (left.typ.set_nr_muls (0 ))
280
- if left_type in g.generated_eq_fns {
327
+
328
+ left_no_ptr := left_type.set_nr_muls (0 )
329
+ if left_no_ptr in g.generated_eq_fns {
281
330
return ptr_styp
282
331
}
283
- g.generated_eq_fns << left_type
332
+ g.generated_eq_fns << left_no_ptr
333
+
284
334
elem := g.unwrap (left.sym.array_info ().elem_type)
285
335
ptr_elem_styp := g.typ (elem.typ)
286
336
g.definitions.writeln ('static bool ${ptr_styp} _arr_eq(${ptr_styp} a, ${ptr_styp} b); // auto' )
@@ -346,10 +396,13 @@ fn (mut g Gen) gen_array_equality_fn(left_type ast.Type) string {
346
396
fn (mut g Gen) gen_fixed_array_equality_fn (left_type ast.Type) string {
347
397
left_typ := g.unwrap (left_type)
348
398
ptr_styp := g.typ (left_typ.typ.set_nr_muls (0 ))
349
- if left_type in g.generated_eq_fns {
399
+
400
+ left_no_ptr := left_type.set_nr_muls (0 )
401
+ if left_no_ptr in g.generated_eq_fns {
350
402
return ptr_styp
351
403
}
352
- g.generated_eq_fns << left_type
404
+ g.generated_eq_fns << left_no_ptr
405
+
353
406
elem_info := left_typ.sym.array_fixed_info ()
354
407
elem := g.unwrap (elem_info.elem_type)
355
408
size := elem_info.size
@@ -402,10 +455,13 @@ fn (mut g Gen) gen_fixed_array_equality_fn(left_type ast.Type) string {
402
455
fn (mut g Gen) gen_map_equality_fn (left_type ast.Type) string {
403
456
left := g.unwrap (left_type)
404
457
ptr_styp := g.typ (left.typ.set_nr_muls (0 ))
405
- if left_type in g.generated_eq_fns {
458
+
459
+ left_no_ptr := left_type.set_nr_muls (0 )
460
+ if left_no_ptr in g.generated_eq_fns {
406
461
return ptr_styp
407
462
}
408
- g.generated_eq_fns << left_type
463
+ g.generated_eq_fns << left_no_ptr
464
+
409
465
value := g.unwrap (left.sym.map_info ().value_type)
410
466
ptr_value_styp := g.typ (value.typ)
411
467
g.definitions.writeln ('static bool ${ptr_styp} _map_eq(${ptr_styp} a, ${ptr_styp} b); // auto' )
@@ -485,10 +541,13 @@ fn (mut g Gen) gen_interface_equality_fn(left_type ast.Type) string {
485
541
ptr_styp := g.typ (left.typ.set_nr_muls (0 ))
486
542
idx_fn := g.typ (left.typ.set_nr_muls (0 ).clear_flag (.option))
487
543
fn_name := ptr_styp.replace ('interface ' , '' )
488
- if left_type in g.generated_eq_fns {
544
+
545
+ left_no_ptr := left_type.set_nr_muls (0 )
546
+ if left_no_ptr in g.generated_eq_fns {
489
547
return fn_name
490
548
}
491
- g.generated_eq_fns << left_type
549
+ g.generated_eq_fns << left_no_ptr
550
+
492
551
info := left.sym.info
493
552
g.definitions.writeln ('static bool ${ptr_styp} _interface_eq(${ptr_styp} a, ${ptr_styp} b); // auto' )
494
553
@@ -508,7 +567,7 @@ fn (mut g Gen) gen_interface_equality_fn(left_type ast.Type) string {
508
567
for typ in info.types {
509
568
fn_builder.writeln ('\t\t if (idx == ${typ.idx()} ) {' )
510
569
fn_builder.write_string ('\t\t\t return ' )
511
- match g.table.type_kind (typ) {
570
+ match g.table.type_kind (typ. set_nr_muls ( 0 ) ) {
512
571
.struct_ {
513
572
eq_fn := g.gen_struct_equality_fn (typ)
514
573
l_eqfn := g.read_field (left_type, '_${eq_fn} ' , 'a' )
0 commit comments