mirror of
https://github.com/ytdl-org/youtube-dl
synced 2024-11-30 10:22:55 +01:00
[jsinterp] Add short-cut evaluation for common expression
* special handling for (d%e.length+e.length)%e.length speeds up ~6%
This commit is contained in:
parent
a85a875fef
commit
6ed3433828
@ -502,6 +502,13 @@ class JSInterpreter(object):
|
|||||||
expr = self._dump(inner, local_vars) + outer
|
expr = self._dump(inner, local_vars) + outer
|
||||||
|
|
||||||
if expr.startswith('('):
|
if expr.startswith('('):
|
||||||
|
|
||||||
|
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, outer = self._separate_at_paren(expr)
|
||||||
inner, should_abort = self.interpret_statement(inner, local_vars, allow_recursion)
|
inner, should_abort = self.interpret_statement(inner, local_vars, allow_recursion)
|
||||||
if not outer or should_abort:
|
if not outer or should_abort:
|
||||||
@ -957,6 +964,17 @@ class JSInterpreter(object):
|
|||||||
|
|
||||||
return obj
|
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):
|
def extract_function_code(self, funcname):
|
||||||
""" @returns argnames, code """
|
""" @returns argnames, code """
|
||||||
func_m = re.search(
|
func_m = re.search(
|
||||||
|
Loading…
Reference in New Issue
Block a user