[swfinterp] Add support for calling methods on objects
This commit is contained in:
		
							parent
							
								
									01b4b74574
								
							
						
					
					
						commit
						0d989011ff
					
				
					 2 changed files with 41 additions and 11 deletions
				
			
		
							
								
								
									
										21
									
								
								test/swftests/PrivateCall.as
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								test/swftests/PrivateCall.as
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,21 @@
 | 
				
			||||||
 | 
					// input: []
 | 
				
			||||||
 | 
					// output: 9
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package {
 | 
				
			||||||
 | 
					public class PrivateCall {
 | 
				
			||||||
 | 
					    public static function main():int{
 | 
				
			||||||
 | 
					    	var f:OtherClass = new OtherClass();
 | 
				
			||||||
 | 
					        return f.func();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class OtherClass {
 | 
				
			||||||
 | 
						private function pf():int {
 | 
				
			||||||
 | 
							return 9;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public function func():int {
 | 
				
			||||||
 | 
							return this.pf();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -50,6 +50,17 @@ class _AVMClass_Object(object):
 | 
				
			||||||
        return '%s#%x' % (self.avm_class.name, id(self))
 | 
					        return '%s#%x' % (self.avm_class.name, id(self))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class _ScopeDict(dict):
 | 
				
			||||||
 | 
					    def __init__(self, avm_class):
 | 
				
			||||||
 | 
					        super(_ScopeDict, self).__init__()
 | 
				
			||||||
 | 
					        self.avm_class = avm_class
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __repr__(self):
 | 
				
			||||||
 | 
					        return '%s__Scope(%s)' % (
 | 
				
			||||||
 | 
					            self.avm_class.name,
 | 
				
			||||||
 | 
					            super(_ScopeDict, self).__repr__())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class _AVMClass(object):
 | 
					class _AVMClass(object):
 | 
				
			||||||
    def __init__(self, name_idx, name):
 | 
					    def __init__(self, name_idx, name):
 | 
				
			||||||
        self.name_idx = name_idx
 | 
					        self.name_idx = name_idx
 | 
				
			||||||
| 
						 | 
					@ -59,17 +70,7 @@ class _AVMClass(object):
 | 
				
			||||||
        self.methods = {}
 | 
					        self.methods = {}
 | 
				
			||||||
        self.method_pyfunctions = {}
 | 
					        self.method_pyfunctions = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        class ScopeDict(dict):
 | 
					        self.variables = _ScopeDict(self)
 | 
				
			||||||
            def __init__(self, avm_class):
 | 
					 | 
				
			||||||
                super(ScopeDict, self).__init__()
 | 
					 | 
				
			||||||
                self.avm_class = avm_class
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            def __repr__(self):
 | 
					 | 
				
			||||||
                return '%s__Scope(%s)' % (
 | 
					 | 
				
			||||||
                    self.avm_class.name,
 | 
					 | 
				
			||||||
                    super(ScopeDict, self).__repr__())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        self.variables = ScopeDict(self)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def make_object(self):
 | 
					    def make_object(self):
 | 
				
			||||||
        return _AVMClass_Object(self)
 | 
					        return _AVMClass_Object(self)
 | 
				
			||||||
| 
						 | 
					@ -411,6 +412,14 @@ class SWFInterpreter(object):
 | 
				
			||||||
                        res = func(args)
 | 
					                        res = func(args)
 | 
				
			||||||
                        stack.append(res)
 | 
					                        stack.append(res)
 | 
				
			||||||
                        continue
 | 
					                        continue
 | 
				
			||||||
 | 
					                    elif isinstance(obj, _ScopeDict):
 | 
				
			||||||
 | 
					                        if mname in obj.avm_class.method_names:
 | 
				
			||||||
 | 
					                            func = self.extract_function(obj.avm_class, mname)
 | 
				
			||||||
 | 
					                            res = func(args)
 | 
				
			||||||
 | 
					                        else:
 | 
				
			||||||
 | 
					                            res = obj[mname]
 | 
				
			||||||
 | 
					                        stack.append(res)
 | 
				
			||||||
 | 
					                        continue
 | 
				
			||||||
                    elif isinstance(obj, compat_str):
 | 
					                    elif isinstance(obj, compat_str):
 | 
				
			||||||
                        if mname == 'split':
 | 
					                        if mname == 'split':
 | 
				
			||||||
                            assert len(args) == 1
 | 
					                            assert len(args) == 1
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue