Index: test/mjsunit/wasm/wasm-module-builder.js |
diff --git a/test/mjsunit/wasm/wasm-module-builder.js b/test/mjsunit/wasm/wasm-module-builder.js |
index 5c5f6e205b7723a30549488a50d89a148f18d781..e3311c1cb620f8d798b9a6a8120e0c189c295768 100644 |
--- a/test/mjsunit/wasm/wasm-module-builder.js |
+++ b/test/mjsunit/wasm/wasm-module-builder.js |
@@ -132,10 +132,11 @@ class WasmModuleBuilder { |
this.exports = []; |
this.globals = []; |
this.functions = []; |
- this.table = []; |
+ this.function_table = []; |
+ this.function_table_length = 0; |
+ this.function_table_inits = []; |
this.segments = []; |
this.explicit = []; |
- this.pad = null; |
this.num_imported_funcs = 0; |
this.num_imported_globals = 0; |
return this; |
@@ -151,11 +152,6 @@ class WasmModuleBuilder { |
return this; |
} |
- addPadFunctionTable(size) { |
- this.pad = size; |
- return this; |
- } |
- |
addExplicitSection(bytes) { |
this.explicit.push(bytes); |
return this; |
@@ -220,8 +216,21 @@ class WasmModuleBuilder { |
this.exports.push({name: name, kind: kExternalMemory, index: 0}); |
} |
+ addFunctionTableInit(base, is_global, array) { |
+ this.function_table_inits.push({base: base, is_global: is_global, array: array}); |
+ if (!is_global) { |
+ var length = base + array.length; |
+ if (length > this.function_table_length) this.function_table_length = length; |
+ } |
+ return this; |
+ } |
+ |
appendToTable(array) { |
- this.table.push(...array); |
+ return this.addFunctionTableInit(this.function_table.length, false, array); |
+ } |
+ |
+ setFunctionTableLength(length) { |
+ this.function_table_length = length; |
return this; |
} |
@@ -292,15 +301,15 @@ class WasmModuleBuilder { |
}); |
} |
- // Add table. |
- if (wasm.table.length > 0) { |
+ // Add function_table. |
+ if (wasm.function_table_length > 0) { |
if (debug) print("emitting table @ " + binary.length); |
binary.emit_section(kTableSectionCode, section => { |
section.emit_u8(1); // one table entry |
section.emit_u8(kWasmAnyFunctionTypeForm); |
section.emit_u8(1); |
- section.emit_u32v(wasm.table.length); |
- section.emit_u32v(wasm.table.length); |
+ section.emit_u32v(wasm.function_table_length); |
+ section.emit_u32v(wasm.function_table_length); |
}); |
} |
@@ -394,17 +403,25 @@ class WasmModuleBuilder { |
} |
// Add table elements. |
- if (wasm.table.length > 0) { |
+ if (wasm.function_table_inits.length > 0) { |
if (debug) print("emitting table @ " + binary.length); |
binary.emit_section(kElementSectionCode, section => { |
- section.emit_u8(1); |
+ var inits = wasm.function_table_inits; |
+ section.emit_u32v(inits.length); |
section.emit_u8(0); // table index |
- section.emit_u8(kExprI32Const); |
- section.emit_u8(0); |
- section.emit_u8(kExprEnd); |
- section.emit_u32v(wasm.table.length); |
- for (let index of wasm.table) { |
- section.emit_u32v(index); |
+ |
+ for (let init of inits) { |
+ if (init.is_global) { |
+ section.emit_u8(kExprGetGlobal); |
+ } else { |
+ section.emit_u8(kExprI32Const); |
+ } |
+ section.emit_u32v(init.base); |
+ section.emit_u8(kExprEnd); |
+ section.emit_u32v(init.array.length); |
+ for (let index of init.array) { |
+ section.emit_u32v(index); |
+ } |
} |
}); |
} |