mirror of
				https://github.com/ytdl-org/youtube-dl.git
				synced 2025-10-29 09:26:20 -07:00 
			
		
		
		
	[jsinterp] Fix and improve expression parsing
* improve BODMAS (fixes https://github.com/ytdl-org/youtube-dl/issues/32815) * support more weird expressions with multiple unary ops
This commit is contained in:
		| @@ -798,18 +798,28 @@ class JSInterpreter(object): | |||||||
|             right_expr = separated.pop() |             right_expr = separated.pop() | ||||||
|             # handle operators that are both unary and binary, minimal BODMAS |             # handle operators that are both unary and binary, minimal BODMAS | ||||||
|             if op in ('+', '-'): |             if op in ('+', '-'): | ||||||
|  |                 # simplify/adjust consecutive instances of these operators | ||||||
|                 undone = 0 |                 undone = 0 | ||||||
|                 while len(separated) > 1 and not separated[-1].strip(): |                 while len(separated) > 1 and not separated[-1].strip(): | ||||||
|                     undone += 1 |                     undone += 1 | ||||||
|                     separated.pop() |                     separated.pop() | ||||||
|                 if op == '-' and undone % 2 != 0: |                 if op == '-' and undone % 2 != 0: | ||||||
|                     right_expr = op + right_expr |                     right_expr = op + right_expr | ||||||
|  |                 elif op == '+': | ||||||
|  |                     while len(separated) > 1 and separated[-1].strip() in self.OP_CHARS: | ||||||
|  |                         right_expr = separated.pop() + right_expr | ||||||
|  |                 # hanging op at end of left => unary + (strip) or - (push right) | ||||||
|                 left_val = separated[-1] |                 left_val = separated[-1] | ||||||
|                 for dm_op in ('*', '%', '/', '**'): |                 for dm_op in ('*', '%', '/', '**'): | ||||||
|                     bodmas = tuple(self._separate(left_val, dm_op, skip_delims=skip_delim)) |                     bodmas = tuple(self._separate(left_val, dm_op, skip_delims=skip_delim)) | ||||||
|                     if len(bodmas) > 1 and not bodmas[-1].strip(): |                     if len(bodmas) > 1 and not bodmas[-1].strip(): | ||||||
|                         expr = op.join(separated) + op + right_expr |                         expr = op.join(separated) + op + right_expr | ||||||
|                         right_expr = None |                         if len(separated) > 1: | ||||||
|  |                             separated.pop() | ||||||
|  |                             right_expr = op.join((left_val, right_expr)) | ||||||
|  |                         else: | ||||||
|  |                             separated = [op.join((left_val, right_expr))] | ||||||
|  |                             right_expr = None | ||||||
|                         break |                         break | ||||||
|                 if right_expr is None: |                 if right_expr is None: | ||||||
|                     continue |                     continue | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user