# HG changeset patch # User aefimov # Date 1392987441 -14400 # Node ID 9228eb02e7536a976385910eaca8d98ac4b98056 # Parent be7aed69d65ed5c57688821657dd61845798ae60 8032909: XSLT string-length returns incorrect length when string includes complementary chars Reviewed-by: joehw, dfuchs diff -r be7aed69d65e -r 9228eb02e753 drop_included/jaxp_src/src/com/sun/org/apache/xalan/internal/xsltc/compiler/StringLengthCall.java --- a/drop_included/jaxp_src/src/com/sun/org/apache/xalan/internal/xsltc/compiler/StringLengthCall.java Wed Oct 08 19:12:51 2014 +0100 +++ b/drop_included/jaxp_src/src/com/sun/org/apache/xalan/internal/xsltc/compiler/StringLengthCall.java Fri Feb 21 16:57:21 2014 +0400 @@ -26,7 +26,7 @@ import java.util.Vector; import com.sun.org.apache.bcel.internal.generic.ConstantPoolGen; -import com.sun.org.apache.bcel.internal.generic.INVOKEVIRTUAL; +import com.sun.org.apache.bcel.internal.generic.INVOKESTATIC; import com.sun.org.apache.bcel.internal.generic.InstructionList; import com.sun.org.apache.xalan.internal.xsltc.compiler.util.ClassGenerator; import com.sun.org.apache.xalan.internal.xsltc.compiler.util.MethodGenerator; @@ -51,7 +51,8 @@ il.append(methodGen.loadContextNode()); Type.Node.translateTo(classGen, methodGen, Type.String); } - il.append(new INVOKEVIRTUAL(cpg.addMethodref(STRING_CLASS, - "length", "()I"))); + il.append(new INVOKESTATIC(cpg.addMethodref(BASIS_LIBRARY_CLASS, + "getStringLength", + "(Ljava/drop_included/jaxp_src/lang/String;)I"))); } } diff -r be7aed69d65e -r 9228eb02e753 drop_included/jaxp_src/src/com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java --- a/drop_included/jaxp_src/src/com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java Wed Oct 08 19:12:51 2014 +0100 +++ b/drop_included/jaxp_src/src/com/sun/org/apache/xalan/internal/xsltc/runtime/BasisLibrary.java Fri Feb 21 16:57:21 2014 +0400 @@ -1595,5 +1595,14 @@ } + /** + * Utility method to calculate string-length as a number of code points, + * to avoid possible errors with string that contains + * complementary characters + */ + public static int getStringLength(String str) { + return str.codePointCount(0,str.length()); + } + //-- End utility functions }