1. 22 Mar, 2017 1 commit
  2. 20 Mar, 2017 1 commit
  3. 19 Mar, 2017 11 commits
  4. 18 Mar, 2017 11 commits
  5. 17 Mar, 2017 4 commits
  6. 16 Mar, 2017 3 commits
  7. 15 Mar, 2017 4 commits
  8. 14 Mar, 2017 1 commit
  9. 13 Mar, 2017 3 commits
  10. 11 Mar, 2017 1 commit
    • Yukihiro "Matz" Matsumoto's avatar
      Generate new OP_RESCUE; fix #3487 · 916b8ed5
      Yukihiro "Matz" Matsumoto authored
      The old OP_RESCUE took one operand A, which specifies a class
      to match with the exception. The new OP_RESCUE takes tree operands:
      
      A: the register to hold exception
      B: the matching exception; the match result will be stored here.
      C: the continuation; if C is zero, the exception will be stored to R(A)
         otherwise, the value from R(A) is used as a exception.
      
      Thus,
      ```ruby
      begin
        raise "a"
      rescue TypeError
        p 1
      rescue RuntimeError
        p 2
      end
      ```
      will be compiled as
      ```
      irep 0x557a06667aa0 nregs=4 nlocals=1 pools=1 syms=4 reps=0
      file: /tmp/e.rb
      2 000 OP_ONERR  005
      2 001 OP_LOADSELF R1
      2 002 OP_STRING R2  L(0)  ; "a"
      2 003 OP_SEND R1  :raise  1
      2 004 OP_JMP  022
      3 005 OP_GETCONST R2  :TypeError
      3 006 OP_RESCUE R1  R2
      3 007 OP_JMPIF  R2  009
      3 008 OP_JMP  013
      4 009 OP_LOADSELF R1
      4 010 OP_LOADI  R2  1
      4 011 OP_SEND R1  :p  1
      4 012 OP_JMP  023
      5 013 OP_GETCONST R2 :RuntimeError
      5 014 OP_RESCUE R1 R2  cont
      5 015 OP_JMPIF  R2  017
      5 016 OP_JMP  021
      6 017 OP_LOADSELF R1
      6 018 OP_LOADI  R2  2
      6 019 OP_SEND R1  :p  1
      6 020 OP_JMP  023
      6 021 OP_RAISE  R1
      6 022 OP_POPERR 1
      6 023 OP_STOP
      ```
      
      The new VM can accept old OP_RESCUE. The mruby compatible VM (namely
      mruby/c) should be updated to support the new OP_RESCUE behavior.
      916b8ed5