mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-30 22:25:19 +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())) |             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() | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Philipp Hagemeister
					Philipp Hagemeister