cache builtin modules
							parent
							
								
									c815f84722
								
							
						
					
					
						commit
						f76931c01e
					
				|  | @ -104,6 +104,8 @@ fn main() { | |||
| 		else {} | ||||
| 	} | ||||
| 	if command in ['run', 'build'] || command.ends_with('.v') || os.exists(command) { | ||||
| 		println('command') | ||||
| 		println(prefs.path) | ||||
| 		builder.compile(command, prefs) | ||||
| 		return | ||||
| 	} | ||||
|  | @ -177,6 +179,10 @@ fn parse_args(args []string) (&pref.Preferences, string) { | |||
| 		res.path = args[command_pos+1] | ||||
| 		res.run_args = args[command_pos+1..] | ||||
| 	} | ||||
| 	if command == 'build' { | ||||
| 		res.build_mode = .build_module | ||||
| 		res.path = args[command_pos+1] | ||||
| 	} | ||||
| 	if res.is_verbose { | ||||
| 		println('setting pref.path to "$res.path"') | ||||
| 	} | ||||
|  |  | |||
|  | @ -10,12 +10,18 @@ const ( | |||
| 
 | ||||
| // NOTE: temp until we have []bytes(buff)
 | ||||
| fn c_array_to_bytes_tmp(len, buffer voidptr) []byte { | ||||
| 
 | ||||
| 	mut arr := []byte | ||||
| 	arr = make(len, 1, 1) | ||||
| 	arr.data = buffer | ||||
| 	/* | ||||
| 
 | ||||
| 	arr = array { | ||||
| 		len: len | ||||
| 		cap: 1 | ||||
| 		element_size: 1 | ||||
| 		data: buffer | ||||
| 	} | ||||
| 	*/ | ||||
| 	return arr | ||||
| } | ||||
|  |  | |||
|  | @ -185,6 +185,7 @@ pub: | |||
| 	rec_mut       bool // is receiver mutable
 | ||||
| 	is_c          bool | ||||
| 	no_body       bool // just a definition `fn C.malloc()`
 | ||||
| 	is_builtin    bool // this function is defined in builtin/strconv
 | ||||
| 	pos           token.Position | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -301,6 +301,11 @@ fn (v mut Builder) cc() { | |||
| 	// add all flags (-I -l -L etc) not .o files
 | ||||
| 	a << cflags.c_options_without_object_files() | ||||
| 	a << libs | ||||
| 
 | ||||
| 	if v.pref.show_cc { | ||||
| 		a << pref.default_module_path + '/cache/vlib/builtin.o' | ||||
| 	} | ||||
| 
 | ||||
| 	// Without these libs compilation will fail on Linux
 | ||||
| 	// || os.user_os() == 'linux'
 | ||||
| 	if !v.pref.is_bare && v.pref.build_mode != .build_module && v.pref.os in [.linux, .freebsd, .openbsd, .netbsd, .dragonfly, .solaris, .haiku] { | ||||
|  |  | |||
|  | @ -31,7 +31,7 @@ pub fn compile(command string, pref &pref.Preferences) { | |||
| 	mut b := new_builder(pref) | ||||
| 	if pref.is_verbose { | ||||
| 		println('builder.compile() pref:') | ||||
| 		println(pref) | ||||
| 		// println(pref)
 | ||||
| 	} | ||||
| 	mut tmark := benchmark.new_benchmark() | ||||
| 	mut files := []string | ||||
|  | @ -145,6 +145,13 @@ fn (v mut Builder) set_module_lookup_paths() { | |||
| } | ||||
| 
 | ||||
| pub fn (v Builder) get_builtin_files() []string { | ||||
| 	if v.pref.build_mode == .build_module && v.pref.path == 'vlib/builtin' {		// .contains('builtin/' +  location {
 | ||||
| 		// We are already building builtin.o, no need to import them again
 | ||||
| 		if v.pref.is_verbose { | ||||
| 			println('skipping builtin modules for builtin.o') | ||||
| 		} | ||||
| 		return [] | ||||
| 	} | ||||
| 	// println('get_builtin_files() lookuppath:')
 | ||||
| 	// println(v.pref.lookup_path)
 | ||||
| 	// Lookup for built-in folder in lookup path.
 | ||||
|  |  | |||
|  | @ -519,14 +519,19 @@ pub fn (c mut Checker) selector_expr(selector_expr mut ast.SelectorExpr) table.T | |||
| // TODO: non deferred
 | ||||
| pub fn (c mut Checker) return_stmt(return_stmt mut ast.Return) { | ||||
| 	c.expected_type = c.fn_return_type | ||||
| 	if return_stmt.exprs.len == 0 { | ||||
| 	if return_stmt.exprs.len > 0 && c.fn_return_type == table.void_type { | ||||
| 		c.error('1too many arguments to return, current function does not return anything', | ||||
| 			return_stmt.pos) | ||||
| 		return | ||||
| 	} | ||||
| 	if return_stmt.exprs.len > 0 && c.fn_return_type == table.void_type { | ||||
| 		c.error('too many arguments to return, current function does not return anything', | ||||
| 	else if return_stmt.exprs.len == 0 && c.fn_return_type != table.void_type { | ||||
| 		c.error('too few arguments to return', | ||||
| 			return_stmt.pos) | ||||
| 		return | ||||
| 	} | ||||
| 	if return_stmt.exprs.len == 0 { | ||||
| 		return | ||||
| 	} | ||||
| 	expected_type := c.fn_return_type | ||||
| 	expected_type_sym := c.table.get_type_symbol(expected_type) | ||||
| 	exp_is_optional := table.type_is(expected_type, .optional) | ||||
|  |  | |||
|  | @ -112,7 +112,10 @@ pub fn cgen(files []ast.File, table &table.Table, pref &pref.Preferences) string | |||
| 	} | ||||
| 	g.write_variadic_types() | ||||
| 	// g.write_str_definitions()
 | ||||
| 	if g.pref.build_mode != .build_module { | ||||
| 		// no init in builtin.o
 | ||||
| 		g.write_init_function() | ||||
| 	} | ||||
| 	if g.is_test { | ||||
| 		g.write_tests_main() | ||||
| 	} | ||||
|  | @ -138,18 +141,25 @@ pub fn (g mut Gen) init() { | |||
| 	g.write_builtin_types() | ||||
| 	g.write_typedef_types() | ||||
| 	g.write_typeof_functions() | ||||
| 	g.write_str_definitions() | ||||
| 	if g.pref.build_mode != .build_module { | ||||
| 		// _STR functions should not be defined in builtin.o
 | ||||
| 		g.write_str_fn_definitions() | ||||
| 	} | ||||
| 	g.write_sorted_types() | ||||
| 	g.write_multi_return_types() | ||||
| 	g.definitions.writeln('// end of definitions #endif') | ||||
| 	//
 | ||||
| 	g.stringliterals.writeln('') | ||||
| 	g.stringliterals.writeln('// >> string literal consts') | ||||
| 	if g.pref.build_mode != .build_module { | ||||
| 		g.stringliterals.writeln('void vinit_string_literals(){') | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| pub fn (g mut Gen) finish() { | ||||
| 	if g.pref.build_mode != .build_module { | ||||
| 		g.stringliterals.writeln('}') | ||||
| 	} | ||||
| 	g.stringliterals.writeln('// << string literal consts') | ||||
| 	g.stringliterals.writeln('') | ||||
| } | ||||
|  | @ -352,7 +362,9 @@ fn (g mut Gen) stmt(node ast.Stmt) { | |||
| 			g.writeln(';') | ||||
| 		} | ||||
| 		ast.ConstDecl { | ||||
| 			// if g.pref.build_mode != .build_module {
 | ||||
| 			g.const_decl(it) | ||||
| 			// }
 | ||||
| 		} | ||||
| 		ast.CompIf { | ||||
| 			g.comp_if(it) | ||||
|  | @ -808,6 +820,9 @@ fn (g mut Gen) gen_fn_decl(it ast.FnDecl) { | |||
| 		} else { | ||||
| 			name = c_name(name) | ||||
| 		} | ||||
| 		// if g.pref.show_cc && it.is_builtin {
 | ||||
| 		// println(name)
 | ||||
| 		// }
 | ||||
| 		// type_name := g.table.Type_to_str(it.return_type)
 | ||||
| 		type_name := g.typ(it.return_type) | ||||
| 		g.write('$type_name ${name}(') | ||||
|  | @ -832,8 +847,9 @@ fn (g mut Gen) gen_fn_decl(it ast.FnDecl) { | |||
| */ | ||||
| 	//
 | ||||
| 	g.fn_args(it.args, it.is_variadic) | ||||
| 	if it.no_body { | ||||
| 	if it.no_body || (g.pref.show_cc && it.is_builtin) { | ||||
| 		// Just a function header.
 | ||||
| 		// Builtin function bodies are defined in builtin.o
 | ||||
| 		g.definitions.writeln(');') | ||||
| 		g.writeln(');') | ||||
| 		return | ||||
|  | @ -1437,8 +1453,8 @@ fn (g mut Gen) infix_expr(node ast.InfixExpr) { | |||
| 		g.write(',') | ||||
| 		g.expr(node.right) | ||||
| 		g.write(')') | ||||
| 	} else if node.op in [.plus, .minus, .mul, .div, .mod] && (left_sym.name[0].is_capital() || left_sym.name.contains('.')) && | ||||
| 		left_sym.kind != .alias { | ||||
| 	} else if node.op in [.plus, .minus, .mul, .div, .mod] && (left_sym.name[0].is_capital() || | ||||
| 		left_sym.name.contains('.')) && left_sym.kind != .alias { | ||||
| 		// !left_sym.is_number() {
 | ||||
| 		g.write(g.typ(node.left_type)) | ||||
| 		g.write('_') | ||||
|  | @ -1903,8 +1919,10 @@ fn (g mut Gen) const_decl(node ast.ConstDecl) { | |||
| 			} | ||||
| 			ast.StringLiteral { | ||||
| 				g.definitions.writeln('string _const_$name; // a string literal, inited later') | ||||
| 				if g.pref.build_mode != .build_module { | ||||
| 					g.stringliterals.writeln('\t_const_$name = $val;') | ||||
| 				} | ||||
| 			} | ||||
| 			else { | ||||
| 				// Initialize more complex consts in `void _vinit(){}`
 | ||||
| 				// (C doesn't allow init expressions that can't be resolved at compile time).
 | ||||
|  | @ -2127,7 +2145,7 @@ fn (g mut Gen) write_init_function() { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn (g mut Gen) write_str_definitions() { | ||||
| fn (g mut Gen) write_str_fn_definitions() { | ||||
| 	// _STR function can't be defined in vlib
 | ||||
| 	g.writeln(' | ||||
| string _STR(const char *fmt, ...) { | ||||
|  |  | |||
|  | @ -222,7 +222,12 @@ void _vcleanup(); | |||
| #include <intrin.h> | ||||
| #pragma intrinsic(_umul128) | ||||
| #endif | ||||
| const uint64_t _wyp0=0xa0761d6478bd642full, _wyp1=0xe7037ed1a0b428dbull; | ||||
| 
 | ||||
| //const uint64_t _wyp0=0xa0761d6478bd642full, _wyp1=0xe7037ed1a0b428dbull;
 | ||||
| #define _wyp0 ((uint64_t)0xa0761d6478bd642full) | ||||
| #define _wyp1 ((uint64_t)0xe7037ed1a0b428dbull) | ||||
| 
 | ||||
| 
 | ||||
| #if defined(__GNUC__) || defined(__INTEL_COMPILER) || defined(__clang__) | ||||
| #define _likely_(x) __builtin_expect(x, 1) | ||||
| #else | ||||
|  |  | |||
|  | @ -204,6 +204,8 @@ fn (p mut Parser) fn_decl() ast.FnDecl { | |||
| 		is_c: is_c | ||||
| 		no_body: no_body | ||||
| 		pos: p.tok.position() | ||||
| 		is_builtin: p.builtin_mod || p.mod in ['math', 'strconv', 'strconv.ftoa', 'hash.wyhash', | ||||
| 			'math.bits', 'strings'] | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue