mirror of
https://github.com/vlang/v.git
synced 2025-09-13 22:42:26 +03:00
builtin: move min/max integer values consts from math
to builtin (#19809)
This commit is contained in:
parent
7e7e43866a
commit
97f7c3f609
12 changed files with 90 additions and 27 deletions
|
@ -87,8 +87,8 @@ fn new_aints(ovals []int, extreme_mins int, extreme_maxs int) Aints {
|
||||||
nmaxs: extreme_maxs
|
nmaxs: extreme_maxs
|
||||||
}
|
}
|
||||||
mut sum := i64(0)
|
mut sum := i64(0)
|
||||||
mut imin := int(math.max_i32)
|
mut imin := int(max_i32)
|
||||||
mut imax := int(-math.max_i32)
|
mut imax := int(-max_i32)
|
||||||
// discard the extremes:
|
// discard the extremes:
|
||||||
mut vals := []int{}
|
mut vals := []int{}
|
||||||
for x in ovals {
|
for x in ovals {
|
||||||
|
|
|
@ -540,7 +540,7 @@ pub fn (mut a array) delete_last() {
|
||||||
// Alternative: Slices can also be made with [start..end] notation
|
// Alternative: Slices can also be made with [start..end] notation
|
||||||
// Alternative: `.slice_ni()` will always return an array.
|
// Alternative: `.slice_ni()` will always return an array.
|
||||||
fn (a array) slice(start int, _end int) array {
|
fn (a array) slice(start int, _end int) array {
|
||||||
end := if _end == 2147483647 { a.len } else { _end } // max_int
|
end := if _end == max_int { a.len } else { _end } // max_int
|
||||||
$if !no_bounds_checking {
|
$if !no_bounds_checking {
|
||||||
if start > end {
|
if start > end {
|
||||||
panic('array.slice: invalid slice index (${start} > ${end})')
|
panic('array.slice: invalid slice index (${start} > ${end})')
|
||||||
|
@ -575,7 +575,7 @@ fn (a array) slice(start int, _end int) array {
|
||||||
// This function always return a valid array.
|
// This function always return a valid array.
|
||||||
fn (a array) slice_ni(_start int, _end int) array {
|
fn (a array) slice_ni(_start int, _end int) array {
|
||||||
// a.flags.clear(.noslices)
|
// a.flags.clear(.noslices)
|
||||||
mut end := if _end == 2147483647 { a.len } else { _end } // max_int
|
mut end := if _end == max_int { a.len } else { _end } // max_int
|
||||||
mut start := _start
|
mut start := _start
|
||||||
|
|
||||||
if start < 0 {
|
if start < 0 {
|
||||||
|
|
|
@ -42,6 +42,38 @@ const (
|
||||||
digit_pairs = '00102030405060708090011121314151617181910212223242526272829203132333435363738393041424344454647484940515253545556575859506162636465666768696071727374757677787970818283848586878889809192939495969798999'
|
digit_pairs = '00102030405060708090011121314151617181910212223242526272829203132333435363738393041424344454647484940515253545556575859506162636465666768696071727374757677787970818283848586878889809192939495969798999'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
pub const (
|
||||||
|
min_i8 = i8(-128)
|
||||||
|
max_i8 = i8(127)
|
||||||
|
|
||||||
|
min_i16 = i16(-32768)
|
||||||
|
max_i16 = i16(32767)
|
||||||
|
|
||||||
|
min_i32 = i32(-2147483648)
|
||||||
|
max_i32 = i32(2147483647)
|
||||||
|
|
||||||
|
min_int = min_i32
|
||||||
|
max_int = max_i32
|
||||||
|
|
||||||
|
// -9223372036854775808 is wrong, because C compilers parse literal values
|
||||||
|
// without sign first, and 9223372036854775808 overflows i64, hence the
|
||||||
|
// consecutive subtraction by 1
|
||||||
|
min_i64 = i64(-9223372036854775807 - 1)
|
||||||
|
max_i64 = i64(9223372036854775807)
|
||||||
|
|
||||||
|
min_u8 = u8(0)
|
||||||
|
max_u8 = u8(255)
|
||||||
|
|
||||||
|
min_u16 = u16(0)
|
||||||
|
max_u16 = u16(65535)
|
||||||
|
|
||||||
|
min_u32 = u32(0)
|
||||||
|
max_u32 = u32(4294967295)
|
||||||
|
|
||||||
|
min_u64 = u64(0)
|
||||||
|
max_u64 = u64(18446744073709551615)
|
||||||
|
)
|
||||||
|
|
||||||
// This implementation is the quickest with gcc -O2
|
// This implementation is the quickest with gcc -O2
|
||||||
// str_l returns the string representation of the integer nn with max chars.
|
// str_l returns the string representation of the integer nn with max chars.
|
||||||
[direct_array_access; inline]
|
[direct_array_access; inline]
|
||||||
|
@ -194,8 +226,7 @@ pub fn (nn i64) str() string {
|
||||||
mut d := i64(0)
|
mut d := i64(0)
|
||||||
if n == 0 {
|
if n == 0 {
|
||||||
return '0'
|
return '0'
|
||||||
} else if n == i64(-9223372036854775807 - 1) {
|
} else if n == min_i64 {
|
||||||
// math.min_i64
|
|
||||||
return '-9223372036854775808'
|
return '-9223372036854775808'
|
||||||
}
|
}
|
||||||
max := 20
|
max := 20
|
||||||
|
|
|
@ -1027,7 +1027,7 @@ pub fn (s string) split_into_lines() []string {
|
||||||
// Example: assert 'ABCD'.substr(1,3) == 'BC'
|
// Example: assert 'ABCD'.substr(1,3) == 'BC'
|
||||||
[direct_array_access]
|
[direct_array_access]
|
||||||
pub fn (s string) substr(start int, _end int) string {
|
pub fn (s string) substr(start int, _end int) string {
|
||||||
end := if _end == 2147483647 { s.len } else { _end } // max_int
|
end := if _end == max_int { s.len } else { _end } // max_int
|
||||||
$if !no_bounds_checking {
|
$if !no_bounds_checking {
|
||||||
if start > end || start > s.len || end > s.len || start < 0 || end < 0 {
|
if start > end || start > s.len || end > s.len || start < 0 || end < 0 {
|
||||||
panic('substr(${start}, ${end}) out of bounds (len=${s.len})')
|
panic('substr(${start}, ${end}) out of bounds (len=${s.len})')
|
||||||
|
@ -1052,7 +1052,7 @@ pub fn (s string) substr(start int, _end int) string {
|
||||||
// return an error when the index is out of range
|
// return an error when the index is out of range
|
||||||
[direct_array_access]
|
[direct_array_access]
|
||||||
pub fn (s string) substr_with_check(start int, _end int) !string {
|
pub fn (s string) substr_with_check(start int, _end int) !string {
|
||||||
end := if _end == 2147483647 { s.len } else { _end } // max_int
|
end := if _end == max_int { s.len } else { _end } // max_int
|
||||||
if start > end || start > s.len || end > s.len || start < 0 || end < 0 {
|
if start > end || start > s.len || end > s.len || start < 0 || end < 0 {
|
||||||
return error('substr(${start}, ${end}) out of bounds (len=${s.len})')
|
return error('substr(${start}, ${end}) out of bounds (len=${s.len})')
|
||||||
}
|
}
|
||||||
|
@ -1076,7 +1076,7 @@ pub fn (s string) substr_with_check(start int, _end int) !string {
|
||||||
[direct_array_access]
|
[direct_array_access]
|
||||||
pub fn (s string) substr_ni(_start int, _end int) string {
|
pub fn (s string) substr_ni(_start int, _end int) string {
|
||||||
mut start := _start
|
mut start := _start
|
||||||
mut end := if _end == 2147483647 { s.len } else { _end } // max_int
|
mut end := if _end == max_int { s.len } else { _end } // max_int
|
||||||
|
|
||||||
// borders math
|
// borders math
|
||||||
if start < 0 {
|
if start < 0 {
|
||||||
|
@ -2188,7 +2188,7 @@ pub fn (s string) trim_indent() string {
|
||||||
.filter(!it.is_blank())
|
.filter(!it.is_blank())
|
||||||
.map(it.indent_width())
|
.map(it.indent_width())
|
||||||
|
|
||||||
mut min_common_indent := int(2147483647) // max int
|
mut min_common_indent := int(max_int) // max int
|
||||||
for line_indent in lines_indents {
|
for line_indent in lines_indents {
|
||||||
if line_indent < min_common_indent {
|
if line_indent < min_common_indent {
|
||||||
min_common_indent = line_indent
|
min_common_indent = line_indent
|
||||||
|
|
|
@ -9,6 +9,38 @@ const (
|
||||||
digit_pairs = '00102030405060708090011121314151617181910212223242526272829203132333435363738393041424344454647484940515253545556575859506162636465666768696071727374757677787970818283848586878889809192939495969798999'
|
digit_pairs = '00102030405060708090011121314151617181910212223242526272829203132333435363738393041424344454647484940515253545556575859506162636465666768696071727374757677787970818283848586878889809192939495969798999'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
pub const (
|
||||||
|
min_i8 = i8(-128)
|
||||||
|
max_i8 = i8(127)
|
||||||
|
|
||||||
|
min_i16 = i16(-32768)
|
||||||
|
max_i16 = i16(32767)
|
||||||
|
|
||||||
|
min_i32 = i32(-2147483648)
|
||||||
|
max_i32 = i32(2147483647)
|
||||||
|
|
||||||
|
min_int = min_i32
|
||||||
|
max_int = max_i32
|
||||||
|
|
||||||
|
// -9223372036854775808 is wrong, because C compilers parse literal values
|
||||||
|
// without sign first, and 9223372036854775808 overflows i64, hence the
|
||||||
|
// consecutive subtraction by 1
|
||||||
|
min_i64 = i64(-9223372036854775807 - 1)
|
||||||
|
max_i64 = i64(9223372036854775807)
|
||||||
|
|
||||||
|
min_u8 = u8(0)
|
||||||
|
max_u8 = u8(255)
|
||||||
|
|
||||||
|
min_u16 = u16(0)
|
||||||
|
max_u16 = u16(65535)
|
||||||
|
|
||||||
|
min_u32 = u32(0)
|
||||||
|
max_u32 = u32(4294967295)
|
||||||
|
|
||||||
|
min_u64 = u64(0)
|
||||||
|
max_u64 = u64(18446744073709551615)
|
||||||
|
)
|
||||||
|
|
||||||
// This implementation is the quickest with gcc -O2
|
// This implementation is the quickest with gcc -O2
|
||||||
// str_l returns the string representation of the integer nn with max chars.
|
// str_l returns the string representation of the integer nn with max chars.
|
||||||
[direct_array_access; inline]
|
[direct_array_access; inline]
|
||||||
|
@ -142,7 +174,7 @@ pub fn (nn i64) str() string {
|
||||||
mut d := i64(0)
|
mut d := i64(0)
|
||||||
if n == 0 {
|
if n == 0 {
|
||||||
return '0'
|
return '0'
|
||||||
} else if n == i64(-9223372036854775807 - 1) {
|
} else if n == min_i64 {
|
||||||
// math.min_i64
|
// math.min_i64
|
||||||
return '-9223372036854775808'
|
return '-9223372036854775808'
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,6 @@ module x11
|
||||||
|
|
||||||
import time
|
import time
|
||||||
import sync
|
import sync
|
||||||
import math
|
|
||||||
|
|
||||||
$if freebsd {
|
$if freebsd {
|
||||||
#flag -I/usr/local/include
|
#flag -I/usr/local/include
|
||||||
|
@ -433,7 +432,7 @@ fn (cb &Clipboard) pick_target(prop Property) Atom {
|
||||||
mut to_be_requested := Atom(0)
|
mut to_be_requested := Atom(0)
|
||||||
|
|
||||||
// This is higher than the maximum priority.
|
// This is higher than the maximum priority.
|
||||||
mut priority := int(math.max_i32)
|
mut priority := int(max_i32)
|
||||||
|
|
||||||
for i in 0 .. prop.nitems {
|
for i in 0 .. prop.nitems {
|
||||||
// See if this data type is allowed and of higher priority (closer to zero)
|
// See if this data type is allowed and of higher priority (closer to zero)
|
||||||
|
|
|
@ -97,8 +97,7 @@ fn subtract_align_last_byte_in_place(mut a []u32, b []u32) {
|
||||||
mut new_carry := u32(0)
|
mut new_carry := u32(0)
|
||||||
offset := a.len - b.len
|
offset := a.len - b.len
|
||||||
for index := a.len - b.len; index < a.len; index++ {
|
for index := a.len - b.len; index < a.len; index++ {
|
||||||
if a[index] < (b[index - offset] + carry)
|
if a[index] < (b[index - offset] + carry) || (b[index - offset] == max_u32 && carry > 0) {
|
||||||
|| (b[index - offset] == math.max_u32 && carry > 0) {
|
|
||||||
new_carry = 1
|
new_carry = 1
|
||||||
} else {
|
} else {
|
||||||
new_carry = 0
|
new_carry = 0
|
||||||
|
|
|
@ -22,6 +22,7 @@ const (
|
||||||
m4 = u64(0x0000ffff0000ffff)
|
m4 = u64(0x0000ffff0000ffff)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// TODO: this consts should be taken from int.v
|
||||||
const (
|
const (
|
||||||
// save importing math mod just for these
|
// save importing math mod just for these
|
||||||
max_u32 = u32(4294967295)
|
max_u32 = u32(4294967295)
|
||||||
|
|
|
@ -40,7 +40,8 @@ pub const (
|
||||||
smallest_non_zero_f64 = 4.940656458412465441765687928682213723651e-324 // 1 / 2**(1023 - 1 + 52)
|
smallest_non_zero_f64 = 4.940656458412465441765687928682213723651e-324 // 1 / 2**(1023 - 1 + 52)
|
||||||
)
|
)
|
||||||
|
|
||||||
// Integer limit values
|
[deprecated: 'use built-in constants instead (e.g. min_i8 instead of math.min_i8)']
|
||||||
|
[deprecated_after: '2023-12-31']
|
||||||
pub const (
|
pub const (
|
||||||
min_i8 = i8(-128)
|
min_i8 = i8(-128)
|
||||||
max_i8 = i8(127)
|
max_i8 = i8(127)
|
||||||
|
|
|
@ -84,7 +84,7 @@ pub fn approximate_with_eps(val f64, eps f64) Fraction {
|
||||||
if eps < 0.0 {
|
if eps < 0.0 {
|
||||||
panic('Epsilon value cannot be negative.')
|
panic('Epsilon value cannot be negative.')
|
||||||
}
|
}
|
||||||
if math.abs(val) > math.max_i64 {
|
if math.abs(val) > max_i64 {
|
||||||
panic('Value out of range.')
|
panic('Value out of range.')
|
||||||
}
|
}
|
||||||
// The integer part is separated first. Then we process the fractional
|
// The integer part is separated first. Then we process the fractional
|
||||||
|
|
|
@ -1766,33 +1766,33 @@ fn (mut c Checker) enum_decl(mut node ast.EnumDecl) {
|
||||||
senum_type := c.table.type_to_str(node.typ)
|
senum_type := c.table.type_to_str(node.typ)
|
||||||
match node.typ {
|
match node.typ {
|
||||||
ast.i8_type {
|
ast.i8_type {
|
||||||
signed, enum_imin, enum_imax = true, -128, 0x7F
|
signed, enum_imin, enum_imax = true, min_i8, max_i8
|
||||||
}
|
}
|
||||||
ast.i16_type {
|
ast.i16_type {
|
||||||
signed, enum_imin, enum_imax = true, -32_768, 0x7FFF
|
signed, enum_imin, enum_imax = true, min_i16, max_i16
|
||||||
}
|
}
|
||||||
ast.int_type {
|
ast.int_type {
|
||||||
signed, enum_imin, enum_imax = true, -2_147_483_648, 0x7FFF_FFFF
|
signed, enum_imin, enum_imax = true, min_i32, max_i32
|
||||||
}
|
}
|
||||||
ast.i64_type {
|
ast.i64_type {
|
||||||
signed, enum_imin, enum_imax = true, i64(-9223372036854775807 - 1), i64(0x7FFF_FFFF_FFFF_FFFF)
|
signed, enum_imin, enum_imax = true, min_i64, max_i64
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
ast.u8_type {
|
ast.u8_type {
|
||||||
signed, enum_umin, enum_umax = false, 0, 0xFF
|
signed, enum_umin, enum_umax = false, min_u8, max_u8
|
||||||
}
|
}
|
||||||
ast.u16_type {
|
ast.u16_type {
|
||||||
signed, enum_umin, enum_umax = false, 0, 0xFFFF
|
signed, enum_umin, enum_umax = false, min_u16, max_u16
|
||||||
}
|
}
|
||||||
ast.u32_type {
|
ast.u32_type {
|
||||||
signed, enum_umin, enum_umax = false, 0, 0xFFFF_FFFF
|
signed, enum_umin, enum_umax = false, min_u32, max_u32
|
||||||
}
|
}
|
||||||
ast.u64_type {
|
ast.u64_type {
|
||||||
signed, enum_umin, enum_umax = false, 0, 0xFFFF_FFFF_FFFF_FFFF
|
signed, enum_umin, enum_umax = false, min_u64, max_u64
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if senum_type == 'i32' {
|
if senum_type == 'i32' {
|
||||||
signed, enum_imin, enum_imax = true, -2_147_483_648, 0x7FFF_FFFF
|
signed, enum_imin, enum_imax = true, min_i32, max_i32
|
||||||
} else {
|
} else {
|
||||||
c.error('`${senum_type}` is not one of `i8`,`i16`,`i32`,`int`,`i64`,`u8`,`u16`,`u32`,`u64`',
|
c.error('`${senum_type}` is not one of `i8`,`i16`,`i32`,`int`,`i64`,`u8`,`u16`,`u32`,`u64`',
|
||||||
node.typ_pos)
|
node.typ_pos)
|
||||||
|
|
|
@ -590,7 +590,7 @@ fn (e Eval) type_to_size(typ ast.Type) u64 {
|
||||||
32
|
32
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
ast.i8_type_idx, ast.i16_type_idx, ast.int_type_idx, ast.i64_type_idx {
|
ast.i8_type_idx, ast.i16_type_idx, ast.int_type_idx, ast.i32_type_idx, ast.i64_type_idx {
|
||||||
return u64(math.exp2(f64(typ - 2))) // this formula converts the type number to the bitsize
|
return u64(math.exp2(f64(typ - 2))) // this formula converts the type number to the bitsize
|
||||||
}
|
}
|
||||||
ast.u8_type_idx, ast.u16_type_idx, ast.u32_type_idx, ast.u64_type_idx {
|
ast.u8_type_idx, ast.u16_type_idx, ast.u32_type_idx, ast.u64_type_idx {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue