aboutsummaryrefslogtreecommitdiff
path: root/core/runtime
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-06-15 12:39:29 +0100
committergingerBill <bill@gingerbill.org>2020-06-15 12:39:29 +0100
commitf70939ab4f5efcb93c49cdef6a54429eb0ccb9fe (patch)
tree8dbf492d6273311587399527fe6d2810d9b39816 /core/runtime
parent08e271720a0b6ab470d7a02120284aec1be835a6 (diff)
Use windows specific exception traps
Diffstat (limited to 'core/runtime')
-rw-r--r--core/runtime/internal.odin31
-rw-r--r--core/runtime/procs_windows_amd64.odin17
2 files changed, 41 insertions, 7 deletions
diff --git a/core/runtime/internal.odin b/core/runtime/internal.odin
index bc4b8e7de..4a707f196 100644
--- a/core/runtime/internal.odin
+++ b/core/runtime/internal.odin
@@ -583,6 +583,23 @@ quaternion256_eq :: inline proc "contextless" (a, b: quaternion256) -> bool { re
quaternion256_ne :: inline proc "contextless" (a, b: quaternion256) -> bool { return real(a) != real(b) || imag(a) != imag(b) || jmag(a) != jmag(b) || kmag(a) != kmag(b); }
+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 do return;
handle_error :: proc "contextless" (file: string, line, column: int, index, count: int) {
@@ -594,7 +611,7 @@ bounds_check_error :: proc "contextless" (file: string, line, column: int, index
os.write_string(fd, " is out of bounds range 0:");
print_i64(fd, i64(count));
os.write_byte(fd, '\n');
- debug_trap();
+ bounds_trap();
}
handle_error(file, line, column, index, count);
}
@@ -610,7 +627,7 @@ slice_handle_error :: proc "contextless" (file: string, line, column: int, lo, h
os.write_string(fd, ":");
print_i64(fd, i64(len));
os.write_byte(fd, '\n');
- debug_trap();
+ bounds_trap();
}
slice_expr_error_hi :: proc "contextless" (file: string, line, column: int, hi: int, len: int) {
@@ -636,7 +653,7 @@ dynamic_array_expr_error :: proc "contextless" (file: string, line, column: int,
os.write_string(fd, ":");
print_i64(fd, i64(max));
os.write_byte(fd, '\n');
- debug_trap();
+ bounds_trap();
}
handle_error(file, line, column, low, high, max);
}
@@ -653,7 +670,7 @@ type_assertion_check :: proc "contextless" (ok: bool, file: string, line, column
os.write_string(fd, " to ");
print_typeid(fd, to);
os.write_byte(fd, '\n');
- debug_trap();
+ type_assertion_trap();
}
handle_error(file, line, column, from, to);
}
@@ -764,7 +781,7 @@ make_slice_error_loc :: inline proc "contextless" (loc := #caller_location, len:
os.write_string(fd, " Invalid slice length for make: ");
print_i64(fd, i64(len));
os.write_byte(fd, '\n');
- debug_trap();
+ bounds_trap();
}
handle_error(loc, len);
}
@@ -780,7 +797,7 @@ make_dynamic_array_error_loc :: inline proc "contextless" (using loc := #caller_
os.write_byte(fd, ':');
print_i64(fd, i64(cap));
os.write_byte(fd, '\n');
- debug_trap();
+ bounds_trap();
}
handle_error(loc, len, cap);
}
@@ -794,7 +811,7 @@ make_map_expr_error_loc :: inline proc "contextless" (loc := #caller_location, c
os.write_string(fd, " Invalid map capacity for make: ");
print_i64(fd, i64(cap));
os.write_byte(fd, '\n');
- debug_trap();
+ bounds_trap();
}
handle_error(loc, cap);
}
diff --git a/core/runtime/procs_windows_amd64.odin b/core/runtime/procs_windows_amd64.odin
index 7b906f398..9941f9250 100644
--- a/core/runtime/procs_windows_amd64.odin
+++ b/core/runtime/procs_windows_amd64.odin
@@ -2,6 +2,23 @@ package runtime
foreign import kernel32 "system:Kernel32.lib"
+windows_trap_array_bounds :: proc "contextless" () -> ! {
+ DWORD :: u32;
+ ULONG_PTR :: uint;
+
+ EXCEPTION_ARRAY_BOUNDS_EXCEEDED :: 0xC000008C;
+
+ foreign kernel32 {
+ RaiseException :: proc(dwExceptionCode, dwExceptionFlags, nNumberOfArguments: DWORD, lpArguments: ^ULONG_PTR) -> ! ---
+ }
+
+ RaiseException(EXCEPTION_ARRAY_BOUNDS_EXCEEDED, 0, 0, nil);
+}
+
+windows_trap_type_assertion :: proc "contextless" () -> ! {
+ windows_trap_array_bounds();
+}
+
// @private
// @(link_name="_tls_index")
// _tls_index: u32;