compiler: fix self compilation with cached modules on macOS (#7023)
							parent
							
								
									c7cefa9ce6
								
							
						
					
					
						commit
						4e6bc27b30
					
				|  | @ -125,6 +125,11 @@ fn (mut v Builder) post_process_c_compiler_output(res os.Result) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn (mut v Builder) rebuild_cached_module(vexe string, imp_path string) string { | fn (mut v Builder) rebuild_cached_module(vexe string, imp_path string) string { | ||||||
|  | 	// TODO: move this check somewhere else, this is really not the best place for it :/
 | ||||||
|  | 	// strconv is already imported inside builtin, so skip generating its object file
 | ||||||
|  | 	if imp_path == 'vlib/strconv' { | ||||||
|  | 		return '' | ||||||
|  | 	} | ||||||
| 	res := v.pref.cache_manager.exists('.o', imp_path) or { | 	res := v.pref.cache_manager.exists('.o', imp_path) or { | ||||||
| 		println('Cached $imp_path .o file not found... Building .o file for $imp_path') | 		println('Cached $imp_path .o file not found... Building .o file for $imp_path') | ||||||
| 		// do run `v build-module x` always in main vfolder; x can be a relative path
 | 		// do run `v build-module x` always in main vfolder; x can be a relative path
 | ||||||
|  |  | ||||||
|  | @ -30,8 +30,8 @@ fn (mut g Gen) gen_str_for_type_with_styp(typ table.Type, styp string) string { | ||||||
| 		already_generated_key_no_ptr := '$styp:$str_fn_name_no_ptr' | 		already_generated_key_no_ptr := '$styp:$str_fn_name_no_ptr' | ||||||
| 		if already_generated_key_no_ptr !in g.str_types { | 		if already_generated_key_no_ptr !in g.str_types { | ||||||
| 			g.str_types << already_generated_key_no_ptr | 			g.str_types << already_generated_key_no_ptr | ||||||
| 			g.type_definitions.writeln('string ${str_fn_name_no_ptr}($styp it); // auto no_ptr version') | 			g.type_definitions.writeln('static string ${str_fn_name_no_ptr}($styp it); // auto no_ptr version') | ||||||
| 			g.auto_str_funcs.writeln('string ${str_fn_name_no_ptr}($styp it){ return ${str_fn_name}(&it); }') | 			g.auto_str_funcs.writeln('static string ${str_fn_name_no_ptr}($styp it){ return ${str_fn_name}(&it); }') | ||||||
| 		} | 		} | ||||||
| 		/* | 		/* | ||||||
| 		typ_is_ptr := typ.is_ptr() | 		typ_is_ptr := typ.is_ptr() | ||||||
|  | @ -102,10 +102,10 @@ fn (mut g Gen) gen_str_for_alias(info table.Alias, styp string, str_fn_name stri | ||||||
| 		parent_str_fn_name = g.gen_str_for_type_with_styp(info.parent_type, parent_styp) | 		parent_str_fn_name = g.gen_str_for_type_with_styp(info.parent_type, parent_styp) | ||||||
| 	} | 	} | ||||||
| 	mut clean_type_v_type_name := util.strip_main_name(styp.replace('__', '.')) | 	mut clean_type_v_type_name := util.strip_main_name(styp.replace('__', '.')) | ||||||
| 	g.type_definitions.writeln('string ${str_fn_name}($styp it); // auto') | 	g.type_definitions.writeln('static string ${str_fn_name}($styp it); // auto') | ||||||
| 	g.auto_str_funcs.writeln('string ${str_fn_name}($styp it) { return indent_${str_fn_name}(it, 0); }') | 	g.auto_str_funcs.writeln('static string ${str_fn_name}($styp it) { return indent_${str_fn_name}(it, 0); }') | ||||||
| 	g.type_definitions.writeln('string indent_${str_fn_name}($styp it, int indent_count); // auto') | 	g.type_definitions.writeln('static string indent_${str_fn_name}($styp it, int indent_count); // auto') | ||||||
| 	g.auto_str_funcs.writeln('string indent_${str_fn_name}($styp it, int indent_count) {') | 	g.auto_str_funcs.writeln('static string indent_${str_fn_name}($styp it, int indent_count) {') | ||||||
| 	g.auto_str_funcs.writeln('\tstring indents = tos_lit("");') | 	g.auto_str_funcs.writeln('\tstring indents = tos_lit("");') | ||||||
| 	g.auto_str_funcs.writeln('\tfor (int i = 0; i < indent_count; ++i) {') | 	g.auto_str_funcs.writeln('\tfor (int i = 0; i < indent_count; ++i) {') | ||||||
| 	g.auto_str_funcs.writeln('\t\tindents = string_add(indents, tos_lit("    "));') | 	g.auto_str_funcs.writeln('\t\tindents = string_add(indents, tos_lit("    "));') | ||||||
|  | @ -137,10 +137,10 @@ fn (mut g Gen) gen_str_for_array(info table.Array, styp string, str_fn_name stri | ||||||
| 	if !sym_has_str_method { | 	if !sym_has_str_method { | ||||||
| 		g.gen_str_for_type_with_styp(typ, field_styp) | 		g.gen_str_for_type_with_styp(typ, field_styp) | ||||||
| 	} | 	} | ||||||
| 	g.type_definitions.writeln('string ${str_fn_name}($styp a); // auto') | 	g.type_definitions.writeln('static string ${str_fn_name}($styp a); // auto') | ||||||
| 	g.auto_str_funcs.writeln('string ${str_fn_name}($styp a) { return indent_${str_fn_name}(a, 0);}') | 	g.auto_str_funcs.writeln('static string ${str_fn_name}($styp a) { return indent_${str_fn_name}(a, 0);}') | ||||||
| 	g.type_definitions.writeln('string indent_${str_fn_name}($styp a, int indent_count); // auto') | 	g.type_definitions.writeln('static string indent_${str_fn_name}($styp a, int indent_count); // auto') | ||||||
| 	g.auto_str_funcs.writeln('string indent_${str_fn_name}($styp a, int indent_count) {') | 	g.auto_str_funcs.writeln('static string indent_${str_fn_name}($styp a, int indent_count) {') | ||||||
| 	g.auto_str_funcs.writeln('\tstrings__Builder sb = strings__new_builder(a.len * 10);') | 	g.auto_str_funcs.writeln('\tstrings__Builder sb = strings__new_builder(a.len * 10);') | ||||||
| 	g.auto_str_funcs.writeln('\tstrings__Builder_write(&sb, tos_lit("["));') | 	g.auto_str_funcs.writeln('\tstrings__Builder_write(&sb, tos_lit("["));') | ||||||
| 	g.auto_str_funcs.writeln('\tfor (int i = 0; i < a.len; ++i) {') | 	g.auto_str_funcs.writeln('\tfor (int i = 0; i < a.len; ++i) {') | ||||||
|  | @ -202,10 +202,10 @@ fn (mut g Gen) gen_str_for_array_fixed(info table.ArrayFixed, styp string, str_f | ||||||
| 	if !sym.has_method('str') { | 	if !sym.has_method('str') { | ||||||
| 		elem_str_fn_name = g.gen_str_for_type_with_styp(typ, field_styp) | 		elem_str_fn_name = g.gen_str_for_type_with_styp(typ, field_styp) | ||||||
| 	} | 	} | ||||||
| 	g.type_definitions.writeln('string ${str_fn_name}($styp a); // auto') | 	g.type_definitions.writeln('static string ${str_fn_name}($styp a); // auto') | ||||||
| 	g.auto_str_funcs.writeln('string ${str_fn_name}($styp a) { return indent_${str_fn_name}(a, 0);}') | 	g.auto_str_funcs.writeln('static string ${str_fn_name}($styp a) { return indent_${str_fn_name}(a, 0);}') | ||||||
| 	g.type_definitions.writeln('string indent_${str_fn_name}($styp a, int indent_count); // auto') | 	g.type_definitions.writeln('static string indent_${str_fn_name}($styp a, int indent_count); // auto') | ||||||
| 	g.auto_str_funcs.writeln('string indent_${str_fn_name}($styp a, int indent_count) {') | 	g.auto_str_funcs.writeln('static string indent_${str_fn_name}($styp a, int indent_count) {') | ||||||
| 	g.auto_str_funcs.writeln('\tstrings__Builder sb = strings__new_builder($info.size * 10);') | 	g.auto_str_funcs.writeln('\tstrings__Builder sb = strings__new_builder($info.size * 10);') | ||||||
| 	g.auto_str_funcs.writeln('\tstrings__Builder_write(&sb, tos_lit("["));') | 	g.auto_str_funcs.writeln('\tstrings__Builder_write(&sb, tos_lit("["));') | ||||||
| 	g.auto_str_funcs.writeln('\tfor (int i = 0; i < $info.size; ++i) {') | 	g.auto_str_funcs.writeln('\tfor (int i = 0; i < $info.size; ++i) {') | ||||||
|  | @ -246,10 +246,10 @@ fn (mut g Gen) gen_str_for_map(info table.Map, styp string, str_fn_name string) | ||||||
| 		g.gen_str_for_type_with_styp(info.value_type, val_styp) | 		g.gen_str_for_type_with_styp(info.value_type, val_styp) | ||||||
| 	} | 	} | ||||||
| 	zero := g.type_default(info.value_type) | 	zero := g.type_default(info.value_type) | ||||||
| 	g.type_definitions.writeln('string ${str_fn_name}($styp m); // auto') | 	g.type_definitions.writeln('static string ${str_fn_name}($styp m); // auto') | ||||||
| 	g.auto_str_funcs.writeln('string ${str_fn_name}($styp m) { return indent_${str_fn_name}(m, 0);}') | 	g.auto_str_funcs.writeln('static string ${str_fn_name}($styp m) { return indent_${str_fn_name}(m, 0);}') | ||||||
| 	g.type_definitions.writeln('string indent_${str_fn_name}($styp m, int indent_count); // auto') | 	g.type_definitions.writeln('static string indent_${str_fn_name}($styp m, int indent_count); // auto') | ||||||
| 	g.auto_str_funcs.writeln('string indent_${str_fn_name}($styp m, int indent_count) { /* gen_str_for_map */') | 	g.auto_str_funcs.writeln('static string indent_${str_fn_name}($styp m, int indent_count) { /* gen_str_for_map */') | ||||||
| 	g.auto_str_funcs.writeln('\tstrings__Builder sb = strings__new_builder(m.key_values.len*10);') | 	g.auto_str_funcs.writeln('\tstrings__Builder sb = strings__new_builder(m.key_values.len*10);') | ||||||
| 	g.auto_str_funcs.writeln('\tstrings__Builder_write(&sb, tos_lit("{"));') | 	g.auto_str_funcs.writeln('\tstrings__Builder_write(&sb, tos_lit("{"));') | ||||||
| 	g.auto_str_funcs.writeln('\tfor (unsigned int i = 0; i < m.key_values.len; ++i) {') | 	g.auto_str_funcs.writeln('\tfor (unsigned int i = 0; i < m.key_values.len; ++i) {') | ||||||
|  | @ -280,8 +280,8 @@ fn (mut g Gen) gen_str_for_map(info table.Map, styp string, str_fn_name string) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn (mut g Gen) gen_str_for_varg(styp string, str_fn_name string, has_str_method bool) { | fn (mut g Gen) gen_str_for_varg(styp string, str_fn_name string, has_str_method bool) { | ||||||
| 	g.definitions.writeln('string varg_${str_fn_name}(varg_$styp it); // auto') | 	g.definitions.writeln('static string varg_${str_fn_name}(varg_$styp it); // auto') | ||||||
| 	g.auto_str_funcs.writeln('string varg_${str_fn_name}(varg_$styp it) {') | 	g.auto_str_funcs.writeln('static string varg_${str_fn_name}(varg_$styp it) {') | ||||||
| 	g.auto_str_funcs.writeln('\tstrings__Builder sb = strings__new_builder(it.len);') | 	g.auto_str_funcs.writeln('\tstrings__Builder sb = strings__new_builder(it.len);') | ||||||
| 	g.auto_str_funcs.writeln('\tstrings__Builder_write(&sb, tos_lit("["));') | 	g.auto_str_funcs.writeln('\tstrings__Builder_write(&sb, tos_lit("["));') | ||||||
| 	g.auto_str_funcs.writeln('\tfor(int i=0; i<it.len; ++i) {') | 	g.auto_str_funcs.writeln('\tfor(int i=0; i<it.len; ++i) {') | ||||||
|  | @ -303,8 +303,8 @@ fn (mut g Gen) gen_str_for_multi_return(info table.MultiReturn, styp string, str | ||||||
| 			g.gen_str_for_type_with_styp(typ, field_styp) | 			g.gen_str_for_type_with_styp(typ, field_styp) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	g.type_definitions.writeln('string ${str_fn_name}($styp a); // auto') | 	g.type_definitions.writeln('static string ${str_fn_name}($styp a); // auto') | ||||||
| 	g.auto_str_funcs.writeln('string ${str_fn_name}($styp a) {') | 	g.auto_str_funcs.writeln('static string ${str_fn_name}($styp a) {') | ||||||
| 	g.auto_str_funcs.writeln('\tstrings__Builder sb = strings__new_builder($info.types.len * 10);') | 	g.auto_str_funcs.writeln('\tstrings__Builder sb = strings__new_builder($info.types.len * 10);') | ||||||
| 	g.auto_str_funcs.writeln('\tstrings__Builder_write(&sb, tos_lit("("));') | 	g.auto_str_funcs.writeln('\tstrings__Builder_write(&sb, tos_lit("("));') | ||||||
| 	for i, typ in info.types { | 	for i, typ in info.types { | ||||||
|  | @ -362,10 +362,10 @@ fn (mut g Gen) gen_str_for_struct(info table.Struct, styp string, str_fn_name st | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	// _str() functions should have a single argument, the indenting ones take 2:
 | 	// _str() functions should have a single argument, the indenting ones take 2:
 | ||||||
| 	g.type_definitions.writeln('string ${str_fn_name}($styp x); // auto') | 	g.type_definitions.writeln('static string ${str_fn_name}($styp x); // auto') | ||||||
| 	g.auto_str_funcs.writeln('string ${str_fn_name}($styp x) { return indent_${str_fn_name}(x, 0);}') | 	g.auto_str_funcs.writeln('static string ${str_fn_name}($styp x) { return indent_${str_fn_name}(x, 0);}') | ||||||
| 	g.type_definitions.writeln('string indent_${str_fn_name}($styp x, int indent_count); // auto') | 	g.type_definitions.writeln('static string indent_${str_fn_name}($styp x, int indent_count); // auto') | ||||||
| 	g.auto_str_funcs.writeln('string indent_${str_fn_name}($styp x, int indent_count) {') | 	g.auto_str_funcs.writeln('static string indent_${str_fn_name}($styp x, int indent_count) {') | ||||||
| 	mut clean_struct_v_type_name := styp.replace('__', '.') | 	mut clean_struct_v_type_name := styp.replace('__', '.') | ||||||
| 	if clean_struct_v_type_name.contains('_T_') { | 	if clean_struct_v_type_name.contains('_T_') { | ||||||
| 		// TODO: this is a bit hacky. styp shouldn't be even parsed with _T_
 | 		// TODO: this is a bit hacky. styp shouldn't be even parsed with _T_
 | ||||||
|  | @ -470,8 +470,8 @@ fn struct_auto_str_func(sym table.TypeSymbol, field_type table.Type, fn_name str | ||||||
| 
 | 
 | ||||||
| fn (mut g Gen) gen_str_for_enum(info table.Enum, styp string, str_fn_name string) { | fn (mut g Gen) gen_str_for_enum(info table.Enum, styp string, str_fn_name string) { | ||||||
| 	s := util.no_dots(styp) | 	s := util.no_dots(styp) | ||||||
| 	g.type_definitions.writeln('string ${str_fn_name}($styp it); // auto') | 	g.type_definitions.writeln('static string ${str_fn_name}($styp it); // auto') | ||||||
| 	g.auto_str_funcs.writeln('string ${str_fn_name}($styp it) { /* gen_str_for_enum */') | 	g.auto_str_funcs.writeln('static string ${str_fn_name}($styp it) { /* gen_str_for_enum */') | ||||||
| 	g.auto_str_funcs.writeln('\tswitch(it) {') | 	g.auto_str_funcs.writeln('\tswitch(it) {') | ||||||
| 	// Only use the first multi value on the lookup
 | 	// Only use the first multi value on the lookup
 | ||||||
| 	mut seen := []string{len: info.vals.len} | 	mut seen := []string{len: info.vals.len} | ||||||
|  | @ -499,10 +499,10 @@ fn (mut g Gen) gen_str_for_union_sum_type(info table.SumType, styp string, str_f | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	// _str() functions should have a single argument, the indenting ones take 2:
 | 	// _str() functions should have a single argument, the indenting ones take 2:
 | ||||||
| 	g.type_definitions.writeln('string ${str_fn_name}($styp x); // auto') | 	g.type_definitions.writeln('static string ${str_fn_name}($styp x); // auto') | ||||||
| 	g.auto_str_funcs.writeln('string ${str_fn_name}($styp x) { return indent_${str_fn_name}(x, 0); }') | 	g.auto_str_funcs.writeln('static string ${str_fn_name}($styp x) { return indent_${str_fn_name}(x, 0); }') | ||||||
| 	g.type_definitions.writeln('string indent_${str_fn_name}($styp x, int indent_count); // auto') | 	g.type_definitions.writeln('static string indent_${str_fn_name}($styp x, int indent_count); // auto') | ||||||
| 	g.auto_str_funcs.writeln('string indent_${str_fn_name}($styp x, int indent_count) {') | 	g.auto_str_funcs.writeln('static string indent_${str_fn_name}($styp x, int indent_count) {') | ||||||
| 	mut clean_sum_type_v_type_name := styp.replace('__', '.') | 	mut clean_sum_type_v_type_name := styp.replace('__', '.') | ||||||
| 	if styp.ends_with('*') { | 	if styp.ends_with('*') { | ||||||
| 		clean_sum_type_v_type_name = '&' + clean_sum_type_v_type_name.replace('*', '') | 		clean_sum_type_v_type_name = '&' + clean_sum_type_v_type_name.replace('*', '') | ||||||
|  |  | ||||||
|  | @ -388,7 +388,7 @@ pub fn (mut g Gen) write_typeof_functions() { | ||||||
| 		if typ.kind == .sum_type { | 		if typ.kind == .sum_type { | ||||||
| 			sum_info := typ.info as table.SumType | 			sum_info := typ.info as table.SumType | ||||||
| 			tidx := g.table.find_type_idx(typ.name) | 			tidx := g.table.find_type_idx(typ.name) | ||||||
| 			g.writeln('char * v_typeof_sumtype_${tidx}(int sidx) { /* $typ.name */ ') | 			g.writeln('static char * v_typeof_sumtype_${tidx}(int sidx) { /* $typ.name */ ') | ||||||
| 			g.writeln('	switch(sidx) {') | 			g.writeln('	switch(sidx) {') | ||||||
| 			g.writeln('		case $tidx: return "${util.strip_main_name(typ.name)}";') | 			g.writeln('		case $tidx: return "${util.strip_main_name(typ.name)}";') | ||||||
| 			for v in sum_info.variants { | 			for v in sum_info.variants { | ||||||
|  | @ -899,13 +899,13 @@ fn (mut g Gen) stmt(node ast.Stmt) { | ||||||
| 				// if node.name.contains('parse_text') {
 | 				// if node.name.contains('parse_text') {
 | ||||||
| 				// println('!!! $node.name mod=$node.mod, built=$g.module_built')
 | 				// println('!!! $node.name mod=$node.mod, built=$g.module_built')
 | ||||||
| 				// }
 | 				// }
 | ||||||
| 				if !node.name.starts_with(g.module_built + '.') && node.mod != g.module_built.after('/') { | 				mod := if g.is_builtin_mod { 'builtin' } else { node.name.all_before_last('.') } | ||||||
| 					// Skip functions that don't have to be generated
 | 				if mod != g.module_built && node.mod != g.module_built.after('/') { | ||||||
| 					// for this module.
 | 					// Skip functions that don't have to be generated for this module.
 | ||||||
| 					println('skip bm $node.name mode=$node.mod module_built=$g.module_built') | 					// println('skip bm $node.name mod=$node.mod module_built=$g.module_built')
 | ||||||
| 					skip = true | 					skip = true | ||||||
| 				} | 				} | ||||||
| 				if g.is_builtin_mod && g.module_built == 'builtin' { | 				if g.is_builtin_mod && g.module_built == 'builtin' && node.mod == 'builtin' { | ||||||
| 					skip = false | 					skip = false | ||||||
| 				} | 				} | ||||||
| 				if !skip { | 				if !skip { | ||||||
|  | @ -4044,12 +4044,13 @@ fn (mut g Gen) const_decl_init_later(mod string, name string, val string, typ ta | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn (mut g Gen) global_decl(node ast.GlobalDecl) { | fn (mut g Gen) global_decl(node ast.GlobalDecl) { | ||||||
|  | 	mod := if g.pref.build_mode == .build_module && g.is_builtin_mod { 'static ' } else { '' } | ||||||
| 	for field in node.fields { | 	for field in node.fields { | ||||||
| 		styp := g.typ(field.typ) | 		styp := g.typ(field.typ) | ||||||
| 		if field.has_expr { | 		if field.has_expr { | ||||||
| 			g.definitions.writeln('$styp $field.name = $field.expr; // global') | 			g.definitions.writeln('$mod$styp $field.name = $field.expr; // global') | ||||||
| 		} else { | 		} else { | ||||||
| 			g.definitions.writeln('$styp $field.name; // global') | 			g.definitions.writeln('$mod$styp $field.name; // global') | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -263,7 +263,7 @@ $c_common_macros | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| // g_live_info is used by live.info()
 | // g_live_info is used by live.info()
 | ||||||
| void* g_live_info = NULL; | static void* g_live_info = NULL; | ||||||
| 
 | 
 | ||||||
| //============================== HELPER C MACROS =============================*/
 | //============================== HELPER C MACROS =============================*/
 | ||||||
| //#define tos4(s, slen) ((string){.str=(s), .len=(slen)})
 | //#define tos4(s, slen) ((string){.str=(s), .len=(slen)})
 | ||||||
|  | @ -436,7 +436,7 @@ void _vcleanup(); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| voidptr memdup(voidptr src, int sz); | voidptr memdup(voidptr src, int sz); | ||||||
| voidptr memfreedup(voidptr ptr, voidptr src, int sz) { | static voidptr memfreedup(voidptr ptr, voidptr src, int sz) { | ||||||
| 	free(ptr); | 	free(ptr); | ||||||
| 	return memdup(src, sz); | 	return memdup(src, sz); | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue