mirror of
https://github.com/roc-lang/roc.git
synced 2025-08-03 03:42:17 +00:00
Merge pull request #6062 from JRMurr/div-0-should-crash
Update zig `@panic` calls to `roc_panic` for numeric errors
This commit is contained in:
commit
e336aa525c
11 changed files with 71 additions and 47 deletions
|
@ -252,7 +252,6 @@ pub const RocDec = extern struct {
|
|||
|
||||
if (answer.has_overflowed) {
|
||||
roc_panic("Decimal addition overflowed!", 0);
|
||||
unreachable;
|
||||
} else {
|
||||
return answer.value;
|
||||
}
|
||||
|
@ -283,7 +282,6 @@ pub const RocDec = extern struct {
|
|||
|
||||
if (answer.has_overflowed) {
|
||||
roc_panic("Decimal subtraction overflowed!", 0);
|
||||
unreachable;
|
||||
} else {
|
||||
return answer.value;
|
||||
}
|
||||
|
@ -347,7 +345,6 @@ pub const RocDec = extern struct {
|
|||
|
||||
if (answer.has_overflowed) {
|
||||
roc_panic("Decimal multiplication overflowed!", 0);
|
||||
unreachable;
|
||||
} else {
|
||||
return answer.value;
|
||||
}
|
||||
|
@ -369,7 +366,7 @@ pub const RocDec = extern struct {
|
|||
|
||||
// (n / 0) is an error
|
||||
if (denominator_i128 == 0) {
|
||||
@panic("TODO runtime exception for dividing by 0!");
|
||||
roc_panic("Decimal division by 0!", 0);
|
||||
}
|
||||
|
||||
// If they're both negative, or if neither is negative, the final answer
|
||||
|
@ -397,7 +394,7 @@ pub const RocDec = extern struct {
|
|||
if (denominator_i128 == one_point_zero_i128) {
|
||||
return self;
|
||||
} else {
|
||||
@panic("TODO runtime exception for overflow when dividing!");
|
||||
roc_panic("Decimal division overflow in numerator!", 0);
|
||||
}
|
||||
};
|
||||
const numerator_u128 = @as(u128, @intCast(numerator_abs_i128));
|
||||
|
@ -410,7 +407,7 @@ pub const RocDec = extern struct {
|
|||
if (numerator_i128 == one_point_zero_i128) {
|
||||
return other;
|
||||
} else {
|
||||
@panic("TODO runtime exception for overflow when dividing!");
|
||||
roc_panic("Decimal division overflow in denominator!", 0);
|
||||
}
|
||||
};
|
||||
const denominator_u128 = @as(u128, @intCast(denominator_abs_i128));
|
||||
|
@ -422,7 +419,7 @@ pub const RocDec = extern struct {
|
|||
if (answer.hi == 0 and answer.lo <= math.maxInt(i128)) {
|
||||
unsigned_answer = @as(i128, @intCast(answer.lo));
|
||||
} else {
|
||||
@panic("TODO runtime exception for overflow when dividing!");
|
||||
roc_panic("Decimal division overflow!", 0);
|
||||
}
|
||||
|
||||
return RocDec{ .num = if (is_answer_negative) -unsigned_answer else unsigned_answer };
|
||||
|
@ -636,7 +633,7 @@ fn mul_and_decimalize(a: u128, b: u128) i128 {
|
|||
const d = answer[0];
|
||||
|
||||
if (overflowed == 1) {
|
||||
@panic("TODO runtime exception for overflow!");
|
||||
roc_panic("Decimal multiplication overflow!", 0);
|
||||
}
|
||||
|
||||
// Final 512bit value is d, c, b, a
|
||||
|
@ -1216,7 +1213,7 @@ pub fn fromF64C(arg: f64) callconv(.C) i128 {
|
|||
if (@call(.always_inline, RocDec.fromF64, .{arg})) |dec| {
|
||||
return dec.num;
|
||||
} else {
|
||||
@panic("TODO runtime exception failing convert f64 to RocDec");
|
||||
roc_panic("Decimal conversion from f64 failed!", 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1225,7 +1222,7 @@ pub fn fromF32C(arg_f32: f32) callconv(.C) i128 {
|
|||
if (@call(.always_inline, RocDec.fromF64, .{arg_f64})) |dec| {
|
||||
return dec.num;
|
||||
} else {
|
||||
@panic("TODO runtime exception failing convert f64 to RocDec");
|
||||
roc_panic("Decimal conversion from f32!", 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1240,7 +1237,7 @@ pub fn exportFromInt(comptime T: type, comptime name: []const u8) void {
|
|||
|
||||
const answer = @mulWithOverflow(this, RocDec.one_point_zero_i128);
|
||||
if (answer[1] == 1) {
|
||||
@panic("TODO runtime exception failing convert integer to RocDec");
|
||||
roc_panic("Decimal conversion from Integer failed!", 0);
|
||||
} else {
|
||||
return answer[0];
|
||||
}
|
||||
|
@ -1266,11 +1263,15 @@ pub fn neqC(arg1: RocDec, arg2: RocDec) callconv(.C) bool {
|
|||
}
|
||||
|
||||
pub fn negateC(arg: RocDec) callconv(.C) i128 {
|
||||
return if (@call(.always_inline, RocDec.negate, .{arg})) |dec| dec.num else @panic("TODO overflow for negating RocDec");
|
||||
return if (@call(.always_inline, RocDec.negate, .{arg})) |dec| dec.num else {
|
||||
roc_panic("Decimal negation overflow!", 0);
|
||||
};
|
||||
}
|
||||
|
||||
pub fn absC(arg: RocDec) callconv(.C) i128 {
|
||||
const result = @call(.always_inline, RocDec.abs, .{arg}) catch @panic("TODO overflow for calling absolute value on RocDec");
|
||||
const result = @call(.always_inline, RocDec.abs, .{arg}) catch {
|
||||
roc_panic("Decimal absolute value overflow!", 0);
|
||||
};
|
||||
return result.num;
|
||||
}
|
||||
|
||||
|
|
|
@ -233,7 +233,9 @@ pub fn exportCeiling(comptime F: type, comptime T: type, comptime name: []const
|
|||
pub fn exportDivCeil(comptime T: type, comptime name: []const u8) void {
|
||||
comptime var f = struct {
|
||||
fn func(a: T, b: T) callconv(.C) T {
|
||||
return math.divCeil(T, a, b) catch @panic("TODO runtime exception for dividing by 0!");
|
||||
return math.divCeil(T, a, b) catch {
|
||||
roc_panic("Integer division by 0!", 0);
|
||||
};
|
||||
}
|
||||
}.func;
|
||||
@export(f, .{ .name = name ++ @typeName(T), .linkage = .Strong });
|
||||
|
@ -379,8 +381,7 @@ pub fn exportAddOrPanic(comptime T: type, comptime name: []const u8) void {
|
|||
fn func(self: T, other: T) callconv(.C) T {
|
||||
const result = addWithOverflow(T, self, other);
|
||||
if (result.has_overflowed) {
|
||||
roc_panic("integer addition overflowed!", 0);
|
||||
unreachable;
|
||||
roc_panic("Integer addition overflowed!", 0);
|
||||
} else {
|
||||
return result.value;
|
||||
}
|
||||
|
@ -437,8 +438,7 @@ pub fn exportSubOrPanic(comptime T: type, comptime name: []const u8) void {
|
|||
fn func(self: T, other: T) callconv(.C) T {
|
||||
const result = subWithOverflow(T, self, other);
|
||||
if (result.has_overflowed) {
|
||||
roc_panic("integer subtraction overflowed!", 0);
|
||||
unreachable;
|
||||
roc_panic("Integer subtraction overflowed!", 0);
|
||||
} else {
|
||||
return result.value;
|
||||
}
|
||||
|
@ -622,8 +622,7 @@ pub fn exportMulOrPanic(comptime T: type, comptime W: type, comptime name: []con
|
|||
fn func(self: T, other: T) callconv(.C) T {
|
||||
const result = @call(.always_inline, mulWithOverflow, .{ T, W, self, other });
|
||||
if (result.has_overflowed) {
|
||||
roc_panic("integer multiplication overflowed!", 0);
|
||||
unreachable;
|
||||
roc_panic("Integer multiplication overflowed!", 0);
|
||||
} else {
|
||||
return result.value;
|
||||
}
|
||||
|
|
|
@ -2,14 +2,14 @@ const std = @import("std");
|
|||
const RocStr = @import("str.zig").RocStr;
|
||||
|
||||
// Signals to the host that the program has panicked
|
||||
extern fn roc_panic(msg: *const RocStr, tag_id: u32) callconv(.C) void;
|
||||
extern fn roc_panic(msg: *const RocStr, tag_id: u32) callconv(.C) noreturn;
|
||||
|
||||
pub fn panic_help(msg: []const u8, tag_id: u32) void {
|
||||
pub fn panic_help(msg: []const u8, tag_id: u32) noreturn {
|
||||
var str = RocStr.init(msg.ptr, msg.len);
|
||||
roc_panic(&str, tag_id);
|
||||
}
|
||||
|
||||
// must export this explicitly because right now it is not used from zig code
|
||||
pub fn panic(msg: *const RocStr, alignment: u32) callconv(.C) void {
|
||||
pub fn panic(msg: *const RocStr, alignment: u32) callconv(.C) noreturn {
|
||||
return roc_panic(msg, alignment);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue