logo       

Re: null string concatenation: msg#00162

java.vm.kaffe.general

Subject: Re: null string concatenation

Hi Ito,

thanks for taking the time to look into it.

Ito Kazumitsu wrote:
Hi,

With reference to the bug:
http://www.kaffe.org/pipermail/kaffe/2003-November/044458.html

I suggest the following patch:

--- kopi-2.1B/src/kjc/JCompoundAssignmentExpression.java 2002-07-16
03:53:32.000000000 +0900
+++ test/JCompoundAssignmentExpression.java 2003-11-25 19:26:58.000000000
+0900
@@ -239,6 +239,13 @@
if (oper == OPE_PLUS && type.equals(factory.createReferenceType(TypeFactory.RFT_STRING))) {
// left.genCode(context, false);
+ /* Isn't it stupid to call String.valueOf(String) ?
+ * But we must do this because it may be null.
+ */
+ code.plantMethodRefInstruction(opc_invokestatic,
+ "java/lang/String",
+ "valueOf",
+ "(Ljava/lang/Object;)Ljava/lang/String;");
right.genCode(context, false);
if (!right.getType(factory).isReference()) {
code.plantMethodRefInstruction(opc_invokestatic,


By the way, the bytecode which JCompoundAssignmentExpression.java generates
looks quite different from the bytecode produced by gcj or Sun's javac. The
former uses String.concat and the latter uses StringBuffer for string
concatenation. Which is better?

I'd say that StringBuffer is better in general, if it can be used in multiple '+' invocations, without creating temporary Sting objects. You only need to allocate the buffer once per expression.

It may be possible to optimise it further by using a single StringBuffer per method employing '+' on Strings, and clearing it before each expression using + on Strings.

But using String.concat() is simpler, and leads to more understandable code ;)

cheers,
dalibor topic


<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise