aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Hagemeister <phihag@phihag.de>2014-11-17 04:00:31 +0100
committerPhilipp Hagemeister <phihag@phihag.de>2014-11-17 04:00:41 +0100
commite983cf52775e493b7deedbe48d2f50f598c9da4e (patch)
tree30d03752be63af3943f1948eeb9d80581c426453
parent0ab1ca5501108b8038090750e8455bfb5d72c443 (diff)
[swfinterp] Interpret yet more opcodes
-rw-r--r--test/swftests/NeOperator.as24
-rw-r--r--youtube_dl/swfinterp.py19
2 files changed, 42 insertions, 1 deletions
diff --git a/test/swftests/NeOperator.as b/test/swftests/NeOperator.as
new file mode 100644
index 000000000..61dcbc4e9
--- /dev/null
+++ b/test/swftests/NeOperator.as
@@ -0,0 +1,24 @@
+// input: []
+// output: 123
+
+package {
+public class NeOperator {
+ public static function main(): int {
+ var res:int = 0;
+ if (1 != 2) {
+ res += 3;
+ } else {
+ res += 4;
+ }
+ if (2 != 2) {
+ res += 10;
+ } else {
+ res += 20;
+ }
+ if (9 == 9) {
+ res += 100;
+ }
+ return res;
+ }
+}
+}
diff --git a/youtube_dl/swfinterp.py b/youtube_dl/swfinterp.py
index 58da6c586..85efde592 100644
--- a/youtube_dl/swfinterp.py
+++ b/youtube_dl/swfinterp.py
@@ -393,7 +393,10 @@ class SWFInterpreter(object):
self._classes_by_name, avm_class.variables])
while True:
opcode = _read_byte(coder)
- if opcode == 17: # iftrue
+ if opcode == 16: # jump
+ offset = s24()
+ coder.seek(coder.tell() + offset)
+ elif opcode == 17: # iftrue
offset = s24()
value = stack.pop()
if value:
@@ -403,6 +406,20 @@ class SWFInterpreter(object):
value = stack.pop()
if not value:
coder.seek(coder.tell() + offset)
+ elif opcode == 19: # ifeq
+ offset = s24()
+ value2 = stack.pop()
+ value1 = stack.pop()
+ if value2 == value1:
+ coder.seek(coder.tell() + offset)
+ elif opcode == 20: # ifne
+ offset = s24()
+ value2 = stack.pop()
+ value1 = stack.pop()
+ if value2 != value1:
+ coder.seek(coder.tell() + offset)
+ elif opcode == 32: # pushnull
+ stack.append(None)
elif opcode == 36: # pushbyte
v = _read_byte(coder)
stack.append(v)