Commit 0d6d0b70 authored by clemensh's avatar clemensh Committed by Commit bot

[wasm] Add tests for function name encoding

In order to have a wasm object (as JSObject), this adds a method to
instantiate the TestingModule. In order for this to work, the bytecode
and the function names of the TestingModule are stored for usage during
instantiation.

R=titzer@chromium.org

Review-Url: https://codereview.chromium.org/1916403002
Cr-Commit-Position: refs/heads/master@{#35906}
parent 9fd2650a
...@@ -217,7 +217,7 @@ struct WasmModule { ...@@ -217,7 +217,7 @@ struct WasmModule {
// Checks the given offset range is contained within the module bytes. // Checks the given offset range is contained within the module bytes.
bool BoundsCheck(uint32_t start, uint32_t end) const { bool BoundsCheck(uint32_t start, uint32_t end) const {
size_t size = module_end - module_start; size_t size = module_end - module_start;
return start < size && end < size; return start <= size && end <= size;
} }
// Creates a new instantiation of the module in the given isolate. // Creates a new instantiation of the module in the given isolate.
......
...@@ -192,6 +192,7 @@ ...@@ -192,6 +192,7 @@
'wasm/test-run-wasm-js.cc', 'wasm/test-run-wasm-js.cc',
'wasm/test-run-wasm-module.cc', 'wasm/test-run-wasm-module.cc',
'wasm/test-signatures.h', 'wasm/test-signatures.h',
'wasm/test-wasm-function-name-table.cc',
'wasm/test-wasm-stack.cc', 'wasm/test-wasm-stack.cc',
'wasm/wasm-run-utils.h', 'wasm/wasm-run-utils.h',
], ],
......
// 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.
#include "src/wasm/wasm-function-name-table.h"
#include "src/wasm/wasm-module.h"
#include "test/cctest/cctest.h"
using namespace v8::internal;
using namespace v8::internal::wasm;
namespace {
#define CHECK_STREQ(exp, found) \
do { \
Vector<const char> exp_ = (exp); \
Vector<const char> found_ = (found); \
if (V8_UNLIKELY(exp_.length() != found_.length() || \
memcmp(exp_.start(), found_.start(), exp_.length()))) { \
V8_Fatal(__FILE__, __LINE__, \
"Check failed: (%s) != (%s) ('%.*s' vs '%.*s').", #exp, #found, \
exp_.length(), exp_.start(), found_.length(), found_.start()); \
} \
} while (0)
void testFunctionNameTable(Vector<Vector<const char>> names) {
Isolate *isolate = CcTest::InitIsolateOnce();
HandleAndZoneScope scope;
WasmModule module;
std::vector<char> all_names;
uint32_t func_index = 0;
for (Vector<const char> name : names) {
size_t name_offset = all_names.size();
all_names.insert(all_names.end(), name.start(),
name.start() + name.length());
// Make every second function name null-terminated.
if (func_index % 2) all_names.push_back('\0');
module.functions.push_back(
{nullptr, 0, 0, static_cast<uint32_t>(name_offset),
static_cast<uint32_t>(name.length()), 0, 0, 0, 0, 0, 0, false, false});
++func_index;
}
module.module_start = reinterpret_cast<byte *>(all_names.data());
module.module_end = module.module_start + all_names.size();
Handle<Object> wasm_function_name_table =
BuildFunctionNamesTable(isolate, &module);
CHECK(wasm_function_name_table->IsByteArray());
func_index = 0;
for (Vector<const char> name : names) {
Handle<Object> string_obj = GetWasmFunctionNameFromTable(
Handle<ByteArray>::cast(wasm_function_name_table), func_index);
CHECK(!string_obj.is_null());
CHECK(string_obj->IsString());
Handle<String> string = Handle<String>::cast(string_obj);
CHECK(string->IsUtf8EqualTo(name));
++func_index;
}
}
void testFunctionNameTable(Vector<const char *> names) {
std::vector<Vector<const char>> names_vec;
for (const char *name : names) names_vec.push_back(CStrVector(name));
testFunctionNameTable(Vector<Vector<const char>>(
names_vec.data(), static_cast<int>(names_vec.size())));
}
} // namespace
TEST(NoFunctions) { testFunctionNameTable(Vector<Vector<const char>>()); }
TEST(OneFunctions) {
const char *names[] = {"foo"};
testFunctionNameTable(ArrayVector(names));
}
TEST(ThreeFunctions) {
const char *names[] = {"foo", "bar", "baz"};
testFunctionNameTable(ArrayVector(names));
}
TEST(OneUnnamedFunction) {
const char *names[] = {""};
testFunctionNameTable(ArrayVector(names));
}
TEST(UnnamedFirstFunction) {
const char *names[] = {"", "bar", "baz"};
testFunctionNameTable(ArrayVector(names));
}
TEST(UnnamedLastFunction) {
const char *names[] = {"bar", "baz", ""};
testFunctionNameTable(ArrayVector(names));
}
TEST(ThreeUnnamedFunctions) {
const char *names[] = {"", "", ""};
testFunctionNameTable(ArrayVector(names));
}
TEST(UTF8Names) {
const char *names[] = {"↱fun↰", "↺", "alpha:α beta:β"};
testFunctionNameTable(ArrayVector(names));
}
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include "src/wasm/ast-decoder.h" #include "src/wasm/ast-decoder.h"
#include "src/wasm/wasm-js.h" #include "src/wasm/wasm-js.h"
#include "src/wasm/wasm-macro-gen.h"
#include "src/wasm/wasm-module.h" #include "src/wasm/wasm-module.h"
#include "src/wasm/wasm-opcodes.h" #include "src/wasm/wasm-opcodes.h"
......
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