Mercurial > hg > truffle
diff graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CStringNode.java @ 14731:0cb5c4d276d4
use raw data support to fix incorrect use of String.intern() for embedding strings in code
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Tue, 25 Mar 2014 13:57:48 +0100 |
parents | 4eec2ac671c2 |
children | c5ee41cf9823 |
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CStringNode.java Tue Mar 25 13:56:52 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CStringNode.java Tue Mar 25 13:57:48 2014 +0100 @@ -22,18 +22,18 @@ */ package com.oracle.graal.hotspot.nodes; -import static com.oracle.graal.graph.UnsafeAccess.*; +import java.util.*; -import com.oracle.graal.nodes.*; +import com.oracle.graal.api.code.*; +import com.oracle.graal.compiler.gen.*; +import com.oracle.graal.compiler.target.*; import com.oracle.graal.nodes.calc.*; -import com.oracle.graal.nodes.spi.*; import com.oracle.graal.word.*; /** - * Converts a compile-time constant Java string into a malloc'ed C string. The malloc'ed string is - * never reclaimed so this should only be used for strings in permanent code such as compiled stubs. + * Converts a compile-time constant Java string into a C string installed with the generated code. */ -public final class CStringNode extends FloatingNode implements Lowerable { +public final class CStringNode extends FloatingNode implements LIRGenLowerable { private final String string; @@ -42,16 +42,18 @@ this.string = string; } - @Override - public void lower(LoweringTool tool) { - byte[] formatBytes = string.getBytes(); - long cstring = unsafe.allocateMemory(formatBytes.length + 1); - for (int i = 0; i < formatBytes.length; i++) { - unsafe.putByte(cstring + i, formatBytes[i]); - } - unsafe.putByte(cstring + formatBytes.length, (byte) 0); - ConstantNode replacement = ConstantNode.forLong(cstring, graph()); - graph().replaceFloating(this, replacement); + public void generate(LIRGenerator gen) { + gen.setResult(this, gen.emitMove(new RawDataValue(gen.target().wordKind, toCString(string)))); + } + + /** + * Converts a String to a null terminated byte array suitable for use as a C string value. + */ + public static byte[] toCString(String value) { + byte[] bytes = value.getBytes(); + byte[] nulTerminated = Arrays.copyOf(bytes, bytes.length + 1); + nulTerminated[bytes.length] = 0; + return nulTerminated; } @NodeIntrinsic(setStampFromReturnType = true)