| // Copyright 2019 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. |
| |
| #ifndef TEST_WASM_API_TESTS_WASM_API_TEST_H_ |
| #define TEST_WASM_API_TESTS_WASM_API_TEST_H_ |
| |
| #include "src/wasm/wasm-module-builder.h" |
| #include "src/wasm/wasm-opcodes.h" |
| #include "src/zone/accounting-allocator.h" |
| #include "src/zone/zone.h" |
| #include "test/common/wasm/wasm-macro-gen.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "third_party/wasm-api/wasm.hh" |
| |
| namespace wasm { |
| |
| // TODO(jkummerow): Drop these from the API. |
| #ifdef DEBUG |
| template <class T> |
| void vec<T>::make_data() {} |
| |
| template <class T> |
| void vec<T>::free_data() {} |
| #endif |
| |
| } // namespace wasm |
| |
| namespace v8 { |
| namespace internal { |
| namespace wasm { |
| |
| using ::wasm::Engine; |
| using ::wasm::Extern; |
| using ::wasm::Foreign; |
| using ::wasm::Func; |
| using ::wasm::FuncType; |
| using ::wasm::Global; |
| using ::wasm::Instance; |
| using ::wasm::Memory; |
| using ::wasm::Module; |
| using ::wasm::own; |
| using ::wasm::Ref; |
| using ::wasm::Store; |
| using ::wasm::Table; |
| using ::wasm::Trap; |
| using ::wasm::Val; |
| using ::wasm::ValType; |
| using ::wasm::vec; |
| |
| class WasmCapiTest : public ::testing::Test { |
| public: |
| WasmCapiTest() |
| : Test(), |
| zone_(&allocator_, ZONE_NAME), |
| builder_(&zone_), |
| exports_(vec<Extern*>::make()), |
| wasm_i_i_sig_(1, 1, wasm_i_i_sig_types_) { |
| engine_ = Engine::make(); |
| store_ = Store::make(engine_.get()); |
| cpp_i_i_sig_ = |
| FuncType::make(vec<ValType*>::make(ValType::make(::wasm::I32)), |
| vec<ValType*>::make(ValType::make(::wasm::I32))); |
| } |
| |
| void Compile() { |
| ZoneBuffer buffer(&zone_); |
| builder_.WriteTo(&buffer); |
| size_t size = buffer.end() - buffer.begin(); |
| vec<byte_t> binary = vec<byte_t>::make( |
| size, reinterpret_cast<byte_t*>(const_cast<byte*>(buffer.begin()))); |
| |
| module_ = Module::make(store_.get(), binary); |
| DCHECK_NE(module_.get(), nullptr); |
| } |
| |
| void Instantiate(Extern* imports[]) { |
| Compile(); |
| instance_ = Instance::make(store_.get(), module_.get(), imports); |
| DCHECK_NE(instance_.get(), nullptr); |
| exports_ = instance_->exports(); |
| } |
| |
| void AddExportedFunction(Vector<const char> name, byte code[], |
| size_t code_size, FunctionSig* sig) { |
| WasmFunctionBuilder* fun = builder()->AddFunction(sig); |
| fun->EmitCode(code, static_cast<uint32_t>(code_size)); |
| fun->Emit(kExprEnd); |
| builder()->AddExport(name, fun); |
| } |
| |
| Func* GetExportedFunction(size_t index) { |
| DCHECK_GT(exports_.size(), index); |
| Extern* exported = exports_[index]; |
| DCHECK_EQ(exported->kind(), ::wasm::EXTERN_FUNC); |
| Func* func = exported->func(); |
| DCHECK_NE(func, nullptr); |
| return func; |
| } |
| |
| Global* GetExportedGlobal(size_t index) { |
| DCHECK_GT(exports_.size(), index); |
| Extern* exported = exports_[index]; |
| DCHECK_EQ(exported->kind(), ::wasm::EXTERN_GLOBAL); |
| Global* global = exported->global(); |
| DCHECK_NE(global, nullptr); |
| return global; |
| } |
| |
| Memory* GetExportedMemory(size_t index) { |
| DCHECK_GT(exports_.size(), index); |
| Extern* exported = exports_[index]; |
| DCHECK_EQ(exported->kind(), ::wasm::EXTERN_MEMORY); |
| Memory* memory = exported->memory(); |
| DCHECK_NE(memory, nullptr); |
| return memory; |
| } |
| |
| Table* GetExportedTable(size_t index) { |
| DCHECK_GT(exports_.size(), index); |
| Extern* exported = exports_[index]; |
| DCHECK_EQ(exported->kind(), ::wasm::EXTERN_TABLE); |
| Table* table = exported->table(); |
| DCHECK_NE(table, nullptr); |
| return table; |
| } |
| |
| void Shutdown() { |
| instance_.reset(); |
| module_.reset(); |
| store_.reset(); |
| engine_.reset(); |
| } |
| |
| WasmModuleBuilder* builder() { return &builder_; } |
| Engine* engine() { return engine_.get(); } |
| Store* store() { return store_.get(); } |
| Module* module() { return module_.get(); } |
| const vec<Extern*>& exports() { return exports_; } |
| |
| FunctionSig* wasm_i_i_sig() { return &wasm_i_i_sig_; } |
| FuncType* cpp_i_i_sig() { return cpp_i_i_sig_.get(); } |
| |
| private: |
| AccountingAllocator allocator_; |
| Zone zone_; |
| WasmModuleBuilder builder_; |
| own<Engine*> engine_; |
| own<Store*> store_; |
| own<Module*> module_; |
| own<Instance*> instance_; |
| vec<Extern*> exports_; |
| own<FuncType*> cpp_i_i_sig_; |
| ValueType wasm_i_i_sig_types_[2] = {kWasmI32, kWasmI32}; |
| FunctionSig wasm_i_i_sig_; |
| }; |
| |
| } // namespace wasm |
| } // namespace internal |
| } // namespace v8 |
| |
| #endif // TEST_WASM_API_TESTS_WASM_API_TEST_H_ |