| Index: src/wasm/wasm-module.cc
|
| diff --git a/src/wasm/wasm-module.cc b/src/wasm/wasm-module.cc
|
| index 74fa1bf93031e2ab31088ca0b8696f36078a04b8..4c17a1d38f2846be4cefaa59dc852404ed0e3316 100644
|
| --- a/src/wasm/wasm-module.cc
|
| +++ b/src/wasm/wasm-module.cc
|
| @@ -1669,16 +1669,34 @@ class WasmInstanceBuilder {
|
| table_instance.js_wrappers = Handle<FixedArray>(
|
| table_instance.table_object->functions(), isolate_);
|
|
|
| - // TODO(titzer): import table size must match exactly for now.
|
| - int table_size = table_instance.js_wrappers->length();
|
| - if (table_size != static_cast<int>(table.min_size)) {
|
| + int imported_cur_size = table_instance.js_wrappers->length();
|
| + if (imported_cur_size < static_cast<int>(table.min_size)) {
|
| thrower_->LinkError(
|
| - "table import %d is wrong size (%d), expected %u", index,
|
| - table_size, table.min_size);
|
| + "table import %d is smaller than minimum %d, got %u", index,
|
| + table.min_size, imported_cur_size);
|
| return -1;
|
| }
|
|
|
| + if (table.has_max) {
|
| + int64_t imported_max_size =
|
| + table_instance.table_object->maximum_length();
|
| + if (imported_max_size < 0) {
|
| + thrower_->LinkError(
|
| + "table import %d has no maximum length, expected %d", index,
|
| + table.max_size);
|
| + return -1;
|
| + }
|
| + if (imported_max_size > table.max_size) {
|
| + thrower_->LinkError(
|
| + "table import %d has maximum larger than maximum %d, "
|
| + "got %" PRIx64,
|
| + index, table.max_size, imported_max_size);
|
| + return -1;
|
| + }
|
| + }
|
| +
|
| // Allocate a new dispatch table and signature table.
|
| + int table_size = imported_cur_size;
|
| table_instance.function_table =
|
| isolate_->factory()->NewFixedArray(table_size);
|
| table_instance.signature_table =
|
| @@ -1720,6 +1738,29 @@ class WasmInstanceBuilder {
|
| DCHECK(WasmJs::IsWasmMemoryObject(isolate_, memory));
|
| instance->set_memory_object(*memory);
|
| memory_ = Handle<JSArrayBuffer>(memory->buffer(), isolate_);
|
| + uint32_t imported_cur_pages = static_cast<uint32_t>(
|
| + memory_->byte_length()->Number() / WasmModule::kPageSize);
|
| + if (imported_cur_pages < module_->min_mem_pages) {
|
| + thrower_->LinkError(
|
| + "memory import %d is smaller than maximum %u, got %u", index,
|
| + module_->min_mem_pages, imported_cur_pages);
|
| + }
|
| + int32_t imported_max_pages = memory->maximum_pages();
|
| + if (module_->has_max_mem) {
|
| + if (imported_max_pages < 0) {
|
| + thrower_->LinkError(
|
| + "memory import %d has no maximum limit, expected at most %u",
|
| + index, imported_max_pages);
|
| + return -1;
|
| + }
|
| + if (static_cast<uint32_t>(imported_max_pages) >
|
| + module_->max_mem_pages) {
|
| + thrower_->LinkError(
|
| + "memory import %d has larger maximum than maximum %u, got %d",
|
| + index, module_->max_mem_pages, imported_max_pages);
|
| + return -1;
|
| + }
|
| + }
|
| break;
|
| }
|
| case kExternalGlobal: {
|
| @@ -2212,13 +2253,14 @@ int32_t wasm::GetInstanceMemorySize(Isolate* isolate,
|
| }
|
| }
|
|
|
| -uint32_t GetMaxInstanceMemorySize(Isolate* isolate,
|
| - Handle<WasmInstanceObject> instance) {
|
| +uint32_t GetMaxInstanceMemoryPages(Isolate* isolate,
|
| + Handle<WasmInstanceObject> instance) {
|
| if (instance->has_memory_object()) {
|
| Handle<WasmMemoryObject> memory_object(instance->memory_object(), isolate);
|
| -
|
| - int maximum = memory_object->maximum_pages();
|
| - if (maximum > 0) return static_cast<uint32_t>(maximum);
|
| + if (memory_object->has_maximum_pages()) {
|
| + uint32_t maximum = static_cast<uint32_t>(memory_object->maximum_pages());
|
| + if (maximum < kV8MaxWasmMemoryPages) return maximum;
|
| + }
|
| }
|
| uint32_t compiled_max_pages = instance->compiled_module()->max_mem_pages();
|
| isolate->counters()->wasm_max_mem_pages_count()->AddSample(
|
| @@ -2294,7 +2336,7 @@ int32_t wasm::GrowWebAssemblyMemory(Isolate* isolate, Handle<Object> receiver,
|
| Handle<WasmInstanceObject> instance = instance_wrapper->instance_object();
|
| DCHECK(IsWasmInstance(*instance));
|
| if (pages == 0) return GetInstanceMemorySize(isolate, instance);
|
| - uint32_t max_pages = GetMaxInstanceMemorySize(isolate, instance);
|
| + uint32_t max_pages = GetMaxInstanceMemoryPages(isolate, instance);
|
|
|
| // Grow memory object buffer and update instances associated with it.
|
| MaybeHandle<JSArrayBuffer> memory_buffer = handle(memory_object->buffer());
|
| @@ -2342,7 +2384,7 @@ int32_t wasm::GrowMemory(Isolate* isolate, Handle<WasmInstanceObject> instance,
|
| old_size = old_buffer->byte_length()->Number();
|
| old_mem_start = static_cast<Address>(old_buffer->backing_store());
|
| }
|
| - uint32_t max_pages = GetMaxInstanceMemorySize(isolate, instance_obj);
|
| + uint32_t max_pages = GetMaxInstanceMemoryPages(isolate, instance_obj);
|
| Handle<JSArrayBuffer> buffer =
|
| GrowMemoryBuffer(isolate, instance_buffer, pages, max_pages);
|
| if (buffer.is_null()) return -1;
|
|
|