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') | ||||
| 		} | ||||
| 		ast.EnumDecl { | ||||
| 			g.writeln('typedef enum {') | ||||
| 			g.writeln('//') | ||||
| 			/* | ||||
| 			name := it.name.replace('.', '__') | ||||
| 			g.definitions.writeln('typedef enum {') | ||||
| 			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 { | ||||
| 			g.expr(it.expr) | ||||
|  | @ -1103,8 +1108,11 @@ fn (g mut Gen) const_decl(node ast.ConstDecl) { | |||
| 				pos := g.out.len | ||||
| 				g.expr(expr) | ||||
| 				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)
 | ||||
| 				// println('pos=$pos buf.len=$g.out.buf.len len=$g.out.len val.len=$val.len val="$val"\n')
 | ||||
| 				g.definitions.write(val) | ||||
| 			} | ||||
| 			else { | ||||
|  | @ -1159,6 +1167,18 @@ fn (g mut Gen) write_builtin_types() { | |||
| 		builtin_types << g.table.types[g.table.type_idxs[builtin_name]] | ||||
| 	} | ||||
| 	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
 | ||||
|  | @ -1186,10 +1206,10 @@ fn (g mut Gen) write_types(types []table.TypeSymbol) { | |||
| 			continue | ||||
| 		} | ||||
| 		// sym := g.table.get_type_symbol(typ)
 | ||||
| 		name := typ.name.replace('.', '__') | ||||
| 		match typ.info { | ||||
| 			table.Struct { | ||||
| 				info := typ.info as table.Struct | ||||
| 				name := typ.name.replace('.', '__') | ||||
| 				// g.definitions.writeln('typedef struct {')
 | ||||
| 				g.definitions.writeln('struct $name {') | ||||
| 				for field in info.fields { | ||||
|  | @ -1200,6 +1220,21 @@ fn (g mut Gen) write_types(types []table.TypeSymbol) { | |||
| 				//
 | ||||
| 				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 {} | ||||
| 	} | ||||
| 	} | ||||
|  |  | |||
|  | @ -38,12 +38,18 @@ fn compare_texts(a, b, path string) bool { | |||
| 	lines_b_ := b.trim_space().split_into_lines() | ||||
| 	lines_a := lines_a_.filter(it != '') | ||||
| 	lines_b := lines_b_.filter(it != '') | ||||
| 	/* | ||||
| 	if lines_a.len != lines_b.len { | ||||
| 		println(term.red('different len')) | ||||
| 		println('${path}: got\n$a') | ||||
| 		return false | ||||
| 	} | ||||
| 	*/ | ||||
| 
 | ||||
| 	for i, line_a in lines_a { | ||||
| 		if i >= lines_b.len { | ||||
| 			return false | ||||
| 		} | ||||
| 		line_b := lines_b[i] | ||||
| 		if line_a.trim_space() != line_b.trim_space() { | ||||
| 			println('${path}: got\n$a') | ||||
|  |  | |||
|  | @ -1,3 +1,9 @@ | |||
| typedef enum { | ||||
| 	Color_red, // 0
 | ||||
| 	Color_green, // 1
 | ||||
| 	Color_blue, // 2
 | ||||
| } Color; | ||||
| 
 | ||||
| struct Two { | ||||
| }; | ||||
| 
 | ||||
|  | @ -36,12 +42,7 @@ int localmod__get_int_10(); | |||
| 
 | ||||
| //3
 | ||||
| 
 | ||||
| 
 | ||||
| typedef enum { | ||||
| 	Color_red, // 0
 | ||||
| 	Color_green, // 1
 | ||||
| 	Color_blue, // 2
 | ||||
| } Color; | ||||
| //
 | ||||
| 
 | ||||
| int main() { | ||||
| 	int a = 10; | ||||
|  |  | |||
|  | @ -1662,7 +1662,7 @@ fn (p mut Parser) enum_decl() ast.EnumDecl { | |||
| 		p.next() | ||||
| 	} | ||||
| 	p.check(.key_enum) | ||||
| 	name := p.check_name() | ||||
| 	name := p.prepend_mod(p.check_name()) | ||||
| 	p.check(.lcbr) | ||||
| 	mut vals := []string | ||||
| 	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.table.register_type_symbol(table.TypeSymbol{ | ||||
| 		kind: .enum_ | ||||
| 		name: p.prepend_mod(name) | ||||
| 		name: name | ||||
| 		info: table.Enum{ | ||||
| 			vals: vals | ||||
| 		} | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue