1
0
Fork 0
mirror of https://github.com/ytdl-org/youtube-dl.git synced 2024-11-21 17:51:51 +00:00

[swfinterp] Add support for void methods

This commit is contained in:
Philipp Hagemeister 2014-11-17 04:36:23 +01:00
parent a4bb83956c
commit 8d05f2c16a
2 changed files with 38 additions and 1 deletions

View file

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

View file

@ -504,6 +504,9 @@ class SWFInterpreter(object):
raise NotImplementedError( raise NotImplementedError(
'Unsupported property %r on %r' 'Unsupported property %r on %r'
% (mname, obj)) % (mname, obj))
elif opcode == 71: # returnvoid
res = None
return res
elif opcode == 72: # returnvalue elif opcode == 72: # returnvalue
res = stack.pop() res = stack.pop()
return res return res
@ -527,6 +530,17 @@ class SWFInterpreter(object):
args = list(reversed( args = list(reversed(
[stack.pop() for _ in range(arg_count)])) [stack.pop() for _ in range(arg_count)]))
obj = stack.pop() obj = stack.pop()
if isinstance(obj, _AVMClass_Object):
func = self.extract_function(obj.avm_class, mname)
res = func(args)
assert res is None
continue
if isinstance(obj, _ScopeDict):
assert mname in obj.avm_class.method_names
func = self.extract_function(obj.avm_class, mname)
res = func(args)
assert res is None
continue
if mname == 'reverse': if mname == 'reverse':
assert isinstance(obj, list) assert isinstance(obj, list)
obj.reverse() obj.reverse()
@ -603,7 +617,8 @@ class SWFInterpreter(object):
obj = stack.pop() obj = stack.pop()
assert isinstance(obj, (dict, _ScopeDict)), \ assert isinstance(obj, (dict, _ScopeDict)), \
'Accessing member %r on %r' % (pname, obj) 'Accessing member %r on %r' % (pname, obj)
stack.append(obj[pname]) res = obj.get(pname, None)
stack.append(res)
else: # Assume attribute access else: # Assume attribute access
idx = stack.pop() idx = stack.pop()
assert isinstance(idx, int) assert isinstance(idx, int)