Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/reflex-base/news/6736.performance.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Cache framework-path checks in `console.deprecate`'s call-stack walk, making repeat calls ~150x faster (deprecated attributes on hot paths, like `RouterData.page`, no longer cost multiple milliseconds per access).
26 changes: 22 additions & 4 deletions packages/reflex-base/src/reflex_base/utils/console.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import contextlib
import datetime
import functools
import inspect
import os
import shutil
Expand Down Expand Up @@ -303,13 +304,30 @@ def _exclude_paths_from_frame_info() -> list[Path]:
return exclude_roots


def _get_first_non_framework_frame() -> FrameType | None:
exclude_roots = _exclude_paths_from_frame_info()
@functools.cache
def _is_framework_filename(filename: str) -> bool:
"""Check if a code filename belongs to an excluded framework/stdlib root.

Cached per filename: module file locations do not move within a process,
but resolving a path and comparing it against every exclude root is far
too expensive to repeat for each frame on every deprecation check.

Args:
filename: The ``co_filename`` of a frame's code object.

Returns:
Whether the file lives under one of the excluded framework roots.
"""
frame_path = Path(filename).resolve()
return any(
frame_path.is_relative_to(root) for root in _exclude_paths_from_frame_info()
)


def _get_first_non_framework_frame() -> FrameType | None:
frame = inspect.currentframe()
while frame := frame and frame.f_back:
frame_path = Path(inspect.getfile(frame)).resolve()
if not any(frame_path.is_relative_to(root) for root in exclude_roots):
if not _is_framework_filename(frame.f_code.co_filename):
break
return frame

Expand Down
Loading