diff options
| author | Philipp Hagemeister <phihag@phihag.de> | 2014-11-17 04:00:31 +0100 | 
|---|---|---|
| committer | Philipp Hagemeister <phihag@phihag.de> | 2014-11-17 04:00:41 +0100 | 
| commit | e983cf52775e493b7deedbe48d2f50f598c9da4e (patch) | |
| tree | 30d03752be63af3943f1948eeb9d80581c426453 | |
| parent | 0ab1ca5501108b8038090750e8455bfb5d72c443 (diff) | |
[swfinterp] Interpret yet more opcodes
| -rw-r--r-- | test/swftests/NeOperator.as | 24 | ||||
| -rw-r--r-- | youtube_dl/swfinterp.py | 19 | 
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) | 
