static bool DecodeMemoryExport(JSContext* cx, Decoder& d, ModuleGenerator& mg, CStringSet* dupSet) { if (!mg.usesHeap()) return Fail(cx, d, "cannot export memory with no memory section"); UniqueChars fieldName = DecodeFieldName(cx, d, dupSet); if (!fieldName) return false; return mg.addMemoryExport(Move(fieldName)); }
static bool DecodeMemory(JSContext* cx, Decoder& d, ModuleGenerator& mg, MutableHandle<ArrayBufferObject*> heap) { uint32_t sectionStart; if (!d.startSection(MemoryId, §ionStart)) return Fail(cx, d, "failed to start section"); if (sectionStart == Decoder::NotStarted) return true; uint32_t initialSizePages; if (!d.readVarU32(&initialSizePages)) return Fail(cx, d, "expected initial memory size"); CheckedInt<int32_t> initialSize = initialSizePages; initialSize *= PageSize; if (!initialSize.isValid()) return Fail(cx, d, "initial memory size too big"); uint32_t maxSizePages; if (!d.readVarU32(&maxSizePages)) return Fail(cx, d, "expected initial memory size"); CheckedInt<int32_t> maxSize = maxSizePages; maxSize *= PageSize; if (!maxSize.isValid()) return Fail(cx, d, "initial memory size too big"); uint8_t exported; if (!d.readFixedU8(&exported)) return Fail(cx, d, "expected exported byte"); if (exported) { UniqueChars fieldName = DuplicateString("memory"); if (!fieldName || !mg.addMemoryExport(Move(fieldName))) return false; } if (!d.finishSection(sectionStart)) return Fail(cx, d, "memory section byte size mismatch"); bool signalsForOOB = CompileArgs(cx).useSignalHandlersForOOB; heap.set(ArrayBufferObject::createForWasm(cx, initialSize.value(), signalsForOOB)); if (!heap) return false; mg.initHeapUsage(HeapUsage::Unshared); return true; }