about summary refs log tree commit diff
path: root/youtube_dl/swfinterp.py
diff options
context:
space:
mode:
authorPhilipp Hagemeister <phihag@phihag.de>2014-11-17 05:03:46 +0100
committerPhilipp Hagemeister <phihag@phihag.de>2014-11-17 05:03:46 +0100
commit33a266f4bae7b53ad12bd79293bcc1f11ae6d407 (patch)
treeea91d78e28a75d037bc2f2700d266949700dbe5b /youtube_dl/swfinterp.py
parent6b592d93a29163664d3125761fbf6d7c9fe5f56c (diff)
downloadyoutube-dl-33a266f4bae7b53ad12bd79293bcc1f11ae6d407.tar.gz
youtube-dl-33a266f4bae7b53ad12bd79293bcc1f11ae6d407.tar.xz
youtube-dl-33a266f4bae7b53ad12bd79293bcc1f11ae6d407.zip
[swfinterp] Implement charCodeAt
Diffstat (limited to 'youtube_dl/swfinterp.py')
-rw-r--r--youtube_dl/swfinterp.py26
1 files changed, 25 insertions, 1 deletions
diff --git a/youtube_dl/swfinterp.py b/youtube_dl/swfinterp.py
index 4b47df29d..7369c94fc 100644
--- 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)
-                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
@@ -436,6 +438,12 @@ class SWFInterpreter(object):
                     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
@@ -516,6 +524,13 @@ class SWFInterpreter(object):
                                 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
@@ -687,6 +702,11 @@ class SWFInterpreter(object):
                     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()
@@ -702,6 +722,10 @@ class SWFInterpreter(object):
                     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