aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTheo Fabi <fabi.theo@gmail.com>2024-04-16 16:41:13 -0400
committerTheo Fabi <fabi.theo@gmail.com>2024-04-16 16:41:13 -0400
commit60d1e3e4718abccbe117f20a49233e7e85ad2a79 (patch)
tree874c128ea0b9451f14af16d3fadcec16d956201d
parent8e5c48b08dad54706500e353c58ffb91f2684dd3 (diff)
downloadrneovim-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.c5
-rw-r--r--src/nvim/msgpack_rpc/unpacker.c12
-rw-r--r--src/nvim/msgpack_rpc/unpacker.h3
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!