From 3cbcff8a2dacf6d4f10f00af36b9761ef833e6ea Mon Sep 17 00:00:00 2001 From: Philipp Hagemeister Date: Mon, 17 Nov 2014 04:25:04 +0100 Subject: [PATCH] [swfinterp] Implement String basics --- test/swftests/StringBasics.as | 11 +++++++++++ test/swftests/StringConversion.as | 11 +++++++++++ youtube_dl/swfinterp.py | 21 +++++++++++++++++++-- 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 test/swftests/StringBasics.as create mode 100644 test/swftests/StringConversion.as diff --git a/test/swftests/StringBasics.as b/test/swftests/StringBasics.as new file mode 100644 index 000000000..d27430b13 --- /dev/null +++ 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 new file mode 100644 index 000000000..c976f5042 --- /dev/null +++ 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 index 85efde592..0ce8474ca 100644 --- 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 @@ def resfunc(args): 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 @@ def resfunc(args): 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 @@ def resfunc(args): 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()