diff options
| -rw-r--r-- | test/swftests/PrivateVoidCall.as | 22 | ||||
| -rw-r--r-- | youtube_dl/swfinterp.py | 17 | 
2 files changed, 38 insertions, 1 deletions
diff --git a/test/swftests/PrivateVoidCall.as b/test/swftests/PrivateVoidCall.as new file mode 100644 index 000000000..2cc016797 --- /dev/null +++ b/test/swftests/PrivateVoidCall.as @@ -0,0 +1,22 @@ +// input: [] +// output: 9 + +package { +public class PrivateVoidCall { +    public static function main():int{ +        var f:OtherClass = new OtherClass(); +        f.func(); +        return 9; +    } +} +} + +class OtherClass { +    private function pf():void { +        ; +    } + +    public function func():void { +        this.pf(); +    } +} diff --git a/youtube_dl/swfinterp.py b/youtube_dl/swfinterp.py index dd4dd060a..f4ee022f4 100644 --- a/youtube_dl/swfinterp.py +++ b/youtube_dl/swfinterp.py @@ -504,6 +504,9 @@ class SWFInterpreter(object):                      raise NotImplementedError(                          'Unsupported property %r on %r'                          % (mname, obj)) +                elif opcode == 71:  # returnvoid +                    res = None +                    return res                  elif opcode == 72:  # returnvalue                      res = stack.pop()                      return res @@ -527,6 +530,17 @@ class SWFInterpreter(object):                      args = list(reversed(                          [stack.pop() for _ in range(arg_count)]))                      obj = stack.pop() +                    if isinstance(obj, _AVMClass_Object): +                        func = self.extract_function(obj.avm_class, mname) +                        res = func(args) +                        assert res is None +                        continue +                    if isinstance(obj, _ScopeDict): +                        assert mname in obj.avm_class.method_names +                        func = self.extract_function(obj.avm_class, mname) +                        res = func(args) +                        assert res is None +                        continue                      if mname == 'reverse':                          assert isinstance(obj, list)                          obj.reverse() @@ -603,7 +617,8 @@ class SWFInterpreter(object):                          obj = stack.pop()                          assert isinstance(obj, (dict, _ScopeDict)), \                              'Accessing member %r on %r' % (pname, obj) -                        stack.append(obj[pname]) +                        res = obj.get(pname, None) +                        stack.append(res)                      else:  # Assume attribute access                          idx = stack.pop()                          assert isinstance(idx, int)  | 
