]> jfr.im git - yt-dlp.git/commitdiff
[cleanup, jsinterp] Give functions names to help debugging
authorpukkandan <redacted>
Fri, 3 Mar 2023 17:54:50 +0000 (23:24 +0530)
committerpukkandan <redacted>
Fri, 3 Mar 2023 17:54:50 +0000 (23:24 +0530)
yt_dlp/jsinterp.py
yt_dlp/utils.py

index 31ab204d75300deb983b335d6ccf11a76381a026..db652600911cf7cd207f439217cedbd4307a3c1c 100644 (file)
@@ -9,6 +9,7 @@
 from .utils import (
     NO_DEFAULT,
     ExtractorError,
+    function_with_repr,
     js_to_json,
     remove_quotes,
     truncate_string,
@@ -184,7 +185,8 @@ def interpret_statement(self, stmt, local_vars, allow_recursion, *args, **kwargs
                     cls.write('=> Raises:', e, '<-|', stmt, level=allow_recursion)
                 raise
             if cls.ENABLED and stmt.strip():
-                cls.write(['->', '=>'][should_ret], repr(ret), '<-|', stmt, level=allow_recursion)
+                if should_ret or not repr(ret) == stmt:
+                    cls.write(['->', '=>'][should_ret], repr(ret), '<-|', stmt, level=allow_recursion)
             return ret, should_ret
         return interpret_statement
 
@@ -205,8 +207,6 @@ class JSInterpreter:
         'y': 4096,  # Perform a "sticky" search that matches starting at the current position in the target string
     }
 
-    _EXC_NAME = '__yt_dlp_exception__'
-
     def __init__(self, code, objects=None):
         self.code, self._functions = code, {}
         self._objects = {} if objects is None else objects
@@ -220,6 +220,8 @@ def __init__(self, msg, expr=None, *args, **kwargs):
     def _named_object(self, namespace, obj):
         self.__named_object_counter += 1
         name = f'__yt_dlp_jsinterp_obj{self.__named_object_counter}'
+        if callable(obj) and not isinstance(obj, function_with_repr):
+            obj = function_with_repr(obj, f'F<{self.__named_object_counter}>')
         namespace[name] = obj
         return name
 
@@ -784,7 +786,8 @@ def extract_object(self, objname):
             fields)
         for f in fields_m:
             argnames = f.group('args').split(',')
-            obj[remove_quotes(f.group('key'))] = self.build_function(argnames, f.group('code'))
+            name = remove_quotes(f.group('key'))
+            obj[name] = function_with_repr(self.build_function(argnames, f.group('code')), f'F<{name}>')
 
         return obj
 
@@ -806,7 +809,9 @@ def extract_function_code(self, funcname):
         return [x.strip() for x in func_m.group('args').split(',')], code
 
     def extract_function(self, funcname):
-        return self.extract_function_from_code(*self.extract_function_code(funcname))
+        return function_with_repr(
+            self.extract_function_from_code(*self.extract_function_code(funcname)),
+            f'F<{funcname}>')
 
     def extract_function_from_code(self, argnames, code, *global_stack):
         local_vars = {}
index 9ff096433be229b5b5e5d975a05ae8b80c955210..19c1404839d63b31889ec6599b384eafc35e1170 100644 (file)
@@ -6057,14 +6057,16 @@ def __get__(self, _, cls):
 
 
 class function_with_repr:
-    def __init__(self, func):
+    def __init__(self, func, repr_=None):
         functools.update_wrapper(self, func)
-        self.func = func
+        self.func, self.__repr = func, repr_
 
     def __call__(self, *args, **kwargs):
         return self.func(*args, **kwargs)
 
     def __repr__(self):
+        if self.__repr:
+            return self.__repr
         return f'{self.func.__module__}.{self.func.__qualname__}'