From 215a7689d98c42d2e28741933e68ba7bebf6940b Mon Sep 17 00:00:00 2001 From: James McCoy Date: Fri, 20 Apr 2018 08:07:58 -0400 Subject: [PATCH] Correct types for various PyArg_ParseTuple/Py_BuildValue calls Debian's [mips] build failed one of the font tests: FAIL: test_sprite_map (kitty_tests.fonts.Rendering) ---------------------------------------------------------------------- Traceback (most recent call last): File "/<>/kitty_tests/fonts.py", line 48, in test_sprite_map self.ae(test_sprite_position_for(0, 1), (0, 1, 1)) self = AssertionError: Tuples differ: (0, 0, 0) != (0, 1, 1) First differing element 1: 0 1 - (0, 0, 0) ? ^ ^ + (0, 1, 1) ? ^ ^ This was due to test_sprite_position_for() using the "I" code to parse into an unsigned short. Since mips is big endian, the "wrong" byte was stored into extra_glyphs.data. This commit changes all similar data type mismatches that were found from auditing calls to PyArg_ParseTuple/Py_BuildValue. [mips]: https://buildd.debian.org/status/fetch.php?pkg=kitty&arch=mips&ver=0.9.0-1&stamp=1524126606&raw=0 --- kitty/data-types.c | 2 +- kitty/fonts.c | 4 ++-- kitty/glfw.c | 2 +- kitty/graphics.c | 7 ++++--- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/kitty/data-types.c b/kitty/data-types.c index a003d51a5..197cc62f7 100644 --- a/kitty/data-types.c +++ b/kitty/data-types.c @@ -194,7 +194,7 @@ PyInit_fast_data_types(void) { if (!init_fonts(m)) return NULL; #define OOF(n) #n, offsetof(Cell, n) - if (PyModule_AddObject(m, "CELL", Py_BuildValue("{sI sI sI sI sI sI sI sI sI}", + if (PyModule_AddObject(m, "CELL", Py_BuildValue("{sI sI sI sI sI sH sH sH sI}", OOF(ch), OOF(fg), OOF(bg), OOF(decoration_fg), OOF(cc_idx), OOF(sprite_x), OOF(sprite_y), OOF(sprite_z), "size", sizeof(Cell))) != 0) return NULL; #undef OOF PyModule_AddIntConstant(m, "BOLD", BOLD_SHIFT); diff --git a/kitty/fonts.c b/kitty/fonts.c index ef71ebdfe..7b2563986 100644 --- a/kitty/fonts.c +++ b/kitty/fonts.c @@ -852,7 +852,7 @@ test_shape(PyObject UNUSED *self, PyObject *args) { PyObject *eg = PyTuple_New(MAX_NUM_EXTRA_GLYPHS); for (size_t g = 0; g < MAX_NUM_EXTRA_GLYPHS; g++) PyTuple_SET_ITEM(eg, g, Py_BuildValue("H", g + 1 < group->num_glyphs ? G(info)[group->first_glyph_idx + g].codepoint : 0)); - PyList_Append(ans, Py_BuildValue("IIIN", group->num_cells, group->num_glyphs, first_glyph, eg)); + PyList_Append(ans, Py_BuildValue("IIHN", group->num_cells, group->num_glyphs, first_glyph, eg)); idx++; } if (face) { Py_CLEAR(face); free(font); } @@ -988,7 +988,7 @@ static PyObject* test_sprite_position_for(PyObject UNUSED *self, PyObject *args) { glyph_index glyph; ExtraGlyphs extra_glyphs = {{0}}; - if (!PyArg_ParseTuple(args, "H|I", &glyph, &extra_glyphs.data)) return NULL; + if (!PyArg_ParseTuple(args, "H|H", &glyph, &extra_glyphs.data)) return NULL; int error; SpritePosition *pos = sprite_position_for(&fonts.fonts[fonts.medium_font_idx], glyph, &extra_glyphs, 0, &error); if (pos == NULL) { sprite_map_set_error(error); return NULL; } diff --git a/kitty/glfw.c b/kitty/glfw.c index b04718d79..5ad0eac49 100644 --- a/kitty/glfw.c +++ b/kitty/glfw.c @@ -321,7 +321,7 @@ create_os_window(PyObject UNUSED *self, PyObject *args) { int width, height, x = -1, y = -1; char *title, *wm_class_class, *wm_class_name; PyObject *load_programs = NULL; - if (!PyArg_ParseTuple(args, "iisss|Oiii", &width, &height, &title, &wm_class_name, &wm_class_class, &load_programs, &x, &y)) return NULL; + if (!PyArg_ParseTuple(args, "iisss|Oii", &width, &height, &title, &wm_class_name, &wm_class_class, &load_programs, &x, &y)) return NULL; if (is_first_window) { glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); diff --git a/kitty/graphics.c b/kitty/graphics.c index 56f020499..a3b1d16b9 100644 --- a/kitty/graphics.c +++ b/kitty/graphics.c @@ -873,9 +873,10 @@ new(PyTypeObject UNUSED *type, PyObject UNUSED *args, PyObject UNUSED *kwds) { static inline PyObject* image_as_dict(Image *img) { #define U(x) #x, img->x - return Py_BuildValue("{sI sI sI sI sI sI sH sH sN}", - U(texture_id), U(client_id), U(width), U(height), U(internal_id), U(refcnt), U(data_loaded), - "is_4byte_aligned", img->load_data.is_4byte_aligned, + return Py_BuildValue("{sI sI sI sI sI sI sO sO sN}", + U(texture_id), U(client_id), U(width), U(height), U(internal_id), U(refcnt), + "data_loaded", img->data_loaded ? Py_True : Py_False, + "is_4byte_aligned", img->load_data.is_4byte_aligned ? Py_True : Py_False, "data", Py_BuildValue("y#", img->load_data.data, img->load_data.data_sz) ); #undef U