Browse Source

Merge branch 'master' into llvm-integration

gingerBill 5 years ago
parent
commit
c74d8405ec
7 changed files with 32 additions and 41 deletions
  1. 8 25
      core/fmt/fmt.odin
  2. 1 3
      core/mem/mem.odin
  3. 10 0
      core/odin/ast/clone.odin
  4. 1 1
      core/odin/parser/parser.odin
  5. 5 5
      core/os/os_darwin.odin
  6. 6 6
      core/os/os_linux.odin
  7. 1 1
      misc/shell.bat

+ 8 - 25
core/fmt/fmt.odin

@@ -797,18 +797,15 @@ enum_value_to_string :: proc(val: any) -> (string, bool) {
 	#partial switch e in type_info.variant {
 	case: return "", false;
 	case runtime.Type_Info_Enum:
-		get_str :: proc(i: $T, e: runtime.Type_Info_Enum) -> (string, bool) {
-			if reflect.is_string(e.base) {
-				for val, idx in e.values {
-					if v, ok := val.(T); ok && v == i {
-						return e.names[idx], true;
-					}
-				}
-			} else if len(e.values) == 0 {
+		get_str :: proc(data: rawptr, e: runtime.Type_Info_Enum) -> (string, bool) {
+			if len(e.values) == 0 {
 				return "", true;
 			} else {
-				for val, idx in e.values {
-					if v, ok := val.(T); ok && v == i {
+				for _, idx in e.values {
+					val := &e.values[idx];
+					// NOTE(bill): Removes need for parametric polymorphic check
+					res := mem.compare_ptrs(val, data, e.base.size);
+					if res == 0 {
 						return e.names[idx], true;
 					}
 				}
@@ -816,21 +813,7 @@ enum_value_to_string :: proc(val: any) -> (string, bool) {
 			return "", false;
 		}
 
-		a := any{v.data, runtime.type_info_base(e.base).id};
-		switch v in a {
-		case rune:    return get_str(v, e);
-		case i8:      return get_str(v, e);
-		case i16:     return get_str(v, e);
-		case i32:     return get_str(v, e);
-		case i64:     return get_str(v, e);
-		case int:     return get_str(v, e);
-		case u8:      return get_str(v, e);
-		case u16:     return get_str(v, e);
-		case u32:     return get_str(v, e);
-		case u64:     return get_str(v, e);
-		case uint:    return get_str(v, e);
-		case uintptr: return get_str(v, e);
-		}
+		return get_str(v.data, e);
 	}
 
 	return "", false;

+ 1 - 3
core/mem/mem.odin

@@ -186,9 +186,7 @@ align_backward :: inline proc(ptr: rawptr, align: uintptr) -> rawptr {
 
 align_backward_uintptr :: proc(ptr, align: uintptr) -> uintptr {
 	assert(is_power_of_two(align));
-
-	ptr := rawptr(ptr - align);
-	return uintptr(align_forward(ptr, align));
+	return align_forward_uintptr(ptr - align + 1, align);
 }
 
 align_backward_int :: inline proc(ptr, align: int) -> int {

+ 10 - 0
core/odin/ast/clone.odin

@@ -136,6 +136,16 @@ clone_node :: proc(node: ^Node) -> ^Node {
 		r.cond = clone(r.cond);
 		r.x    = clone(r.x);
 		r.y    = clone(r.y);
+	case Ternary_If_Expr:
+		r := cast(^Ternary_If_Expr)res;
+		r.x    = clone(r.x);
+		r.cond = clone(r.cond);
+		r.y    = clone(r.y);
+	case Ternary_When_Expr:
+		r := cast(^Ternary_When_Expr)res;
+		r.x    = clone(r.x);
+		r.cond = clone(r.cond);
+		r.y    = clone(r.y);
 	case Type_Assertion:
 		r := cast(^Type_Assertion)res;
 		r.expr = clone(r.expr);

+ 1 - 1
core/odin/parser/parser.odin

@@ -2754,7 +2754,7 @@ parse_binary_expr :: proc(p: ^Parser, lhs: bool, prec_in: int) -> ^ast.Expr {
 			} else if op.kind == .When {
 				x := expr;
 				cond := parse_expr(p, lhs);
-				op2 := expect_token(p, .Else);
+				else_tok := expect_token(p, .Else);
 				y := parse_expr(p, lhs);
 				te := ast.new(ast.Ternary_When_Expr, expr.pos, end_pos(p.prev_tok));
 				te.x    = x;

+ 5 - 5
core/os/os_darwin.odin

@@ -202,10 +202,10 @@ Stat :: struct {
 	gid:           u32, // Group ID of the file's group
 	rdev:          i32, // Device ID, if device
 
-	last_access:   File_Time, // Time of last access
-	modified:      File_Time, // Time of last modification
-	status_change: File_Time, // Time of last status change
-	created:       File_Time, // Time of creation
+	last_access:   _File_Time, // Time of last access
+	modified:      _File_Time, // Time of last modification
+	status_change: _File_Time, // Time of last status change
+	created:       _File_Time, // Time of creation
 
 	size:          i64,  // Size of the file, in bytes
 	blocks:        i64,  // Number of blocks allocated for the file
@@ -273,7 +273,7 @@ foreign libc {
 	@(link_name="lseek")   _unix_lseek   :: proc(fs: Handle, offset: int, whence: int) -> int ---;
 	@(link_name="gettid")  _unix_gettid  :: proc() -> u64 ---;
 	@(link_name="getpagesize") _unix_getpagesize :: proc() -> i32 ---;
-	@(link_name="stat")    _unix_stat    :: proc(path: cstring, stat: ^Stat) -> int ---;
+	@(link_name="stat64")    _unix_stat    :: proc(path: cstring, stat: ^Stat) -> int ---;
 	@(link_name="access")  _unix_access  :: proc(path: cstring, mask: int) -> int ---;
 
 	@(link_name="malloc")  _unix_malloc  :: proc(size: int) -> rawptr ---;

+ 6 - 6
core/os/os_linux.odin

@@ -199,9 +199,9 @@ Stat :: struct {
 	block_size:    i64, // Optimal bllocksize for I/O
 	blocks:        i64, // Number of 512-byte blocks allocated
 
-	last_access:   _File_Time, // Time of last access
-	modified:      _File_Time, // Time of last modification
-	status_change: _File_Time, // Time of last status change
+	last_access:   File_Time, // Time of last access
+	status_change: File_Time, // Time of last status change
+	modified:      File_Time, // Time of last modification
 
 	_reserve1,
 	_reserve2,
@@ -268,7 +268,7 @@ foreign libc {
 	@(link_name="lseek64")          _unix_seek          :: proc(fd: Handle, offset: i64, whence: c.int) -> i64 ---;
 	@(link_name="gettid")           _unix_gettid        :: proc() -> u64 ---;
 	@(link_name="getpagesize")      _unix_getpagesize   :: proc() -> c.int ---;
-	@(link_name="stat")             _unix_stat          :: proc(path: cstring, stat: ^Stat) -> c.int ---;
+	@(link_name="stat64")           _unix_stat          :: proc(path: cstring, stat: ^Stat) -> c.int ---;
 	@(link_name="fstat")            _unix_fstat         :: proc(fd: Handle, stat: ^Stat) -> c.int ---;
 	@(link_name="access")           _unix_access        :: proc(path: cstring, mask: c.int) -> c.int ---;
 
@@ -366,7 +366,7 @@ last_write_time :: proc(fd: Handle) -> (File_Time, Errno) {
 	if err != ERROR_NONE {
 		return 0, err;
 	}
-	return File_Time(s.modified.nanoseconds), ERROR_NONE;
+	return File_Time(s.modified), ERROR_NONE;
 }
 
 last_write_time_by_name :: proc(name: string) -> (File_Time, Errno) {
@@ -374,7 +374,7 @@ last_write_time_by_name :: proc(name: string) -> (File_Time, Errno) {
 	if err != ERROR_NONE {
 		return 0, err;
 	}
-	return File_Time(s.modified.nanoseconds), ERROR_NONE;
+	return File_Time(s.modified), ERROR_NONE;
 }
 
 stat :: inline proc(path: string) -> (Stat, Errno) {

+ 1 - 1
misc/shell.bat

@@ -7,5 +7,5 @@ rem call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxil
 rem call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x64 1> NUL
 set _NO_DEBUG_HEAP=1
 
-set path=w:\Odin\misc;%path%
+rem set path=w:\Odin\misc;%path%
 cls