e90af2c702
The name {CallerOwnedBuffer} does not make sense in all situations, especially if such an object is returned instead of being passed as argument. I am working on moving the wasm wire bytes off the JS heap, and hence will return unowned references via the API. To prepare this change, I deprecate the existing {CallerOwnedBuffer} and introduce a new {BufferReference} struct with proper field names. R=titzer@chromium.org, adamk@chromium.org Bug: v8:7868 Cq-Include-Trybots: luci.chromium.try:linux_chromium_rel_ng Change-Id: Ic8953951447038a831b15a336a52a199bfbeafd5 Reviewed-on: https://chromium-review.googlesource.com/1108207 Reviewed-by: Yang Guo <yangguo@chromium.org> Reviewed-by: Ben Titzer <titzer@chromium.org> Commit-Queue: Clemens Hammacher <clemensh@chromium.org> Cr-Commit-Position: refs/heads/master@{#53929}
102 lines
3.5 KiB
C++
102 lines
3.5 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::WasmCompiledModule::BufferReference wire_bytes) {
|
|
HandleScope scope(isolate);
|
|
|
|
v8::WasmCompiledModule::BufferReference serialized_module(nullptr, 0);
|
|
MaybeLocal<v8::WasmCompiledModule> module =
|
|
v8::WasmCompiledModule::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::WasmCompiledModule::BufferReference 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
|