aboutsummaryrefslogtreecommitdiff
path: root/yt_dlp/jsinterp.py
diff options
context:
space:
mode:
authorSimon Sawicki <contact@grub4k.xyz>2024-07-08 23:46:26 +0200
committerGitHub <noreply@github.com>2024-07-08 23:46:26 +0200
commit6c056ea7aeb03660281653a9668547f2548f194f (patch)
tree8acd69b717d9bdf4a875a99fd7c048d4f5f47894 /yt_dlp/jsinterp.py
parent39bc699d2e6e39b26af028cc09a7b1d460d00e31 (diff)
[jsinterp] Implement `Function.prototype` resolving for `call` and `apply` (#10392)
Authored by: Grub4K
Diffstat (limited to 'yt_dlp/jsinterp.py')
-rw-r--r--yt_dlp/jsinterp.py18
1 files changed, 18 insertions, 0 deletions
diff --git a/yt_dlp/jsinterp.py b/yt_dlp/jsinterp.py
index a0f32892f..851d4dc7b 100644
--- a/yt_dlp/jsinterp.py
+++ b/yt_dlp/jsinterp.py
@@ -636,6 +636,8 @@ class JSInterpreter:
raise self.Exception(f'{member} {msg}', expr)
def eval_method():
+ nonlocal member
+
if (variable, member) == ('console', 'debug'):
if Debugger.ENABLED:
Debugger.write(self.interpret_expression(f'[{arg_str}]', local_vars, allow_recursion))
@@ -644,6 +646,7 @@ class JSInterpreter:
types = {
'String': str,
'Math': float,
+ 'Array': list,
}
obj = local_vars.get(variable, types.get(variable, NO_DEFAULT))
if obj is NO_DEFAULT:
@@ -667,6 +670,21 @@ class JSInterpreter:
self.interpret_expression(v, local_vars, allow_recursion)
for v in self._separate(arg_str)]
+ # Fixup prototype call
+ if isinstance(obj, type) and member.startswith('prototype.'):
+ new_member, _, func_prototype = member.partition('.')[2].partition('.')
+ assertion(argvals, 'takes one or more arguments')
+ assertion(isinstance(argvals[0], obj), f'needs binding to type {obj}')
+ if func_prototype == 'call':
+ obj, *argvals = argvals
+ elif func_prototype == 'apply':
+ assertion(len(argvals) == 2, 'takes two arguments')
+ obj, argvals = argvals
+ assertion(isinstance(argvals, list), 'second argument needs to be a list')
+ else:
+ raise self.Exception(f'Unsupported Function method {func_prototype}', expr)
+ member = new_member
+
if obj is str:
if member == 'fromCharCode':
assertion(argvals, 'takes one or more arguments')