From 8a83014f516480c52075442677df3c23e221346a Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 30 Oct 2023 10:23:39 +0530 Subject: [PATCH] Dont construct memoryview when not needed in non dump code path --- gen/apc_parsers.py | 4 ++-- kitty/parse-graphics-command.h | 31 ++++++++++++++++--------------- kitty/vt-parser.c | 18 ++++++++++++------ kitty_tests/parser.py | 5 +++++ 4 files changed, 35 insertions(+), 23 deletions(-) diff --git a/gen/apc_parsers.py b/gen/apc_parsers.py index 37b68a0e5..8c38e3f5f 100755 --- a/gen/apc_parsers.py +++ b/gen/apc_parsers.py @@ -85,9 +85,9 @@ def cmd_for_report(report_name: str, keymap: KeymapType, type_map: Dict[str, Any fmt = f'{flag_fmt} {uint_fmt} {int_fmt}' if payload_allowed: - ans = [f'REPORT_VA_COMMAND("s {{{fmt} sI}} y#", "{report_name}",'] + ans = [f'REPORT_VA_COMMAND("K s {{{fmt} sI}} y#", self->window_id, "{report_name}", '] else: - ans = [f'REPORT_VA_COMMAND("s {{{fmt}}}", "{report_name}",'] + ans = [f'REPORT_VA_COMMAND("K s {{{fmt}}}", self->window_id, "{report_name}", '] ans.append(',\n '.join((flag_attrs, uint_attrs, int_attrs))) if payload_allowed: ans.append(', "payload_sz", g.payload_sz, payload, g.payload_sz') diff --git a/kitty/parse-graphics-command.h b/kitty/parse-graphics-command.h index 57607323d..58119ee86 100644 --- a/kitty/parse-graphics-command.h +++ b/kitty/parse-graphics-command.h @@ -351,21 +351,22 @@ static inline void parse_graphics_code(PS *self, const uint8_t *parser_buf, } REPORT_VA_COMMAND( - "K s {sc sc sc sc sI sI sI sI sI sI sI sI sI sI sI sI sI sI sI sI sI sI sI " - "sI sI sI si si si sI} y#", self->window_id, "graphics_command", - "action", g.action, "delete_action", g.delete_action, - "transmission_type", g.transmission_type, "compressed", g.compressed, - "format", (unsigned int)g.format, "more", (unsigned int)g.more, "id", - (unsigned int)g.id, "image_number", (unsigned int)g.image_number, - "placement_id", (unsigned int)g.placement_id, "quiet", - (unsigned int)g.quiet, "width", (unsigned int)g.width, "height", - (unsigned int)g.height, "x_offset", (unsigned int)g.x_offset, "y_offset", - (unsigned int)g.y_offset, "data_height", (unsigned int)g.data_height, - "data_width", (unsigned int)g.data_width, "data_sz", - (unsigned int)g.data_sz, "data_offset", (unsigned int)g.data_offset, - "num_cells", (unsigned int)g.num_cells, "num_lines", - (unsigned int)g.num_lines, "cell_x_offset", (unsigned int)g.cell_x_offset, - "cell_y_offset", (unsigned int)g.cell_y_offset, "cursor_movement", + "K s {sc sc sc sc sI sI sI sI sI sI sI sI sI sI sI sI sI sI sI sI sI sI " + "sI sI sI sI si si si sI} y#", + self->window_id, "graphics_command", "action", g.action, "delete_action", + g.delete_action, "transmission_type", g.transmission_type, "compressed", + g.compressed, "format", (unsigned int)g.format, "more", + (unsigned int)g.more, "id", (unsigned int)g.id, "image_number", + (unsigned int)g.image_number, "placement_id", + (unsigned int)g.placement_id, "quiet", (unsigned int)g.quiet, "width", + (unsigned int)g.width, "height", (unsigned int)g.height, "x_offset", + (unsigned int)g.x_offset, "y_offset", (unsigned int)g.y_offset, + "data_height", (unsigned int)g.data_height, "data_width", + (unsigned int)g.data_width, "data_sz", (unsigned int)g.data_sz, + "data_offset", (unsigned int)g.data_offset, "num_cells", + (unsigned int)g.num_cells, "num_lines", (unsigned int)g.num_lines, + "cell_x_offset", (unsigned int)g.cell_x_offset, "cell_y_offset", + (unsigned int)g.cell_y_offset, "cursor_movement", (unsigned int)g.cursor_movement, "unicode_placement", (unsigned int)g.unicode_placement, "parent_id", (unsigned int)g.parent_id, "parent_placement_id", (unsigned int)g.parent_placement_id, "z_index", diff --git a/kitty/vt-parser.c b/kitty/vt-parser.c index 9ae1ab838..ebf89a39e 100644 --- a/kitty/vt-parser.c +++ b/kitty/vt-parser.c @@ -6,7 +6,6 @@ */ // TODO: Test clipboard kitten with 52 and 5522 -// TODO: Test shell integration with secondary prompts // TODO: Test screen_request_capabilities #include "vt-parser.h" @@ -421,9 +420,10 @@ dispatch_osc(PS *self) { #define DISPATCH_OSC_WITH_CODE(name) REPORT_OSC2(name, code, mv); name(self->screen, code, mv); #define DISPATCH_OSC(name) REPORT_OSC(name, mv); name(self->screen, mv); #define START_DISPATCH {\ - PyObject *mv = PyMemoryView_FromMemory((char*)self->parser_buf + i, limit - i, PyBUF_READ); \ + RAII_PyObject(mv, PyMemoryView_FromMemory((char*)self->parser_buf + i, limit - i, PyBUF_READ)); \ if (mv) { -#define END_DISPATCH Py_CLEAR(mv); } PyErr_Clear(); break; } +#define END_DISPATCH_WITHOUT_BREAK }; PyErr_Clear(); } +#define END_DISPATCH }; PyErr_Clear(); break; } const unsigned int limit = self->parser_buf_pos; int code=0; @@ -462,10 +462,13 @@ dispatch_osc(PS *self) { END_DISPATCH case 6: case 7: +#ifdef DUMP_COMMANDS START_DISPATCH REPORT_OSC2(process_cwd_notification, code, mv); + END_DISPATCH_WITHOUT_BREAK +#endif process_cwd_notification(self->screen, code, (char*)self->parser_buf + i, limit-i); - END_DISPATCH + break; case 8: dispatch_hyperlink(self, i, limit-i); break; @@ -496,13 +499,16 @@ dispatch_osc(PS *self) { if (code == -52) continue_osc_52(self); END_DISPATCH case 133: +#ifdef DUMP_COMMANDS START_DISPATCH REPORT_OSC2(shell_prompt_marking, code, mv); - if (limit - 1 > 0) { + END_DISPATCH_WITHOUT_BREAK +#endif + if (limit > i) { self->parser_buf[limit] = 0; // safe to do as we have 8 extra bytes after PARSER_BUF_SZ shell_prompt_marking(self->screen, (char*)self->parser_buf + i); } - END_DISPATCH + break; case FILE_TRANSFER_CODE: START_DISPATCH DISPATCH_OSC(file_transmission); diff --git a/kitty_tests/parser.py b/kitty_tests/parser.py index afdbca3fc..1336b9a6e 100644 --- a/kitty_tests/parser.py +++ b/kitty_tests/parser.py @@ -79,6 +79,11 @@ class TestParser(BaseTest): self.ae(str(s.line(3)), 'ßxyz1') pb('ニチ ', 'ニチ ') self.ae(str(s.line(4)), 'ニチ ') + s.reset() + self.assertFalse(str(s.line(1)) + str(s.line(2)) + str(s.line(3))) + c1_controls = '\x84\x85\x88\x8d\x8e\x8f\x90\x96\x97\x98\x9a\x9b\x9c\x9d\x9e\x9f' + pb(c1_controls, c1_controls) + self.assertFalse(str(s.line(1)) + str(s.line(2)) + str(s.line(3))) def test_esc_codes(self): s = self.create_screen()