Fix runtime error: left shift (#4912)
This patch fixes #4703 This patch fixes #4702 JerryScript-DCO-1.0-Signed-off-by: Daniel Batiz daniel.batiz@h-lab.eu
This commit is contained in:
@@ -414,13 +414,15 @@ ecma_integer_multiply (ecma_integer_value_t left_integer, /**< left operand */
|
|||||||
if (JERRY_UNLIKELY ((left_integer & (left_integer - 1)) == 0))
|
if (JERRY_UNLIKELY ((left_integer & (left_integer - 1)) == 0))
|
||||||
{
|
{
|
||||||
/* Right shift right_integer with log2 (left_integer) */
|
/* Right shift right_integer with log2 (left_integer) */
|
||||||
return ecma_make_integer_value (right_integer << (__builtin_ctz ((unsigned int) left_integer)));
|
return ecma_make_integer_value (
|
||||||
|
(int32_t) ((uint32_t) right_integer << (__builtin_ctz ((unsigned int) left_integer))));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (JERRY_UNLIKELY ((right_integer & (right_integer - 1)) == 0))
|
if (JERRY_UNLIKELY ((right_integer & (right_integer - 1)) == 0))
|
||||||
{
|
{
|
||||||
/* Right shift left_integer with log2 (right_integer) */
|
/* Right shift left_integer with log2 (right_integer) */
|
||||||
return ecma_make_integer_value (left_integer << (__builtin_ctz ((unsigned int) right_integer)));
|
return ecma_make_integer_value (
|
||||||
|
(int32_t) ((uint32_t) left_integer << (__builtin_ctz ((unsigned int) right_integer))));
|
||||||
}
|
}
|
||||||
#endif /* defined (__GNUC__) || defined (__clang__) */
|
#endif /* defined (__GNUC__) || defined (__clang__) */
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -3765,7 +3765,8 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
|
|||||||
{
|
{
|
||||||
ecma_integer_value_t left_integer = ecma_get_integer_from_value (left_value);
|
ecma_integer_value_t left_integer = ecma_get_integer_from_value (left_value);
|
||||||
ecma_integer_value_t right_integer = ecma_get_integer_from_value (right_value);
|
ecma_integer_value_t right_integer = ecma_get_integer_from_value (right_value);
|
||||||
*stack_top_p++ = ecma_make_int32_value ((int32_t) (left_integer << (right_integer & 0x1f)));
|
|
||||||
|
*stack_top_p++ = ecma_make_int32_value ((int32_t) ((uint32_t) left_integer << (right_integer & 0x1f)));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,18 @@
|
|||||||
|
|
||||||
assert((9 << 2) === 36);
|
assert((9 << 2) === 36);
|
||||||
assert((14 << 2) === 56);
|
assert((14 << 2) === 56);
|
||||||
|
assert((0 << 0) === 0);
|
||||||
|
assert((0 << 1) === 0);
|
||||||
|
assert((0 << -1) === 0);
|
||||||
|
assert((1 << 0) === 1);
|
||||||
|
assert((1 << 1) === 2);
|
||||||
|
assert((-1 << 0) === -1);
|
||||||
|
assert((-1 << 1) === -2);
|
||||||
|
assert((1024 << 21) === -2147483648);
|
||||||
|
assert((10 << -1) === 0);
|
||||||
|
assert((33554431 << 22) === -4194304);
|
||||||
|
assert((-1024 << 31) === 0);
|
||||||
|
assert((1024 << 53) === -2147483648);
|
||||||
|
|
||||||
assert((9 >> 2) === 2);
|
assert((9 >> 2) === 2);
|
||||||
assert((-14 >> 2) === -4);
|
assert((-14 >> 2) === -4);
|
||||||
|
|||||||
Reference in New Issue
Block a user