Chromium Code Reviews| Index: test/cctest/wasm/test-wasm-function-name-table.cc |
| diff --git a/test/cctest/wasm/test-wasm-function-name-table.cc b/test/cctest/wasm/test-wasm-function-name-table.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..8ce1b07ff20f50b6863b8f39d58d0a5b7ae2946e |
| --- /dev/null |
| +++ b/test/cctest/wasm/test-wasm-function-name-table.cc |
| @@ -0,0 +1,94 @@ |
| +// 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 "src/wasm/wasm-opcodes.h" |
| + |
| +#include "test/cctest/cctest.h" |
| +#include "test/cctest/compiler/value-helper.h" |
| +#include "test/cctest/wasm/test-signatures.h" |
| +#include "test/cctest/wasm/wasm-run-utils.h" |
| + |
| +using namespace v8::base; |
| +using namespace v8::internal; |
| +using namespace v8::internal::compiler; |
| +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) { |
| + TestSignatures sigs; |
| + TestingModule module; |
| + |
| + HandleAndZoneScope scope; |
| + uint32_t func_index = 0; |
| + for (Vector<const char> name : names) { |
| + Vector<const char> real_name = |
| + name.length() == 1 && name.first() == '?' ? Vector<const char>() : name; |
| + WasmFunctionCompiler comp1(sigs.v_v(), &module, real_name); |
| + BUILD(comp1, WASM_UNREACHABLE); |
| + uint32_t wasm_index = comp1.CompileAndAdd(); |
| + CHECK_EQ(func_index, wasm_index); |
| + ++func_index; |
| + } |
| + |
| + Handle<JSObject> wasm_obj = module.Instantiate(); |
|
titzer
2016/04/28 11:38:22
Ok, I see now.
The implication of using Instantia
Clemens Hammacher
2016/04/28 14:34:56
Yep, you are right. It was very easy to refactor t
|
| + CHECK(!wasm_obj.is_null()); |
| + |
| + func_index = 0; |
| + for (Vector<const char> name : names) { |
| + Handle<Object> string_obj = wasm::GetWasmFunctionName(wasm_obj, 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; |
| + } |
| +} |
| + |
| +#define TEST_CSTR_FUNNAMES(...) \ |
|
titzer
2016/04/28 11:38:22
You could probably do this with a helper function,
Clemens Hammacher
2016/04/28 14:34:56
Done.
|
| + do { \ |
| + std::vector<Vector<const char>> names_vec; \ |
| + const char *names_cstr[] = {__VA_ARGS__}; \ |
| + for (const char **namep = names_cstr, \ |
| + **endp = namep + arraysize(names_cstr); \ |
| + namep != endp; ++namep) \ |
| + names_vec.push_back(CStrVector(*namep)); \ |
| + testFunctionNameTable(Vector<Vector<const char>>( \ |
| + names_vec.data(), static_cast<int>(names_vec.size()))); \ |
| + } while (0) |
| + |
| +} // namespace |
| + |
| +TEST(NoFunctions) { testFunctionNameTable(Vector<Vector<const char>>()); } |
| +TEST(OneFunctions) { TEST_CSTR_FUNNAMES("foo"); } |
| +TEST(ThreeFunctions) { TEST_CSTR_FUNNAMES("foo", "bar", "baz"); } |
| +TEST(OneUnnamedFunction) { TEST_CSTR_FUNNAMES(""); } |
| +TEST(UnnamedFirstFunction) { TEST_CSTR_FUNNAMES("", "bar", "baz"); } |
| +TEST(UnnamedLastFunction) { TEST_CSTR_FUNNAMES("bar", "baz", ""); } |
| +TEST(ThreeUnnamedFunctions) { TEST_CSTR_FUNNAMES("", "", ""); } |
| +TEST(UTF8Names) { TEST_CSTR_FUNNAMES("↱fun↰", "↺", "alpha:α beta:β"); } |
| + |
| +TEST(NonNullTerminatedNames) { |
| + const char *alphabet = "abcdefghijklmnopqrstuvwxyz"; |
| + Vector<const char> names[] = { |
| + Vector<const char>(alphabet + 3, 6), // Four non-null-terminated names. |
| + Vector<const char>(alphabet + 4, 2), // - |
| + Vector<const char>(alphabet + 3, 0), // - |
| + Vector<const char>(alphabet + 15, 5)}; |
| + testFunctionNameTable(ArrayVector(names)); |
| +} |