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

Unified Diff: src/wasm/wasm-objects.cc

Issue 2972803002: [wasm] Use WeakFixedArray for list of instances sharing a WasmMemoryObject. (Closed)
Patch Set: [wasm] Use WeakFixedArray for list of instances sharing a WasmMemoryObject. Created 3 years, 5 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/wasm/wasm-objects.h ('k') | test/mjsunit/wasm/memory-instance-validation.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/wasm/wasm-objects.cc
diff --git a/src/wasm/wasm-objects.cc b/src/wasm/wasm-objects.cc
index 1aa6195e629d633843d02d2c54235702f0f62bda..c55febcd23ea4d300c97bf92f72e6b0430cd80a3 100644
--- a/src/wasm/wasm-objects.cc
+++ b/src/wasm/wasm-objects.cc
@@ -323,7 +323,7 @@ Handle<WasmMemoryObject> WasmMemoryObject::New(Isolate* isolate,
}
memory_obj->set_array_buffer(*buffer);
memory_obj->set_maximum_pages(maximum);
- return Handle<WasmMemoryObject>::cast(memory_obj);
+ return memory_obj;
}
uint32_t WasmMemoryObject::current_pages() {
@@ -333,17 +333,23 @@ uint32_t WasmMemoryObject::current_pages() {
}
void WasmMemoryObject::AddInstance(Isolate* isolate,
+ Handle<WasmMemoryObject> memory,
Handle<WasmInstanceObject> instance) {
- Handle<WasmInstanceWrapper> instance_wrapper =
- handle(instance->instance_wrapper());
- if (has_instances_link()) {
- Handle<WasmInstanceWrapper> current_wrapper(instances_link());
- DCHECK(WasmInstanceWrapper::IsWasmInstanceWrapper(*current_wrapper));
- DCHECK(!current_wrapper->has_previous());
- instance_wrapper->set_next_wrapper(*current_wrapper);
- current_wrapper->set_previous_wrapper(*instance_wrapper);
+ Handle<WeakFixedArray> old_instances =
+ memory->has_instances()
+ ? Handle<WeakFixedArray>(memory->instances(), isolate)
+ : Handle<WeakFixedArray>::null();
+ Handle<WeakFixedArray> new_instances =
+ WeakFixedArray::Add(old_instances, instance);
+ memory->set_instances(*new_instances);
+}
+
+void WasmMemoryObject::RemoveInstance(Isolate* isolate,
+ Handle<WasmMemoryObject> memory,
+ Handle<WasmInstanceObject> instance) {
+ if (memory->has_instances()) {
+ memory->instances()->Remove(instance);
}
- set_instances_link(*instance_wrapper);
}
// static
@@ -368,42 +374,30 @@ int32_t WasmMemoryObject::Grow(Isolate* isolate,
DCHECK_EQ(0, old_size % WasmModule::kPageSize);
return old_size / WasmModule::kPageSize;
}
- if (!memory_object->has_instances_link()) {
- // Memory object does not have an instance associated with it, just grow
- uint32_t max_pages;
- if (memory_object->has_maximum_pages()) {
- max_pages = static_cast<uint32_t>(memory_object->maximum_pages());
- if (FLAG_wasm_max_mem_pages < max_pages) return -1;
- } else {
- max_pages = FLAG_wasm_max_mem_pages;
- }
- new_buffer = GrowMemoryBuffer(isolate, old_buffer, pages, max_pages);
- if (new_buffer.is_null()) return -1;
+
+ uint32_t max_pages;
+ if (memory_object->has_maximum_pages()) {
+ max_pages = static_cast<uint32_t>(memory_object->maximum_pages());
+ if (FLAG_wasm_max_mem_pages < max_pages) return -1;
} else {
- Handle<WasmInstanceWrapper> instance_wrapper(
- memory_object->instances_link());
- DCHECK(WasmInstanceWrapper::IsWasmInstanceWrapper(*instance_wrapper));
- DCHECK(instance_wrapper->has_instance());
- Handle<WasmInstanceObject> instance = instance_wrapper->instance_object();
- DCHECK(instance->IsWasmInstanceObject());
- uint32_t max_pages = instance->GetMaxMemoryPages();
-
- // Grow memory object buffer and update instances associated with it.
- new_buffer = GrowMemoryBuffer(isolate, old_buffer, pages, max_pages);
- if (new_buffer.is_null()) return -1;
- DCHECK(!instance_wrapper->has_previous());
- SetInstanceMemory(isolate, instance, new_buffer);
+ max_pages = FLAG_wasm_max_mem_pages;
+ }
+ new_buffer = GrowMemoryBuffer(isolate, old_buffer, pages, max_pages);
+ if (new_buffer.is_null()) return -1;
+
+ if (memory_object->has_instances()) {
Address old_mem_start = static_cast<Address>(old_buffer->backing_store());
- UncheckedUpdateInstanceMemory(isolate, instance, old_mem_start, old_size);
- while (instance_wrapper->has_next()) {
- instance_wrapper = instance_wrapper->next_wrapper();
- DCHECK(WasmInstanceWrapper::IsWasmInstanceWrapper(*instance_wrapper));
- Handle<WasmInstanceObject> instance = instance_wrapper->instance_object();
- DCHECK(instance->IsWasmInstanceObject());
+ Handle<WeakFixedArray> instances(memory_object->instances(), isolate);
+ for (int i = 0; i < instances->Length(); i++) {
+ Object* elem = instances->Get(i);
+ if (!elem->IsWasmInstanceObject()) continue;
+ Handle<WasmInstanceObject> instance(WasmInstanceObject::cast(elem),
+ isolate);
SetInstanceMemory(isolate, instance, new_buffer);
UncheckedUpdateInstanceMemory(isolate, instance, old_mem_start, old_size);
}
}
+
memory_object->set_array_buffer(*new_buffer);
DCHECK_EQ(0, old_size % WasmModule::kPageSize);
return old_size / WasmModule::kPageSize;
@@ -434,9 +428,6 @@ Handle<WasmInstanceObject> WasmInstanceObject::New(
reinterpret_cast<WasmInstanceObject*>(*instance_object), isolate);
instance->set_compiled_module(*compiled_module);
- Handle<WasmInstanceWrapper> instance_wrapper =
- WasmInstanceWrapper::New(isolate, instance);
- instance->set_instance_wrapper(*instance_wrapper);
return instance;
}
@@ -1392,29 +1383,3 @@ Handle<Code> WasmCompiledModule::CompileLazy(
return orch->CompileLazy(isolate, instance, caller, offset, func_index,
patch_caller);
}
-
-Handle<WasmInstanceWrapper> WasmInstanceWrapper::New(
- Isolate* isolate, Handle<WasmInstanceObject> instance) {
- Handle<FixedArray> array =
- isolate->factory()->NewFixedArray(kFieldCount, TENURED);
- Handle<WasmInstanceWrapper> instance_wrapper(
- reinterpret_cast<WasmInstanceWrapper*>(*array), isolate);
- Handle<WeakCell> cell = isolate->factory()->NewWeakCell(instance);
- instance_wrapper->set(kWrapperInstanceObjectIndex, *cell);
- return instance_wrapper;
-}
-
-bool WasmInstanceWrapper::IsWasmInstanceWrapper(Object* obj) {
- if (!obj->IsFixedArray()) return false;
- Handle<FixedArray> array = handle(FixedArray::cast(obj));
- if (array->length() != kFieldCount) return false;
- if (!array->get(kWrapperInstanceObjectIndex)->IsWeakCell()) return false;
- Isolate* isolate = array->GetIsolate();
- if (!array->get(kNextInstanceWrapperIndex)->IsUndefined(isolate) &&
- !array->get(kNextInstanceWrapperIndex)->IsFixedArray())
- return false;
- if (!array->get(kPreviousInstanceWrapperIndex)->IsUndefined(isolate) &&
- !array->get(kPreviousInstanceWrapperIndex)->IsFixedArray())
- return false;
- return true;
-}
« no previous file with comments | « src/wasm/wasm-objects.h ('k') | test/mjsunit/wasm/memory-instance-validation.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698