v8/test/cctest/wasm/test-wasm-codegen.cc
Clemens Hammacher 255048c5e2 [api][wasm] Change ModuleCompiledCallback definition
This callback is not being used by now, so we can just change it
without the deprecation dance.
Instead of the WasmModuleObject, it now receives the new
CompiledWasmModule wrapper which contains a shared pointer to the
NativeModule. This is all that's needed for serialization.

Some classes are pulled out of WasmModuleObject to allow reuse.

R=adamk@chromium.org, mstarzinger@chromium.org
CC=​bbudge@chromium.org

Bug: chromium:912031
Cq-Include-Trybots: luci.chromium.try:linux_chromium_rel_ng
Change-Id: Icedb64efa92e66bec45cf8742942a07ae22f59c8
Reviewed-on: https://chromium-review.googlesource.com/c/1363140
Reviewed-by: Adam Klein <adamk@chromium.org>
Reviewed-by: Bill Budge <bbudge@chromium.org>
Reviewed-by: Michael Starzinger <mstarzinger@chromium.org>
Commit-Queue: Clemens Hammacher <clemensh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#58142}
2018-12-11 07:38:30 +00:00

100 lines
3.4 KiB
C++

// 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.
// Tests effects of (CSP) "unsafe-eval" and "wasm-eval" callback functions.
//
// Note: These tests are in a separate test file because the tests dynamically
// change the isolate in terms of callbacks allow_code_gen_callback and
// allow_wasm_code_gen_callback.
#include "src/wasm/wasm-module-builder.h"
#include "src/wasm/wasm-objects-inl.h"
#include "src/wasm/wasm-objects.h"
#include "test/cctest/cctest.h"
#include "test/common/wasm/wasm-module-runner.h"
namespace v8 {
namespace internal {
namespace wasm {
namespace {
// Possible values for callback pointers.
enum TestValue {
kTestUsingNull, // no callback.
kTestUsingFalse, // callback returning false.
kTestUsingTrue, // callbacl returning true.
};
constexpr int kNumTestValues = 3;
const char* TestValueName[kNumTestValues] = {"null", "false", "true"};
// Defined to simplify iterating over TestValues;
const TestValue AllTestValues[kNumTestValues] = {
kTestUsingNull, kTestUsingFalse, kTestUsingTrue};
// This matrix holds the results of setting allow_code_gen_callback
// (first index) and allow_wasm_code_gen_callback (second index) using
// TestValue's. The value in the matrix is true if compilation is
// allowed, and false otherwise.
const bool ExpectedResults[kNumTestValues][kNumTestValues] = {
{true, false, true}, {false, false, true}, {true, false, true}};
bool TrueCallback(Local<v8::Context>, Local<v8::String>) { return true; }
bool FalseCallback(Local<v8::Context>, Local<v8::String>) { return false; }
typedef bool (*CallbackFn)(Local<v8::Context>, Local<v8::String>);
// Defines the Callback to use for the corresponding TestValue.
CallbackFn Callback[kNumTestValues] = {nullptr, FalseCallback, TrueCallback};
void BuildTrivialModule(Zone* zone, ZoneBuffer* buffer) {
WasmModuleBuilder* builder = new (zone) WasmModuleBuilder(zone);
builder->WriteTo(*buffer);
}
bool TestModule(Isolate* isolate, v8::MemorySpan<const uint8_t> wire_bytes) {
HandleScope scope(isolate);
v8::MemorySpan<const uint8_t> serialized_module;
MaybeLocal<v8::WasmModuleObject> module =
v8::WasmModuleObject::DeserializeOrCompile(
reinterpret_cast<v8::Isolate*>(isolate), serialized_module,
wire_bytes);
return !module.IsEmpty();
}
} // namespace
TEST(PropertiesOfCodegenCallbacks) {
v8::internal::AccountingAllocator allocator;
Zone zone(&allocator, ZONE_NAME);
ZoneBuffer buffer(&zone);
BuildTrivialModule(&zone, &buffer);
v8::MemorySpan<const uint8_t> wire_bytes = {buffer.begin(), buffer.size()};
Isolate* isolate = CcTest::InitIsolateOnce();
HandleScope scope(isolate);
testing::SetupIsolateForWasmModule(isolate);
for (TestValue codegen : AllTestValues) {
for (TestValue wasm_codegen : AllTestValues) {
fprintf(stderr, "Test codegen = %s, wasm_codegen = %s\n",
TestValueName[codegen], TestValueName[wasm_codegen]);
isolate->set_allow_code_gen_callback(Callback[codegen]);
isolate->set_allow_wasm_code_gen_callback(Callback[wasm_codegen]);
bool found = TestModule(isolate, wire_bytes);
bool expected = ExpectedResults[codegen][wasm_codegen];
CHECK_EQ(expected, found);
CcTest::CollectAllAvailableGarbage();
}
}
}
} // namespace wasm
} // namespace internal
} // namespace v8