/** * Parse the table part of either a {@code LocalVariableTable} or a {@code * LocalVariableTypeTable}. * * @param bytes {@code non-null;} bytes to parse, which should <i>only</i> contain the table data * (no header) * @param pool {@code non-null;} constant pool to use * @param count {@code >= 0;} the number of entries * @param typeTable {@code true} iff this is for a type table * @return {@code non-null;} the constructed list */ private LocalVariableList parseLocalVariables( ByteArray bytes, ConstantPool pool, ParseObserver observer, int count, boolean typeTable) { if (bytes.size() != (count * 10)) { // "+ 2" is for the count. throwBadLength((count * 10) + 2); } ByteArray.MyDataInputStream in = bytes.makeDataInputStream(); LocalVariableList list = new LocalVariableList(count); try { for (int i = 0; i < count; i++) { int startPc = in.readUnsignedShort(); int length = in.readUnsignedShort(); int nameIdx = in.readUnsignedShort(); int typeIdx = in.readUnsignedShort(); int index = in.readUnsignedShort(); CstString name = (CstString) pool.get(nameIdx); CstString type = (CstString) pool.get(typeIdx); CstString descriptor = null; CstString signature = null; if (typeTable) { signature = type; } else { descriptor = type; } list.set(i, startPc, length, name, descriptor, signature, index); if (observer != null) { observer.parsed( bytes, i * 10, 10, Hex.u2(startPc) + ".." + Hex.u2(startPc + length) + " " + Hex.u2(index) + " " + name.toHuman() + " " + type.toHuman()); } } } catch (IOException ex) { throw new RuntimeException("shouldn't happen", ex); } list.setImmutable(); return list; }
private BootstrapMethodList parseBootstrapMethods( ByteArray bytes, ConstantPool pool, ParseObserver observer, int count) { ByteArray.MyDataInputStream in = bytes.makeDataInputStream(); BootstrapMethodList list = new BootstrapMethodList(count); try { for (int i = 0; i < count; i++) { int bootstrap_method_ref = in.readUnsignedShort(); CstMethodHandle methodHandle = (CstMethodHandle) pool.get(bootstrap_method_ref); int num_bootstrap_arguments = in.readUnsignedShort(); BootstrapArgumentList bootstrapArgumentList = new BootstrapArgumentList(num_bootstrap_arguments); for (int j = 0; j < num_bootstrap_arguments; ++j) { int bootstrap_argument_idx = in.readUnsignedShort(); Constant constant = pool.get(bootstrap_argument_idx); bootstrapArgumentList.set(j, constant); } bootstrapArgumentList.setImmutable(); list.set(i, new BootstrapMethodList.BootstrapMethod(methodHandle, bootstrapArgumentList)); if (observer != null) { // observer.parsed(bytes, i * 10, 10, Hex.u2(startPc) + // ".." + Hex.u2(startPc + length) + " " + // Hex.u2(index) + " " + name.toHuman() + " " + // type.toHuman()); } } } catch (IOException ex) { throw new RuntimeException("shouldn't happen", ex); } list.setImmutable(); return list; }