[swfinterp] Correct array access
authorPhilipp Hagemeister <phihag@phihag.de>
Sun, 20 Jul 2014 16:28:49 +0000 (18:28 +0200)
committerPhilipp Hagemeister <phihag@phihag.de>
Sun, 20 Jul 2014 16:28:49 +0000 (18:28 +0200)
test/swftests/ArrayAccess.as [new file with mode: 0644]
youtube_dl/swfinterp.py

diff --git a/test/swftests/ArrayAccess.as b/test/swftests/ArrayAccess.as
new file mode 100644 (file)
index 0000000..e22caa3
--- /dev/null
@@ -0,0 +1,19 @@
+// input: [["a", "b", "c", "d"]]
+// output: ["c", "b", "a", "d"]
+
+package {
+public class ArrayAccess {
+    public static function main(ar:Array):Array {
+       var aa:ArrayAccess = new ArrayAccess();
+       return aa.f(ar, 2);
+    }
+
+    private function f(ar:Array, num:Number):Array{
+        var x:String = ar[0];
+        var y:String = ar[num % ar.length];
+        ar[0] = y;
+        ar[num] = x;
+        return ar;
+    }
+}
+}
index d043c2f992ef0d9fa683d9667482f50f28a26fb4..812ee7e8c54f97b2c6ef1e033f0975f22e5a6b6e 100644 (file)
@@ -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()