From 6f0f9b15f0f06684a1898f06fd1918a89682d6ff Mon Sep 17 00:00:00 2001 From: huanzai <857763401@qq.com> Date: Mon, 11 Nov 2024 23:44:55 +0800 Subject: [PATCH 1/5] Fixing crashes caused by non-UTF-8 characters --- modules/dap/transport.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/dap/transport.py b/modules/dap/transport.py index d980f05..03bc6e0 100644 --- a/modules/dap/transport.py +++ b/modules/dap/transport.py @@ -163,6 +163,11 @@ def read_transport(self): bytes_left = size - len(content) content += self.read(bytes_left) + # 以防非 utf-8 编码字符 + content_str = bytearray(content).decode(encoding='utf-8', errors='replace') + content = content_str.encode('utf-8') + core.info("read_transport", content) + self.on_message(core.json_decode(content)) except Exception as e: From 0d77f214c8423a4a556eca35eb7f1e463861bad5 Mon Sep 17 00:00:00 2001 From: huanzai <857763401@qq.com> Date: Wed, 27 Nov 2024 11:20:49 +0800 Subject: [PATCH 2/5] Fix crashes caused by non-UTF-8 characters --- modules/dap/transport.py | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/dap/transport.py b/modules/dap/transport.py index 03bc6e0..6019cd6 100644 --- a/modules/dap/transport.py +++ b/modules/dap/transport.py @@ -163,7 +163,6 @@ def read_transport(self): bytes_left = size - len(content) content += self.read(bytes_left) - # 以防非 utf-8 编码字符 content_str = bytearray(content).decode(encoding='utf-8', errors='replace') content = content_str.encode('utf-8') core.info("read_transport", content) From 292619bc7a2ffc858a235db5d67038eb13693775 Mon Sep 17 00:00:00 2001 From: huanzai <857763401@qq.com> Date: Wed, 27 Nov 2024 11:24:16 +0800 Subject: [PATCH 3/5] Fix crashes caused by non-UTF-8 characters --- modules/dap/transport.py | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/dap/transport.py b/modules/dap/transport.py index 6019cd6..71f257a 100644 --- a/modules/dap/transport.py +++ b/modules/dap/transport.py @@ -165,7 +165,6 @@ def read_transport(self): content_str = bytearray(content).decode(encoding='utf-8', errors='replace') content = content_str.encode('utf-8') - core.info("read_transport", content) self.on_message(core.json_decode(content)) From 9159b87430eab7d810d35a8ae5bf93ba954d7e7b Mon Sep 17 00:00:00 2001 From: huanzai <857763401@qq.com> Date: Tue, 26 Nov 2024 23:14:44 +0800 Subject: [PATCH 4/5] fix show the children in lua table array part --- modules/dap/session.py | 47 +++++++++++++++++++++++++++++++---------- modules/dap/variable.py | 11 ++++++++-- 2 files changed, 45 insertions(+), 13 deletions(-) diff --git a/modules/dap/session.py b/modules/dap/session.py index e7f0389..171599e 100644 --- a/modules/dap/session.py +++ b/modules/dap/session.py @@ -677,21 +677,46 @@ async def get_source(self, source: dap.Source) -> tuple[str, str|None]: }) return body['content'], body.get('mimeType') - async def get_variables(self, variablesReference: int, without_names: bool = False) -> list[Variable]: - response = await self.request('variables', { - 'variablesReference': variablesReference - }) + async def get_variables(self, variablesReference: int, without_names: bool = False, indexedVariables: int|None = None, namedVariables: int|None = None) -> list[Variable]: + named_list = [] + if namedVariables != None and namedVariables > 0: + response = await self.request('variables', { + 'variablesReference': variablesReference, + 'filter': 'named', + }) + + variables: list[dap.Variable] = response['variables'] + + # vscode seems to remove the names from variables in output events + if without_names: + for v in variables: + v.name = '' + v.value = v.value.split('\n')[0] + + named_list = [Variable.from_variable(self, variablesReference, v) for v in variables] + + indexed_list = [] + if indexedVariables != None and indexedVariables > 0: + response = await self.request('variables', { + 'variablesReference': variablesReference, + 'filter': 'indexed', + 'start': 0, + 'count': indexedVariables, + }) + + variables: list[dap.Variable] = response['variables'] + + # vscode seems to remove the names from variables in output events + if without_names: + for v in variables: + v.name = '' + v.value = v.value.split('\n')[0] - variables: list[dap.Variable] = response['variables'] + indexed_list = [Variable.from_variable(self, variablesReference, v) for v in variables] - # vscode seems to remove the names from variables in output events - if without_names: - for v in variables: - v.name = '' - v.value = v.value.split('\n')[0] + return named_list + indexed_list - return [Variable.from_variable(self, variablesReference, v) for v in variables] def on_breakpoint_event(self, event: dap.BreakpointEvent): assert event.breakpoint.id diff --git a/modules/dap/variable.py b/modules/dap/variable.py index 5f9d16e..ca97e74 100644 --- a/modules/dap/variable.py +++ b/modules/dap/variable.py @@ -35,7 +35,8 @@ def name(self) -> str: class Variable: - def __init__(self, session: Session, name: str, value: str|None, variablesReference: int|None, containerVariablesReference: int|None = None, evaluateName: str|None = None, memoryReference: str|None = None) -> None: + def __init__(self, session: Session, name: str, value: str|None, variablesReference: int|None, containerVariablesReference: int|None = None, evaluateName: str|None = None, memoryReference: str|None = None, + indexedVariables: int|None = None, namedVariables: int|None = None) -> None: self.session = session self.name = name self.evaluateName = evaluateName @@ -44,6 +45,8 @@ def __init__(self, session: Session, name: str, value: str|None, variablesRefere self.containerVariablesReference = containerVariablesReference self.memoryReference = memoryReference self.fetched: core.Future[list[Variable]]|None = None + self.indexedVariables = indexedVariables + self.namedVariables = namedVariables @staticmethod @@ -56,6 +59,8 @@ def from_variable(session: Session, containerVariablesReference: int, variable: containerVariablesReference, variable.evaluateName, variable.memoryReference, + indexedVariables = variable.indexedVariables, + namedVariables = variable.namedVariables, ) @staticmethod @@ -74,11 +79,13 @@ def from_evaluate(session: Session, name: str, evaluate: dap.EvaluateResponse): name, evaluate.result, evaluate.variablesReference, + indexedVariables = evaluate.indexedVariables, + namedVariables = evaluate.namedVariables, ) async def fetch(self): assert self.variablesReference - return await self.session.get_variables(self.variablesReference) + return await self.session.get_variables(self.variablesReference, indexedVariables = self.indexedVariables, namedVariables = self.namedVariables) async def children(self) -> list[Variable]: if not self.has_children: From 59cca73743aeeb771efa792fafa28472c7a0b514 Mon Sep 17 00:00:00 2001 From: huanzai <857763401@qq.com> Date: Wed, 27 Nov 2024 23:17:41 +0800 Subject: [PATCH 5/5] Revert "fix show the children in lua table array part" This reverts commit 9159b87430eab7d810d35a8ae5bf93ba954d7e7b. --- modules/dap/session.py | 47 ++++++++++------------------------------- modules/dap/variable.py | 11 ++-------- 2 files changed, 13 insertions(+), 45 deletions(-) diff --git a/modules/dap/session.py b/modules/dap/session.py index 171599e..e7f0389 100644 --- a/modules/dap/session.py +++ b/modules/dap/session.py @@ -677,46 +677,21 @@ async def get_source(self, source: dap.Source) -> tuple[str, str|None]: }) return body['content'], body.get('mimeType') - async def get_variables(self, variablesReference: int, without_names: bool = False, indexedVariables: int|None = None, namedVariables: int|None = None) -> list[Variable]: - named_list = [] - if namedVariables != None and namedVariables > 0: - response = await self.request('variables', { - 'variablesReference': variablesReference, - 'filter': 'named', - }) - - variables: list[dap.Variable] = response['variables'] - - # vscode seems to remove the names from variables in output events - if without_names: - for v in variables: - v.name = '' - v.value = v.value.split('\n')[0] - - named_list = [Variable.from_variable(self, variablesReference, v) for v in variables] - - indexed_list = [] - if indexedVariables != None and indexedVariables > 0: - response = await self.request('variables', { - 'variablesReference': variablesReference, - 'filter': 'indexed', - 'start': 0, - 'count': indexedVariables, - }) - - variables: list[dap.Variable] = response['variables'] - - # vscode seems to remove the names from variables in output events - if without_names: - for v in variables: - v.name = '' - v.value = v.value.split('\n')[0] + async def get_variables(self, variablesReference: int, without_names: bool = False) -> list[Variable]: + response = await self.request('variables', { + 'variablesReference': variablesReference + }) - indexed_list = [Variable.from_variable(self, variablesReference, v) for v in variables] + variables: list[dap.Variable] = response['variables'] - return named_list + indexed_list + # vscode seems to remove the names from variables in output events + if without_names: + for v in variables: + v.name = '' + v.value = v.value.split('\n')[0] + return [Variable.from_variable(self, variablesReference, v) for v in variables] def on_breakpoint_event(self, event: dap.BreakpointEvent): assert event.breakpoint.id diff --git a/modules/dap/variable.py b/modules/dap/variable.py index ca97e74..5f9d16e 100644 --- a/modules/dap/variable.py +++ b/modules/dap/variable.py @@ -35,8 +35,7 @@ def name(self) -> str: class Variable: - def __init__(self, session: Session, name: str, value: str|None, variablesReference: int|None, containerVariablesReference: int|None = None, evaluateName: str|None = None, memoryReference: str|None = None, - indexedVariables: int|None = None, namedVariables: int|None = None) -> None: + def __init__(self, session: Session, name: str, value: str|None, variablesReference: int|None, containerVariablesReference: int|None = None, evaluateName: str|None = None, memoryReference: str|None = None) -> None: self.session = session self.name = name self.evaluateName = evaluateName @@ -45,8 +44,6 @@ def __init__(self, session: Session, name: str, value: str|None, variablesRefere self.containerVariablesReference = containerVariablesReference self.memoryReference = memoryReference self.fetched: core.Future[list[Variable]]|None = None - self.indexedVariables = indexedVariables - self.namedVariables = namedVariables @staticmethod @@ -59,8 +56,6 @@ def from_variable(session: Session, containerVariablesReference: int, variable: containerVariablesReference, variable.evaluateName, variable.memoryReference, - indexedVariables = variable.indexedVariables, - namedVariables = variable.namedVariables, ) @staticmethod @@ -79,13 +74,11 @@ def from_evaluate(session: Session, name: str, evaluate: dap.EvaluateResponse): name, evaluate.result, evaluate.variablesReference, - indexedVariables = evaluate.indexedVariables, - namedVariables = evaluate.namedVariables, ) async def fetch(self): assert self.variablesReference - return await self.session.get_variables(self.variablesReference, indexedVariables = self.indexedVariables, namedVariables = self.namedVariables) + return await self.session.get_variables(self.variablesReference) async def children(self) -> list[Variable]: if not self.has_children: