Browse Source

[swfinterp] Add support for calling methods on objects

totalwebcasting
Philipp Hagemeister 10 years ago
parent
commit
0d989011ff
2 changed files with 41 additions and 11 deletions
  1. +21
    -0
      test/swftests/PrivateCall.as
  2. +20
    -11
      youtube_dl/swfinterp.py

+ 21
- 0
test/swftests/PrivateCall.as 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();
}
}

+ 20
- 11
youtube_dl/swfinterp.py View File

@ -50,6 +50,17 @@ class _AVMClass_Object(object):
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):
def __init__(self, name_idx, name):
self.name_idx = name_idx
@ -59,17 +70,7 @@ class _AVMClass(object):
self.methods = {}
self.method_pyfunctions = {}
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__())
self.variables = ScopeDict(self)
self.variables = _ScopeDict(self)
def make_object(self):
return _AVMClass_Object(self)
@ -411,6 +412,14 @@ class SWFInterpreter(object):
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)
res = func(args)
else:
res = obj[mname]
stack.append(res)
continue
elif isinstance(obj, compat_str):
if mname == 'split':
assert len(args) == 1


Loading…
Cancel
Save