mirror of
				https://github.com/ytdl-org/youtube-dl.git
				synced 2025-10-29 09:26:20 -07: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:
		| @@ -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( | ||||
|   | ||||
		Reference in New Issue
	
	Block a user