Index: src/wasm/wasm-module.cc |
diff --git a/src/wasm/wasm-module.cc b/src/wasm/wasm-module.cc |
index 4d8b60fdf2269b302d6992c4cd165e1b5a7fb5e1..4b72e5976e92e6c2152b2f924da09ef5aa886fbc 100644 |
--- a/src/wasm/wasm-module.cc |
+++ b/src/wasm/wasm-module.cc |
@@ -2330,3 +2330,75 @@ void testing::ValidateOrphanedInstance(Isolate* isolate, |
CHECK(compiled_module->has_weak_wasm_module()); |
CHECK(compiled_module->ptr_to_weak_wasm_module()->cleared()); |
} |
+ |
+Handle<JSArray> wasm::GetImports(Isolate* isolate, |
+ Handle<WasmModuleObject> module_object) { |
+ Handle<WasmCompiledModule> compiled_module(module_object->compiled_module(), |
+ isolate); |
+ Factory* factory = isolate->factory(); |
+ |
+ Handle<String> module_string = factory->InternalizeUtf8String("module"); |
+ Handle<String> name_string = factory->InternalizeUtf8String("name"); |
+ Handle<String> kind_string = factory->InternalizeUtf8String("kind"); |
+ |
+ Handle<String> function_string = factory->InternalizeUtf8String("function"); |
+ Handle<String> table_string = factory->InternalizeUtf8String("table"); |
+ Handle<String> memory_string = factory->InternalizeUtf8String("memory"); |
+ Handle<String> global_string = factory->InternalizeUtf8String("global"); |
+ |
+ // Create the result array. |
+ WasmModule* module = compiled_module->module(); |
+ int num_imports = static_cast<int>(module->import_table.size()); |
+ Handle<JSArray> array_object = factory->NewJSArray(FAST_ELEMENTS, 0, 0); |
+ Handle<FixedArray> storage = factory->NewFixedArray(num_imports); |
+ JSArray::SetContent(array_object, storage); |
+ array_object->set_length(Smi::FromInt(num_imports)); |
+ |
+ Handle<JSFunction> object_function = |
+ Handle<JSFunction>(isolate->native_context()->object_function(), isolate); |
+ |
+ // Populate the result array. |
+ for (int index = 0; index < num_imports; ++index) { |
+ WasmImport& import = module->import_table[index]; |
+ |
+ Handle<JSObject> entry = factory->NewJSObject(object_function, TENURED); |
+ |
+ Handle<String> import_kind; |
+ switch (import.kind) { |
+ case kExternalFunction: |
+ import_kind = function_string; |
+ break; |
+ case kExternalTable: |
+ import_kind = table_string; |
+ break; |
+ case kExternalMemory: |
+ import_kind = memory_string; |
+ break; |
+ case kExternalGlobal: |
+ import_kind = global_string; |
+ break; |
+ default: |
+ UNREACHABLE(); |
+ } |
+ |
+ MaybeHandle<String> import_module = |
+ WasmCompiledModule::ExtractUtf8StringFromModuleBytes( |
+ isolate, compiled_module, import.module_name_offset, |
+ import.module_name_length); |
+ |
+ MaybeHandle<String> import_name = |
+ WasmCompiledModule::ExtractUtf8StringFromModuleBytes( |
+ isolate, compiled_module, import.field_name_offset, |
+ import.field_name_length); |
+ |
+ JSObject::AddProperty(entry, module_string, import_module.ToHandleChecked(), |
+ NONE); |
+ JSObject::AddProperty(entry, name_string, import_name.ToHandleChecked(), |
+ NONE); |
+ JSObject::AddProperty(entry, kind_string, import_kind, NONE); |
+ |
+ storage->set(index, *entry); |
+ } |
+ |
+ return array_object; |
+} |