You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by Marcus Engene <ma...@engene.se> on 2021/02/10 14:27:10 UTC

ConstantPool.dump + new ConstantPool(DataInputStream) usually don't work.

Hi,

I get an EOFException here. ConstantPool.dump() does not write the null 
entries in Constant[], which is fine, but it writes the size of the 
array first so the ConstantPool constructior gets confused.

@Test public void serializeConstantPool()throws IOException {

     ConstantPoolGen cpg =new ConstantPoolGen(); cpg.addMethodref("apa.banan.Klass", "aMethod", "()V"); cpg.addMethodref("apa.banan.Klass2", "aMethod2", "()V"); ConstantPool cp = cpg.getConstantPool(); FileOutputStream file =new FileOutputStream("/tmp/rolf"); DataOutputStream dataOutputStream =new DataOutputStream(file); cp.dump(dataOutputStream); dataOutputStream.flush(); dataOutputStream.close(); InputStream input =new FileInputStream("/tmp/rolf"); DataInputStream inst =new DataInputStream(input); //int constant_pool_count = inst.readUnsignedShort(); 
//System.out.println("Stupid cp thinks it has nbr elements " + 
constant_pool_count); // 256 ConstantPool loadedConstantPool =new ConstantPool(inst); inst.close(); }


Would you be ok with this patch?

/**
* Dump constant pool to file stream in binary format.
*
* @paramfileOutput file stream
* @throwsIOException
*/
publicvoiddump( finalDataOutputStreamfile) throwsIOException{
intnbrToWrite= 0;
for(inti= 1; i < constant_pool.length; i++) {
if(constant_pool[i] != null) {
nbrToWrite++;
}
}
file.writeShort(nbrToWrite);
for(inti= 1; i < constantPool.length; i++) {
if(constantPool[i] != null) {
constantPool[i].dump(file);
}
}
}


(magicator) 15:26:03 of 🐴 :commons-bcel ehsmeng> git diff
diff --git a/src/main/java/org/apache/bcel/classfile/ConstantPool.java 
b/src/main/java/org/apache/bcel/classfile/ConstantPool.java
index 3350135a..5a058b7e 100644
--- a/src/main/java/org/apache/bcel/classfile/ConstantPool.java
+++ b/src/main/java/org/apache/bcel/classfile/ConstantPool.java
@@ -218,7 +218,14 @@ public class ConstantPool implements Cloneable, Node {
       * @throws IOException
       */
      public void dump( final DataOutputStream file ) throws IOException {
-        file.writeShort(constantPool.length);
+        int nbrToWrite = 0;
+        for (int i = 1; i < constant_pool.length; i++) {
+            if (constant_pool[i] != null) {
+                nbrToWrite++;
+            }
+        }
+
+        file.writeShort(nbrToWrite);
          for (int i = 1; i < constantPool.length; i++) {
              if (constantPool[i] != null) {
                  constantPool[i].dump(file);
(magicator) 15:26:05 of 🐴 :commons-bcel ehsmeng>

Kind regards,
Marcus




Re: ConstantPool.dump + new ConstantPool(DataInputStream) usually don't work.

Posted by Gary Gregory <ga...@gmail.com>.
Hi Marcus,

May you please provide this as a PR on GitHub?

Gary


On Wed, Feb 10, 2021, 09:27 Marcus Engene <ma...@engene.se> wrote:

> Hi,
>
> I get an EOFException here. ConstantPool.dump() does not write the null
> entries in Constant[], which is fine, but it writes the size of the
> array first so the ConstantPool constructior gets confused.
>
> @Test public void serializeConstantPool()throws IOException {
>
>      ConstantPoolGen cpg =new ConstantPoolGen();
> cpg.addMethodref("apa.banan.Klass", "aMethod", "()V");
> cpg.addMethodref("apa.banan.Klass2", "aMethod2", "()V"); ConstantPool cp =
> cpg.getConstantPool(); FileOutputStream file =new
> FileOutputStream("/tmp/rolf"); DataOutputStream dataOutputStream =new
> DataOutputStream(file); cp.dump(dataOutputStream);
> dataOutputStream.flush(); dataOutputStream.close(); InputStream input =new
> FileInputStream("/tmp/rolf"); DataInputStream inst =new
> DataInputStream(input); //int constant_pool_count =
> inst.readUnsignedShort();
> //System.out.println("Stupid cp thinks it has nbr elements " +
> constant_pool_count); // 256 ConstantPool loadedConstantPool =new
> ConstantPool(inst); inst.close(); }
>
>
> Would you be ok with this patch?
>
> /**
> * Dump constant pool to file stream in binary format.
> *
> * @paramfileOutput file stream
> * @throwsIOException
> */
> publicvoiddump( finalDataOutputStreamfile) throwsIOException{
> intnbrToWrite= 0;
> for(inti= 1; i < constant_pool.length; i++) {
> if(constant_pool[i] != null) {
> nbrToWrite++;
> }
> }
> file.writeShort(nbrToWrite);
> for(inti= 1; i < constantPool.length; i++) {
> if(constantPool[i] != null) {
> constantPool[i].dump(file);
> }
> }
> }
>
>
> (magicator) 15:26:03 of 🐴 :commons-bcel ehsmeng> git diff
> diff --git a/src/main/java/org/apache/bcel/classfile/ConstantPool.java
> b/src/main/java/org/apache/bcel/classfile/ConstantPool.java
> index 3350135a..5a058b7e 100644
> --- a/src/main/java/org/apache/bcel/classfile/ConstantPool.java
> +++ b/src/main/java/org/apache/bcel/classfile/ConstantPool.java
> @@ -218,7 +218,14 @@ public class ConstantPool implements Cloneable, Node {
>        * @throws IOException
>        */
>       public void dump( final DataOutputStream file ) throws IOException {
> -        file.writeShort(constantPool.length);
> +        int nbrToWrite = 0;
> +        for (int i = 1; i < constant_pool.length; i++) {
> +            if (constant_pool[i] != null) {
> +                nbrToWrite++;
> +            }
> +        }
> +
> +        file.writeShort(nbrToWrite);
>           for (int i = 1; i < constantPool.length; i++) {
>               if (constantPool[i] != null) {
>                   constantPool[i].dump(file);
> (magicator) 15:26:05 of 🐴 :commons-bcel ehsmeng>
>
> Kind regards,
> Marcus
>
>
>
>