changeset 110:4b1587040a7d

8074297: substring in XSLT returns wrong character if string contains supplementary chars 8076290: JCK test api/xsl/conf/string/string17 starts failing after JDK-8074297 Reviewed-by: joehw
author aefimov
date Fri, 17 Jul 2015 23:31:50 +0100
parents 3b1dd57552bb
children a419e36ae018
files drop_included/jaxp_src/src/com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java
diffstat 1 files changed, 16 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/drop_included/jaxp_src/src/com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java	Thu Apr 09 16:23:43 2015 +0300
+++ b/drop_included/jaxp_src/src/com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java	Fri Jul 17 23:31:50 2015 +0100
@@ -265,14 +265,15 @@
         if (Double.isNaN(start))
             return(EMPTYSTRING);
 
-	    final int strlen = value.length();
-	    int istart = (int)Math.round(start) - 1;
+        final int strlen = getStringLength(value);
+	int istart = (int)Math.round(start) - 1;
 
         if (istart > strlen)
             return(EMPTYSTRING);
         if (istart < 1)
             istart = 0;
         try {
+            istart = value.offsetByCodePoints(0, istart);
 	    return value.substring(istart);
 	} catch (IndexOutOfBoundsException e) {
 	    runTimeError(RUN_TIME_INTERNAL_ERR, "substring()");
@@ -290,25 +291,31 @@
             Double.isNaN(length))
             return(EMPTYSTRING);
 
-	    int istart = (int)Math.round(start) - 1;
+	int istart = (int)Math.round(start) - 1;
+	int ilength = (int)Math.round(length);
         final int isum;
         if (Double.isInfinite(length))
             isum = Integer.MAX_VALUE;
         else
-            isum = istart + (int)Math.round(length);
+            isum = istart + ilength;
 
-        final int strlen = value.length();
+        final int strlen = getStringLength(value);
         if (isum < 0 || istart > strlen)
 		return(EMPTYSTRING);
 
-        if (istart < 0)
+        if (istart < 0) {
+            ilength += istart;
             istart = 0;
+        }
 
         try {
-	    if (isum > strlen)
+            istart = value.offsetByCodePoints(0, istart);
+            if (isum > strlen) {
 		return value.substring(istart);
-	    else
-		return value.substring(istart, isum);
+            } else {
+                int offset = value.offsetByCodePoints(istart, ilength);
+                return value.substring(istart, offset);
+            }
         } catch (IndexOutOfBoundsException e) {
 	    runTimeError(RUN_TIME_INTERNAL_ERR, "substring()");
 	    return null;