aboutsummaryrefslogtreecommitdiff
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
parent0d989011fffd768116d0ca81f6c067c7e0876f36 (diff)
[swfinterp] Correct array access
-rw-r--r--test/swftests/ArrayAccess.as19
-rw-r--r--youtube_dl/swfinterp.py20
2 files changed, 38 insertions, 1 deletions
diff --git a/test/swftests/ArrayAccess.as b/test/swftests/ArrayAccess.as
new file mode 100644
index 000000000..e22caa386
--- /dev/null
+++ b/test/swftests/ArrayAccess.as
@@ -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;
+ }
+}
+}
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()