Index: src/wasm/wasm-module.h |
diff --git a/src/wasm/wasm-module.h b/src/wasm/wasm-module.h |
index 3ac410476d7c6fc9a6a0752f1b7fccb5016a384d..3e159421c3342cdd699e8387ae59868c3d66f58f 100644 |
--- a/src/wasm/wasm-module.h |
+++ b/src/wasm/wasm-module.h |
@@ -554,14 +554,74 @@ Object* GetOwningWasmInstance(Code* code); |
MaybeHandle<JSArrayBuffer> GetInstanceMemory(Isolate* isolate, |
Handle<JSObject> instance); |
+void SetInstanceMemoryObject(Handle<JSObject> instance, |
+ Handle<Object> mem_object); |
+ |
int32_t GetInstanceMemorySize(Isolate* isolate, Handle<JSObject> instance); |
-int32_t GrowInstanceMemory(Isolate* isolate, Handle<JSObject> instance, |
- uint32_t pages); |
+int32_t GrowWebAssemblyMemory(Isolate* isolate, Handle<Object> memory_object, |
+ uint32_t pages); |
+ |
+int32_t GrowMemory(Isolate* isolate, Handle<JSObject> instance, uint32_t pages); |
void UpdateDispatchTables(Isolate* isolate, Handle<FixedArray> dispatch_tables, |
int index, Handle<JSFunction> js_function); |
+class WasmInstanceWrapper : public FixedArray { |
+ public: |
+ static Handle<WasmInstanceWrapper> New(Isolate* isolate, |
+ Handle<JSObject> instance); |
+ static WasmInstanceWrapper* cast(Object* fixed_array) { |
+ SLOW_DCHECK(IsWasmInstanceWrapper(fixed_array)); |
+ return reinterpret_cast<WasmInstanceWrapper*>(fixed_array); |
+ } |
+ static bool IsWasmInstanceWrapper(Object* obj); |
+ bool has_instance() { return get(kWrapperInstanceObject)->IsWeakCell(); } |
+ Handle<JSObject> instance_object() { |
+ Object* obj = get(kWrapperInstanceObject); |
+ DCHECK(obj->IsWeakCell()); |
+ WeakCell* cell = WeakCell::cast(obj); |
+ DCHECK(cell->value()->IsJSObject()); |
+ return handle(JSObject::cast(cell->value())); |
+ } |
+ bool has_next() { return IsWasmInstanceWrapper(get(kNextInstanceWrapper)); } |
+ bool has_previous() { |
+ return IsWasmInstanceWrapper(get(kPreviousInstanceWrapper)); |
+ } |
+ void set_instance_object(Handle<JSObject> instance, Isolate* isolate); |
+ void set_next_wrapper(Object* obj) { |
+ DCHECK(IsWasmInstanceWrapper(obj)); |
+ set(kNextInstanceWrapper, obj); |
+ } |
+ void set_previous_wrapper(Object* obj) { |
+ DCHECK(IsWasmInstanceWrapper(obj)); |
+ set(kPreviousInstanceWrapper, obj); |
+ } |
+ Handle<WasmInstanceWrapper> next_wrapper() { |
+ Object* obj = get(kNextInstanceWrapper); |
+ DCHECK(IsWasmInstanceWrapper(obj)); |
+ return handle(WasmInstanceWrapper::cast(obj)); |
+ } |
+ Handle<WasmInstanceWrapper> previous_wrapper() { |
+ Object* obj = get(kPreviousInstanceWrapper); |
+ DCHECK(IsWasmInstanceWrapper(obj)); |
+ return handle(WasmInstanceWrapper::cast(obj)); |
+ } |
+ void reset_next_wrapper() { set_undefined(kNextInstanceWrapper); } |
+ void reset_previous_wrapper() { set_undefined(kPreviousInstanceWrapper); } |
+ void reset() { |
+ for (int kID = 0; kID < kWrapperPropertyCount; kID++) set_undefined(kID); |
+ } |
+ |
+ private: |
+ enum { |
+ kWrapperInstanceObject, |
+ kNextInstanceWrapper, |
+ kPreviousInstanceWrapper, |
+ kWrapperPropertyCount |
+ }; |
+}; |
+ |
namespace testing { |
void ValidateInstancesChain(Isolate* isolate, Handle<JSObject> wasm_module, |