Skip to content

Conversation

rmelotte
Copy link
Contributor

This PR contains multiple fixes to be able to make use of JLIB_log_levels from the command line.
This is useful for example to be able to get libclang's diagnostics on stdout based on the environment variable's content.

Please review the last commit with caution ("jlib: fix unsupported operand type when setting log level"), as I'm not sure it is entirely correct.
log_levels_find() can be called with a FrameInfo caller, but it wasn't clear to me what extract_stack()'s limit should be in that case.

Any thought?

Building using JLIB_log_levels for filenames only currently fails.

For example, building with the following command:
make JLIB_log_levels=cpp.py=-5 python

... leads to the following trace:

  File "/home/rme/Documents/mupdf/scripts/jlib.py", line 427, in log
    level += log_levels_find( caller)
             ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/rme/Documents/mupdf/scripts/jlib.py", line 350, in log_levels_find
    if item_filename and not filename.startswith( item_filename):

This is because ffl is always a list (unpacked in case len==2), and
the filename is the first element of this list.
To fix it, only keep the first element of ffl when there is exactly
one.

Signed-off-by: Raphaël Mélotte <[email protected]>
Currently, setting a log level through the JLIB_log_levels environment
fails in this way:
  File "/home/rme/Documents/mupdf/scripts/jlib.py", line 185, in __call__
    ret += ' (+%s)' % time_duration( time.time() - self.t0, s_format='%.1f')
                      ^^^^^^^^^^^^^
This is because at the time log_levels_add_env() is invoked,
time_duration is not defined yet.

To fix it, just move the invocation further down, after time_duration
is defined.

Signed-off-by: Raphaël Mélotte <[email protected]>
This fixes the following issue when log_levels_find() is used (for
example when setting a log level delta using JLIB_log_levels):
[...]
    scripts/jlib.py:424:log(): level += log_levels_find( caller)
    scripts/jlib.py:334:log_levels_find(): tb = traceback.extract_stack( None, 1+caller)
TypeError: unsupported operand type(s) for +: 'int' and 'FrameInfo'

Note that this fix get JLIB_log_levels working, but it might be
incorrect.

Signed-off-by: Raphaël Mélotte <[email protected]>
@rmelotte rmelotte force-pushed the bugfix/various-jlib-fixes+master branch from a568ae5 to cc668dc Compare March 5, 2025 14:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant