1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

Revert "cgen: fix struct_eq (#7639)"

This reverts commit 164dd3000b.
This commit is contained in:
Delyan Angelov 2020-12-28 13:16:00 +02:00
parent a98adbb3a4
commit 3f3ae67b55
No known key found for this signature in database
GPG Key ID: 66886C0F12D595ED
3 changed files with 22 additions and 47 deletions

View File

@ -18,21 +18,28 @@ fn (mut g Gen) gen_struct_equality_fn(left table.Type) string {
fn_builder.writeln('static bool ${ptr_typ}_struct_eq($ptr_typ a, $ptr_typ b) {')
for field in info.fields {
sym := g.table.get_type_symbol(field.typ)
if sym.kind == .string {
fn_builder.writeln('\tif (string_ne(a.$field.name, b.$field.name)) {')
} else if sym.kind == .struct_ && field.typ.nr_muls() == 0 {
eq_fn := g.gen_struct_equality_fn(field.typ)
fn_builder.writeln('\tif (!${eq_fn}_struct_eq(a.$field.name, b.$field.name)) {')
} else if sym.kind == .array && field.typ.nr_muls() == 0 {
eq_fn := g.gen_array_equality_fn(field.typ)
fn_builder.writeln('\tif (!${eq_fn}_arr_eq(a.$field.name, b.$field.name)) {')
} else if sym.kind == .map && field.typ.nr_muls() == 0 {
eq_fn := g.gen_map_equality_fn(field.typ)
fn_builder.writeln('\tif (!${eq_fn}_map_eq(a.$field.name, b.$field.name)) {')
} else if sym.kind == .function {
fn_builder.writeln('\tif (*((voidptr*)(a.$field.name)) != *((voidptr*)(b.$field.name))) {')
} else {
fn_builder.writeln('\tif (a.$field.name != b.$field.name) {')
match sym.kind {
.string {
fn_builder.writeln('\tif (string_ne(a.$field.name, b.$field.name)) {')
}
.struct_ {
eq_fn := g.gen_struct_equality_fn(field.typ)
fn_builder.writeln('\tif (!${eq_fn}_struct_eq(a.$field.name, b.$field.name)) {')
}
.array {
eq_fn := g.gen_array_equality_fn(field.typ)
fn_builder.writeln('\tif (!${eq_fn}_arr_eq(a.$field.name, b.$field.name)) {')
}
.map {
eq_fn := g.gen_map_equality_fn(field.typ)
fn_builder.writeln('\tif (!${eq_fn}_map_eq(a.$field.name, b.$field.name)) {')
}
.function {
fn_builder.writeln('\tif (*((voidptr*)(a.$field.name)) != *((voidptr*)(b.$field.name))) {')
}
else {
fn_builder.writeln('\tif (a.$field.name != b.$field.name) {')
}
}
fn_builder.writeln('\t\treturn false;')
fn_builder.writeln('\t}')

View File

@ -3036,23 +3036,6 @@ fn (mut g Gen) infix_expr(node ast.InfixExpr) {
}
g.expr(node.right)
g.write(')')
} else if node.op in [.eq, .ne] && left_sym.kind == .struct_ && right_sym.kind == .struct_ {
ptr_typ := g.gen_struct_equality_fn(left_type)
if node.op == .eq {
g.write('${ptr_typ}_struct_eq(')
} else if node.op == .ne {
g.write('!${ptr_typ}_struct_eq(')
}
if node.left_type.is_ptr() {
g.write('*')
}
g.expr(node.left)
g.write(', ')
if node.right_type.is_ptr() {
g.write('*')
}
g.expr(node.right)
g.write(')')
} else if node.op in [.key_in, .not_in] {
if node.op == .not_in {
g.write('!')

View File

@ -1,15 +0,0 @@
struct User {
name string
age int
}
fn test_struct_equality() {
mut usr1 := User{'sanath', 28}
mut usr2 := User{'sanath', 28}
if usr1 == usr2 {
println('Same User')
} else {
println('Not same User')
}
assert usr1 == usr2
}