| Index: src/wasm/wasm-module.cc
|
| diff --git a/src/wasm/wasm-module.cc b/src/wasm/wasm-module.cc
|
| index 0dd53d22c826673279d3c6ebc4cb64bfcbfaa05b..404fea5431889192d1312b2ecba62eec498e5cf7 100644
|
| --- a/src/wasm/wasm-module.cc
|
| +++ b/src/wasm/wasm-module.cc
|
| @@ -154,41 +154,6 @@ enum WasmInstanceObjectFields {
|
| kWasmModuleInternalFieldCount
|
| };
|
|
|
| -// TODO(mtrofin): Unnecessary once we stop using JS Heap for wasm code.
|
| -// For now, each field is expected to have the type commented by its side.
|
| -// The elements typed as "maybe" are optional. The others are mandatory. Since
|
| -// the compiled module is either obtained from the current v8 instance, or from
|
| -// a snapshot produced by a compatible (==identical) v8 instance, we simply
|
| -// fail at instantiation time, in the face of invalid data.
|
| -enum WasmCompiledModule {
|
| - kCodeTable, // FixedArray of Code
|
| - kImportData, // maybe FixedArray of FixedArray respecting the
|
| - // WasmImportData structure.
|
| - kExportData, // maybe FixedArray of FixedArray of WasmExportData
|
| - // structure
|
| - kStartupData, // maybe FixedArray of WasmExportData structure
|
| - kTableOfIndirectFunctionTables, // maybe FixedArray of FixedArray of
|
| - // WasmIndirectFunctionTableData
|
| - kModuleBytes, // maybe String
|
| - kFunctionNameTable, // maybe ByteArray
|
| - kMinRequiredMemory, // Smi. an uint32_t
|
| - // The following 2 are either together present or absent:
|
| - kDataSegmentsInfo, // maybe FixedArray of FixedArray respecting the
|
| - // WasmSegmentInfo structure
|
| - kDataSegments, // maybe ByteArray.
|
| -
|
| - kGlobalsSize, // Smi. an uint32_t
|
| - kMemSize, // Smi.an uint32_t
|
| - kMemStart, // MaybeHandle<ArrayBuffer>
|
| - kExportMem, // Smi. bool
|
| - kOrigin, // Smi. ModuleOrigin
|
| - kNextInstance, // WeakCell. See compiled code cloning.
|
| - kPrevInstance, // WeakCell. See compiled code cloning.
|
| - kOwningInstance, // WeakCell, pointing to the owning instance.
|
| - kModuleObject, // WeakCell, pointing to the module object.
|
| - kWasmCompiledModuleSize // Sentinel value.
|
| -};
|
| -
|
| enum WasmImportData {
|
| kModuleName, // String
|
| kFunctionName, // maybe String
|
| @@ -221,21 +186,16 @@ uint32_t GetMinModuleMemSize(const WasmModule* module) {
|
| return WasmModule::kPageSize * module->min_mem_pages;
|
| }
|
|
|
| -void LoadDataSegments(Handle<FixedArray> compiled_module, Address mem_addr,
|
| - size_t mem_size) {
|
| - Isolate* isolate = compiled_module->GetIsolate();
|
| - MaybeHandle<ByteArray> maybe_data =
|
| - compiled_module->GetValue<ByteArray>(isolate, kDataSegments);
|
| - MaybeHandle<FixedArray> maybe_segments =
|
| - compiled_module->GetValue<FixedArray>(isolate, kDataSegmentsInfo);
|
| +void LoadDataSegments(Handle<WasmCompiledModule> compiled_module,
|
| + Address mem_addr, size_t mem_size) {
|
| + CHECK(compiled_module->has_data_segments() ==
|
| + compiled_module->has_data_segments_info());
|
|
|
| - // We either have both or neither.
|
| - CHECK(maybe_data.is_null() == maybe_segments.is_null());
|
| // If we have neither, we're done.
|
| - if (maybe_data.is_null()) return;
|
| + if (!compiled_module->has_data_segments()) return;
|
|
|
| - Handle<ByteArray> data = maybe_data.ToHandleChecked();
|
| - Handle<FixedArray> segments = maybe_segments.ToHandleChecked();
|
| + Handle<ByteArray> data = compiled_module->data_segments();
|
| + Handle<FixedArray> segments = compiled_module->data_segments_info();
|
|
|
| uint32_t last_extraction_pos = 0;
|
| for (int i = 0; i < segments->length(); ++i) {
|
| @@ -253,7 +213,7 @@ void LoadDataSegments(Handle<FixedArray> compiled_module, Address mem_addr,
|
| }
|
|
|
| void SaveDataSegmentInfo(Factory* factory, const WasmModule* module,
|
| - Handle<FixedArray> compiled_module) {
|
| + Handle<WasmCompiledModule> compiled_module) {
|
| Handle<FixedArray> segments = factory->NewFixedArray(
|
| static_cast<int>(module->data_segments.size()), TENURED);
|
| uint32_t data_size = 0;
|
| @@ -279,8 +239,8 @@ void SaveDataSegmentInfo(Factory* factory, const WasmModule* module,
|
| segment.source_size);
|
| last_insertion_pos += segment.source_size;
|
| }
|
| - compiled_module->set(kDataSegmentsInfo, *segments);
|
| - compiled_module->set(kDataSegments, *data);
|
| + compiled_module->set_data_segments_info(segments);
|
| + compiled_module->set_data_segments(data);
|
| }
|
|
|
| void PatchFunctionTable(Handle<Code> code,
|
| @@ -888,30 +848,11 @@ void PatchDirectCalls(Handle<FixedArray> old_functions,
|
| }
|
| }
|
|
|
| -#define GET_COMPILED_MODULE_WEAK_RELATION_OR_NULL(Field) \
|
| - WeakCell* Get##Field(const FixedArray* compiled_module) { \
|
| - Object* obj = compiled_module->get(k##Field); \
|
| - DCHECK_NOT_NULL(obj); \
|
| - if (obj->IsWeakCell()) { \
|
| - return WeakCell::cast(obj); \
|
| - } else { \
|
| - return nullptr; \
|
| - } \
|
| - }
|
| -
|
| -GET_COMPILED_MODULE_WEAK_RELATION_OR_NULL(NextInstance)
|
| -GET_COMPILED_MODULE_WEAK_RELATION_OR_NULL(PrevInstance)
|
| -GET_COMPILED_MODULE_WEAK_RELATION_OR_NULL(OwningInstance)
|
| -GET_COMPILED_MODULE_WEAK_RELATION_OR_NULL(ModuleObject)
|
| -
|
| static void ResetCompiledModule(Isolate* isolate, JSObject* owner,
|
| - FixedArray* compiled_module) {
|
| + WasmCompiledModule* compiled_module) {
|
| Object* undefined = *isolate->factory()->undefined_value();
|
| - Object* mem_size_obj = compiled_module->get(kMemSize);
|
| - DCHECK(mem_size_obj->IsMutableHeapNumber());
|
| - uint32_t old_mem_size =
|
| - static_cast<uint32_t>(HeapNumber::cast(mem_size_obj)->value());
|
| - Object* mem_start = compiled_module->get(kMemStart);
|
| + uint32_t old_mem_size = compiled_module->mem_size();
|
| + Object* mem_start = compiled_module->ptr_to_mem_start();
|
| Address old_mem_address = nullptr;
|
| Address globals_start =
|
| GetGlobalStartAddressFromCodeTemplate(undefined, owner);
|
| @@ -925,7 +866,7 @@ static void ResetCompiledModule(Isolate* isolate, JSObject* owner,
|
| RelocInfo::ModeMask(RelocInfo::WASM_MEMORY_SIZE_REFERENCE) |
|
| RelocInfo::ModeMask(RelocInfo::WASM_GLOBAL_REFERENCE);
|
|
|
| - Object* fct_obj = compiled_module->get(kCodeTable);
|
| + Object* fct_obj = compiled_module->ptr_to_code_table();
|
| if (fct_obj != nullptr && fct_obj != undefined &&
|
| (old_mem_size > 0 || globals_start != nullptr)) {
|
| FixedArray* functions = FixedArray::cast(fct_obj);
|
| @@ -951,29 +892,29 @@ static void ResetCompiledModule(Isolate* isolate, JSObject* owner,
|
| }
|
| }
|
| }
|
| - compiled_module->set(kOwningInstance, undefined);
|
| - compiled_module->set(kMemStart, undefined);
|
| + compiled_module->reset_weak_owning_instance();
|
| + compiled_module->reset_mem_start();
|
| }
|
|
|
| static void InstanceFinalizer(const v8::WeakCallbackInfo<void>& data) {
|
| JSObject** p = reinterpret_cast<JSObject**>(data.GetParameter());
|
| JSObject* owner = *p;
|
| - FixedArray* compiled_module =
|
| - FixedArray::cast(owner->GetInternalField(kWasmCompiledModule));
|
| + WasmCompiledModule* compiled_module =
|
| + WasmCompiledModule::cast(owner->GetInternalField(kWasmCompiledModule));
|
| Isolate* isolate = reinterpret_cast<Isolate*>(data.GetIsolate());
|
| - Object* undefined = *isolate->factory()->undefined_value();
|
| - WeakCell* weak_module_obj = GetModuleObject(compiled_module);
|
| - DCHECK_NOT_NULL(weak_module_obj);
|
| + DCHECK(compiled_module->has_weak_module_object());
|
| + WeakCell* weak_module_obj = compiled_module->ptr_to_weak_module_object();
|
| +
|
| // weak_module_obj may have been cleared, meaning the module object
|
| // was GC-ed. In that case, there won't be any new instances created,
|
| // and we don't need to maintain the links between instances.
|
| if (!weak_module_obj->cleared()) {
|
| JSObject* module_obj = JSObject::cast(weak_module_obj->value());
|
| - FixedArray* current_template =
|
| - FixedArray::cast(module_obj->GetInternalField(0));
|
| - DCHECK_NULL(GetPrevInstance(current_template));
|
| - WeakCell* next = GetNextInstance(compiled_module);
|
| - WeakCell* prev = GetPrevInstance(compiled_module);
|
| + WasmCompiledModule* current_template =
|
| + WasmCompiledModule::cast(module_obj->GetInternalField(0));
|
| + DCHECK(!current_template->has_weak_prev_instance());
|
| + WeakCell* next = compiled_module->ptr_to_weak_next_instance();
|
| + WeakCell* prev = compiled_module->ptr_to_weak_prev_instance();
|
|
|
| if (current_template == compiled_module) {
|
| if (next == nullptr) {
|
| @@ -982,7 +923,7 @@ static void InstanceFinalizer(const v8::WeakCallbackInfo<void>& data) {
|
| DCHECK(next->value()->IsFixedArray());
|
| module_obj->SetInternalField(0, next->value());
|
| DCHECK_NULL(prev);
|
| - FixedArray::cast(next->value())->set(kPrevInstance, undefined);
|
| + WasmCompiledModule::cast(next->value())->reset_weak_prev_instance();
|
| }
|
| } else {
|
| DCHECK(!(prev == nullptr && next == nullptr));
|
| @@ -991,13 +932,21 @@ static void InstanceFinalizer(const v8::WeakCallbackInfo<void>& data) {
|
| // we would have relinked the list.
|
| if (prev != nullptr) {
|
| DCHECK(!prev->cleared());
|
| - FixedArray::cast(prev->value())
|
| - ->set(kNextInstance, next == nullptr ? undefined : next);
|
| + if (next == nullptr) {
|
| + WasmCompiledModule::cast(prev->value())->reset_weak_next_instance();
|
| + } else {
|
| + WasmCompiledModule::cast(prev->value())
|
| + ->set_ptr_to_weak_next_instance(next);
|
| + }
|
| }
|
| if (next != nullptr) {
|
| DCHECK(!next->cleared());
|
| - FixedArray::cast(next->value())
|
| - ->set(kPrevInstance, prev == nullptr ? undefined : prev);
|
| + if (prev == nullptr) {
|
| + WasmCompiledModule::cast(next->value())->reset_weak_prev_instance();
|
| + } else {
|
| + WasmCompiledModule::cast(next->value())
|
| + ->set_ptr_to_weak_prev_instance(prev);
|
| + }
|
| }
|
| }
|
| }
|
| @@ -1006,11 +955,11 @@ static void InstanceFinalizer(const v8::WeakCallbackInfo<void>& data) {
|
|
|
| } // namespace
|
|
|
| -MaybeHandle<FixedArray> WasmModule::CompileFunctions(
|
| +MaybeHandle<WasmCompiledModule> WasmModule::CompileFunctions(
|
| Isolate* isolate, ErrorThrower* thrower) const {
|
| Factory* factory = isolate->factory();
|
|
|
| - MaybeHandle<FixedArray> nothing;
|
| + MaybeHandle<WasmCompiledModule> nothing;
|
|
|
| WasmModuleInstance temp_instance(this);
|
| temp_instance.context = isolate->native_context();
|
| @@ -1101,14 +1050,13 @@ MaybeHandle<FixedArray> WasmModule::CompileFunctions(
|
| // and information needed at instantiation time. This object needs to be
|
| // serializable. Instantiation may occur off a deserialized version of this
|
| // object.
|
| - Handle<FixedArray> ret =
|
| - factory->NewFixedArray(kWasmCompiledModuleSize, TENURED);
|
| - ret->set(kCodeTable, *code_table);
|
| + Handle<WasmCompiledModule> ret = WasmCompiledModule::New(isolate);
|
| + ret->set_code_table(code_table);
|
| if (!indirect_table.is_null()) {
|
| - ret->set(kTableOfIndirectFunctionTables, *indirect_table.ToHandleChecked());
|
| + ret->set_indirect_function_tables(indirect_table.ToHandleChecked());
|
| }
|
| Handle<FixedArray> import_data = GetImportsData(factory, this);
|
| - ret->set(kImportData, *import_data);
|
| + ret->set_import_data(import_data);
|
|
|
| // Compile exported function wrappers.
|
| int export_size = static_cast<int>(num_exported_functions);
|
| @@ -1146,7 +1094,7 @@ MaybeHandle<FixedArray> WasmModule::CompileFunctions(
|
| exports->set(index, *export_data);
|
| code_table->set(static_cast<int>(functions.size() + index), *export_code);
|
| }
|
| - ret->set(kExportData, *exports);
|
| + ret->set_exports(exports);
|
| }
|
|
|
| // Record data for startup function.
|
| @@ -1157,7 +1105,7 @@ MaybeHandle<FixedArray> WasmModule::CompileFunctions(
|
| startup_data->set(kExportArity, Smi::FromInt(0));
|
| startup_data->set(kExportedFunctionIndex,
|
| Smi::FromInt(start_function_index));
|
| - ret->set(kStartupData, *startup_data);
|
| + ret->set_startup_function(startup_data);
|
| }
|
|
|
| // TODO(wasm): saving the module bytes for debugging is wasteful. We should
|
| @@ -1170,20 +1118,18 @@ MaybeHandle<FixedArray> WasmModule::CompileFunctions(
|
| Handle<String> module_bytes_string =
|
| factory->NewStringFromOneByte(module_bytes_vec, TENURED)
|
| .ToHandleChecked();
|
| - ret->set(kModuleBytes, *module_bytes_string);
|
| + ret->set_module_bytes(module_bytes_string);
|
| }
|
|
|
| Handle<ByteArray> function_name_table =
|
| BuildFunctionNamesTable(isolate, module_env.module);
|
| - ret->set(kFunctionNameTable, *function_name_table);
|
| - ret->set(kMinRequiredMemory, Smi::FromInt(min_mem_pages));
|
| + ret->set_function_names(function_name_table);
|
| + ret->set_min_required_memory(min_mem_pages);
|
| if (data_segments.size() > 0) SaveDataSegmentInfo(factory, this, ret);
|
| - ret->set(kGlobalsSize, Smi::FromInt(globals_size));
|
| - ret->set(kExportMem, Smi::FromInt(mem_export));
|
| - ret->set(kOrigin, Smi::FromInt(origin));
|
| - Handle<HeapNumber> size_as_object = factory->NewHeapNumber(
|
| - static_cast<double>(temp_instance.mem_size), MUTABLE, TENURED);
|
| - ret->set(kMemSize, *size_as_object);
|
| + ret->set_globals_size(globals_size);
|
| + ret->set_export_memory(mem_export);
|
| + ret->set_origin(origin);
|
| + ret->set_mem_size(temp_instance.mem_size);
|
| return ret;
|
| }
|
|
|
| @@ -1251,7 +1197,7 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
|
| //--------------------------------------------------------------------------
|
| // Reuse the compiled module (if no owner), otherwise clone.
|
| //--------------------------------------------------------------------------
|
| - Handle<FixedArray> compiled_module;
|
| + Handle<WasmCompiledModule> compiled_module;
|
| Handle<FixedArray> code_table;
|
| Handle<FixedArray> old_code_table;
|
| Handle<JSObject> owner;
|
| @@ -1261,33 +1207,30 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
|
| MaybeHandle<WeakCell> link_to_original;
|
|
|
| {
|
| - Handle<FixedArray> original(
|
| - FixedArray::cast(module_object->GetInternalField(0)), isolate);
|
| + Handle<WasmCompiledModule> original(
|
| + WasmCompiledModule::cast(module_object->GetInternalField(0)), isolate);
|
| // Always make a new copy of the code_table, since the old_code_table
|
| // may still have placeholders for imports.
|
| - old_code_table = original->GetValueChecked<FixedArray>(isolate, kCodeTable);
|
| + old_code_table = original->code_table();
|
| code_table = factory->CopyFixedArray(old_code_table);
|
|
|
| - WeakCell* tmp = GetOwningInstance(*original);
|
| - if (tmp != nullptr) {
|
| + if (original->has_weak_owning_instance()) {
|
| + WeakCell* tmp = original->ptr_to_weak_owning_instance();
|
| DCHECK(!tmp->cleared());
|
| // There is already an owner, clone everything.
|
| owner = Handle<JSObject>(JSObject::cast(tmp->value()), isolate);
|
| // Insert the latest clone in front.
|
| - compiled_module = factory->CopyFixedArray(original);
|
| + compiled_module = original->Clone(isolate);
|
| // Replace the strong reference to point to the new instance here.
|
| // This allows any of the other instances, including the original,
|
| // to be collected.
|
| module_object->SetInternalField(0, *compiled_module);
|
| - Handle<WeakCell> weak_link_to_wasm_obj =
|
| - original->GetValueChecked<WeakCell>(isolate, kModuleObject);
|
| -
|
| - compiled_module->set(kModuleObject, *weak_link_to_wasm_obj);
|
| + compiled_module->set_weak_module_object(original->weak_module_object());
|
| link_to_original = factory->NewWeakCell(original);
|
| // Don't link to original here. We remember the original
|
| // as a weak link. If that link isn't clear by the time we finish
|
| // instantiating this instance, then we link it at that time.
|
| - compiled_module->set(kNextInstance, *factory->undefined_value());
|
| + compiled_module->reset_weak_next_instance();
|
|
|
| // Clone the code for WASM functions and exports.
|
| for (int i = 0; i < code_table->length(); ++i) {
|
| @@ -1306,18 +1249,13 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
|
| UNREACHABLE();
|
| }
|
| }
|
| - Handle<HeapNumber> size_as_object = factory->NewHeapNumber(
|
| - static_cast<double>(
|
| - compiled_module->GetValueChecked<HeapNumber>(isolate, kMemSize)
|
| - ->value()),
|
| - MUTABLE, TENURED);
|
| - compiled_module->set(kMemSize, *size_as_object);
|
| + compiled_module->set_mem_size(original->mem_size());
|
| RecordStats(isolate, code_table);
|
| } else {
|
| // There was no owner, so we can reuse the original.
|
| compiled_module = original;
|
| }
|
| - compiled_module->set(kCodeTable, *code_table);
|
| + compiled_module->set_code_table(code_table);
|
| }
|
|
|
| //--------------------------------------------------------------------------
|
| @@ -1335,8 +1273,7 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
|
| MaybeHandle<JSArrayBuffer> old_memory;
|
| // TODO(titzer): handle imported memory properly.
|
|
|
| - uint32_t min_mem_pages = static_cast<uint32_t>(
|
| - Smi::cast(compiled_module->get(kMinRequiredMemory))->value());
|
| + uint32_t min_mem_pages = compiled_module->min_required_memory();
|
| isolate->counters()->wasm_min_mem_pages_count()->AddSample(min_mem_pages);
|
| // TODO(wasm): re-enable counter for max_mem_pages when we use that field.
|
|
|
| @@ -1351,20 +1288,16 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
|
| uint32_t mem_size = static_cast<uint32_t>(memory->byte_length()->Number());
|
| LoadDataSegments(compiled_module, mem_start, mem_size);
|
|
|
| - uint32_t old_mem_size = static_cast<uint32_t>(
|
| - compiled_module->GetValueChecked<HeapNumber>(isolate, kMemSize)
|
| - ->value());
|
| - MaybeHandle<JSArrayBuffer> old_mem =
|
| - compiled_module->GetValue<JSArrayBuffer>(isolate, kMemStart);
|
| + uint32_t old_mem_size = compiled_module->mem_size();
|
| Address old_mem_start =
|
| - old_mem.is_null()
|
| - ? nullptr
|
| - : static_cast<Address>(old_mem.ToHandleChecked()->backing_store());
|
| + compiled_module->has_mem_start()
|
| + ? static_cast<Address>(
|
| + compiled_module->mem_start()->backing_store())
|
| + : nullptr;
|
| RelocateInstanceCode(instance, old_mem_start, mem_start, old_mem_size,
|
| mem_size);
|
| - compiled_module->GetValueChecked<HeapNumber>(isolate, kMemSize)
|
| - ->set_value(static_cast<double>(mem_size));
|
| - compiled_module->set(kMemStart, *memory);
|
| + compiled_module->set_mem_size(mem_size);
|
| + compiled_module->set_mem_start(memory);
|
| }
|
|
|
| //--------------------------------------------------------------------------
|
| @@ -1372,8 +1305,7 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
|
| //--------------------------------------------------------------------------
|
| MaybeHandle<JSArrayBuffer> old_globals;
|
| MaybeHandle<JSArrayBuffer> globals;
|
| - uint32_t globals_size = static_cast<uint32_t>(
|
| - Smi::cast(compiled_module->get(kGlobalsSize))->value());
|
| + uint32_t globals_size = compiled_module->globals_size();
|
| if (globals_size > 0) {
|
| Handle<JSArrayBuffer> global_buffer = NewArrayBuffer(isolate, globals_size);
|
| globals = global_buffer;
|
| @@ -1394,10 +1326,9 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
|
| // Compile the import wrappers for the new instance.
|
| //--------------------------------------------------------------------------
|
| // TODO(titzer): handle imported globals and function tables.
|
| - Handle<FixedArray> import_data;
|
| int num_imported_functions = 0;
|
| - if (compiled_module->GetValue<FixedArray>(isolate, kImportData)
|
| - .ToHandle(&import_data)) {
|
| + if (compiled_module->has_import_data()) {
|
| + Handle<FixedArray> import_data = compiled_module->import_data();
|
| num_imported_functions = import_data->length();
|
| for (int index = 0; index < num_imported_functions; index++) {
|
| Handle<Code> import_wrapper =
|
| @@ -1411,18 +1342,16 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
|
| //--------------------------------------------------------------------------
|
| // Set up the debug support for the new instance.
|
| //--------------------------------------------------------------------------
|
| - MaybeHandle<String> module_bytes_string =
|
| - compiled_module->GetValue<String>(isolate, kModuleBytes);
|
| - if (!module_bytes_string.is_null()) {
|
| + // TODO(wasm): avoid referencing this stuff from the instance, use it off
|
| + // the compiled module instead. See the following 3 assignments:
|
| + if (compiled_module->has_module_bytes()) {
|
| instance->SetInternalField(kWasmModuleBytesString,
|
| - *module_bytes_string.ToHandleChecked());
|
| + compiled_module->ptr_to_module_bytes());
|
| }
|
|
|
| - MaybeHandle<ByteArray> function_name_table =
|
| - compiled_module->GetValue<ByteArray>(isolate, kFunctionNameTable);
|
| - if (!function_name_table.is_null()) {
|
| - Handle<ByteArray> handle = function_name_table.ToHandleChecked();
|
| - instance->SetInternalField(kWasmFunctionNamesArray, *handle);
|
| + if (compiled_module->has_function_names()) {
|
| + instance->SetInternalField(kWasmFunctionNamesArray,
|
| + compiled_module->ptr_to_function_names());
|
| }
|
|
|
| {
|
| @@ -1458,11 +1387,9 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
|
| functions[i] = code_table->GetValueChecked<Code>(isolate, i);
|
| }
|
|
|
| - MaybeHandle<FixedArray> maybe_indirect_tables =
|
| - compiled_module->GetValue<FixedArray>(isolate,
|
| - kTableOfIndirectFunctionTables);
|
| - Handle<FixedArray> indirect_tables_template;
|
| - if (maybe_indirect_tables.ToHandle(&indirect_tables_template)) {
|
| + if (compiled_module->has_indirect_function_tables()) {
|
| + Handle<FixedArray> indirect_tables_template =
|
| + compiled_module->indirect_function_tables();
|
| Handle<FixedArray> to_replace =
|
| owner.is_null() ? indirect_tables_template
|
| : handle(FixedArray::cast(owner->GetInternalField(
|
| @@ -1484,14 +1411,10 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
|
| //--------------------------------------------------------------------------
|
| // Set up the exports object for the new instance.
|
| //--------------------------------------------------------------------------
|
| - bool mem_export =
|
| - static_cast<bool>(Smi::cast(compiled_module->get(kExportMem))->value());
|
| - ModuleOrigin origin = static_cast<ModuleOrigin>(
|
| - Smi::cast(compiled_module->get(kOrigin))->value());
|
| -
|
| - MaybeHandle<FixedArray> maybe_exports =
|
| - compiled_module->GetValue<FixedArray>(isolate, kExportData);
|
| - if (!maybe_exports.is_null() || mem_export) {
|
| + bool mem_export = compiled_module->export_memory();
|
| + ModuleOrigin origin = compiled_module->origin();
|
| +
|
| + if (compiled_module->has_exports() || mem_export) {
|
| PropertyDescriptor desc;
|
| desc.set_writable(false);
|
|
|
| @@ -1504,7 +1427,6 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
|
| Handle<String> exports_name = factory->InternalizeUtf8String("exports");
|
| JSObject::AddProperty(instance, exports_name, exports_object, READ_ONLY);
|
| }
|
| - Handle<FixedArray> exports;
|
| int first_export = -1;
|
| // TODO(wasm): another iteration over the code objects.
|
| for (int i = 0; i < code_table->length(); i++) {
|
| @@ -1514,7 +1436,8 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
|
| break;
|
| }
|
| }
|
| - if (maybe_exports.ToHandle(&exports)) {
|
| + if (compiled_module->has_exports()) {
|
| + Handle<FixedArray> exports = compiled_module->exports();
|
| int export_size = exports->length();
|
| for (int i = 0; i < export_size; ++i) {
|
| Handle<FixedArray> export_data =
|
| @@ -1560,9 +1483,8 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
|
| //--------------------------------------------------------------------------
|
| // Run the start function if one was specified.
|
| //--------------------------------------------------------------------------
|
| - Handle<FixedArray> startup_data;
|
| - if (compiled_module->GetValue<FixedArray>(isolate, kStartupData)
|
| - .ToHandle(&startup_data)) {
|
| + if (compiled_module->has_startup_function()) {
|
| + Handle<FixedArray> startup_data = compiled_module->startup_function();
|
| HandleScope scope(isolate);
|
| int32_t start_index =
|
| startup_data->GetValueChecked<Smi>(isolate, kExportedFunctionIndex)
|
| @@ -1589,7 +1511,7 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
|
|
|
| DCHECK(wasm::IsWasmObject(*instance));
|
|
|
| - if (!compiled_module->GetValue<WeakCell>(isolate, kModuleObject).is_null()) {
|
| + if (compiled_module->has_weak_module_object()) {
|
| instance->SetInternalField(kWasmCompiledModule, *compiled_module);
|
| Handle<WeakCell> link_to_owner = factory->NewWeakCell(instance);
|
|
|
| @@ -1597,14 +1519,14 @@ MaybeHandle<JSObject> WasmModule::Instantiate(Isolate* isolate,
|
| Handle<WeakCell> link_to_clone = factory->NewWeakCell(compiled_module);
|
| {
|
| DisallowHeapAllocation no_gc;
|
| - compiled_module->set(kOwningInstance, *link_to_owner);
|
| + compiled_module->set_weak_owning_instance(link_to_owner);
|
| Handle<WeakCell> next;
|
| if (link_to_original.ToHandle(&next) && !next->cleared()) {
|
| - FixedArray* original = FixedArray::cast(next->value());
|
| - DCHECK_NOT_NULL(GetOwningInstance(original));
|
| - DCHECK(!GetOwningInstance(original)->cleared());
|
| - compiled_module->set(kNextInstance, *next);
|
| - original->set(kPrevInstance, *link_to_clone);
|
| + WasmCompiledModule* original = WasmCompiledModule::cast(next->value());
|
| + DCHECK(original->has_weak_owning_instance());
|
| + DCHECK(!original->weak_owning_instance()->cleared());
|
| + compiled_module->set_weak_next_instance(next);
|
| + original->set_weak_prev_instance(link_to_clone);
|
| }
|
| GlobalHandles::MakeWeak(global_handle.location(),
|
| global_handle.location(), &InstanceFinalizer,
|
| @@ -1787,7 +1709,8 @@ Handle<JSObject> CreateCompiledModuleObject(Isolate* isolate,
|
| Object::SetProperty(module_obj, module_sym, module_obj, STRICT).Check();
|
| }
|
| Handle<WeakCell> link_to_module = isolate->factory()->NewWeakCell(module_obj);
|
| - compiled_module->set(kModuleObject, *link_to_module);
|
| + WasmCompiledModule::cast(*compiled_module)
|
| + ->set_weak_module_object(link_to_module);
|
| return module_obj;
|
| }
|
|
|
| @@ -1840,8 +1763,8 @@ void SetInstanceMemory(Handle<JSObject> instance, JSArrayBuffer* buffer) {
|
| instance->SetInternalField(kWasmMemArrayBuffer, buffer);
|
| Object* module = instance->GetInternalField(kWasmCompiledModule);
|
| if (module->IsFixedArray()) {
|
| - HeapNumber::cast(FixedArray::cast(module)->get(kMemSize))
|
| - ->set_value(buffer->byte_length()->Number());
|
| + WasmCompiledModule::cast(module)->set_mem_size(
|
| + buffer->byte_length()->Number());
|
| }
|
| }
|
|
|
| @@ -1851,21 +1774,24 @@ void ValidateInstancesChain(Isolate* isolate, Handle<JSObject> module_obj,
|
| int instance_count) {
|
| CHECK_GE(instance_count, 0);
|
| DisallowHeapAllocation no_gc;
|
| - FixedArray* compiled_module =
|
| - FixedArray::cast(module_obj->GetInternalField(0));
|
| - CHECK_EQ(JSObject::cast(GetModuleObject(compiled_module)->value()),
|
| - *module_obj);
|
| + WasmCompiledModule* compiled_module =
|
| + WasmCompiledModule::cast(module_obj->GetInternalField(0));
|
| + CHECK_EQ(
|
| + JSObject::cast(compiled_module->ptr_to_weak_module_object()->value()),
|
| + *module_obj);
|
| Object* prev = nullptr;
|
| - int found_instances = GetOwningInstance(compiled_module) == nullptr ? 0 : 1;
|
| - FixedArray* current_instance = compiled_module;
|
| - while (GetNextInstance(current_instance) != nullptr) {
|
| - CHECK((prev == nullptr && GetPrevInstance(current_instance) == nullptr) ||
|
| - GetPrevInstance(current_instance)->value() == prev);
|
| - CHECK_EQ(GetModuleObject(current_instance)->value(), *module_obj);
|
| - CHECK(IsWasmObject(GetOwningInstance(current_instance)->value()));
|
| + int found_instances = compiled_module->has_weak_owning_instance() ? 1 : 0;
|
| + WasmCompiledModule* current_instance = compiled_module;
|
| + while (current_instance->has_weak_next_instance()) {
|
| + CHECK((prev == nullptr && !current_instance->has_weak_prev_instance()) ||
|
| + current_instance->ptr_to_weak_prev_instance()->value() == prev);
|
| + CHECK_EQ(current_instance->ptr_to_weak_module_object()->value(),
|
| + *module_obj);
|
| + CHECK(
|
| + IsWasmObject(current_instance->ptr_to_weak_owning_instance()->value()));
|
| prev = current_instance;
|
| - current_instance =
|
| - FixedArray::cast(GetNextInstance(current_instance)->value());
|
| + current_instance = WasmCompiledModule::cast(
|
| + current_instance->ptr_to_weak_next_instance()->value());
|
| ++found_instances;
|
| CHECK_LE(found_instances, instance_count);
|
| }
|
| @@ -1874,22 +1800,22 @@ void ValidateInstancesChain(Isolate* isolate, Handle<JSObject> module_obj,
|
|
|
| void ValidateModuleState(Isolate* isolate, Handle<JSObject> module_obj) {
|
| DisallowHeapAllocation no_gc;
|
| - FixedArray* compiled_module =
|
| - FixedArray::cast(module_obj->GetInternalField(0));
|
| - CHECK_NOT_NULL(GetModuleObject(compiled_module));
|
| - CHECK_EQ(GetModuleObject(compiled_module)->value(), *module_obj);
|
| - CHECK_NULL(GetPrevInstance(compiled_module));
|
| - CHECK_NULL(GetNextInstance(compiled_module));
|
| - CHECK_NULL(GetOwningInstance(compiled_module));
|
| + WasmCompiledModule* compiled_module =
|
| + WasmCompiledModule::cast(module_obj->GetInternalField(0));
|
| + CHECK(compiled_module->has_weak_module_object());
|
| + CHECK_EQ(compiled_module->ptr_to_weak_module_object()->value(), *module_obj);
|
| + CHECK(!compiled_module->has_weak_prev_instance());
|
| + CHECK(!compiled_module->has_weak_next_instance());
|
| + CHECK(!compiled_module->has_weak_owning_instance());
|
| }
|
|
|
| void ValidateOrphanedInstance(Isolate* isolate, Handle<JSObject> instance) {
|
| DisallowHeapAllocation no_gc;
|
| CHECK(IsWasmObject(*instance));
|
| - FixedArray* compiled_module =
|
| - FixedArray::cast(instance->GetInternalField(kWasmCompiledModule));
|
| - CHECK_NOT_NULL(GetModuleObject(compiled_module));
|
| - CHECK(GetModuleObject(compiled_module)->cleared());
|
| + WasmCompiledModule* compiled_module =
|
| + WasmCompiledModule::cast(instance->GetInternalField(kWasmCompiledModule));
|
| + CHECK(compiled_module->has_weak_module_object());
|
| + CHECK(compiled_module->ptr_to_weak_module_object()->cleared());
|
| }
|
|
|
| } // namespace testing
|
|
|