[asmjs] Fix parsing hex numeric literals ending with 'e'.
When parsing a numeric literal in a line like "a=0x0e+b|0;", currently the scanner consumes the "e+" part (as it thinks it's the start of an exponent). In the ECMAScript lexical grammar HexIntegerLiteral cannot contain exponents, which means the '+' character should be parsed as a binary operator. R=bradnelson@chromium.org BUG=v8:7893 Change-Id: I97a0d4ea2ee1d38a3462efbfaef5eb87b8ea704b Reviewed-on: https://chromium-review.googlesource.com/1116551 Reviewed-by: Michael Starzinger <mstarzinger@chromium.org> Commit-Queue: Michael Starzinger <mstarzinger@chromium.org> Cr-Commit-Position: refs/heads/master@{#54132}
This commit is contained in:
parent
9502913612
commit
d683fd7dd6
1
AUTHORS
1
AUTHORS
@ -73,6 +73,7 @@ Felix Geisendörfer <haimuiba@gmail.com>
|
||||
Filipe David Manana <fdmanana@gmail.com>
|
||||
Franziska Hinkelmann <franziska.hinkelmann@gmail.com>
|
||||
Geoffrey Garside <ggarside@gmail.com>
|
||||
Gergely Nagy <ngg@ngg.hu>
|
||||
Gus Caplan <me@gus.host>
|
||||
Gwang Yoon Hwang <ryumiel@company100.net>
|
||||
Henrique Ferreiro <henrique.ferreiro@gmail.com>
|
||||
|
@ -274,17 +274,22 @@ void AsmJsScanner::ConsumeNumber(uc32 ch) {
|
||||
std::string number;
|
||||
number = ch;
|
||||
bool has_dot = ch == '.';
|
||||
bool has_prefix = false;
|
||||
for (;;) {
|
||||
ch = stream_->Advance();
|
||||
if ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') ||
|
||||
(ch >= 'A' && ch <= 'F') || ch == '.' || ch == 'b' || ch == 'o' ||
|
||||
ch == 'x' ||
|
||||
((ch == '-' || ch == '+') && (number[number.size() - 1] == 'e' ||
|
||||
number[number.size() - 1] == 'E'))) {
|
||||
((ch == '-' || ch == '+') && !has_prefix &&
|
||||
(number[number.size() - 1] == 'e' ||
|
||||
number[number.size() - 1] == 'E'))) {
|
||||
// TODO(bradnelson): Test weird cases ending in -.
|
||||
if (ch == '.') {
|
||||
has_dot = true;
|
||||
}
|
||||
if (ch == 'b' || ch == 'o' || ch == 'x') {
|
||||
has_prefix = true;
|
||||
}
|
||||
number.push_back(ch);
|
||||
} else {
|
||||
break;
|
||||
|
18
test/mjsunit/regress/regress-7893.js
Normal file
18
test/mjsunit/regress/regress-7893.js
Normal file
@ -0,0 +1,18 @@
|
||||
// Copyright 2018 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --validate-asm --allow-natives-syntax
|
||||
|
||||
function Module(stdlib, imports, buffer) {
|
||||
"use asm";
|
||||
function f() {
|
||||
var bar = 0;
|
||||
return 0x1e+bar|0;
|
||||
}
|
||||
return f;
|
||||
}
|
||||
var f = Module(this);
|
||||
assertTrue(%IsWasmCode(f));
|
||||
assertTrue(%IsAsmWasmCode(Module));
|
||||
assertEquals(0x1e, f());
|
Loading…
Reference in New Issue
Block a user