OLD | NEW |
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/base/iterator.h" | 8 #include "src/base/iterator.h" |
9 #include "src/debug/debug-interface.h" | 9 #include "src/debug/debug-interface.h" |
10 #include "src/objects-inl.h" | 10 #include "src/objects-inl.h" |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 #define DEFINE_OPTIONAL_GETTER0(getter, Container, name, field, type) \ | 42 #define DEFINE_OPTIONAL_GETTER0(getter, Container, name, field, type) \ |
43 DEFINE_GETTER0(getter, Container, name, field, type) \ | 43 DEFINE_GETTER0(getter, Container, name, field, type) \ |
44 bool Container::has_##name() { \ | 44 bool Container::has_##name() { \ |
45 return !getter(field)->IsUndefined(GetIsolate()); \ | 45 return !getter(field)->IsUndefined(GetIsolate()); \ |
46 } | 46 } |
47 | 47 |
48 #define DEFINE_GETTER0(getter, Container, name, field, type) \ | 48 #define DEFINE_GETTER0(getter, Container, name, field, type) \ |
49 type* Container::name() { return type::cast(getter(field)); } | 49 type* Container::name() { return type::cast(getter(field)); } |
50 | 50 |
51 #define DEFINE_OBJ_GETTER(Container, name, field, type) \ | 51 #define DEFINE_OBJ_GETTER(Container, name, field, type) \ |
52 DEFINE_GETTER0(GetInternalField, Container, name, field, type) | 52 DEFINE_GETTER0(GetEmbedderField, Container, name, field, type) |
53 #define DEFINE_OBJ_ACCESSORS(Container, name, field, type) \ | 53 #define DEFINE_OBJ_ACCESSORS(Container, name, field, type) \ |
54 DEFINE_ACCESSORS0(GetInternalField, SetInternalField, Container, name, \ | 54 DEFINE_ACCESSORS0(GetEmbedderField, SetEmbedderField, Container, name, \ |
55 field, type) | 55 field, type) |
56 #define DEFINE_OPTIONAL_OBJ_ACCESSORS(Container, name, field, type) \ | 56 #define DEFINE_OPTIONAL_OBJ_ACCESSORS(Container, name, field, type) \ |
57 DEFINE_OPTIONAL_ACCESSORS0(GetInternalField, SetInternalField, Container, \ | 57 DEFINE_OPTIONAL_ACCESSORS0(GetEmbedderField, SetEmbedderField, Container, \ |
58 name, field, type) | 58 name, field, type) |
59 #define DEFINE_ARR_GETTER(Container, name, field, type) \ | 59 #define DEFINE_ARR_GETTER(Container, name, field, type) \ |
60 DEFINE_GETTER0(get, Container, name, field, type) | 60 DEFINE_GETTER0(get, Container, name, field, type) |
61 #define DEFINE_ARR_ACCESSORS(Container, name, field, type) \ | 61 #define DEFINE_ARR_ACCESSORS(Container, name, field, type) \ |
62 DEFINE_ACCESSORS0(get, set, Container, name, field, type) | 62 DEFINE_ACCESSORS0(get, set, Container, name, field, type) |
63 #define DEFINE_OPTIONAL_ARR_ACCESSORS(Container, name, field, type) \ | 63 #define DEFINE_OPTIONAL_ARR_ACCESSORS(Container, name, field, type) \ |
64 DEFINE_OPTIONAL_ACCESSORS0(get, set, Container, name, field, type) | 64 DEFINE_OPTIONAL_ACCESSORS0(get, set, Container, name, field, type) |
65 #define DEFINE_OPTIONAL_ARR_GETTER(Container, name, field, type) \ | 65 #define DEFINE_OPTIONAL_ARR_GETTER(Container, name, field, type) \ |
66 DEFINE_OPTIONAL_GETTER0(get, Container, name, field, type) | 66 DEFINE_OPTIONAL_GETTER0(get, Container, name, field, type) |
67 | 67 |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
228 Handle<Symbol> module_sym(isolate->native_context()->wasm_module_sym()); | 228 Handle<Symbol> module_sym(isolate->native_context()->wasm_module_sym()); |
229 Object::SetProperty(module_object, module_sym, module_object, STRICT) | 229 Object::SetProperty(module_object, module_sym, module_object, STRICT) |
230 .Check(); | 230 .Check(); |
231 } else { | 231 } else { |
232 DCHECK(origin == ModuleOrigin::kAsmJsOrigin); | 232 DCHECK(origin == ModuleOrigin::kAsmJsOrigin); |
233 Handle<Map> map = isolate->factory()->NewMap( | 233 Handle<Map> map = isolate->factory()->NewMap( |
234 JS_OBJECT_TYPE, | 234 JS_OBJECT_TYPE, |
235 JSObject::kHeaderSize + WasmModuleObject::kFieldCount * kPointerSize); | 235 JSObject::kHeaderSize + WasmModuleObject::kFieldCount * kPointerSize); |
236 module_object = isolate->factory()->NewJSObjectFromMap(map, TENURED); | 236 module_object = isolate->factory()->NewJSObjectFromMap(map, TENURED); |
237 } | 237 } |
238 module_object->SetInternalField(WasmModuleObject::kCompiledModule, | 238 module_object->SetEmbedderField(WasmModuleObject::kCompiledModule, |
239 *compiled_module); | 239 *compiled_module); |
240 Handle<WeakCell> link_to_module = | 240 Handle<WeakCell> link_to_module = |
241 isolate->factory()->NewWeakCell(module_object); | 241 isolate->factory()->NewWeakCell(module_object); |
242 compiled_module->set_weak_wasm_module(link_to_module); | 242 compiled_module->set_weak_wasm_module(link_to_module); |
243 return Handle<WasmModuleObject>::cast(module_object); | 243 return Handle<WasmModuleObject>::cast(module_object); |
244 } | 244 } |
245 | 245 |
246 WasmModuleObject* WasmModuleObject::cast(Object* object) { | 246 WasmModuleObject* WasmModuleObject::cast(Object* object) { |
247 DCHECK(object->IsJSObject()); | 247 DCHECK(object->IsJSObject()); |
248 // TODO(titzer): brand check for WasmModuleObject. | 248 // TODO(titzer): brand check for WasmModuleObject. |
249 return reinterpret_cast<WasmModuleObject*>(object); | 249 return reinterpret_cast<WasmModuleObject*>(object); |
250 } | 250 } |
251 | 251 |
252 bool WasmModuleObject::IsWasmModuleObject(Object* object) { | 252 bool WasmModuleObject::IsWasmModuleObject(Object* object) { |
253 return object->IsJSObject() && | 253 return object->IsJSObject() && |
254 JSObject::cast(object)->GetInternalFieldCount() == kFieldCount; | 254 JSObject::cast(object)->GetEmbedderFieldCount() == kFieldCount; |
255 } | 255 } |
256 | 256 |
257 DEFINE_OBJ_GETTER(WasmModuleObject, compiled_module, kCompiledModule, | 257 DEFINE_OBJ_GETTER(WasmModuleObject, compiled_module, kCompiledModule, |
258 WasmCompiledModule) | 258 WasmCompiledModule) |
259 | 259 |
260 Handle<WasmTableObject> WasmTableObject::New(Isolate* isolate, uint32_t initial, | 260 Handle<WasmTableObject> WasmTableObject::New(Isolate* isolate, uint32_t initial, |
261 int64_t maximum, | 261 int64_t maximum, |
262 Handle<FixedArray>* js_functions) { | 262 Handle<FixedArray>* js_functions) { |
263 Handle<JSFunction> table_ctor( | 263 Handle<JSFunction> table_ctor( |
264 isolate->native_context()->wasm_table_constructor()); | 264 isolate->native_context()->wasm_table_constructor()); |
265 Handle<JSObject> table_obj = isolate->factory()->NewJSObject(table_ctor); | 265 Handle<JSObject> table_obj = isolate->factory()->NewJSObject(table_ctor); |
266 table_obj->SetInternalField(kWrapperTracerHeader, Smi::kZero); | 266 table_obj->SetEmbedderField(kWrapperTracerHeader, Smi::kZero); |
267 | 267 |
268 *js_functions = isolate->factory()->NewFixedArray(initial); | 268 *js_functions = isolate->factory()->NewFixedArray(initial); |
269 Object* null = isolate->heap()->null_value(); | 269 Object* null = isolate->heap()->null_value(); |
270 for (int i = 0; i < static_cast<int>(initial); ++i) { | 270 for (int i = 0; i < static_cast<int>(initial); ++i) { |
271 (*js_functions)->set(i, null); | 271 (*js_functions)->set(i, null); |
272 } | 272 } |
273 table_obj->SetInternalField(kFunctions, *(*js_functions)); | 273 table_obj->SetEmbedderField(kFunctions, *(*js_functions)); |
274 Handle<Object> max = isolate->factory()->NewNumber(maximum); | 274 Handle<Object> max = isolate->factory()->NewNumber(maximum); |
275 table_obj->SetInternalField(kMaximum, *max); | 275 table_obj->SetEmbedderField(kMaximum, *max); |
276 | 276 |
277 Handle<FixedArray> dispatch_tables = isolate->factory()->NewFixedArray(0); | 277 Handle<FixedArray> dispatch_tables = isolate->factory()->NewFixedArray(0); |
278 table_obj->SetInternalField(kDispatchTables, *dispatch_tables); | 278 table_obj->SetEmbedderField(kDispatchTables, *dispatch_tables); |
279 Handle<Symbol> table_sym(isolate->native_context()->wasm_table_sym()); | 279 Handle<Symbol> table_sym(isolate->native_context()->wasm_table_sym()); |
280 Object::SetProperty(table_obj, table_sym, table_obj, STRICT).Check(); | 280 Object::SetProperty(table_obj, table_sym, table_obj, STRICT).Check(); |
281 return Handle<WasmTableObject>::cast(table_obj); | 281 return Handle<WasmTableObject>::cast(table_obj); |
282 } | 282 } |
283 | 283 |
284 DEFINE_OBJ_GETTER(WasmTableObject, dispatch_tables, kDispatchTables, FixedArray) | 284 DEFINE_OBJ_GETTER(WasmTableObject, dispatch_tables, kDispatchTables, FixedArray) |
285 | 285 |
286 Handle<FixedArray> WasmTableObject::AddDispatchTable( | 286 Handle<FixedArray> WasmTableObject::AddDispatchTable( |
287 Isolate* isolate, Handle<WasmTableObject> table_obj, | 287 Isolate* isolate, Handle<WasmTableObject> table_obj, |
288 Handle<WasmInstanceObject> instance, int table_index, | 288 Handle<WasmInstanceObject> instance, int table_index, |
289 Handle<FixedArray> function_table, Handle<FixedArray> signature_table) { | 289 Handle<FixedArray> function_table, Handle<FixedArray> signature_table) { |
290 Handle<FixedArray> dispatch_tables( | 290 Handle<FixedArray> dispatch_tables( |
291 FixedArray::cast(table_obj->GetInternalField(kDispatchTables)), isolate); | 291 FixedArray::cast(table_obj->GetEmbedderField(kDispatchTables)), isolate); |
292 DCHECK_EQ(0, dispatch_tables->length() % 4); | 292 DCHECK_EQ(0, dispatch_tables->length() % 4); |
293 | 293 |
294 if (instance.is_null()) return dispatch_tables; | 294 if (instance.is_null()) return dispatch_tables; |
295 // TODO(titzer): use weak cells here to avoid leaking instances. | 295 // TODO(titzer): use weak cells here to avoid leaking instances. |
296 | 296 |
297 // Grow the dispatch table and add a new triple at the end. | 297 // Grow the dispatch table and add a new triple at the end. |
298 Handle<FixedArray> new_dispatch_tables = | 298 Handle<FixedArray> new_dispatch_tables = |
299 isolate->factory()->CopyFixedArrayAndGrow(dispatch_tables, 4); | 299 isolate->factory()->CopyFixedArrayAndGrow(dispatch_tables, 4); |
300 | 300 |
301 new_dispatch_tables->set(dispatch_tables->length() + 0, *instance); | 301 new_dispatch_tables->set(dispatch_tables->length() + 0, *instance); |
302 new_dispatch_tables->set(dispatch_tables->length() + 1, | 302 new_dispatch_tables->set(dispatch_tables->length() + 1, |
303 Smi::FromInt(table_index)); | 303 Smi::FromInt(table_index)); |
304 new_dispatch_tables->set(dispatch_tables->length() + 2, *function_table); | 304 new_dispatch_tables->set(dispatch_tables->length() + 2, *function_table); |
305 new_dispatch_tables->set(dispatch_tables->length() + 3, *signature_table); | 305 new_dispatch_tables->set(dispatch_tables->length() + 3, *signature_table); |
306 | 306 |
307 table_obj->SetInternalField(WasmTableObject::kDispatchTables, | 307 table_obj->SetEmbedderField(WasmTableObject::kDispatchTables, |
308 *new_dispatch_tables); | 308 *new_dispatch_tables); |
309 | 309 |
310 return new_dispatch_tables; | 310 return new_dispatch_tables; |
311 } | 311 } |
312 | 312 |
313 DEFINE_OBJ_ACCESSORS(WasmTableObject, functions, kFunctions, FixedArray) | 313 DEFINE_OBJ_ACCESSORS(WasmTableObject, functions, kFunctions, FixedArray) |
314 | 314 |
315 uint32_t WasmTableObject::current_length() { return functions()->length(); } | 315 uint32_t WasmTableObject::current_length() { return functions()->length(); } |
316 | 316 |
317 bool WasmTableObject::has_maximum_length() { | 317 bool WasmTableObject::has_maximum_length() { |
318 return GetInternalField(kMaximum)->Number() >= 0; | 318 return GetEmbedderField(kMaximum)->Number() >= 0; |
319 } | 319 } |
320 | 320 |
321 int64_t WasmTableObject::maximum_length() { | 321 int64_t WasmTableObject::maximum_length() { |
322 return static_cast<int64_t>(GetInternalField(kMaximum)->Number()); | 322 return static_cast<int64_t>(GetEmbedderField(kMaximum)->Number()); |
323 } | 323 } |
324 | 324 |
325 WasmTableObject* WasmTableObject::cast(Object* object) { | 325 WasmTableObject* WasmTableObject::cast(Object* object) { |
326 DCHECK(object && object->IsJSObject()); | 326 DCHECK(object && object->IsJSObject()); |
327 // TODO(titzer): brand check for WasmTableObject. | 327 // TODO(titzer): brand check for WasmTableObject. |
328 return reinterpret_cast<WasmTableObject*>(object); | 328 return reinterpret_cast<WasmTableObject*>(object); |
329 } | 329 } |
330 | 330 |
331 void WasmTableObject::Grow(Isolate* isolate, Handle<WasmTableObject> table, | 331 void WasmTableObject::Grow(Isolate* isolate, Handle<WasmTableObject> table, |
332 uint32_t count) { | 332 uint32_t count) { |
333 Handle<FixedArray> dispatch_tables(table->dispatch_tables()); | 333 Handle<FixedArray> dispatch_tables(table->dispatch_tables()); |
334 wasm::GrowDispatchTables(isolate, dispatch_tables, | 334 wasm::GrowDispatchTables(isolate, dispatch_tables, |
335 table->functions()->length(), count); | 335 table->functions()->length(), count); |
336 } | 336 } |
337 | 337 |
338 Handle<WasmMemoryObject> WasmMemoryObject::New(Isolate* isolate, | 338 Handle<WasmMemoryObject> WasmMemoryObject::New(Isolate* isolate, |
339 Handle<JSArrayBuffer> buffer, | 339 Handle<JSArrayBuffer> buffer, |
340 int32_t maximum) { | 340 int32_t maximum) { |
341 Handle<JSFunction> memory_ctor( | 341 Handle<JSFunction> memory_ctor( |
342 isolate->native_context()->wasm_memory_constructor()); | 342 isolate->native_context()->wasm_memory_constructor()); |
343 Handle<JSObject> memory_obj = | 343 Handle<JSObject> memory_obj = |
344 isolate->factory()->NewJSObject(memory_ctor, TENURED); | 344 isolate->factory()->NewJSObject(memory_ctor, TENURED); |
345 memory_obj->SetInternalField(kWrapperTracerHeader, Smi::kZero); | 345 memory_obj->SetEmbedderField(kWrapperTracerHeader, Smi::kZero); |
346 | 346 |
347 memory_obj->SetInternalField(kArrayBuffer, *buffer); | 347 memory_obj->SetEmbedderField(kArrayBuffer, *buffer); |
348 Handle<Object> max = isolate->factory()->NewNumber(maximum); | 348 Handle<Object> max = isolate->factory()->NewNumber(maximum); |
349 memory_obj->SetInternalField(kMaximum, *max); | 349 memory_obj->SetEmbedderField(kMaximum, *max); |
350 Handle<Symbol> memory_sym(isolate->native_context()->wasm_memory_sym()); | 350 Handle<Symbol> memory_sym(isolate->native_context()->wasm_memory_sym()); |
351 Object::SetProperty(memory_obj, memory_sym, memory_obj, STRICT).Check(); | 351 Object::SetProperty(memory_obj, memory_sym, memory_obj, STRICT).Check(); |
352 return Handle<WasmMemoryObject>::cast(memory_obj); | 352 return Handle<WasmMemoryObject>::cast(memory_obj); |
353 } | 353 } |
354 | 354 |
355 DEFINE_OBJ_ACCESSORS(WasmMemoryObject, buffer, kArrayBuffer, JSArrayBuffer) | 355 DEFINE_OBJ_ACCESSORS(WasmMemoryObject, buffer, kArrayBuffer, JSArrayBuffer) |
356 DEFINE_OPTIONAL_OBJ_ACCESSORS(WasmMemoryObject, instances_link, kInstancesLink, | 356 DEFINE_OPTIONAL_OBJ_ACCESSORS(WasmMemoryObject, instances_link, kInstancesLink, |
357 WasmInstanceWrapper) | 357 WasmInstanceWrapper) |
358 | 358 |
359 uint32_t WasmMemoryObject::current_pages() { | 359 uint32_t WasmMemoryObject::current_pages() { |
360 return SafeUint32(buffer()->byte_length()) / wasm::WasmModule::kPageSize; | 360 return SafeUint32(buffer()->byte_length()) / wasm::WasmModule::kPageSize; |
361 } | 361 } |
362 | 362 |
363 bool WasmMemoryObject::has_maximum_pages() { | 363 bool WasmMemoryObject::has_maximum_pages() { |
364 return GetInternalField(kMaximum)->Number() >= 0; | 364 return GetEmbedderField(kMaximum)->Number() >= 0; |
365 } | 365 } |
366 | 366 |
367 int32_t WasmMemoryObject::maximum_pages() { | 367 int32_t WasmMemoryObject::maximum_pages() { |
368 return static_cast<int32_t>(GetInternalField(kMaximum)->Number()); | 368 return static_cast<int32_t>(GetEmbedderField(kMaximum)->Number()); |
369 } | 369 } |
370 | 370 |
371 WasmMemoryObject* WasmMemoryObject::cast(Object* object) { | 371 WasmMemoryObject* WasmMemoryObject::cast(Object* object) { |
372 DCHECK(object && object->IsJSObject()); | 372 DCHECK(object && object->IsJSObject()); |
373 // TODO(titzer): brand check for WasmMemoryObject. | 373 // TODO(titzer): brand check for WasmMemoryObject. |
374 return reinterpret_cast<WasmMemoryObject*>(object); | 374 return reinterpret_cast<WasmMemoryObject*>(object); |
375 } | 375 } |
376 | 376 |
377 void WasmMemoryObject::AddInstance(Isolate* isolate, | 377 void WasmMemoryObject::AddInstance(Isolate* isolate, |
378 Handle<WasmInstanceObject> instance) { | 378 Handle<WasmInstanceObject> instance) { |
379 Handle<WasmInstanceWrapper> instance_wrapper = | 379 Handle<WasmInstanceWrapper> instance_wrapper = |
380 handle(instance->instance_wrapper()); | 380 handle(instance->instance_wrapper()); |
381 if (has_instances_link()) { | 381 if (has_instances_link()) { |
382 Handle<WasmInstanceWrapper> current_wrapper(instances_link()); | 382 Handle<WasmInstanceWrapper> current_wrapper(instances_link()); |
383 DCHECK(WasmInstanceWrapper::IsWasmInstanceWrapper(*current_wrapper)); | 383 DCHECK(WasmInstanceWrapper::IsWasmInstanceWrapper(*current_wrapper)); |
384 DCHECK(!current_wrapper->has_previous()); | 384 DCHECK(!current_wrapper->has_previous()); |
385 instance_wrapper->set_next_wrapper(*current_wrapper); | 385 instance_wrapper->set_next_wrapper(*current_wrapper); |
386 current_wrapper->set_previous_wrapper(*instance_wrapper); | 386 current_wrapper->set_previous_wrapper(*instance_wrapper); |
387 } | 387 } |
388 set_instances_link(*instance_wrapper); | 388 set_instances_link(*instance_wrapper); |
389 } | 389 } |
390 | 390 |
391 void WasmMemoryObject::ResetInstancesLink(Isolate* isolate) { | 391 void WasmMemoryObject::ResetInstancesLink(Isolate* isolate) { |
392 Handle<Object> undefined = isolate->factory()->undefined_value(); | 392 Handle<Object> undefined = isolate->factory()->undefined_value(); |
393 SetInternalField(kInstancesLink, *undefined); | 393 SetEmbedderField(kInstancesLink, *undefined); |
394 } | 394 } |
395 | 395 |
396 DEFINE_OBJ_ACCESSORS(WasmInstanceObject, compiled_module, kCompiledModule, | 396 DEFINE_OBJ_ACCESSORS(WasmInstanceObject, compiled_module, kCompiledModule, |
397 WasmCompiledModule) | 397 WasmCompiledModule) |
398 DEFINE_OPTIONAL_OBJ_ACCESSORS(WasmInstanceObject, globals_buffer, | 398 DEFINE_OPTIONAL_OBJ_ACCESSORS(WasmInstanceObject, globals_buffer, |
399 kGlobalsArrayBuffer, JSArrayBuffer) | 399 kGlobalsArrayBuffer, JSArrayBuffer) |
400 DEFINE_OPTIONAL_OBJ_ACCESSORS(WasmInstanceObject, memory_buffer, | 400 DEFINE_OPTIONAL_OBJ_ACCESSORS(WasmInstanceObject, memory_buffer, |
401 kMemoryArrayBuffer, JSArrayBuffer) | 401 kMemoryArrayBuffer, JSArrayBuffer) |
402 DEFINE_OPTIONAL_OBJ_ACCESSORS(WasmInstanceObject, memory_object, kMemoryObject, | 402 DEFINE_OPTIONAL_OBJ_ACCESSORS(WasmInstanceObject, memory_object, kMemoryObject, |
403 WasmMemoryObject) | 403 WasmMemoryObject) |
(...skipping 19 matching lines...) Expand all Loading... |
423 WasmInstanceObject* WasmInstanceObject::cast(Object* object) { | 423 WasmInstanceObject* WasmInstanceObject::cast(Object* object) { |
424 DCHECK(IsWasmInstanceObject(object)); | 424 DCHECK(IsWasmInstanceObject(object)); |
425 return reinterpret_cast<WasmInstanceObject*>(object); | 425 return reinterpret_cast<WasmInstanceObject*>(object); |
426 } | 426 } |
427 | 427 |
428 bool WasmInstanceObject::IsWasmInstanceObject(Object* object) { | 428 bool WasmInstanceObject::IsWasmInstanceObject(Object* object) { |
429 if (!object->IsJSObject()) return false; | 429 if (!object->IsJSObject()) return false; |
430 | 430 |
431 JSObject* obj = JSObject::cast(object); | 431 JSObject* obj = JSObject::cast(object); |
432 Isolate* isolate = obj->GetIsolate(); | 432 Isolate* isolate = obj->GetIsolate(); |
433 if (obj->GetInternalFieldCount() != kFieldCount) { | 433 if (obj->GetEmbedderFieldCount() != kFieldCount) { |
434 return false; | 434 return false; |
435 } | 435 } |
436 | 436 |
437 Object* mem = obj->GetInternalField(kMemoryArrayBuffer); | 437 Object* mem = obj->GetEmbedderField(kMemoryArrayBuffer); |
438 if (!(mem->IsUndefined(isolate) || mem->IsJSArrayBuffer()) || | 438 if (!(mem->IsUndefined(isolate) || mem->IsJSArrayBuffer()) || |
439 !WasmCompiledModule::IsWasmCompiledModule( | 439 !WasmCompiledModule::IsWasmCompiledModule( |
440 obj->GetInternalField(kCompiledModule))) { | 440 obj->GetEmbedderField(kCompiledModule))) { |
441 return false; | 441 return false; |
442 } | 442 } |
443 | 443 |
444 // All checks passed. | 444 // All checks passed. |
445 return true; | 445 return true; |
446 } | 446 } |
447 | 447 |
448 Handle<WasmInstanceObject> WasmInstanceObject::New( | 448 Handle<WasmInstanceObject> WasmInstanceObject::New( |
449 Isolate* isolate, Handle<WasmCompiledModule> compiled_module) { | 449 Isolate* isolate, Handle<WasmCompiledModule> compiled_module) { |
450 Handle<JSFunction> instance_cons( | 450 Handle<JSFunction> instance_cons( |
451 isolate->native_context()->wasm_instance_constructor()); | 451 isolate->native_context()->wasm_instance_constructor()); |
452 Handle<JSObject> instance_object = | 452 Handle<JSObject> instance_object = |
453 isolate->factory()->NewJSObject(instance_cons, TENURED); | 453 isolate->factory()->NewJSObject(instance_cons, TENURED); |
454 instance_object->SetInternalField(kWrapperTracerHeader, Smi::kZero); | 454 instance_object->SetEmbedderField(kWrapperTracerHeader, Smi::kZero); |
455 | 455 |
456 Handle<Symbol> instance_sym(isolate->native_context()->wasm_instance_sym()); | 456 Handle<Symbol> instance_sym(isolate->native_context()->wasm_instance_sym()); |
457 Object::SetProperty(instance_object, instance_sym, instance_object, STRICT) | 457 Object::SetProperty(instance_object, instance_sym, instance_object, STRICT) |
458 .Check(); | 458 .Check(); |
459 Handle<WasmInstanceObject> instance( | 459 Handle<WasmInstanceObject> instance( |
460 reinterpret_cast<WasmInstanceObject*>(*instance_object), isolate); | 460 reinterpret_cast<WasmInstanceObject*>(*instance_object), isolate); |
461 | 461 |
462 instance->SetInternalField(kCompiledModule, *compiled_module); | 462 instance->SetEmbedderField(kCompiledModule, *compiled_module); |
463 instance->SetInternalField(kMemoryObject, isolate->heap()->undefined_value()); | 463 instance->SetEmbedderField(kMemoryObject, isolate->heap()->undefined_value()); |
464 Handle<WasmInstanceWrapper> instance_wrapper = | 464 Handle<WasmInstanceWrapper> instance_wrapper = |
465 WasmInstanceWrapper::New(isolate, instance); | 465 WasmInstanceWrapper::New(isolate, instance); |
466 instance->SetInternalField(kWasmMemInstanceWrapper, *instance_wrapper); | 466 instance->SetEmbedderField(kWasmMemInstanceWrapper, *instance_wrapper); |
467 return instance; | 467 return instance; |
468 } | 468 } |
469 | 469 |
470 WasmInstanceObject* WasmExportedFunction::instance() { | 470 WasmInstanceObject* WasmExportedFunction::instance() { |
471 return WasmInstanceObject::cast(GetInternalField(kInstance)); | 471 return WasmInstanceObject::cast(GetEmbedderField(kInstance)); |
472 } | 472 } |
473 | 473 |
474 int WasmExportedFunction::function_index() { | 474 int WasmExportedFunction::function_index() { |
475 return SafeInt32(GetInternalField(kIndex)); | 475 return SafeInt32(GetEmbedderField(kIndex)); |
476 } | 476 } |
477 | 477 |
478 WasmExportedFunction* WasmExportedFunction::cast(Object* object) { | 478 WasmExportedFunction* WasmExportedFunction::cast(Object* object) { |
479 DCHECK(object && object->IsJSFunction()); | 479 DCHECK(object && object->IsJSFunction()); |
480 DCHECK_EQ(Code::JS_TO_WASM_FUNCTION, | 480 DCHECK_EQ(Code::JS_TO_WASM_FUNCTION, |
481 JSFunction::cast(object)->code()->kind()); | 481 JSFunction::cast(object)->code()->kind()); |
482 // TODO(titzer): brand check for WasmExportedFunction. | 482 // TODO(titzer): brand check for WasmExportedFunction. |
483 return reinterpret_cast<WasmExportedFunction*>(object); | 483 return reinterpret_cast<WasmExportedFunction*>(object); |
484 } | 484 } |
485 | 485 |
(...skipping 12 matching lines...) Expand all Loading... |
498 } else { | 498 } else { |
499 name = maybe_name.ToHandleChecked(); | 499 name = maybe_name.ToHandleChecked(); |
500 } | 500 } |
501 DCHECK_EQ(Code::JS_TO_WASM_FUNCTION, export_wrapper->kind()); | 501 DCHECK_EQ(Code::JS_TO_WASM_FUNCTION, export_wrapper->kind()); |
502 Handle<SharedFunctionInfo> shared = | 502 Handle<SharedFunctionInfo> shared = |
503 isolate->factory()->NewSharedFunctionInfo(name, export_wrapper, false); | 503 isolate->factory()->NewSharedFunctionInfo(name, export_wrapper, false); |
504 shared->set_length(arity); | 504 shared->set_length(arity); |
505 shared->set_internal_formal_parameter_count(arity); | 505 shared->set_internal_formal_parameter_count(arity); |
506 Handle<JSFunction> function = isolate->factory()->NewFunction( | 506 Handle<JSFunction> function = isolate->factory()->NewFunction( |
507 isolate->wasm_function_map(), name, export_wrapper); | 507 isolate->wasm_function_map(), name, export_wrapper); |
508 function->SetInternalField(kWrapperTracerHeader, Smi::kZero); | 508 function->SetEmbedderField(kWrapperTracerHeader, Smi::kZero); |
509 | 509 |
510 function->set_shared(*shared); | 510 function->set_shared(*shared); |
511 | 511 |
512 function->SetInternalField(kInstance, *instance); | 512 function->SetEmbedderField(kInstance, *instance); |
513 function->SetInternalField(kIndex, Smi::FromInt(func_index)); | 513 function->SetEmbedderField(kIndex, Smi::FromInt(func_index)); |
514 return Handle<WasmExportedFunction>::cast(function); | 514 return Handle<WasmExportedFunction>::cast(function); |
515 } | 515 } |
516 | 516 |
517 bool WasmSharedModuleData::IsWasmSharedModuleData(Object* object) { | 517 bool WasmSharedModuleData::IsWasmSharedModuleData(Object* object) { |
518 if (!object->IsFixedArray()) return false; | 518 if (!object->IsFixedArray()) return false; |
519 FixedArray* arr = FixedArray::cast(object); | 519 FixedArray* arr = FixedArray::cast(object); |
520 if (arr->length() != kFieldCount) return false; | 520 if (arr->length() != kFieldCount) return false; |
521 Isolate* isolate = arr->GetIsolate(); | 521 Isolate* isolate = arr->GetIsolate(); |
522 if (!arr->get(kModuleWrapper)->IsForeign()) return false; | 522 if (!arr->get(kModuleWrapper)->IsForeign()) return false; |
523 if (!arr->get(kModuleBytes)->IsUndefined(isolate) && | 523 if (!arr->get(kModuleBytes)->IsUndefined(isolate) && |
(...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1188 if (!array->get(kWrapperInstanceObject)->IsWeakCell()) return false; | 1188 if (!array->get(kWrapperInstanceObject)->IsWeakCell()) return false; |
1189 Isolate* isolate = array->GetIsolate(); | 1189 Isolate* isolate = array->GetIsolate(); |
1190 if (!array->get(kNextInstanceWrapper)->IsUndefined(isolate) && | 1190 if (!array->get(kNextInstanceWrapper)->IsUndefined(isolate) && |
1191 !array->get(kNextInstanceWrapper)->IsFixedArray()) | 1191 !array->get(kNextInstanceWrapper)->IsFixedArray()) |
1192 return false; | 1192 return false; |
1193 if (!array->get(kPreviousInstanceWrapper)->IsUndefined(isolate) && | 1193 if (!array->get(kPreviousInstanceWrapper)->IsUndefined(isolate) && |
1194 !array->get(kPreviousInstanceWrapper)->IsFixedArray()) | 1194 !array->get(kPreviousInstanceWrapper)->IsFixedArray()) |
1195 return false; | 1195 return false; |
1196 return true; | 1196 return true; |
1197 } | 1197 } |
OLD | NEW |