mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 06:35:12 +00:00 
			
		
		
		
	[swfinterp] Correct array access
This commit is contained in:
		
							
								
								
									
										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())) | ||||
|  | ||||
|  | ||||
| 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() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Philipp Hagemeister
					Philipp Hagemeister