diff options
| -rw-r--r-- | test/swftests/StringBasics.as | 11 | ||||
| -rw-r--r-- | test/swftests/StringConversion.as | 11 | ||||
| -rw-r--r-- | youtube_dl/swfinterp.py | 21 | 
3 files changed, 41 insertions, 2 deletions
| 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 @@ 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() | 
