mirror of
https://github.com/odin-lang/Odin.git
synced 2025-12-31 02:12:04 +00:00
167 lines
4.7 KiB
Odin
167 lines
4.7 KiB
Odin
package runtime
|
|
|
|
bounds_trap :: proc "contextless" () -> ! {
|
|
when ODIN_OS == "windows" {
|
|
windows_trap_array_bounds();
|
|
} else {
|
|
trap();
|
|
}
|
|
}
|
|
|
|
type_assertion_trap :: proc "contextless" () -> ! {
|
|
when ODIN_OS == "windows" {
|
|
windows_trap_type_assertion();
|
|
} else {
|
|
trap();
|
|
}
|
|
}
|
|
|
|
|
|
bounds_check_error :: proc "contextless" (file: string, line, column: int, index, count: int) {
|
|
if 0 <= index && index < count {
|
|
return;
|
|
}
|
|
handle_error :: proc "contextless" (file: string, line, column: int, index, count: int) {
|
|
context = default_context();
|
|
print_caller_location(Source_Code_Location{file, line, column, "", 0});
|
|
print_string(" Index ");
|
|
print_i64(i64(index));
|
|
print_string(" is out of bounds range 0:");
|
|
print_i64(i64(count));
|
|
print_byte('\n');
|
|
bounds_trap();
|
|
}
|
|
handle_error(file, line, column, index, count);
|
|
}
|
|
|
|
slice_handle_error :: proc "contextless" (file: string, line, column: int, lo, hi: int, len: int) -> ! {
|
|
context = default_context();
|
|
print_caller_location(Source_Code_Location{file, line, column, "", 0});
|
|
print_string(" Invalid slice indices: ");
|
|
print_i64(i64(lo));
|
|
print_string(":");
|
|
print_i64(i64(hi));
|
|
print_string(":");
|
|
print_i64(i64(len));
|
|
print_byte('\n');
|
|
bounds_trap();
|
|
}
|
|
|
|
slice_expr_error_hi :: proc "contextless" (file: string, line, column: int, 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: int, 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: int, low, high, max: int) {
|
|
if 0 <= low && low <= high && high <= max {
|
|
return;
|
|
}
|
|
handle_error :: proc "contextless" (file: string, line, column: int, low, high, max: int) {
|
|
context = default_context();
|
|
print_caller_location(Source_Code_Location{file, line, column, "", 0});
|
|
print_string(" Invalid dynamic array values: ");
|
|
print_i64(i64(low));
|
|
print_string(":");
|
|
print_i64(i64(high));
|
|
print_string(":");
|
|
print_i64(i64(max));
|
|
print_byte('\n');
|
|
bounds_trap();
|
|
}
|
|
handle_error(file, line, column, low, high, max);
|
|
}
|
|
|
|
|
|
type_assertion_check :: proc "contextless" (ok: bool, file: string, line, column: int, from, to: typeid) {
|
|
if ok {
|
|
return;
|
|
}
|
|
handle_error :: proc "contextless" (file: string, line, column: int, from, to: typeid) {
|
|
context = default_context();
|
|
print_caller_location(Source_Code_Location{file, line, column, "", 0});
|
|
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);
|
|
}
|
|
|
|
make_slice_error_loc :: inline proc "contextless" (loc := #caller_location, len: int) {
|
|
if 0 <= len {
|
|
return;
|
|
}
|
|
handle_error :: proc "contextless" (loc: Source_Code_Location, len: int) {
|
|
context = default_context();
|
|
print_caller_location(loc);
|
|
print_string(" Invalid slice length for make: ");
|
|
print_i64(i64(len));
|
|
print_byte('\n');
|
|
bounds_trap();
|
|
}
|
|
handle_error(loc, len);
|
|
}
|
|
|
|
make_dynamic_array_error_loc :: inline proc "contextless" (using loc := #caller_location, len, cap: int) {
|
|
if 0 <= len && len <= cap {
|
|
return;
|
|
}
|
|
handle_error :: proc "contextless" (loc: Source_Code_Location, len, cap: int) {
|
|
context = default_context();
|
|
print_caller_location(loc);
|
|
print_string(" Invalid dynamic array parameters for make: ");
|
|
print_i64(i64(len));
|
|
print_byte(':');
|
|
print_i64(i64(cap));
|
|
print_byte('\n');
|
|
bounds_trap();
|
|
}
|
|
handle_error(loc, len, cap);
|
|
}
|
|
|
|
make_map_expr_error_loc :: inline proc "contextless" (loc := #caller_location, cap: int) {
|
|
if 0 <= cap {
|
|
return;
|
|
}
|
|
handle_error :: proc "contextless" (loc: Source_Code_Location, cap: int) {
|
|
context = default_context();
|
|
print_caller_location(loc);
|
|
print_string(" Invalid map capacity for make: ");
|
|
print_i64(i64(cap));
|
|
print_byte('\n');
|
|
bounds_trap();
|
|
}
|
|
handle_error(loc, cap);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bounds_check_error_loc :: inline proc "contextless" (using loc := #caller_location, index, count: int) {
|
|
bounds_check_error(file_path, int(line), int(column), index, count);
|
|
}
|
|
|
|
slice_expr_error_hi_loc :: inline proc "contextless" (using loc := #caller_location, hi: int, len: int) {
|
|
slice_expr_error_hi(file_path, int(line), int(column), hi, len);
|
|
}
|
|
|
|
slice_expr_error_lo_hi_loc :: inline proc "contextless" (using loc := #caller_location, lo, hi: int, len: int) {
|
|
slice_expr_error_lo_hi(file_path, int(line), int(column), lo, hi, len);
|
|
}
|
|
|
|
dynamic_array_expr_error_loc :: inline proc "contextless" (using loc := #caller_location, low, high, max: int) {
|
|
dynamic_array_expr_error(file_path, int(line), int(column), low, high, max);
|
|
}
|