[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…
	
	Add table
		Add a link
		
	
		Reference in a new issue