Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(598)

Unified Diff: test/mjsunit/wasm/test-import-export-wrapper.js

Issue 2204703002: [wasm] Get rid of extra wrappers when import another wasm export (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Make test case code more clean Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « test/cctest/wasm/wasm-run-utils.h ('k') | test/mjsunit/wasm/wasm-constants.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/mjsunit/wasm/test-import-export-wrapper.js
diff --git a/test/mjsunit/wasm/test-import-export-wrapper.js b/test/mjsunit/wasm/test-import-export-wrapper.js
new file mode 100644
index 0000000000000000000000000000000000000000..e180611818b3a2f5272f321169e215fa3502800f
--- /dev/null
+++ b/test/mjsunit/wasm/test-import-export-wrapper.js
@@ -0,0 +1,241 @@
+// 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.
+
+// Flags: --expose-wasm --allow-natives-syntax
+
+load("test/mjsunit/wasm/wasm-constants.js");
+load("test/mjsunit/wasm/wasm-module-builder.js");
+
+var expect_elison = 0;
+var expect_no_elison = 1;
+// function calls stack: first_export -> first_func -> first_import ->
+// second_export -> second_import
+// In this case, first_import and second_export have same signature,
+// So that wrappers will be removed
+(function TestWasmWrapperElision() {
+ var imported = function (a) {
+ return a;
+ };
+
+ var second_module = new WasmModuleBuilder();
+ var sig_index = second_module.addType(kSig_i_i);
+ second_module
+ .addImportWithModule("import_module_2", "import_name_2", sig_index);
+ second_module
+ .addFunction("second_export", sig_index)
+ .addBody([
+ kExprGetLocal, 0,
+ kExprCallImport, kArity1, 0,
+ kExprReturn, kArity1
+ ])
+ .exportFunc();
+
+ var first_module = new WasmModuleBuilder();
+ var sig_index = first_module.addType(kSig_i_i);
+ first_module
+ .addImportWithModule("import_module_1", "import_name_1", sig_index);
+ first_module
+ .addFunction("first_export", sig_index)
+ .addBody([
+ kExprGetLocal, 0,
+ kExprCallFunction, kArity1, 1,
+ kExprReturn, kArity1
+ ])
+ .exportFunc();
+ first_module
+ .addFunction("first_func", sig_index)
+ .addBody([
+ kExprI32Const, 1,
+ kExprGetLocal, 0,
+ kExprI32Add,
+ kExprCallImport, kArity1, 0,
+ kExprReturn, kArity1
+ ]);
+
+ var f = second_module
+ .instantiate({import_module_2: {import_name_2: imported}})
+ .exports.second_export;
+ var the_export = first_module
+ .instantiate({import_module_1: {import_name_1: f}})
+ .exports.first_export;
+ assertEquals(the_export(2), 3);
+ assertEquals(the_export(-1), 0);
+ assertEquals(the_export(0), 1);
+ assertEquals(the_export(5.5), 6);
+ assertEquals(%CheckWasmWrapperElision(the_export, expect_elison), true);
+})();
+
+// function calls stack: first_export -> first_func -> first_import ->
+// second_export -> second_import
+// In this case, second_export has less params than first_import,
+// So that wrappers will not be removed
+(function TestWasmWrapperNoElisionLessParams() {
+ var imported = function (a) {
+ return a;
+ };
+
+ var second_module = new WasmModuleBuilder();
+ var sig_index_1 = second_module.addType(kSig_i_i);
+ second_module
+ .addImportWithModule("import_module_2", "import_name_2", sig_index_1);
+ second_module
+ .addFunction("second_export", sig_index_1)
+ .addBody([
+ kExprGetLocal, 0,
+ kExprCallImport, kArity1, 0,
+ kExprReturn, kArity1
+ ])
+ .exportFunc();
+
+ var first_module = new WasmModuleBuilder();
+ var sig_index_2 = first_module.addType(kSig_i_ii);
+ first_module
+ .addImportWithModule("import_module_1", "import_name_1", sig_index_2);
+ first_module
+ .addFunction("first_export", sig_index_2)
+ .addBody([
+ kExprGetLocal, 0,
+ kExprGetLocal, 1,
+ kExprCallFunction, kArity2, 1,
+ kExprReturn, kArity1
+ ])
+ .exportFunc();
+ first_module
+ .addFunction("first_func", sig_index_2)
+ .addBody([
+ kExprGetLocal, 0,
+ kExprGetLocal, 1,
+ kExprCallImport, kArity2, 0,
+ kExprReturn, kArity1
+ ]);
+
+ var f = second_module
+ .instantiate({import_module_2: {import_name_2: imported}})
+ .exports.second_export;
+ var the_export = first_module
+ .instantiate({import_module_1: {import_name_1: f}})
+ .exports.first_export;
+ assertEquals(the_export(4, 5), 4);
+ assertEquals(the_export(-1, 4), -1);
+ assertEquals(the_export(0, 2), 0);
+ assertEquals(the_export(9.9, 4.3), 9);
+ assertEquals(%CheckWasmWrapperElision(the_export, expect_no_elison), true);
+})();
+
+// function calls stack: first_export -> first_func -> first_import ->
+// second_export -> second_import
+// In this case, second_export has more params than first_import,
+// So that wrappers will not be removed
+(function TestWasmWrapperNoElisionMoreParams() {
+ var imported = function (a, b, c) {
+ return a+b+c;
+ };
+
+ var second_module = new WasmModuleBuilder();
+ var sig_index_3 = second_module.addType(kSig_i_iii);
+ second_module
+ .addImportWithModule("import_module_2", "import_name_2", sig_index_3);
+ second_module
+ .addFunction("second_export", sig_index_3)
+ .addBody([
+ kExprGetLocal, 0,
+ kExprGetLocal, 1,
+ kExprGetLocal, 2,
+ kExprCallImport, kArity3, 0,
+ kExprReturn, kArity1
+ ])
+ .exportFunc();
+
+ var first_module = new WasmModuleBuilder();
+ var sig_index_2 = first_module.addType(kSig_i_ii);
+ first_module
+ .addImportWithModule("import_module_1", "import_name_1", sig_index_2);
+ first_module
+ .addFunction("first_export", sig_index_2)
+ .addBody([
+ kExprGetLocal, 0,
+ kExprGetLocal, 1,
+ kExprCallFunction, kArity2, 1,
+ kExprReturn, kArity1
+ ])
+ .exportFunc();
+ first_module
+ .addFunction("first_func", sig_index_2)
+ .addBody([
+ kExprGetLocal, 0,
+ kExprGetLocal, 1,
+ kExprCallImport, kArity2, 0,
+ kExprReturn, kArity1
+ ]);
+
+ var f = second_module
+ .instantiate({import_module_2: {import_name_2: imported}})
+ .exports.second_export;
+ var the_export = first_module
+ .instantiate({import_module_1: {import_name_1: f}})
+ .exports.first_export;
+ assertEquals(the_export(5, 6), 11);
+ assertEquals(the_export(-1, -4), -5);
+ assertEquals(the_export(0, 0), 0);
+ assertEquals(the_export(1.1, 2.7), 3);
+ assertEquals(%CheckWasmWrapperElision(the_export, expect_no_elison), true);
+})();
+
+// function calls stack: first_export -> first_func -> first_import ->
+// second_export -> second_import
+// In this case, second_export has different params type with first_import,
+// So that wrappers will not be removed
+(function TestWasmWrapperNoElisionTypeMismatch() {
+ var imported = function (a, b) {
+ return a+b;
+ };
+
+ var second_module = new WasmModuleBuilder();
+ var sig_index_2 = second_module.addType(kSig_d_dd);
+ second_module
+ .addImportWithModule("import_module_2", "import_name_2", sig_index_2);
+ second_module
+ .addFunction("second_export", sig_index_2)
+ .addBody([
+ kExprGetLocal, 0,
+ kExprGetLocal, 1,
+ kExprCallImport, kArity2, 0,
+ kExprReturn, kArity1
+ ])
+ .exportFunc();
+
+ var first_module = new WasmModuleBuilder();
+ var sig_index_2 = first_module.addType(kSig_i_ii);
+ first_module
+ .addImportWithModule("import_module_1", "import_name_1", sig_index_2);
+ first_module
+ .addFunction("first_export", sig_index_2)
+ .addBody([
+ kExprGetLocal, 0,
+ kExprGetLocal, 1,
+ kExprCallFunction, kArity2, 1,
+ kExprReturn, kArity1
+ ])
+ .exportFunc();
+ first_module
+ .addFunction("first_func", sig_index_2)
+ .addBody([
+ kExprGetLocal, 0,
+ kExprGetLocal, 1,
+ kExprCallImport, kArity2, 0,
+ kExprReturn, kArity1
+ ]);
+
+ var f = second_module
+ .instantiate({import_module_2: {import_name_2: imported}})
+ .exports.second_export;
+ var the_export = first_module
+ .instantiate({import_module_1: {import_name_1: f}})
+ .exports.first_export;
+ assertEquals(the_export(2.8, 9.1), 11);
+ assertEquals(the_export(-1.7, -2.5), -3);
+ assertEquals(the_export(0.0, 0.0), 0);
+ assertEquals(the_export(2, -2), 0);
+ assertEquals(%CheckWasmWrapperElision(the_export, expect_no_elison), true);
+})();
« no previous file with comments | « test/cctest/wasm/wasm-run-utils.h ('k') | test/mjsunit/wasm/wasm-constants.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698