1
0
Fork 0
mirror of https://github.com/ytdl-org/youtube-dl.git synced 2024-11-24 03:01:53 +00:00

[swfinterp] Add support for calling methods on objects

This commit is contained in:
Philipp Hagemeister 2014-07-20 14:49:10 +02:00
parent 01b4b74574
commit 0d989011ff
2 changed files with 41 additions and 11 deletions

View file

@ -0,0 +1,21 @@
// input: []
// output: 9
package {
public class PrivateCall {
public static function main():int{
var f:OtherClass = new OtherClass();
return f.func();
}
}
}
class OtherClass {
private function pf():int {
return 9;
}
public function func():int {
return this.pf();
}
}

View file

@ -50,6 +50,17 @@ class _AVMClass_Object(object):
return '%s#%x' % (self.avm_class.name, id(self)) return '%s#%x' % (self.avm_class.name, id(self))
class _ScopeDict(dict):
def __init__(self, avm_class):
super(_ScopeDict, self).__init__()
self.avm_class = avm_class
def __repr__(self):
return '%s__Scope(%s)' % (
self.avm_class.name,
super(_ScopeDict, self).__repr__())
class _AVMClass(object): class _AVMClass(object):
def __init__(self, name_idx, name): def __init__(self, name_idx, name):
self.name_idx = name_idx self.name_idx = name_idx
@ -59,17 +70,7 @@ class _AVMClass(object):
self.methods = {} self.methods = {}
self.method_pyfunctions = {} self.method_pyfunctions = {}
class ScopeDict(dict): self.variables = _ScopeDict(self)
def __init__(self, avm_class):
super(ScopeDict, self).__init__()
self.avm_class = avm_class
def __repr__(self):
return '%s__Scope(%s)' % (
self.avm_class.name,
super(ScopeDict, self).__repr__())
self.variables = ScopeDict(self)
def make_object(self): def make_object(self):
return _AVMClass_Object(self) return _AVMClass_Object(self)
@ -411,6 +412,14 @@ class SWFInterpreter(object):
res = func(args) res = func(args)
stack.append(res) stack.append(res)
continue continue
elif isinstance(obj, _ScopeDict):
if mname in obj.avm_class.method_names:
func = self.extract_function(obj.avm_class, mname)
res = func(args)
else:
res = obj[mname]
stack.append(res)
continue
elif isinstance(obj, compat_str): elif isinstance(obj, compat_str):
if mname == 'split': if mname == 'split':
assert len(args) == 1 assert len(args) == 1