static bool GetFunctionExport(JSContext* cx, HandleWasmInstanceObject instanceObj, Handle<FunctionVector> funcImports, const Export& exp, MutableHandleValue val) { if (exp.funcIndex() < funcImports.length() && IsExportedWasmFunction(funcImports[exp.funcIndex()])) { val.setObject(*funcImports[exp.funcIndex()]); return true; } RootedFunction fun(cx); if (!instanceObj->getExportedFunction(cx, instanceObj, exp.funcIndex(), &fun)) return false; val.setObject(*fun); return true; }
static bool CreateExportObject(JSContext* cx, HandleWasmInstanceObject instanceObj, MutableHandleWasmTableObject tableObj, HandleWasmMemoryObject memoryObj, const ValVector& globalImports, const ExportVector& exports, MutableHandleObject exportObj) { const Instance& instance = instanceObj->instance(); const Metadata& metadata = instance.metadata(); if (metadata.isAsmJS() && exports.length() == 1 && strlen(exports[0].fieldName()) == 0) { RootedFunction fun(cx); if (!instanceObj->getExportedFunction(cx, instanceObj, exports[0].funcIndex(), &fun)) return false; exportObj.set(fun); return true; } exportObj.set(JS_NewPlainObject(cx)); if (!exportObj) return false; for (const Export& exp : exports) { JSAtom* atom = AtomizeUTF8Chars(cx, exp.fieldName(), strlen(exp.fieldName())); if (!atom) return false; RootedId id(cx, AtomToId(atom)); RootedValue val(cx); switch (exp.kind()) { case DefinitionKind::Function: { RootedFunction fun(cx); if (!instanceObj->getExportedFunction(cx, instanceObj, exp.funcIndex(), &fun)) return false; val = ObjectValue(*fun); break; } case DefinitionKind::Table: { if (!tableObj) { MOZ_ASSERT(instance.tables().length() == 1); tableObj.set(WasmTableObject::create(cx, *instance.tables()[0])); if (!tableObj) return false; } val = ObjectValue(*tableObj); break; } case DefinitionKind::Memory: { if (metadata.assumptions.newFormat) val = ObjectValue(*memoryObj); else val = ObjectValue(memoryObj->buffer()); break; } case DefinitionKind::Global: { if (!ExportGlobalValue(cx, metadata.globals, exp.globalIndex(), globalImports, &val)) return false; break; } } if (!JS_DefinePropertyById(cx, exportObj, id, val, JSPROP_ENUMERATE)) return false; } return true; }