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

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

Issue 2964943002: [wasm] Introduce instance types for WebAssembly.* objects. (Closed)
Patch Set: Address rossberg comments. 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 unified diff | Download patch
« no previous file with comments | « src/wasm/wasm-objects.h ('k') | test/cctest/wasm/test-run-wasm-module.cc » ('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/utils.h" 6 #include "src/utils.h"
7 7
8 #include "src/assembler-inl.h" 8 #include "src/assembler-inl.h"
9 #include "src/base/iterator.h" 9 #include "src/base/iterator.h"
10 #include "src/compiler/wasm-compiler.h" 10 #include "src/compiler/wasm-compiler.h"
(...skipping 11 matching lines...) Expand all
22 } while (false) 22 } while (false)
23 23
24 #define TRACE_CHAIN(instance) \ 24 #define TRACE_CHAIN(instance) \
25 do { \ 25 do { \
26 instance->PrintInstancesChain(); \ 26 instance->PrintInstancesChain(); \
27 } while (false) 27 } while (false)
28 28
29 using namespace v8::internal; 29 using namespace v8::internal;
30 using namespace v8::internal::wasm; 30 using namespace v8::internal::wasm;
31 31
32 #define DEFINE_GETTER0(getter, Container, name, field, type) \
33 type* Container::name() { return type::cast(getter(field)); }
34
35 #define DEFINE_ACCESSORS0(getter, setter, Container, name, field, type) \
36 DEFINE_GETTER0(getter, Container, name, field, type) \
37 void Container::set_##name(type* value) { return setter(field, value); }
38
39 #define DEFINE_OPTIONAL_ACCESSORS0(getter, setter, Container, name, field, \
40 type) \
41 DEFINE_ACCESSORS0(getter, setter, Container, name, field, type) \
42 bool Container::has_##name() { \
43 return !getter(field)->IsUndefined(GetIsolate()); \
44 }
45
46 #define DEFINE_OPTIONAL_GETTER0(getter, Container, name, field, type) \
47 DEFINE_GETTER0(getter, Container, name, field, type) \
48 bool Container::has_##name() { \
49 return !getter(field)->IsUndefined(GetIsolate()); \
50 }
51
52 #define DEFINE_GETTER0(getter, Container, name, field, type) \
53 type* Container::name() { return type::cast(getter(field)); }
54
55 #define DEFINE_OBJ_GETTER(Container, name, field, type) \
56 DEFINE_GETTER0(GetEmbedderField, Container, name, field, type)
57 #define DEFINE_OBJ_ACCESSORS(Container, name, field, type) \
58 DEFINE_ACCESSORS0(GetEmbedderField, SetEmbedderField, Container, name, \
59 field, type)
60 #define DEFINE_OPTIONAL_OBJ_ACCESSORS(Container, name, field, type) \
61 DEFINE_OPTIONAL_ACCESSORS0(GetEmbedderField, SetEmbedderField, Container, \
62 name, field, type)
63 #define DEFINE_ARR_GETTER(Container, name, field, type) \
64 DEFINE_GETTER0(get, Container, name, field, type)
65 #define DEFINE_ARR_ACCESSORS(Container, name, field, type) \
66 DEFINE_ACCESSORS0(get, set, Container, name, field, type)
67 #define DEFINE_OPTIONAL_ARR_ACCESSORS(Container, name, field, type) \
68 DEFINE_OPTIONAL_ACCESSORS0(get, set, Container, name, field, type)
69 #define DEFINE_OPTIONAL_ARR_GETTER(Container, name, field, type) \
70 DEFINE_OPTIONAL_GETTER0(get, Container, name, field, type)
71
72 namespace { 32 namespace {
73 33
74 // An iterator that returns first the module itself, then all modules linked via 34 // An iterator that returns first the module itself, then all modules linked via
75 // next, then all linked via prev. 35 // next, then all linked via prev.
76 class CompiledModulesIterator 36 class CompiledModulesIterator
77 : public v8::base::iterator<std::input_iterator_tag, 37 : public v8::base::iterator<std::input_iterator_tag,
78 Handle<WasmCompiledModule>> { 38 Handle<WasmCompiledModule>> {
79 public: 39 public:
80 CompiledModulesIterator(Isolate* isolate, 40 CompiledModulesIterator(Isolate* isolate,
81 Handle<WasmCompiledModule> start_module, bool at_end) 41 Handle<WasmCompiledModule> start_module, bool at_end)
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 if (offset == static_cast<uint32_t>(offset_in_func)) return true; 151 if (offset == static_cast<uint32_t>(offset_in_func)) return true;
192 } 152 }
193 return false; 153 return false;
194 } 154 }
195 #endif // DEBUG 155 #endif // DEBUG
196 156
197 } // namespace 157 } // namespace
198 158
199 Handle<WasmModuleObject> WasmModuleObject::New( 159 Handle<WasmModuleObject> WasmModuleObject::New(
200 Isolate* isolate, Handle<WasmCompiledModule> compiled_module) { 160 Isolate* isolate, Handle<WasmCompiledModule> compiled_module) {
201 WasmModule* module = compiled_module->module(); 161 Handle<JSFunction> module_cons(
202 Handle<JSObject> module_object; 162 isolate->native_context()->wasm_module_constructor());
203 if (module->is_wasm()) { 163 auto module_object = Handle<WasmModuleObject>::cast(
204 Handle<JSFunction> module_cons( 164 isolate->factory()->NewJSObject(module_cons));
205 isolate->native_context()->wasm_module_constructor()); 165 Handle<Symbol> module_sym(isolate->native_context()->wasm_module_sym());
206 module_object = isolate->factory()->NewJSObject(module_cons); 166 Object::SetProperty(module_object, module_sym, module_object, STRICT).Check();
207 Handle<Symbol> module_sym(isolate->native_context()->wasm_module_sym()); 167 module_object->set_compiled_module(*compiled_module);
208 Object::SetProperty(module_object, module_sym, module_object, STRICT)
209 .Check();
210 } else {
211 DCHECK(module->is_asm_js());
212 Handle<Map> map = isolate->factory()->NewMap(
213 JS_OBJECT_TYPE,
214 JSObject::kHeaderSize + WasmModuleObject::kFieldCount * kPointerSize);
215 module_object = isolate->factory()->NewJSObjectFromMap(map, TENURED);
216 }
217 module_object->SetEmbedderField(WasmModuleObject::kCompiledModule,
218 *compiled_module);
219 Handle<WeakCell> link_to_module = 168 Handle<WeakCell> link_to_module =
220 isolate->factory()->NewWeakCell(module_object); 169 isolate->factory()->NewWeakCell(module_object);
221 compiled_module->set_weak_wasm_module(link_to_module); 170 compiled_module->set_weak_wasm_module(link_to_module);
222 return Handle<WasmModuleObject>::cast(module_object); 171 return module_object;
223 } 172 }
224 173
225 WasmModuleObject* WasmModuleObject::cast(Object* object) {
226 DCHECK(object->IsJSObject());
227 // TODO(titzer): brand check for WasmModuleObject.
228 return reinterpret_cast<WasmModuleObject*>(object);
229 }
230
231 bool WasmModuleObject::IsWasmModuleObject(Object* object) {
232 return object->IsJSObject() &&
233 JSObject::cast(object)->GetEmbedderFieldCount() == kFieldCount;
234 }
235
236 DEFINE_OBJ_GETTER(WasmModuleObject, compiled_module, kCompiledModule,
237 WasmCompiledModule)
238
239 Handle<WasmTableObject> WasmTableObject::New(Isolate* isolate, uint32_t initial, 174 Handle<WasmTableObject> WasmTableObject::New(Isolate* isolate, uint32_t initial,
240 int64_t maximum, 175 int64_t maximum,
241 Handle<FixedArray>* js_functions) { 176 Handle<FixedArray>* js_functions) {
242 Handle<JSFunction> table_ctor( 177 Handle<JSFunction> table_ctor(
243 isolate->native_context()->wasm_table_constructor()); 178 isolate->native_context()->wasm_table_constructor());
244 Handle<JSObject> table_obj = isolate->factory()->NewJSObject(table_ctor); 179 auto table_obj = Handle<WasmTableObject>::cast(
245 table_obj->SetEmbedderField(kWrapperTracerHeader, Smi::kZero); 180 isolate->factory()->NewJSObject(table_ctor));
246 181
247 *js_functions = isolate->factory()->NewFixedArray(initial); 182 *js_functions = isolate->factory()->NewFixedArray(initial);
248 Object* null = isolate->heap()->null_value(); 183 Object* null = isolate->heap()->null_value();
249 for (int i = 0; i < static_cast<int>(initial); ++i) { 184 for (int i = 0; i < static_cast<int>(initial); ++i) {
250 (*js_functions)->set(i, null); 185 (*js_functions)->set(i, null);
251 } 186 }
252 table_obj->SetEmbedderField(kFunctions, *(*js_functions)); 187 table_obj->set_functions(**js_functions);
253 Handle<Object> max = isolate->factory()->NewNumber(maximum); 188 DCHECK_EQ(maximum, static_cast<int>(maximum));
254 table_obj->SetEmbedderField(kMaximum, *max); 189 table_obj->set_maximum_length(static_cast<int>(maximum));
255 190
256 Handle<FixedArray> dispatch_tables = isolate->factory()->NewFixedArray(0); 191 Handle<FixedArray> dispatch_tables = isolate->factory()->NewFixedArray(0);
257 table_obj->SetEmbedderField(kDispatchTables, *dispatch_tables); 192 table_obj->set_dispatch_tables(*dispatch_tables);
258 Handle<Symbol> table_sym(isolate->native_context()->wasm_table_sym()); 193 Handle<Symbol> table_sym(isolate->native_context()->wasm_table_sym());
259 Object::SetProperty(table_obj, table_sym, table_obj, STRICT).Check(); 194 Object::SetProperty(table_obj, table_sym, table_obj, STRICT).Check();
260 return Handle<WasmTableObject>::cast(table_obj); 195 return Handle<WasmTableObject>::cast(table_obj);
261 } 196 }
262 197
263 Handle<FixedArray> WasmTableObject::AddDispatchTable( 198 Handle<FixedArray> WasmTableObject::AddDispatchTable(
264 Isolate* isolate, Handle<WasmTableObject> table_obj, 199 Isolate* isolate, Handle<WasmTableObject> table_obj,
265 Handle<WasmInstanceObject> instance, int table_index, 200 Handle<WasmInstanceObject> instance, int table_index,
266 Handle<FixedArray> function_table, Handle<FixedArray> signature_table) { 201 Handle<FixedArray> function_table, Handle<FixedArray> signature_table) {
267 Handle<FixedArray> dispatch_tables( 202 Handle<FixedArray> dispatch_tables(table_obj->dispatch_tables());
268 FixedArray::cast(table_obj->GetEmbedderField(kDispatchTables)), isolate);
269 DCHECK_EQ(0, dispatch_tables->length() % 4); 203 DCHECK_EQ(0, dispatch_tables->length() % 4);
270 204
271 if (instance.is_null()) return dispatch_tables; 205 if (instance.is_null()) return dispatch_tables;
272 // TODO(titzer): use weak cells here to avoid leaking instances. 206 // TODO(titzer): use weak cells here to avoid leaking instances.
273 207
274 // Grow the dispatch table and add a new entry at the end. 208 // Grow the dispatch table and add a new entry at the end.
275 Handle<FixedArray> new_dispatch_tables = 209 Handle<FixedArray> new_dispatch_tables =
276 isolate->factory()->CopyFixedArrayAndGrow(dispatch_tables, 4); 210 isolate->factory()->CopyFixedArrayAndGrow(dispatch_tables, 4);
277 211
278 new_dispatch_tables->set(dispatch_tables->length() + 0, *instance); 212 new_dispatch_tables->set(dispatch_tables->length() + 0, *instance);
279 new_dispatch_tables->set(dispatch_tables->length() + 1, 213 new_dispatch_tables->set(dispatch_tables->length() + 1,
280 Smi::FromInt(table_index)); 214 Smi::FromInt(table_index));
281 new_dispatch_tables->set(dispatch_tables->length() + 2, *function_table); 215 new_dispatch_tables->set(dispatch_tables->length() + 2, *function_table);
282 new_dispatch_tables->set(dispatch_tables->length() + 3, *signature_table); 216 new_dispatch_tables->set(dispatch_tables->length() + 3, *signature_table);
283 217
284 table_obj->SetEmbedderField(WasmTableObject::kDispatchTables, 218 table_obj->set_dispatch_tables(*new_dispatch_tables);
285 *new_dispatch_tables);
286 219
287 return new_dispatch_tables; 220 return new_dispatch_tables;
288 } 221 }
289 222
290 DEFINE_OBJ_ACCESSORS(WasmTableObject, functions, kFunctions, FixedArray)
291
292 DEFINE_OBJ_GETTER(WasmTableObject, dispatch_tables, kDispatchTables, FixedArray)
293
294 uint32_t WasmTableObject::current_length() { return functions()->length(); }
295
296 bool WasmTableObject::has_maximum_length() {
297 return GetEmbedderField(kMaximum)->Number() >= 0;
298 }
299
300 int64_t WasmTableObject::maximum_length() {
301 return static_cast<int64_t>(GetEmbedderField(kMaximum)->Number());
302 }
303
304 WasmTableObject* WasmTableObject::cast(Object* object) {
305 DCHECK(object && object->IsJSObject());
306 // TODO(titzer): brand check for WasmTableObject.
307 return reinterpret_cast<WasmTableObject*>(object);
308 }
309
310 void WasmTableObject::grow(Isolate* isolate, uint32_t count) { 223 void WasmTableObject::grow(Isolate* isolate, uint32_t count) {
311 Handle<FixedArray> dispatch_tables( 224 Handle<FixedArray> dispatch_tables(this->dispatch_tables());
312 FixedArray::cast(GetEmbedderField(kDispatchTables)));
313 DCHECK_EQ(0, dispatch_tables->length() % 4); 225 DCHECK_EQ(0, dispatch_tables->length() % 4);
314 uint32_t old_size = functions()->length(); 226 uint32_t old_size = functions()->length();
315 227
316 Zone specialization_zone(isolate->allocator(), ZONE_NAME); 228 Zone specialization_zone(isolate->allocator(), ZONE_NAME);
317 for (int i = 0; i < dispatch_tables->length(); i += 4) { 229 for (int i = 0; i < dispatch_tables->length(); i += 4) {
318 Handle<FixedArray> old_function_table( 230 Handle<FixedArray> old_function_table(
319 FixedArray::cast(dispatch_tables->get(i + 2))); 231 FixedArray::cast(dispatch_tables->get(i + 2)));
320 Handle<FixedArray> old_signature_table( 232 Handle<FixedArray> old_signature_table(
321 FixedArray::cast(dispatch_tables->get(i + 3))); 233 FixedArray::cast(dispatch_tables->get(i + 3)));
322 Handle<FixedArray> new_function_table = 234 Handle<FixedArray> new_function_table =
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 code_specialization.ApplyToWholeInstance(*instance); 311 code_specialization.ApplyToWholeInstance(*instance);
400 } 312 }
401 313
402 } // namespace 314 } // namespace
403 315
404 Handle<WasmMemoryObject> WasmMemoryObject::New(Isolate* isolate, 316 Handle<WasmMemoryObject> WasmMemoryObject::New(Isolate* isolate,
405 Handle<JSArrayBuffer> buffer, 317 Handle<JSArrayBuffer> buffer,
406 int32_t maximum) { 318 int32_t maximum) {
407 Handle<JSFunction> memory_ctor( 319 Handle<JSFunction> memory_ctor(
408 isolate->native_context()->wasm_memory_constructor()); 320 isolate->native_context()->wasm_memory_constructor());
409 Handle<JSObject> memory_obj = 321 auto memory_obj = Handle<WasmMemoryObject>::cast(
410 isolate->factory()->NewJSObject(memory_ctor, TENURED); 322 isolate->factory()->NewJSObject(memory_ctor, TENURED));
411 memory_obj->SetEmbedderField(kWrapperTracerHeader, Smi::kZero);
412 if (buffer.is_null()) { 323 if (buffer.is_null()) {
413 const bool enable_guard_regions = EnableGuardRegions(); 324 const bool enable_guard_regions = EnableGuardRegions();
414 buffer = SetupArrayBuffer(isolate, nullptr, 0, nullptr, 0, false, 325 buffer = SetupArrayBuffer(isolate, nullptr, 0, nullptr, 0, false,
415 enable_guard_regions); 326 enable_guard_regions);
416 } 327 }
417 memory_obj->SetEmbedderField(kArrayBuffer, *buffer); 328 memory_obj->set_array_buffer(*buffer);
418 Handle<Object> max = isolate->factory()->NewNumber(maximum); 329 memory_obj->set_maximum_pages(maximum);
419 memory_obj->SetEmbedderField(kMaximum, *max);
420 Handle<Symbol> memory_sym(isolate->native_context()->wasm_memory_sym()); 330 Handle<Symbol> memory_sym(isolate->native_context()->wasm_memory_sym());
421 Object::SetProperty(memory_obj, memory_sym, memory_obj, STRICT).Check(); 331 Object::SetProperty(memory_obj, memory_sym, memory_obj, STRICT).Check();
422 return Handle<WasmMemoryObject>::cast(memory_obj); 332 return Handle<WasmMemoryObject>::cast(memory_obj);
423 } 333 }
424 334
425 DEFINE_OBJ_ACCESSORS(WasmMemoryObject, buffer, kArrayBuffer, JSArrayBuffer)
426 DEFINE_OPTIONAL_OBJ_ACCESSORS(WasmMemoryObject, instances_link, kInstancesLink,
427 WasmInstanceWrapper)
428
429 uint32_t WasmMemoryObject::current_pages() { 335 uint32_t WasmMemoryObject::current_pages() {
430 uint32_t byte_length; 336 uint32_t byte_length;
431 CHECK(buffer()->byte_length()->ToUint32(&byte_length)); 337 CHECK(array_buffer()->byte_length()->ToUint32(&byte_length));
432 return byte_length / wasm::WasmModule::kPageSize; 338 return byte_length / wasm::WasmModule::kPageSize;
433 } 339 }
434 340
435 bool WasmMemoryObject::has_maximum_pages() {
436 return GetEmbedderField(kMaximum)->Number() >= 0;
437 }
438
439 int32_t WasmMemoryObject::maximum_pages() {
440 return static_cast<int32_t>(GetEmbedderField(kMaximum)->Number());
441 }
442
443 WasmMemoryObject* WasmMemoryObject::cast(Object* object) {
444 DCHECK(object && object->IsJSObject());
445 // TODO(titzer): brand check for WasmMemoryObject.
446 return reinterpret_cast<WasmMemoryObject*>(object);
447 }
448
449 void WasmMemoryObject::AddInstance(Isolate* isolate, 341 void WasmMemoryObject::AddInstance(Isolate* isolate,
450 Handle<WasmInstanceObject> instance) { 342 Handle<WasmInstanceObject> instance) {
451 Handle<WasmInstanceWrapper> instance_wrapper = 343 Handle<WasmInstanceWrapper> instance_wrapper =
452 handle(instance->instance_wrapper()); 344 handle(instance->instance_wrapper());
453 if (has_instances_link()) { 345 if (has_instances_link()) {
454 Handle<WasmInstanceWrapper> current_wrapper(instances_link()); 346 Handle<WasmInstanceWrapper> current_wrapper(instances_link());
455 DCHECK(WasmInstanceWrapper::IsWasmInstanceWrapper(*current_wrapper)); 347 DCHECK(WasmInstanceWrapper::IsWasmInstanceWrapper(*current_wrapper));
456 DCHECK(!current_wrapper->has_previous()); 348 DCHECK(!current_wrapper->has_previous());
457 instance_wrapper->set_next_wrapper(*current_wrapper); 349 instance_wrapper->set_next_wrapper(*current_wrapper);
458 current_wrapper->set_previous_wrapper(*instance_wrapper); 350 current_wrapper->set_previous_wrapper(*instance_wrapper);
459 } 351 }
460 set_instances_link(*instance_wrapper); 352 set_instances_link(*instance_wrapper);
461 } 353 }
462 354
463 void WasmMemoryObject::ResetInstancesLink(Isolate* isolate) {
464 Handle<Object> undefined = isolate->factory()->undefined_value();
465 SetEmbedderField(kInstancesLink, *undefined);
466 }
467
468 // static 355 // static
469 int32_t WasmMemoryObject::Grow(Isolate* isolate, 356 int32_t WasmMemoryObject::Grow(Isolate* isolate,
470 Handle<WasmMemoryObject> memory_object, 357 Handle<WasmMemoryObject> memory_object,
471 uint32_t pages) { 358 uint32_t pages) {
472 Handle<JSArrayBuffer> old_buffer(memory_object->buffer()); 359 Handle<JSArrayBuffer> old_buffer(memory_object->array_buffer());
473 uint32_t old_size = 0; 360 uint32_t old_size = 0;
474 CHECK(old_buffer->byte_length()->ToUint32(&old_size)); 361 CHECK(old_buffer->byte_length()->ToUint32(&old_size));
475 Handle<JSArrayBuffer> new_buffer; 362 Handle<JSArrayBuffer> new_buffer;
476 // Return current size if grow by 0. 363 // Return current size if grow by 0.
477 if (pages == 0) { 364 if (pages == 0) {
478 // Even for pages == 0, we need to attach a new JSArrayBuffer with the same 365 // Even for pages == 0, we need to attach a new JSArrayBuffer with the same
479 // backing store and neuter the old one to be spec compliant. 366 // backing store and neuter the old one to be spec compliant.
480 if (old_size != 0) { 367 if (old_size != 0) {
481 new_buffer = SetupArrayBuffer( 368 new_buffer = SetupArrayBuffer(
482 isolate, old_buffer->allocation_base(), 369 isolate, old_buffer->allocation_base(),
483 old_buffer->allocation_length(), old_buffer->backing_store(), 370 old_buffer->allocation_length(), old_buffer->backing_store(),
484 old_size, old_buffer->is_external(), old_buffer->has_guard_region()); 371 old_size, old_buffer->is_external(), old_buffer->has_guard_region());
485 memory_object->set_buffer(*new_buffer); 372 memory_object->set_array_buffer(*new_buffer);
486 } 373 }
487 DCHECK_EQ(0, old_size % WasmModule::kPageSize); 374 DCHECK_EQ(0, old_size % WasmModule::kPageSize);
488 return old_size / WasmModule::kPageSize; 375 return old_size / WasmModule::kPageSize;
489 } 376 }
490 if (!memory_object->has_instances_link()) { 377 if (!memory_object->has_instances_link()) {
491 // Memory object does not have an instance associated with it, just grow 378 // Memory object does not have an instance associated with it, just grow
492 uint32_t max_pages; 379 uint32_t max_pages;
493 if (memory_object->has_maximum_pages()) { 380 if (memory_object->has_maximum_pages()) {
494 max_pages = static_cast<uint32_t>(memory_object->maximum_pages()); 381 max_pages = static_cast<uint32_t>(memory_object->maximum_pages());
495 if (FLAG_wasm_max_mem_pages < max_pages) return -1; 382 if (FLAG_wasm_max_mem_pages < max_pages) return -1;
496 } else { 383 } else {
497 max_pages = FLAG_wasm_max_mem_pages; 384 max_pages = FLAG_wasm_max_mem_pages;
498 } 385 }
499 new_buffer = GrowMemoryBuffer(isolate, old_buffer, pages, max_pages); 386 new_buffer = GrowMemoryBuffer(isolate, old_buffer, pages, max_pages);
500 if (new_buffer.is_null()) return -1; 387 if (new_buffer.is_null()) return -1;
501 } else { 388 } else {
502 Handle<WasmInstanceWrapper> instance_wrapper( 389 Handle<WasmInstanceWrapper> instance_wrapper(
503 memory_object->instances_link()); 390 memory_object->instances_link());
504 DCHECK(WasmInstanceWrapper::IsWasmInstanceWrapper(*instance_wrapper)); 391 DCHECK(WasmInstanceWrapper::IsWasmInstanceWrapper(*instance_wrapper));
505 DCHECK(instance_wrapper->has_instance()); 392 DCHECK(instance_wrapper->has_instance());
506 Handle<WasmInstanceObject> instance = instance_wrapper->instance_object(); 393 Handle<WasmInstanceObject> instance = instance_wrapper->instance_object();
507 DCHECK(IsWasmInstance(*instance)); 394 DCHECK(instance->IsWasmInstanceObject());
508 uint32_t max_pages = instance->GetMaxMemoryPages(); 395 uint32_t max_pages = instance->GetMaxMemoryPages();
509 396
510 // Grow memory object buffer and update instances associated with it. 397 // Grow memory object buffer and update instances associated with it.
511 new_buffer = GrowMemoryBuffer(isolate, old_buffer, pages, max_pages); 398 new_buffer = GrowMemoryBuffer(isolate, old_buffer, pages, max_pages);
512 if (new_buffer.is_null()) return -1; 399 if (new_buffer.is_null()) return -1;
513 DCHECK(!instance_wrapper->has_previous()); 400 DCHECK(!instance_wrapper->has_previous());
514 SetInstanceMemory(isolate, instance, new_buffer); 401 SetInstanceMemory(isolate, instance, new_buffer);
515 Address old_mem_start = static_cast<Address>(old_buffer->backing_store()); 402 Address old_mem_start = static_cast<Address>(old_buffer->backing_store());
516 UncheckedUpdateInstanceMemory(isolate, instance, old_mem_start, old_size); 403 UncheckedUpdateInstanceMemory(isolate, instance, old_mem_start, old_size);
517 while (instance_wrapper->has_next()) { 404 while (instance_wrapper->has_next()) {
518 instance_wrapper = instance_wrapper->next_wrapper(); 405 instance_wrapper = instance_wrapper->next_wrapper();
519 DCHECK(WasmInstanceWrapper::IsWasmInstanceWrapper(*instance_wrapper)); 406 DCHECK(WasmInstanceWrapper::IsWasmInstanceWrapper(*instance_wrapper));
520 Handle<WasmInstanceObject> instance = instance_wrapper->instance_object(); 407 Handle<WasmInstanceObject> instance = instance_wrapper->instance_object();
521 DCHECK(IsWasmInstance(*instance)); 408 DCHECK(instance->IsWasmInstanceObject());
522 SetInstanceMemory(isolate, instance, new_buffer); 409 SetInstanceMemory(isolate, instance, new_buffer);
523 UncheckedUpdateInstanceMemory(isolate, instance, old_mem_start, old_size); 410 UncheckedUpdateInstanceMemory(isolate, instance, old_mem_start, old_size);
524 } 411 }
525 } 412 }
526 memory_object->set_buffer(*new_buffer); 413 memory_object->set_array_buffer(*new_buffer);
527 DCHECK_EQ(0, old_size % WasmModule::kPageSize); 414 DCHECK_EQ(0, old_size % WasmModule::kPageSize);
528 return old_size / WasmModule::kPageSize; 415 return old_size / WasmModule::kPageSize;
529 } 416 }
530 417
531 DEFINE_OBJ_ACCESSORS(WasmInstanceObject, compiled_module, kCompiledModule,
532 WasmCompiledModule)
533 DEFINE_OPTIONAL_OBJ_ACCESSORS(WasmInstanceObject, globals_buffer,
534 kGlobalsArrayBuffer, JSArrayBuffer)
535 DEFINE_OPTIONAL_OBJ_ACCESSORS(WasmInstanceObject, memory_buffer,
536 kMemoryArrayBuffer, JSArrayBuffer)
537 DEFINE_OPTIONAL_OBJ_ACCESSORS(WasmInstanceObject, memory_object, kMemoryObject,
538 WasmMemoryObject)
539 DEFINE_OPTIONAL_OBJ_ACCESSORS(WasmInstanceObject, debug_info, kDebugInfo,
540 WasmDebugInfo)
541 DEFINE_OPTIONAL_OBJ_ACCESSORS(WasmInstanceObject, instance_wrapper,
542 kWasmMemInstanceWrapper, WasmInstanceWrapper)
543 DEFINE_OPTIONAL_OBJ_ACCESSORS(WasmInstanceObject, directly_called_instances,
544 kDirectlyCalledInstances, FixedArray)
545
546 WasmModuleObject* WasmInstanceObject::module_object() { 418 WasmModuleObject* WasmInstanceObject::module_object() {
547 return *compiled_module()->wasm_module(); 419 return *compiled_module()->wasm_module();
548 } 420 }
549 421
550 WasmModule* WasmInstanceObject::module() { return compiled_module()->module(); } 422 WasmModule* WasmInstanceObject::module() { return compiled_module()->module(); }
551 423
552 Handle<WasmDebugInfo> WasmInstanceObject::GetOrCreateDebugInfo( 424 Handle<WasmDebugInfo> WasmInstanceObject::GetOrCreateDebugInfo(
553 Handle<WasmInstanceObject> instance) { 425 Handle<WasmInstanceObject> instance) {
554 if (instance->has_debug_info()) return handle(instance->debug_info()); 426 if (instance->has_debug_info()) return handle(instance->debug_info());
555 Handle<WasmDebugInfo> new_info = WasmDebugInfo::New(instance); 427 Handle<WasmDebugInfo> new_info = WasmDebugInfo::New(instance);
556 DCHECK(instance->has_debug_info()); 428 DCHECK(instance->has_debug_info());
557 return new_info; 429 return new_info;
558 } 430 }
559 431
560 WasmInstanceObject* WasmInstanceObject::cast(Object* object) {
561 DCHECK(IsWasmInstanceObject(object));
562 return reinterpret_cast<WasmInstanceObject*>(object);
563 }
564
565 bool WasmInstanceObject::IsWasmInstanceObject(Object* object) {
566 if (!object->IsJSObject()) return false;
567
568 JSObject* obj = JSObject::cast(object);
569 Isolate* isolate = obj->GetIsolate();
570 if (obj->GetEmbedderFieldCount() != kFieldCount) {
571 return false;
572 }
573
574 Object* mem = obj->GetEmbedderField(kMemoryArrayBuffer);
575 if (!(mem->IsUndefined(isolate) || mem->IsJSArrayBuffer()) ||
576 !WasmCompiledModule::IsWasmCompiledModule(
577 obj->GetEmbedderField(kCompiledModule))) {
578 return false;
579 }
580
581 // All checks passed.
582 return true;
583 }
584
585 Handle<WasmInstanceObject> WasmInstanceObject::New( 432 Handle<WasmInstanceObject> WasmInstanceObject::New(
586 Isolate* isolate, Handle<WasmCompiledModule> compiled_module) { 433 Isolate* isolate, Handle<WasmCompiledModule> compiled_module) {
587 Handle<JSFunction> instance_cons( 434 Handle<JSFunction> instance_cons(
588 isolate->native_context()->wasm_instance_constructor()); 435 isolate->native_context()->wasm_instance_constructor());
589 Handle<JSObject> instance_object = 436 Handle<JSObject> instance_object =
590 isolate->factory()->NewJSObject(instance_cons, TENURED); 437 isolate->factory()->NewJSObject(instance_cons, TENURED);
591 instance_object->SetEmbedderField(kWrapperTracerHeader, Smi::kZero);
592 438
593 Handle<Symbol> instance_sym(isolate->native_context()->wasm_instance_sym()); 439 Handle<Symbol> instance_sym(isolate->native_context()->wasm_instance_sym());
594 Object::SetProperty(instance_object, instance_sym, instance_object, STRICT) 440 Object::SetProperty(instance_object, instance_sym, instance_object, STRICT)
595 .Check(); 441 .Check();
596 Handle<WasmInstanceObject> instance( 442 Handle<WasmInstanceObject> instance(
597 reinterpret_cast<WasmInstanceObject*>(*instance_object), isolate); 443 reinterpret_cast<WasmInstanceObject*>(*instance_object), isolate);
598 444
599 instance->SetEmbedderField(kCompiledModule, *compiled_module); 445 instance->set_compiled_module(*compiled_module);
600 instance->SetEmbedderField(kMemoryObject, isolate->heap()->undefined_value());
601 Handle<WasmInstanceWrapper> instance_wrapper = 446 Handle<WasmInstanceWrapper> instance_wrapper =
602 WasmInstanceWrapper::New(isolate, instance); 447 WasmInstanceWrapper::New(isolate, instance);
603 instance->SetEmbedderField(kWasmMemInstanceWrapper, *instance_wrapper); 448 instance->set_instance_wrapper(*instance_wrapper);
604 return instance; 449 return instance;
605 } 450 }
606 451
607 int32_t WasmInstanceObject::GetMemorySize() { 452 int32_t WasmInstanceObject::GetMemorySize() {
608 if (!has_memory_buffer()) return 0; 453 if (!has_memory_buffer()) return 0;
609 uint32_t bytes = memory_buffer()->byte_length()->Number(); 454 uint32_t bytes = memory_buffer()->byte_length()->Number();
610 DCHECK_EQ(0, bytes % WasmModule::kPageSize); 455 DCHECK_EQ(0, bytes % WasmModule::kPageSize);
611 return bytes / WasmModule::kPageSize; 456 return bytes / WasmModule::kPageSize;
612 } 457 }
613 458
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
649 } 494 }
650 uint32_t compiled_max_pages = compiled_module()->module()->max_mem_pages; 495 uint32_t compiled_max_pages = compiled_module()->module()->max_mem_pages;
651 Isolate* isolate = GetIsolate(); 496 Isolate* isolate = GetIsolate();
652 assert(compiled_module()->module()->is_wasm()); 497 assert(compiled_module()->module()->is_wasm());
653 isolate->counters()->wasm_wasm_max_mem_pages_count()->AddSample( 498 isolate->counters()->wasm_wasm_max_mem_pages_count()->AddSample(
654 compiled_max_pages); 499 compiled_max_pages);
655 if (compiled_max_pages != 0) return compiled_max_pages; 500 if (compiled_max_pages != 0) return compiled_max_pages;
656 return FLAG_wasm_max_mem_pages; 501 return FLAG_wasm_max_mem_pages;
657 } 502 }
658 503
659 WasmInstanceObject* WasmExportedFunction::instance() {
660 return WasmInstanceObject::cast(GetEmbedderField(kInstance));
661 }
662
663 int WasmExportedFunction::function_index() {
664 int32_t func_index;
665 CHECK(GetEmbedderField(kIndex)->ToInt32(&func_index));
666 return func_index;
667 }
668
669 WasmExportedFunction* WasmExportedFunction::cast(Object* object) { 504 WasmExportedFunction* WasmExportedFunction::cast(Object* object) {
670 DCHECK(object && object->IsJSFunction()); 505 DCHECK(object && object->IsJSFunction());
671 DCHECK_EQ(Code::JS_TO_WASM_FUNCTION, 506 DCHECK_EQ(Code::JS_TO_WASM_FUNCTION,
672 JSFunction::cast(object)->code()->kind()); 507 JSFunction::cast(object)->code()->kind());
673 // TODO(titzer): brand check for WasmExportedFunction. 508 // TODO(titzer): brand check for WasmExportedFunction.
674 return reinterpret_cast<WasmExportedFunction*>(object); 509 return reinterpret_cast<WasmExportedFunction*>(object);
675 } 510 }
676 511
677 Handle<WasmExportedFunction> WasmExportedFunction::New( 512 Handle<WasmExportedFunction> WasmExportedFunction::New(
678 Isolate* isolate, Handle<WasmInstanceObject> instance, 513 Isolate* isolate, Handle<WasmInstanceObject> instance,
679 MaybeHandle<String> maybe_name, int func_index, int arity, 514 MaybeHandle<String> maybe_name, int func_index, int arity,
680 Handle<Code> export_wrapper) { 515 Handle<Code> export_wrapper) {
681 Handle<String> name; 516 Handle<String> name;
682 if (maybe_name.is_null()) { 517 if (maybe_name.is_null()) {
683 EmbeddedVector<char, 16> buffer; 518 EmbeddedVector<char, 16> buffer;
684 int length = SNPrintF(buffer, "%d", func_index); 519 int length = SNPrintF(buffer, "%d", func_index);
685 name = isolate->factory() 520 name = isolate->factory()
686 ->NewStringFromOneByte( 521 ->NewStringFromOneByte(
687 Vector<uint8_t>::cast(buffer.SubVector(0, length))) 522 Vector<uint8_t>::cast(buffer.SubVector(0, length)))
688 .ToHandleChecked(); 523 .ToHandleChecked();
689 } else { 524 } else {
690 name = maybe_name.ToHandleChecked(); 525 name = maybe_name.ToHandleChecked();
691 } 526 }
692 DCHECK_EQ(Code::JS_TO_WASM_FUNCTION, export_wrapper->kind()); 527 DCHECK_EQ(Code::JS_TO_WASM_FUNCTION, export_wrapper->kind());
693 Handle<SharedFunctionInfo> shared = 528 Handle<SharedFunctionInfo> shared =
694 isolate->factory()->NewSharedFunctionInfo(name, export_wrapper, false); 529 isolate->factory()->NewSharedFunctionInfo(name, export_wrapper, false);
695 shared->set_length(arity); 530 shared->set_length(arity);
696 shared->set_internal_formal_parameter_count(arity); 531 shared->set_internal_formal_parameter_count(arity);
697 Handle<JSFunction> function = isolate->factory()->NewFunction( 532 Handle<JSFunction> js_function = isolate->factory()->NewFunction(
698 isolate->wasm_function_map(), name, export_wrapper); 533 isolate->wasm_function_map(), name, export_wrapper);
699 function->SetEmbedderField(kWrapperTracerHeader, Smi::kZero); 534
535 Handle<WasmExportedFunction> function(
536 reinterpret_cast<WasmExportedFunction*>(*js_function), isolate);
700 537
701 function->set_shared(*shared); 538 function->set_shared(*shared);
539 function->set_instance(*instance);
540 function->set_function_index(func_index);
702 541
703 function->SetEmbedderField(kInstance, *instance);
704 function->SetEmbedderField(kIndex, Smi::FromInt(func_index));
705 return Handle<WasmExportedFunction>::cast(function); 542 return Handle<WasmExportedFunction>::cast(function);
706 } 543 }
707 544
708 bool WasmSharedModuleData::IsWasmSharedModuleData(Object* object) { 545 bool WasmSharedModuleData::IsWasmSharedModuleData(Object* object) {
709 if (!object->IsFixedArray()) return false; 546 if (!object->IsFixedArray()) return false;
710 FixedArray* arr = FixedArray::cast(object); 547 FixedArray* arr = FixedArray::cast(object);
711 if (arr->length() != kFieldCount) return false; 548 if (arr->length() != kFieldCount) return false;
712 Isolate* isolate = arr->GetIsolate(); 549 Isolate* isolate = arr->GetIsolate();
713 if (!arr->get(kModuleWrapper)->IsForeign()) return false; 550 if (!arr->get(kModuleWrapperIndex)->IsForeign()) return false;
714 if (!arr->get(kModuleBytes)->IsUndefined(isolate) && 551 if (!arr->get(kModuleBytesIndex)->IsUndefined(isolate) &&
715 !arr->get(kModuleBytes)->IsSeqOneByteString()) 552 !arr->get(kModuleBytesIndex)->IsSeqOneByteString())
716 return false; 553 return false;
717 if (!arr->get(kScript)->IsScript()) return false; 554 if (!arr->get(kScriptIndex)->IsScript()) return false;
718 if (!arr->get(kAsmJsOffsetTable)->IsUndefined(isolate) && 555 if (!arr->get(kAsmJsOffsetTableIndex)->IsUndefined(isolate) &&
719 !arr->get(kAsmJsOffsetTable)->IsByteArray()) 556 !arr->get(kAsmJsOffsetTableIndex)->IsByteArray())
720 return false; 557 return false;
721 if (!arr->get(kBreakPointInfos)->IsUndefined(isolate) && 558 if (!arr->get(kBreakPointInfosIndex)->IsUndefined(isolate) &&
722 !arr->get(kBreakPointInfos)->IsFixedArray()) 559 !arr->get(kBreakPointInfosIndex)->IsFixedArray())
723 return false; 560 return false;
724 return true; 561 return true;
725 } 562 }
726 563
727 WasmSharedModuleData* WasmSharedModuleData::cast(Object* object) { 564 WasmSharedModuleData* WasmSharedModuleData::cast(Object* object) {
728 DCHECK(IsWasmSharedModuleData(object)); 565 DCHECK(IsWasmSharedModuleData(object));
729 return reinterpret_cast<WasmSharedModuleData*>(object); 566 return reinterpret_cast<WasmSharedModuleData*>(object);
730 } 567 }
731 568
732 wasm::WasmModule* WasmSharedModuleData::module() { 569 wasm::WasmModule* WasmSharedModuleData::module() {
733 // We populate the kModuleWrapper field with a Foreign holding the 570 // We populate the kModuleWrapper field with a Foreign holding the
734 // address to the address of a WasmModule. This is because we can 571 // address to the address of a WasmModule. This is because we can
735 // handle both cases when the WasmModule's lifetime is managed through 572 // handle both cases when the WasmModule's lifetime is managed through
736 // a Managed<WasmModule> object, as well as cases when it's managed 573 // a Managed<WasmModule> object, as well as cases when it's managed
737 // by the embedder. CcTests fall into the latter case. 574 // by the embedder. CcTests fall into the latter case.
738 return *(reinterpret_cast<wasm::WasmModule**>( 575 return *(reinterpret_cast<wasm::WasmModule**>(
739 Foreign::cast(get(kModuleWrapper))->foreign_address())); 576 Foreign::cast(get(kModuleWrapperIndex))->foreign_address()));
740 } 577 }
741 578
742 DEFINE_OPTIONAL_ARR_ACCESSORS(WasmSharedModuleData, module_bytes, kModuleBytes,
743 SeqOneByteString);
744 DEFINE_ARR_GETTER(WasmSharedModuleData, script, kScript, Script);
745 DEFINE_OPTIONAL_ARR_ACCESSORS(WasmSharedModuleData, asm_js_offset_table,
746 kAsmJsOffsetTable, ByteArray);
747 DEFINE_OPTIONAL_ARR_GETTER(WasmSharedModuleData, breakpoint_infos,
748 kBreakPointInfos, FixedArray);
749 DEFINE_OPTIONAL_ARR_GETTER(WasmSharedModuleData, lazy_compilation_orchestrator,
750 kLazyCompilationOrchestrator, Foreign);
751
752 Handle<WasmSharedModuleData> WasmSharedModuleData::New( 579 Handle<WasmSharedModuleData> WasmSharedModuleData::New(
753 Isolate* isolate, Handle<Foreign> module_wrapper, 580 Isolate* isolate, Handle<Foreign> module_wrapper,
754 Handle<SeqOneByteString> module_bytes, Handle<Script> script, 581 Handle<SeqOneByteString> module_bytes, Handle<Script> script,
755 Handle<ByteArray> asm_js_offset_table) { 582 Handle<ByteArray> asm_js_offset_table) {
756 Handle<FixedArray> arr = 583 Handle<FixedArray> arr =
757 isolate->factory()->NewFixedArray(kFieldCount, TENURED); 584 isolate->factory()->NewFixedArray(kFieldCount, TENURED);
758 arr->set(kWrapperTracerHeader, Smi::kZero); 585 arr->set(kModuleWrapperIndex, *module_wrapper);
759 arr->set(kModuleWrapper, *module_wrapper);
760 if (!module_bytes.is_null()) { 586 if (!module_bytes.is_null()) {
761 arr->set(kModuleBytes, *module_bytes); 587 arr->set(kModuleBytesIndex, *module_bytes);
762 } 588 }
763 if (!script.is_null()) { 589 if (!script.is_null()) {
764 arr->set(kScript, *script); 590 arr->set(kScriptIndex, *script);
765 } 591 }
766 if (!asm_js_offset_table.is_null()) { 592 if (!asm_js_offset_table.is_null()) {
767 arr->set(kAsmJsOffsetTable, *asm_js_offset_table); 593 arr->set(kAsmJsOffsetTableIndex, *asm_js_offset_table);
768 } 594 }
769 595
770 DCHECK(WasmSharedModuleData::IsWasmSharedModuleData(*arr)); 596 DCHECK(WasmSharedModuleData::IsWasmSharedModuleData(*arr));
771 return Handle<WasmSharedModuleData>::cast(arr); 597 return Handle<WasmSharedModuleData>::cast(arr);
772 } 598 }
773 599
600 Foreign* WasmSharedModuleData::lazy_compilation_orchestrator() {
601 return Foreign::cast(get(kLazyCompilationOrchestratorIndex));
602 }
603
774 bool WasmSharedModuleData::is_asm_js() { 604 bool WasmSharedModuleData::is_asm_js() {
775 bool asm_js = module()->is_asm_js(); 605 bool asm_js = module()->is_asm_js();
776 DCHECK_EQ(asm_js, script()->IsUserJavaScript()); 606 DCHECK_EQ(asm_js, script()->IsUserJavaScript());
777 DCHECK_EQ(asm_js, has_asm_js_offset_table()); 607 DCHECK_EQ(asm_js, has_asm_js_offset_table());
778 return asm_js; 608 return asm_js;
779 } 609 }
780 610
781 void WasmSharedModuleData::ReinitializeAfterDeserialization( 611 void WasmSharedModuleData::ReinitializeAfterDeserialization(
782 Isolate* isolate, Handle<WasmSharedModuleData> shared) { 612 Isolate* isolate, Handle<WasmSharedModuleData> shared) {
783 DCHECK(shared->get(kModuleWrapper)->IsUndefined(isolate)); 613 DCHECK(shared->get(kModuleWrapperIndex)->IsUndefined(isolate));
784 #ifdef DEBUG 614 #ifdef DEBUG
785 // No BreakpointInfo objects should survive deserialization. 615 // No BreakpointInfo objects should survive deserialization.
786 if (shared->has_breakpoint_infos()) { 616 if (shared->has_breakpoint_infos()) {
787 for (int i = 0, e = shared->breakpoint_infos()->length(); i < e; ++i) { 617 for (int i = 0, e = shared->breakpoint_infos()->length(); i < e; ++i) {
788 DCHECK(shared->breakpoint_infos()->get(i)->IsUndefined(isolate)); 618 DCHECK(shared->breakpoint_infos()->get(i)->IsUndefined(isolate));
789 } 619 }
790 } 620 }
791 #endif 621 #endif
792 622
793 shared->set(kBreakPointInfos, isolate->heap()->undefined_value()); 623 shared->set(kBreakPointInfosIndex, isolate->heap()->undefined_value());
794 624
795 WasmModule* module = nullptr; 625 WasmModule* module = nullptr;
796 { 626 {
797 // We parse the module again directly from the module bytes, so 627 // We parse the module again directly from the module bytes, so
798 // the underlying storage must not be moved meanwhile. 628 // the underlying storage must not be moved meanwhile.
799 DisallowHeapAllocation no_allocation; 629 DisallowHeapAllocation no_allocation;
800 SeqOneByteString* module_bytes = shared->module_bytes(); 630 SeqOneByteString* module_bytes = shared->module_bytes();
801 const byte* start = 631 const byte* start =
802 reinterpret_cast<const byte*>(module_bytes->GetCharsAddress()); 632 reinterpret_cast<const byte*>(module_bytes->GetCharsAddress());
803 const byte* end = start + module_bytes->length(); 633 const byte* end = start + module_bytes->length();
804 // TODO(titzer): remember the module origin in the compiled_module 634 // TODO(titzer): remember the module origin in the compiled_module
805 // For now, we assume serialized modules did not originate from asm.js. 635 // For now, we assume serialized modules did not originate from asm.js.
806 ModuleResult result = 636 ModuleResult result =
807 SyncDecodeWasmModule(isolate, start, end, false, kWasmOrigin); 637 SyncDecodeWasmModule(isolate, start, end, false, kWasmOrigin);
808 CHECK(result.ok()); 638 CHECK(result.ok());
809 CHECK_NOT_NULL(result.val); 639 CHECK_NOT_NULL(result.val);
810 // Take ownership of the WasmModule and immediately transfer it to the 640 // Take ownership of the WasmModule and immediately transfer it to the
811 // WasmModuleWrapper below. 641 // WasmModuleWrapper below.
812 module = result.val.release(); 642 module = result.val.release();
813 } 643 }
814 644
815 Handle<WasmModuleWrapper> module_wrapper = 645 Handle<WasmModuleWrapper> module_wrapper =
816 WasmModuleWrapper::New(isolate, module); 646 WasmModuleWrapper::New(isolate, module);
817 647
818 shared->set(kModuleWrapper, *module_wrapper); 648 shared->set(kModuleWrapperIndex, *module_wrapper);
819 DCHECK(WasmSharedModuleData::IsWasmSharedModuleData(*shared)); 649 DCHECK(WasmSharedModuleData::IsWasmSharedModuleData(*shared));
820 } 650 }
821 651
822 namespace { 652 namespace {
823 653
824 int GetBreakpointPos(Isolate* isolate, Object* break_point_info_or_undef) { 654 int GetBreakpointPos(Isolate* isolate, Object* break_point_info_or_undef) {
825 if (break_point_info_or_undef->IsUndefined(isolate)) return kMaxInt; 655 if (break_point_info_or_undef->IsUndefined(isolate)) return kMaxInt;
826 return BreakPointInfo::cast(break_point_info_or_undef)->source_position(); 656 return BreakPointInfo::cast(break_point_info_or_undef)->source_position();
827 } 657 }
828 658
(...skipping 24 matching lines...) Expand all
853 683
854 void WasmSharedModuleData::AddBreakpoint(Handle<WasmSharedModuleData> shared, 684 void WasmSharedModuleData::AddBreakpoint(Handle<WasmSharedModuleData> shared,
855 int position, 685 int position,
856 Handle<Object> break_point_object) { 686 Handle<Object> break_point_object) {
857 Isolate* isolate = shared->GetIsolate(); 687 Isolate* isolate = shared->GetIsolate();
858 Handle<FixedArray> breakpoint_infos; 688 Handle<FixedArray> breakpoint_infos;
859 if (shared->has_breakpoint_infos()) { 689 if (shared->has_breakpoint_infos()) {
860 breakpoint_infos = handle(shared->breakpoint_infos(), isolate); 690 breakpoint_infos = handle(shared->breakpoint_infos(), isolate);
861 } else { 691 } else {
862 breakpoint_infos = isolate->factory()->NewFixedArray(4, TENURED); 692 breakpoint_infos = isolate->factory()->NewFixedArray(4, TENURED);
863 shared->set(kBreakPointInfos, *breakpoint_infos); 693 shared->set(kBreakPointInfosIndex, *breakpoint_infos);
864 } 694 }
865 695
866 int insert_pos = 696 int insert_pos =
867 FindBreakpointInfoInsertPos(isolate, breakpoint_infos, position); 697 FindBreakpointInfoInsertPos(isolate, breakpoint_infos, position);
868 698
869 // If a BreakPointInfo object already exists for this position, add the new 699 // If a BreakPointInfo object already exists for this position, add the new
870 // breakpoint object and return. 700 // breakpoint object and return.
871 if (insert_pos < breakpoint_infos->length() && 701 if (insert_pos < breakpoint_infos->length() &&
872 GetBreakpointPos(isolate, breakpoint_infos->get(insert_pos)) == 702 GetBreakpointPos(isolate, breakpoint_infos->get(insert_pos)) ==
873 position) { 703 position) {
874 Handle<BreakPointInfo> old_info( 704 Handle<BreakPointInfo> old_info(
875 BreakPointInfo::cast(breakpoint_infos->get(insert_pos)), isolate); 705 BreakPointInfo::cast(breakpoint_infos->get(insert_pos)), isolate);
876 BreakPointInfo::SetBreakPoint(old_info, break_point_object); 706 BreakPointInfo::SetBreakPoint(old_info, break_point_object);
877 return; 707 return;
878 } 708 }
879 709
880 // Enlarge break positions array if necessary. 710 // Enlarge break positions array if necessary.
881 bool need_realloc = !breakpoint_infos->get(breakpoint_infos->length() - 1) 711 bool need_realloc = !breakpoint_infos->get(breakpoint_infos->length() - 1)
882 ->IsUndefined(isolate); 712 ->IsUndefined(isolate);
883 Handle<FixedArray> new_breakpoint_infos = breakpoint_infos; 713 Handle<FixedArray> new_breakpoint_infos = breakpoint_infos;
884 if (need_realloc) { 714 if (need_realloc) {
885 new_breakpoint_infos = isolate->factory()->NewFixedArray( 715 new_breakpoint_infos = isolate->factory()->NewFixedArray(
886 2 * breakpoint_infos->length(), TENURED); 716 2 * breakpoint_infos->length(), TENURED);
887 shared->set(kBreakPointInfos, *new_breakpoint_infos); 717 shared->set(kBreakPointInfosIndex, *new_breakpoint_infos);
888 // Copy over the entries [0, insert_pos). 718 // Copy over the entries [0, insert_pos).
889 for (int i = 0; i < insert_pos; ++i) 719 for (int i = 0; i < insert_pos; ++i)
890 new_breakpoint_infos->set(i, breakpoint_infos->get(i)); 720 new_breakpoint_infos->set(i, breakpoint_infos->get(i));
891 } 721 }
892 722
893 // Move elements [insert_pos+1, ...] up by one. 723 // Move elements [insert_pos+1, ...] up by one.
894 for (int i = insert_pos + 1; i < breakpoint_infos->length(); ++i) { 724 for (int i = insert_pos + 1; i < breakpoint_infos->length(); ++i) {
895 Object* entry = breakpoint_infos->get(i); 725 Object* entry = breakpoint_infos->get(i);
896 if (entry->IsUndefined(isolate)) break; 726 if (entry->IsUndefined(isolate)) break;
897 new_breakpoint_infos->set(i + 1, entry); 727 new_breakpoint_infos->set(i + 1, entry);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
939 } 769 }
940 } 770 }
941 771
942 void WasmSharedModuleData::PrepareForLazyCompilation( 772 void WasmSharedModuleData::PrepareForLazyCompilation(
943 Handle<WasmSharedModuleData> shared) { 773 Handle<WasmSharedModuleData> shared) {
944 if (shared->has_lazy_compilation_orchestrator()) return; 774 if (shared->has_lazy_compilation_orchestrator()) return;
945 Isolate* isolate = shared->GetIsolate(); 775 Isolate* isolate = shared->GetIsolate();
946 LazyCompilationOrchestrator* orch = new LazyCompilationOrchestrator(); 776 LazyCompilationOrchestrator* orch = new LazyCompilationOrchestrator();
947 Handle<Managed<LazyCompilationOrchestrator>> orch_handle = 777 Handle<Managed<LazyCompilationOrchestrator>> orch_handle =
948 Managed<LazyCompilationOrchestrator>::New(isolate, orch); 778 Managed<LazyCompilationOrchestrator>::New(isolate, orch);
949 shared->set(WasmSharedModuleData::kLazyCompilationOrchestrator, *orch_handle); 779 shared->set(kLazyCompilationOrchestratorIndex, *orch_handle);
950 } 780 }
951 781
952 Handle<WasmCompiledModule> WasmCompiledModule::New( 782 Handle<WasmCompiledModule> WasmCompiledModule::New(
953 Isolate* isolate, Handle<WasmSharedModuleData> shared, 783 Isolate* isolate, Handle<WasmSharedModuleData> shared,
954 Handle<FixedArray> code_table, 784 Handle<FixedArray> code_table,
955 MaybeHandle<FixedArray> maybe_empty_function_tables, 785 MaybeHandle<FixedArray> maybe_empty_function_tables,
956 MaybeHandle<FixedArray> maybe_signature_tables) { 786 MaybeHandle<FixedArray> maybe_signature_tables) {
957 Handle<FixedArray> ret = 787 Handle<FixedArray> ret =
958 isolate->factory()->NewFixedArray(PropertyIndices::Count, TENURED); 788 isolate->factory()->NewFixedArray(PropertyIndices::Count, TENURED);
959 // WasmCompiledModule::cast would fail since fields are not set yet. 789 // WasmCompiledModule::cast would fail since fields are not set yet.
(...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after
1568 instance->compiled_module()->shared()->lazy_compilation_orchestrator(); 1398 instance->compiled_module()->shared()->lazy_compilation_orchestrator();
1569 LazyCompilationOrchestrator* orch = 1399 LazyCompilationOrchestrator* orch =
1570 Managed<LazyCompilationOrchestrator>::cast(orch_obj)->get(); 1400 Managed<LazyCompilationOrchestrator>::cast(orch_obj)->get();
1571 return orch->CompileLazy(isolate, instance, caller, offset, func_index, 1401 return orch->CompileLazy(isolate, instance, caller, offset, func_index,
1572 patch_caller); 1402 patch_caller);
1573 } 1403 }
1574 1404
1575 Handle<WasmInstanceWrapper> WasmInstanceWrapper::New( 1405 Handle<WasmInstanceWrapper> WasmInstanceWrapper::New(
1576 Isolate* isolate, Handle<WasmInstanceObject> instance) { 1406 Isolate* isolate, Handle<WasmInstanceObject> instance) {
1577 Handle<FixedArray> array = 1407 Handle<FixedArray> array =
1578 isolate->factory()->NewFixedArray(kWrapperPropertyCount, TENURED); 1408 isolate->factory()->NewFixedArray(kFieldCount, TENURED);
1579 Handle<WasmInstanceWrapper> instance_wrapper( 1409 Handle<WasmInstanceWrapper> instance_wrapper(
1580 reinterpret_cast<WasmInstanceWrapper*>(*array), isolate); 1410 reinterpret_cast<WasmInstanceWrapper*>(*array), isolate);
1581 Handle<WeakCell> cell = isolate->factory()->NewWeakCell(instance); 1411 Handle<WeakCell> cell = isolate->factory()->NewWeakCell(instance);
1582 instance_wrapper->set(kWrapperInstanceObject, *cell); 1412 instance_wrapper->set(kWrapperInstanceObjectIndex, *cell);
1583 return instance_wrapper; 1413 return instance_wrapper;
1584 } 1414 }
1585 1415
1586 bool WasmInstanceWrapper::IsWasmInstanceWrapper(Object* obj) { 1416 bool WasmInstanceWrapper::IsWasmInstanceWrapper(Object* obj) {
1587 if (!obj->IsFixedArray()) return false; 1417 if (!obj->IsFixedArray()) return false;
1588 Handle<FixedArray> array = handle(FixedArray::cast(obj)); 1418 Handle<FixedArray> array = handle(FixedArray::cast(obj));
1589 if (array->length() != kWrapperPropertyCount) return false; 1419 if (array->length() != kFieldCount) return false;
1590 if (!array->get(kWrapperInstanceObject)->IsWeakCell()) return false; 1420 if (!array->get(kWrapperInstanceObjectIndex)->IsWeakCell()) return false;
1591 Isolate* isolate = array->GetIsolate(); 1421 Isolate* isolate = array->GetIsolate();
1592 if (!array->get(kNextInstanceWrapper)->IsUndefined(isolate) && 1422 if (!array->get(kNextInstanceWrapperIndex)->IsUndefined(isolate) &&
1593 !array->get(kNextInstanceWrapper)->IsFixedArray()) 1423 !array->get(kNextInstanceWrapperIndex)->IsFixedArray())
1594 return false; 1424 return false;
1595 if (!array->get(kPreviousInstanceWrapper)->IsUndefined(isolate) && 1425 if (!array->get(kPreviousInstanceWrapperIndex)->IsUndefined(isolate) &&
1596 !array->get(kPreviousInstanceWrapper)->IsFixedArray()) 1426 !array->get(kPreviousInstanceWrapperIndex)->IsFixedArray())
1597 return false; 1427 return false;
1598 return true; 1428 return true;
1599 } 1429 }
1600
1601 DEFINE_OPTIONAL_ARR_ACCESSORS(WasmDebugInfo, locals_names, kLocalsNames,
1602 FixedArray)
OLDNEW
« no previous file with comments | « src/wasm/wasm-objects.h ('k') | test/cctest/wasm/test-run-wasm-module.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698