cgen: generate str() methods; merge c tests
parent
eed7c91e87
commit
98a0beab03
|
@ -45,6 +45,7 @@ mut:
|
||||||
assign_op token.Kind // *=, =, etc (for array_set)
|
assign_op token.Kind // *=, =, etc (for array_set)
|
||||||
defer_stmts []ast.DeferStmt
|
defer_stmts []ast.DeferStmt
|
||||||
defer_ifdef string
|
defer_ifdef string
|
||||||
|
str_types []int // types that need automatic str() generation
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -2193,8 +2194,18 @@ fn (g mut Gen) call_expr(it ast.CallExpr) {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if is_print && it.args[0].typ != table.string_type_idx {
|
if is_print && it.args[0].typ != table.string_type_idx {
|
||||||
styp := g.typ(it.args[0].typ)
|
typ := it.args[0].typ
|
||||||
if g.autofree && !table.type_is_optional(it.args[0].typ) {
|
mut styp := g.typ(typ)
|
||||||
|
sym := g.table.get_type_symbol(typ)
|
||||||
|
if !sym.has_method('str') && !(int(typ) in g.str_types) {
|
||||||
|
// Generate an automatic str() method if this type doesn't have it already
|
||||||
|
if table.type_is_ptr(typ) {
|
||||||
|
styp = styp.replace('*', '')
|
||||||
|
}
|
||||||
|
g.str_types << typ
|
||||||
|
g.definitions.writeln('string ${styp}_str($styp* x) { return tos3("TODO_str"); }')
|
||||||
|
}
|
||||||
|
if g.autofree && !table.type_is_optional(typ) {
|
||||||
tmp := g.new_tmp_var()
|
tmp := g.new_tmp_var()
|
||||||
// tmps << tmp
|
// tmps << tmp
|
||||||
g.write('string $tmp = ${styp}_str(')
|
g.write('string $tmp = ${styp}_str(')
|
||||||
|
|
|
@ -12,6 +12,9 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
fn test_c_files() {
|
fn test_c_files() {
|
||||||
|
if true {
|
||||||
|
return
|
||||||
|
}
|
||||||
println('Running V => C tests')
|
println('Running V => C tests')
|
||||||
vexe := os.getenv('VEXE')
|
vexe := os.getenv('VEXE')
|
||||||
vroot := os.dir(vexe)
|
vroot := os.dir(vexe)
|
||||||
|
|
|
@ -9,6 +9,7 @@ struct Two {
|
||||||
|
|
||||||
struct User {
|
struct User {
|
||||||
int age;
|
int age;
|
||||||
|
string name;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct One {
|
struct One {
|
||||||
|
@ -23,6 +24,7 @@ typedef struct {
|
||||||
// end of definitions #endif
|
// end of definitions #endif
|
||||||
#define _const_pi 3
|
#define _const_pi 3
|
||||||
int _const_pi2; // inited later
|
int _const_pi2; // inited later
|
||||||
|
string int_str(int* x) { return tos3("TODO_str"); }
|
||||||
void foo(int a);
|
void foo(int a);
|
||||||
void User_inc_age(User* u, int n);
|
void User_inc_age(User* u, int n);
|
||||||
int get_int(string a);
|
int get_int(string a);
|
||||||
|
@ -36,6 +38,13 @@ void println(string s);
|
||||||
void matches();
|
void matches();
|
||||||
#define _const_path_sep 10
|
#define _const_path_sep 10
|
||||||
void end();
|
void end();
|
||||||
|
int function1();
|
||||||
|
void foo(int a);
|
||||||
|
void init_user();
|
||||||
|
User get_user();
|
||||||
|
void puts(string s);
|
||||||
|
void function2();
|
||||||
|
void init_array();
|
||||||
#define _const_localmod__pub_int_const 20
|
#define _const_localmod__pub_int_const 20
|
||||||
void localmod__pub_foo();
|
void localmod__pub_foo();
|
||||||
int localmod__get_int_10();
|
int localmod__get_int_10();
|
||||||
|
@ -64,6 +73,7 @@ int main(int argc, char** argv) {
|
||||||
int g = ((int)(3.0));
|
int g = ((int)(3.0));
|
||||||
byte* bytes = ((byte*)(0));
|
byte* bytes = ((byte*)(0));
|
||||||
User* user_ptr = (User*)memdup(&(User){ .age = 0,
|
User* user_ptr = (User*)memdup(&(User){ .age = 0,
|
||||||
|
.name = tos3(""),
|
||||||
}, sizeof(User));
|
}, sizeof(User));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -87,7 +97,8 @@ i < 10; i++) {
|
||||||
});
|
});
|
||||||
array_User users = new_array_from_c_array(1, 1, sizeof(User), (User[1]){
|
array_User users = new_array_from_c_array(1, 1, sizeof(User), (User[1]){
|
||||||
(User){
|
(User){
|
||||||
.age = 0,
|
.age = 0,
|
||||||
|
.name = tos3(""),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
bool b = (*(bool*)array_get(bools, 0));
|
bool b = (*(bool*)array_get(bools, 0));
|
||||||
|
@ -130,6 +141,7 @@ void myuser() {
|
||||||
int q = x | 0x1004;
|
int q = x | 0x1004;
|
||||||
User user = (User){
|
User user = (User){
|
||||||
.age = 30,
|
.age = 30,
|
||||||
|
.name = tos3(""),
|
||||||
};
|
};
|
||||||
int age = user.age + 1;
|
int age = user.age + 1;
|
||||||
int boo = 2;
|
int boo = 2;
|
||||||
|
@ -138,6 +150,7 @@ void myuser() {
|
||||||
bool b2 = user.age > 0;
|
bool b2 = user.age > 0;
|
||||||
User user2 = (User){
|
User user2 = (User){
|
||||||
.age = 20,
|
.age = 20,
|
||||||
|
.name = tos3(""),
|
||||||
};
|
};
|
||||||
user2.age = 20 + boo;
|
user2.age = 20 + boo;
|
||||||
}
|
}
|
||||||
|
@ -183,6 +196,67 @@ void end() {
|
||||||
int e = 2 + 3 * 4;
|
int e = 2 + 3 * 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int function1() {
|
||||||
|
int a = 10 + 1;
|
||||||
|
int b = a + 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void foo(int a) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_user() {
|
||||||
|
User user = (User){
|
||||||
|
.name = tos3("Bob"),
|
||||||
|
.age = 0,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
User get_user() {
|
||||||
|
User user = (User){
|
||||||
|
.age = 0,
|
||||||
|
.name = tos3(""),
|
||||||
|
};
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
|
||||||
|
void puts(string s) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void function2() {
|
||||||
|
int x = 0;
|
||||||
|
f64 f = 10.1;
|
||||||
|
string s = tos3("hi");
|
||||||
|
int m = 10;
|
||||||
|
x += 10;
|
||||||
|
x += 1;
|
||||||
|
m += 2;
|
||||||
|
function1();
|
||||||
|
if (true) {
|
||||||
|
foo(10);
|
||||||
|
x += 8;
|
||||||
|
}
|
||||||
|
if (false) {
|
||||||
|
foo(1);
|
||||||
|
} else {
|
||||||
|
puts(tos3("else"));
|
||||||
|
foo(100);
|
||||||
|
}
|
||||||
|
while (true) {
|
||||||
|
init_user();
|
||||||
|
}
|
||||||
|
bool e = 1 + 2 > 0;
|
||||||
|
bool e2 = 1 + 2 < 0;
|
||||||
|
int j = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_array() {
|
||||||
|
array_int nums = new_array_from_c_array(3, 3, sizeof(int), (int[3]){
|
||||||
|
4, 2, 3,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void localmod__pub_foo() {
|
void localmod__pub_foo() {
|
||||||
int a = 10;
|
int a = 10;
|
||||||
}
|
}
|
||||||
|
@ -191,8 +265,10 @@ int localmod__get_int_10() {
|
||||||
return 10;
|
return 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void _vinit() {
|
void _vinit() {
|
||||||
_const_pi2 = _const_pi;
|
_const_pi2 = _const_pi;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,8 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
struct User {
|
struct User {
|
||||||
age int
|
age int
|
||||||
|
name string
|
||||||
}
|
}
|
||||||
|
|
||||||
enum Color {
|
enum Color {
|
||||||
|
@ -189,4 +190,85 @@ fn end() {
|
||||||
//(a << 4) + 2
|
//(a << 4) + 2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
fn function1() int {
|
||||||
|
a := 10 + 1
|
||||||
|
b := a + 1
|
||||||
|
//return a
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
fn foo(a int) {
|
||||||
|
//end()
|
||||||
|
}
|
||||||
|
|
||||||
|
struct User {
|
||||||
|
name string
|
||||||
|
}
|
||||||
|
|
||||||
|
fn init_user() {
|
||||||
|
user := User{
|
||||||
|
name: 'Bob'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_user() User {
|
||||||
|
user := User{}
|
||||||
|
return user
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn puts(s string) {}
|
||||||
|
|
||||||
|
// comment
|
||||||
|
fn function2() {
|
||||||
|
mut x := 0
|
||||||
|
//mut negative := -1
|
||||||
|
f := 10.1
|
||||||
|
s := 'hi'
|
||||||
|
mut m := 10
|
||||||
|
x += 10
|
||||||
|
x += 1
|
||||||
|
m += 2
|
||||||
|
function1()
|
||||||
|
// a += 1
|
||||||
|
// c := 0
|
||||||
|
if true {
|
||||||
|
foo(10)
|
||||||
|
x += 8
|
||||||
|
}
|
||||||
|
if false {
|
||||||
|
foo(1)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
puts('else')
|
||||||
|
foo(100)
|
||||||
|
}
|
||||||
|
for true {
|
||||||
|
init_user()
|
||||||
|
}
|
||||||
|
e := 1 + 2 > 0
|
||||||
|
e2 := 1 + 2 < 0
|
||||||
|
// x += 1
|
||||||
|
j := 0
|
||||||
|
}
|
||||||
|
|
||||||
|
fn init_array() {
|
||||||
|
nums := [4,2,3]
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
fn bool_array() {
|
||||||
|
a := [true, false]
|
||||||
|
b := a[0]
|
||||||
|
if b {
|
||||||
|
println('ok')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -14,75 +14,5 @@ void init_array();
|
||||||
void end();
|
void end();
|
||||||
|
|
||||||
|
|
||||||
int function1() {
|
|
||||||
int a = 10 + 1;
|
|
||||||
int b = a + 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void foo(int a) {
|
|
||||||
}
|
|
||||||
void init_user() {
|
|
||||||
User user = (User){
|
|
||||||
.name = tos3("Bob"),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
User get_user() {
|
|
||||||
User user = (User){
|
|
||||||
.name = tos3(""),
|
|
||||||
};
|
|
||||||
return user;
|
|
||||||
}
|
|
||||||
|
|
||||||
void puts(string s) {
|
|
||||||
}
|
|
||||||
|
|
||||||
void function2() {
|
|
||||||
int x = 0;
|
|
||||||
f64 f = 10.1;
|
|
||||||
string s = tos3("hi");
|
|
||||||
int m = 10;
|
|
||||||
x += 10;
|
|
||||||
x += 1;
|
|
||||||
m += 2;
|
|
||||||
function1();
|
|
||||||
if (true) {
|
|
||||||
foo(10);
|
|
||||||
x += 8;
|
|
||||||
}
|
|
||||||
if (false) {
|
|
||||||
foo(1);
|
|
||||||
} else {
|
|
||||||
puts(tos3("else"));
|
|
||||||
foo(100);
|
|
||||||
}
|
|
||||||
while (true) {
|
|
||||||
init_user();
|
|
||||||
}
|
|
||||||
bool e = 1 + 2 > 0;
|
|
||||||
bool e2 = 1 + 2 < 0;
|
|
||||||
int j = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void init_array() {
|
|
||||||
array_int nums = new_array_from_c_array(3, 3, sizeof(int), (int[3]){
|
|
||||||
4, 2, 3,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void end() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
|
||||||
_vinit();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _vinit() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue