Browse Source

[swfinterp] Correct array access

totalwebcasting
Philipp Hagemeister 11 years ago
parent
commit
decf2ae400
2 changed files with 38 additions and 1 deletions
  1. +19
    -0
      test/swftests/ArrayAccess.as
  2. +19
    -1
      youtube_dl/swfinterp.py

+ 19
- 0
test/swftests/ArrayAccess.as View File

@ -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;
}
}
}

+ 19
- 1
youtube_dl/swfinterp.py View File

@ -85,6 +85,14 @@ class _AVMClass(object):
for name, idx in methods.items())) 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): def _read_int(reader):
res = 0 res = 0
shift = 0 shift = 0
@ -205,7 +213,7 @@ class SWFInterpreter(object):
name_idx = u30() name_idx = u30()
self.multinames.append(self.constant_strings[name_idx]) self.multinames.append(self.constant_strings[name_idx])
else: else:
self.multinames.append('[MULTINAME kind: %d]' % kind)
self.multinames.append(_Multiname(kind))
for _c2 in range(MULTINAME_SIZES[kind]): for _c2 in range(MULTINAME_SIZES[kind]):
u30() u30()
@ -399,6 +407,13 @@ class SWFInterpreter(object):
elif opcode == 48: # pushscope elif opcode == 48: # pushscope
new_scope = stack.pop() new_scope = stack.pop()
scopes.append(new_scope) 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 elif opcode == 70: # callproperty
index = u30() index = u30()
mname = self.multinames[index] mname = self.multinames[index]
@ -521,7 +536,10 @@ class SWFInterpreter(object):
index = u30() index = u30()
value = stack.pop() value = stack.pop()
idx = self.multinames[index] idx = self.multinames[index]
if isinstance(idx, _Multiname):
idx = stack.pop()
obj = stack.pop() obj = stack.pop()
print('Setting %r.%r = %r' % (obj, idx, value))
obj[idx] = value obj[idx] = value
elif opcode == 98: # getlocal elif opcode == 98: # getlocal
index = u30() index = u30()


Loading…
Cancel
Save