diff options
| -rw-r--r-- | test/swftests/ArrayAccess.as | 19 | ||||
| -rw-r--r-- | youtube_dl/swfinterp.py | 20 | 
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() | 
