#!/usr/bin/ruby
# -*- coding: utf-8 -*-
# @file   rjopcodeinfo.rb
# @author K.S.
#
# $Date: 2002/10/14 13:59:49 $
# $Id: rjopcodeinfo.rb,v 1.2 2002/10/14 13:59:49 ko1 Exp $
#
# Create : K.S. 02/10/09 07:34:13
#
#
#
#

module RJOpcodeinfo
  attr_reader :OpcodeName

  def get_opcode_length op
    len = OpcodeLength[op]
    if len == -1
      0
    elsif len == 0
      raise
    else
      len
    end
  end

  def get_opcode_arg op
    OpcodeArg[op]
  end
  
  OpcodeName = [
  "nop", 
  "aconst_null", 
  "iconst_m1", 
  "iconst_0", 
  "iconst_1", 
  "iconst_2", 
  "iconst_3", 
  "iconst_4", 
  "iconst_5", 
  "lconst_0", 
  "lconst_1", 
  "fconst_0", 
  "fconst_1", 
  "fconst_2", 
  "dconst_0", 
  "dconst_1", 
  "bipush", 
  "sipush", 
  "ldc", 
  "ldc_w", 
  "ldc2_w", 
  "iload", 
  "lload", 
  "fload", 
  "dload", 
  "aload", 
  "iload_0", 
  "iload_1", 
  "iload_2", 
  "iload_3", 
  "lload_0", 
  "lload_1", 
  "lload_2", 
  "lload_3", 
  "fload_0", 
  "fload_1", 
  "fload_2", 
  "fload_3", 
  "dload_0", 
  "dload_1", 
  "dload_2", 
  "dload_3", 
  "aload_0", 
  "aload_1", 
  "aload_2", 
  "aload_3", 
  "iaload", 
  "laload", 
  "faload", 
  "daload", 
  "aaload", 
  "baload", 
  "caload", 
  "saload", 
  "istore", 
  "lstore", 
  "fstore", 
  "dstore", 
  "astore", 
  "istore_0", 
  "istore_1", 
  "istore_2", 
  "istore_3", 
  "lstore_0", 
  "lstore_1", 
  "lstore_2", 
  "lstore_3", 
  "fstore_0", 
  "fstore_1", 
  "fstore_2", 
  "fstore_3", 
  "dstore_0", 
  "dstore_1", 
  "dstore_2", 
  "dstore_3", 
  "astore_0", 
  "astore_1", 
  "astore_2", 
  "astore_3", 
  "iastore", 
  "lastore", 
  "fastore", 
  "dastore", 
  "aastore", 
  "bastore", 
  "castore", 
  "sastore", 
  "pop", 
  "pop2", 
  "dup", 
  "dup_x1", 
  "dup_x2", 
  "dup2", 
  "dup2_x1", 
  "dup2_x2", 
  "swap", 
  "iadd", 
  "ladd", 
  "fadd", 
  "dadd", 
  "isub", 
  "lsub", 
  "fsub", 
  "dsub", 
  "imul", 
  "lmul", 
  "fmul", 
  "dmul", 
  "idiv", 
  "ldiv", 
  "fdiv", 
  "ddiv", 
  "irem", 
  "lrem", 
  "frem", 
  "drem", 
  "ineg", 
  "lneg", 
  "fneg", 
  "dneg", 
  "ishl", 
  "lshl", 
  "ishr", 
  "lshr", 
  "iushr", 
  "lushr", 
  "iand", 
  "land", 
  "ior", 
  "lor", 
  "ixor", 
  "lxor", 
  "iinc", 
  "i2l", 
  "i2f", 
  "i2d", 
  "l2i", 
  "l2f", 
  "l2d", 
  "f2i", 
  "f2l", 
  "f2d", 
  "d2i", 
  "d2l", 
  "d2f", 
  "i2b", 
  "i2c", 
  "i2s", 
  "lcmp", 
  "fcmpl", 
  "fcmpg", 
  "dcmpl", 
  "dcmpg", 
  "ifeq", 
  "ifne", 
  "iflt", 
  "ifge", 
  "ifgt", 
  "ifle", 
  "if_icmpeq", 
  "if_icmpne", 
  "if_icmplt", 
  "if_icmpge", 
  "if_icmpgt", 
  "if_icmple", 
  "if_acmpeq", 
  "if_acmpne", 
  "goto", 
  "jsr", 
  "ret", 
  "tableswitch", 
  "lookupswitch", 
  "ireturn", 
  "lreturn", 
  "freturn", 
  "dreturn", 
  "areturn", 
  "return", 
  "getstatic", 
  "putstatic", 
  "getfield", 
  "putfield", 
  "invokevirtual", 
  "invokespecial", 
  "invokestatic", 
  "invokeinterface", 
  "xxxunusedxxx", 
  "new", 
  "newarray", 
  "anewarray", 
  "arraylength", 
  "athrow", 
  "checkcast", 
  "instanceof", 
  "monitorenter", 
  "monitorexit", 
  "wide", 
  "multianewarray", 
  "ifnull", 
  "ifnonnull", 
  "goto_w", 
  "jsr_w", 
  "breakpoint", 
  "unknown bytecode(0xcb)", 
  "unknown bytecode(0xcc)", 
  "unknown bytecode(0xcd)", 
  "unknown bytecode(0xce)", 
  "unknown bytecode(0xcf)", 
  "unknown bytecode(0xd0)", 
  "unknown bytecode(0xd1)", 
  "unknown bytecode(0xd2)", 
  "unknown bytecode(0xd3)", 
  "unknown bytecode(0xd4)", 
  "unknown bytecode(0xd5)", 
  "unknown bytecode(0xd6)", 
  "unknown bytecode(0xd7)", 
  "unknown bytecode(0xd8)", 
  "unknown bytecode(0xd9)", 
  "unknown bytecode(0xda)", 
  "unknown bytecode(0xdb)", 
  "unknown bytecode(0xdc)", 
  "unknown bytecode(0xdd)", 
  "unknown bytecode(0xde)", 
  "unknown bytecode(0xdf)", 
  "unknown bytecode(0xe0)", 
  "unknown bytecode(0xe1)", 
  "unknown bytecode(0xe2)", 
  "unknown bytecode(0xe3)", 
  "unknown bytecode(0xe4)", 
  "unknown bytecode(0xe5)", 
  "unknown bytecode(0xe6)", 
  "unknown bytecode(0xe7)", 
  "unknown bytecode(0xe8)", 
  "unknown bytecode(0xe9)", 
  "unknown bytecode(0xea)", 
  "unknown bytecode(0xeb)", 
  "unknown bytecode(0xec)", 
  "unknown bytecode(0xed)", 
  "unknown bytecode(0xee)", 
  "unknown bytecode(0xef)", 
  "unknown bytecode(0xf0)", 
  "unknown bytecode(0xf1)", 
  "unknown bytecode(0xf2)", 
  "unknown bytecode(0xf3)", 
  "unknown bytecode(0xf4)", 
  "unknown bytecode(0xf5)", 
  "unknown bytecode(0xf6)", 
  "unknown bytecode(0xf7)", 
  "unknown bytecode(0xf8)", 
  "unknown bytecode(0xf9)", 
  "unknown bytecode(0xfa)", 
  "unknown bytecode(0xfb)", 
  "unknown bytecode(0xfc)", 
  "unknown bytecode(0xfd)", 
  "impdep1", 
  "impdep2", 
  ]
  
  OpcodeLength = [
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  2, 
  3, 
  2, 
  3, 
  3, 
  2, 
  2, 
  2, 
  2, 
  2, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  2, 
  2, 
  2, 
  2, 
  2, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  3, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  3, 
  3, 
  3, 
  3, 
  3, 
  3, 
  3, 
  3, 
  3, 
  3, 
  3, 
  3, 
  3, 
  3, 
  3, 
  3, 
  2, 
  -1, 
  -1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  1, 
  3, 
  3, 
  3, 
  3, 
  3, 
  3, 
  3, 
  5, 
  0, 
  3, 
  2, 
  3, 
  1, 
  1, 
  3, 
  3, 
  1, 
  1, 
  -1, 
  4, 
  3, 
  3, 
  5, 
  5, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  0, 
  ]
  OpcodeArg = [
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "1", 
  "ii", 
  "c", 
  "cc", 
  "cc", 
  "l", 
  "l", 
  "l", 
  "l", 
  "l", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "l", 
  "l", 
  "l", 
  "l", 
  "l", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "li", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "ii", 
  "ii", 
  "ii", 
  "ii", 
  "ii", 
  "ii", 
  "ii", 
  "ii", 
  "ii", 
  "ii", 
  "ii", 
  "ii", 
  "ii", 
  "ii", 
  "ii", 
  "ii", 
  "l", 
  "?", 
  "?", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "cc", 
  "cc", 
  "cc", 
  "cc", 
  "cc", 
  "cc", 
  "cc", 
  "ccii", 
  "", 
  "cc", 
  "i", 
  "cc", 
  "", 
  "", 
  "cc", 
  "cc", 
  "", 
  "", 
  "ill&illii", 
  "cci", 
  "ii", 
  "ii", 
  "iiii", 
  "iiii", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  "", 
  ];
  

end

# こいつが実行されると、RJThread の雛を吐く
if $0 == __FILE__
  puts 'class RJThread'
  puts 'private'
  256.times{|i|
    
    n = RJOpcodeinfo::OpcodeName[i]
    len = RJOpcodeinfo::OpcodeLength[i]
    
    if /^unknown/ =~ n
      next
    end
    puts "  # 0x#{sprintf("%02x",i)}"
    puts "  def op_#{n}\n"
    puts "    raise 'unsupported opcode : #{n}'"
    puts "    @pc += #{len}"
    puts "    opout \"#{n}\""
    puts "  end"
    puts
  }
  puts 'end'
end

