| 24 | |
| 25 | template <typename T> |
| 26 | auto SyncRun(const std::string_view &Msg, WasmEdgeZlibEnvironment &Env, |
| 27 | uint32_t ZStreamPtr, const Runtime::CallingFrame &Frame, |
| 28 | T Callback) -> Expect<int32_t> { |
| 29 | |
| 30 | MEMINST_CHECK(MemInst, Frame, 0) |
| 31 | WasmZStream *ModuleZStream = MemInst->getPointer<WasmZStream *>(ZStreamPtr); |
| 32 | |
| 33 | const auto HostZStreamIt = Env.ZStreamMap.find(ZStreamPtr); |
| 34 | if (HostZStreamIt == Env.ZStreamMap.end()) { |
| 35 | spdlog::error("[WasmEdge-Zlib] [{}-SyncRun] "sv |
| 36 | "Invalid ZStreamPtr received."sv, |
| 37 | Msg); |
| 38 | return Unexpect(ErrCode::Value::HostFuncError); |
| 39 | } |
| 40 | auto HostZStream = HostZStreamIt->second.get(); |
| 41 | const auto GZHeaderStoreIt = Env.GZHeaderMap.find(ZStreamPtr); |
| 42 | |
| 43 | HostZStream->next_in = |
| 44 | MemInst->getPointer<unsigned char *>(ModuleZStream->NextIn); |
| 45 | HostZStream->avail_in = ModuleZStream->AvailIn; |
| 46 | HostZStream->total_in = ModuleZStream->TotalIn; |
| 47 | |
| 48 | HostZStream->next_out = |
| 49 | MemInst->getPointer<unsigned char *>(ModuleZStream->NextOut); |
| 50 | HostZStream->avail_out = ModuleZStream->AvailOut; |
| 51 | HostZStream->total_out = ModuleZStream->TotalOut; |
| 52 | |
| 53 | // TODO: ignore msg for now |
| 54 | // ignore state |
| 55 | // ignore zalloc, zfree, opaque |
| 56 | |
| 57 | HostZStream->data_type = ModuleZStream->DataType; |
| 58 | HostZStream->adler = ModuleZStream->Adler; |
| 59 | HostZStream->reserved = ModuleZStream->Reserved; |
| 60 | |
| 61 | const auto PreComputeNextIn = HostZStream->next_in; |
| 62 | const auto PreComputeNextOut = HostZStream->next_out; |
| 63 | |
| 64 | unsigned char *PreComputeExtra{}; |
| 65 | unsigned char *PreComputeName{}; |
| 66 | unsigned char *PreComputeComment{}; |
| 67 | |
| 68 | if (GZHeaderStoreIt != Env.GZHeaderMap.end()) { |
| 69 | // Sync GZ Header |
| 70 | |
| 71 | auto *ModuleGZHeader = MemInst->getPointer<WasmGZHeader *>( |
| 72 | GZHeaderStoreIt->second.WasmGZHeaderOffset); |
| 73 | auto *HostGZHeader = GZHeaderStoreIt->second.HostGZHeader.get(); |
| 74 | |
| 75 | HostGZHeader->text = ModuleGZHeader->Text; |
| 76 | HostGZHeader->time = ModuleGZHeader->Time; |
| 77 | HostGZHeader->xflags = ModuleGZHeader->XFlags; |
| 78 | HostGZHeader->os = ModuleGZHeader->OS; |
| 79 | |
| 80 | HostGZHeader->extra = |
| 81 | MemInst->getPointer<unsigned char *>(ModuleGZHeader->Extra); |
| 82 | HostGZHeader->extra_len = ModuleGZHeader->ExtraLen; |
| 83 | HostGZHeader->extra_max = ModuleGZHeader->ExtraMax; |