re-write `$if os {` and fix GCC segfaults on compilation
							parent
							
								
									e604d5e2c8
								
							
						
					
					
						commit
						b13f233521
					
				| 
						 | 
					@ -25,7 +25,7 @@ enum BuildMode {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn vtmp_path() string {
 | 
					fn vtmp_path() string {
 | 
				
			||||||
	return os.home_dir() + '/.vlang$Version/'
 | 
						return os.home_dir() + '/.vlang/'
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
| 
						 | 
					@ -159,19 +159,6 @@ fn (c mut V) compile() {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// Main pass
 | 
						// Main pass
 | 
				
			||||||
	cgen.run = RUN_MAIN
 | 
						cgen.run = RUN_MAIN
 | 
				
			||||||
	if c.os == MAC {
 | 
					 | 
				
			||||||
		cgen.genln('#define mac (1) ')
 | 
					 | 
				
			||||||
		// cgen.genln('#include <pthread.h>')
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if c.os == LINUX {
 | 
					 | 
				
			||||||
		cgen.genln('#define linux (1) ')
 | 
					 | 
				
			||||||
		cgen.genln('#include <pthread.h>')
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if c.os == WINDOWS {
 | 
					 | 
				
			||||||
		cgen.genln('#define windows (1) ')
 | 
					 | 
				
			||||||
		// cgen.genln('#include <WinSock2.h>')
 | 
					 | 
				
			||||||
		cgen.genln('#include <windows.h> ')
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if c.is_play {
 | 
						if c.is_play {
 | 
				
			||||||
		cgen.genln('#define VPLAY (1) ')
 | 
							cgen.genln('#define VPLAY (1) ')
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -182,6 +169,22 @@ fn (c mut V) compile() {
 | 
				
			||||||
#include <stdarg.h> // for va_list 
 | 
					#include <stdarg.h> // for va_list 
 | 
				
			||||||
#include <inttypes.h>  // int64_t etc 
 | 
					#include <inttypes.h>  // int64_t etc 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __linux__ 
 | 
				
			||||||
 | 
					#include <pthread.h> 
 | 
				
			||||||
 | 
					#endif 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __APPLE__ 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef _WIN32 
 | 
				
			||||||
 | 
					#include <windows.h>
 | 
				
			||||||
 | 
					//#include <WinSock2.h> 
 | 
				
			||||||
 | 
					#endif 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//================================== TYPEDEFS ================================*/ 
 | 
					//================================== TYPEDEFS ================================*/ 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef unsigned char byte;
 | 
					typedef unsigned char byte;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2494,6 +2494,16 @@ fn (p mut Parser) get_tmp_counter() int {
 | 
				
			||||||
	return p.tmp_cnt
 | 
						return p.tmp_cnt
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn os_name_to_ifdef(name string) string { 
 | 
				
			||||||
 | 
						switch name {
 | 
				
			||||||
 | 
							case 'windows': return '_WIN32'
 | 
				
			||||||
 | 
							case 'mac': return '__APPLE__'
 | 
				
			||||||
 | 
							case 'linux': return '__linux__' 
 | 
				
			||||||
 | 
						} 
 | 
				
			||||||
 | 
						panic('bad os ifdef name "$name"') 
 | 
				
			||||||
 | 
						return '' 
 | 
				
			||||||
 | 
					} 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn (p mut Parser) comp_time() {
 | 
					fn (p mut Parser) comp_time() {
 | 
				
			||||||
	p.next()
 | 
						p.next()
 | 
				
			||||||
	if p.tok == IF {
 | 
						if p.tok == IF {
 | 
				
			||||||
| 
						 | 
					@ -2504,11 +2514,12 @@ fn (p mut Parser) comp_time() {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		name := p.check_name()
 | 
							name := p.check_name()
 | 
				
			||||||
		if name in SupportedPlatforms {
 | 
							if name in SupportedPlatforms {
 | 
				
			||||||
 | 
								ifdef_name := os_name_to_ifdef(name) 
 | 
				
			||||||
			if not {
 | 
								if not {
 | 
				
			||||||
				p.genln('#ifndef $name')
 | 
									p.genln('#ifndef $ifdef_name')
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			else {
 | 
								else {
 | 
				
			||||||
				p.genln('#ifdef $name')
 | 
									p.genln('#ifdef $ifdef_name')
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			p.check(LCBR)
 | 
								p.check(LCBR)
 | 
				
			||||||
			p.statements_no_curly_end()
 | 
								p.statements_no_curly_end()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										4
									
								
								gg/gg.v
								
								
								
								
							
							
						
						
									
										4
									
								
								gg/gg.v
								
								
								
								
							| 
						 | 
					@ -239,9 +239,9 @@ fn (ctx &GG) draw_rect2(x, y, w, h float, c gx.Color) {
 | 
				
			||||||
	ctx.shader.set_int('has_texture', 0)
 | 
						ctx.shader.set_int('has_texture', 0)
 | 
				
			||||||
	// 4--1
 | 
						// 4--1
 | 
				
			||||||
	// 3--2
 | 
						// 3--2
 | 
				
			||||||
#ifdef linux
 | 
						$if linux { 
 | 
				
			||||||
	// y += h
 | 
						// y += h
 | 
				
			||||||
#endif
 | 
						} 
 | 
				
			||||||
	vertices := [
 | 
						vertices := [
 | 
				
			||||||
	x + w, y, 0,
 | 
						x + w, y, 0,
 | 
				
			||||||
	x + w, y + h, 0,
 | 
						x + w, y + h, 0,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										51
									
								
								os/os.v
								
								
								
								
							
							
						
						
									
										51
									
								
								os/os.v
								
								
								
								
							| 
						 | 
					@ -288,15 +288,15 @@ pub fn system(cmd string) string {
 | 
				
			||||||
fn system_into_lines(s string) []string {
 | 
					fn system_into_lines(s string) []string {
 | 
				
			||||||
	mut res := []string
 | 
						mut res := []string
 | 
				
			||||||
	cmd := '$s 2>&1'
 | 
						cmd := '$s 2>&1'
 | 
				
			||||||
#ifdef windows
 | 
						max := 5000 
 | 
				
			||||||
	# FILE* f = _popen(cmd.str, "r");
 | 
						$if windows { 
 | 
				
			||||||
#else
 | 
							# FILE* f = _popen(cmd.str, "r");
 | 
				
			||||||
	# FILE* f = popen(cmd.str, "r");
 | 
						}
 | 
				
			||||||
#endif
 | 
						$else { 
 | 
				
			||||||
	#define MAX 5000
 | 
							# FILE* f = popen(cmd.str, "r");
 | 
				
			||||||
	// # char buf[MAX];
 | 
						} 
 | 
				
			||||||
	# char * buf = malloc(sizeof(char) * MAX);
 | 
						# char * buf = malloc(sizeof(char) * max);
 | 
				
			||||||
	# while (fgets(buf, MAX, f) != NULL)
 | 
						# while (fgets(buf, max, f) != NULL)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		val := ''
 | 
							val := ''
 | 
				
			||||||
		# buf[strlen(buf) - 1] = '\0'; // eat the newline fgets() stores
 | 
							# buf[strlen(buf) - 1] = '\0'; // eat the newline fgets() stores
 | 
				
			||||||
| 
						 | 
					@ -323,11 +323,12 @@ fn exit(code int) {
 | 
				
			||||||
pub fn file_exists(path string) bool {
 | 
					pub fn file_exists(path string) bool {
 | 
				
			||||||
	// # return access( path.str, F_OK ) != -1 ;
 | 
						// # return access( path.str, F_OK ) != -1 ;
 | 
				
			||||||
	res := false
 | 
						res := false
 | 
				
			||||||
#ifdef windows
 | 
						$if windows { 
 | 
				
			||||||
	# res = _access( path.str, 0 ) != -1 ;
 | 
							# res = _access( path.str, 0 ) != -1 ;
 | 
				
			||||||
#else
 | 
						}
 | 
				
			||||||
	# res = access( path.str, 0 ) != -1 ;
 | 
						$else { 
 | 
				
			||||||
#endif
 | 
							# res = access( path.str, 0 ) != -1 ;
 | 
				
			||||||
 | 
						} 
 | 
				
			||||||
	return res
 | 
						return res
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -435,16 +436,16 @@ pub fn write_file(path, text string) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn on_segfault(f voidptr) {
 | 
					fn on_segfault(f voidptr) {
 | 
				
			||||||
#ifdef windows
 | 
						$if windows { 
 | 
				
			||||||
	return
 | 
							return
 | 
				
			||||||
#endif
 | 
						} 
 | 
				
			||||||
#ifdef mac
 | 
						$if mac { 
 | 
				
			||||||
	# struct sigaction sa;
 | 
							# struct sigaction sa;
 | 
				
			||||||
	# memset(&sa, 0, sizeof(struct sigaction));
 | 
							# memset(&sa, 0, sizeof(struct sigaction));
 | 
				
			||||||
	# sigemptyset(&sa.sa_mask);
 | 
							# sigemptyset(&sa.sa_mask);
 | 
				
			||||||
	# sa.sa_sigaction = f;
 | 
							# sa.sa_sigaction = f;
 | 
				
			||||||
	# sa.sa_flags   = SA_SIGINFO;
 | 
							# sa.sa_flags   = SA_SIGINFO;
 | 
				
			||||||
	# sigaction(SIGSEGV, &sa, 0);
 | 
							# sigaction(SIGSEGV, &sa, 0);
 | 
				
			||||||
#endif
 | 
						} 
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue