rebase to bsd-port
authorjrose
Thu Mar 26 19:52:01 2009 -0500 (8 months ago)
changeset 14023ca8953eeb
parent 132a12b4fbe111
child 157bb498e01708
rebase to bsd-port
quid.patch
--- a/quid.patch Tue Jan 27 19:16:36 2009 -0800
+++ b/quid.patch Thu Mar 26 19:52:01 2009 -0500
@@ -1,7 +1,10 @@ diff --git a/src/share/classes/com/sun/t
+6746458: writing libraries in Java for non-Java languages requires support for exotic identifiers
+MQ base = 80586310cc78 in http://hg.openjdk.java.net/bsd-port/bsd-port/langtools [2009-03-12]
+
diff --git a/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java b/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java
--- a/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java
+++ b/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java
-@@ -2178,6 +2178,7 @@
+@@ -2164,6 +2164,7 @@
String binaryName = fileManager.inferBinaryName(currentLoc, fo);
String simpleName = binaryName.substring(binaryName.lastIndexOf(".") + 1);
if (SourceVersion.isIdentifier(simpleName) ||
@@ -12,7 +15,60 @@ diff --git a/src/share/classes/com/sun/t
diff --git a/src/share/classes/com/sun/tools/javac/parser/Scanner.java b/src/share/classes/com/sun/tools/javac/parser/Scanner.java
--- a/src/share/classes/com/sun/tools/javac/parser/Scanner.java
+++ b/src/share/classes/com/sun/tools/javac/parser/Scanner.java
-@@ -915,6 +915,34 @@
+@@ -317,7 +317,7 @@
+
+ /** Read next character in character or string literal and copy into sbuf.
+ */
+- private void scanLitChar() {
++ private void scanLitChar(boolean forBytecodeName) {
+ if (ch == '\\') {
+ if (buf[bp+1] == '\\' && unicodeConversionBp != bp) {
+ bp++;
+@@ -357,6 +357,18 @@
+ putChar('\"'); scanChar(); break;
+ case '\\':
+ putChar('\\'); scanChar(); break;
++ case '|': case ',': case '?': case '%':
++ case '^': case '_': case '{': case '}':
++ case '!': case '-': case '=':
++ if (forBytecodeName) {
++ // Accept escape sequences for dangerous bytecode chars.
++ // This is illegal in normal Java string or character literals.
++ // Note that the escape sequence itself is passed through.
++ putChar('\\'); scanChar();
++ } else {
++ lexError(bp, "illegal.esc.char");
++ }
++ break;
+ default:
+ lexError(bp, "illegal.esc.char");
+ }
+@@ -365,6 +377,24 @@
+ putChar(ch); scanChar();
+ }
+ }
++ private void scanLitChar() {
++ scanLitChar(false);
++ }
++
++ /** Read next character in an exotic name #"foo"
++ */
++ private void scanBytecodeNameChar() {
++ switch (ch) {
++ // reject any "dangerous" char which is illegal somewhere in the JVM spec
++ // cf. http://blogs.sun.com/jrose/entry/symbolic_freedom_in_the_vm
++ case '/': case '.': case ';': // illegal everywhere
++ case '<': case '>': // illegal in methods, dangerous in classes
++ case '[': // illegal in classes
++ lexError(bp, "illegal.bytecode.ident.char", String.valueOf((int)ch));
++ break;
++ }
++ scanLitChar(true);
++ }
+
+ /** Read fractional part of hexadecimal floating point number.
+ */
+@@ -915,6 +945,26 @@
lexError(pos, "unclosed.str.lit");
}
return;
@@ -23,15 +79,7 @@ diff --git a/src/share/classes/com/sun/t
+ if (ch == '\"')
+ lexError(pos, "empty.bytecode.ident");
+ while (ch != '\"' && ch != CR && ch != LF && bp < buflen) {
-+ switch (ch) {
-+ // reject any "dangerous" char which is illegal somewhere in the JVM spec
-+ // cf. http://blogs.sun.com/jrose/entry/symbolic_freedom_in_the_vm
-+ case '/': case '.': case ';': // illegal everywhere
-+ case '<': case '>': // illegal in methods, dangerous in classes
-+ case '[': // illegal in classes
-+ lexError(bp, "illegal.bytecode.ident.char", String.valueOf((int)ch));
-+ }
-+ scanLitChar();
++ scanBytecodeNameChar();
+ }
+ if (ch == '\"') {
+ name = names.fromChars(sbuf, 0, sp);
@@ -68,7 +116,7 @@ diff --git a/src/share/classes/com/sun/t
compiler.err.illegal.char=\
illegal character: \\{0}
compiler.err.illegal.char.for.encoding=\
-@@ -442,6 +446,8 @@
+@@ -445,6 +449,8 @@
compiler.err.types.incompatible.diff.ret=\
types {0} and {1} are incompatible; both define {2}, but with unrelated return types
@@ -77,6 +125,52 @@ diff --git a/src/share/classes/com/sun/t
compiler.err.unclosed.char.lit=\
unclosed character literal
compiler.err.unclosed.comment=\
+diff --git a/src/share/classes/com/sun/tools/javap/ConstantWriter.java b/src/share/classes/com/sun/tools/javap/ConstantWriter.java
+--- a/src/share/classes/com/sun/tools/javap/ConstantWriter.java
++++ b/src/share/classes/com/sun/tools/javap/ConstantWriter.java
+@@ -339,7 +339,7 @@
+ cp = name.codePointAt(k);
+ if ((cc == '/' && !Character.isJavaIdentifierStart(cp))
+ || (cp != '/' && !Character.isJavaIdentifierPart(cp))) {
+- return "\"" + name + "\"";
++ return "\"" + addEscapes(name) + "\"";
+ }
+ cc = cp;
+ }
+@@ -347,6 +347,33 @@
+ return name;
+ }
+
++ /* If name requires escapes, put them in, so it can be a string body. */
++ private static String addEscapes(String name) {
++ String esc = "\\\"\n\t";
++ String rep = "\\\"nt";
++ StringBuilder buf = null;
++ int nextk = 0;
++ int len = name.length();
++ for (int k = 0; k < len; k++) {
++ char cp = name.charAt(k);
++ int n = esc.indexOf(cp);
++ if (n >= 0) {
++ if (buf == null)
++ buf = new StringBuilder(len * 2);
++ if (nextk < k)
++ buf.append(name, nextk, k);
++ buf.append('\\');
++ buf.append(rep.charAt(n));
++ nextk = k+1;
++ }
++ }
++ if (buf == null)
++ return name;
++ if (nextk < len)
++ buf.append(name, nextk, len);
++ return buf.toString();
++ }
++
+ private ClassWriter classWriter;
+ private Options options;
+ }
diff --git a/test/tools/javac/quid/MakeNegTests.sh b/test/tools/javac/quid/MakeNegTests.sh
new file mode 100644
--- /dev/null