   197: new root.MultiArrayOpcode 'multianewarray'
   198: new root.UnaryBranchOpcode 'ifnull', { cmp: (v) -> v <= 0 }
   199: new root.UnaryBranchOpcode 'ifnonnull', { cmp: (v) -> v > 0 }
-  200: new root.BranchOpcode 'goto_w', { byte_count: 4 }
-  201: new root.Opcode 'jsr_w'
+  200: new root.BranchOpcode 'goto_w', { byte_count: 4, execute: (rs) -> throw new BranchException rs.curr_pc() + @offset }
+  201: new root.BranchOpcode 'jsr_w', { byte_count: 4, execute: (rs) -> jsr.call @, rs }
 }


  take_args: (code_array) ->
    @args = [code_array.get_uint(1) for i in [0...@byte_count]]

  _execute: (rs) -> throw "#{@name} is a NOP"

class root.FieldOpcode extends root.Opcode
  constructor: (name, params) ->

  return 0 if 0 > a > -1.40129846432481707e-45
  a

jsr = (rs) ->
  rs.push(rs.curr_pc()+@byte_count+1); throw new BranchException rs.curr_pc() + @offset

# these objects are used as prototypes for the parsed instructions in the
# classfile
root.opcodes = {
  00: new root.Opcode 'nop', { execute: -> }
  01: new root.Opcode 'aconst_null', { execute: (rs) -> rs.push 0 }
  02: new root.Opcode 'iconst_m1', { execute: (rs) -> rs.push -1 }
  03: new root.Opcode 'iconst_0', { execute: (rs) -> rs.push 0 }
