8285407: Improve Xalan supports

Reviewed-by: yan
Backport-of: fd6385d8c20379c1139f64f5c90d331ad9631097
diff --git a/jaxp/src/com/sun/org/apache/bcel/internal/classfile/ConstantPool.java b/jaxp/src/com/sun/org/apache/bcel/internal/classfile/ConstantPool.java
index 091e70c..72bdb43 100644
--- a/jaxp/src/com/sun/org/apache/bcel/internal/classfile/ConstantPool.java
+++ b/jaxp/src/com/sun/org/apache/bcel/internal/classfile/ConstantPool.java
@@ -1,6 +1,5 @@
 /*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
  */
 package com.sun.org.apache.bcel.internal.classfile;
 
@@ -59,6 +58,7 @@
  */
 
 import  com.sun.org.apache.bcel.internal.Constants;
+import  com.sun.org.apache.bcel.internal.generic.ConstantPoolGen;
 import  java.io.*;
 
 /**
@@ -72,6 +72,7 @@
  * @see     Constant
  * @see     com.sun.org.apache.bcel.internal.generic.ConstantPoolGen
  * @author <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
+ * @LastModified: May 2022
  */
 public class ConstantPool implements Cloneable, Node, Serializable {
   private int        constant_pool_count;
@@ -226,9 +227,16 @@
    */
   public void dump(DataOutputStream file) throws IOException
   {
-    file.writeShort(constant_pool_count);
+    /*
+     * Constants over the size of the constant pool shall not be written out.
+     * This is a redundant measure as the ConstantPoolGen should have already
+     * reported an error back in the situation.
+     */
+    int size = constant_pool_count < ConstantPoolGen.CONSTANT_POOL_SIZE - 1 ?
+               constant_pool_count : ConstantPoolGen.CONSTANT_POOL_SIZE - 1;
 
-    for(int i=1; i < constant_pool_count; i++)
+    file.writeShort(size);
+    for(int i=1; i < size; i++)
       if(constant_pool[i] != null)
         constant_pool[i].dump(file);
   }
diff --git a/jaxp/src/com/sun/org/apache/bcel/internal/generic/ConstantPoolGen.java b/jaxp/src/com/sun/org/apache/bcel/internal/generic/ConstantPoolGen.java
index 1b53aeb..95e9920 100644
--- a/jaxp/src/com/sun/org/apache/bcel/internal/generic/ConstantPoolGen.java
+++ b/jaxp/src/com/sun/org/apache/bcel/internal/generic/ConstantPoolGen.java
@@ -1,6 +1,5 @@
 /*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
+ * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
  */
 package com.sun.org.apache.bcel.internal.generic;
 
@@ -74,8 +73,10 @@
  *
  * @author  <A HREF="mailto:markus.dahm@berlin.de">M. Dahm</A>
  * @see Constant
+ * @LastModified: May 2022
  */
 public class ConstantPoolGen implements java.io.Serializable {
+  public static final int CONSTANT_POOL_SIZE = 65536;
   protected int        size      = 1024; // Inital size, sufficient in most cases
   protected Constant[] constants = new Constant[size];
   protected int        index     = 1; // First entry (0) used by JVM
@@ -97,7 +98,7 @@
    */
   public ConstantPoolGen(Constant[] cs) {
     if(cs.length > size) {
-      size      = cs.length;
+      size      = Math.min(cs.length, CONSTANT_POOL_SIZE);
       constants = new Constant[size];
     }
 
@@ -170,10 +171,19 @@
   /** Resize internal array of constants.
    */
   protected void adjustSize() {
+    // 3 extra spaces are needed as some entries may take 3 slots
+    if (index + 3 >= CONSTANT_POOL_SIZE) {
+      throw new RuntimeException("The number of constants " + (index + 3) +
+                                 " is over the size of the constant pool: " +
+                                 (CONSTANT_POOL_SIZE - 1));
+    }
+
     if(index + 3 >= size) {
       Constant[] cs = constants;
 
       size      *= 2;
+      // the constant array shall not exceed the size of the constant pool
+      size       = Math.min(size, CONSTANT_POOL_SIZE);
       constants  = new Constant[size];
       System.arraycopy(cs, 0, constants, 0, index);
     }