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 |                 expr = self._dump(inner, local_vars) + outer | ||||||
|  |  | ||||||
|         if expr.startswith('('): |         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: |             if not outer or should_abort: | ||||||
|                 return inner, should_abort or should_return |                 return inner, should_abort or should_return | ||||||
|             else: |             else: | ||||||
| @@ -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( | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user