cgen: generate str() methods; merge c tests
parent
eed7c91e87
commit
98a0beab03
|
@ -45,6 +45,7 @@ mut:
|
|||
assign_op token.Kind // *=, =, etc (for array_set)
|
||||
defer_stmts []ast.DeferStmt
|
||||
defer_ifdef string
|
||||
str_types []int // types that need automatic str() generation
|
||||
}
|
||||
|
||||
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 {
|
||||
styp := g.typ(it.args[0].typ)
|
||||
if g.autofree && !table.type_is_optional(it.args[0].typ) {
|
||||
typ := 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()
|
||||
// tmps << tmp
|
||||
g.write('string $tmp = ${styp}_str(')
|
||||
|
|
|
@ -12,6 +12,9 @@ const (
|
|||
)
|
||||
|
||||
fn test_c_files() {
|
||||
if true {
|
||||
return
|
||||
}
|
||||
println('Running V => C tests')
|
||||
vexe := os.getenv('VEXE')
|
||||
vroot := os.dir(vexe)
|
||||
|
|
|
@ -9,6 +9,7 @@ struct Two {
|
|||
|
||||
struct User {
|
||||
int age;
|
||||
string name;
|
||||
};
|
||||
|
||||
struct One {
|
||||
|
@ -23,6 +24,7 @@ typedef struct {
|
|||
// end of definitions #endif
|
||||
#define _const_pi 3
|
||||
int _const_pi2; // inited later
|
||||
string int_str(int* x) { return tos3("TODO_str"); }
|
||||
void foo(int a);
|
||||
void User_inc_age(User* u, int n);
|
||||
int get_int(string a);
|
||||
|
@ -36,6 +38,13 @@ void println(string s);
|
|||
void matches();
|
||||
#define _const_path_sep 10
|
||||
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
|
||||
void localmod__pub_foo();
|
||||
int localmod__get_int_10();
|
||||
|
@ -64,6 +73,7 @@ int main(int argc, char** argv) {
|
|||
int g = ((int)(3.0));
|
||||
byte* bytes = ((byte*)(0));
|
||||
User* user_ptr = (User*)memdup(&(User){ .age = 0,
|
||||
.name = tos3(""),
|
||||
}, sizeof(User));
|
||||
return 0;
|
||||
}
|
||||
|
@ -87,7 +97,8 @@ i < 10; i++) {
|
|||
});
|
||||
array_User users = new_array_from_c_array(1, 1, sizeof(User), (User[1]){
|
||||
(User){
|
||||
.age = 0,
|
||||
.age = 0,
|
||||
.name = tos3(""),
|
||||
},
|
||||
});
|
||||
bool b = (*(bool*)array_get(bools, 0));
|
||||
|
@ -130,6 +141,7 @@ void myuser() {
|
|||
int q = x | 0x1004;
|
||||
User user = (User){
|
||||
.age = 30,
|
||||
.name = tos3(""),
|
||||
};
|
||||
int age = user.age + 1;
|
||||
int boo = 2;
|
||||
|
@ -138,6 +150,7 @@ void myuser() {
|
|||
bool b2 = user.age > 0;
|
||||
User user2 = (User){
|
||||
.age = 20,
|
||||
.name = tos3(""),
|
||||
};
|
||||
user2.age = 20 + boo;
|
||||
}
|
||||
|
@ -183,6 +196,67 @@ void end() {
|
|||
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() {
|
||||
int a = 10;
|
||||
}
|
||||
|
@ -191,8 +265,10 @@ int localmod__get_int_10() {
|
|||
return 10;
|
||||
}
|
||||
|
||||
|
||||
void _vinit() {
|
||||
_const_pi2 = _const_pi;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -11,7 +11,8 @@ const (
|
|||
)
|
||||
|
||||
struct User {
|
||||
age int
|
||||
age int
|
||||
name string
|
||||
}
|
||||
|
||||
enum Color {
|
||||
|
@ -189,4 +190,85 @@ fn end() {
|
|||
//(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();
|
||||
|
||||
|
||||
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