diff options
| author | Philipp Hagemeister <phihag@phihag.de> | 2014-11-17 04:54:54 +0100 | 
|---|---|---|
| committer | Philipp Hagemeister <phihag@phihag.de> | 2014-11-17 04:54:54 +0100 | 
| commit | 6b592d93a29163664d3125761fbf6d7c9fe5f56c (patch) | |
| tree | 2f9c8f8f792870d355a5d744d5e335a589b7880e | |
| parent | 4686ae4b64c3c0a88b9a8a3fb7a7657df3753c5e (diff) | |
[swfinterp] Formalize built-in classes
| -rw-r--r-- | youtube_dl/swfinterp.py | 46 | 
1 files changed, 28 insertions, 18 deletions
diff --git a/youtube_dl/swfinterp.py b/youtube_dl/swfinterp.py index 008cd76c7..4b47df29d 100644 --- a/youtube_dl/swfinterp.py +++ b/youtube_dl/swfinterp.py @@ -149,6 +149,11 @@ def _read_byte(reader):  StringClass = _AVMClass('(no name idx)', 'String') +ByteArrayClass = _AVMClass('(no name idx)', 'ByteArray') +_builtin_classes = { +    StringClass.name: StringClass, +    ByteArrayClass.name: ByteArrayClass, +}  class _Undefined(object): @@ -468,11 +473,31 @@ class SWFInterpreter(object):                          [stack.pop() for _ in range(arg_count)]))                      obj = stack.pop() -                    if isinstance(obj, _AVMClass_Object): +                    if obj == StringClass: +                        if mname == 'String': +                            assert len(args) == 1 +                            assert isinstance(args[0], ( +                                int, compat_str, _Undefined)) +                            if args[0] == undefined: +                                res = 'undefined' +                            else: +                                res = compat_str(args[0]) +                            stack.append(res) +                            continue +                        else: +                            raise NotImplementedError( +                                'Function String.%s is not yet implemented' +                                % mname) +                    elif isinstance(obj, _AVMClass_Object):                          func = self.extract_function(obj.avm_class, mname)                          res = func(args)                          stack.append(res)                          continue +                    elif isinstance(obj, _AVMClass): +                        func = self.extract_function(obj, mname) +                        res = func(args) +                        stack.append(res) +                        continue                      elif isinstance(obj, _ScopeDict):                          if mname in obj.avm_class.method_names:                              func = self.extract_function(obj.avm_class, mname) @@ -504,21 +529,6 @@ 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, _Undefined)) -                            if args[0] == undefined: -                                res = 'undefined' -                            else: -                                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)) @@ -582,8 +592,8 @@ class SWFInterpreter(object):                              break                      else:                          res = scopes[0] -                    if mname not in res and mname == 'String': -                        stack.append(StringClass) +                    if mname not in res and mname in _builtin_classes: +                        stack.append(_builtin_classes[mname])                      else:                          stack.append(res[mname])                  elif opcode == 94:  # findproperty  | 
