[swfinterp] Correct array access
This commit is contained in:
parent
0d989011ff
commit
decf2ae400
2 changed files with 38 additions and 1 deletions
19
test/swftests/ArrayAccess.as
Normal file
19
test/swftests/ArrayAccess.as
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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…
Reference in a new issue