diff options
| author | dirkf <fieldhouse@gmx.net> | 2023-05-11 21:02:01 +0100 | 
|---|---|---|
| committer | dirkf <fieldhouse@gmx.net> | 2023-05-11 21:02:01 +0100 | 
| commit | 6ed34338285f722d0da312ce0af3a15a077a3e2a (patch) | |
| tree | b56dd5131900e610a75436dfd2db83dae75aace7 /youtube_dl/jsinterp.py | |
| parent | a85a875fef2e9b097c3f6f93f1d0cead06f84e43 (diff) | |
[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.py | 22 | 
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( | 
