initial subproject for exotic symbols
authorjrose
Sun Sep 07 00:38:40 2008 -0700 (14 months ago)
changeset 0ecddad94fb3f
child 18ae38094aaa9
initial subproject for exotic symbols
.hgignore
quid.patch
quid.txt
series
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgignore Sun Sep 07 00:38:40 2008 -0700
@@ -0,0 +1,3 @@
+syntax: glob
+status
+guards
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/quid.patch Sun Sep 07 00:38:40 2008 -0700
@@ -0,0 +1,146 @@
+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,23 @@
+ lexError(pos, "unclosed.str.lit");
+ }
+ return;
++ case '#':
++ scanChar();
++ if (ch == '\"') {
++ scanChar();
++ while (ch != '\"' && ch != CR && ch != LF && bp < buflen)
++ scanLitChar();
++ if (ch == '\"') {
++ name = names.fromChars(sbuf, 0, sp);
++ token = IDENTIFIER; // even if #"int" or #"do"
++ scanChar();
++ } else {
++ lexError(pos, "unclosed.str.lit");
++ }
++ } else {
++ lexError("illegal.char", String.valueOf((int)'#'));
++ }
++ return;
+ default:
+ if (isSpecial(ch)) {
+ scanOperator();
+diff --git a/test/tools/javac/QuotedIdent.java b/test/tools/javac/QuotedIdent.java
+new file mode 100644
+--- /dev/null
++++ b/test/tools/javac/QuotedIdent.java
+@@ -0,0 +1,114 @@
++/*
++ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ *
++ * This code is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 only, as
++ * published by the Free Software Foundation.
++ *
++ * This code is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++ * version 2 for more details (a copy is included in the LICENSE file that
++ * accompanied this code).
++ *
++ * You should have received a copy of the GNU General Public License version
++ * 2 along with this work; if not, write to the Free Software Foundation,
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
++ *
++ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
++ * CA 95054 USA or visit www.sun.com if you need additional information or
++ * have any questions.
++ */
++
++/*
++ * @test
++ * @summary Verify correct lexing of quoted identifiers.
++ * @author jrose
++ *
++ * Standalone testing:
++ * <code>
++ * $ cd $MY_REPO_DIR/langtools
++ * $ (cd make; make)
++ * $ ./dist/bootstrap/bin/javac -d dist test/tools/javac/QuotedIdent.java
++ * $ java -version # should print 1.6 or later
++ * $ java -cp dist QuotedIdent
++ * </code>
++ *
++ * @compile QuotedIdent.java
++ * @run main QuotedIdent
++ */
++
++public class QuotedIdent {
++ static void check(int testid, String have, String expect)
++ throws RuntimeException {
++ if ((have == null && have != expect) ||
++ (have != null && !have.equals(expect))) {
++ String msg =
++ "TEST " + testid + ": HAVE \"" +
++ have + "\" EXPECT \"" + expect + "\"";
++ System.out.println("StringConversion: " + msg);
++ throw new RuntimeException(msg);
++ }
++ }
++
++ static class #"int" extends Number {
++ final int #"int";
++ #"int"(int #"int") {
++ this.#"int" = #"int";
++ }
++ static #"int" valueOf(int #"int") {
++ return new #"int"(#"int");
++ }
++ public int intValue() { return #"int"; }
++ public long longValue() { return #"int"; }
++ public float floatValue() { return #"int"; }
++ public double doubleValue() { return #"int"; }
++ public String toString() { return String.valueOf(#"int"); }
++ }
++
++ class #"*86" {
++ String #"555-1212"() { return "[*86.555-1212]"; }
++ }
++ static #"*86" #"MAKE-*86"() {
++ return new QuotedIdent().new#"*86"();
++ }
++
++ static String bar() { return "[bar]"; }
++
++ public static void main(String[] args) throws Exception {
++ String s;
++
++ String #"sticky \' wicket" = "wicked ' stick";
++ s = #"sticky ' wicket";
++ check(11, s, "wicked \' stick");
++ check(12, #"s", s);
++ check(13, #"\163", s);
++
++ s = #"QuotedIdent".bar();
++ check(21, s, "[bar]");
++
++ s = #"int".valueOf(123).toString();
++ check(22, s, "123");
++
++ s = #"MAKE-*86"().#"555-1212"();
++ check(23, s, "[*86.555-1212]");
++
++ class#"{{{inmost}}}" { }
++ s = new#"{{{inmost}}}"().getClass().getName();
++ if (!s.endsWith("{{{inmost}}}"))
++ check(24, s, "should end with \"{{{inmost}}}\"");
++
++ s = #"int".class.getName();
++ check(31, s, QuotedIdent.class.getName()+"$int");
++
++ Class x86 = Class.forName(QuotedIdent.class.getName()+"$*86");
++ if (x86 != #"*86".class)
++ check(32, "reflected "+x86, "static "+#"*86".class);
++
++ s = (String) x86.getDeclaredMethod("555-1212").invoke(#"MAKE-*86"());
++ check(31, s, "[*86.555-1212]");
++
++ System.out.println("OK");
++ }
++}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/quid.txt Sun Sep 07 00:38:40 2008 -0700
@@ -0,0 +1,46 @@
+0000000: javac needs to support library development for non-Java langauges
+Summary: token syntax (currently non-standard) for introducing exotic identifiers
+
+http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=<TBD>
+
+Features:
+- hash mark followed immediately by string literal creates an identifier of the given spelling
+- no other processing or interpretation is given to the identifier
+- #"foo" is indistinguishable from foo, if foo is a normal, non-keyword identifier
+- BUG: the javac backend needs to check exotic identifiers against JVM limitations
+- user must mangle invalid symbols; see http://blogs.sun.com/jrose/entry/symbolic_freedom_in_the_vm
+
+Examples from the unit test:
+ class #"*86" {
+ String #"555-1212"() { return "[*86.555-1212]"; }
+ }
+ class #"int" extends Number {
+ final int #"int";
+ #"int"(int #"int") {
+ this.#"int" = #"int";
+ }
+ static #"int" valueOf(int #"int") {
+ return new #"int"(#"int");
+ }
+ public int intValue() { return #"int"; }
+ public long longValue() { return #"int"; }
+ public float floatValue() { return #"int"; }
+ public double doubleValue() { return #"int"; }
+ public String toString() { return String.valueOf(#"int"); }
+ }
+
+Authors:
+- John Rose (Sun)
+
+Tests:
+- unit test test/tools/javac/QuotedIdent.java
+
+Incremental testing:
+This does not require a full JDK build.
+
+$ cd .../langtools
+$ hg qpush quid.txt
+$ (cd make; make)
+$ ./dist/bootstrap/bin/javac -d dist test/tools/javac/QuotedIdent.java
+$ java -version # should print 1.6 or later
+$ java -cp dist QuotedIdent # should print OK
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/series Sun Sep 07 00:38:40 2008 -0700
@@ -0,0 +1,1 @@
+quid.patch #-/quid #+jdk7-b34