about summary refs log tree commit diff
path: root/youtube_dl/swfinterp.py
diff options
context:
space:
mode:
authorPhilipp Hagemeister <phihag@phihag.de>2014-07-20 18:28:49 +0200
committerPhilipp Hagemeister <phihag@phihag.de>2014-07-20 18:28:49 +0200
commitdecf2ae400d52e98bcd073a69b24b3dbf3d38d53 (patch)
tree06ec1f9ecaebbfe25927beb577121365abe450ed /youtube_dl/swfinterp.py
parent0d989011fffd768116d0ca81f6c067c7e0876f36 (diff)
downloadyoutube-dl-decf2ae400d52e98bcd073a69b24b3dbf3d38d53.tar.gz
youtube-dl-decf2ae400d52e98bcd073a69b24b3dbf3d38d53.tar.xz
youtube-dl-decf2ae400d52e98bcd073a69b24b3dbf3d38d53.zip
[swfinterp] Correct array access
Diffstat (limited to 'youtube_dl/swfinterp.py')
-rw-r--r--youtube_dl/swfinterp.py20
1 files changed, 19 insertions, 1 deletions
diff --git a/youtube_dl/swfinterp.py b/youtube_dl/swfinterp.py
index d043c2f99..812ee7e8c 100644
--- a/youtube_dl/swfinterp.py
+++ b/youtube_dl/swfinterp.py
@@ -85,6 +85,14 @@ class _AVMClass(object):
             for name, idx in methods.items()))
 
 
+class _Multiname(object):
+    def __init__(self, kind):
+        self.kind = kind
+
+    def __repr__(self):
+        return '[MULTINAME kind: 0x%x]' % self.kind
+
+
 def _read_int(reader):
     res = 0
     shift = 0
@@ -205,7 +213,7 @@ class SWFInterpreter(object):
                 name_idx = u30()
                 self.multinames.append(self.constant_strings[name_idx])
             else:
-                self.multinames.append('[MULTINAME kind: %d]' % kind)
+                self.multinames.append(_Multiname(kind))
                 for _c2 in range(MULTINAME_SIZES[kind]):
                     u30()
 
@@ -399,6 +407,13 @@ class SWFInterpreter(object):
                 elif opcode == 48:  # pushscope
                     new_scope = stack.pop()
                     scopes.append(new_scope)
+                elif opcode == 66:  # construct
+                    arg_count = u30()
+                    args = list(reversed(
+                        [stack.pop() for _ in range(arg_count)]))
+                    obj = stack.pop()
+                    res = obj.avm_class.make_object()
+                    stack.append(res)
                 elif opcode == 70:  # callproperty
                     index = u30()
                     mname = self.multinames[index]
@@ -521,7 +536,10 @@ class SWFInterpreter(object):
                     index = u30()
                     value = stack.pop()
                     idx = self.multinames[index]
+                    if isinstance(idx, _Multiname):
+                        idx = stack.pop()
                     obj = stack.pop()
+                    print('Setting %r.%r = %r' % (obj, idx, value))
                     obj[idx] = value
                 elif opcode == 98:  # getlocal
                     index = u30()