Commit cc787e17 authored by Michael Starzinger's avatar Michael Starzinger Committed by Commit Bot

[asm.js] Fix handling of bogus code after export statement.

This makes the asm.js validator reject source with trailing expressions
after the module exporting return statement. Most of the time trailing
statements would not affect semantics, since they are unreachable. In
some cases we might hide an expected ReferenceError tough.

R=leszeks@chromium.org
TEST=mjsunit/regress/regress-crbug-934138
BUG=chromium:934138

Change-Id: I790366204f5e9c943715a065b5229f2442e2c86e
Reviewed-on: https://chromium-review.googlesource.com/c/1481216
Commit-Queue: Michael Starzinger <mstarzinger@chromium.org>
Reviewed-by: 's avatarLeszek Swirski <leszeks@chromium.org>
Cr-Commit-Position: refs/heads/master@{#59766}
parent 28551958
......@@ -353,6 +353,8 @@ void AsmJsParser::ValidateModule() {
RECURSE(ValidateFunctionTable());
}
RECURSE(ValidateExport());
RECURSE(SkipSemicolon());
EXPECT_TOKEN('}');
// Check that all functions were eventually defined.
for (auto& info : global_var_info_) {
......
......@@ -2,4 +2,4 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
*%(basename)s:12: Invalid asm.js: Undefined function
*%(basename)s:13: Invalid asm.js: Undefined function
......@@ -2,4 +2,4 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
*%(basename)s:13: Invalid asm.js: Undefined function table
*%(basename)s:14: Invalid asm.js: Undefined function table
......@@ -377,6 +377,7 @@
'regress/regress-6700': [SKIP],
'regress/regress-6838-2': [SKIP],
'regress/regress-6838-3': [SKIP],
'regress/regress-crbug-934138': [SKIP],
# Timeouts in lite / jitless mode.
'asm/embenchen/*': [SKIP],
......
// Copyright 2019 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: --allow-natives-syntax
(function TestTrailingJunkAfterExport() {
function Module() {
"use asm";
function f() {}
return {f: f}
%kaboom;
}
assertThrows(() => Module(), ReferenceError);
assertFalse(%IsAsmWasmCode(Module));
})();
(function TestExportWithSemicolon() {
function Module() {
"use asm";
function f() {}
return {f: f};
// appreciate the semicolon
}
assertDoesNotThrow(() => Module());
assertTrue(%IsAsmWasmCode(Module));
})();
(function TestExportWithoutSemicolon() {
function Module() {
"use asm";
function f() {}
return {f: f}
// appreciate the nothingness
}
assertDoesNotThrow(() => Module());
assertTrue(%IsAsmWasmCode(Module));
})();
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment