Przeglądaj źródła

Fix ir bug; allow formatting options for arrays & et al.

Ginger Bill 8 lat temu
rodzic
commit
8677c81da7
3 zmienionych plików z 31 dodań i 44 usunięć
  1. 28 41
      core/fmt.odin
  2. 2 2
      src/ir.c
  3. 1 1
      src/types.c

+ 28 - 41
core/fmt.odin

@@ -604,7 +604,7 @@ fmt_int :: proc(fi: ^Fmt_Info, u: u64, is_signed: bool, bit_size: int, verb: run
 }
 }
 
 
 _pad :: proc(fi: ^Fmt_Info, s: string) {
 _pad :: proc(fi: ^Fmt_Info, s: string) {
-	if !fi.width_set || fi.width == 0 {
+	if !fi.width_set {
 		write_string(fi.buf, s);
 		write_string(fi.buf, s);
 		return;
 		return;
 	}
 	}
@@ -818,11 +818,6 @@ fmt_value :: proc(fi: ^Fmt_Info, v: any, verb: rune) {
 		fmt_arg(fi, any{v.data, info.elem}, verb);
 		fmt_arg(fi, any{v.data, info.elem}, verb);
 
 
 	case Array:
 	case Array:
-		if verb != 'v' {
-			fmt_bad_verb(fi, verb);
-			return;
-		}
-
 		write_byte(fi.buf, '[');
 		write_byte(fi.buf, '[');
 		defer write_byte(fi.buf, ']');
 		defer write_byte(fi.buf, ']');
 		for i in 0..<info.count {
 		for i in 0..<info.count {
@@ -830,15 +825,10 @@ fmt_value :: proc(fi: ^Fmt_Info, v: any, verb: rune) {
 				write_string(fi.buf, ", ");
 				write_string(fi.buf, ", ");
 			}
 			}
 			data := ^byte(v.data) + i*info.elem_size;
 			data := ^byte(v.data) + i*info.elem_size;
-			fmt_arg(fi, any{rawptr(data), info.elem}, 'v');
+			fmt_arg(fi, any{rawptr(data), info.elem}, verb);
 		}
 		}
 
 
 	case Dynamic_Array:
 	case Dynamic_Array:
-		if verb != 'v' {
-			fmt_bad_verb(fi, verb);
-			return;
-		}
-
 		write_byte(fi.buf, '[');
 		write_byte(fi.buf, '[');
 		defer write_byte(fi.buf, ']');
 		defer write_byte(fi.buf, ']');
 		array := (^raw.Dynamic_Array)(v.data);
 		array := (^raw.Dynamic_Array)(v.data);
@@ -847,7 +837,32 @@ fmt_value :: proc(fi: ^Fmt_Info, v: any, verb: rune) {
 				write_string(fi.buf, ", ");
 				write_string(fi.buf, ", ");
 			}
 			}
 			data := ^byte(array.data) + i*info.elem_size;
 			data := ^byte(array.data) + i*info.elem_size;
-			fmt_arg(fi, any{rawptr(data), info.elem}, 'v');
+			fmt_arg(fi, any{rawptr(data), info.elem}, verb);
+		}
+
+	case Slice:
+		write_byte(fi.buf, '[');
+		defer write_byte(fi.buf, ']');
+		slice := (^[]byte)(v.data);
+		for _, i in slice {
+			if i > 0 {
+				write_string(fi.buf, ", ");
+			}
+			data := &slice[0] + i*info.elem_size;
+			fmt_arg(fi, any{rawptr(data), info.elem}, verb);
+		}
+
+	case Vector:
+		write_byte(fi.buf, '<');
+		defer write_byte(fi.buf, '>');
+
+		for i in 0..<info.count {
+			if i > 0 {
+				write_string(fi.buf, ", ");
+			}
+
+			data := ^byte(v.data) + i*info.elem_size;
+			fmt_value(fi, any{rawptr(data), info.elem}, verb);
 		}
 		}
 
 
 	case Map:
 	case Map:
@@ -884,35 +899,7 @@ fmt_value :: proc(fi: ^Fmt_Info, v: any, verb: rune) {
 			fmt_arg(fi, any{rawptr(value), info.value}, 'v');
 			fmt_arg(fi, any{rawptr(value), info.value}, 'v');
 		}
 		}
 
 
-	case Slice:
-		if verb != 'v' {
-			fmt_bad_verb(fi, verb);
-			return;
-		}
 
 
-		write_byte(fi.buf, '[');
-		defer write_byte(fi.buf, ']');
-		slice := (^[]byte)(v.data);
-		for _, i in slice {
-			if i > 0 {
-				write_string(fi.buf, ", ");
-			}
-			data := &slice[0] + i*info.elem_size;
-			fmt_arg(fi, any{rawptr(data), info.elem}, 'v');
-		}
-
-	case Vector:
-		write_byte(fi.buf, '<');
-		defer write_byte(fi.buf, '>');
-
-		for i in 0..<info.count {
-			if i > 0 {
-				write_string(fi.buf, ", ");
-			}
-
-			data := ^byte(v.data) + i*info.elem_size;
-			fmt_value(fi, any{rawptr(data), info.elem}, 'v');
-		}
 
 
 	case Struct:
 	case Struct:
 		write_byte(fi.buf, '{');
 		write_byte(fi.buf, '{');

+ 2 - 2
src/ir.c

@@ -2710,8 +2710,8 @@ irValue *ir_emit_conv(irProcedure *proc, irValue *value, Type *t) {
 	if (is_type_integer(src) && is_type_integer(dst)) {
 	if (is_type_integer(src) && is_type_integer(dst)) {
 		GB_ASSERT(src->kind == Type_Basic &&
 		GB_ASSERT(src->kind == Type_Basic &&
 		          dst->kind == Type_Basic);
 		          dst->kind == Type_Basic);
-		i64 sz = type_size_of(proc->module->allocator, src);
-		i64 dz = type_size_of(proc->module->allocator, dst);
+		i64 sz = type_size_of(proc->module->allocator, default_type(src));
+		i64 dz = type_size_of(proc->module->allocator, default_type(dst));
 		irConvKind kind = irConv_trunc;
 		irConvKind kind = irConv_trunc;
 
 
 		if (dz < sz) {
 		if (dz < sz) {

+ 1 - 1
src/types.c

@@ -1763,7 +1763,7 @@ i64 type_size_of_internal(gbAllocator allocator, Type *t, TypePath *path) {
 	} break;
 	} break;
 
 
 	case Type_Basic: {
 	case Type_Basic: {
-		GB_ASSERT(is_type_typed(t));
+		GB_ASSERT_MSG(is_type_typed(t), "%s", type_to_string(t));
 		BasicKind kind = t->Basic.kind;
 		BasicKind kind = t->Basic.kind;
 		i64 size = t->Basic.size;
 		i64 size = t->Basic.size;
 		if (size > 0) {
 		if (size > 0) {