Browse Source

Reorganize error check procedures

gingerBill 3 years ago
parent
commit
37bba4c0a6
1 changed files with 157 additions and 160 deletions
  1. 157 160
      core/runtime/error_checks.odin

+ 157 - 160
core/runtime/error_checks.odin

@@ -17,6 +17,23 @@ type_assertion_trap :: proc "contextless" () -> ! {
 }
 
 
+bounds_check_error_loc :: #force_inline proc "contextless" (using loc := #caller_location, index, count: int) {
+	bounds_check_error(file_path, line, column, index, count)
+}
+
+slice_expr_error_hi_loc :: #force_inline proc "contextless" (using loc := #caller_location, hi: int, len: int) {
+	slice_expr_error_hi(file_path, line, column, hi, len)
+}
+
+slice_expr_error_lo_hi_loc :: #force_inline proc "contextless" (using loc := #caller_location, lo, hi: int, len: int) {
+	slice_expr_error_lo_hi(file_path, line, column, lo, hi, len)
+}
+
+dynamic_array_expr_error_loc :: #force_inline proc "contextless" (using loc := #caller_location, low, high, max: int) {
+	dynamic_array_expr_error(file_path, line, column, low, high, max)
+}
+
+
 when ODIN_FOREIGN_ERROR_PROCEDURES {
 	foreign {
 		bounds_check_error               :: proc "contextless" (file: string, line, column: i32, index, count: int) ---
@@ -29,182 +46,182 @@ when ODIN_FOREIGN_ERROR_PROCEDURES {
 		matrix_bounds_check_error        :: proc "contextless" (file: string, line, column: i32, row_index, column_index, row_count, column_count: int) ---
 		type_assertion_check             :: proc "contextless" (ok: bool, file: string, line, column: i32, from, to: typeid) ---
 		type_assertion_check2            :: proc "contextless" (ok: bool, file: string, line, column: i32, from, to: typeid, from_data: rawptr) ---
-		make_slice_error_loc             :: proc "contextless" (loc := #caller_location, len: int) ---
-		make_dynamic_array_error_loc     :: proc "contextless" (using loc := #caller_location, len, cap: int) ---
-		make_map_expr_error_loc          :: proc "contextless" (loc := #caller_location, cap: int) ---
 	}
 } else {
-
-bounds_check_error :: proc "contextless" (file: string, line, column: i32, index, count: int) {
-	if 0 <= index && index < count {
-		return
+	bounds_check_error :: proc "contextless" (file: string, line, column: i32, index, count: int) {
+		if 0 <= index && index < count {
+			return
+		}
+		handle_error :: proc "contextless" (file: string, line, column: i32, index, count: int) {
+			print_caller_location(Source_Code_Location{file, line, column, ""})
+			print_string(" Index ")
+			print_i64(i64(index))
+			print_string(" is out of range 0..<")
+			print_i64(i64(count))
+			print_byte('\n')
+			bounds_trap()
+		}
+		handle_error(file, line, column, index, count)
 	}
-	handle_error :: proc "contextless" (file: string, line, column: i32, index, count: int) {
+
+	slice_handle_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int, len: int) -> ! {
 		print_caller_location(Source_Code_Location{file, line, column, ""})
-		print_string(" Index ")
-		print_i64(i64(index))
+		print_string(" Invalid slice indices ")
+		print_i64(i64(lo))
+		print_string(":")
+		print_i64(i64(hi))
 		print_string(" is out of range 0..<")
-		print_i64(i64(count))
+		print_i64(i64(len))
 		print_byte('\n')
 		bounds_trap()
 	}
-	handle_error(file, line, column, index, count)
-}
-
-slice_handle_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int, len: int) -> ! {
-	print_caller_location(Source_Code_Location{file, line, column, ""})
-	print_string(" Invalid slice indices ")
-	print_i64(i64(lo))
-	print_string(":")
-	print_i64(i64(hi))
-	print_string(" is out of range 0..<")
-	print_i64(i64(len))
-	print_byte('\n')
-	bounds_trap()
-}
-
-multi_pointer_slice_handle_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int) -> ! {
-	print_caller_location(Source_Code_Location{file, line, column, ""})
-	print_string(" Invalid slice indices ")
-	print_i64(i64(lo))
-	print_string(":")
-	print_i64(i64(hi))
-	print_byte('\n')
-	bounds_trap()
-}
-
-
-multi_pointer_slice_expr_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int) {
-	if lo <= hi {
-		return
-	}
-	multi_pointer_slice_handle_error(file, line, column, lo, hi)
-}
-
-slice_expr_error_hi :: proc "contextless" (file: string, line, column: i32, hi: int, len: int) {
-	if 0 <= hi && hi <= len {
-		return
-	}
-	slice_handle_error(file, line, column, 0, hi, len)
-}
 
-slice_expr_error_lo_hi :: proc "contextless" (file: string, line, column: i32, lo, hi: int, len: int) {
-	if 0 <= lo && lo <= len && lo <= hi && hi <= len {
-		return
-	}
-	slice_handle_error(file, line, column, lo, hi, len)
-}
-
-dynamic_array_expr_error :: proc "contextless" (file: string, line, column: i32, low, high, max: int) {
-	if 0 <= low && low <= high && high <= max {
-		return
-	}
-	handle_error :: proc "contextless" (file: string, line, column: i32, low, high, max: int) {
+	multi_pointer_slice_handle_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int) -> ! {
 		print_caller_location(Source_Code_Location{file, line, column, ""})
-		print_string(" Invalid dynamic array indices ")
-		print_i64(i64(low))
+		print_string(" Invalid slice indices ")
+		print_i64(i64(lo))
 		print_string(":")
-		print_i64(i64(high))
-		print_string(" is out of range 0..<")
-		print_i64(i64(max))
+		print_i64(i64(hi))
 		print_byte('\n')
 		bounds_trap()
 	}
-	handle_error(file, line, column, low, high, max)
-}
 
 
-matrix_bounds_check_error :: proc "contextless" (file: string, line, column: i32, row_index, column_index, row_count, column_count: int) {
-	if 0 <= row_index && row_index < row_count && 
-	   0 <= column_index && column_index < column_count {
-		return
+	multi_pointer_slice_expr_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int) {
+		if lo <= hi {
+			return
+		}
+		multi_pointer_slice_handle_error(file, line, column, lo, hi)
 	}
-	handle_error :: proc "contextless" (file: string, line, column: i32, row_index, column_index, row_count, column_count: int) {
-		print_caller_location(Source_Code_Location{file, line, column, ""})
-		print_string(" Matrix indices [")
-		print_i64(i64(row_index))
-		print_string(", ")
-		print_i64(i64(column_index))
-		print_string(" is out of range [0..<")
-		print_i64(i64(row_count))
-		print_string(", 0..<")
-		print_i64(i64(column_count))
-		print_string("]")
-		print_byte('\n')
-		bounds_trap()
+
+	slice_expr_error_hi :: proc "contextless" (file: string, line, column: i32, hi: int, len: int) {
+		if 0 <= hi && hi <= len {
+			return
+		}
+		slice_handle_error(file, line, column, 0, hi, len)
 	}
-	handle_error(file, line, column, row_index, column_index, row_count, column_count)
-}
 
+	slice_expr_error_lo_hi :: proc "contextless" (file: string, line, column: i32, lo, hi: int, len: int) {
+		if 0 <= lo && lo <= len && lo <= hi && hi <= len {
+			return
+		}
+		slice_handle_error(file, line, column, lo, hi, len)
+	}
 
-type_assertion_check :: proc "contextless" (ok: bool, file: string, line, column: i32, from, to: typeid) {
-	if ok {
-		return
+	dynamic_array_expr_error :: proc "contextless" (file: string, line, column: i32, low, high, max: int) {
+		if 0 <= low && low <= high && high <= max {
+			return
+		}
+		handle_error :: proc "contextless" (file: string, line, column: i32, low, high, max: int) {
+			print_caller_location(Source_Code_Location{file, line, column, ""})
+			print_string(" Invalid dynamic array indices ")
+			print_i64(i64(low))
+			print_string(":")
+			print_i64(i64(high))
+			print_string(" is out of range 0..<")
+			print_i64(i64(max))
+			print_byte('\n')
+			bounds_trap()
+		}
+		handle_error(file, line, column, low, high, max)
 	}
-	handle_error :: proc "contextless" (file: string, line, column: i32, from, to: typeid) {
-		print_caller_location(Source_Code_Location{file, line, column, ""})
-		print_string(" Invalid type assertion from ")
-		print_typeid(from)
-		print_string(" to ")
-		print_typeid(to)
-		print_byte('\n')
-		type_assertion_trap()
+
+
+	matrix_bounds_check_error :: proc "contextless" (file: string, line, column: i32, row_index, column_index, row_count, column_count: int) {
+		if 0 <= row_index && row_index < row_count &&
+		   0 <= column_index && column_index < column_count {
+			return
+		}
+		handle_error :: proc "contextless" (file: string, line, column: i32, row_index, column_index, row_count, column_count: int) {
+			print_caller_location(Source_Code_Location{file, line, column, ""})
+			print_string(" Matrix indices [")
+			print_i64(i64(row_index))
+			print_string(", ")
+			print_i64(i64(column_index))
+			print_string(" is out of range [0..<")
+			print_i64(i64(row_count))
+			print_string(", 0..<")
+			print_i64(i64(column_count))
+			print_string("]")
+			print_byte('\n')
+			bounds_trap()
+		}
+		handle_error(file, line, column, row_index, column_index, row_count, column_count)
 	}
-	handle_error(file, line, column, from, to)
-}
 
-type_assertion_check2 :: proc "contextless" (ok: bool, file: string, line, column: i32, from, to: typeid, from_data: rawptr) {
-	if ok {
-		return
+
+	type_assertion_check :: proc "contextless" (ok: bool, file: string, line, column: i32, from, to: typeid) {
+		if ok {
+			return
+		}
+		handle_error :: proc "contextless" (file: string, line, column: i32, from, to: typeid) {
+			print_caller_location(Source_Code_Location{file, line, column, ""})
+			print_string(" Invalid type assertion from ")
+			print_typeid(from)
+			print_string(" to ")
+			print_typeid(to)
+			print_byte('\n')
+			type_assertion_trap()
+		}
+		handle_error(file, line, column, from, to)
 	}
 
-	variant_type :: proc "contextless" (id: typeid, data: rawptr) -> typeid {
-		if id == nil || data == nil {
-			return id
+	type_assertion_check2 :: proc "contextless" (ok: bool, file: string, line, column: i32, from, to: typeid, from_data: rawptr) {
+		if ok {
+			return
 		}
-		ti := type_info_base(type_info_of(id))
-		#partial switch v in ti.variant {
-		case Type_Info_Any:
-			return (^any)(data).id
-		case Type_Info_Union:
-			tag_ptr := uintptr(data) + v.tag_offset
-			idx := 0
-			switch v.tag_type.size {
-			case 1:  idx = int((^u8)(tag_ptr)^)   - 1
-			case 2:  idx = int((^u16)(tag_ptr)^)  - 1
-			case 4:  idx = int((^u32)(tag_ptr)^)  - 1
-			case 8:  idx = int((^u64)(tag_ptr)^)  - 1
-			case 16: idx = int((^u128)(tag_ptr)^) - 1
+
+		variant_type :: proc "contextless" (id: typeid, data: rawptr) -> typeid {
+			if id == nil || data == nil {
+				return id
 			}
-			if idx < 0 {
-				return nil
-			} else if idx < len(v.variants) {
-				return v.variants[idx].id
+			ti := type_info_base(type_info_of(id))
+			#partial switch v in ti.variant {
+			case Type_Info_Any:
+				return (^any)(data).id
+			case Type_Info_Union:
+				tag_ptr := uintptr(data) + v.tag_offset
+				idx := 0
+				switch v.tag_type.size {
+				case 1:  idx = int((^u8)(tag_ptr)^)   - 1
+				case 2:  idx = int((^u16)(tag_ptr)^)  - 1
+				case 4:  idx = int((^u32)(tag_ptr)^)  - 1
+				case 8:  idx = int((^u64)(tag_ptr)^)  - 1
+				case 16: idx = int((^u128)(tag_ptr)^) - 1
+				}
+				if idx < 0 {
+					return nil
+				} else if idx < len(v.variants) {
+					return v.variants[idx].id
+				}
 			}
+			return id
 		}
-		return id
-	}
 
-	handle_error :: proc "contextless" (file: string, line, column: i32, from, to: typeid, from_data: rawptr) {
+		handle_error :: proc "contextless" (file: string, line, column: i32, from, to: typeid, from_data: rawptr) {
 
-		actual := variant_type(from, from_data)
+			actual := variant_type(from, from_data)
 
-		print_caller_location(Source_Code_Location{file, line, column, ""})
-		print_string(" Invalid type assertion from ")
-		print_typeid(from)
-		print_string(" to ")
-		print_typeid(to)
-		if actual != from {
-			print_string(", actual type: ")
-			print_typeid(actual)
+			print_caller_location(Source_Code_Location{file, line, column, ""})
+			print_string(" Invalid type assertion from ")
+			print_typeid(from)
+			print_string(" to ")
+			print_typeid(to)
+			if actual != from {
+				print_string(", actual type: ")
+				print_typeid(actual)
+			}
+			print_byte('\n')
+			type_assertion_trap()
 		}
-		print_byte('\n')
-		type_assertion_trap()
+		handle_error(file, line, column, from, to, from_data)
 	}
-	handle_error(file, line, column, from, to, from_data)
 }
 
 
+// `make` related procedures below
+
+
 make_slice_error_loc :: #force_inline proc "contextless" (loc := #caller_location, len: int) {
 	if 0 <= len {
 		return
@@ -219,7 +236,7 @@ make_slice_error_loc :: #force_inline proc "contextless" (loc := #caller_locatio
 	handle_error(loc, len)
 }
 
-make_dynamic_array_error_loc :: #force_inline proc "contextless" (using loc := #caller_location, len, cap: int) {
+make_dynamic_array_error_loc :: #force_inline proc "contextless" (loc := #caller_location, len, cap: int) {
 	if 0 <= len && len <= cap {
 		return
 	}
@@ -248,23 +265,3 @@ make_map_expr_error_loc :: #force_inline proc "contextless" (loc := #caller_loca
 	}
 	handle_error(loc, cap)
 }
-
-}
-
-
-
-bounds_check_error_loc :: #force_inline proc "contextless" (using loc := #caller_location, index, count: int) {
-	bounds_check_error(file_path, line, column, index, count)
-}
-
-slice_expr_error_hi_loc :: #force_inline proc "contextless" (using loc := #caller_location, hi: int, len: int) {
-	slice_expr_error_hi(file_path, line, column, hi, len)
-}
-
-slice_expr_error_lo_hi_loc :: #force_inline proc "contextless" (using loc := #caller_location, lo, hi: int, len: int) {
-	slice_expr_error_lo_hi(file_path, line, column, lo, hi, len)
-}
-
-dynamic_array_expr_error_loc :: #force_inline proc "contextless" (using loc := #caller_location, low, high, max: int) {
-	dynamic_array_expr_error(file_path, line, column, low, high, max)
-}