about summary refs log tree commit diff
path: root/youtube_dl/swfinterp.py
diff options
context:
space:
mode:
authorPhilipp Hagemeister <phihag@phihag.de>2014-11-17 04:54:54 +0100
committerPhilipp Hagemeister <phihag@phihag.de>2014-11-17 04:54:54 +0100
commit6b592d93a29163664d3125761fbf6d7c9fe5f56c (patch)
tree2f9c8f8f792870d355a5d744d5e335a589b7880e /youtube_dl/swfinterp.py
parent4686ae4b64c3c0a88b9a8a3fb7a7657df3753c5e (diff)
downloadyoutube-dl-6b592d93a29163664d3125761fbf6d7c9fe5f56c.tar.gz
youtube-dl-6b592d93a29163664d3125761fbf6d7c9fe5f56c.tar.xz
youtube-dl-6b592d93a29163664d3125761fbf6d7c9fe5f56c.zip
[swfinterp] Formalize built-in classes
Diffstat (limited to 'youtube_dl/swfinterp.py')
-rw-r--r--youtube_dl/swfinterp.py46
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