aboutsummaryrefslogtreecommitdiff
path: root/youtube_dl/jsinterp.py
diff options
context:
space:
mode:
authordirkf <fieldhouse@gmx.net>2023-05-11 21:02:01 +0100
committerdirkf <fieldhouse@gmx.net>2023-05-11 21:02:01 +0100
commit6ed34338285f722d0da312ce0af3a15a077a3e2a (patch)
treeb56dd5131900e610a75436dfd2db83dae75aace7 /youtube_dl/jsinterp.py
parenta85a875fef2e9b097c3f6f93f1d0cead06f84e43 (diff)
downloadyoutube-dl-6ed34338285f722d0da312ce0af3a15a077a3e2a.tar.xz
[jsinterp] Add short-cut evaluation for common expression
* special handling for (d%e.length+e.length)%e.length speeds up ~6%
Diffstat (limited to 'youtube_dl/jsinterp.py')
-rw-r--r--youtube_dl/jsinterp.py22
1 files changed, 20 insertions, 2 deletions
diff --git a/youtube_dl/jsinterp.py b/youtube_dl/jsinterp.py
index bb406647a..f837865c4 100644
--- a/youtube_dl/jsinterp.py
+++ b/youtube_dl/jsinterp.py
@@ -502,8 +502,15 @@ class JSInterpreter(object):
expr = self._dump(inner, local_vars) + outer
if expr.startswith('('):
- inner, outer = self._separate_at_paren(expr)
- inner, should_abort = self.interpret_statement(inner, local_vars, allow_recursion)
+
+ m = re.match(r'\((?P<d>[a-z])%(?P<e>[a-z])\.length\+(?P=e)\.length\)%(?P=e)\.length', expr)
+ if m:
+ # short-cut eval of frequently used `(d%e.length+e.length)%e.length`, worth ~6% on `pytest -k test_nsig`
+ outer = None
+ inner, should_abort = self._offset_e_by_d(m.group('d'), m.group('e'), local_vars)
+ else:
+ inner, outer = self._separate_at_paren(expr)
+ inner, should_abort = self.interpret_statement(inner, local_vars, allow_recursion)
if not outer or should_abort:
return inner, should_abort or should_return
else:
@@ -957,6 +964,17 @@ class JSInterpreter(object):
return obj
+ @staticmethod
+ def _offset_e_by_d(d, e, local_vars):
+ """ Short-cut eval: (d%e.length+e.length)%e.length """
+ try:
+ d = local_vars[d]
+ e = local_vars[e]
+ e = len(e)
+ return _js_mod(_js_mod(d, e) + e, e), False
+ except Exception:
+ return None, True
+
def extract_function_code(self, funcname):
""" @returns argnames, code """
func_m = re.search(