From 33a266f4bae7b53ad12bd79293bcc1f11ae6d407 Mon Sep 17 00:00:00 2001 From: Philipp Hagemeister Date: Mon, 17 Nov 2014 05:03:46 +0100 Subject: [PATCH] [swfinterp] Implement charCodeAt --- test/swftests/StringCharCodeAt.as | 11 +++++++++++ youtube_dl/swfinterp.py | 26 +++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 test/swftests/StringCharCodeAt.as diff --git a/test/swftests/StringCharCodeAt.as b/test/swftests/StringCharCodeAt.as new file mode 100644 index 000000000..c20d74d65 --- /dev/null +++ b/test/swftests/StringCharCodeAt.as @@ -0,0 +1,11 @@ +// input: [] +// output: 9897 + +package { +public class StringCharCodeAt { + public static function main():int{ + var s:String = "abc"; + return s.charCodeAt(1) * 100 + s.charCodeAt(); + } +} +} diff --git a/youtube_dl/swfinterp.py b/youtube_dl/swfinterp.py index 4b47df29d..7369c94fc 100644 --- a/youtube_dl/swfinterp.py +++ b/youtube_dl/swfinterp.py @@ -411,7 +411,9 @@ def resfunc(args): self._classes_by_name, avm_class.variables]) while True: opcode = _read_byte(coder) - if opcode == 16: # jump + if opcode == 9: # label + pass # Spec says: "Do nothing." + elif opcode == 16: # jump offset = s24() coder.seek(coder.tell() + offset) elif opcode == 17: # iftrue @@ -436,6 +438,12 @@ def resfunc(args): value1 = stack.pop() if value2 != value1: coder.seek(coder.tell() + offset) + elif opcode == 21: # iflt + offset = s24() + value2 = stack.pop() + value1 = stack.pop() + if value1 < value2: + coder.seek(coder.tell() + offset) elif opcode == 32: # pushnull stack.append(None) elif opcode == 33: # pushundefined @@ -516,6 +524,13 @@ def resfunc(args): res = obj.split(args[0]) stack.append(res) continue + elif mname == 'charCodeAt': + assert len(args) <= 1 + idx = 0 if len(args) == 0 else args[0] + assert isinstance(idx, int) + res = ord(obj[idx]) + stack.append(res) + continue elif isinstance(obj, list): if mname == 'slice': assert len(args) == 1 @@ -687,6 +702,11 @@ def resfunc(args): value1 = stack.pop() res = value1 - value2 stack.append(res) + elif opcode == 162: # multiply + value2 = stack.pop() + value1 = stack.pop() + res = value1 * value2 + stack.append(res) elif opcode == 164: # modulo value2 = stack.pop() value1 = stack.pop() @@ -702,6 +722,10 @@ def resfunc(args): value1 = stack.pop() result = value1 >= value2 stack.append(result) + elif opcode == 192: # increment_i + value = stack.pop() + assert isinstance(value, int) + stack.append(value + 1) elif opcode == 208: # getlocal_0 stack.append(registers[0]) elif opcode == 209: # getlocal_1