All files / example classfile.js

0% Statements 0/20
100% Branches 0/0
0% Functions 0/2
0% Lines 0/20

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86                                                                                                                                                                           
var Parser = require("../lib/binary_parser").Parser;
 
var ConstantClassInfo = Parser.start().uint16be("name_index");
 
var ConstantFieldrefInfo = Parser.start()
  .uint16be("class_index")
  .uint16be("name_and_type_index");
 
var ConstantMethodrefInfo = Parser.start()
  .uint16be("class_index")
  .uint16be("name_and_type_index");
 
var ConstantInterfaceMethodrefInfo = Parser.start()
  .uint16be("class_index")
  .uint16be("name_and_type_index");
 
var ConstantStringInfo = Parser.start().uint16be("string_index");
 
var ConstantIntegerInfo = Parser.start().uint32be("bytes");
 
var ConstantFloatInfo = Parser.start().uint32be("bytes");
 
var ConstantLongInfo = Parser.start()
  .uint32be("high_bytes")
  .uint32be("low_bytes");
 
var ConstantDoubleInfo = Parser.start()
  .uint32be("high_bytes")
  .uint32be("low_bytes");
 
var ConstantNameAndTypeInfo = Parser.start()
  .uint16be("name_index")
  .uint16be("descriptor_index");
 
var ConstantUtf8Info = Parser.start()
  .uint16be("len")
  .string("bytes", { length: "len" });
 
var ConstantMethodHandleInfo = Parser.start()
  .uint8("reference_kind")
  .uint16be("reference_index");
 
var ConstantMethodTypeInfo = Parser.start().uint16be("descriptor_index");
 
var ConstantInvokeDynamicInfo = Parser.start()
  .uint16be("bootstrap_method_attr_index")
  .uint16be("name_and_type_index");
 
var CpInfo = Parser.start()
  .uint8("tag")
  .choice("info", {
    tag: "tag",
    choices: {
      7: ConstantClassInfo,
      9: ConstantFieldrefInfo,
      10: ConstantMethodrefInfo,
      11: ConstantInterfaceMethodrefInfo,
      8: ConstantStringInfo,
      3: ConstantIntegerInfo,
      4: ConstantFloatInfo,
      5: ConstantLongInfo,
      6: ConstantDoubleInfo,
      12: ConstantNameAndTypeInfo,
      1: ConstantUtf8Info,
      16: ConstantMethodTypeInfo,
      18: ConstantInvokeDynamicInfo
    }
  });
 
var ClassFile = Parser.start()
  .endianess("big")
  .uint32("magic", { assert: 0xcafebabe })
  .uint16("minor_version")
  .uint16("major_version")
  .uint16("constant_pool_count")
  .array("cp_info", {
    type: CpInfo,
    length: function() {
      return this.constant_pool_count - 1;
    }
  });
 
require("fs").readFile("Hello.class", function(err, data) {
  console.log(require("util").inspect(ClassFile.parse(data), { depth: null }));
});