[swfinterp] Intepret more multinames
This commit is contained in:
		
							
								
								
									
										10
									
								
								test/swftests/DictCall.as
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								test/swftests/DictCall.as
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | |||||||
|  | // input: [{"x": 1, "y": 2}] | ||||||
|  | // output: 3 | ||||||
|  |  | ||||||
|  | package { | ||||||
|  | public class DictCall { | ||||||
|  |     public static function main(d:Object):int{ | ||||||
|  |     	return d.x + d.y; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | } | ||||||
| @@ -213,6 +213,10 @@ class SWFInterpreter(object): | |||||||
|                 u30()  # namespace_idx |                 u30()  # namespace_idx | ||||||
|                 name_idx = u30() |                 name_idx = u30() | ||||||
|                 self.multinames.append(self.constant_strings[name_idx]) |                 self.multinames.append(self.constant_strings[name_idx]) | ||||||
|  |             elif kind == 0x09: | ||||||
|  |                 name_idx = u30() | ||||||
|  |                 u30() | ||||||
|  |                 self.multinames.append(self.constant_strings[name_idx]) | ||||||
|             else: |             else: | ||||||
|                 self.multinames.append(_Multiname(kind)) |                 self.multinames.append(_Multiname(kind)) | ||||||
|                 for _c2 in range(MULTINAME_SIZES[kind]): |                 for _c2 in range(MULTINAME_SIZES[kind]): | ||||||
| @@ -557,6 +561,11 @@ class SWFInterpreter(object): | |||||||
|                         obj = stack.pop() |                         obj = stack.pop() | ||||||
|                         assert isinstance(obj, list) |                         assert isinstance(obj, list) | ||||||
|                         stack.append(len(obj)) |                         stack.append(len(obj)) | ||||||
|  |                     elif isinstance(pname, compat_str):  # Member access | ||||||
|  |                         obj = stack.pop() | ||||||
|  |                         assert isinstance(obj, (dict, _ScopeDict)), \ | ||||||
|  |                             'Accessing member on %r' % obj | ||||||
|  |                         stack.append(obj[pname]) | ||||||
|                     else:  # Assume attribute access |                     else:  # Assume attribute access | ||||||
|                         idx = stack.pop() |                         idx = stack.pop() | ||||||
|                         assert isinstance(idx, int) |                         assert isinstance(idx, int) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Philipp Hagemeister
					Philipp Hagemeister