v8/test/mjsunit/asm/immutable.js
Michael Starzinger b4948f1b81 [asm.js] Test and fix function (table) immutability.
This makes sure that function variables as well as function table
variables are properly typed as immutable, hence assignments to them
should cause validation failures.

R=clemensh@chromium.org
TEST=mjsunit/asm/immutable
BUG=chromium:721271

Change-Id: Ia3f65fd0782ca571ffcf99520fdbd8fc5a359d16
Reviewed-on: https://chromium-review.googlesource.com/503209
Reviewed-by: Clemens Hammacher <clemensh@chromium.org>
Commit-Queue: Michael Starzinger <mstarzinger@chromium.org>
Cr-Commit-Position: refs/heads/master@{#45256}
2017-05-11 12:25:26 +00:00

49 lines
1.1 KiB
JavaScript

// Copyright 2017 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 FailImmutableFunction() {
function Module(stdlib, imports, heap) {
"use asm";
function f(a) {
a = a | 0;
if (a) {
a = f((a - 1) | 0) | 0;
f = 0;
return (a + 1) | 0;
}
return 23;
}
return { f:f };
}
var m = Module(this);
assertFalse(%IsAsmWasmCode(Module));
assertEquals(23, m.f(0));
assertEquals(24, m.f(1));
assertThrows(() => m.f(2));
})();
(function FailImmutableFunctionTable() {
function Module(stdlib, imports, heap) {
"use asm";
function f(a) {
a = a | 0;
if (a) {
a = funTable[a & 0]((a - 1) | 0) | 0;
funTable = 0;
return (a + 1) | 0;
}
return 23;
}
var funTable = [ f ];
return { f:f };
}
var m = Module(this);
assertFalse(%IsAsmWasmCode(Module));
assertEquals(23, m.f(0));
assertEquals(24, m.f(1));
assertThrows(() => m.f(2));
})();