mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2025-06-18 15:55:30 +02:00
[jsinterp] Fix increment/decrement evaluation (#13238)
Closes #13241 Authored by: seproDev, bashonly Co-authored-by: bashonly <88596187+bashonly@users.noreply.github.com>
This commit is contained in:
parent
83fabf3524
commit
167d7a9f0f
@ -478,6 +478,14 @@ class TestJSInterpreter(unittest.TestCase):
|
|||||||
func = jsi.extract_function('c', {'e': 10}, {'f': 100, 'g': 1000})
|
func = jsi.extract_function('c', {'e': 10}, {'f': 100, 'g': 1000})
|
||||||
self.assertEqual(func([1]), 1111)
|
self.assertEqual(func([1]), 1111)
|
||||||
|
|
||||||
|
def test_increment_decrement(self):
|
||||||
|
self._test('function f() { var x = 1; return ++x; }', 2)
|
||||||
|
self._test('function f() { var x = 1; return x++; }', 1)
|
||||||
|
self._test('function f() { var x = 1; x--; return x }', 0)
|
||||||
|
self._test('function f() { var y; var x = 1; x++, --x, x--, x--, y="z", "abc", x++; return --x }', -1)
|
||||||
|
self._test('function f() { var a = "test--"; return a; }', 'test--')
|
||||||
|
self._test('function f() { var b = 1; var a = "b--"; return a; }', 'b--')
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
@ -316,6 +316,10 @@ _NSIG_TESTS = [
|
|||||||
'https://www.youtube.com/s/player/8a8ac953/tv-player-es6.vflset/tv-player-es6.js',
|
'https://www.youtube.com/s/player/8a8ac953/tv-player-es6.vflset/tv-player-es6.js',
|
||||||
'MiBYeXx_vRREbiCCmh', 'RtZYMVvmkE0JE',
|
'MiBYeXx_vRREbiCCmh', 'RtZYMVvmkE0JE',
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
'https://www.youtube.com/s/player/59b252b9/player_ias.vflset/en_US/base.js',
|
||||||
|
'D3XWVpYgwhLLKNK4AGX', 'aZrQ1qWJ5yv5h',
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -590,39 +590,12 @@ class JSInterpreter:
|
|||||||
return ret, True
|
return ret, True
|
||||||
return ret, False
|
return ret, False
|
||||||
|
|
||||||
for m in re.finditer(rf'''(?x)
|
|
||||||
(?P<pre_sign>\+\+|--)(?P<var1>{_NAME_RE})|
|
|
||||||
(?P<var2>{_NAME_RE})(?P<post_sign>\+\+|--)''', expr):
|
|
||||||
var = m.group('var1') or m.group('var2')
|
|
||||||
start, end = m.span()
|
|
||||||
sign = m.group('pre_sign') or m.group('post_sign')
|
|
||||||
ret = local_vars[var]
|
|
||||||
local_vars[var] += 1 if sign[0] == '+' else -1
|
|
||||||
if m.group('pre_sign'):
|
|
||||||
ret = local_vars[var]
|
|
||||||
expr = expr[:start] + self._dump(ret, local_vars) + expr[end:]
|
|
||||||
|
|
||||||
if not expr:
|
|
||||||
return None, should_return
|
|
||||||
|
|
||||||
m = re.match(fr'''(?x)
|
m = re.match(fr'''(?x)
|
||||||
(?P<assign>
|
|
||||||
(?P<out>{_NAME_RE})(?:\[(?P<index>{_NESTED_BRACKETS})\])?\s*
|
(?P<out>{_NAME_RE})(?:\[(?P<index>{_NESTED_BRACKETS})\])?\s*
|
||||||
(?P<op>{"|".join(map(re.escape, set(_OPERATORS) - _COMP_OPERATORS))})?
|
(?P<op>{"|".join(map(re.escape, set(_OPERATORS) - _COMP_OPERATORS))})?
|
||||||
=(?!=)(?P<expr>.*)$
|
=(?!=)(?P<expr>.*)$
|
||||||
)|(?P<return>
|
''', expr)
|
||||||
(?!if|return|true|false|null|undefined|NaN)(?P<name>{_NAME_RE})$
|
if m: # We are assigning a value to a variable
|
||||||
)|(?P<attribute>
|
|
||||||
(?P<var>{_NAME_RE})(?:
|
|
||||||
(?P<nullish>\?)?\.(?P<member>[^(]+)|
|
|
||||||
\[(?P<member2>{_NESTED_BRACKETS})\]
|
|
||||||
)\s*
|
|
||||||
)|(?P<indexing>
|
|
||||||
(?P<in>{_NAME_RE})\[(?P<idx>.+)\]$
|
|
||||||
)|(?P<function>
|
|
||||||
(?P<fname>{_NAME_RE})\((?P<args>.*)\)$
|
|
||||||
)''', expr)
|
|
||||||
if m and m.group('assign'):
|
|
||||||
left_val = local_vars.get(m.group('out'))
|
left_val = local_vars.get(m.group('out'))
|
||||||
|
|
||||||
if not m.group('index'):
|
if not m.group('index'):
|
||||||
@ -640,7 +613,35 @@ class JSInterpreter:
|
|||||||
m.group('op'), self._index(left_val, idx), m.group('expr'), expr, local_vars, allow_recursion)
|
m.group('op'), self._index(left_val, idx), m.group('expr'), expr, local_vars, allow_recursion)
|
||||||
return left_val[idx], should_return
|
return left_val[idx], should_return
|
||||||
|
|
||||||
elif expr.isdigit():
|
for m in re.finditer(rf'''(?x)
|
||||||
|
(?P<pre_sign>\+\+|--)(?P<var1>{_NAME_RE})|
|
||||||
|
(?P<var2>{_NAME_RE})(?P<post_sign>\+\+|--)''', expr):
|
||||||
|
var = m.group('var1') or m.group('var2')
|
||||||
|
start, end = m.span()
|
||||||
|
sign = m.group('pre_sign') or m.group('post_sign')
|
||||||
|
ret = local_vars[var]
|
||||||
|
local_vars[var] += 1 if sign[0] == '+' else -1
|
||||||
|
if m.group('pre_sign'):
|
||||||
|
ret = local_vars[var]
|
||||||
|
expr = expr[:start] + self._dump(ret, local_vars) + expr[end:]
|
||||||
|
|
||||||
|
if not expr:
|
||||||
|
return None, should_return
|
||||||
|
|
||||||
|
m = re.match(fr'''(?x)
|
||||||
|
(?P<return>
|
||||||
|
(?!if|return|true|false|null|undefined|NaN)(?P<name>{_NAME_RE})$
|
||||||
|
)|(?P<attribute>
|
||||||
|
(?P<var>{_NAME_RE})(?:
|
||||||
|
(?P<nullish>\?)?\.(?P<member>[^(]+)|
|
||||||
|
\[(?P<member2>{_NESTED_BRACKETS})\]
|
||||||
|
)\s*
|
||||||
|
)|(?P<indexing>
|
||||||
|
(?P<in>{_NAME_RE})\[(?P<idx>.+)\]$
|
||||||
|
)|(?P<function>
|
||||||
|
(?P<fname>{_NAME_RE})\((?P<args>.*)\)$
|
||||||
|
)''', expr)
|
||||||
|
if expr.isdigit():
|
||||||
return int(expr), should_return
|
return int(expr), should_return
|
||||||
|
|
||||||
elif expr == 'break':
|
elif expr == 'break':
|
||||||
|
Loading…
x
Reference in New Issue
Block a user