From 37e64d79cc12ceded903a490c0d6edaa60950fc6 Mon Sep 17 00:00:00 2001 From: James McCoy Date: Sun, 30 Oct 2016 23:44:36 -0400 Subject: object_to_vim: Fix buffer/window/tabpage conversion on BE systems Since data.integer is a different (larger) integer type than data.{buffer,window,tabpage}, we cannot abuse the union by using data.integer to access the value for all 4 types. Instead, remove the {buffer,window,tabpage} members and always use the integer member. In order to accomodate this, perform distinct validation and coercion between the Integer type and Buffer/Window/Tabpage types in object_to_vim, msgpack_rpc helpers, and gendispatch.lua. --- src/nvim/api/private/defs.h | 3 --- src/nvim/api/private/helpers.c | 4 ++-- src/nvim/api/private/helpers.h | 6 +++--- 3 files changed, 5 insertions(+), 8 deletions(-) (limited to 'src/nvim/api') diff --git a/src/nvim/api/private/defs.h b/src/nvim/api/private/defs.h index 1d5ecd3071..223aab09dc 100644 --- a/src/nvim/api/private/defs.h +++ b/src/nvim/api/private/defs.h @@ -91,9 +91,6 @@ typedef enum { struct object { ObjectType type; union { - Buffer buffer; - Window window; - Tabpage tabpage; Boolean boolean; Integer integer; Float floating; diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c index 208c3b53c8..8c6eb4c0df 100644 --- a/src/nvim/api/private/helpers.c +++ b/src/nvim/api/private/helpers.c @@ -616,13 +616,13 @@ bool object_to_vim(Object obj, typval_T *tv, Error *err) case kObjectTypeWindow: case kObjectTypeTabpage: case kObjectTypeInteger: - if (obj.data.integer > INT_MAX || obj.data.integer < INT_MIN) { + if (obj.data.integer > VARNUMBER_MAX || obj.data.integer < VARNUMBER_MIN) { api_set_error(err, Validation, _("Integer value outside range")); return false; } tv->v_type = VAR_NUMBER; - tv->vval.v_number = (int)obj.data.integer; + tv->vval.v_number = (varnumber_T)obj.data.integer; break; case kObjectTypeFloat: diff --git a/src/nvim/api/private/helpers.h b/src/nvim/api/private/helpers.h index a946e35149..9fe8c351cf 100644 --- a/src/nvim/api/private/helpers.h +++ b/src/nvim/api/private/helpers.h @@ -37,15 +37,15 @@ #define BUFFER_OBJ(s) ((Object) { \ .type = kObjectTypeBuffer, \ - .data.buffer = s }) + .data.integer = s }) #define WINDOW_OBJ(s) ((Object) { \ .type = kObjectTypeWindow, \ - .data.window = s }) + .data.integer = s }) #define TABPAGE_OBJ(s) ((Object) { \ .type = kObjectTypeTabpage, \ - .data.tabpage = s }) + .data.integer = s }) #define ARRAY_OBJ(a) ((Object) { \ .type = kObjectTypeArray, \ -- cgit From 9b545dd3db2f1f21b4503a0be3fe4a7f98a0968f Mon Sep 17 00:00:00 2001 From: James McCoy Date: Mon, 31 Oct 2016 00:02:16 -0400 Subject: nvim_win_get_number: Use int as rv to fix BE issues rv is int64_t but its address is being passed into win_get_tabwin as if it were an int. This breaks on big-endian systems, since win_get_tabwin will store the data to the "wrong" half of the int64_t, thus returning invalid data out of nvim_win_get_number. --- src/nvim/api/window.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/nvim/api') diff --git a/src/nvim/api/window.c b/src/nvim/api/window.c index ef881fa0eb..1f555a6a05 100644 --- a/src/nvim/api/window.c +++ b/src/nvim/api/window.c @@ -348,7 +348,7 @@ Tabpage nvim_win_get_tabpage(Window window, Error *err) /// @return Window number Integer nvim_win_get_number(Window window, Error *err) { - Integer rv = 0; + int rv = 0; win_T *win = find_window_by_handle(window, err); if (!win) { @@ -356,7 +356,7 @@ Integer nvim_win_get_number(Window window, Error *err) } int tabnr; - win_get_tabwin(window, &tabnr, (int *)&rv); + win_get_tabwin(window, &tabnr, &rv); return rv; } -- cgit From 654e92186ba4adcc48295998b840c76242456368 Mon Sep 17 00:00:00 2001 From: James McCoy Date: Mon, 31 Oct 2016 23:33:16 -0400 Subject: lint --- src/nvim/api/private/helpers.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/nvim/api') diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c index 8c6eb4c0df..bd83b1ff1d 100644 --- a/src/nvim/api/private/helpers.c +++ b/src/nvim/api/private/helpers.c @@ -616,7 +616,8 @@ bool object_to_vim(Object obj, typval_T *tv, Error *err) case kObjectTypeWindow: case kObjectTypeTabpage: case kObjectTypeInteger: - if (obj.data.integer > VARNUMBER_MAX || obj.data.integer < VARNUMBER_MIN) { + if (obj.data.integer > VARNUMBER_MAX + || obj.data.integer < VARNUMBER_MIN) { api_set_error(err, Validation, _("Integer value outside range")); return false; } -- cgit