cgen: enum fixes; sum type definition; const bug fix
							parent
							
								
									424bd1c465
								
							
						
					
					
						commit
						e8c9f609a4
					
				|  | @ -191,11 +191,16 @@ fn (g mut Gen) stmt(node ast.Stmt) { | ||||||
| 			g.writeln('// defer') | 			g.writeln('// defer') | ||||||
| 		} | 		} | ||||||
| 		ast.EnumDecl { | 		ast.EnumDecl { | ||||||
| 			g.writeln('typedef enum {') | 			g.writeln('//') | ||||||
|  | 			/* | ||||||
|  | 			name := it.name.replace('.', '__') | ||||||
|  | 			g.definitions.writeln('typedef enum {') | ||||||
| 			for i, val in it.vals { | 			for i, val in it.vals { | ||||||
| 				g.writeln('\t${it.name}_$val, // $i') | 				g.definitions.writeln('\t${name}_$val, // $i') | ||||||
| 			} | 			} | ||||||
| 			g.writeln('} $it.name;') | 			g.definitions.writeln('} $name;') | ||||||
|  | 			*/ | ||||||
|  | 
 | ||||||
| 		} | 		} | ||||||
| 		ast.ExprStmt { | 		ast.ExprStmt { | ||||||
| 			g.expr(it.expr) | 			g.expr(it.expr) | ||||||
|  | @ -1103,8 +1108,11 @@ fn (g mut Gen) const_decl(node ast.ConstDecl) { | ||||||
| 				pos := g.out.len | 				pos := g.out.len | ||||||
| 				g.expr(expr) | 				g.expr(expr) | ||||||
| 				g.writeln('') | 				g.writeln('') | ||||||
| 				val := string(g.out.buf[pos..]) | 				b := g.out.buf[pos..g.out.buf.len].clone() | ||||||
|  | 				val := string(b) | ||||||
|  | 				// val += '\0'
 | ||||||
| 				// g.out.go_back(val.len)
 | 				// g.out.go_back(val.len)
 | ||||||
|  | 				// println('pos=$pos buf.len=$g.out.buf.len len=$g.out.len val.len=$val.len val="$val"\n')
 | ||||||
| 				g.definitions.write(val) | 				g.definitions.write(val) | ||||||
| 			} | 			} | ||||||
| 			else { | 			else { | ||||||
|  | @ -1159,6 +1167,18 @@ fn (g mut Gen) write_builtin_types() { | ||||||
| 		builtin_types << g.table.types[g.table.type_idxs[builtin_name]] | 		builtin_types << g.table.types[g.table.type_idxs[builtin_name]] | ||||||
| 	} | 	} | ||||||
| 	g.write_types(builtin_types) | 	g.write_types(builtin_types) | ||||||
|  | 	// TODO remove this
 | ||||||
|  | 	g.definitions.writeln(' | ||||||
|  | 	typedef struct { | ||||||
|  |     int len; | ||||||
|  |     string args[100]; | ||||||
|  | } variadic_string; | ||||||
|  | 
 | ||||||
|  | 	typedef struct { | ||||||
|  |     int len; | ||||||
|  |     int args[100]; | ||||||
|  | } variadic_int; | ||||||
|  | ') | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // C struct definitions, ordered
 | // C struct definitions, ordered
 | ||||||
|  | @ -1186,10 +1206,10 @@ fn (g mut Gen) write_types(types []table.TypeSymbol) { | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
| 		// sym := g.table.get_type_symbol(typ)
 | 		// sym := g.table.get_type_symbol(typ)
 | ||||||
|  | 		name := typ.name.replace('.', '__') | ||||||
| 		match typ.info { | 		match typ.info { | ||||||
| 			table.Struct { | 			table.Struct { | ||||||
| 				info := typ.info as table.Struct | 				info := typ.info as table.Struct | ||||||
| 				name := typ.name.replace('.', '__') |  | ||||||
| 				// g.definitions.writeln('typedef struct {')
 | 				// g.definitions.writeln('typedef struct {')
 | ||||||
| 				g.definitions.writeln('struct $name {') | 				g.definitions.writeln('struct $name {') | ||||||
| 				for field in info.fields { | 				for field in info.fields { | ||||||
|  | @ -1200,6 +1220,21 @@ fn (g mut Gen) write_types(types []table.TypeSymbol) { | ||||||
| 				//
 | 				//
 | ||||||
| 				g.definitions.writeln('};\n') | 				g.definitions.writeln('};\n') | ||||||
| 			} | 			} | ||||||
|  | 			table.Enum { | ||||||
|  | 				g.definitions.writeln('typedef enum {') | ||||||
|  | 				for i, val in it.vals { | ||||||
|  | 					g.definitions.writeln('\t${name}_$val, // $i') | ||||||
|  | 				} | ||||||
|  | 				g.definitions.writeln('} $name;\n') | ||||||
|  | 			} | ||||||
|  | 			table.SumType { | ||||||
|  | 				g.definitions.writeln('// Sum type') | ||||||
|  | 				g.definitions.writeln(' | ||||||
|  | 				typedef struct { | ||||||
|  | void* obj; | ||||||
|  | int typ; | ||||||
|  | } $name;') | ||||||
|  | 			} | ||||||
| 			else {} | 			else {} | ||||||
| 	} | 	} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -38,12 +38,18 @@ fn compare_texts(a, b, path string) bool { | ||||||
| 	lines_b_ := b.trim_space().split_into_lines() | 	lines_b_ := b.trim_space().split_into_lines() | ||||||
| 	lines_a := lines_a_.filter(it != '') | 	lines_a := lines_a_.filter(it != '') | ||||||
| 	lines_b := lines_b_.filter(it != '') | 	lines_b := lines_b_.filter(it != '') | ||||||
|  | 	/* | ||||||
| 	if lines_a.len != lines_b.len { | 	if lines_a.len != lines_b.len { | ||||||
| 		println(term.red('different len')) | 		println(term.red('different len')) | ||||||
| 		println('${path}: got\n$a') | 		println('${path}: got\n$a') | ||||||
| 		return false | 		return false | ||||||
| 	} | 	} | ||||||
|  | 	*/ | ||||||
|  | 
 | ||||||
| 	for i, line_a in lines_a { | 	for i, line_a in lines_a { | ||||||
|  | 		if i >= lines_b.len { | ||||||
|  | 			return false | ||||||
|  | 		} | ||||||
| 		line_b := lines_b[i] | 		line_b := lines_b[i] | ||||||
| 		if line_a.trim_space() != line_b.trim_space() { | 		if line_a.trim_space() != line_b.trim_space() { | ||||||
| 			println('${path}: got\n$a') | 			println('${path}: got\n$a') | ||||||
|  |  | ||||||
|  | @ -1,3 +1,9 @@ | ||||||
|  | typedef enum { | ||||||
|  | 	Color_red, // 0
 | ||||||
|  | 	Color_green, // 1
 | ||||||
|  | 	Color_blue, // 2
 | ||||||
|  | } Color; | ||||||
|  | 
 | ||||||
| struct Two { | struct Two { | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | @ -36,12 +42,7 @@ int localmod__get_int_10(); | ||||||
| 
 | 
 | ||||||
| //3
 | //3
 | ||||||
| 
 | 
 | ||||||
| 
 | //
 | ||||||
| typedef enum { |  | ||||||
| 	Color_red, // 0
 |  | ||||||
| 	Color_green, // 1
 |  | ||||||
| 	Color_blue, // 2
 |  | ||||||
| } Color; |  | ||||||
| 
 | 
 | ||||||
| int main() { | int main() { | ||||||
| 	int a = 10; | 	int a = 10; | ||||||
|  |  | ||||||
|  | @ -1662,7 +1662,7 @@ fn (p mut Parser) enum_decl() ast.EnumDecl { | ||||||
| 		p.next() | 		p.next() | ||||||
| 	} | 	} | ||||||
| 	p.check(.key_enum) | 	p.check(.key_enum) | ||||||
| 	name := p.check_name() | 	name := p.prepend_mod(p.check_name()) | ||||||
| 	p.check(.lcbr) | 	p.check(.lcbr) | ||||||
| 	mut vals := []string | 	mut vals := []string | ||||||
| 	for p.tok.kind != .eof && p.tok.kind != .rcbr { | 	for p.tok.kind != .eof && p.tok.kind != .rcbr { | ||||||
|  | @ -1677,7 +1677,7 @@ fn (p mut Parser) enum_decl() ast.EnumDecl { | ||||||
| 	p.check(.rcbr) | 	p.check(.rcbr) | ||||||
| 	p.table.register_type_symbol(table.TypeSymbol{ | 	p.table.register_type_symbol(table.TypeSymbol{ | ||||||
| 		kind: .enum_ | 		kind: .enum_ | ||||||
| 		name: p.prepend_mod(name) | 		name: name | ||||||
| 		info: table.Enum{ | 		info: table.Enum{ | ||||||
| 			vals: vals | 			vals: vals | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue