Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "src/wasm/wasm-function-name-table.h" | |
| 6 #include "src/wasm/wasm-module.h" | |
| 7 #include "src/wasm/wasm-opcodes.h" | |
| 8 | |
| 9 #include "test/cctest/cctest.h" | |
| 10 #include "test/cctest/compiler/value-helper.h" | |
| 11 #include "test/cctest/wasm/test-signatures.h" | |
| 12 #include "test/cctest/wasm/wasm-run-utils.h" | |
| 13 | |
| 14 using namespace v8::base; | |
| 15 using namespace v8::internal; | |
| 16 using namespace v8::internal::compiler; | |
| 17 using namespace v8::internal::wasm; | |
| 18 | |
| 19 namespace { | |
| 20 | |
| 21 #define CHECK_STREQ(exp, found) \ | |
| 22 do { \ | |
| 23 Vector<const char> exp_ = (exp); \ | |
| 24 Vector<const char> found_ = (found); \ | |
| 25 if (V8_UNLIKELY(exp_.length() != found_.length() || \ | |
| 26 memcmp(exp_.start(), found_.start(), exp_.length()))) { \ | |
| 27 V8_Fatal(__FILE__, __LINE__, \ | |
| 28 "Check failed: (%s) != (%s) ('%.*s' vs '%.*s').", #exp, #found, \ | |
| 29 exp_.length(), exp_.start(), found_.length(), found_.start()); \ | |
| 30 } \ | |
| 31 } while (0) | |
| 32 | |
| 33 void testFunctionNameTable(Vector<Vector<const char>> names) { | |
| 34 TestSignatures sigs; | |
| 35 TestingModule module; | |
| 36 | |
| 37 HandleAndZoneScope scope; | |
| 38 uint32_t func_index = 0; | |
| 39 for (Vector<const char> name : names) { | |
| 40 Vector<const char> real_name = | |
| 41 name.length() == 1 && name.first() == '?' ? Vector<const char>() : name; | |
| 42 WasmFunctionCompiler comp1(sigs.v_v(), &module, real_name); | |
| 43 BUILD(comp1, WASM_UNREACHABLE); | |
| 44 uint32_t wasm_index = comp1.CompileAndAdd(); | |
| 45 CHECK_EQ(func_index, wasm_index); | |
| 46 ++func_index; | |
| 47 } | |
| 48 | |
| 49 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
| |
| 50 CHECK(!wasm_obj.is_null()); | |
| 51 | |
| 52 func_index = 0; | |
| 53 for (Vector<const char> name : names) { | |
| 54 Handle<Object> string_obj = wasm::GetWasmFunctionName(wasm_obj, func_index); | |
| 55 CHECK(!string_obj.is_null()); | |
| 56 CHECK(string_obj->IsString()); | |
| 57 Handle<String> string = Handle<String>::cast(string_obj); | |
| 58 CHECK(string->IsUtf8EqualTo(name)); | |
| 59 ++func_index; | |
| 60 } | |
| 61 } | |
| 62 | |
| 63 #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.
| |
| 64 do { \ | |
| 65 std::vector<Vector<const char>> names_vec; \ | |
| 66 const char *names_cstr[] = {__VA_ARGS__}; \ | |
| 67 for (const char **namep = names_cstr, \ | |
| 68 **endp = namep + arraysize(names_cstr); \ | |
| 69 namep != endp; ++namep) \ | |
| 70 names_vec.push_back(CStrVector(*namep)); \ | |
| 71 testFunctionNameTable(Vector<Vector<const char>>( \ | |
| 72 names_vec.data(), static_cast<int>(names_vec.size()))); \ | |
| 73 } while (0) | |
| 74 | |
| 75 } // namespace | |
| 76 | |
| 77 TEST(NoFunctions) { testFunctionNameTable(Vector<Vector<const char>>()); } | |
| 78 TEST(OneFunctions) { TEST_CSTR_FUNNAMES("foo"); } | |
| 79 TEST(ThreeFunctions) { TEST_CSTR_FUNNAMES("foo", "bar", "baz"); } | |
| 80 TEST(OneUnnamedFunction) { TEST_CSTR_FUNNAMES(""); } | |
| 81 TEST(UnnamedFirstFunction) { TEST_CSTR_FUNNAMES("", "bar", "baz"); } | |
| 82 TEST(UnnamedLastFunction) { TEST_CSTR_FUNNAMES("bar", "baz", ""); } | |
| 83 TEST(ThreeUnnamedFunctions) { TEST_CSTR_FUNNAMES("", "", ""); } | |
| 84 TEST(UTF8Names) { TEST_CSTR_FUNNAMES("↱fun↰", "↺", "alpha:α beta:β"); } | |
| 85 | |
| 86 TEST(NonNullTerminatedNames) { | |
| 87 const char *alphabet = "abcdefghijklmnopqrstuvwxyz"; | |
| 88 Vector<const char> names[] = { | |
| 89 Vector<const char>(alphabet + 3, 6), // Four non-null-terminated names. | |
| 90 Vector<const char>(alphabet + 4, 2), // - | |
| 91 Vector<const char>(alphabet + 3, 0), // - | |
| 92 Vector<const char>(alphabet + 15, 5)}; | |
| 93 testFunctionNameTable(ArrayVector(names)); | |
| 94 } | |
| OLD | NEW |