| Index: src/wasm/decoder.h
|
| diff --git a/src/wasm/decoder.h b/src/wasm/decoder.h
|
| index af7d27d1340b67c9a59eef962b2d5aaf932f60c8..88af8f7297e9a6d9165138ff4fa394b30b4c0fb9 100644
|
| --- a/src/wasm/decoder.h
|
| +++ b/src/wasm/decoder.h
|
| @@ -80,14 +80,13 @@
|
| // Reads a variable-length unsigned integer (little endian).
|
| uint32_t checked_read_u32v(const byte* base, int offset, int* length,
|
| const char* msg = "expected LEB32") {
|
| - return checked_read_leb<uint32_t, false>(base, offset, length, msg);
|
| + return checked_read_leb<uint32_t>(base, offset, length, msg);
|
| }
|
|
|
| // Reads a variable-length signed integer (little endian).
|
| int32_t checked_read_i32v(const byte* base, int offset, int* length,
|
| const char* msg = "expected SLEB32") {
|
| - uint32_t result =
|
| - checked_read_leb<uint32_t, true>(base, offset, length, msg);
|
| + uint32_t result = checked_read_u32v(base, offset, length, msg);
|
| if (*length == 5) return bit_cast<int32_t>(result);
|
| if (*length > 0) {
|
| int shift = 32 - 7 * *length;
|
| @@ -100,14 +99,13 @@
|
| // Reads a variable-length unsigned integer (little endian).
|
| uint64_t checked_read_u64v(const byte* base, int offset, int* length,
|
| const char* msg = "expected LEB64") {
|
| - return checked_read_leb<uint64_t, false>(base, offset, length, msg);
|
| + return checked_read_leb<uint64_t>(base, offset, length, msg);
|
| }
|
|
|
| // Reads a variable-length signed integer (little endian).
|
| int64_t checked_read_i64v(const byte* base, int offset, int* length,
|
| const char* msg = "expected SLEB64") {
|
| - uint64_t result =
|
| - checked_read_leb<uint64_t, true>(base, offset, length, msg);
|
| + uint64_t result = checked_read_u64v(base, offset, length, msg);
|
| if (*length == 10) return bit_cast<int64_t>(result);
|
| if (*length > 0) {
|
| int shift = 64 - 7 * *length;
|
| @@ -341,7 +339,7 @@
|
| base::SmartArrayPointer<char> error_msg_;
|
|
|
| private:
|
| - template <typename IntType, bool is_signed>
|
| + template <typename IntType>
|
| IntType checked_read_leb(const byte* base, int offset, int* length,
|
| const char* msg) {
|
| if (!check(base, offset, 1, msg)) {
|
| @@ -367,21 +365,9 @@
|
| if (ptr == end) {
|
| // Check there are no bits set beyond the bitwidth of {IntType}.
|
| const int kExtraBits = (1 + kMaxLength * 7) - (sizeof(IntType) * 8);
|
| - const byte kExtraBitsMask = static_cast<byte>(0xFF << (8 - kExtraBits));
|
| - int extra_bits_value;
|
| - if (is_signed) {
|
| - // A signed-LEB128 must sign-extend the final byte, excluding its
|
| - // most-signifcant bit. e.g. for a 32-bit LEB128:
|
| - // kExtraBits = 4
|
| - // kExtraBitsMask = 0xf0
|
| - // If b is 0x0f, the value is negative, so extra_bits_value is 0x70.
|
| - // If b is 0x03, the value is positive, so extra_bits_value is 0x00.
|
| - extra_bits_value = (static_cast<int8_t>(b << kExtraBits) >> 8) &
|
| - kExtraBitsMask & ~0x80;
|
| - } else {
|
| - extra_bits_value = 0;
|
| - }
|
| - if (*length == kMaxLength && (b & kExtraBitsMask) != extra_bits_value) {
|
| + const byte kExtraBitsMask =
|
| + static_cast<byte>((0xFF << (8 - kExtraBits)) & 0xFF);
|
| + if (*length == kMaxLength && (b & kExtraBitsMask) != 0) {
|
| error(base, ptr, "extra bits in varint");
|
| return 0;
|
| }
|
|
|