v2: fix struct sorting & cgen tests
parent
49f3ce0571
commit
24dbfbcccf
|
@ -41,7 +41,7 @@ pub fn (g mut Gen) init() {
|
|||
g.definitions.writeln(c_headers)
|
||||
g.write_sorted_types()
|
||||
g.write_multi_return_types()
|
||||
g.definitions.writeln('// end of definitions #endif')
|
||||
g.definitions.writeln('// end of definitions')
|
||||
}
|
||||
|
||||
pub fn (g mut Gen) write_multi_return_types() {
|
||||
|
@ -498,9 +498,6 @@ fn (g mut Gen) expr(node ast.Expr) {
|
|||
receiver_name = typ_sym.name
|
||||
}
|
||||
name := '${receiver_name}_$it.name'.replace('.', '__')
|
||||
if table.type_is_ptr(it.typ) {
|
||||
g.write('&')
|
||||
}
|
||||
g.write('${name}(')
|
||||
g.expr(it.expr)
|
||||
if it.args.len > 0 {
|
||||
|
@ -618,34 +615,21 @@ fn (g mut Gen) write_sorted_types() {
|
|||
mut builtin_types := []table.TypeSymbol // builtin types
|
||||
// builtin types need to be on top
|
||||
builtins := ['string', 'array', 'KeyValue', 'map', 'Option']
|
||||
for builtin in builtins {
|
||||
// typ := table.Type( g.table.type_idxs[builtin])
|
||||
typ := g.table.find_type(builtin) or {
|
||||
continue
|
||||
// panic('failed to find type $builtin')
|
||||
}
|
||||
builtin_types << typ
|
||||
}
|
||||
// everything except builtin will get sorted
|
||||
for t_name, t in g.table.type_idxs {
|
||||
if t == 0 {
|
||||
continue
|
||||
}
|
||||
if t_name in builtins {
|
||||
for typ in g.table.types {
|
||||
if typ.name in builtins {
|
||||
// || t.is_generic {
|
||||
builtin_types << typ
|
||||
continue
|
||||
}
|
||||
println(t_name)
|
||||
x := g.table.get_type_symbol(table.Type(t))
|
||||
// types << g.table.get_type_symbol(table.Type(t))
|
||||
types << *x
|
||||
types << typ
|
||||
}
|
||||
// sort structs
|
||||
types_sorted := g.sort_structs(types)
|
||||
// Generate C code
|
||||
g.definitions.writeln('// builtin types:')
|
||||
g.write_types(builtin_types)
|
||||
g.definitions.writeln('//------------------\n')
|
||||
g.definitions.writeln('//------------------\n #endbuiltin')
|
||||
g.write_types(types_sorted)
|
||||
}
|
||||
|
||||
|
@ -682,28 +666,26 @@ fn (g &Gen) sort_structs(types []table.TypeSymbol) []table.TypeSymbol {
|
|||
}
|
||||
// loop over types
|
||||
for t in types {
|
||||
match t.info {
|
||||
table.Struct {
|
||||
// create list of deps
|
||||
mut field_deps := []string
|
||||
match t.info {
|
||||
table.Struct {
|
||||
info := t.info as table.Struct
|
||||
for field in info.fields {
|
||||
// Need to handle fixed size arrays as well (`[10]Point`)
|
||||
// ft := if field.typ.starts_with('[') { field.typ.all_after(']') } else { field.typ }
|
||||
dep := g.table.get_type_symbol(field.typ).name
|
||||
// skip if not in types list or already in deps
|
||||
/*
|
||||
if !(ft in type_names) || ft in field_deps {
|
||||
if !(dep in type_names) || dep in field_deps {
|
||||
continue
|
||||
}
|
||||
*/
|
||||
field_deps << g.table.get_type_symbol(field.typ).name
|
||||
// field_deps << ft // field.typ
|
||||
field_deps << dep
|
||||
}
|
||||
// add type and dependant types to graph
|
||||
dep_graph.add(t.name, field_deps)
|
||||
}
|
||||
else {}
|
||||
}
|
||||
// add type and dependant types to graph
|
||||
dep_graph.add(t.name, field_deps)
|
||||
}
|
||||
// sort graph
|
||||
dep_graph_sorted := dep_graph.resolve()
|
||||
|
@ -720,8 +702,5 @@ fn (g &Gen) sort_structs(types []table.TypeSymbol) []table.TypeSymbol {
|
|||
}
|
||||
}
|
||||
}
|
||||
for x in types_sorted {
|
||||
println(x.name)
|
||||
}
|
||||
return types_sorted
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@ fn test_c_files() {
|
|||
ctext = ctext // unused warn
|
||||
mut b := builder.new_builder(pref.Preferences{})
|
||||
b.module_search_paths = ['$vroot/vlib/v/gen/tests/']
|
||||
res := b.gen_c([path]).after('#endif')
|
||||
res := b.gen_c([path]).after('#endbuiltin')
|
||||
if compare_texts(res, ctext) {
|
||||
eprintln('${term_ok} ${i}')
|
||||
}
|
||||
|
|
|
@ -1,3 +1,20 @@
|
|||
struct Two {
|
||||
};
|
||||
|
||||
struct User {
|
||||
int age;
|
||||
};
|
||||
|
||||
struct One {
|
||||
Two two;
|
||||
};
|
||||
|
||||
// multi return structs
|
||||
typedef struct {
|
||||
int arg0;
|
||||
string arg1;
|
||||
} multi_return_int_string;
|
||||
// end of definitions
|
||||
void foo(int a);
|
||||
void User_inc_age(User u, int n);
|
||||
int get_int(string a);
|
||||
|
@ -15,10 +32,6 @@ int localmod__get_int_10();
|
|||
int pi = 3;
|
||||
int pi2 = pi;
|
||||
|
||||
typedef struct {
|
||||
int age;
|
||||
} User;
|
||||
|
||||
typedef enum {
|
||||
Color_red, // 0
|
||||
Color_green, // 1
|
||||
|
@ -72,7 +85,7 @@ i < 10; i++) {
|
|||
bool q = true || false;
|
||||
bool b2 = bools[0] || true;
|
||||
bool b3 = get_bool() || true;
|
||||
int f = TODO_first(nums);
|
||||
int f = array_int_first(nums);
|
||||
}
|
||||
|
||||
void User_inc_age(User u, int n) {
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
struct User {
|
||||
string name;
|
||||
};
|
||||
|
||||
// multi return structs
|
||||
// end of definitions
|
||||
int function1();
|
||||
void foo(int a);
|
||||
void init_user();
|
||||
|
@ -16,11 +22,6 @@ int function1() {
|
|||
|
||||
void foo(int a) {
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
string name;
|
||||
} User;
|
||||
|
||||
void init_user() {
|
||||
User user = (User){
|
||||
.name = tos3("Bob"),
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
typedef struct {
|
||||
struct User {
|
||||
int age;
|
||||
string name;
|
||||
} User;
|
||||
};
|
||||
|
||||
// multi return structs
|
||||
// end of definitions
|
||||
int main() {
|
||||
User user = (User){
|
||||
};
|
||||
|
|
|
@ -1,3 +1,19 @@
|
|||
struct Bar {
|
||||
int a;
|
||||
};
|
||||
|
||||
struct Foo {
|
||||
string a;
|
||||
Bar b;
|
||||
};
|
||||
|
||||
// multi return structs
|
||||
typedef struct {
|
||||
int arg0;
|
||||
string arg1;
|
||||
} multi_return_int_string;
|
||||
|
||||
// end of definitions
|
||||
multi_return_int_string mr_test();
|
||||
int testa();
|
||||
string testb(int a);
|
||||
|
@ -17,7 +33,7 @@ int main() {
|
|||
a.a = tos3("da");
|
||||
a.b.a = 111;
|
||||
string a1 = a.a;
|
||||
int a2 = TODO_testa(b);
|
||||
int a2 = Bar_testa(b);
|
||||
int c = testa();
|
||||
c = 1;
|
||||
string d = testb(1);
|
||||
|
@ -56,7 +72,7 @@ int testc(int a) {
|
|||
}
|
||||
|
||||
int Foo_testa(Foo f) {
|
||||
int a = TODO_testb(f);
|
||||
int a = Foo_testb(f);
|
||||
a = 1;
|
||||
return 4;
|
||||
}
|
||||
|
@ -68,12 +84,3 @@ int Foo_testb(Foo f) {
|
|||
int Bar_testa(Bar b) {
|
||||
return 4;
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
int a;
|
||||
} Bar;
|
||||
|
||||
typedef struct {
|
||||
string a;
|
||||
Bar b;
|
||||
} Foo;
|
||||
|
|
Loading…
Reference in New Issue