runtime: Avoid UB in shift operations
This commit is contained in:
@@ -218,10 +218,13 @@ KInt Kotlin_Int_or_Int (KInt a, KInt b) { return a | b; }
|
|||||||
KInt Kotlin_Int_xor_Int (KInt a, KInt b) { return a ^ b; }
|
KInt Kotlin_Int_xor_Int (KInt a, KInt b) { return a ^ b; }
|
||||||
KInt Kotlin_Int_and_Int (KInt a, KInt b) { return a & b; }
|
KInt Kotlin_Int_and_Int (KInt a, KInt b) { return a & b; }
|
||||||
KInt Kotlin_Int_inv (KInt a ) { return ~a; }
|
KInt Kotlin_Int_inv (KInt a ) { return ~a; }
|
||||||
KInt Kotlin_Int_shl_Int (KInt a, KInt b) { return a << b; }
|
|
||||||
KInt Kotlin_Int_shr_Int (KInt a, KInt b) { return a >> b; }
|
// According to C++11 the result is undefined if the second operator is < 0 or >= <first operand bit length>.
|
||||||
|
// We avoid it by using only the least significant bits
|
||||||
|
KInt Kotlin_Int_shl_Int (KInt a, KInt b) { return a << (b & 31); }
|
||||||
|
KInt Kotlin_Int_shr_Int (KInt a, KInt b) { return a >> (b & 31); }
|
||||||
KInt Kotlin_Int_ushr_Int (KInt a, KInt b) {
|
KInt Kotlin_Int_ushr_Int (KInt a, KInt b) {
|
||||||
return static_cast<uint32_t>(a) >> b;
|
return static_cast<uint32_t>(a) >> (b & 31);
|
||||||
}
|
}
|
||||||
|
|
||||||
KByte Kotlin_Int_toByte (KInt a ) { return a; }
|
KByte Kotlin_Int_toByte (KInt a ) { return a; }
|
||||||
@@ -285,10 +288,13 @@ KLong Kotlin_Long_xor_Long (KLong a, KLong b) { return a ^ b; }
|
|||||||
KLong Kotlin_Long_or_Long (KLong a, KLong b) { return a | b; }
|
KLong Kotlin_Long_or_Long (KLong a, KLong b) { return a | b; }
|
||||||
KLong Kotlin_Long_and_Long (KLong a, KLong b) { return a & b; }
|
KLong Kotlin_Long_and_Long (KLong a, KLong b) { return a & b; }
|
||||||
KLong Kotlin_Long_inv (KLong a ) { return ~a; }
|
KLong Kotlin_Long_inv (KLong a ) { return ~a; }
|
||||||
KLong Kotlin_Long_shl_Int (KLong a, KInt b) { return a << b; }
|
|
||||||
KLong Kotlin_Long_shr_Int (KLong a, KInt b) { return a >> b; }
|
// According to C++11 the result is undefined if the second operator is < 0 or >= <first operand bit length>.
|
||||||
|
// We avoid it by using only the least significant bits
|
||||||
|
KLong Kotlin_Long_shl_Int (KLong a, KInt b) { return a << (b & 63); }
|
||||||
|
KLong Kotlin_Long_shr_Int (KLong a, KInt b) { return a >> (b & 63); }
|
||||||
KLong Kotlin_Long_ushr_Int (KLong a, KInt b) {
|
KLong Kotlin_Long_ushr_Int (KLong a, KInt b) {
|
||||||
return static_cast<uint64_t>(a) >> b;
|
return static_cast<uint64_t>(a) >> (b & 63);
|
||||||
}
|
}
|
||||||
|
|
||||||
KByte Kotlin_Long_toByte (KLong a ) { return a; }
|
KByte Kotlin_Long_toByte (KLong a ) { return a; }
|
||||||
|
|||||||
Reference in New Issue
Block a user