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

Unified Diff: src/wasm/module-decoder.cc

Issue 2454503005: [wasm] Support for restricted table imports. (Closed)
Patch Set: Fix GC stress issue; tables weren't being reset correctly Created 4 years, 2 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 | « src/compiler/wasm-compiler.cc ('k') | src/wasm/wasm-interpreter.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/wasm/module-decoder.cc
diff --git a/src/wasm/module-decoder.cc b/src/wasm/module-decoder.cc
index d01a4f9a97ee45f96deb5d02b878cc4ac8025349..9721f5af63941e0785afa93457b131bf5543144d 100644
--- a/src/wasm/module-decoder.cc
+++ b/src/wasm/module-decoder.cc
@@ -31,8 +31,6 @@ namespace {
const char* kNameString = "name";
const size_t kNameStringLength = 4;
-static const uint32_t kMaxTableSize = 1 << 28;
-
LocalType TypeOf(const WasmModule* module, const WasmInitExpr& expr) {
switch (expr.kind) {
case WasmInitExpr::kNone:
@@ -311,19 +309,22 @@ class ModuleDecoder : public Decoder {
// ===== Imported table ==========================================
import->index =
static_cast<uint32_t>(module->function_tables.size());
- module->function_tables.push_back(
- {0, 0, std::vector<int32_t>(), true, false, SignatureMap()});
+ module->function_tables.push_back({0, 0, false,
+ std::vector<int32_t>(), true,
+ false, SignatureMap()});
expect_u8("element type", kWasmAnyFunctionTypeForm);
WasmIndirectFunctionTable* table = &module->function_tables.back();
- consume_resizable_limits("element count", "elements", kMaxTableSize,
- &table->size, &table->max_size);
+ consume_resizable_limits(
+ "element count", "elements", WasmModule::kV8MaxTableSize,
+ &table->min_size, &table->has_max, &table->max_size);
break;
}
case kExternalMemory: {
// ===== Imported memory =========================================
- consume_resizable_limits(
- "memory", "pages", WasmModule::kMaxLegalPages,
- &module->min_mem_pages, &module->max_mem_pages);
+ bool has_max = false;
+ consume_resizable_limits("memory", "pages", WasmModule::kV8MaxPages,
+ &module->min_mem_pages, &has_max,
+ &module->max_mem_pages);
break;
}
case kExternalGlobal: {
@@ -375,15 +376,16 @@ class ModuleDecoder : public Decoder {
error(pos, pos, "invalid table count %d, maximum 1", table_count);
}
if (module->function_tables.size() < 1) {
- module->function_tables.push_back(
- {0, 0, std::vector<int32_t>(), false, false, SignatureMap()});
+ module->function_tables.push_back({0, 0, false, std::vector<int32_t>(),
+ false, false, SignatureMap()});
}
for (uint32_t i = 0; ok() && i < table_count; i++) {
WasmIndirectFunctionTable* table = &module->function_tables.back();
expect_u8("table type", kWasmAnyFunctionTypeForm);
- consume_resizable_limits("table elements", "elements", kMaxUInt32,
- &table->size, &table->max_size);
+ consume_resizable_limits("table elements", "elements",
+ WasmModule::kV8MaxTableSize, &table->min_size,
+ &table->has_max, &table->max_size);
}
section_iter.advance();
}
@@ -398,8 +400,9 @@ class ModuleDecoder : public Decoder {
}
for (uint32_t i = 0; ok() && i < memory_count; i++) {
- consume_resizable_limits("memory", "pages", WasmModule::kMaxLegalPages,
- &module->min_mem_pages,
+ bool has_max = false;
+ consume_resizable_limits("memory", "pages", WasmModule::kV8MaxPages,
+ &module->min_mem_pages, &has_max,
&module->max_mem_pages);
}
section_iter.advance();
@@ -623,7 +626,6 @@ class ModuleDecoder : public Decoder {
if (ok()) {
CalculateGlobalOffsets(module);
- PreinitializeIndirectFunctionTables(module);
}
const WasmModule* finished_module = module;
ModuleResult result = toResult(finished_module);
@@ -749,30 +751,6 @@ class ModuleDecoder : public Decoder {
module->globals_size = offset;
}
- // TODO(titzer): this only works without overlapping initializations from
- // global bases for entries
- void PreinitializeIndirectFunctionTables(WasmModule* module) {
- // Fill all tables with invalid entries first.
- for (WasmIndirectFunctionTable& table : module->function_tables) {
- table.values.resize(table.size);
- for (size_t i = 0; i < table.size; i++) {
- table.values[i] = kInvalidFunctionIndex;
- }
- }
- for (WasmTableInit& init : module->table_inits) {
- if (init.offset.kind != WasmInitExpr::kI32Const) continue;
- if (init.table_index >= module->function_tables.size()) continue;
- WasmIndirectFunctionTable& table =
- module->function_tables[init.table_index];
- for (size_t i = 0; i < init.entries.size(); i++) {
- size_t index = i + init.offset.val.i32_const;
- if (index < table.values.size()) {
- table.values[index] = init.entries[i];
- }
- }
- }
- }
-
// Verifies the body (code) of a given function.
void VerifyFunctionBody(uint32_t func_num, ModuleEnv* menv,
WasmFunction* function) {
@@ -866,29 +844,33 @@ class ModuleDecoder : public Decoder {
void consume_resizable_limits(const char* name, const char* units,
uint32_t max_value, uint32_t* initial,
- uint32_t* maximum) {
+ bool* has_max, uint32_t* maximum) {
uint32_t flags = consume_u32v("resizable limits flags");
const byte* pos = pc();
*initial = consume_u32v("initial size");
+ *has_max = false;
if (*initial > max_value) {
error(pos, pos,
- "initial %s size (%u %s) is larger than maximum allowable (%u)",
+ "initial %s size (%u %s) is larger than implementation limit (%u)",
name, *initial, units, max_value);
}
if (flags & 1) {
+ *has_max = true;
pos = pc();
*maximum = consume_u32v("maximum size");
if (*maximum > max_value) {
- error(pos, pos,
- "maximum %s size (%u %s) is larger than maximum allowable (%u)",
- name, *maximum, units, max_value);
+ error(
+ pos, pos,
+ "maximum %s size (%u %s) is larger than implementation limit (%u)",
+ name, *maximum, units, max_value);
}
if (*maximum < *initial) {
error(pos, pos, "maximum %s size (%u %s) is less than initial (%u %s)",
name, *maximum, units, *initial, units);
}
} else {
- *maximum = 0;
+ *has_max = false;
+ *maximum = max_value;
}
}
« no previous file with comments | « src/compiler/wasm-compiler.cc ('k') | src/wasm/wasm-interpreter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698