projects
/
youtube-dl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[swfinterp] Implement charCodeAt
[youtube-dl]
/
youtube_dl
/
swfinterp.py
diff --git
a/youtube_dl/swfinterp.py
b/youtube_dl/swfinterp.py
index 4b47df29d20c2759c544365d6dae13880a05c044..7369c94fcacc78674ab297a48087678b510b4440 100644
(file)
--- a/
youtube_dl/swfinterp.py
+++ b/
youtube_dl/swfinterp.py
@@
-411,7
+411,9
@@
class SWFInterpreter(object):
self._classes_by_name, avm_class.variables])
while True:
opcode = _read_byte(coder)
self._classes_by_name, avm_class.variables])
while True:
opcode = _read_byte(coder)
- if opcode == 16: # jump
+ if opcode == 9: # label
+ pass # Spec says: "Do nothing."
+ elif opcode == 16: # jump
offset = s24()
coder.seek(coder.tell() + offset)
elif opcode == 17: # iftrue
offset = s24()
coder.seek(coder.tell() + offset)
elif opcode == 17: # iftrue
@@
-436,6
+438,12
@@
class SWFInterpreter(object):
value1 = stack.pop()
if value2 != value1:
coder.seek(coder.tell() + offset)
value1 = stack.pop()
if value2 != value1:
coder.seek(coder.tell() + offset)
+ elif opcode == 21: # iflt
+ offset = s24()
+ value2 = stack.pop()
+ value1 = stack.pop()
+ if value1 < value2:
+ coder.seek(coder.tell() + offset)
elif opcode == 32: # pushnull
stack.append(None)
elif opcode == 33: # pushundefined
elif opcode == 32: # pushnull
stack.append(None)
elif opcode == 33: # pushundefined
@@
-516,6
+524,13
@@
class SWFInterpreter(object):
res = obj.split(args[0])
stack.append(res)
continue
res = obj.split(args[0])
stack.append(res)
continue
+ elif mname == 'charCodeAt':
+ assert len(args) <= 1
+ idx = 0 if len(args) == 0 else args[0]
+ assert isinstance(idx, int)
+ res = ord(obj[idx])
+ stack.append(res)
+ continue
elif isinstance(obj, list):
if mname == 'slice':
assert len(args) == 1
elif isinstance(obj, list):
if mname == 'slice':
assert len(args) == 1
@@
-687,6
+702,11
@@
class SWFInterpreter(object):
value1 = stack.pop()
res = value1 - value2
stack.append(res)
value1 = stack.pop()
res = value1 - value2
stack.append(res)
+ elif opcode == 162: # multiply
+ value2 = stack.pop()
+ value1 = stack.pop()
+ res = value1 * value2
+ stack.append(res)
elif opcode == 164: # modulo
value2 = stack.pop()
value1 = stack.pop()
elif opcode == 164: # modulo
value2 = stack.pop()
value1 = stack.pop()
@@
-702,6
+722,10
@@
class SWFInterpreter(object):
value1 = stack.pop()
result = value1 >= value2
stack.append(result)
value1 = stack.pop()
result = value1 >= value2
stack.append(result)
+ elif opcode == 192: # increment_i
+ value = stack.pop()
+ assert isinstance(value, int)
+ stack.append(value + 1)
elif opcode == 208: # getlocal_0
stack.append(registers[0])
elif opcode == 209: # getlocal_1
elif opcode == 208: # getlocal_0
stack.append(registers[0])
elif opcode == 209: # getlocal_1