[cleanup, jsinterp] Give functions names to help debugging

This commit is contained in:
pukkandan 2023-03-03 23:24:50 +05:30
parent 4815bbfc41
commit b2e0343ba0
No known key found for this signature in database
GPG Key ID: 7EEE9E1E817D0A39
2 changed files with 14 additions and 7 deletions

View File

@ -9,6 +9,7 @@
from .utils import ( from .utils import (
NO_DEFAULT, NO_DEFAULT,
ExtractorError, ExtractorError,
function_with_repr,
js_to_json, js_to_json,
remove_quotes, remove_quotes,
truncate_string, truncate_string,
@ -184,6 +185,7 @@ def interpret_statement(self, stmt, local_vars, allow_recursion, *args, **kwargs
cls.write('=> Raises:', e, '<-|', stmt, level=allow_recursion) cls.write('=> Raises:', e, '<-|', stmt, level=allow_recursion)
raise raise
if cls.ENABLED and stmt.strip(): if cls.ENABLED and stmt.strip():
if should_ret or not repr(ret) == stmt:
cls.write(['->', '=>'][should_ret], repr(ret), '<-|', stmt, level=allow_recursion) cls.write(['->', '=>'][should_ret], repr(ret), '<-|', stmt, level=allow_recursion)
return ret, should_ret return ret, should_ret
return interpret_statement 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 '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): def __init__(self, code, objects=None):
self.code, self._functions = code, {} self.code, self._functions = code, {}
self._objects = {} if objects is None else objects 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): def _named_object(self, namespace, obj):
self.__named_object_counter += 1 self.__named_object_counter += 1
name = f'__yt_dlp_jsinterp_obj{self.__named_object_counter}' 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 namespace[name] = obj
return name return name
@ -784,7 +786,8 @@ def extract_object(self, objname):
fields) fields)
for f in fields_m: for f in fields_m:
argnames = f.group('args').split(',') 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 return obj
@ -806,7 +809,9 @@ def extract_function_code(self, funcname):
return [x.strip() for x in func_m.group('args').split(',')], code return [x.strip() for x in func_m.group('args').split(',')], code
def extract_function(self, funcname): 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): def extract_function_from_code(self, argnames, code, *global_stack):
local_vars = {} local_vars = {}

View File

@ -6057,14 +6057,16 @@ def __get__(self, _, cls):
class function_with_repr: class function_with_repr:
def __init__(self, func): def __init__(self, func, repr_=None):
functools.update_wrapper(self, func) functools.update_wrapper(self, func)
self.func = func self.func, self.__repr = func, repr_
def __call__(self, *args, **kwargs): def __call__(self, *args, **kwargs):
return self.func(*args, **kwargs) return self.func(*args, **kwargs)
def __repr__(self): def __repr__(self):
if self.__repr:
return self.__repr
return f'{self.func.__module__}.{self.func.__qualname__}' return f'{self.func.__module__}.{self.func.__qualname__}'