@@ -328,12 +328,27 @@ class WasmVm {
328328 void fail (FailState fail_state, std::string_view message) {
329329 integration ()->error (message);
330330 failed_ = fail_state;
331- for (auto &callback : fail_callbacks_) {
331+ for (auto & [key, callback] : fail_callbacks_) {
332332 callback (fail_state);
333333 }
334334 }
335- void addFailCallback (std::function<void (FailState)> fail_callback) {
336- fail_callbacks_.push_back (fail_callback);
335+
336+ /* *
337+ * Generates id for fail callbacks allowing direct insertion of the function.
338+ * Note: if fail callback needs to be removed later, must provide specific key.
339+ */
340+ void addFailCallback (std::function<void (FailState)> fail_callback) {
341+ static int id = 0 ;
342+ std::string key = std::to_string (id++);
343+ addFailCallback (key, std::move (fail_callback));
344+ }
345+
346+ void addFailCallback (const std::string& key, std::function<void (FailState)> fail_callback) {
347+ fail_callbacks_[key] = std::move (fail_callback);
348+ }
349+
350+ void removeFailCallback (const std::string& key) {
351+ fail_callbacks_.erase (key);
337352 }
338353
339354 bool isHostFunctionAllowed (const std::string &name) {
@@ -353,7 +368,7 @@ class WasmVm {
353368protected:
354369 std::unique_ptr<WasmVmIntegration> integration_;
355370 FailState failed_ = FailState::Ok;
356- std::vector< std::function<void (FailState)>> fail_callbacks_;
371+ std::unordered_map<std::string, std::function<void (FailState)>> fail_callbacks_;
357372
358373private:
359374 bool restricted_callback_{false };
0 commit comments