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

Side by Side Diff: src/wasm/wasm-objects.cc

Issue 2512323004: Revert of [wasm] WebAssembly.Memory object can be referenced by multiple Instance objects. (Closed)
Patch Set: Created 4 years, 1 month 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 unified diff | Download patch
« no previous file with comments | « src/wasm/wasm-objects.h ('k') | test/mjsunit/wasm/import-memory.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/wasm/wasm-objects.h" 5 #include "src/wasm/wasm-objects.h"
6 #include "src/wasm/wasm-module.h" 6 #include "src/wasm/wasm-module.h"
7 7
8 #define TRACE(...) \ 8 #define TRACE(...) \
9 do { \ 9 do { \
10 if (FLAG_trace_wasm_instances) PrintF(__VA_ARGS__); \ 10 if (FLAG_trace_wasm_instances) PrintF(__VA_ARGS__); \
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 Handle<JSObject> memory_obj = isolate->factory()->NewJSObject(memory_ctor); 177 Handle<JSObject> memory_obj = isolate->factory()->NewJSObject(memory_ctor);
178 memory_obj->SetInternalField(kArrayBuffer, *buffer); 178 memory_obj->SetInternalField(kArrayBuffer, *buffer);
179 memory_obj->SetInternalField(kMaximum, 179 memory_obj->SetInternalField(kMaximum,
180 static_cast<Object*>(Smi::FromInt(maximum))); 180 static_cast<Object*>(Smi::FromInt(maximum)));
181 Handle<Symbol> memory_sym(isolate->native_context()->wasm_memory_sym()); 181 Handle<Symbol> memory_sym(isolate->native_context()->wasm_memory_sym());
182 Object::SetProperty(memory_obj, memory_sym, memory_obj, STRICT).Check(); 182 Object::SetProperty(memory_obj, memory_sym, memory_obj, STRICT).Check();
183 return Handle<WasmMemoryObject>::cast(memory_obj); 183 return Handle<WasmMemoryObject>::cast(memory_obj);
184 } 184 }
185 185
186 DEFINE_ACCESSORS(WasmMemoryObject, buffer, kArrayBuffer, JSArrayBuffer) 186 DEFINE_ACCESSORS(WasmMemoryObject, buffer, kArrayBuffer, JSArrayBuffer)
187 DEFINE_OPTIONAL_ACCESSORS(WasmMemoryObject, instances_link, kInstancesLink,
188 WasmInstanceWrapper)
189 187
190 uint32_t WasmMemoryObject::current_pages() { 188 uint32_t WasmMemoryObject::current_pages() {
191 return SafeUint32(get_buffer()->byte_length()) / wasm::WasmModule::kPageSize; 189 return SafeUint32(get_buffer()->byte_length()) / wasm::WasmModule::kPageSize;
192 } 190 }
193 191
194 int32_t WasmMemoryObject::maximum_pages() { 192 int32_t WasmMemoryObject::maximum_pages() {
195 return SafeInt32(GetInternalField(kMaximum)); 193 return SafeInt32(GetInternalField(kMaximum));
196 } 194 }
197 195
198 WasmMemoryObject* WasmMemoryObject::cast(Object* object) { 196 WasmMemoryObject* WasmMemoryObject::cast(Object* object) {
199 DCHECK(object && object->IsJSObject()); 197 DCHECK(object && object->IsJSObject());
200 // TODO(titzer): brand check for WasmMemoryObject. 198 // TODO(titzer): brand check for WasmMemoryObject.
201 return reinterpret_cast<WasmMemoryObject*>(object); 199 return reinterpret_cast<WasmMemoryObject*>(object);
202 } 200 }
203 201
204 void WasmMemoryObject::AddInstance(Isolate* isolate, 202 void WasmMemoryObject::AddInstance(WasmInstanceObject* instance) {
205 Handle<WasmInstanceObject> instance) { 203 // TODO(gdeepti): This should be a weak list of instance objects
206 Handle<WasmInstanceWrapper> instance_wrapper; 204 // for instances that share memory.
207 if (has_instances_link()) { 205 SetInternalField(kInstance, instance);
208 Handle<WasmInstanceWrapper> current_wrapper(get_instances_link());
209 DCHECK(WasmInstanceWrapper::IsWasmInstanceWrapper(*current_wrapper));
210 DCHECK(!current_wrapper->has_previous());
211 instance_wrapper = WasmInstanceWrapper::New(isolate, instance);
212 instance_wrapper->set_next_wrapper(*current_wrapper);
213 current_wrapper->set_previous_wrapper(*instance_wrapper);
214 } else {
215 instance_wrapper = WasmInstanceWrapper::New(isolate, instance);
216 }
217 set_instances_link(*instance_wrapper);
218 instance->set_instance_wrapper(*instance_wrapper);
219 }
220
221 void WasmMemoryObject::ResetInstancesLink(Isolate* isolate) {
222 Handle<Object> undefined = isolate->factory()->undefined_value();
223 SetInternalField(kInstancesLink, *undefined);
224 } 206 }
225 207
226 DEFINE_ACCESSORS(WasmInstanceObject, compiled_module, kCompiledModule, 208 DEFINE_ACCESSORS(WasmInstanceObject, compiled_module, kCompiledModule,
227 WasmCompiledModule) 209 WasmCompiledModule)
228 DEFINE_OPTIONAL_ACCESSORS(WasmInstanceObject, globals_buffer, 210 DEFINE_OPTIONAL_ACCESSORS(WasmInstanceObject, globals_buffer,
229 kGlobalsArrayBuffer, JSArrayBuffer) 211 kGlobalsArrayBuffer, JSArrayBuffer)
230 DEFINE_OPTIONAL_ACCESSORS(WasmInstanceObject, memory_buffer, kMemoryArrayBuffer, 212 DEFINE_OPTIONAL_ACCESSORS(WasmInstanceObject, memory_buffer, kMemoryArrayBuffer,
231 JSArrayBuffer) 213 JSArrayBuffer)
232 DEFINE_OPTIONAL_ACCESSORS(WasmInstanceObject, memory_object, kMemoryObject, 214 DEFINE_OPTIONAL_ACCESSORS(WasmInstanceObject, memory_object, kMemoryObject,
233 WasmMemoryObject) 215 WasmMemoryObject)
234 DEFINE_OPTIONAL_ACCESSORS(WasmInstanceObject, debug_info, kDebugInfo, 216 DEFINE_OPTIONAL_ACCESSORS(WasmInstanceObject, debug_info, kDebugInfo,
235 WasmDebugInfo) 217 WasmDebugInfo)
236 DEFINE_OPTIONAL_ACCESSORS(WasmInstanceObject, instance_wrapper,
237 kWasmMemInstanceWrapper, WasmInstanceWrapper)
238 218
239 WasmModuleObject* WasmInstanceObject::module_object() { 219 WasmModuleObject* WasmInstanceObject::module_object() {
240 return WasmModuleObject::cast(*get_compiled_module()->wasm_module()); 220 return WasmModuleObject::cast(*get_compiled_module()->wasm_module());
241 } 221 }
242 222
243 WasmModule* WasmInstanceObject::module() { 223 WasmModule* WasmInstanceObject::module() {
244 return reinterpret_cast<WasmModuleWrapper*>( 224 return reinterpret_cast<WasmModuleWrapper*>(
245 *get_compiled_module()->module_wrapper()) 225 *get_compiled_module()->module_wrapper())
246 ->get(); 226 ->get();
247 } 227 }
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 function.name_length); 378 function.name_length);
399 } 379 }
400 380
401 int WasmCompiledModule::GetFunctionOffset(uint32_t func_index) const { 381 int WasmCompiledModule::GetFunctionOffset(uint32_t func_index) const {
402 std::vector<WasmFunction>& functions = module()->functions; 382 std::vector<WasmFunction>& functions = module()->functions;
403 if (static_cast<uint32_t>(func_index) >= functions.size()) return -1; 383 if (static_cast<uint32_t>(func_index) >= functions.size()) return -1;
404 DCHECK_GE(static_cast<uint32_t>(kMaxInt), 384 DCHECK_GE(static_cast<uint32_t>(kMaxInt),
405 functions[func_index].code_start_offset); 385 functions[func_index].code_start_offset);
406 return static_cast<int>(functions[func_index].code_start_offset); 386 return static_cast<int>(functions[func_index].code_start_offset);
407 } 387 }
408
409 Handle<WasmInstanceWrapper> WasmInstanceWrapper::New(
410 Isolate* isolate, Handle<WasmInstanceObject> instance) {
411 Handle<FixedArray> array =
412 isolate->factory()->NewFixedArray(kWrapperPropertyCount, TENURED);
413 Handle<WasmInstanceWrapper> instance_wrapper(
414 reinterpret_cast<WasmInstanceWrapper*>(*array), isolate);
415 instance_wrapper->set_instance_object(instance, isolate);
416 return instance_wrapper;
417 }
418
419 bool WasmInstanceWrapper::IsWasmInstanceWrapper(Object* obj) {
420 if (!obj->IsFixedArray()) return false;
421 FixedArray* array = FixedArray::cast(obj);
422 if (array->length() != kWrapperPropertyCount) return false;
423 if (!array->get(kWrapperInstanceObject)->IsWeakCell()) return false;
424 Isolate* isolate = array->GetIsolate();
425 if (!array->get(kNextInstanceWrapper)->IsUndefined(isolate) &&
426 !array->get(kNextInstanceWrapper)->IsFixedArray())
427 return false;
428 if (!array->get(kPreviousInstanceWrapper)->IsUndefined(isolate) &&
429 !array->get(kPreviousInstanceWrapper)->IsFixedArray())
430 return false;
431 return true;
432 }
433
434 void WasmInstanceWrapper::set_instance_object(Handle<JSObject> instance,
435 Isolate* isolate) {
436 Handle<WeakCell> cell = isolate->factory()->NewWeakCell(instance);
437 set(kWrapperInstanceObject, *cell);
438 }
OLDNEW
« no previous file with comments | « src/wasm/wasm-objects.h ('k') | test/mjsunit/wasm/import-memory.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698