diff options
author | Theo Fabi <fabi.theo@gmail.com> | 2024-04-16 16:41:13 -0400 |
---|---|---|
committer | Theo Fabi <fabi.theo@gmail.com> | 2024-04-16 16:41:13 -0400 |
commit | 60d1e3e4718abccbe117f20a49233e7e85ad2a79 (patch) | |
tree | 874c128ea0b9451f14af16d3fadcec16d956201d | |
parent | 8e5c48b08dad54706500e353c58ffb91f2684dd3 (diff) | |
download | rneovim-60d1e3e4718abccbe117f20a49233e7e85ad2a79.tar.gz rneovim-60d1e3e4718abccbe117f20a49233e7e85ad2a79.tar.bz2 rneovim-60d1e3e4718abccbe117f20a49233e7e85ad2a79.zip |
fix(msgpack): store grid line event as a value
-rw-r--r-- | src/nvim/msgpack_rpc/channel.c | 5 | ||||
-rw-r--r-- | src/nvim/msgpack_rpc/unpacker.c | 12 | ||||
-rw-r--r-- | src/nvim/msgpack_rpc/unpacker.h | 3 |
3 files changed, 10 insertions, 10 deletions
diff --git a/src/nvim/msgpack_rpc/channel.c b/src/nvim/msgpack_rpc/channel.c index 6921deae7e..268d6fe6e4 100644 --- a/src/nvim/msgpack_rpc/channel.c +++ b/src/nvim/msgpack_rpc/channel.c @@ -289,8 +289,9 @@ static void parse_msgpack(Channel *channel) if (p->type == kMessageTypeRedrawEvent) { // When exiting, ui_client_stop() has already been called, so don't handle UI events. if (ui_client_channel_id && !exiting) { - if (p->grid_line_event) { - ui_client_event_raw_line(p->grid_line_event); + if (p->has_grid_line_event) { + ui_client_event_raw_line(&p->grid_line_event); + p->has_grid_line_event = false; } else if (p->ui_handler.fn != NULL && p->result.type == kObjectTypeArray) { p->ui_handler.fn(p->result.data.array); } diff --git a/src/nvim/msgpack_rpc/unpacker.c b/src/nvim/msgpack_rpc/unpacker.c index dbb30b0c9a..28d27e8268 100644 --- a/src/nvim/msgpack_rpc/unpacker.c +++ b/src/nvim/msgpack_rpc/unpacker.c @@ -187,6 +187,8 @@ void unpacker_init(Unpacker *p) p->unpack_error = ERROR_INIT; p->arena = (Arena)ARENA_EMPTY; + + p->has_grid_line_event = false; } void unpacker_teardown(Unpacker *p) @@ -303,6 +305,7 @@ error: bool unpacker_advance(Unpacker *p) { assert(p->state >= 0); + p->has_grid_line_event = false; if (p->state == 0) { if (!unpacker_parse_header(p)) { return false; @@ -323,6 +326,7 @@ bool unpacker_advance(Unpacker *p) if (p->state == 16) { // grid_line event already unpacked + p->has_grid_line_event = true; goto done; } else { assert(p->state == 12); @@ -378,7 +382,7 @@ bool unpacker_parse_redraw(Unpacker *p) const char *data = p->read_ptr; size_t size = p->read_size; - GridLineEvent *g = p->grid_line_event; + GridLineEvent *g = &p->grid_line_event; #define NEXT_TYPE(tok, typ) \ result = mpack_rtoken(&data, &size, &tok); \ @@ -420,16 +424,10 @@ bool unpacker_parse_redraw(Unpacker *p) p->read_size = size; if (p->ui_handler.fn != ui_client_event_grid_line) { p->state = 12; - if (p->grid_line_event) { - arena_mem_free(arena_finish(&p->arena)); - p->grid_line_event = NULL; - } return true; } else { p->state = 14; p->arena = (Arena)ARENA_EMPTY; - p->grid_line_event = arena_alloc(&p->arena, sizeof *p->grid_line_event, true); - g = p->grid_line_event; } FALLTHROUGH; diff --git a/src/nvim/msgpack_rpc/unpacker.h b/src/nvim/msgpack_rpc/unpacker.h index 022d778013..ed55fdd4af 100644 --- a/src/nvim/msgpack_rpc/unpacker.h +++ b/src/nvim/msgpack_rpc/unpacker.h @@ -37,7 +37,8 @@ struct Unpacker { int nevents; int ncalls; UIClientHandler ui_handler; - GridLineEvent *grid_line_event; + GridLineEvent grid_line_event; + bool has_grid_line_event; }; // unrecovareble error. unpack_error should be set! |