youtube-dl

Another place where youtube-dl lives on
git clone git://git.oshgnacknak.de/youtube-dl.git
Log | Files | Refs | README | LICENSE

commit 8d05f2c16a79e4127963d28bb41587105680e72c
parent a4bb83956cf3aa4f569c30b4d144b4fb327c7b56
Author: Philipp Hagemeister <phihag@phihag.de>
Date:   Mon, 17 Nov 2014 04:36:23 +0100

[swfinterp] Add support for void methods

Diffstat:
Atest/swftests/PrivateVoidCall.as | 22++++++++++++++++++++++
Myoutube_dl/swfinterp.py | 17++++++++++++++++-
2 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/test/swftests/PrivateVoidCall.as 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 @@ -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)