v8/test/mjsunit/wasm/unicode-validation.js
Sven Sauleau 5bdb13297f [wasm] merge js constants file in module-builder
We noticed that almost every call site were loading both files,
the split isn't necessary anymore.

In some message tests, removed the absolute line number to allow future
changes.

Bug: v8:8726
Change-Id: I8527f0a1ecfa685aa01a5e2f5f47ddf1cb13a545
Reviewed-on: https://chromium-review.googlesource.com/c/1446452
Commit-Queue: Sven Sauleau <ssauleau@igalia.com>
Reviewed-by: Ben Titzer <titzer@chromium.org>
Reviewed-by: Andreas Haas <ahaas@chromium.org>
Cr-Commit-Position: refs/heads/master@{#59220}
2019-01-30 22:10:34 +00:00

121 lines
3.7 KiB
JavaScript

// Copyright 2016 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: --expose-wasm
load("test/mjsunit/wasm/wasm-module-builder.js");
function toByteArray(s) {
var arr = [];
for (var i = 0; i < s.length; ++i) {
arr.push(s.charCodeAt(i) & 0xff);
}
return arr;
}
function toString(arr) {
if (typeof arr === "string") return arr;
var s = "";
for (var b of arr) s += String.fromCharCode(b);
return s;
}
function toUTF8(arr) {
if (typeof arr === "string" || arr === undefined) return arr;
return decodeURIComponent(escape(toString(arr)));
}
function isValidUtf8(arr) {
if (typeof arr === "string" || arr === undefined) return true;
try {
var s = toUTF8(arr);
for (var i = 0; i < s.length; ++i)
if ((s.charCodeAt(i) & 0xfffe) == 0xfffe)
return false;
return true;
} catch (e) {
if (e instanceof URIError) return false;
throw e;
}
}
function checkImportsAndExports(imported_module_name, imported_function_name,
internal_function_name, exported_function_name, shouldThrow) {
var builder = new WasmModuleBuilder();
builder.addImport(imported_module_name, imported_function_name,
kSig_v_v);
builder.addFunction(internal_function_name, kSig_v_v)
.addBody([kExprCallFunction, 0])
.exportAs(exported_function_name);
// sanity check: does javascript agree with out shouldThrow annotation?
assertEquals(shouldThrow,
!isValidUtf8(imported_module_name) ||
!isValidUtf8(imported_function_name) ||
!isValidUtf8(exported_function_name),
"JavaScript does not agree with our shouldThrow expectation");
if (!shouldThrow) {
imported_module_name = toUTF8(imported_module_name);
imported_function_name = toUTF8(imported_function_name);
}
var ffi = new Object();
if (imported_function_name === undefined) {
ffi[imported_module_name] = function() { };
} else {
ffi[imported_module_name] = new Object();
ffi[imported_module_name][imported_function_name] = function() { };
}
var hasThrown = true;
try {
builder.instantiate(ffi);
hasThrown = false;
} catch (err) {
if (!shouldThrow) print(err);
assertTrue(shouldThrow, "Should not throw error on valid names");
assertTrue(err instanceof Error, "exception should be an Error");
assertContains("UTF-8", err.toString());
}
assertEquals(shouldThrow, hasThrown,
"Should throw validation error on invalid names");
}
function checkImportedModuleName(name, shouldThrow) {
checkImportsAndExports(name, "imp", "func", undefined, shouldThrow);
}
function checkImportedFunctionName(name, shouldThrow) {
checkImportsAndExports("module", name, "func", "func", shouldThrow);
}
function checkExportedFunctionName(name, shouldThrow) {
checkImportsAndExports("module", "func", "func", name, shouldThrow);
}
function checkInternalFunctionName(name) {
checkImportsAndExports("module", "func", name, "func", false);
}
function checkAll(name, shouldThrow) {
checkImportedModuleName(name, shouldThrow);
checkImportedFunctionName(name, shouldThrow);
checkExportedFunctionName(name, shouldThrow);
checkInternalFunctionName(name);
}
checkAll("ascii", false);
checkAll("some math: (½)² = ¼", false);
checkAll("中国历史系列条目\n北", false);
checkAll(toByteArray("\xef\xb7\x8f"), false);
checkAll(toByteArray("a\xc2\x81\xe1\x80\xbf\xf1\x80\xa0\xbf"), false);
checkAll(toByteArray("\xff"), true);
checkAll(toByteArray("\xed\xa0\x8f"), true); // surrogate code points
checkAll(toByteArray("\xe0\x82\x80"), true); // overlong sequence
checkAll(toByteArray("\xf4\x90\x80\x80"), true); // beyond limit: U+110000
checkAll(toByteArray("with\x00null"), false);