Cache string coloring functions (#2977)

* Cache color functions until the color parameter is set

* Update pwndbg/color/theme.py

Co-authored-by: Disconnect3d <dominik.b.czarnota@gmail.com>

---------

Co-authored-by: Disconnect3d <dominik.b.czarnota@gmail.com>
pull/2984/head
OBarronCS 7 months ago committed by GitHub
parent bc8d5d418f
commit 87aafd15e7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -164,7 +164,7 @@ class ColorParamSpec(NamedTuple):
class ColorConfig: class ColorConfig:
def __init__(self, namespace: str, params: List[ColorParamSpec]) -> None: def __init__(self, namespace: str, params: List[ColorParamSpec]) -> None:
self._namespace = namespace self._namespace = namespace
self._params: Dict[str, Parameter] = {} self._params: Dict[str, theme.ColorParameter] = {}
for param in params: for param in params:
self._params[param.name] = theme.add_color_param( self._params[param.name] = theme.add_color_param(
f"{self._namespace}-{param.name}-color", param.default, param.doc f"{self._namespace}-{param.name}-color", param.default, param.doc
@ -173,7 +173,7 @@ class ColorConfig:
def __getattr__(self, attr: str) -> Callable[[str], str]: def __getattr__(self, attr: str) -> Callable[[str], str]:
param_name = attr.replace("_", "-") param_name = attr.replace("_", "-")
if param_name in self._params: if param_name in self._params:
return generateColorFunction(self._params[param_name]) return self._params[param_name].color_function
raise AttributeError(f"ColorConfig object for {self._namespace} has no attribute '{attr}'") raise AttributeError(f"ColorConfig object for {self._namespace} has no attribute '{attr}'")

@ -2,8 +2,6 @@ from __future__ import annotations
from typing import List from typing import List
from pwndbg import config
from pwndbg.color import generateColorFunction
from pwndbg.color import theme from pwndbg.color import theme
from pwndbg.lib.regs import BitFlags from pwndbg.lib.regs import BitFlags
@ -43,51 +41,51 @@ config_comment = theme.add_color_param("comment-color", "gray", "color for comme
def prefix(x: object) -> str: def prefix(x: object) -> str:
return generateColorFunction(config.code_prefix_color)(x) return config_prefix_color.color_function(x)
def highlight(x: object) -> str: def highlight(x: object) -> str:
return generateColorFunction(config.highlight_color)(x) return config_highlight_color.color_function(x)
def register(x: object) -> str: def register(x: object) -> str:
return generateColorFunction(config.context_register_color)(x) return config_register_color.color_function(x)
def register_changed(x: object) -> str: def register_changed(x: object) -> str:
return generateColorFunction(config.context_register_changed_color)(x) return config_register_changed_color.color_function(x)
def flag_bracket(x: object) -> str: def flag_bracket(x: object) -> str:
return generateColorFunction(config.context_flag_bracket_color)(x) return config_flag_bracket_color.color_function(x)
def flag_value(x: object) -> str: def flag_value(x: object) -> str:
return generateColorFunction(config.context_flag_value_color)(x) return config_flag_value_color.color_function(x)
def flag_set(x: object) -> str: def flag_set(x: object) -> str:
return generateColorFunction(config.context_flag_set_color)(x) return config_flag_set_color.color_function(x)
def flag_unset(x: object) -> str: def flag_unset(x: object) -> str:
return generateColorFunction(config.context_flag_unset_color)(x) return config_flag_unset_color.color_function(x)
def flag_changed(x: object) -> str: def flag_changed(x: object) -> str:
return generateColorFunction(config.context_flag_changed_color)(x) return config_flag_changed_color.color_function(x)
def banner(x: object) -> str: def banner(x: object) -> str:
return generateColorFunction(config.banner_color)(x) return config_banner_color.color_function(x)
def banner_title(x: object) -> str: def banner_title(x: object) -> str:
return generateColorFunction(config.banner_title_color)(x) return config_banner_title.color_function(x)
def comment(x: object) -> str: def comment(x: object) -> str:
return generateColorFunction(config.comment_color)(x) return config_comment.color_function(x)
def format_flags(value: int | None, flags: BitFlags, last: int | None = None): def format_flags(value: int | None, flags: BitFlags, last: int | None = None):

@ -1,7 +1,5 @@
from __future__ import annotations from __future__ import annotations
from pwndbg import config
from pwndbg.color import generateColorFunction
from pwndbg.color import theme from pwndbg.color import theme
config_integer_color = theme.add_color_param( config_integer_color = theme.add_color_param(
@ -19,16 +17,16 @@ config_unknown_color = theme.add_color_param(
def integer(x): def integer(x):
return generateColorFunction(config.enhance_integer_value_color)(x) return config_integer_color.color_function(x)
def string(x): def string(x):
return generateColorFunction(config.enhance_string_value_color)(x) return config_string_color.color_function(x)
def comment(x): def comment(x):
return generateColorFunction(config.enhance_comment_color)(x) return config_comment_color.color_function(x)
def unknown(x): def unknown(x):
return generateColorFunction(config.enhance_unknown_color)(x) return config_unknown_color.color_function(x)

@ -34,31 +34,31 @@ config_highlight_group_lsb = theme.add_param(
def normal(x: str) -> str: def normal(x: str) -> str:
return generateColorFunction(config.hexdump_normal_color)(x) return config_normal.color_function(x)
def printable(x: str) -> str: def printable(x: str) -> str:
return generateColorFunction(config.hexdump_printable_color)(x) return config_printable.color_function(x)
def zero(x: str) -> str: def zero(x: str) -> str:
return generateColorFunction(config.hexdump_zero_color)(x) return config_zero.color_function(x)
def special(x: str) -> str: def special(x: str) -> str:
return generateColorFunction(config.hexdump_special_color)(x) return config_special.color_function(x)
def offset(x: str) -> str: def offset(x: str) -> str:
return generateColorFunction(config.hexdump_offset_color)(x) return config_offset.color_function(x)
def address(x: str) -> str: def address(x: str) -> str:
return generateColorFunction(config.hexdump_address_color)(x) return config_address.color_function(x)
def separator(x: str) -> str: def separator(x: str) -> str:
return generateColorFunction(config.hexdump_separator_color)(x) return config_separator.color_function(x)
def highlight_group_lsb(x: str) -> str: def highlight_group_lsb(x: str) -> str:

@ -2,9 +2,6 @@ from __future__ import annotations
from typing import Callable from typing import Callable
import pwndbg.lib.config
from pwndbg import config
from pwndbg.color import generateColorFunction
from pwndbg.color import theme from pwndbg.color import theme
config_status_on_color = theme.add_color_param( config_status_on_color = theme.add_color_param(
@ -41,72 +38,70 @@ config_signal_color = theme.add_color_param(
"message-signal-color", "bold,red", "color of signal messages" "message-signal-color", "bold,red", "color of signal messages"
) )
config_prompt_color: pwndbg.lib.config.Parameter = theme.add_color_param( config_prompt_color = theme.add_color_param("prompt-color", "bold,red", "prompt color")
"prompt-color", "bold,red", "prompt color" config_prompt_alive_color = theme.add_color_param(
)
config_prompt_alive_color: pwndbg.lib.config.Parameter = theme.add_color_param(
"prompt-alive-color", "bold,green", "prompt alive color" "prompt-alive-color", "bold,green", "prompt alive color"
) )
def on(msg: object) -> str: def on(msg: object) -> str:
return generateColorFunction(config.message_status_on_color)(msg) return config_status_on_color.color_function(msg)
def off(msg: object) -> str: def off(msg: object) -> str:
return generateColorFunction(config.message_status_off_color)(msg) return config_status_off_color.color_function(msg)
def notice(msg: object) -> str: def notice(msg: object) -> str:
return generateColorFunction(config.message_notice_color)(msg) return config_notice_color.color_function(msg)
def hint(msg: object) -> str: def hint(msg: object) -> str:
return generateColorFunction(config.message_hint_color)(msg) return config_hint_color.color_function(msg)
def success(msg: object) -> str: def success(msg: object) -> str:
return generateColorFunction(config.message_success_color)(msg) return config_success_color.color_function(msg)
def debug(msg: object) -> str: def debug(msg: object) -> str:
return generateColorFunction(config.message_warning_color)(msg) return config_debug_color.color_function(msg)
def info(msg: object) -> str: def info(msg: object) -> str:
return generateColorFunction(config.message_warning_color)(msg) return config_info_color.color_function(msg)
def warn(msg: object) -> str: def warn(msg: object) -> str:
return generateColorFunction(config.message_warning_color)(msg) return config_warning_color.color_function(msg)
def error(msg: object) -> str: def error(msg: object) -> str:
return generateColorFunction(config.message_error_color)(msg) return config_error_color.color_function(msg)
def system(msg: object) -> str: def system(msg: object) -> str:
return generateColorFunction(config.message_system_color)(msg) return config_system_color.color_function(msg)
def exit(msg: object) -> str: def exit(msg: object) -> str:
return generateColorFunction(config.message_exit_color)(msg) return config_exit_color.color_function(msg)
def breakpoint(msg: object) -> str: def breakpoint(msg: object) -> str:
return generateColorFunction(config.message_breakpoint_color)(msg) return config_breakpoint_color.color_function(msg)
def signal(msg: object) -> str: def signal(msg: object) -> str:
return generateColorFunction(config.message_signal_color)(msg) return config_signal_color.color_function(msg)
def prompt(msg: object) -> str: def prompt(msg: object) -> str:
return generateColorFunction(config.prompt_color)(msg) return config_prompt_color.color_function(msg)
def alive_prompt(msg: object) -> str: def alive_prompt(msg: object) -> str:
return generateColorFunction(config.prompt_alive_color)(msg) return config_prompt_alive_color.color_function(msg)
def readline_escape(func_message: Callable[[str], str], text: str) -> str: def readline_escape(func_message: Callable[[str], str], text: str) -> str:

@ -1,7 +1,5 @@
from __future__ import annotations from __future__ import annotations
from pwndbg import config
from pwndbg.color import generateColorFunction
from pwndbg.color import theme from pwndbg.color import theme
offset_color = theme.add_color_param( offset_color = theme.add_color_param(
@ -28,20 +26,20 @@ repeating_marker_color = theme.add_color_param(
def offset(x: object) -> str: def offset(x: object) -> str:
return generateColorFunction(config.telescope_offset_color)(x) return offset_color.color_function(x)
def register(x: object) -> str: def register(x: object) -> str:
return generateColorFunction(config.telescope_register_color)(x) return register_color.color_function(x)
def separator(x: object) -> str: def separator(x: object) -> str:
return generateColorFunction(config.telescope_offset_separator_color)(x) return offset_separator_color.color_function(x)
def delimiter(x: object) -> str: def delimiter(x: object) -> str:
return generateColorFunction(config.telescope_offset_delimiter_color)(x) return offset_delimiter_color.color_function(x)
def repeating_marker(x: object) -> str: def repeating_marker(x: object) -> str:
return generateColorFunction(config.telescope_repeating_marker_color)(x) return repeating_marker_color.color_function(x)

@ -1,15 +1,24 @@
from __future__ import annotations from __future__ import annotations
from typing import Any from typing import Any
from typing import Callable
from typing import Sequence from typing import Sequence
import pwndbg.color
from pwndbg import config from pwndbg import config
from pwndbg.lib.config import Parameter from pwndbg.lib.config import Parameter
from pwndbg.lib.config import Scope from pwndbg.lib.config import Scope
class ColorParameter(Parameter): class ColorParameter(Parameter):
pass color_function: Callable[[object], str]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.update_color_function()
def update_color_function(self):
self.color_function = pwndbg.color.generateColorFunction(self.value)
def add_param( def add_param(
@ -32,5 +41,11 @@ def add_param(
) )
def add_color_param(name: str, default: Any, set_show_doc: str) -> Parameter: def add_color_param(name: str, default: Any, set_show_doc: str) -> ColorParameter:
return config.add_param_obj(ColorParameter(name, default, set_show_doc, scope=Scope.theme)) color_parameter = ColorParameter(name, default, set_show_doc, scope=Scope.theme)
config.triggers[name].append(color_parameter.update_color_function)
config.add_param_obj(color_parameter)
return color_parameter

Loading…
Cancel
Save