youtube-dl

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

commit 3cbcff8a2dacf6d4f10f00af36b9761ef833e6ea
parent e983cf52775e493b7deedbe48d2f50f598c9da4e
Author: Philipp Hagemeister <phihag@phihag.de>
Date:   Mon, 17 Nov 2014 04:25:04 +0100

[swfinterp] Implement String basics

Diffstat:
Atest/swftests/StringBasics.as | 11+++++++++++
Atest/swftests/StringConversion.as | 11+++++++++++
Myoutube_dl/swfinterp.py | 21+++++++++++++++++++--
3 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/test/swftests/StringBasics.as b/test/swftests/StringBasics.as @@ -0,0 +1,11 @@ +// input: [] +// output: 3 + +package { +public class StringBasics { + public static function main():int{ + var s:String = "abc"; + return s.length; + } +} +} diff --git a/test/swftests/StringConversion.as b/test/swftests/StringConversion.as @@ -0,0 +1,11 @@ +// input: [] +// output: 2 + +package { +public class StringConversion { + public static function main():int{ + var s:String = String(99); + return s.length; + } +} +} diff --git a/youtube_dl/swfinterp.py b/youtube_dl/swfinterp.py @@ -148,6 +148,9 @@ def _read_byte(reader): return res +StringClass = _AVMClass('(no name idx)', 'String') + + class SWFInterpreter(object): def __init__(self, file_contents): self._patched_functions = {} @@ -483,6 +486,17 @@ class SWFInterpreter(object): res = args[0].join(obj) stack.append(res) continue + elif obj == StringClass: + if mname == 'String': + assert len(args) == 1 + assert isinstance(args[0], (int, compat_str)) + res = compat_str(args[0]) + stack.append(res) + continue + else: + raise NotImplementedError( + 'Function String.%s is not yet implemented' + % mname) raise NotImplementedError( 'Unsupported property %r on %r' % (mname, obj)) @@ -532,7 +546,10 @@ class SWFInterpreter(object): break else: res = scopes[0] - stack.append(res[mname]) + if mname not in res and mname == 'String': + stack.append(StringClass) + else: + stack.append(res[mname]) elif opcode == 94: # findproperty index = u30() mname = self.multinames[index] @@ -576,7 +593,7 @@ class SWFInterpreter(object): pname = self.multinames[index] if pname == 'length': obj = stack.pop() - assert isinstance(obj, list) + assert isinstance(obj, (compat_str, list)) stack.append(len(obj)) elif isinstance(pname, compat_str): # Member access obj = stack.pop()