# HG changeset patch # User tbell # Date 1254950085 25200 # Node ID 1a66b08deed0459054b5b1bea3dfbead30d258fa # Parent d498d6ef9c6c3d0028f09bfd3d73476c9537ea9e# Parent c6d0c55b1abade85a38f80b929c1898ef22af39a Merge diff -r d498d6ef9c6c -r 1a66b08deed0 make/build.xml --- a/make/build.xml Fri Oct 02 11:26:53 2009 -0700 +++ b/make/build.xml Wed Oct 07 14:14:45 2009 -0700 @@ -286,10 +286,10 @@ jarclasspath="javadoc.jar doclets.jar javac.jar"/> - + + jarclasspath="javac.jar"/> diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/apt/comp/Apt.java --- a/src/share/classes/com/sun/tools/apt/comp/Apt.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/apt/comp/Apt.java Wed Oct 07 14:14:45 2009 -0700 @@ -201,7 +201,7 @@ computeAnnotationSet(param, annotationSet); if (symbol.members() != null) { - for(Scope.Entry e: symbol.members().table) + for(Scope.Entry e = symbol.members().elems; e != null; e = e.sibling) computeAnnotationSet(e.sym, annotationSet); } } diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/apt/mirror/util/SourcePositionImpl.java --- a/src/share/classes/com/sun/tools/apt/mirror/util/SourcePositionImpl.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/apt/mirror/util/SourcePositionImpl.java Wed Oct 07 14:14:45 2009 -0700 @@ -67,15 +67,15 @@ public String toString() { int ln = line(); return (ln == Position.NOPOS) - ? sourcefile.toString() - : sourcefile + ":" + ln; + ? sourcefile.getName() + : sourcefile.getName() + ":" + ln; } /** * {@inheritDoc} */ public File file() { - return new File(sourcefile.toString()); + return new File(sourcefile.toUri()); } /** diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javac/file/BaseFileObject.java --- a/src/share/classes/com/sun/tools/javac/file/BaseFileObject.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javac/file/BaseFileObject.java Wed Oct 07 14:14:45 2009 -0700 @@ -34,6 +34,7 @@ import java.nio.charset.CharsetDecoder; import javax.lang.model.element.Modifier; import javax.lang.model.element.NestingKind; +import javax.tools.FileObject; import javax.tools.JavaFileObject; import static javax.tools.JavaFileObject.Kind.*; @@ -49,33 +50,15 @@ this.fileManager = fileManager; } - public JavaFileObject.Kind getKind() { - String n = getName(); - if (n.endsWith(CLASS.extension)) - return CLASS; - else if (n.endsWith(SOURCE.extension)) - return SOURCE; - else if (n.endsWith(HTML.extension)) - return HTML; - else - return OTHER; - } + /** Return a short name for the object, such as for use in raw diagnostics + */ + public abstract String getShortName(); @Override public String toString() { - return getPath(); + return getClass().getSimpleName() + "[" + getName() + "]"; } - /** @deprecated see bug 6410637 */ - @Deprecated - public String getPath() { - return getName(); - } - - /** @deprecated see bug 6410637 */ - @Deprecated - abstract public String getName(); - public NestingKind getNestingKind() { return null; } public Modifier getAccessLevel() { return null; } @@ -90,6 +73,17 @@ protected abstract String inferBinaryName(Iterable path); + protected static JavaFileObject.Kind getKind(String filename) { + if (filename.endsWith(CLASS.extension)) + return CLASS; + else if (filename.endsWith(SOURCE.extension)) + return SOURCE; + else if (filename.endsWith(HTML.extension)) + return HTML; + else + return OTHER; + } + protected static String removeExtension(String fileName) { int lastDot = fileName.lastIndexOf("."); return (lastDot == -1 ? fileName : fileName.substring(0, lastDot)); @@ -115,6 +109,17 @@ } } + /** Return the last component of a presumed hierarchical URI. + * From the scheme specific part of the URI, it returns the substring + * after the last "/" if any, or everything if no "/" is found. + */ + public static String getSimpleName(FileObject fo) { + URI uri = fo.toUri(); + String s = uri.getSchemeSpecificPart(); + return s.substring(s.lastIndexOf("/") + 1); // safe when / not found + + } + /** The file manager that created this JavaFileObject. */ protected final JavacFileManager fileManager; } diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javac/file/JavacFileManager.java --- a/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java Wed Oct 07 14:14:45 2009 -0700 @@ -1116,36 +1116,6 @@ throw new IllegalArgumentException("Invalid relative path: " + file); } - @SuppressWarnings("deprecation") // bug 6410637 - public static String getJavacFileName(FileObject file) { - if (file instanceof BaseFileObject) - return ((BaseFileObject)file).getPath(); - URI uri = file.toUri(); - String scheme = uri.getScheme(); - if (scheme == null || scheme.equals("file") || scheme.equals("jar")) - return uri.getPath(); - else - return uri.toString(); - } - - @SuppressWarnings("deprecation") // bug 6410637 - public static String getJavacBaseFileName(FileObject file) { - if (file instanceof BaseFileObject) - return ((BaseFileObject)file).getName(); - URI uri = file.toUri(); - String scheme = uri.getScheme(); - if (scheme == null || scheme.equals("file") || scheme.equals("jar")) { - String path = uri.getPath(); - if (path == null) - return null; - if (scheme != null && scheme.equals("jar")) - path = path.substring(path.lastIndexOf('!') + 1); - return path.substring(path.lastIndexOf('/') + 1); - } else { - return uri.toString(); - } - } - private static T nullCheck(T o) { o.getClass(); // null check return o; diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javac/file/Old199.java --- a/src/share/classes/com/sun/tools/javac/file/Old199.java Fri Oct 02 11:26:53 2009 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -/* - * Copyright 2006-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. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * 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. - */ - -package com.sun.tools.javac.file; - -import javax.tools.FileObject; - -/** - * Provides an easy migration to JSR 199 v3.3. The class is - * deprecated as we should remove it as soon as possible. - * - *

This is NOT part of any API supported by Sun Microsystems. - * If you write code that depends on this, you do so at your own - * risk. This code and its internal interfaces are subject to change - * or deletion without notice.

- * - * @author Peter von der Ah\u00e9 - */ -@Deprecated -public class Old199 { - - private Old199() {} - - public static String getPath(FileObject jfo) { - return JavacFileManager.getJavacFileName(jfo); - } - - public static String getName(FileObject jfo) { - return JavacFileManager.getJavacBaseFileName(jfo); - } - -} diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javac/file/RegularFileObject.java --- a/src/share/classes/com/sun/tools/javac/file/RegularFileObject.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javac/file/RegularFileObject.java Wed Oct 07 14:14:45 2009 -0700 @@ -68,98 +68,38 @@ this.f = f; } + @Override + public URI toUri() { + return f.toURI().normalize(); + } + + @Override + public String getName() { + return f.getPath(); + } + + @Override + public String getShortName() { + return name; + } + + @Override + public JavaFileObject.Kind getKind() { + return getKind(name); + } + + @Override public InputStream openInputStream() throws IOException { return new FileInputStream(f); } @Override - protected CharsetDecoder getDecoder(boolean ignoreEncodingErrors) { - return fileManager.getDecoder(fileManager.getEncodingName(), ignoreEncodingErrors); - } - public OutputStream openOutputStream() throws IOException { ensureParentDirectoriesExist(); return new FileOutputStream(f); } - public Writer openWriter() throws IOException { - ensureParentDirectoriesExist(); - return new OutputStreamWriter(new FileOutputStream(f), fileManager.getEncodingName()); - } - @Override - protected String inferBinaryName(Iterable path) { - String fPath = f.getPath(); - //System.err.println("RegularFileObject " + file + " " +r.getPath()); - for (File dir: path) { - //System.err.println("dir: " + dir); - String dPath = dir.getPath(); - if (dPath.length() == 0) - dPath = System.getProperty("user.dir"); - if (!dPath.endsWith(File.separator)) - dPath += File.separator; - if (fPath.regionMatches(true, 0, dPath, 0, dPath.length()) - && new File(fPath.substring(0, dPath.length())).equals(new File(dPath))) { - String relativeName = fPath.substring(dPath.length()); - return removeExtension(relativeName).replace(File.separatorChar, '.'); - } - } - return null; - } - - private void ensureParentDirectoriesExist() throws IOException { - if (!hasParents) { - File parent = f.getParentFile(); - if (parent != null && !parent.exists()) { - if (!parent.mkdirs()) { - if (!parent.exists() || !parent.isDirectory()) { - throw new IOException("could not create parent directories"); - } - } - } - hasParents = true; - } - } - - @Deprecated - public String getName() { - return name; - } - - public boolean isNameCompatible(String cn, JavaFileObject.Kind kind) { - cn.getClass(); - // null check - if (kind == Kind.OTHER && getKind() != kind) { - return false; - } - String n = cn + kind.extension; - if (name.equals(n)) { - return true; - } - if (name.equalsIgnoreCase(n)) { - try { - // allow for Windows - return f.getCanonicalFile().getName().equals(n); - } catch (IOException e) { - } - } - return false; - } - - @Deprecated - @Override - public String getPath() { - return f.getPath(); - } - - public long getLastModified() { - return f.lastModified(); - } - - public boolean delete() { - return f.delete(); - } - public CharBuffer getCharContent(boolean ignoreEncodingErrors) throws IOException { CharBuffer cb = fileManager.getCachedContent(this); if (cb == null) { @@ -184,6 +124,82 @@ } @Override + public Writer openWriter() throws IOException { + ensureParentDirectoriesExist(); + return new OutputStreamWriter(new FileOutputStream(f), fileManager.getEncodingName()); + } + + @Override + public long getLastModified() { + return f.lastModified(); + } + + @Override + public boolean delete() { + return f.delete(); + } + + @Override + protected CharsetDecoder getDecoder(boolean ignoreEncodingErrors) { + return fileManager.getDecoder(fileManager.getEncodingName(), ignoreEncodingErrors); + } + + @Override + protected String inferBinaryName(Iterable path) { + String fPath = f.getPath(); + //System.err.println("RegularFileObject " + file + " " +r.getPath()); + for (File dir: path) { + //System.err.println("dir: " + dir); + String dPath = dir.getPath(); + if (dPath.length() == 0) + dPath = System.getProperty("user.dir"); + if (!dPath.endsWith(File.separator)) + dPath += File.separator; + if (fPath.regionMatches(true, 0, dPath, 0, dPath.length()) + && new File(fPath.substring(0, dPath.length())).equals(new File(dPath))) { + String relativeName = fPath.substring(dPath.length()); + return removeExtension(relativeName).replace(File.separatorChar, '.'); + } + } + return null; + } + + @Override + public boolean isNameCompatible(String cn, JavaFileObject.Kind kind) { + cn.getClass(); + // null check + if (kind == Kind.OTHER && getKind() != kind) { + return false; + } + String n = cn + kind.extension; + if (name.equals(n)) { + return true; + } + if (name.equalsIgnoreCase(n)) { + try { + // allow for Windows + return f.getCanonicalFile().getName().equals(n); + } catch (IOException e) { + } + } + return false; + } + + private void ensureParentDirectoriesExist() throws IOException { + if (!hasParents) { + File parent = f.getParentFile(); + if (parent != null && !parent.exists()) { + if (!parent.mkdirs()) { + if (!parent.exists() || !parent.isDirectory()) { + throw new IOException("could not create parent directories"); + } + } + } + hasParents = true; + } + } + + @Override public boolean equals(Object other) { if (!(other instanceof RegularFileObject)) { return false; @@ -200,8 +216,4 @@ public int hashCode() { return f.hashCode(); } - - public URI toUri() { - return f.toURI().normalize(); - } } diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javac/file/SymbolArchive.java --- a/src/share/classes/com/sun/tools/javac/file/SymbolArchive.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javac/file/SymbolArchive.java Wed Oct 07 14:14:45 2009 -0700 @@ -95,7 +95,7 @@ @Override protected String inferBinaryName(Iterable path) { - String entryName = getZipEntryName(); + String entryName = entry.getName(); String prefix = ((SymbolArchive) zarch).prefix.path; if (entryName.startsWith(prefix)) entryName = entryName.substring(prefix.length()); diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javac/file/ZipArchive.java --- a/src/share/classes/com/sun/tools/javac/file/ZipArchive.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javac/file/ZipArchive.java Wed Oct 07 14:14:45 2009 -0700 @@ -147,51 +147,37 @@ this.entry = entry; } + public URI toUri() { + File zipFile = new File(zarch.zdir.getName()); + return createJarUri(zipFile, entry.getName()); + } + + @Override + public String getName() { + return zarch.zdir.getName() + "(" + entry.getName() + ")"; + } + + @Override + public String getShortName() { + return new File(zarch.zdir.getName()).getName() + "(" + entry + ")"; + } + + @Override + public JavaFileObject.Kind getKind() { + return getKind(entry.getName()); + } + + @Override public InputStream openInputStream() throws IOException { return zarch.zdir.getInputStream(entry); } + @Override public OutputStream openOutputStream() throws IOException { throw new UnsupportedOperationException(); } @Override - protected CharsetDecoder getDecoder(boolean ignoreEncodingErrors) { - return fileManager.getDecoder(fileManager.getEncodingName(), ignoreEncodingErrors); - } - - public Writer openWriter() throws IOException { - throw new UnsupportedOperationException(); - } - - @Deprecated - public String getName() { - return name; - } - - public boolean isNameCompatible(String cn, JavaFileObject.Kind k) { - cn.getClass(); - // null check - if (k == Kind.OTHER && getKind() != k) { - return false; - } - return name.equals(cn + k.extension); - } - - @Deprecated - @Override - public String getPath() { - return zarch.zdir.getName() + "(" + entry + ")"; - } - - public long getLastModified() { - return entry.getTime(); - } - - public boolean delete() { - throw new UnsupportedOperationException(); - } - public CharBuffer getCharContent(boolean ignoreEncodingErrors) throws IOException { CharBuffer cb = fileManager.getCachedContent(this); if (cb == null) { @@ -216,6 +202,42 @@ } @Override + public Writer openWriter() throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public long getLastModified() { + return entry.getTime(); + } + + @Override + public boolean delete() { + throw new UnsupportedOperationException(); + } + + @Override + protected CharsetDecoder getDecoder(boolean ignoreEncodingErrors) { + return fileManager.getDecoder(fileManager.getEncodingName(), ignoreEncodingErrors); + } + + @Override + protected String inferBinaryName(Iterable path) { + String entryName = entry.getName(); + return removeExtension(entryName).replace('/', '.'); + } + + @Override + public boolean isNameCompatible(String cn, JavaFileObject.Kind k) { + cn.getClass(); + // null check + if (k == Kind.OTHER && getKind() != k) { + return false; + } + return name.equals(cn + k.extension); + } + + @Override public boolean equals(Object other) { if (!(other instanceof ZipFileObject)) { return false; @@ -228,25 +250,6 @@ public int hashCode() { return zarch.zdir.hashCode() + name.hashCode(); } - - public String getZipName() { - return zarch.zdir.getName(); - } - - public String getZipEntryName() { - return entry.getName(); - } - - public URI toUri() { - File zipFile = new File(getZipName()); - return createJarUri(zipFile, entry.getName()); - } - - @Override - protected String inferBinaryName(Iterable path) { - String entryName = getZipEntryName(); - return removeExtension(entryName).replace('/', '.'); - } } } diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javac/file/ZipFileIndexArchive.java --- a/src/share/classes/com/sun/tools/javac/file/ZipFileIndexArchive.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javac/file/ZipFileIndexArchive.java Wed Oct 07 14:14:45 2009 -0700 @@ -123,88 +123,41 @@ this.zipName = zipFileName; } + @Override + public URI toUri() { + return createJarUri(zipName, getPrefixedEntryName()); + } + + @Override + public String getName() { + return zipName + "(" + getPrefixedEntryName() + ")"; + } + + @Override + public String getShortName() { + return zipName.getName() + "(" + entry.getName() + ")"; + } + + @Override + public JavaFileObject.Kind getKind() { + return getKind(entry.getName()); + } + + @Override public InputStream openInputStream() throws IOException { - if (inputStream == null) { - inputStream = new ByteArrayInputStream(read()); + assert entry != null; // see constructor + inputStream = new ByteArrayInputStream(zfIndex.read(entry)); } return inputStream; } @Override - protected CharsetDecoder getDecoder(boolean ignoreEncodingErrors) { - return fileManager.getDecoder(fileManager.getEncodingName(), ignoreEncodingErrors); - } - public OutputStream openOutputStream() throws IOException { throw new UnsupportedOperationException(); } - public Writer openWriter() throws IOException { - throw new UnsupportedOperationException(); - } - - /** @deprecated see bug 6410637 */ - @Deprecated - public String getName() { - return name; - } - - public boolean isNameCompatible(String cn, JavaFileObject.Kind k) { - cn.getClass(); // null check - if (k == Kind.OTHER && getKind() != k) - return false; - return name.equals(cn + k.extension); - } - - /** @deprecated see bug 6410637 */ - @Deprecated @Override - public String getPath() { - return zipName + "(" + entry.getName() + ")"; - } - - public long getLastModified() { - return entry.getLastModified(); - } - - public boolean delete() { - throw new UnsupportedOperationException(); - } - - @Override - public boolean equals(Object other) { - if (!(other instanceof ZipFileIndexFileObject)) - return false; - ZipFileIndexFileObject o = (ZipFileIndexFileObject) other; - return entry.equals(o.entry); - } - - @Override - public int hashCode() { - return zipName.hashCode() + (name.hashCode() << 10); - } - - public String getZipName() { - return zipName.getPath(); - } - - public String getZipEntryName() { - return entry.getName(); - } - - public URI toUri() { - if (zfIndex.symbolFilePrefix != null) - return createJarUri(zipName, zfIndex.symbolFilePrefix.path + entry.getName()); - else - return createJarUri(zipName, entry.getName()); - } - - private byte[] read() throws IOException { - assert entry != null; // see constructor - return zfIndex.read(entry); - } - public CharBuffer getCharContent(boolean ignoreEncodingErrors) throws IOException { CharBuffer cb = fileManager.getCachedContent(this); if (cb == null) { @@ -228,8 +181,28 @@ } @Override + public Writer openWriter() throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public long getLastModified() { + return entry.getLastModified(); + } + + @Override + public boolean delete() { + throw new UnsupportedOperationException(); + } + + @Override + protected CharsetDecoder getDecoder(boolean ignoreEncodingErrors) { + return fileManager.getDecoder(fileManager.getEncodingName(), ignoreEncodingErrors); + } + + @Override protected String inferBinaryName(Iterable path) { - String entryName = getZipEntryName(); + String entryName = entry.getName(); if (zfIndex.symbolFilePrefix != null) { String prefix = zfIndex.symbolFilePrefix.path; if (entryName.startsWith(prefix)) @@ -237,6 +210,34 @@ } return removeExtension(entryName).replace('/', '.'); } + + @Override + public boolean isNameCompatible(String cn, JavaFileObject.Kind k) { + cn.getClass(); // null check + if (k == Kind.OTHER && getKind() != k) + return false; + return name.equals(cn + k.extension); + } + + @Override + public boolean equals(Object other) { + if (!(other instanceof ZipFileIndexFileObject)) + return false; + ZipFileIndexFileObject o = (ZipFileIndexFileObject) other; + return entry.equals(o.entry); + } + + @Override + public int hashCode() { + return zipName.hashCode() + (name.hashCode() << 10); + } + + private String getPrefixedEntryName() { + if (zfIndex.symbolFilePrefix != null) + return zfIndex.symbolFilePrefix.path + entry.getName(); + else + return entry.getName(); + } } } diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javac/jvm/ClassReader.java --- a/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java Wed Oct 07 14:14:45 2009 -0700 @@ -2563,38 +2563,73 @@ this.flatname = flatname; } + @Override + public URI toUri() { + try { + return new URI(null, name.toString(), null); + } catch (URISyntaxException e) { + throw new CannotCreateUriError(name.toString(), e); + } + } + + @Override + public String getName() { + return name.toString(); + } + + @Override + public String getShortName() { + return getName(); + } + + @Override + public JavaFileObject.Kind getKind() { + return getKind(getName()); + } + + @Override public InputStream openInputStream() { throw new UnsupportedOperationException(); } + @Override public OutputStream openOutputStream() { throw new UnsupportedOperationException(); } - public Reader openReader() { + @Override + public CharBuffer getCharContent(boolean ignoreEncodingErrors) { throw new UnsupportedOperationException(); } + @Override + public Reader openReader(boolean ignoreEncodingErrors) { + throw new UnsupportedOperationException(); + } + + @Override public Writer openWriter() { throw new UnsupportedOperationException(); } - /** @deprecated see bug 6410637 */ - @Deprecated - public String getName() { - return name.toString(); - } - + @Override public long getLastModified() { throw new UnsupportedOperationException(); } + @Override public boolean delete() { throw new UnsupportedOperationException(); } - public CharBuffer getCharContent(boolean ignoreEncodingErrors) { - throw new UnsupportedOperationException(); + @Override + protected String inferBinaryName(Iterable path) { + return flatname.toString(); + } + + @Override + public boolean isNameCompatible(String simpleName, JavaFileObject.Kind kind) { + return true; // fail-safe mode } @Override @@ -2609,27 +2644,5 @@ public int hashCode() { return name.hashCode(); } - - public boolean isNameCompatible(String simpleName, JavaFileObject.Kind kind) { - return true; // fail-safe mode - } - - public URI toUri() { - try { - return new URI(null, name.toString(), null); - } catch (URISyntaxException e) { - throw new CannotCreateUriError(name.toString(), e); - } - } - - @Override - public Reader openReader(boolean ignoreEncodingErrors) throws IOException { - throw new UnsupportedOperationException(); - } - - @Override - protected String inferBinaryName(Iterable path) { - return flatname.toString(); - } } } diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java --- a/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java Wed Oct 07 14:14:45 2009 -0700 @@ -36,6 +36,7 @@ import com.sun.tools.javac.code.*; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Type.*; +import com.sun.tools.javac.file.BaseFileObject; import com.sun.tools.javac.util.*; import static com.sun.tools.javac.code.BoundKind.*; @@ -1685,13 +1686,8 @@ // the last possible moment because the sourcefile may be used // elsewhere in error diagnostics. Fixes 4241573. //databuf.appendChar(c.pool.put(c.sourcefile)); - String filename = c.sourcefile.toString(); - int sepIdx = filename.lastIndexOf(File.separatorChar); - // Allow '/' as separator on all platforms, e.g., on Win32. - int slashIdx = filename.lastIndexOf('/'); - if (slashIdx > sepIdx) sepIdx = slashIdx; - if (sepIdx >= 0) filename = filename.substring(sepIdx + 1); - databuf.appendChar(c.pool.put(names.fromString(filename))); + String simpleName = BaseFileObject.getSimpleName(c.sourcefile); + databuf.appendChar(c.pool.put(names.fromString(simpleName))); endAttr(alenIdx); acount++; } diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javac/parser/JavacParser.java --- a/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Wed Oct 07 14:14:45 2009 -0700 @@ -2236,7 +2236,7 @@ /* AnnotationValue = ConditionalExpression * | Annotation - * | "{" [ AnnotationValue { "," AnnotationValue } ] "}" + * | "{" [ AnnotationValue { "," AnnotationValue } ] [","] "}" */ JCExpression annotationValue() { int pos; @@ -2253,7 +2253,7 @@ buf.append(annotationValue()); while (S.token() == COMMA) { S.nextToken(); - if (S.token() == RPAREN) break; + if (S.token() == RBRACE) break; buf.append(annotationValue()); } } diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javac/util/AbstractDiagnosticFormatter.java --- a/src/share/classes/com/sun/tools/javac/util/AbstractDiagnosticFormatter.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javac/util/AbstractDiagnosticFormatter.java Wed Oct 07 14:14:45 2009 -0700 @@ -42,8 +42,8 @@ import com.sun.tools.javac.code.Symbol; import com.sun.tools.javac.code.Type; import com.sun.tools.javac.code.Type.CapturedType; -import com.sun.tools.javac.file.JavacFileManager; +import com.sun.tools.javac.file.BaseFileObject; import static com.sun.tools.javac.util.JCDiagnostic.DiagnosticType.*; /** @@ -133,8 +133,15 @@ } public String formatSource(JCDiagnostic d, boolean fullname, Locale l) { - assert (d.getSource() != null); - return fullname ? d.getSourceName() : d.getSource().getName(); + JavaFileObject fo = d.getSource(); + if (fo == null) + throw new IllegalArgumentException(); // d should have source set + if (fullname) + return fo.getName(); + else if (fo instanceof BaseFileObject) + return ((BaseFileObject) fo).getShortName(); + else + return BaseFileObject.getSimpleName(fo); } /** @@ -182,7 +189,7 @@ return printer.visit((Symbol)arg, l); } else if (arg instanceof JavaFileObject) { - return JavacFileManager.getJavacBaseFileName((JavaFileObject)arg); + return ((JavaFileObject)arg).getName(); } else if (arg instanceof Formattable) { return ((Formattable)arg).toString(l, messages); diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javac/util/Constants.java --- a/src/share/classes/com/sun/tools/javac/util/Constants.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javac/util/Constants.java Wed Oct 07 14:14:45 2009 -0700 @@ -83,16 +83,28 @@ */ public static String format(Object value) { if (value instanceof Byte) return formatByte((Byte) value); + if (value instanceof Short) return formatShort((Short) value); if (value instanceof Long) return formatLong((Long) value); if (value instanceof Float) return formatFloat((Float) value); if (value instanceof Double) return formatDouble((Double) value); if (value instanceof Character) return formatChar((Character) value); if (value instanceof String) return formatString((String) value); - return value + ""; + if (value instanceof Integer || + value instanceof Boolean) return value.toString(); + else + throw new IllegalArgumentException("Argument is not a primitive type or a string; it " + + ((value == null) ? + "is a null value." : + "has class " + + value.getClass().getName()) + "." ); } private static String formatByte(byte b) { - return String.format("0x%02x", b); + return String.format("(byte)0x%02x", b); + } + + private static String formatShort(short s) { + return String.format("(short)%d", s); } private static String formatLong(long lng) { diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javac/util/Convert.java --- a/src/share/classes/com/sun/tools/javac/util/Convert.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javac/util/Convert.java Wed Oct 07 14:14:45 2009 -0700 @@ -239,9 +239,9 @@ case '\"': return "\\\""; case '\\': return "\\\\"; default: - return (ch > 127 || isPrintableAscii(ch)) + return (isPrintableAscii(ch)) ? String.valueOf(ch) - : String.format("\\%03o", (int) ch); + : String.format("\\u%04x", (int) ch); } } diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javac/util/DiagnosticSource.java --- a/src/share/classes/com/sun/tools/javac/util/DiagnosticSource.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javac/util/DiagnosticSource.java Wed Oct 07 14:14:45 2009 -0700 @@ -69,10 +69,6 @@ return fileObject; } - public CharSequence getName() { - return JavacFileManager.getJavacBaseFileName(fileObject); - } - /** Return the one-based line number associated with a given pos * for the current source file. Zero is returned if no line exists * for the given position. diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java --- a/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java Wed Oct 07 14:14:45 2009 -0700 @@ -32,7 +32,6 @@ import javax.tools.JavaFileObject; import com.sun.tools.javac.api.DiagnosticFormatter; -import com.sun.tools.javac.file.JavacFileManager; import com.sun.tools.javac.tree.JCTree; import static com.sun.tools.javac.util.JCDiagnostic.DiagnosticType.*; @@ -354,15 +353,6 @@ } /** - * Get the name of the source file referred to by this diagnostic. - * @return the name of the source referred to with this diagnostic, or null if none - */ - public String getSourceName() { - JavaFileObject s = getSource(); - return s == null ? null : JavacFileManager.getJavacFileName(s); - } - - /** * Get the source referred to by this diagnostic. * @return the source referred to with this diagnostic, or null if none */ @@ -437,6 +427,7 @@ /** * Return the standard presentation of this diagnostic. */ + @Override public String toString() { return defaultFormatter.format(this,Locale.getDefault()); } diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javac/util/Log.java --- a/src/share/classes/com/sun/tools/javac/util/Log.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javac/util/Log.java Wed Oct 07 14:14:45 2009 -0700 @@ -33,7 +33,6 @@ import javax.tools.DiagnosticListener; import javax.tools.JavaFileObject; -import com.sun.tools.javac.file.JavacFileManager; import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.api.DiagnosticFormatter; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; @@ -428,7 +427,7 @@ JavaFileObject file = source.getFile(); if (file != null) printLines(errWriter, - JavacFileManager.getJavacFileName(file) + ":" + + file.getName() + ":" + line + ": " + msg); printErrLine(pos, errWriter); } diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javac/util/RawDiagnosticFormatter.java --- a/src/share/classes/com/sun/tools/javac/util/RawDiagnosticFormatter.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javac/util/RawDiagnosticFormatter.java Wed Oct 07 14:14:45 2009 -0700 @@ -30,6 +30,7 @@ import com.sun.tools.javac.api.DiagnosticFormatter.Configuration.*; import com.sun.tools.javac.api.Formattable; +import com.sun.tools.javac.file.BaseFileObject; import com.sun.tools.javac.util.AbstractDiagnosticFormatter.SimpleConfiguration; import static com.sun.tools.javac.api.DiagnosticFormatter.PositionKind.*; @@ -109,6 +110,8 @@ String s; if (arg instanceof Formattable) s = arg.toString(); + else if (arg instanceof BaseFileObject) + s = ((BaseFileObject) arg).getShortName(); else s = super.formatArgument(diag, arg, null); if (arg instanceof JCDiagnostic) diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javadoc/SourcePositionImpl.java --- a/src/share/classes/com/sun/tools/javadoc/SourcePositionImpl.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javadoc/SourcePositionImpl.java Wed Oct 07 14:14:45 2009 -0700 @@ -95,7 +95,7 @@ public String toString() { // Backwards compatibility hack. ZipFileObjects use the format // zipfile(zipentry) but javadoc has been using zipfile/zipentry - String fn = filename.toString(); + String fn = filename.getName(); if (fn.endsWith(")")) { int paren = fn.lastIndexOf("("); if (paren != -1) diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javah/Gen.java --- a/src/share/classes/com/sun/tools/javah/Gen.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javah/Gen.java Wed Oct 07 14:14:45 2009 -0700 @@ -27,15 +27,32 @@ import java.io.UnsupportedEncodingException; import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; +import java.io.OutputStreamWriter; import java.io.PrintWriter; -import com.sun.javadoc.*; -import java.io.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; import java.util.Stack; -import java.util.Vector; -import java.util.Arrays; +import javax.annotation.processing.ProcessingEnvironment; + +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.util.ElementFilter; +import javax.lang.model.util.Elements; +import javax.lang.model.util.Types; + +import javax.tools.FileObject; +import javax.tools.JavaFileManager; +import javax.tools.JavaFileObject; +import javax.tools.StandardLocation; /** * An abstraction for generating support files required by native methods. @@ -43,31 +60,39 @@ * original writing, this interface is rich enough to support JNI and the * old 1.0-style native method interface. * + *

This is NOT part of any API supported by Sun Microsystems. + * If you write code that depends on this, you do so at your own + * risk. This code and its internal interfaces are subject to change + * or deletion without notice.

+ * * @author Sucheta Dambalkar(Revised) */ - - public abstract class Gen { protected String lineSep = System.getProperty("line.separator"); - RootDoc root; + protected ProcessingEnvironment processingEnvironment; + protected Types types; + protected Elements elems; + protected Mangle mangler; + protected Util util; + + protected Gen(Util util) { + this.util = util; + } + /* * List of classes for which we must generate output. */ - protected ClassDoc[] classes; + protected Set classes; static private final boolean isWindows = System.getProperty("os.name").startsWith("Windows"); - public Gen(RootDoc root){ - this.root = root; - } /** * Override this abstract method, generating content for the named * class into the outputstream. */ - protected abstract void write(OutputStream o, ClassDoc clazz) - throws ClassNotFoundException; + protected abstract void write(OutputStream o, TypeElement clazz) throws Util.Exit; /** * Override this method to provide a list of #include statements @@ -78,31 +103,29 @@ /* * Output location. */ - protected String outDir; - protected String outFile; + protected JavaFileManager fileManager; + protected JavaFileObject outFile; - public void setOutDir(String outDir) { - /* Check important, otherwise concatenation of two null strings - * produces the "nullnull" String. - */ - if (outDir != null) { - this.outDir = outDir + System.getProperty("file.separator"); - File d = new File(outDir); - if (!d.exists()) - if (!d.mkdirs()) - Util.error("cant.create.dir", d.toString()); - } + public void setFileManager(JavaFileManager fm) { + fileManager = fm; } - public void setOutFile(String outFile) { + public void setOutFile(JavaFileObject outFile) { this.outFile = outFile; } - public void setClasses(ClassDoc[] classes) { + public void setClasses(Set classes) { this.classes = classes; } + void setProcessingEnvironment(ProcessingEnvironment pEnv) { + processingEnvironment = pEnv; + elems = pEnv.getElementUtils(); + types = pEnv.getTypeUtils(); + mangler = new Mangle(elems, types); + } + /* * Smartness with generated files. */ @@ -116,12 +139,11 @@ * We explicitly need to write ASCII files because that is what C * compilers understand. */ - protected PrintWriter wrapWriter(OutputStream o) { + protected PrintWriter wrapWriter(OutputStream o) throws Util.Exit { try { - return new - PrintWriter(new OutputStreamWriter(o, "ISO8859_1"), true); + return new PrintWriter(new OutputStreamWriter(o, "ISO8859_1"), true); } catch (UnsupportedEncodingException use) { - Util.bug("encoding.iso8859_1.not.found"); + util.bug("encoding.iso8859_1.not.found"); return null; /* dead code */ } } @@ -133,26 +155,25 @@ * Buffer size chosen as an approximation from a single sampling of: * expr `du -sk` / `ls *.h | wc -l` */ - public void run() throws IOException, ClassNotFoundException { + public void run() throws IOException, ClassNotFoundException, Util.Exit { int i = 0; if (outFile != null) { /* Everything goes to one big file... */ ByteArrayOutputStream bout = new ByteArrayOutputStream(8192); writeFileTop(bout); /* only once */ - for (i = 0; i < classes.length; i++) { - write(bout, classes[i]); + for (TypeElement t: classes) { + write(bout, t); } writeIfChanged(bout.toByteArray(), outFile); } else { /* Each class goes to its own file... */ - for (i = 0; i < classes.length; i++) { + for (TypeElement t: classes) { ByteArrayOutputStream bout = new ByteArrayOutputStream(8192); writeFileTop(bout); - ClassDoc clazz = classes[i]; - write(bout, clazz); - writeIfChanged(bout.toByteArray(), getFileName(clazz.qualifiedName())); + write(bout, t); + writeIfChanged(bout.toByteArray(), getFileObject(t.getQualifiedName())); } } } @@ -162,8 +183,7 @@ * is done if either the file doesn't exist or if the contents are * different. */ - private void writeIfChanged(byte[] b, String file) throws IOException { - File f = new File(file); + private void writeIfChanged(byte[] b, FileObject file) throws IOException { boolean mustWrite = false; String event = "[No need to update file "; @@ -171,71 +191,80 @@ mustWrite = true; event = "[Forcefully writing file "; } else { - if (!f.exists()) { + InputStream in; + byte[] a; + try { + // regrettably, there's no API to get the length in bytes + // for a FileObject, so we can't short-circuit reading the + // file here + in = file.openInputStream(); + a = readBytes(in); + if (!Arrays.equals(a, b)) { + mustWrite = true; + event = "[Overwriting file "; + + } + } catch (FileNotFoundException e) { mustWrite = true; event = "[Creating file "; - } else { - int l = (int)f.length(); - if (b.length != l) { - mustWrite = true; - event = "[Overwriting file "; - } else { - /* Lengths are equal, so read it. */ - byte[] a = new byte[l]; - FileInputStream in = new FileInputStream(f); - if (in.read(a) != l) { - in.close(); - /* This can't happen, we already checked the length. */ - Util.error("not.enough.bytes", Integer.toString(l), - f.toString()); - } - in.close(); - while (--l >= 0) { - if (a[l] != b[l]) { - mustWrite = true; - event = "[Overwriting file "; - } - } - } } } - if (Util.verbose) - Util.log(event + file + "]"); + + if (util.verbose) + util.log(event + file + "]"); + if (mustWrite) { - OutputStream out = new FileOutputStream(file); + OutputStream out = file.openOutputStream(); out.write(b); /* No buffering, just one big write! */ out.close(); } } - protected String defineForStatic(ClassDoc c, FieldDoc f){ + protected byte[] readBytes(InputStream in) throws IOException { + try { + byte[] array = new byte[in.available() + 1]; + int offset = 0; + int n; + while ((n = in.read(array, offset, array.length - offset)) != -1) { + offset += n; + if (offset == array.length) + array = Arrays.copyOf(array, array.length * 2); + } - String cnamedoc = c.qualifiedName(); - String fnamedoc = f.name(); + return Arrays.copyOf(array, offset); + } finally { + in.close(); + } + } - String cname = Mangle.mangle(cnamedoc, Mangle.Type.CLASS); - String fname = Mangle.mangle(fnamedoc, Mangle.Type.FIELDSTUB); + protected String defineForStatic(TypeElement c, VariableElement f) + throws Util.Exit { + CharSequence cnamedoc = c.getQualifiedName(); + CharSequence fnamedoc = f.getSimpleName(); - if (!f.isStatic()) - Util.bug("tried.to.define.non.static"); + String cname = mangler.mangle(cnamedoc, Mangle.Type.CLASS); + String fname = mangler.mangle(fnamedoc, Mangle.Type.FIELDSTUB); - if (f.isFinal()) { + if (!f.getModifiers().contains(Modifier.STATIC)) + util.bug("tried.to.define.non.static"); + + if (f.getModifiers().contains(Modifier.FINAL)) { Object value = null; - value = f.constantValue(); + value = f.getConstantValue(); if (value != null) { /* so it is a ConstantExpression */ String constString = null; if ((value instanceof Integer) || (value instanceof Byte) - || (value instanceof Character) - || (value instanceof Short) - || (value instanceof Boolean)) { - /* covers byte, boolean, char, short, int */ - if(value instanceof Boolean) - constString = (value.toString() == "true") ? "1L" : "0L"; - else - constString = value.toString() + "L"; + || (value instanceof Short)) { + /* covers byte, short, int */ + constString = value.toString() + "L"; + } else if (value instanceof Boolean) { + constString = ((Boolean) value) ? "1L" : "0L"; + } else if (value instanceof Character) { + Character ch = (Character) value; + constString = String.valueOf(((int) ch) & 0xffff) + "L"; } else if (value instanceof Long) { // Visual C++ supports the i64 suffix, not LL. if (isWindows) @@ -294,24 +323,19 @@ /* * File name and file preamble related operations. */ - protected void writeFileTop(OutputStream o) { + protected void writeFileTop(OutputStream o) throws Util.Exit { PrintWriter pw = wrapWriter(o); pw.println("/* DO NOT EDIT THIS FILE - it is machine generated */" + lineSep + getIncludes()); } - protected String baseFileName(String clazz) { - StringBuffer f = - new StringBuffer(Mangle.mangle(clazz, - Mangle.Type.CLASS)); - if (outDir != null) { - f.insert(0, outDir); - } - return f.toString(); + protected String baseFileName(CharSequence className) { + return mangler.mangle(className, Mangle.Type.CLASS); } - protected String getFileName(String clazz) { - return baseFileName(clazz) + getFileSuffix(); + protected FileObject getFileObject(CharSequence className) throws IOException { + String name = baseFileName(className) + getFileSuffix(); + return fileManager.getFileForOutput(StandardLocation.SOURCE_OUTPUT, "", name, null); } protected String getFileSuffix() { @@ -322,26 +346,39 @@ * Including super classes' fields. */ - FieldDoc[] getAllFields(ClassDoc subclazz) - throws ClassNotFoundException { - Vector fields = new Vector(); - ClassDoc cd = null; - Stack s = new Stack(); + List getAllFields(TypeElement subclazz) { + List fields = new ArrayList(); + TypeElement cd = null; + Stack s = new Stack(); cd = subclazz; while (true) { s.push(cd); - ClassDoc c = cd.superclass(); + TypeElement c = (TypeElement) (types.asElement(cd.getSuperclass())); if (c == null) break; cd = c; } while (!s.empty()) { - cd = (ClassDoc)s.pop(); - fields.addAll(Arrays.asList(cd.fields())); + cd = s.pop(); + fields.addAll(ElementFilter.fieldsIn(cd.getEnclosedElements())); } - return fields.toArray(new FieldDoc[fields.size()]); + return fields; + } + + // c.f. MethodDoc.signature + String signature(ExecutableElement e) { + StringBuffer sb = new StringBuffer("("); + String sep = ""; + for (VariableElement p: e.getParameters()) { + sb.append(sep); + sb.append(types.erasure(p.asType()).toString()); + sep = ","; + } + sb.append(")"); + return sb.toString(); } } + diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javah/InternalError.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/classes/com/sun/tools/javah/InternalError.java Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,40 @@ +/* + * Copyright 2007-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. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * 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. + */ + +package com.sun.tools.javah; + +/** + *

This is NOT part of any API supported by Sun Microsystems. If + * you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + */ +public class InternalError extends Error { + private static final long serialVersionUID = 8411861562497165022L; + InternalError(String msg, Throwable cause) { + super("Internal error: " + msg); + initCause(cause); + } +} diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javah/JNI.java --- a/src/share/classes/com/sun/tools/javah/JNI.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javah/JNI.java Wed Oct 07 14:14:45 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-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 @@ -27,95 +27,98 @@ import java.io.OutputStream; import java.io.PrintWriter; -import java.util.Vector; -import java.util.Enumeration; -import com.sun.javadoc.*; +import java.util.ArrayList; +import java.util.List; +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.ArrayType; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.util.ElementFilter; /** * Header file generator for JNI. * + *

This is NOT part of any API supported by Sun Microsystems. + * If you write code that depends on this, you do so at your own + * risk. This code and its internal interfaces are subject to change + * or deletion without notice.

+ * * @author Sucheta Dambalkar(Revised) */ - public class JNI extends Gen { - - public JNI(RootDoc root){ - super(root); + JNI(Util util) { + super(util); } public String getIncludes() { return "#include "; } - public void write(OutputStream o, ClassDoc clazz) - throws ClassNotFoundException { - - String cname = Mangle.mangle(clazz.qualifiedName(), Mangle.Type.CLASS); + public void write(OutputStream o, TypeElement clazz) throws Util.Exit { + String cname = mangler.mangle(clazz.getQualifiedName(), Mangle.Type.CLASS); PrintWriter pw = wrapWriter(o); pw.println(guardBegin(cname)); pw.println(cppGuardBegin()); /* Write statics. */ - FieldDoc[] classfields = getAllFields(clazz); + List classfields = getAllFields(clazz); - for (int i = 0; i < classfields.length; i++) { - if (!classfields[i].isStatic()) + for (VariableElement v: classfields) { + if (!v.getModifiers().contains(Modifier.STATIC)) continue; String s = null; - s = defineForStatic(clazz, classfields[i]); + s = defineForStatic(clazz, v); if (s != null) { pw.println(s); } } /* Write methods. */ - MethodDoc[] classmethods = clazz.methods(); - for (int i = 0; i < classmethods.length; i++) { - if(classmethods[i].isNative()){ - MethodDoc md = classmethods[i]; - Type mtr = classmethods[i].returnType(); - String sig = md.signature(); - TypeSignature newtypesig = new TypeSignature(root); - String methodName = md.name(); + List classmethods = ElementFilter.methodsIn(clazz.getEnclosedElements()); + for (ExecutableElement md: classmethods) { + if(md.getModifiers().contains(Modifier.NATIVE)){ + TypeMirror mtr = types.erasure(md.getReturnType()); + String sig = signature(md); + TypeSignature newtypesig = new TypeSignature(elems); + CharSequence methodName = md.getSimpleName(); boolean longName = false; - for (int j = 0; j < classmethods.length; j++) { - if ((classmethods[j] != md) - && (methodName.equals(classmethods[j].name())) - && (classmethods[j].isNative())) + for (ExecutableElement md2: classmethods) { + if ((md2 != md) + && (methodName.equals(md2.getSimpleName())) + && (md2.getModifiers().contains(Modifier.NATIVE))) longName = true; } pw.println("/*"); pw.println(" * Class: " + cname); pw.println(" * Method: " + - Mangle.mangle(methodName, Mangle.Type.FIELDSTUB)); + mangler.mangle(methodName, Mangle.Type.FIELDSTUB)); pw.println(" * Signature: " + newtypesig.getTypeSignature(sig, mtr)); pw.println(" */"); pw.println("JNIEXPORT " + jniType(mtr) + " JNICALL " + - Mangle.mangleMethod(md, root,clazz, + mangler.mangleMethod(md, clazz, (longName) ? Mangle.Type.METHOD_JNI_LONG : Mangle.Type.METHOD_JNI_SHORT)); pw.print(" (JNIEnv *, "); - Parameter[] paramargs = md.parameters(); - Type []args =new Type[ paramargs.length]; - for(int p = 0; p < paramargs.length; p++){ - args[p] = paramargs[p].type(); + List paramargs = md.getParameters(); + List args = new ArrayList(); + for (VariableElement p: paramargs) { + args.add(types.erasure(p.asType())); } - if (md.isStatic()) + if (md.getModifiers().contains(Modifier.STATIC)) pw.print("jclass"); else pw.print("jobject"); - if (args.length > 0) + + for (TypeMirror arg: args) { pw.print(", "); - - for (int j = 0; j < args.length; j++) { - pw.print(jniType(args[j])); - if (j != (args.length - 1)) { - pw.print(", "); - } + pw.print(jniType(arg)); } pw.println(");" + lineSep); } @@ -125,42 +128,54 @@ } - protected final String jniType(Type t){ + protected final String jniType(TypeMirror t) throws Util.Exit { + TypeElement throwable = elems.getTypeElement("java.lang.Throwable"); + TypeElement jClass = elems.getTypeElement("java.lang.Class"); + TypeElement jString = elems.getTypeElement("java.lang.String"); + Element tclassDoc = types.asElement(t); - String elmT = t.typeName(); - ClassDoc throwable = root.classNamed("java.lang.Throwable"); - ClassDoc jClass = root.classNamed("java.lang.Class"); - ClassDoc tclassDoc = t.asClassDoc(); - if((t.dimension()).indexOf("[]") != -1){ - if((t.dimension().indexOf("[][]") != -1) - || (tclassDoc != null)) return "jobjectArray"; - else if(elmT.equals("boolean"))return "jbooleanArray"; - else if(elmT.equals("byte"))return "jbyteArray"; - else if(elmT.equals("char"))return "jcharArray"; - else if(elmT.equals("short"))return "jshortArray"; - else if(elmT.equals("int"))return "jintArray"; - else if(elmT.equals("long"))return "jlongArray"; - else if(elmT.equals("float"))return "jfloatArray"; - else if(elmT.equals("double"))return "jdoubleArray"; - }else{ - if(elmT.equals("void"))return "void"; - else if(elmT.equals("String"))return "jstring"; - else if(elmT.equals("boolean"))return "jboolean"; - else if(elmT.equals("byte"))return "jbyte"; - else if(elmT.equals("char"))return "jchar"; - else if(elmT.equals("short"))return "jshort"; - else if(elmT.equals("int"))return "jint"; - else if(elmT.equals("long"))return "jlong"; - else if(elmT.equals("float"))return "jfloat"; - else if(elmT.equals("double"))return "jdouble"; - else if(tclassDoc != null){ - if(tclassDoc.subclassOf(throwable)) return "jthrowable"; - else if(tclassDoc.subclassOf(jClass)) return "jclass"; - else return "jobject"; + switch (t.getKind()) { + case ARRAY: { + TypeMirror ct = ((ArrayType) t).getComponentType(); + switch (ct.getKind()) { + case BOOLEAN: return "jbooleanArray"; + case BYTE: return "jbyteArray"; + case CHAR: return "jcharArray"; + case SHORT: return "jshortArray"; + case INT: return "jintArray"; + case LONG: return "jlongArray"; + case FLOAT: return "jfloatArray"; + case DOUBLE: return "jdoubleArray"; + case ARRAY: + case DECLARED: return "jobjectArray"; + default: throw new Error(ct.toString()); + } + } + + case VOID: return "void"; + case BOOLEAN: return "jboolean"; + case BYTE: return "jbyte"; + case CHAR: return "jchar"; + case SHORT: return "jshort"; + case INT: return "jint"; + case LONG: return "jlong"; + case FLOAT: return "jfloat"; + case DOUBLE: return "jdouble"; + + case DECLARED: { + if (tclassDoc.equals(jString)) + return "jstring"; + else if (types.isAssignable(t, throwable.asType())) + return "jthrowable"; + else if (types.isAssignable(t, jClass.asType())) + return "jclass"; + else + return "jobject"; } } - Util.bug("jni.unknown.type"); + + util.bug("jni.unknown.type"); return null; /* dead code. */ } } diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javah/JavahFileManager.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/classes/com/sun/tools/javah/JavahFileManager.java Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,63 @@ +/* + * Copyright 2007 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. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * 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. + */ + +package com.sun.tools.javah; + +import java.io.PrintWriter; +import java.nio.charset.Charset; +import javax.tools.DiagnosticListener; +import javax.tools.JavaFileObject; + +import com.sun.tools.javac.file.JavacFileManager; +import com.sun.tools.javac.util.Context; + +/** + * javah's implementation of JavaFileManager. + * + *

This is NOT part of any API supported by Sun Microsystems. If + * you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + */ +class JavahFileManager extends JavacFileManager { + private JavahFileManager(Context context, Charset charset) { + super(context, true, charset); + setIgnoreSymbolFile(true); + } + + static JavahFileManager create(final DiagnosticListener dl, PrintWriter log) { + Context javac_context = new Context(); + + if (dl != null) + javac_context.put(DiagnosticListener.class, dl); + javac_context.put(com.sun.tools.javac.util.Log.outKey, log); + + return new JavahFileManager(javac_context, null); + } + + void setIgnoreSymbolFile(boolean b) { + ignoreSymbolFile = b; + } +} diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javah/JavahTask.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/classes/com/sun/tools/javah/JavahTask.java Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,724 @@ +/* + * Copyright 2002-2009 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. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * 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. + */ + +package com.sun.tools.javah; + +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.io.Writer; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.MissingResourceException; +import java.util.ResourceBundle; +import java.util.Set; + +import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.Messager; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedAnnotationTypes; +import javax.annotation.processing.SupportedSourceVersion; + +import javax.lang.model.SourceVersion; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.ArrayType; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.type.TypeVisitor; +import javax.lang.model.util.ElementFilter; +import javax.lang.model.util.SimpleTypeVisitor6; +import javax.lang.model.util.Types; + +import javax.tools.Diagnostic; +import javax.tools.DiagnosticListener; +import javax.tools.JavaCompiler; +import javax.tools.JavaCompiler.CompilationTask; +import javax.tools.JavaFileManager; +import javax.tools.JavaFileObject; +import javax.tools.StandardJavaFileManager; +import javax.tools.StandardLocation; +import javax.tools.ToolProvider; + +/** + * Javah generates support files for native methods. + * Parse commandline options & Invokes javadoc to execute those commands. + * + *

This is NOT part of any API supported by Sun Microsystems. + * If you write code that depends on this, you do so at your own + * risk. This code and its internal interfaces are subject to change + * or deletion without notice.

+ * + * @author Sucheta Dambalkar + * @author Jonathan Gibbons + */ +public class JavahTask implements NativeHeaderTool.NativeHeaderTask { + public class BadArgs extends Exception { + private static final long serialVersionUID = 1479361270874789045L; + BadArgs(String key, Object... args) { + super(JavahTask.this.getMessage(key, args)); + this.key = key; + this.args = args; + } + + BadArgs showUsage(boolean b) { + showUsage = b; + return this; + } + + final String key; + final Object[] args; + boolean showUsage; + } + + static abstract class Option { + Option(boolean hasArg, String... aliases) { + this.hasArg = hasArg; + this.aliases = aliases; + } + + boolean isHidden() { + return false; + } + + boolean matches(String opt) { + for (String a: aliases) { + if (a.equals(opt)) + return true; + } + return false; + } + + boolean ignoreRest() { + return false; + } + + abstract void process(JavahTask task, String opt, String arg) throws BadArgs; + + final boolean hasArg; + final String[] aliases; + } + + static abstract class HiddenOption extends Option { + HiddenOption(boolean hasArg, String... aliases) { + super(hasArg, aliases); + } + + @Override + boolean isHidden() { + return true; + } + } + + static Option[] recognizedOptions = { + new Option(true, "-o") { + void process(JavahTask task, String opt, String arg) { + task.ofile = new File(arg); + } + }, + + new Option(true, "-d") { + void process(JavahTask task, String opt, String arg) { + task.odir = new File(arg); + } + }, + + new HiddenOption(true, "-td") { + void process(JavahTask task, String opt, String arg) { + // ignored; for backwards compatibility + } + }, + + new HiddenOption(false, "-stubs") { + void process(JavahTask task, String opt, String arg) { + // ignored; for backwards compatibility + } + }, + + new Option(false, "-v", "-verbose") { + void process(JavahTask task, String opt, String arg) { + task.verbose = true; + } + }, + + new Option(false, "-help", "--help", "-?") { + void process(JavahTask task, String opt, String arg) { + task.help = true; + } + }, + + new HiddenOption(false, "-trace") { + void process(JavahTask task, String opt, String arg) { + task.trace = true; + } + }, + + new Option(false, "-version") { + void process(JavahTask task, String opt, String arg) { + task.version = true; + } + }, + + new HiddenOption(false, "-fullversion") { + void process(JavahTask task, String opt, String arg) { + task.fullVersion = true; + } + }, + + new Option(false, "-jni") { + void process(JavahTask task, String opt, String arg) { + task.jni = true; + } + }, + + new Option(false, "-force") { + void process(JavahTask task, String opt, String arg) { + task.force = true; + } + }, + + new HiddenOption(false, "-Xnew") { + void process(JavahTask task, String opt, String arg) { + // we're already using the new javah + } + }, + + new HiddenOption(false, "-old") { + void process(JavahTask task, String opt, String arg) { + task.old = true; + } + }, + + new HiddenOption(false, "-llni", "-Xllni") { + void process(JavahTask task, String opt, String arg) { + task.llni = true; + } + }, + + new HiddenOption(false, "-llnidouble") { + void process(JavahTask task, String opt, String arg) { + task.llni = true; + task.doubleAlign = true; + } + }, + }; + + JavahTask() { + } + + JavahTask(Writer out, + JavaFileManager fileManager, + DiagnosticListener diagnosticListener, + Iterable options, + Iterable classes) { + this(); + this.log = getPrintWriterForWriter(out); + this.fileManager = fileManager; + this.diagnosticListener = diagnosticListener; + + try { + handleOptions(options, false); + } catch (BadArgs e) { + throw new IllegalArgumentException(e.getMessage()); + } + + this.classes = new ArrayList(); + for (String classname: classes) { + classname.getClass(); // null-check + this.classes.add(classname); + } + } + + public void setLocale(Locale locale) { + if (locale == null) + locale = Locale.getDefault(); + task_locale = locale; + } + + public void setLog(PrintWriter log) { + this.log = log; + } + + public void setLog(OutputStream s) { + setLog(getPrintWriterForStream(s)); + } + + static PrintWriter getPrintWriterForStream(OutputStream s) { + return new PrintWriter(s, true); + } + + static PrintWriter getPrintWriterForWriter(Writer w) { + if (w == null) + return getPrintWriterForStream(null); + else if (w instanceof PrintWriter) + return (PrintWriter) w; + else + return new PrintWriter(w, true); + } + + public void setDiagnosticListener(DiagnosticListener dl) { + diagnosticListener = dl; + } + + public void setDiagnosticListener(OutputStream s) { + setDiagnosticListener(getDiagnosticListenerForStream(s)); + } + + private DiagnosticListener getDiagnosticListenerForStream(OutputStream s) { + return getDiagnosticListenerForWriter(getPrintWriterForStream(s)); + } + + private DiagnosticListener getDiagnosticListenerForWriter(Writer w) { + final PrintWriter pw = getPrintWriterForWriter(w); + return new DiagnosticListener () { + public void report(Diagnostic diagnostic) { + if (diagnostic.getKind() == Diagnostic.Kind.ERROR) { + pw.print(getMessage("err.prefix")); + pw.print(" "); + } + pw.println(diagnostic.getMessage(null)); + } + }; + } + + int run(String[] args) { + try { + handleOptions(args); + boolean ok = run(); + return ok ? 0 : 1; + } catch (BadArgs e) { + diagnosticListener.report(createDiagnostic(e.key, e.args)); + return 1; + } catch (InternalError e) { + diagnosticListener.report(createDiagnostic("err.internal.error", e.getMessage())); + return 1; + } finally { + log.flush(); + } + } + + public void handleOptions(String[] args) throws BadArgs { + handleOptions(Arrays.asList(args), true); + } + + private void handleOptions(Iterable args, boolean allowClasses) throws BadArgs { + if (log == null) { + log = getPrintWriterForStream(System.out); + if (diagnosticListener == null) + diagnosticListener = getDiagnosticListenerForStream(System.err); + } else { + if (diagnosticListener == null) + diagnosticListener = getDiagnosticListenerForWriter(log); + } + + if (fileManager == null) + fileManager = getDefaultFileManager(diagnosticListener, log); + + Iterator iter = args.iterator(); + if (!iter.hasNext()) + help = true; + + while (iter.hasNext()) { + String arg = iter.next(); + if (arg.startsWith("-")) + handleOption(arg, iter); + else if (allowClasses) { + if (classes == null) + classes = new ArrayList(); + classes.add(arg); + while (iter.hasNext()) + classes.add(iter.next()); + } else + throw new BadArgs("err.unknown.option", arg).showUsage(true); + } + + if ((classes == null || classes.size() == 0) && + !(help || version || fullVersion)) { + throw new BadArgs("err.no.classes.specified"); + } + + if (jni && llni) + throw new BadArgs("jni.llni.mixed"); + + if (odir != null && ofile != null) + throw new BadArgs("dir.file.mixed"); + } + + private void handleOption(String name, Iterator rest) throws BadArgs { + for (Option o: recognizedOptions) { + if (o.matches(name)) { + if (o.hasArg) { + if (rest.hasNext()) + o.process(this, name, rest.next()); + else + throw new BadArgs("err.missing.arg", name).showUsage(true); + } else + o.process(this, name, null); + + if (o.ignoreRest()) { + while (rest.hasNext()) + rest.next(); + } + return; + } + } + + if (fileManager.handleOption(name, rest)) + return; + + throw new BadArgs("err.unknown.option", name).showUsage(true); + } + + public Boolean call() { + return run(); + } + + public boolean run() throws Util.Exit { + + Util util = new Util(log, diagnosticListener); + + if (help) { + showHelp(); + return true; + } + + if (version || fullVersion) { + showVersion(fullVersion); + return true; + } + + util.verbose = verbose; + + Gen g; + + if (llni) + g = new LLNI(doubleAlign, util); + else { +// if (stubs) +// throw new BadArgs("jni.no.stubs"); + g = new JNI(util); + } + + if (ofile != null) { + if (!(fileManager instanceof StandardJavaFileManager)) { + diagnosticListener.report(createDiagnostic("err.cant.use.option.for.fm", "-o")); + return false; + } + Iterable iter = + ((StandardJavaFileManager) fileManager).getJavaFileObjectsFromFiles(Collections.singleton(ofile)); + JavaFileObject fo = iter.iterator().next(); + g.setOutFile(fo); + } else { + if (odir != null) { + if (!(fileManager instanceof StandardJavaFileManager)) { + diagnosticListener.report(createDiagnostic("err.cant.use.option.for.fm", "-d")); + return false; + } + + if (!odir.exists()) + if (!odir.mkdirs()) + util.error("cant.create.dir", odir.toString()); + try { + ((StandardJavaFileManager) fileManager).setLocation(StandardLocation.CLASS_OUTPUT, Collections.singleton(odir)); + } catch (IOException e) { + Object msg = e.getLocalizedMessage(); + if (msg == null) { + msg = e; + } + diagnosticListener.report(createDiagnostic("err.ioerror", odir, msg)); + return false; + } + } + g.setFileManager(fileManager); + } + + /* + * Force set to false will turn off smarts about checking file + * content before writing. + */ + g.setForce(force); + + if (fileManager instanceof JavahFileManager) + ((JavahFileManager) fileManager).setIgnoreSymbolFile(true); + + JavaCompiler c = ToolProvider.getSystemJavaCompiler(); + List opts = Arrays.asList("-proc:only"); + CompilationTask t = c.getTask(log, fileManager, diagnosticListener, opts, internalize(classes), null); + JavahProcessor p = new JavahProcessor(g); + t.setProcessors(Collections.singleton(p)); + + boolean ok = t.call(); + if (p.exit != null) + throw new Util.Exit(p.exit); + return ok; + } + + private List internalize(List classes) { + List l = new ArrayList(); + for (String c: classes) { + l.add(c.replace('$', '.')); + } + return l; + } + + private List pathToFiles(String path) { + List files = new ArrayList(); + for (String f: path.split(File.pathSeparator)) { + if (f.length() > 0) + files.add(new File(f)); + } + return files; + } + + static StandardJavaFileManager getDefaultFileManager(final DiagnosticListener dl, PrintWriter log) { + return JavahFileManager.create(dl, log); + } + + private void showHelp() { + log.println(getMessage("main.usage", progname)); + for (Option o: recognizedOptions) { + if (o.isHidden()) + continue; + String name = o.aliases[0].substring(1); // there must always be at least one name + log.println(getMessage("main.opt." + name)); + } + String[] fmOptions = { "-classpath", "-bootclasspath" }; + for (String o: fmOptions) { + if (fileManager.isSupportedOption(o) == -1) + continue; + String name = o.substring(1); + log.println(getMessage("main.opt." + name)); + } + log.println(getMessage("main.usage.foot")); + } + + private void showVersion(boolean full) { + log.println(version(full ? "full" : "release")); + } + + private static final String versionRBName = "com.sun.tools.javah.resources.version"; + private static ResourceBundle versionRB; + + private String version(String key) { + // key=version: mm.nn.oo[-milestone] + // key=full: mm.mm.oo[-milestone]-build + if (versionRB == null) { + try { + versionRB = ResourceBundle.getBundle(versionRBName); + } catch (MissingResourceException e) { + return getMessage("version.resource.missing", System.getProperty("java.version")); + } + } + try { + return versionRB.getString(key); + } + catch (MissingResourceException e) { + return getMessage("version.unknown", System.getProperty("java.version")); + } + } + + private Diagnostic createDiagnostic(final String key, final Object... args) { + return new Diagnostic() { + public Kind getKind() { + return Diagnostic.Kind.ERROR; + } + + public JavaFileObject getSource() { + return null; + } + + public long getPosition() { + return Diagnostic.NOPOS; + } + + public long getStartPosition() { + return Diagnostic.NOPOS; + } + + public long getEndPosition() { + return Diagnostic.NOPOS; + } + + public long getLineNumber() { + return Diagnostic.NOPOS; + } + + public long getColumnNumber() { + return Diagnostic.NOPOS; + } + + public String getCode() { + return key; + } + + public String getMessage(Locale locale) { + return JavahTask.this.getMessage(locale, key, args); + } + + }; + + } + private String getMessage(String key, Object... args) { + return getMessage(task_locale, key, args); + } + + private String getMessage(Locale locale, String key, Object... args) { + if (bundles == null) { + // could make this a HashMap> + // and for efficiency, keep a hard reference to the bundle for the task + // locale + bundles = new HashMap(); + } + + if (locale == null) + locale = Locale.getDefault(); + + ResourceBundle b = bundles.get(locale); + if (b == null) { + try { + b = ResourceBundle.getBundle("com.sun.tools.javah.resources.l10n", locale); + bundles.put(locale, b); + } catch (MissingResourceException e) { + throw new InternalError("Cannot find javah resource bundle for locale " + locale, e); + } + } + + try { + return MessageFormat.format(b.getString(key), args); + } catch (MissingResourceException e) { + return key; + //throw new InternalError(e, key); + } + } + + File ofile; + File odir; + String bootcp; + String usercp; + List classes; + boolean verbose; + boolean help; + boolean trace; + boolean version; + boolean fullVersion; + boolean jni; + boolean llni; + boolean doubleAlign; + boolean force; + boolean old; + + PrintWriter log; + JavaFileManager fileManager; + DiagnosticListener diagnosticListener; + Locale task_locale; + Map bundles; + + private static final String progname = "javah"; + + @SupportedAnnotationTypes("*") + @SupportedSourceVersion(SourceVersion.RELEASE_7) + class JavahProcessor extends AbstractProcessor { + JavahProcessor(Gen g) { + this.g = g; + } + + public boolean process(Set annotations, RoundEnvironment roundEnv) { + Messager messager = processingEnv.getMessager(); + Set classes = getAllClasses(ElementFilter.typesIn(roundEnv.getRootElements())); + if (classes.size() > 0) { + checkMethodParameters(classes); + g.setProcessingEnvironment(processingEnv); + g.setClasses(classes); + + try { + g.run(); + } catch (ClassNotFoundException cnfe) { + messager.printMessage(Diagnostic.Kind.ERROR, getMessage("class.not.found", cnfe.getMessage())); + } catch (IOException ioe) { + messager.printMessage(Diagnostic.Kind.ERROR, getMessage("io.exception", ioe.getMessage())); + } catch (Util.Exit e) { + exit = e; + } + } + return true; + } + + private Set getAllClasses(Set classes) { + Set allClasses = new LinkedHashSet(); + getAllClasses0(classes, allClasses); + return allClasses; + } + + private void getAllClasses0(Iterable classes, Set allClasses) { + for (TypeElement c: classes) { + allClasses.add(c); + getAllClasses0(ElementFilter.typesIn(c.getEnclosedElements()), allClasses); + } + } + + // 4942232: + // check that classes exist for all the parameters of native methods + private void checkMethodParameters(Set classes) { + Types types = processingEnv.getTypeUtils(); + for (TypeElement te: classes) { + for (ExecutableElement ee: ElementFilter.methodsIn(te.getEnclosedElements())) { + for (VariableElement ve: ee.getParameters()) { + TypeMirror tm = ve.asType(); + checkMethodParametersVisitor.visit(tm, types); + } + } + } + } + + private TypeVisitor checkMethodParametersVisitor = + new SimpleTypeVisitor6() { + @Override + public Void visitArray(ArrayType t, Types types) { + visit(t.getComponentType(), types); + return null; + } + @Override + public Void visitDeclared(DeclaredType t, Types types) { + t.asElement().getKind(); // ensure class exists + for (TypeMirror st: types.directSupertypes(t)) + visit(st, types); + return null; + } + }; + + private Gen g; + private Util.Exit exit; + } +} diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javah/JavahTool.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/classes/com/sun/tools/javah/JavahTool.java Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,84 @@ +/* + * Copyright 2009 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. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * 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. + */ + +package com.sun.tools.javah; + +import java.io.InputStream; +import java.io.OutputStream; +import java.io.Writer; +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.Locale; +import java.util.Set; +import javax.lang.model.SourceVersion; +import javax.tools.DiagnosticListener; +import javax.tools.JavaFileManager; +import javax.tools.JavaFileObject; +import javax.tools.StandardJavaFileManager; + +/* + *

This is NOT part of any API supported by Sun Microsystems. + * If you write code that depends on this, you do so at your own + * risk. This code and its internal interfaces are subject to change + * or deletion without notice.

+ */ +public class JavahTool implements NativeHeaderTool { + + public NativeHeaderTask getTask(Writer out, + JavaFileManager fileManager, + DiagnosticListener diagnosticListener, + Iterable options, + Iterable classes) { + return new JavahTask(out, fileManager, diagnosticListener, options, classes); + } + + public StandardJavaFileManager getStandardFileManager(DiagnosticListener diagnosticListener, Locale locale, Charset charset) { + return JavahTask.getDefaultFileManager(diagnosticListener, null); + } + + public int run(InputStream in, OutputStream out, OutputStream err, String... arguments) { + JavahTask t = new JavahTask( + JavahTask.getPrintWriterForStream(out), + null, + null, + Arrays.asList(arguments), + null); + return (t.run() ? 0 : 1); + } + + public Set getSourceVersions() { + return EnumSet.allOf(SourceVersion.class); + } + + public int isSupportedOption(String option) { + JavahTask.Option[] options = JavahTask.recognizedOptions; + for (int i = 0; i < options.length; i++) { + if (options[i].matches(option)) + return (options[i].hasArg ? 1 : 0); + } + return -1; + } +} diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javah/LLNI.java --- a/src/share/classes/com/sun/tools/javah/LLNI.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javah/LLNI.java Wed Oct 07 14:14:45 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2005 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-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 @@ -26,49 +26,65 @@ package com.sun.tools.javah; -import java.io.File; import java.io.OutputStream; import java.io.PrintWriter; -import java.util.Hashtable; -import com.sun.javadoc.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; - /* - * @author Sucheta Dambalkar(Revised) - */ +import java.util.Set; +import javax.lang.model.element.Element; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.Name; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.ArrayType; +import javax.lang.model.type.PrimitiveType; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.type.TypeVisitor; +import javax.lang.model.util.ElementFilter; +import javax.lang.model.util.SimpleTypeVisitor6; + +/* + *

This is NOT part of any API supported by Sun Microsystems. + * If you write code that depends on this, you do so at your own + * risk. This code and its internal interfaces are subject to change + * or deletion without notice.

+ * + * @author Sucheta Dambalkar(Revised) + */ public class LLNI extends Gen { - protected final char pathChar = File.separatorChar; protected final char innerDelim = '$'; /* For inner classes */ - protected Hashtable doneHandleTypes; - MemberDoc []fields; - MemberDoc [] methods; + protected Set doneHandleTypes; + List fields; + List methods; private boolean doubleAlign; private int padFieldNum = 0; - - LLNI(boolean doubleAlign, RootDoc root) { - super(root); + LLNI(boolean doubleAlign, Util util) { + super(util); this.doubleAlign = doubleAlign; } - protected String getIncludes() { return ""; } - protected void write(OutputStream o, ClassDoc clazz) - throws ClassNotFoundException { - String cname = mangleClassName(clazz.qualifiedName()); + protected void write(OutputStream o, TypeElement clazz) throws Util.Exit { + String cname = mangleClassName(clazz.getQualifiedName().toString()); PrintWriter pw = wrapWriter(o); - fields = clazz.fields(); - methods = clazz.methods(); + fields = ElementFilter.fieldsIn(clazz.getEnclosedElements()); + methods = ElementFilter.methodsIn(clazz.getEnclosedElements()); generateDeclsForClass(pw, clazz, cname); + // FIXME check if errors occurred on the PrintWriter and throw exception if so } protected void generateDeclsForClass(PrintWriter pw, - ClassDoc clazz, String cname) - throws ClassNotFoundException { - doneHandleTypes = new Hashtable(); + TypeElement clazz, String cname) throws Util.Exit { + doneHandleTypes = new HashSet(); /* The following handle types are predefined in "typedefs.h". Suppress inclusion in the output by generating them "into the blue" here. */ genHandleType(null, "java.lang.Class"); @@ -79,7 +95,7 @@ genHandleType(null, "java.lang.ThreadGroup"); genHandleType(null, "java.lang.Throwable"); - pw.println("/* LLNI Header for class " + clazz.qualifiedName() + " */" + lineSep); + pw.println("/* LLNI Header for class " + clazz.getQualifiedName() + " */" + lineSep); pw.println("#ifndef _Included_" + cname); pw.println("#define _Included_" + cname); pw.println("#include \"typedefs.h\""); @@ -94,8 +110,8 @@ protected void genHandleType(PrintWriter pw, String clazzname) { String cname = mangleClassName(clazzname); - if (!doneHandleTypes.containsKey(cname)) { - doneHandleTypes.put(cname, cname); + if (!doneHandleTypes.contains(cname)) { + doneHandleTypes.add(cname); if (pw != null) { pw.println("#ifndef DEFINED_" + cname); pw.println(" #define DEFINED_" + cname); @@ -107,31 +123,29 @@ protected String mangleClassName(String s) { return s.replace('.', '_') - .replace(pathChar, '_') + .replace('/', '_') .replace(innerDelim, '_'); } - protected void forwardDecls(PrintWriter pw, ClassDoc clazz) - throws ClassNotFoundException { - ClassDoc clazzfield = null; + protected void forwardDecls(PrintWriter pw, TypeElement clazz) { + TypeElement object = elems.getTypeElement("java.lang.Object"); + if (clazz.equals(object)) + return; - if (clazz.qualifiedName().equals("java.lang.Object")) - return; - genHandleType(pw, clazz.qualifiedName()); - ClassDoc superClass = clazz.superclass(); + genHandleType(pw, clazz.getQualifiedName().toString()); + TypeElement superClass = (TypeElement) (types.asElement(clazz.getSuperclass())); - if(superClass != null){ - String superClassName = superClass.qualifiedName(); + if (superClass != null) { + String superClassName = superClass.getQualifiedName().toString(); forwardDecls(pw, superClass); } - for (int i = 0; i < fields.length; i++) { - FieldDoc field = (FieldDoc)fields[i]; + for (VariableElement field: fields) { - if (!field.isStatic()) { - Type t = field.type(); - String tname = t.qualifiedTypeName(); - TypeSignature newTypeSig = new TypeSignature(root); + if (!field.getModifiers().contains(Modifier.STATIC)) { + TypeMirror t = types.erasure(field.asType()); + TypeSignature newTypeSig = new TypeSignature(elems); + String tname = newTypeSig.qualifiedTypeName(t); String sig = newTypeSig.getTypeSignature(tname); if (sig.charAt(0) != '[') @@ -139,13 +153,12 @@ } } - for (int i = 0; i < methods.length; i++) { - MethodDoc method = (MethodDoc)methods[i]; + for (ExecutableElement method: methods) { - if (method.isNative()) { - Type retType = method.returnType(); - String typesig = method.signature(); - TypeSignature newTypeSig = new TypeSignature(root); + if (method.getModifiers().contains(Modifier.NATIVE)) { + TypeMirror retType = types.erasure(method.getReturnType()); + String typesig = signature(method); + TypeSignature newTypeSig = new TypeSignature(elems); String sig = newTypeSig.getTypeSignature(typesig, retType); if (sig.charAt(0) != '[') @@ -173,10 +186,9 @@ } protected void structSectionForClass(PrintWriter pw, - ClassDoc jclazz, String cname) - throws ClassNotFoundException { + TypeElement jclazz, String cname) { - String jname = jclazz.qualifiedName(); + String jname = jclazz.getQualifiedName().toString(); if (cname.equals("java_lang_Object")) { pw.println("/* struct java_lang_Object is defined in typedefs.h. */"); @@ -207,8 +219,8 @@ public boolean bottomMost; public boolean printedOne = false; - FieldDefsRes(ClassDoc clazz, FieldDefsRes parent, boolean bottomMost) { - this.className = clazz.qualifiedName(); + FieldDefsRes(TypeElement clazz, FieldDefsRes parent, boolean bottomMost) { + this.className = clazz.getQualifiedName().toString(); this.parent = parent; this.bottomMost = bottomMost; int byteSize = 0; @@ -218,9 +230,8 @@ } /* Returns "true" iff added a field. */ - private boolean doField(FieldDefsRes res, FieldDoc field, - String cname, boolean padWord) - throws ClassNotFoundException { + private boolean doField(FieldDefsRes res, VariableElement field, + String cname, boolean padWord) { String fieldDef = addStructMember(field, cname, padWord); if (fieldDef != null) { @@ -242,16 +253,14 @@ return false; } - private int doTwoWordFields(FieldDefsRes res, ClassDoc clazz, - int offset, String cname, boolean padWord) - throws ClassNotFoundException { + private int doTwoWordFields(FieldDefsRes res, TypeElement clazz, + int offset, String cname, boolean padWord) { boolean first = true; - FieldDoc[] fields = clazz.fields(); + List fields = ElementFilter.fieldsIn(clazz.getEnclosedElements()); - for (int i = 0; i fields = ElementFilter.fieldsIn(clazz.getEnclosedElements()); - for (int i = 0; i < fields.length; i++) { - FieldDoc field = fields[i]; + for (VariableElement field: fields) { if (doubleAlign && !didTwoWordFields && (offset % 8) == 0) { offset = doTwoWordFields(res, clazz, offset, cname, false); didTwoWordFields = true; } - String tc = field.type().typeName(); - boolean twoWords = (tc.equals("long") ||tc.equals("double")); + TypeKind tk = field.asType().getKind(); + boolean twoWords = (tk == TypeKind.LONG || tk == TypeKind.DOUBLE); if (!doubleAlign || !twoWords) { if (doField(res, field, cname, false)) offset += 4; @@ -313,19 +320,19 @@ } /* OVERRIDE: This method handles instance fields */ - protected String addStructMember(FieldDoc member, String cname, - boolean padWord) - throws ClassNotFoundException { + protected String addStructMember(VariableElement member, String cname, + boolean padWord) { String res = null; - if (member.isStatic()) { + if (member.getModifiers().contains(Modifier.STATIC)) { res = addStaticStructMember(member, cname); // if (res == null) /* JNI didn't handle it, print comment. */ // res = " /* Inaccessible static: " + member + " */" + lineSep; } else { + TypeMirror mt = types.erasure(member.asType()); if (padWord) res = " java_int padWord" + padFieldNum++ + ";" + lineSep; - res = " " + llniType(member.type(), false, false) + " " + llniFieldName(member); - if (isLongOrDouble(member.type())) res = res + "[2]"; + res = " " + llniType(mt, false, false) + " " + llniFieldName(member); + if (isLongOrDouble(mt)) res = res + "[2]"; res = res + ";" + lineSep; } return res; @@ -337,36 +344,42 @@ /* * This method only handles static final fields. */ - protected String addStaticStructMember(FieldDoc field, String cname) - throws ClassNotFoundException { + protected String addStaticStructMember(VariableElement field, String cname) { String res = null; Object exp = null; - if (!field.isStatic()) + if (!field.getModifiers().contains(Modifier.STATIC)) return res; - if (!field.isFinal()) + if (!field.getModifiers().contains(Modifier.FINAL)) return res; - exp = field.constantValue(); + exp = field.getConstantValue(); if (exp != null) { /* Constant. */ - String cn = cname + "_" + field.name(); + String cn = cname + "_" + field.getSimpleName(); String suffix = null; long val = 0; /* Can only handle int, long, float, and double fields. */ - if (exp instanceof Integer) { + if (exp instanceof Byte + || exp instanceof Short + || exp instanceof Integer) { suffix = "L"; - val = ((Integer)exp).intValue(); + val = ((Number)exp).intValue(); } - if (exp instanceof Long) { + else if (exp instanceof Long) { // Visual C++ supports the i64 suffix, not LL suffix = isWindows ? "i64" : "LL"; val = ((Long)exp).longValue(); } - if (exp instanceof Float) suffix = "f"; - if (exp instanceof Double) suffix = ""; + else if (exp instanceof Float) suffix = "f"; + else if (exp instanceof Double) suffix = ""; + else if (exp instanceof Character) { + suffix = "L"; + Character ch = (Character) exp; + val = ((int) ch) & 0xffff; + } if (suffix != null) { // Some compilers will generate a spurious warning // for the integer constants for Integer.MIN_VALUE @@ -376,9 +389,12 @@ res = " #undef " + cn + lineSep + " #define " + cn + " (" + (val + 1) + suffix + "-1)" + lineSep; + } else if (suffix.equals("L") || suffix.endsWith("LL")) { + res = " #undef " + cn + lineSep + + " #define " + cn + " " + val + suffix + lineSep; } else { res = " #undef " + cn + lineSep - + " #define " + cn + " "+ exp.toString() + suffix + lineSep; + + " #define " + cn + " " + exp + suffix + lineSep; } } } @@ -386,8 +402,8 @@ } protected void methodSectionForClass(PrintWriter pw, - ClassDoc clazz, String cname) - throws ClassNotFoundException { + TypeElement clazz, String cname) + throws Util.Exit { String methods = methodDecls(clazz, cname); if (methods.length() != 0) { @@ -402,81 +418,77 @@ } } - protected String methodDecls(ClassDoc clazz, String cname) - throws ClassNotFoundException { + protected String methodDecls(TypeElement clazz, String cname) throws Util.Exit { String res = ""; - for (int i = 0; i < methods.length; i++) { - MethodDoc method = (MethodDoc)methods[i]; - if (method.isNative()) + for (ExecutableElement method: methods) { + if (method.getModifiers().contains(Modifier.NATIVE)) res = res + methodDecl(method, clazz, cname); } return res; } - protected String methodDecl(MethodDoc method, - ClassDoc clazz, String cname) - throws ClassNotFoundException { + protected String methodDecl(ExecutableElement method, + TypeElement clazz, String cname) + throws Util.Exit { String res = null; - Type retType = method.returnType(); - String typesig = method.signature(); - TypeSignature newTypeSig = new TypeSignature(root); + TypeMirror retType = types.erasure(method.getReturnType()); + String typesig = signature(method); + TypeSignature newTypeSig = new TypeSignature(elems); String sig = newTypeSig.getTypeSignature(typesig, retType); boolean longName = needLongName(method, clazz); if (sig.charAt(0) != '(') - Util.error("invalid.method.signature", sig); + util.error("invalid.method.signature", sig); res = "JNIEXPORT " + jniType(retType) + " JNICALL" + lineSep + jniMethodName(method, cname, longName) + "(JNIEnv *, " + cRcvrDecl(method, cname); - Parameter[] params = method.parameters(); - Type argTypes[] = new Type[params.length]; - for(int p = 0; p < params.length; p++){ - argTypes[p] = params[p].type(); + List params = method.getParameters(); + List argTypes = new ArrayList(); + for (VariableElement p: params){ + argTypes.add(types.erasure(p.asType())); } /* It would have been nice to include the argument names in the declaration, but there seems to be a bug in the "BinaryField" class, causing the getArguments() method to return "null" for most (non-constructor) methods. */ - for (int i = 0; i < argTypes.length; i++) - res = res + ", " + jniType(argTypes[i]); + for (TypeMirror argType: argTypes) + res = res + ", " + jniType(argType); res = res + ");" + lineSep; return res; } - protected final boolean needLongName(MethodDoc method, - ClassDoc clazz) - throws ClassNotFoundException { - String methodName = method.name(); - for (int i = 0; i < methods.length; i++) { - MethodDoc memberMethod = (MethodDoc) methods[i]; + protected final boolean needLongName(ExecutableElement method, + TypeElement clazz) { + Name methodName = method.getSimpleName(); + for (ExecutableElement memberMethod: methods) { if ((memberMethod != method) && - memberMethod.isNative() && (methodName == memberMethod.name())) + memberMethod.getModifiers().contains(Modifier.NATIVE) && + (methodName.equals(memberMethod.getSimpleName()))) return true; } return false; } - protected final String jniMethodName(MethodDoc method, String cname, + protected final String jniMethodName(ExecutableElement method, String cname, boolean longName) { - String res = "Java_" + cname + "_" + method.name(); + String res = "Java_" + cname + "_" + method.getSimpleName(); if (longName) { - Type mType = method.returnType(); - Parameter[] params = method.parameters(); - Type argTypes[] = new Type[params.length]; - for(int p = 0; p < params.length; p++){ - argTypes[p] = params[p].type(); + TypeMirror mType = types.erasure(method.getReturnType()); + List params = method.getParameters(); + List argTypes = new ArrayList(); + for (VariableElement param: params) { + argTypes.add(types.erasure(param.asType())); } res = res + "__"; - for (int i = 0; i < argTypes.length; i++){ - Type t = argTypes[i]; - String tname = t.typeName(); - TypeSignature newTypeSig = new TypeSignature(root); + for (TypeMirror t: argTypes) { + String tname = t.toString(); + TypeSignature newTypeSig = new TypeSignature(elems); String sig = newTypeSig.getTypeSignature(tname); res = res + nameToIdentifier(sig); } @@ -484,88 +496,143 @@ return res; } - protected final String jniType(Type t) { - String elmT =t.typeName(); - if (t.dimension().indexOf("[]") != -1) { - if(elmT.equals("boolean"))return "jbooleanArray"; - else if(elmT.equals("byte"))return "jbyteArray"; - else if(elmT.equals("char"))return "jcharArray"; - else if(elmT.equals("short"))return "jshortArray"; - else if(elmT.equals("int"))return "jintArray"; - else if(elmT.equals("long"))return "jlongArray"; - else if(elmT.equals("float"))return "jfloatArray"; - else if(elmT.equals("double"))return "jdoubleArray"; - else if((t.dimension().indexOf("[][]") != -1) || (t.asClassDoc() != null)) return "jobjectArray"; - } else { - if(elmT.equals("void"))return "void"; - else if(elmT.equals("boolean"))return "jboolean"; - else if(elmT.equals("byte"))return "jbyte"; - else if(elmT.equals("char"))return "jchar"; - else if(elmT.equals("short"))return "jshort"; - else if(elmT.equals("int"))return "jint"; - else if(elmT.equals("long"))return "jlong"; - else if(elmT.equals("float"))return "jfloat"; - else if(elmT.equals("double"))return "jdouble"; - else if (t.asClassDoc() != null) { - if (elmT.equals("String")) + // copied from JNI.java + protected final String jniType(TypeMirror t) throws Util.Exit { + TypeElement throwable = elems.getTypeElement("java.lang.Throwable"); + TypeElement jClass = elems.getTypeElement("java.lang.Class"); + TypeElement jString = elems.getTypeElement("java.lang.String"); + Element tclassDoc = types.asElement(t); + + switch (t.getKind()) { + case ARRAY: { + TypeMirror ct = ((ArrayType) t).getComponentType(); + switch (ct.getKind()) { + case BOOLEAN: return "jbooleanArray"; + case BYTE: return "jbyteArray"; + case CHAR: return "jcharArray"; + case SHORT: return "jshortArray"; + case INT: return "jintArray"; + case LONG: return "jlongArray"; + case FLOAT: return "jfloatArray"; + case DOUBLE: return "jdoubleArray"; + case ARRAY: + case DECLARED: return "jobjectArray"; + default: throw new Error(ct.toString()); + } + } + + case VOID: return "void"; + case BOOLEAN: return "jboolean"; + case BYTE: return "jbyte"; + case CHAR: return "jchar"; + case SHORT: return "jshort"; + case INT: return "jint"; + case LONG: return "jlong"; + case FLOAT: return "jfloat"; + case DOUBLE: return "jdouble"; + + case DECLARED: { + if (tclassDoc.equals(jString)) return "jstring"; - else if (t.asClassDoc().subclassOf(root.classNamed("java.lang.Class"))) + else if (types.isAssignable(t, throwable.asType())) + return "jthrowable"; + else if (types.isAssignable(t, jClass.asType())) return "jclass"; else return "jobject"; } } - Util.bug("jni.unknown.type"); + + util.bug("jni.unknown.type"); return null; /* dead code. */ } - protected String llniType(Type t, boolean handleize, boolean longDoubleOK) { + protected String llniType(TypeMirror t, boolean handleize, boolean longDoubleOK) { String res = null; - String elmt = t.typeName(); - if (t.dimension().indexOf("[]") != -1) { - if((t.dimension().indexOf("[][]") != -1) - || (t.asClassDoc() != null)) res = "IArrayOfRef"; - else if(elmt.equals("boolean")) res = "IArrayOfBoolean"; - else if(elmt.equals("byte")) res = "IArrayOfByte"; - else if(elmt.equals("char")) res = "IArrayOfChar"; - else if(elmt.equals("int")) res = "IArrayOfInt"; - else if(elmt.equals("long")) res = "IArrayOfLong"; - else if(elmt.equals("float")) res = "IArrayOfFloat"; - else if(elmt.equals("double")) res = "IArrayOfDouble"; - if (!handleize) res = "DEREFERENCED_" + res; - } else { - if(elmt.equals("void")) res = "void"; - else if( (elmt.equals("boolean")) || (elmt.equals("byte")) - ||(elmt.equals("char")) || (elmt.equals("short")) - || (elmt.equals("int"))) res = "java_int"; - else if(elmt.equals("long")) res = longDoubleOK - ? "java_long" : "val32 /* java_long */"; - else if(elmt.equals("float")) res = "java_float"; - else if(elmt.equals("double")) res = res = longDoubleOK - ? "java_double" : "val32 /* java_double */"; - else if(t.asClassDoc() != null) { - res = "I" + mangleClassName(t.asClassDoc().qualifiedName()); + + switch (t.getKind()) { + case ARRAY: { + TypeMirror ct = ((ArrayType) t).getComponentType(); + switch (ct.getKind()) { + case BOOLEAN: res = "IArrayOfBoolean"; break; + case BYTE: res = "IArrayOfByte"; break; + case CHAR: res = "IArrayOfChar"; break; + case SHORT: res = "IArrayOfShort"; break; + case INT: res = "IArrayOfInt"; break; + case LONG: res = "IArrayOfLong"; break; + case FLOAT: res = "IArrayOfFloat"; break; + case DOUBLE: res = "IArrayOfDouble"; break; + case ARRAY: + case DECLARED: res = "IArrayOfRef"; break; + default: throw new Error(ct.getKind() + " " + ct); + } if (!handleize) res = "DEREFERENCED_" + res; + break; } + + case VOID: + res = "void"; + break; + + case BOOLEAN: + case BYTE: + case CHAR: + case SHORT: + case INT: + res = "java_int" ; + break; + + case LONG: + res = longDoubleOK ? "java_long" : "val32 /* java_long */"; + break; + + case FLOAT: + res = "java_float"; + break; + + case DOUBLE: + res = longDoubleOK ? "java_double" : "val32 /* java_double */"; + break; + + case DECLARED: + TypeElement e = (TypeElement) types.asElement(t); + res = "I" + mangleClassName(e.getQualifiedName().toString()); + if (!handleize) res = "DEREFERENCED_" + res; + break; + + default: + throw new Error(t.getKind() + " " + t); // FIXME } + return res; } - protected final String cRcvrDecl(MemberDoc field, String cname) { - return (field.isStatic() ? "jclass" : "jobject"); + protected final String cRcvrDecl(Element field, String cname) { + return (field.getModifiers().contains(Modifier.STATIC) ? "jclass" : "jobject"); } protected String maskName(String s) { return "LLNI_mask(" + s + ")"; } - protected String llniFieldName(MemberDoc field) { - return maskName(field.name()); + protected String llniFieldName(VariableElement field) { + return maskName(field.getSimpleName().toString()); } - protected final boolean isLongOrDouble(Type t) { - String tc = t.typeName(); - return (tc.equals("long") || tc.equals("double")); + protected final boolean isLongOrDouble(TypeMirror t) { + TypeVisitor v = new SimpleTypeVisitor6() { + public Boolean defaultAction(TypeMirror t, Void p){ + return false; + } + public Boolean visitArray(ArrayType t, Void p) { + return visit(t.getComponentType(), p); + } + public Boolean visitPrimitive(PrimitiveType t, Void p) { + TypeKind tk = t.getKind(); + return (tk == TypeKind.LONG || tk == TypeKind.DOUBLE); + } + }; + return v.visit(t, null); } /* Do unicode to ansi C identifier conversion. @@ -602,3 +669,4 @@ return false; } } + diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javah/Main.java --- a/src/share/classes/com/sun/tools/javah/Main.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javah/Main.java Wed Oct 07 14:14:45 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2007-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 @@ -23,134 +23,39 @@ * have any questions. */ - package com.sun.tools.javah; - -import java.io.*; +import java.io.PrintWriter; /** - * Javah generates support files for native methods. - * Parse commandline options & Invokes javadoc to execute those commands. + * Main entry point. * - * @author Sucheta Dambalkar + *

This is NOT part of any API supported by Sun Microsystems. If + * you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. */ -public class Main{ - /* - * Parse arguments given for javah to give proper error messages. +public class Main { + /** + * Main entry point for the launcher. + * Note: This method calls System.exit. + * @param args command line arguments */ - public static void main(String[] args){ - - if (args.length == 0) { - Util.usage(1); - } - for ( int i = 0; i < args.length; i++) { - if (args[i].equals("-o")) { - i++; - if(i >= args.length){ - Util.usage(1); - }else if(args[i].charAt(0) == '-'){ - Util.error("no.outputfile.specified"); - }else if((i+1) >= args.length){ - Util.error("no.classes.specified"); - } - } else if (args[i].equals("-d")) { - i++; - if(i >= args.length){ - Util.usage(1); - }else if(args[i].charAt(0) == '-') { - Util.error("no.outputdir.specified"); - }else if((i+1) >= args.length){ - Util.error("no.classes.specified"); - } - } else if (args[i].equals("-td")) { - /* Ignored. Generate tmp files to memory. */ - i++; - if (i == args.length) - Util.usage(1); - } else if (args[i].equals("-stubs")) { - if((i+1) >= args.length){ - Util.error("no.classes.specified"); - } - } else if (args[i].equals("-v") || args[i].equals("-verbose")) { - if((i+1) >= args.length){ - Util.error("no.classes.specified"); - } - args[i] = "-verbose"; - } else if ((args[i].equals("-help")) || (args[i].equals("--help")) - || (args[i].equals("-?")) || (args[i].equals("-h"))) { - Util.usage(0); - } else if (args[i].equals("-trace")) { - System.err.println(Util.getText("tracing.not.supported")); - } else if (args[i].equals("-version")) { - if((i+1) >= args.length){ - Util.version(); - } - } else if (args[i].equals("-jni")) { - if((i+1) >= args.length){ - Util.error("no.classes.specified"); - } - } else if (args[i].equals("-force")) { - if((i+1) >= args.length){ - Util.error("no.classes.specified"); - } - } else if (args[i].equals("-Xnew")) { - // we're already using the new javah - } else if (args[i].equals("-old")) { - System.err.println(Util.getText("old.not.supported")); - Util.usage(1); - } else if (args[i].equals("-Xllni")) { - if((i+1) >= args.length){ - Util.error("no.classes.specified"); - } - } else if (args[i].equals("-llni")) { - if((i+1) >= args.length){ - Util.error("no.classes.specified"); - } - } else if (args[i].equals("-llniDouble")) { - if((i+1) >= args.length){ - Util.error("no.classes.specified"); - } - } else if (args[i].equals("-classpath")) { - i++; - if(i >= args.length){ - Util.usage(1); - }else if(args[i].charAt(0) == '-') { - Util.error("no.classpath.specified"); - }else if((i+1) >= args.length){ - Util.error("no.classes.specified"); - } - } else if (args[i].equals("-bootclasspath")) { - i++; - if(i >= args.length){ - Util.usage(1); - }else if(args[i].charAt(0) == '-'){ - Util.error("no.bootclasspath.specified"); - }else if((i+1) >= args.length){ - Util.error("no.classes.specified"); - } - } else if (args[i].charAt(0) == '-') { - Util.error("unknown.option", args[i], null, true); - - } else { - //break; /* The rest must be classes. */ - } - } - - /* Invoke javadoc */ - - String[] javadocargs = new String[args.length + 2]; - int i = 0; - - for(; i < args.length; i++) { - javadocargs[i] = args[i]; - } - - javadocargs[i] = "-private"; - i++; - javadocargs[i] = "-Xclasses"; - - int rc = com.sun.tools.javadoc.Main.execute("javadoc", "com.sun.tools.javah.MainDoclet", javadocargs); + public static void main(String[] args) { + JavahTask t = new JavahTask(); + int rc = t.run(args); System.exit(rc); } + + /** + * Entry point that does not call System.exit. + * @param args command line arguments + * @param out output stream + * @return an exit code. 0 means success, non-zero means an error occurred. + */ + public static int run(String[] args, PrintWriter out) { + JavahTask t = new JavahTask(); + t.setLog(out); + return t.run(args); + } } diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javah/MainDoclet.java --- a/src/share/classes/com/sun/tools/javah/MainDoclet.java Fri Oct 02 11:26:53 2009 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,218 +0,0 @@ -/* - * Copyright 2002-2003 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. Sun designates this - * particular file as subject to the "Classpath" exception as provided - * by Sun in the LICENSE file that accompanied this code. - * - * 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. - */ - - -package com.sun.tools.javah; - -import com.sun.javadoc.*; -import java.io.*; - -/** - * A doclet to parse and execute commandline options. - * - * @author Sucheta Dambalkar(using code from old javap) - */ -public class MainDoclet{ - - public static String odir = null; - public static String ofile = null; - public static boolean stubs = false; - public static boolean jni = false; - public static boolean llni = false; - public static boolean doubleAlign = false; - public static boolean force = false; - public static String genclass = null; - - - /** - * Entry point. - */ - public static boolean start(RootDoc root) { - - int j = 0; - int k = 0; - /** - * Command line options. - */ - String [][] cmdoptions = root.options(); - /** - * Classes specified on command line. - */ - ClassDoc[] classes = root.classes(); - /** - * Generator used by javah. Default is JNI. - */ - Gen g = new JNI(root); - - validateOptions(cmdoptions); - - /* - * Select native interface. - */ - if (jni && llni) Util.error("jni.llni.mixed"); - - if (llni) - g = new LLNI(doubleAlign, root); - - if (g instanceof JNI && stubs) Util.error("jni.no.stubs"); - - /* - * Arrange for output destination. - */ - if (odir != null && ofile != null) - Util.error("dir.file.mixed"); - - if (odir != null) - g.setOutDir(odir); - - if (ofile != null) - g.setOutFile(ofile); - - /* - * Force set to false will turn off smarts about checking file - * content before writing. - */ - g.setForce(force); - - /* - * Grab the rest of argv[] ... this must be the classes. - */ - if (classes.length == 0){ - Util.error("no.classes.specified"); - } - /* - * Set classes. - */ - g.setClasses(classes); - - try { - g.run(); - } catch (ClassNotFoundException cnfe) { - Util.error("class.not.found", cnfe.getMessage()); - } catch (IOException ioe) { - Util.error("io.exception", ioe.getMessage()); - } - - return true; - } - - /** - * Required doclet method. - */ - public static int optionLength(String option) { - if (option.equals("-o")) { - return 2; - } else if(option.equals("-d")){ - return 2; - } else if (option.equals("-td")) { - return 1; - } else if (option.equals("-stubs")) { - return 1; - } else if(option.equals("-help")){ - return 1; - } else if(option.equals("--help")){ - return 1; - } else if(option.equals("-?")){ - return 1; - } else if(option.equals("-h")){ - return 1; - } else if(option.equals("-trace")){ - return 1; - } else if(option.equals("-version")) { - return 1; - } else if(option.equals("-jni")){ - return 1; - } else if(option.equals("-force")){ - return 1; - } else if(option.equals("-Xllni")){ - return 1; - } else if(option.equals("-llni")){ - return 1; - } else if(option.equals("-llniDouble")){ - return 1; - } else return 0; - } - - /** - * Parse the command line options. - */ - public static void validateOptions(String cmdoptions[][]) { - /* Default values for options, overridden by user options. */ - String bootcp = System.getProperty("sun.boot.class.path"); - String usercp = System.getProperty("env.class.path"); - - for(int p = 0; p < cmdoptions.length; p++){ - - if (cmdoptions[p][0].equals("-o")) { - ofile = cmdoptions[p][1]; - } else if(cmdoptions[p][0].equals("-d")){ - odir = cmdoptions[p][1]; - } else if (cmdoptions[p][0].equals("-td")) { - if (p ==cmdoptions.length) - Util.usage(1); - } else if (cmdoptions[p][0].equals("-stubs")) { - stubs = true; - } else if (cmdoptions[p][0].equals("-verbose")) { - Util.verbose = true; - } else if((cmdoptions[p][0].equals("-help")) - || (cmdoptions[p][0].equals("--help")) - || (cmdoptions[p][0].equals("-?")) - || (cmdoptions[p][0].equals("-h"))) { - Util.usage(0); - } else if (cmdoptions[p][0].equals("-trace")) { - System.err.println(Util.getText("tracing.not.supported")); - } else if (cmdoptions[p][0].equals("-version")) { - Util.version(); - } else if (cmdoptions[p][0].equals("-jni")) { - jni = true; - } else if (cmdoptions[p][0].equals("-force")) { - force = true; - } else if (cmdoptions[p][0].equals("-Xllni")) { - llni = true; - } else if (cmdoptions[p][0].equals("-llni")) { - llni = true; - } else if (cmdoptions[p][0].equals("-llniDouble")) { - llni = true; doubleAlign = true; - } else if (cmdoptions[p][0].equals("-classpath")) { - usercp = cmdoptions[p][1]; - } else if (cmdoptions[p][0].equals("-bootclasspath")) { - bootcp = cmdoptions[p][1]; - } else if((cmdoptions[p][0].charAt(0) == '-') - && (!cmdoptions[p][0].equals("-private"))){ - Util.error("unknown.option", cmdoptions[p][0], null, true); - } else { - break; /* The rest must be classes. */ - } - } - - - if (Util.verbose) { - System.err.println("[ Search Path: " - + bootcp - + System.getProperty("file.separator") - + usercp + " ]"); - } - } -} diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javah/Mangle.java --- a/src/share/classes/com/sun/tools/javah/Mangle.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javah/Mangle.java Wed Oct 07 14:14:45 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-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 @@ -26,22 +26,30 @@ package com.sun.tools.javah; -import com.sun.javadoc.*; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.util.Elements; +import javax.lang.model.util.Types; /** * A utility for mangling java identifiers into C names. Should make * this more fine grained and distribute the functionality to the * generators. * + *

This is NOT part of any API supported by Sun Microsystems. + * If you write code that depends on this, you do so at your own + * risk. This code and its internal interfaces are subject to change + * or deletion without notice.

+ * * @author Sucheta Dambalkar(Revised) */ -class Mangle { +public class Mangle { public static class Type { - public static final int CLASS = 1; public static final int FIELDSTUB = 2; - public static final int FIELD = 3; + public static final int FIELD = 3; public static final int JNI = 4; public static final int SIGNATURE = 5; public static final int METHOD_JDK_1 = 6; @@ -49,8 +57,15 @@ public static final int METHOD_JNI_LONG = 8; }; + private Elements elems; + private Types types; - public static final String mangle(String name, int mtype) { + Mangle(Elements elems, Types types) { + this.elems = elems; + this.types = types; + } + + public final String mangle(CharSequence name, int mtype) { StringBuffer result = new StringBuffer(100); int length = name.length(); @@ -98,15 +113,15 @@ return result.toString(); } - public static String mangleMethod(MethodDoc method, RootDoc root, ClassDoc clazz, + public String mangleMethod(ExecutableElement method, TypeElement clazz, int mtype) { StringBuffer result = new StringBuffer(100); result.append("Java_"); if (mtype == Mangle.Type.METHOD_JDK_1) { - result.append(mangle(clazz.qualifiedName(), Mangle.Type.CLASS)); + result.append(mangle(clazz.getQualifiedName(), Mangle.Type.CLASS)); result.append('_'); - result.append(mangle(method.name(), + result.append(mangle(method.getSimpleName(), Mangle.Type.FIELD)); result.append("_stub"); return result.toString(); @@ -115,13 +130,13 @@ /* JNI */ result.append(mangle(getInnerQualifiedName(clazz), Mangle.Type.JNI)); result.append('_'); - result.append(mangle(method.name(), + result.append(mangle(method.getSimpleName(), Mangle.Type.JNI)); if (mtype == Mangle.Type.METHOD_JNI_LONG) { result.append("__"); - String typesig = method.signature(); - TypeSignature newTypeSig = new TypeSignature(root); - String sig = newTypeSig.getTypeSignature(typesig, method.returnType()); + String typesig = signature(method); + TypeSignature newTypeSig = new TypeSignature(elems); + String sig = newTypeSig.getTypeSignature(typesig, method.getReturnType()); sig = sig.substring(1); sig = sig.substring(0, sig.lastIndexOf(')')); sig = sig.replace('/', '.'); @@ -131,15 +146,11 @@ return result.toString(); } //where - private static String getInnerQualifiedName(ClassDoc clazz) { - ClassDoc encl = clazz.containingClass(); - if (encl == null) - return clazz.qualifiedName(); - else - return getInnerQualifiedName(encl) + '$' + clazz.simpleTypeName(); + private String getInnerQualifiedName(TypeElement clazz) { + return elems.getBinaryName(clazz).toString(); } - public static final String mangleChar(char ch) { + public final String mangleChar(char ch) { String s = Integer.toHexString(ch); int nzeros = 5 - s.length(); char[] result = new char[6]; @@ -151,6 +162,19 @@ return new String(result); } + // Warning: duplicated in Gen + private String signature(ExecutableElement e) { + StringBuffer sb = new StringBuffer(); + String sep = "("; + for (VariableElement p: e.getParameters()) { + sb.append(sep); + sb.append(types.erasure(p.asType()).toString()); + sep = ","; + } + sb.append(")"); + return sb.toString(); + } + /* Warning: Intentional ASCII operation. */ private static final boolean isalnum(char ch) { return ch <= 0x7f && /* quick test */ diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javah/NativeHeaderTool.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/classes/com/sun/tools/javah/NativeHeaderTool.java Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,147 @@ +/* + * Copyright 2005-2006 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. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * 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. + */ + +package com.sun.tools.javah; //javax.tools; + +import java.io.Writer; +import java.nio.charset.Charset; +import java.util.Locale; +import java.util.concurrent.Callable; +import javax.tools.DiagnosticListener; +import javax.tools.JavaFileManager; +import javax.tools.JavaFileObject; +import javax.tools.OptionChecker; +import javax.tools.StandardJavaFileManager; +import javax.tools.Tool; + +/** + * This class is intended to be put in javax.tools. + * + * @see DiagnosticListener + * @see Diagnostic + * @see JavaFileManager + * @since 1.7 + * + *

This is NOT part of any API supported by Sun Microsystems. If + * you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + */ +public interface NativeHeaderTool extends Tool, OptionChecker { + + /** + * Creates a future for a native header task with the given + * components and arguments. The task might not have + * completed as described in the NativeHeaderTask interface. + * + *

If a file manager is provided, it must be able to handle all + * locations defined in {@link StandardLocation}. + * + * @param out a Writer for additional output from the task; + * use {@code System.err} if {@code null} + * @param fileManager a file manager; if {@code null} use the + * task's standard filemanager + * @param diagnosticListener a diagnostic listener; if {@code + * null} use the compiler's default method for reporting + * diagnostics + * @param options task options, {@code null} means no options + * @param classes class names for which native headers should be generated + * @return an object representing the task to be done + * @throws RuntimeException if an unrecoverable error + * occurred in a user supplied component. The + * {@linkplain Throwable#getCause() cause} will be the error in + * user code. + * @throws IllegalArgumentException if any of the given + * compilation units are of other kind than + * {@linkplain JavaFileObject.Kind#SOURCE source} + */ + NativeHeaderTask getTask(Writer out, + JavaFileManager fileManager, + DiagnosticListener diagnosticListener, + Iterable options, + Iterable classes); + + /** + * Gets a new instance of the standard file manager implementation + * for this tool. The file manager will use the given diagnostic + * listener for producing any non-fatal diagnostics. Fatal errors + * will be signalled with the appropriate exceptions. + * + *

The standard file manager will be automatically reopened if + * it is accessed after calls to {@code flush} or {@code close}. + * The standard file manager must be usable with other tools. + * + * @param diagnosticListener a diagnostic listener for non-fatal + * diagnostics; if {@code null} use the tool's default method + * for reporting diagnostics + * @param locale the locale to apply when formatting diagnostics; + * {@code null} means the {@linkplain Locale#getDefault() default locale}. + * @param charset the character set used for decoding bytes; if + * {@code null} use the platform default + * @return the standard file manager + */ + StandardJavaFileManager getStandardFileManager( + DiagnosticListener diagnosticListener, + Locale locale, + Charset charset); + + /** + * Interface representing a future for a native header task. The + * task has not yet started. To start the task, call + * the {@linkplain #call call} method. + * + *

Before calling the call method, additional aspects of the + * task can be configured, for example, by calling the + * {@linkplain #setLocale setLocale} method. + */ + interface NativeHeaderTask extends Callable { + + /** + * Set the locale to be applied when formatting diagnostics and + * other localized data. + * + * @param locale the locale to apply; {@code null} means apply no + * locale + * @throws IllegalStateException if the task has started + */ + void setLocale(Locale locale); + + /** + * Performs this native header task. The task may only + * be performed once. Subsequent calls to this method throw + * IllegalStateException. + * + * @return true if and only all the files were processed without errors; + * false otherwise + * + * @throws RuntimeException if an unrecoverable error occurred + * in a user-supplied component. The + * {@linkplain Throwable#getCause() cause} will be the error + * in user code. + * @throws IllegalStateException if called more than once + */ + Boolean call(); + } +} diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javah/TypeSignature.java --- a/src/share/classes/com/sun/tools/javah/TypeSignature.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javah/TypeSignature.java Wed Oct 07 14:14:45 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-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 @@ -26,19 +26,34 @@ package com.sun.tools.javah; -import com.sun.javadoc.*; -import java.io.*; import java.util.*; +import javax.lang.model.element.Name; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.ArrayType; +import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.NoType; +import javax.lang.model.type.PrimitiveType; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.type.TypeVariable; +import javax.lang.model.type.TypeVisitor; +import javax.lang.model.util.Elements; +import javax.lang.model.util.SimpleTypeVisitor6; /** * Returns internal type signature. * + *

This is NOT part of any API supported by Sun Microsystems. + * If you write code that depends on this, you do so at your own + * risk. This code and its internal interfaces are subject to change + * or deletion without notice.

+ * * @author Sucheta Dambalkar */ public class TypeSignature{ - RootDoc root = null; + Elements elems; /* Signature Characters */ @@ -56,8 +71,8 @@ - public TypeSignature(RootDoc root){ - this.root = root; + public TypeSignature(Elements elems){ + this.elems = elems; } /* @@ -70,16 +85,15 @@ /* * Returns the type signature of a method according to JVM specs */ - public String getTypeSignature(String javasignature, Type returnType){ - + public String getTypeSignature(String javasignature, TypeMirror returnType){ String signature = null; //Java type signature. String typeSignature = null; //Internal type signature. - Vector params = new Vector(); //List of parameters. + List params = new ArrayList(); //List of parameters. String paramsig = null; //Java parameter signature. String paramJVMSig = null; //Internal parameter signature. String returnSig = null; //Java return type signature. String returnJVMType = null; //Internal return type signature. - String dimension = null; //Array dimension. + int dimensions = 0; //Array dimension. int startIndex = -1; int endIndex = -1; @@ -87,28 +101,27 @@ int i = 0; // Gets the actual java signature without parentheses. - if(javasignature != null){ + if (javasignature != null) { startIndex = javasignature.indexOf("("); endIndex = javasignature.indexOf(")"); } - if(((startIndex != -1) && (endIndex != -1)) - &&(startIndex+1 < javasignature.length()) - &&(endIndex < javasignature.length())) { - + if (((startIndex != -1) && (endIndex != -1)) + &&(startIndex+1 < javasignature.length()) + &&(endIndex < javasignature.length())) { signature = javasignature.substring(startIndex+1, endIndex); } // Separates parameters. - if(signature != null){ - if(signature.indexOf(",") != -1){ + if (signature != null) { + if (signature.indexOf(",") != -1) { st = new StringTokenizer(signature, ","); - if(st != null){ + if (st != null) { while (st.hasMoreTokens()) { params.add(st.nextToken()); } } - }else { + } else { params.add(signature); } } @@ -117,10 +130,10 @@ typeSignature = "("; // Gets indivisual internal parameter signature. - while(params.isEmpty() != true){ - paramsig =((String)params.remove(i)).trim(); + while (params.isEmpty() != true) { + paramsig = params.remove(i).trim(); paramJVMSig = getParamJVMSignature(paramsig); - if(paramJVMSig != null){ + if (paramJVMSig != null) { typeSignature += paramJVMSig; } } @@ -130,36 +143,30 @@ // Get internal return type signature. returnJVMType = ""; - if(returnType != null){ - dimension = returnType.dimension(); + if (returnType != null) { + dimensions = dimensions(returnType); } - if(dimension != null){ - - //Gets array dimension of return type. - while(dimension.indexOf("[]") != -1){ - returnJVMType += "["; - int stindex = dimension.indexOf("]") + 1; - if(stindex <= dimension.length()){ - dimension = dimension.substring(stindex); - }else dimension = ""; - } + //Gets array dimension of return type. + while (dimensions-- > 0) { + returnJVMType += "["; } - if(returnType != null){ - returnSig = returnType.qualifiedTypeName(); + if (returnType != null) { + returnSig = qualifiedTypeName(returnType); returnJVMType += getComponentType(returnSig); - }else { + } else { System.out.println("Invalid return type."); } typeSignature += returnJVMType; + return typeSignature; } /* * Returns internal signature of a parameter. */ - private String getParamJVMSignature(String paramsig){ + private String getParamJVMSignature(String paramsig) { String paramJVMSig = ""; String componentType =""; @@ -206,12 +213,13 @@ else if(componentType.equals("double")) JVMSig += SIG_DOUBLE ; else { if(!componentType.equals("")){ - ClassDoc classNameDoc = root.classNamed(componentType); + TypeElement classNameDoc = elems.getTypeElement(componentType); if(classNameDoc == null){ - System.out.println("Invalid class type"); + System.out.println("Invalid class type for " + componentType); + new Exception().printStackTrace(); }else { - String classname = classNameDoc.qualifiedName(); + String classname = classNameDoc.getQualifiedName().toString(); String newclassname = classname.replace('.', '/'); JVMSig += "L"; JVMSig += newclassname; @@ -222,4 +230,43 @@ } return JVMSig; } + + int dimensions(TypeMirror t) { + if (t.getKind() != TypeKind.ARRAY) + return 0; + return 1 + dimensions(((ArrayType) t).getComponentType()); + } + + + String qualifiedTypeName(TypeMirror type) { + TypeVisitor v = new SimpleTypeVisitor6() { + @Override + public Name visitArray(ArrayType t, Void p) { + return t.getComponentType().accept(this, p); + } + + @Override + public Name visitDeclared(DeclaredType t, Void p) { + return ((TypeElement) t.asElement()).getQualifiedName(); + } + + @Override + public Name visitPrimitive(PrimitiveType t, Void p) { + return elems.getName(t.toString()); + } + + @Override + public Name visitNoType(NoType t, Void p) { + if (t.getKind() == TypeKind.VOID) + return elems.getName("void"); + return defaultAction(t, p); + } + + @Override + public Name visitTypeVariable(TypeVariable t, Void p) { + return t.getUpperBound().accept(this, p); + } + }; + return v.visit(type).toString(); + } } diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javah/Util.java --- a/src/share/classes/com/sun/tools/javah/Util.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javah/Util.java Wed Oct 07 14:14:45 2009 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2004 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2002-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 @@ -26,12 +26,15 @@ package com.sun.tools.javah; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; +import java.io.PrintWriter; +import java.text.MessageFormat; +import java.util.Locale; import java.util.ResourceBundle; -import java.text.MessageFormat; import java.util.MissingResourceException; +import javax.tools.Diagnostic; +import javax.tools.Diagnostic.Kind; +import javax.tools.DiagnosticListener; +import javax.tools.JavaFileObject; /** * Messages, verbose and error handling support. @@ -41,42 +44,70 @@ * bug -- Bug has occurred in javah * fatal -- We can't even find resources, so bail fast, don't localize * + *

This is NOT part of any API supported by Sun Microsystems. + * If you write code that depends on this, you do so at your own + * risk. This code and its internal interfaces are subject to change + * or deletion without notice.

*/ public class Util { + /** Exit is used to replace the use of System.exit in the original javah. + */ + public static class Exit extends Error { + private static final long serialVersionUID = 430820978114067221L; + Exit(int exitValue) { + this(exitValue, null); + } + + Exit(int exitValue, Throwable cause) { + super(cause); + this.exitValue = exitValue; + this.cause = cause; + } + + Exit(Exit e) { + this(e.exitValue, e.cause); + } + + public final int exitValue; + public final Throwable cause; + } /* * Help for verbosity. */ - public static boolean verbose = false; + public boolean verbose = false; - public static void log(String s) { - System.out.println(s); + public PrintWriter log; + public DiagnosticListener dl; + + Util(PrintWriter log, DiagnosticListener dl) { + this.log = log; + this.dl = dl; + } + + public void log(String s) { + log.println(s); } /* * Help for loading localized messages. */ - private static ResourceBundle m; + private ResourceBundle m; - private static void initMessages() { + private void initMessages() throws Exit { try { - m=ResourceBundle.getBundle("com.sun.tools.javah.resources.l10n"); + m = ResourceBundle.getBundle("com.sun.tools.javah.resources.l10n"); } catch (MissingResourceException mre) { fatal("Error loading resources. Please file a bug report.", mre); } } - public static String getText(String key) { - return getText(key, null, null); - } - - private static String getText(String key, String a1, String a2){ + private String getText(String key, Object... args) throws Exit { if (m == null) initMessages(); try { - return MessageFormat.format(m.getString(key), - new Object[] { a1, a2 }); + return MessageFormat.format(m.getString(key), args); } catch (MissingResourceException e) { fatal("Key " + key + " not found in resources.", e); } @@ -86,107 +117,74 @@ /* * Usage message. */ - public static void usage(int exitValue) { - if (exitValue == 0) { - System.out.println(getText("usage")); - } else { - System.err.println(getText("usage")); - } - System.exit(exitValue); + public void usage() throws Exit { + log.println(getText("usage")); } - public static void version() { - System.out.println(getText("javah.version", + public void version() throws Exit { + log.println(getText("javah.version", System.getProperty("java.version"), null)); - System.exit(0); } /* * Failure modes. */ - public static void bug(String key) { + public void bug(String key) throws Exit { bug(key, null); } - public static void bug(String key, Exception e) { - if (e != null) - e.printStackTrace(); - System.err.println(getText(key)); - System.err.println(getText("bug.report")); - System.exit(11); + public void bug(String key, Exception e) throws Exit { + dl.report(createDiagnostic(Diagnostic.Kind.ERROR, key)); + dl.report(createDiagnostic(Diagnostic.Kind.NOTE, "bug.report")); + throw new Exit(11, e); } - public static void error(String key) { - error(key, null); + public void error(String key, Object... args) throws Exit { + dl.report(createDiagnostic(Diagnostic.Kind.ERROR, key, args)); + throw new Exit(15); } - public static void error(String key, String a1) { - error(key, a1, null); - } - - public static void error(String key, String a1, String a2) { - error(key, a1, a2, false); - } - - public static void error(String key, String a1, String a2, - boolean showUsage) { - System.err.println("Error: " + getText(key, a1, a2)); - if (showUsage) - usage(15); - System.exit(15); - } - - - private static void fatal(String msg) { + private void fatal(String msg) throws Exit { fatal(msg, null); } - private static void fatal(String msg, Exception e) { - if (e != null) { - e.printStackTrace(); - } - System.err.println(msg); - System.exit(10); + private void fatal(String msg, Exception e) throws Exit { + dl.report(createDiagnostic(Diagnostic.Kind.ERROR, "", msg)); + throw new Exit(10, e); } - /* - * Support for platform specific things in javah, such as pragma - * directives, exported symbols etc. - */ - static private ResourceBundle platform = null; - - /* - * Set when platform has been initialized. - */ - static private boolean platformInit = false; - - static String getPlatformString(String key) { - if (!platformInit) { - initPlatform(); - platformInit = true; - } - if (platform == null) - return null; - try { - return platform.getString(key); - } catch (MissingResourceException mre) { - return null; - } - } - - private static void initPlatform() { - String os = System.getProperty("os.name"); - if (os.startsWith("Windows")) { - os = "win32"; - } else if (os.indexOf("Linux") >= 0) { - os = "Linux"; - } - String arch = System.getProperty("os.arch"); - String resname = "com.sun.tools.javah.resources." + os + "_" + arch; - try { - platform=ResourceBundle.getBundle(resname); - } catch (MissingResourceException mre) { - // fatal("Error loading resources. Please file a bug report.", mre); - } + private Diagnostic createDiagnostic( + final Diagnostic.Kind kind, final String code, final Object... args) { + return new Diagnostic() { + public String getCode() { + return code; + } + public long getColumnNumber() { + return Diagnostic.NOPOS; + } + public long getEndPosition() { + return Diagnostic.NOPOS; + } + public Kind getKind() { + return kind; + } + public long getLineNumber() { + return Diagnostic.NOPOS; + } + public String getMessage(Locale locale) { + if (code.length() == 0) + return (String) args[0]; + return getText(code, args); // FIXME locale + } + public long getPosition() { + return Diagnostic.NOPOS; + } + public JavaFileObject getSource() { + return null; + } + public long getStartPosition() { + return Diagnostic.NOPOS; + } + }; } } diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javah/resources/Linux_ppc.properties --- a/src/share/classes/com/sun/tools/javah/resources/Linux_ppc.properties Fri Oct 02 11:26:53 2009 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -# -# Copyright 2000 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. Sun designates this -# particular file as subject to the "Classpath" exception as provided -# by Sun in the LICENSE file that accompanied this code. -# -# 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. -# - -pack.pragma.start=\#pragma pack(4)\n -pack.pragma.end=\#pragma pack()\n diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javah/resources/Linux_sparc.properties --- a/src/share/classes/com/sun/tools/javah/resources/Linux_sparc.properties Fri Oct 02 11:26:53 2009 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -# -# Copyright 2000 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. Sun designates this -# particular file as subject to the "Classpath" exception as provided -# by Sun in the LICENSE file that accompanied this code. -# -# 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. -# - -pack.pragma.start=\#pragma pack(4)\n -pack.pragma.end=\#pragma pack()\n diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javah/resources/SunOS_sparc.properties --- a/src/share/classes/com/sun/tools/javah/resources/SunOS_sparc.properties Fri Oct 02 11:26:53 2009 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -# -# Copyright 1998 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. Sun designates this -# particular file as subject to the "Classpath" exception as provided -# by Sun in the LICENSE file that accompanied this code. -# -# 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. -# - -pack.pragma.start=\#pragma pack(4)\n -pack.pragma.end=\#pragma pack()\n diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javah/resources/SunOS_sparcv9.properties --- a/src/share/classes/com/sun/tools/javah/resources/SunOS_sparcv9.properties Fri Oct 02 11:26:53 2009 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -# -# Copyright 2001 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. Sun designates this -# particular file as subject to the "Classpath" exception as provided -# by Sun in the LICENSE file that accompanied this code. -# -# 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. -# - -pack.pragma.start=\#pragma pack(4)\n -pack.pragma.end=\#pragma pack()\n diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javah/resources/l10n.properties --- a/src/share/classes/com/sun/tools/javah/resources/l10n.properties Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javah/resources/l10n.properties Wed Oct 07 14:14:45 2009 -0700 @@ -21,47 +21,47 @@ # 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. -# +# # # User errors, command line errors. # cant.create.dir=\ - The directory {0} could not be create for output. + The directory {0} could not be create for output. at.args.cant.read=\ - Can''t read command line arguments from file {1}. + Can''t read command line arguments from file {1}. at.args.io.exception=\ - The following I/O problem was encountered when processing an @ \ + The following I/O problem was encountered when processing an @ \ argument on the command line: {0}. old.jni.mixed=\ - Can''t mix options -jni and -old. Try -help. + Can''t mix options -jni and -old. Try -help. old.llni.mixed=\ - Can''t mix options -old and -llni. Try -help. + Can''t mix options -old and -llni. Try -help. old.not.supported=\ - Option -old not supported by this version of javah. + Option -old not supported by this version of javah. invalid.method.signature=\ - Invalid method signature: {0} + Invalid method signature: {0} jni.llni.mixed=\ - Can''t mix options -jni and -llni. Try -help. + Can''t mix options -jni and -llni. Try -help. jni.no.stubs=\ - JNI does not require stubs, please refer to the JNI documentation. + JNI does not require stubs, please refer to the JNI documentation. dir.file.mixed=\ - Can''t mix options -d and -o. Try -help. + Can''t mix options -d and -o. Try -help. no.classes.specified=\ - No classes were specified on the command line. Try -help. + No classes were specified on the command line. Try -help. no.outputfile.specified=\ - No outputfile was specified on the command line. Try -help. + No outputfile was specified on the command line. Try -help. no.outputdir.specified=\ - No output directory was specified on the command line. Try -help. + No output directory was specified on the command line. Try -help. no.classpath.specified=\ - No classpath was specified on the command line. Try -help. + No classpath was specified on the command line. Try -help. no.bootclasspath.specified=\ - No bootclasspath was specified on the command line. Try -help. + No bootclasspath was specified on the command line. Try -help. unknown.option=\ - {0} is an illegal argument\n + {0} is an illegal argument\n tracing.not.supported=\ - Warning: Tracing is no longer supported. Instead, use\ - -verbose:jni option of the virtual machine. + Warning: Tracing is no longer supported. Instead, use\ + -verbose:jni option of the virtual machine. # # Usage message. @@ -79,11 +79,37 @@ -jni Generate JNI-style header file (default)\n\t\ -version Print version information\n\t\ -verbose Enable verbose output\n\t\ --force Always write output files\n\ +-force Always write output files\n\ \n\ are specified with their fully qualified names (for\n\ instance, java.lang.Object).\n +main.usage=\ +Usage: \n\ +\ javah [options] \n\ +where [options] include: +main.opt.o=\ +\ -o Output file (only one of -d or -o may be used) +main.opt.d=\ +\ -d Output directory +main.opt.v=\ +\ -v -verbose Enable verbose output +main.opt.help=\ +\ -h --help -? Print this message +main.opt.version=\ +\ -version Print version information +main.opt.jni=\ +\ -jni Generate JNI-style header file (default) +main.opt.force=\ +\ -force Always write output files +main.opt.classpath=\ +\ -classpath Path from which to load classes +main.opt.bootclasspath=\ +\ -bootclasspath Path from which to load bootstrap classes +main.usage.foot=\ + are specified with their fully qualified names\n\ +(for example, java.lang.Object). + # # Version string. # @@ -93,26 +119,35 @@ # These should have better diagnostics. # super.class.not.found=\ - A required super class {0} could not be found. + A required super class {0} could not be found. class.not.found=\ - Class {0} could not be found. + Class {0} could not be found. io.exception=\ - Can''t recover from an I/O error with the following message: \ - {0}. + Can''t recover from an I/O error with the following message: \ + {0}. # # Problems in the guts of javah. # encoding.iso8859_1.not.found=\ - ISO8859_1 converter was not found for output. This is \ + ISO8859_1 converter was not found for output. This is \ probably due to an error in the installation installation. tried.to.define.non.static=\ - Tried to generate #define for non-static field. + Tried to generate #define for non-static field. jni.unknown.type=\ - An unknown type encountered (JNI). + An unknown type encountered (JNI). unknown.array.type=\ - An unknown array type encountered when generating old style headers. + An unknown array type encountered when generating old style headers. unknown.type.for.field=\ - An unknown type encountered when generating old style headers. + An unknown type encountered when generating old style headers. unknown.type.in.method.signature=\ - An unknown type eccountered when generating old style stubs. + An unknown type eccountered when generating old style stubs. + + +err.prefix=Error: +err.cant.use.option.for.fm=Can't use {0} option with given file manager +err.internal.error=Internal error: {0} +err.ioerror=IO error: {0} +err.missing.arg=value missing for {0} +err.no.classes.specified=no classes specified +err.unknown.option=unknown option: {0} diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javah/resources/win32_x86.properties --- a/src/share/classes/com/sun/tools/javah/resources/win32_x86.properties Fri Oct 02 11:26:53 2009 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -# -# Copyright 1998 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. Sun designates this -# particular file as subject to the "Classpath" exception as provided -# by Sun in the LICENSE file that accompanied this code. -# -# 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. -# - -dll.export=__declspec(dllexport) -pack.pragma.start=\#pragma pack(4)\n -pack.pragma.end=\#pragma pack()\n diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/com/sun/tools/javap/DisassemblerTool.java --- a/src/share/classes/com/sun/tools/javap/DisassemblerTool.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/com/sun/tools/javap/DisassemblerTool.java Wed Oct 07 14:14:45 2009 -0700 @@ -42,7 +42,7 @@ * @see DiagnosticListener * @see Diagnostic * @see JavaFileManager - * @since 1.6 + * @since 1.7 * *

This is NOT part of any API supported by Sun Microsystems. If * you write code that depends on this, you do so at your own risk. diff -r d498d6ef9c6c -r 1a66b08deed0 src/share/classes/javax/tools/SimpleJavaFileObject.java --- a/src/share/classes/javax/tools/SimpleJavaFileObject.java Fri Oct 02 11:26:53 2009 -0700 +++ b/src/share/classes/javax/tools/SimpleJavaFileObject.java Wed Oct 07 14:14:45 2009 -0700 @@ -27,7 +27,6 @@ import java.io.*; import java.net.URI; -import java.net.URISyntaxException; import java.nio.CharBuffer; import javax.lang.model.element.Modifier; import javax.lang.model.element.NestingKind; diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javac/4241573/T4241573.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/4241573/T4241573.java Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,225 @@ +/* + * Copyright 2009 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 + * @bug 4241573 + * @summary SourceFile attribute includes full path + */ + +import com.sun.tools.classfile.Attribute; +import com.sun.tools.classfile.ClassFile; +import com.sun.tools.classfile.SourceFile_attribute; +import java.io.*; +import java.util.*; +import java.util.jar.*; + +public class T4241573 { + public static void main(String... args) throws Exception { + new T4241573().run(); + } + + public void run() throws Exception { + // Selection of files to be compiled + File absJar = createJar(new File("abs.jar").getAbsoluteFile(), "j.A"); + File relJar = createJar(new File("rel.jar"), "j.R"); + File absDir = createDir(new File("abs.dir").getAbsoluteFile(), "d.A"); + File relDir = createDir(new File("rel.dir"), "d.R"); + File absTestFile = writeFile(new File("AbsTest.java").getAbsoluteFile(), "class AbsTest { class Inner { } }"); + File relTestFile = writeFile(new File("RelTest.java"), "class RelTest { class Inner { } }"); + File relTest2File = writeFile(new File("p/RelTest2.java"), "package p; class RelTest2 { class Inner { } }"); + // This next class references other classes that will be found on the source path + // and which will therefore need to be compiled as well. + File mainFile = writeFile(new File("Main.java"), + "class Main { j.A ja; j.R jr; d.A da; d.R dr; }" + + ""); + + String sourcePath = createPath(absJar, relJar, absDir, relDir); + File outDir = new File("classes"); + outDir.mkdirs(); + + String[] args = { + "-sourcepath", sourcePath, + "-d", outDir.getPath(), + absTestFile.getPath(), + relTestFile.getPath(), + relTest2File.getPath(), + mainFile.getPath(), + }; + System.err.println("compile: " + Arrays.asList(args)); + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + int rc = com.sun.tools.javac.Main.compile(args, pw); + pw.close(); + if (rc != 0) { + System.err.println(sw.toString()); + throw new Exception("unexpected exit from javac: " + rc); + } + + Set expect = getFiles(outDir, + "d/A.class", "d/A$Inner.class", + "d/R.class", "d/R$Inner.class", + "j/A.class", "j/A$Inner.class", + "j/R.class", "j/R$Inner.class", + "AbsTest.class", "AbsTest$Inner.class", + "RelTest.class", "RelTest$Inner.class", + "p/RelTest2.class", "p/RelTest2$Inner.class", + "Main.class" ); + + Set found = findFiles(outDir); + + if (!found.equals(expect)) { + if (found.containsAll(expect)) + throw new Exception("unexpected files found: " + diff(found, expect)); + else if (expect.containsAll(found)) + throw new Exception("expected files not found: " + diff(expect, found)); + } + + for (File f: found) + verifySourceFileAttribute(f); + + if (errors > 0) + throw new Exception(errors + " errors occurred"); + } + + /** Check the SourceFileAttribute is the simple name of the original source file. */ + void verifySourceFileAttribute(File f) { + System.err.println("verify: " + f); + try { + ClassFile cf = ClassFile.read(f); + SourceFile_attribute sfa = (SourceFile_attribute) cf.getAttribute(Attribute.SourceFile); + String found = sfa.getSourceFile(cf.constant_pool); + String expect = f.getName().replaceAll("([$.].*)?\\.class", ".java"); + if (!expect.equals(found)) { + error("bad value found: " + found + ", expected: " + expect); + } + } catch (Exception e) { + error("error reading " + f +": " + e); + } + } + + /** Create a directory containing one or more files. */ + File createDir(File dir, String... entries) throws Exception { + if (!dir.mkdirs()) + throw new Exception("cannot create directories " + dir); + for (String e: entries) { + writeFile(new File(dir, getPathForEntry(e)), getBodyForEntry(e)); + } + return dir; + } + + /** Create a jar file containing one or more entries. */ + File createJar(File jar, String... entries) throws IOException { + OutputStream out = new FileOutputStream(jar); + try { + JarOutputStream jos = new JarOutputStream(out); + for (String e: entries) { + jos.putNextEntry(new JarEntry(getPathForEntry(e))); + jos.write(getBodyForEntry(e).getBytes()); + } + jos.close(); + } finally { + out.close(); + } + return jar; + } + + /** Return the path for an entry given to createDir or createJar. */ + String getPathForEntry(String e) { + return e.replace(".", File.separator) + ".java"; + } + + /** Return the body text for an entry given to createDir or createJar. */ + String getBodyForEntry(String e) { + int sep = e.lastIndexOf("."); + String pkgName = e.substring(0, sep); + String className = e.substring(sep + 1); + return "package " + pkgName + "; public class " + className + "{ class Inner { } }"; + } + + /** Write a file containing the given string. Parent directories are + * created as needed. */ + File writeFile(File f, String s) throws IOException { + if (f.getParentFile() != null) + f.getParentFile().mkdirs(); + FileWriter out = new FileWriter(f); + try { + out.write(s); + } finally { + out.close(); + } + return f; + } + + /** Create a path value from a list of directories and jar files. */ + String createPath(File... files) { + StringBuilder sb = new StringBuilder(); + for (File f: files) { + if (sb.length() > 0) + sb.append(File.pathSeparatorChar); + sb.append(f.getPath()); + } + return sb.toString(); + } + + /** Create a set of files from a base directory and a set of relative paths. */ + Set getFiles(File dir, String... paths) { + Set files = new LinkedHashSet(); + for (String p: paths) + files.add(new File(dir, p)); + return files; + } + + /** Find all the files in a directory and its subdirectories. */ + Set findFiles(File dir) { + Set files = new LinkedHashSet(); + findFiles(dir, files); + return files; + } + // where + void findFiles(File dir, Set files) { + for (File f: dir.listFiles()) { + if (f.isDirectory()) + findFiles(f, files); + else + files.add(f); + } + } + + /** Return the difference of two sets, a - b. */ + Set diff(Set a, Set b) { + if (b.isEmpty()) + return a; + Set result = new LinkedHashSet(a); + result.removeAll(b); + return result; + } + + /** Report an error. */ + void error(String msg) { + System.err.println(msg); + errors++; + } + + int errors; +} diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javac/6589361/T6589361.java --- a/test/tools/javac/6589361/T6589361.java Fri Oct 02 11:26:53 2009 -0700 +++ b/test/tools/javac/6589361/T6589361.java Wed Oct 07 14:14:45 2009 -0700 @@ -25,7 +25,7 @@ for (JavaFileObject file : files) { // Note: Zip/Jar entry names use '/', not File.separator, but just to be sure, // we normalize the filename as well. - if (file.toString().replace(File.separatorChar, '/').contains("java/lang/Object.class")) { + if (file.getName().replace(File.separatorChar, '/').contains("java/lang/Object.class")) { String str = fm.inferBinaryName(StandardLocation.CLASS_PATH, file); if (!str.equals("java.lang.Object")) { throw new AssertionError("Error in JavacFileManager.inferBinaryName method!"); diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javac/Diagnostics/6769027/T6769027.java --- a/test/tools/javac/Diagnostics/6769027/T6769027.java Fri Oct 02 11:26:53 2009 -0700 +++ b/test/tools/javac/Diagnostics/6769027/T6769027.java Wed Oct 07 14:14:45 2009 -0700 @@ -261,7 +261,7 @@ enum PositionKind { NOPOS(Position.NOPOS, "- ", "error: "), - POS(5, "/Test.java:1:6: ", "myfo:/Test.java:1: "); + POS(5, "Test.java:1:6: ", "/Test.java:1: "); int pos; String rawOutput; diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javac/T6705935.java --- a/test/tools/javac/T6705935.java Fri Oct 02 11:26:53 2009 -0700 +++ b/test/tools/javac/T6705935.java Wed Oct 07 14:14:45 2009 -0700 @@ -48,7 +48,7 @@ "java.lang", Collections.singleton(JavaFileObject.Kind.CLASS), false)) { - String p = ((BaseFileObject)fo).getPath(); + String p = fo.getName(); int bra = p.indexOf("("); int ket = p.indexOf(")"); //System.err.println(bra + "," + ket + "," + p.length()); diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javac/annotations/pos/TrailingComma.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/annotations/pos/TrailingComma.java Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,43 @@ +/* + * Copyright 2009 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 + * @bug 6337964 + * @summary javac incorrectly disallows trailing comma in annotation arrays + * @author darcy + * @compile TrailingComma.java + */ + +import java.lang.annotation.*; + +@interface TestAnnotation { + SuppressWarnings[] value() default {@SuppressWarnings({"",})}; +} + + +@TestAnnotation({@SuppressWarnings(), + @SuppressWarnings({"Beware the ides of March.",}), + @SuppressWarnings({"Look both ways", "Before Crossing",}), }) +public class TrailingComma { +} diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javac/api/6411310/T6411310.java --- a/test/tools/javac/api/6411310/T6411310.java Fri Oct 02 11:26:53 2009 -0700 +++ b/test/tools/javac/api/6411310/T6411310.java Wed Oct 07 14:14:45 2009 -0700 @@ -37,7 +37,7 @@ import static javax.tools.StandardLocation.CLASS_PATH; import static javax.tools.JavaFileObject.Kind.CLASS; -// Limited test while we wait for 6419926 +// Limited test while we wait for 6419926: 6419926 is now closed public class T6411310 extends ToolTester { @@ -45,8 +45,11 @@ JavaFileObject file = fm.getJavaFileForInput(PLATFORM_CLASS_PATH, "java.lang.Object", CLASS); - if (!file.getName().equals("Object.class")) + String fileName = file.getName(); + if (!fileName.matches(".*java/lang/Object.class\\)?")) { + System.err.println(fileName); throw new AssertionError(file); + } } public static void main(String... args) throws IOException { diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javac/api/6411310/Test.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/api/6411310/Test.java Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,254 @@ +/* + * Copyright 2009 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 + * @bug 6410367 6411310 + * @summary FileObject should support user-friendly names via getName() + */ + +import java.io.*; +import java.util.*; +import java.util.jar.*; +import java.util.zip.*; +import javax.tools.*; + +import com.sun.tools.javac.file.JavacFileManager; +import com.sun.tools.javac.util.Context; +import com.sun.tools.javac.util.Options; + +// Test FileObject.getName returned from JavacFileManager and its support classes. + +public class Test { + public static void main(String... args) throws Exception { + new Test().run(); + } + + Set foundClasses = new TreeSet(); + Set foundJars = new TreeSet(); + + void run() throws Exception { + File rt_jar = findRtJar(); + + // names for entries to be created in directories and jar files + String[] entries = { "p/A.java", "p/A.class", "p/resources/A-1.html" }; + + // test various combinations of directories and jar files, intended to + // cover all sources of file objects within JavacFileManager's support classes + + test(createFileManager(), createDir("dir", entries), "p", entries); + test(createFileManager(), createDir("a b/dir", entries), "p", entries); + + for (boolean useJavaUtilZip: new boolean[] { false, true }) { + test(createFileManager(useJavaUtilZip), createJar("jar", entries), "p", entries); + test(createFileManager(useJavaUtilZip), createJar("jar jar", entries), "p", entries); + + for (boolean useSymbolFile: new boolean[] { false, true }) { + test(createFileManager(useJavaUtilZip, useSymbolFile), rt_jar, "java.lang.ref", null); + } + } + + if (errors > 0) + throw new Exception(errors + " errors found"); + + // Verify that we hit all the impl classes we intended + checkCoverage("classes", foundClasses, + "RegularFileObject", "SymbolFileObject", "ZipFileIndexFileObject", "ZipFileObject"); + + // Verify that we hit the jar files we intended, specifically ct.sym as well as rt.jar + checkCoverage("jar files", foundJars, + "ct.sym", "jar", "jar jar", "rt.jar"); + } + + // use a new file manager for each test + void test(StandardJavaFileManager fm, File f, String pkg, String[] entries) throws Exception { + System.err.println("Test " + f); + try { + if (f.isDirectory()) { + for (File dir: new File[] { f, f.getAbsoluteFile() }) { + for (String e: entries) { + JavaFileObject fo = fm.getJavaFileObjects(new File(dir, e)).iterator().next(); + test(fo, dir, e); + } + } + } + + fm.setLocation(StandardLocation.CLASS_PATH, Collections.singleton(f)); + fm.setLocation(StandardLocation.SOURCE_PATH, Collections.singleton(f.getAbsoluteFile())); + for (StandardLocation l: EnumSet.of(StandardLocation.CLASS_PATH, StandardLocation.SOURCE_PATH)) { + for (JavaFileObject fo: fm.list(l, pkg, EnumSet.allOf(JavaFileObject.Kind.class), true)) { + // we could use fm.getLocation but the following guarantees we preserve the original filename + File dir = (l == StandardLocation.CLASS_PATH ? f : f.getAbsoluteFile()); + char sep = (dir.isDirectory() ? File.separatorChar : '/'); + String b = fm.inferBinaryName(l, fo); + String e = fo.getKind().extension; + test(fo, dir, b.replace('.', sep) + e); + } + } + } finally { + fm.close(); + } + } + + void test(JavaFileObject fo, File dir, String p) { + System.err.println("Test: " + fo); + String expect = dir.isDirectory() ? new File(dir, p).getPath() : (dir.getPath() + "(" + p + ")"); + String found = fo.getName(); + // if ct.sym is found, replace it with the equivalent rt.jar + String found2 = found.replaceAll("lib([\\\\/])ct.sym\\(META-INF/sym/rt.jar/", "jre$1lib$1rt.jar("); + if (!expect.equals(found2)) { + System.err.println("expected: " + expect); + System.err.println(" found: " + found); + if (!found.equals(found2)) + System.err.println(" found2: " + found2); + error("Failed: " + fo); + } + + // record the file object class name for coverage checks later + foundClasses.add(fo.getClass().getSimpleName()); + + if (found.contains("(")) { + // record access to the jar file for coverage checks later + foundJars.add(new File(found.substring(0, found.indexOf("("))).getName()); + } + } + + void checkCoverage(String label, Set found, String... expect) throws Exception { + Set e = new TreeSet(Arrays.asList(expect)); + if (!found.equals(e)) { + e.removeAll(found); + throw new Exception("expected " + label + " not used: " + e); + } + } + + JavacFileManager createFileManager() { + return createFileManager(false, false); + } + + JavacFileManager createFileManager(boolean useJavaUtilZip) { + return createFileManager(useJavaUtilZip, false); + } + + JavacFileManager createFileManager(boolean useJavaUtilZip, boolean useSymbolFile) { + // javac should really not be using system properties like this + // -- it should really be using (hidden) options -- but until then + // take care to leave system properties as we find them, so as not + // to adversely affect other tests that might follow. + String prev = System.getProperty("useJavaUtilZip"); + boolean resetProperties = false; + try { + if (useJavaUtilZip) { + System.setProperty("useJavaUtilZip", "true"); + resetProperties = true; + } else if (System.getProperty("useJavaUtilZip") != null) { + System.getProperties().remove("useJavaUtilZip"); + resetProperties = true; + } + + Context c = new Context(); + if (!useSymbolFile) { + Options options = Options.instance(c); + options.put("ignore.symbol.file", "true"); + } + + return new JavacFileManager(c, false, null); + } finally { + if (resetProperties) { + if (prev == null) { + System.getProperties().remove("useJavaUtilZip"); + } else { + System.setProperty("useJavaUtilZip", prev); + } + } + } + } + + File createDir(String name, String... entries) throws Exception { + File dir = new File(name); + if (!dir.mkdirs()) + throw new Exception("cannot create directories " + dir); + for (String e: entries) { + writeFile(new File(dir, e), e); + } + return dir; + } + + File createJar(String name, String... entries) throws IOException { + File jar = new File(name); + OutputStream out = new FileOutputStream(jar); + try { + JarOutputStream jos = new JarOutputStream(out); + for (String e: entries) { + jos.putNextEntry(new ZipEntry(e)); + jos.write(e.getBytes()); + } + jos.close(); + } finally { + out.close(); + } + return jar; + } + + File findRtJar() throws Exception { + File java_home = new File(System.getProperty("java.home")); + if (java_home.getName().equals("jre")) + java_home = java_home.getParentFile(); + File rt_jar = new File(new File(new File(java_home, "jre"), "lib"), "rt.jar"); + if (!rt_jar.exists()) + throw new Exception("can't find rt.jar"); + return rt_jar; + } + + byte[] read(InputStream in) throws IOException { + byte[] data = new byte[1024]; + int offset = 0; + try { + int n; + while ((n = in.read(data, offset, data.length - offset)) != -1) { + offset += n; + if (offset == data.length) + data = Arrays.copyOf(data, 2 * data.length); + } + } finally { + in.close(); + } + return Arrays.copyOf(data, offset); + } + + void writeFile(File f, String s) throws IOException { + f.getParentFile().mkdirs(); + FileWriter out = new FileWriter(f); + try { + out.write(s); + } finally { + out.close(); + } + } + + void error(String msg) { + System.err.println(msg); + errors++; + } + + int errors; +} diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javac/api/6733837/T6733837.java --- a/test/tools/javac/api/6733837/T6733837.java Fri Oct 02 11:26:53 2009 -0700 +++ b/test/tools/javac/api/6733837/T6733837.java Wed Oct 07 14:14:45 2009 -0700 @@ -46,14 +46,10 @@ } public void exec() { - JavaFileObject sfo = new SimpleJavaFileObject(URI.create(""),Kind.SOURCE) { + JavaFileObject sfo = new SimpleJavaFileObject(URI.create("myfo:/Test.java"),Kind.SOURCE) { public CharSequence getCharContent(boolean ignoreEncodingErrors) { return "\tclass ErroneousWithTab"; } - @Override - public String getName() { - return "RELATIVEPATH"; - } }; StringWriter sw = new StringWriter(); PrintWriter out = new PrintWriter(sw); @@ -66,7 +62,7 @@ throw new Error("Compiler threw an exception"); } System.err.println(sw.toString()); - if (sw.toString().contains("RELATIVEPATH")) + if (!sw.toString().contains("/Test.java")) throw new Error("Bad source name in diagnostic"); } } diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javac/processing/model/util/elements/Foo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/processing/model/util/elements/Foo.java Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,29 @@ + +/* + * Copyright 2009 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. + */ + +/** + * Dummy type to compile. + */ +public class Foo { +} \ No newline at end of file diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javac/processing/model/util/elements/TestGetConstantExpression.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/processing/model/util/elements/TestGetConstantExpression.java Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,143 @@ +/* + * Copyright 2009 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 + * @bug 6471577 6517779 + * @summary Test Elements.getConstantExpression + * @author Joseph D. Darcy + * @build TestGetConstantExpression + * @compile -processor TestGetConstantExpression Foo.java + */ + +import java.util.Set; +import javax.annotation.processing.*; +import javax.lang.model.SourceVersion; +import static javax.lang.model.SourceVersion.*; +import javax.lang.model.element.*; +import javax.lang.model.util.*; +import static javax.lang.model.util.ElementFilter.*; +import static javax.tools.Diagnostic.Kind.*; +import static javax.tools.StandardLocation.*; +import java.io.*; + +/** + * Test basic workings of Elements.getConstantExpression. + */ +@SupportedAnnotationTypes("*") +public class TestGetConstantExpression extends AbstractProcessor { + private Elements eltUtils; + private Filer filer; + private int round = 1; + + /** + * Check expected behavior on classes and packages. + */ + public boolean process(Set annotations, + RoundEnvironment roundEnv) { + int errors = 0; + boolean processingOver = roundEnv.processingOver(); + + if (!processingOver && round == 1) { + errors += expectIllegalArgumentException(null); + errors += expectIllegalArgumentException(this); + + // Generate source code with various constant values and + // make sure it compiles. + + try { + PrintWriter pw = new PrintWriter(filer.createSourceFile("ConstantTest").openWriter()); + try { + Boolean[] booleans = {true, false}; + Byte[] bytes = {Byte.MIN_VALUE, -1, 0, 1, Byte.MAX_VALUE}; + Short[] shorts = {Short.MIN_VALUE, -1, 0, 1, Short.MAX_VALUE}; + Integer[] ints = {Integer.MIN_VALUE, -1, 0, 1, Integer.MAX_VALUE}; + Long[] longs = {Long.MIN_VALUE, -1L, 0L,1L, Long.MAX_VALUE}; + Character[] chars = {Character.MIN_VALUE, ' ', '\t', 'a', 'b', 'c', '~', Character.MAX_VALUE}; + Float[] floats = {Float.NaN, Float.NEGATIVE_INFINITY, -1.0f, -0.0f, 0.0f, 1.0f, Float.POSITIVE_INFINITY}; + Double[] doubles = {Double.NaN, Double.NEGATIVE_INFINITY, -1.0, -0.0, 0.0, 1.0, Double.POSITIVE_INFINITY}; + + pw.println("class ConstantTest {"); + pw.println(String.format(" private static boolean[] booleans = {%s};", + printConstants(booleans))); + pw.println(String.format(" private static byte[] bytes = {%s};", + printConstants(bytes))); + pw.println(String.format(" private static short[] shorts = {%s};", + printConstants(shorts))); + pw.println(String.format(" private static int[] ints = {%s};", + printConstants(ints))); + pw.println(String.format(" private static long[] longs = {%s};", + printConstants(longs))); + pw.println(String.format(" private static char[] chars = {%s};", + printConstants(chars))); + pw.println(String.format(" private static float[] floats = {%s};", + printConstants(floats))); + pw.println(String.format(" private static double[] doubles = {%s};", + printConstants(doubles))); + pw.println("}"); + } finally { + pw.close(); + } + } catch(IOException io) { + throw new RuntimeException(io); + } + round++; + } else if (processingOver) { + if (errors > 0) { + throw new RuntimeException(); + } + } + return true; + } + + String printConstants(Object[] constants) { + StringBuilder sb = new StringBuilder(); + + for(Object o : constants) { + sb.append(eltUtils.getConstantExpression(o)); + sb.append(", "); + } + return sb.toString(); + } + + int expectIllegalArgumentException(Object o) { + String s = ""; + try { + s = eltUtils.getConstantExpression(o); + System.err.println("Unexpected string returned: " + s); + return 1; + } catch (IllegalArgumentException iae) { + return 0; + } + } + + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.latest(); + } + + public void init(ProcessingEnvironment processingEnv) { + super.init(processingEnv); + eltUtils = processingEnv.getElementUtils(); + filer = processingEnv.getFiler(); + } +} diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javah/6572945/T6572945.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javah/6572945/T6572945.java Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,239 @@ +/* + * Copyright 2007 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 + * @bug 6572945 + * @summary rewrite javah as an annotation processor, instead of as a doclet + * @build TestClass1 TestClass2 TestClass3 + * @run main T6572945 + */ + +import java.io.*; +import java.util.*; +import com.sun.tools.javah.Main; + +public class T6572945 +{ + static File testSrc = new File(System.getProperty("test.src", ".")); + static File testClasses = new File(System.getProperty("test.classes", ".")); + static boolean isWindows = System.getProperty("os.name").startsWith("Windows"); + + public static void main(String... args) + throws IOException, InterruptedException + { + boolean ok = new T6572945().run(args); + if (!ok) + throw new Error("Test Failed"); + } + + public boolean run(String[] args) + throws IOException, InterruptedException + { + if (args.length == 1) + jdk = new File(args[0]); + + test("-o", "jni.file.1", "-jni", "TestClass1"); + test("-o", "jni.file.2", "-jni", "TestClass1", "TestClass2"); + test("-d", "jni.dir.1", "-jni", "TestClass1", "TestClass2"); + test("-o", "jni.file.3", "-jni", "TestClass3"); + + // The following tests are disabled because llni support has been + // discontinued, and because bugs in old javah means that character + // for character testing against output from old javah does not work. + // In fact, the LLNI impl in new javah is actually better than the + // impl in old javah because of a couple of significant bug fixes. + +// test("-o", "llni.file.1", "-llni", "TestClass1"); +// test("-o", "llni.file.2", "-llni", "TestClass1", "TestClass2"); +// test("-d", "llni.dir.1", "-llni", "TestClass1", "TestClass2"); +// test("-o", "llni.file.3", "-llni", "TestClass3"); + + return (errors == 0); + } + + void test(String... args) + throws IOException, InterruptedException + { + String[] cp_args = new String[args.length + 2]; + cp_args[0] = "-classpath"; + cp_args[1] = testClasses.getPath(); + System.arraycopy(args, 0, cp_args, 2, args.length); + + if (jdk != null) + init(cp_args); + + File out = null; + for (int i = 0; i < args.length; i++) { + if (args[i].equals("-o")) { + out = new File(args[++i]); + break; + } else if (args[i].equals("-d")) { + out = new File(args[++i]); + out.mkdirs(); + break; + } + } + + try { + System.out.println("test: " + Arrays.asList(cp_args)); + +// // Uncomment and use the following lines to execute javah via the +// // command line -- for example, to run old javah and set up the golden files +// List cmd = new ArrayList(); +// File javaHome = new File(System.getProperty("java.home")); +// if (javaHome.getName().equals("jre")) +// javaHome = javaHome.getParentFile(); +// File javah = new File(new File(javaHome, "bin"), "javah"); +// cmd.add(javah.getPath()); +// cmd.addAll(Arrays.asList(cp_args)); +// ProcessBuilder pb = new ProcessBuilder(cmd); +// pb.redirectErrorStream(true); +// pb.start(); +// Process p = pb.start(); +// String line; +// BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); +// while ((line = in.readLine()) != null) +// System.err.println(line); +// in.close(); +// int rc = p.waitFor(); + + // Use new javah + PrintWriter err = new PrintWriter(System.err, true); + int rc = Main.run(cp_args, err); + + if (rc != 0) { + error("javah failed: rc=" + rc); + return; + } + + // The golden files use the LL suffix for long constants, which + // is used on Linux and Solaris. On Windows, the suffix is i64, + // so compare will update the golden files on the fly before the + // final comparison. + compare(new File(new File(testSrc, "gold"), out.getName()), out); + } catch (Throwable t) { + t.printStackTrace(); + error("javah threw exception"); + } + } + + void init(String[] args) throws IOException, InterruptedException { + String[] cmdArgs = new String[args.length + 1]; + cmdArgs[0] = new File(new File(jdk, "bin"), "javah").getPath(); + System.arraycopy(args, 0, cmdArgs, 1, args.length); + + System.out.println("init: " + Arrays.asList(cmdArgs)); + + ProcessBuilder pb = new ProcessBuilder(cmdArgs); + pb.directory(new File(testSrc, "gold")); + pb.redirectErrorStream(true); + Process p = pb.start(); + BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); + String line; + while ((line = in.readLine()) != null) + System.out.println("javah: " + line); + int rc = p.waitFor(); + if (rc != 0) + error("javah: exit code " + rc); + } + + /** Compare two directories. + * @param f1 The golden directory + * @param f2 The directory to be compared + */ + void compare(File f1, File f2) { + compare(f1, f2, null); + } + + /** Compare two files or directories + * @param f1 The golden directory + * @param f2 The directory to be compared + * @param p An optional path identifying a file within the two directories + */ + void compare(File f1, File f2, String p) { + File f1p = (p == null ? f1 : new File(f1, p)); + File f2p = (p == null ? f2 : new File(f2, p)); + System.out.println("compare " + f1p + " " + f2p); + if (f1p.isDirectory() && f2p.isDirectory()) { + Set children = new HashSet(); + children.addAll(Arrays.asList(f1p.list())); + children.addAll(Arrays.asList(f2p.list())); + for (String c: children) { + compare(f1, f2, new File(p, c).getPath()); // null-safe for p + } + } + else if (f1p.isFile() && f2p.isFile()) { + String s1 = read(f1p); + if (isWindows) { + // f1/s1 is the golden file + // on Windows, long constants use the i64 suffix, not LL + s1 = s1.replaceAll("( [0-9]+)LL\n", "$1i64\n"); + } + String s2 = read(f2p); + if (!s1.equals(s2)) { + System.out.println("File: " + f1p + "\n" + s1); + System.out.println("File: " + f2p + "\n" + s2); + error("Files differ: " + f1p + " " + f2p); + } + } + else if (f1p.exists() && !f2p.exists()) + error("Only in " + f1 + ": " + p); + else if (f2p.exists() && !f1p.exists()) + error("Only in " + f2 + ": " + p); + else + error("Files differ: " + f1p + " " + f2p); + } + + private String read(File f) { + try { + BufferedReader in = new BufferedReader(new FileReader(f)); + try { + StringBuilder sb = new StringBuilder((int) f.length()); + String line; + while ((line = in.readLine()) != null) { + sb.append(line); + sb.append("\n"); + } + return sb.toString(); + } finally { + try { + in.close(); + } catch (IOException e) { + } + } + } catch (IOException e) { + error("error reading " + f + ": " + e); + return ""; + } + } + + + private void error(String msg) { + System.out.println(msg); + errors++; + } + + private int errors; + private File jdk; +} diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javah/6572945/TestClass1.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javah/6572945/TestClass1.java Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,475 @@ +/* + * Copyright 2007 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. + */ + +import java.util.List; + +public class TestClass1 { + // simple types + byte b; + short s; + int i; + long l; + float f; + double d; + Object o; + String t; + List g; + + // constants + static final byte bc = 0; + static final short sc = 0; + static final int ic = 0; + static final long lc = 0; + static final float fc = 0; + static final double dc = 0; + static final Object oc = null; + static final String tc = ""; + static final List gc = null; + + // simple arrays + byte[] ba; + short[] sa; // not handled corrected by javah v6 + int[] ia; + long[] la; + float[] fa; + double[] da; + Object[] oa; + String[] ta; + List[] ga; + + // multidimensional arrays + byte[][] baa; + short[][] saa; + int[][] iaa; + long[][] laa; + float[][] faa; + double[][] daa; + Object[][] oaa; + String[][] taa; + List[] gaa; + + // simple Java methods + byte bm() { return 0; } + short sm() { return 0; } + int im() { return 0; } + long lm() { return 0; } + float fm() { return 0; } + double dm() { return 0; } + Object om() { return null; } + String tm() { return ""; } + List gm() { return null; } + void vm() { } + byte[] bam() { return null; } + short[] sam() { return null; } + int[] iam() { return null; } + long[] lam() { return null; } + float[] fam() { return null; } + double[] dam() { return null; } + Object[] oam() { return null; } + String[] tam() { return null; } + List[] gam() { return null; } + byte[][] baam() { return null; } + short[][] saam() { return null; } + int[][] iaam() { return null; } + long[][] laam() { return null; } + float[][] faam() { return null; } + double[][] daam() { return null; } + Object[][] oaam() { return null; } + String[][] taam() { return null; } + List[] gaam() { return null; } + + // simple native methods + native byte bmn(); + native short smn(); + native int imn(); + native long lmn(); + native float fmn(); + native double dmn(); + native Object omn(); + native String tmn(); + native List gmn(); + native void vmn(); + native byte[] bamn(); + native short[] samn(); + native int[] iamn(); + native long[] lamn(); + native float[] famn(); + native double[] damn(); + native Object[] oamn(); + native String[] tamn(); + native List[] gamn(); + native byte[][] baamn(); + native short[][] saamn(); + native int[][] iaamn(); + native long[][] laamn(); + native float[][] faamn(); + native double[][] daamn(); + native Object[][] oaamn(); + native String[][] taamn(); + native List[] gaamn(); + + // overloaded Java methods + byte bm1() { return 0; } + short sm1() { return 0; } + int im1() { return 0; } + long lm1() { return 0; } + float fm1() { return 0; } + double dm1() { return 0; } + Object om1() { return null; } + String tm1() { return ""; } + List gm1() { return null; } + void vm1() { } + + byte bm2(int i) { return 0; } + short sm2(int i) { return 0; } + int im2(int i) { return 0; } + long lm2(int i) { return 0; } + float fm2(int i) { return 0; } + double dm2(int i) { return 0; } + Object om2(int i) { return null; } + String tm2(int i) { return ""; } + List gm2(int i) { return null; } + void vm2(int i) { } + + // overloaded native methods + native byte bmn1(); + native short smn1(); + native int imn1(); + native long lmn1(); + native float fmn1(); + native double dmn1(); + native Object omn1(); + native String tmn1(); + native List gmn1(); + native void vmn1(); + + native byte bmn2(int i); + native short smn2(int i); + native int imn2(int i); + native long lmn2(int i); + native float fmn2(int i); + native double dmn2(int i); + native Object omn2(int i); + native String tmn2(int i); + native List gmn2(int i); + native void vmn2(int i); + + // arg types for Java methods + void mb(byte b) { } + void ms(short s) { } + void mi(int i) { } + void ml(long l) { } + void mf(float f) { } + void md(double d) { } + void mo(Object o) { } + void mt(String t) { } + void mg(List g) { } + + // arg types for native methods + native void mbn(byte b); + native void msn(short s); + native void min(int i); + native void mln(long l); + native void mfn(float f); + native void mdn(double d); + native void mon(Object o); + native void mtn(String t); + native void mgn(List g); + + static class Inner1 { + // simple types + byte b; + short s; + int i; + long l; + float f; + double d; + Object o; + String t; + List g; + + // constants + static final byte bc = 0; + static final short sc = 0; + static final int ic = 0; + static final long lc = 0; + static final float fc = 0; + static final double dc = 0; + static final Object oc = null; + static final String tc = ""; + static final List gc = null; + + // simple arrays + byte[] ba; + // short[] sa; // not handled corrected by javah v6 + int[] ia; + long[] la; + float[] fa; + double[] da; + Object[] oa; + String[] ta; + List[] ga; + + // multidimensional arrays + byte[][] baa; + short[][] saa; + int[][] iaa; + long[][] laa; + float[][] faa; + double[][] daa; + Object[][] oaa; + String[][] taa; + List[] gaa; + + // simple Java methods + byte bm() { return 0; } + short sm() { return 0; } + int im() { return 0; } + long lm() { return 0; } + float fm() { return 0; } + double dm() { return 0; } + Object om() { return null; } + String tm() { return ""; } + List gm() { return null; } + void vm() { } + + // simple native methods + native byte bmn(); + native short smn(); + native int imn(); + native long lmn(); + native float fmn(); + native double dmn(); + native Object omn(); + native String tmn(); + native List gmn(); + native void vmn(); + + // overloaded Java methods + byte bm1() { return 0; } + short sm1() { return 0; } + int im1() { return 0; } + long lm1() { return 0; } + float fm1() { return 0; } + double dm1() { return 0; } + Object om1() { return null; } + String tm1() { return ""; } + List gm1() { return null; } + void vm1() { } + + byte bm2(int i) { return 0; } + short sm2(int i) { return 0; } + int im2(int i) { return 0; } + long lm2(int i) { return 0; } + float fm2(int i) { return 0; } + double dm2(int i) { return 0; } + Object om2(int i) { return null; } + String tm2(int i) { return ""; } + List gm2(int i) { return null; } + void vm2(int i) { } + + // overloaded native methods + native byte bmn1(); + native short smn1(); + native int imn1(); + native long lmn1(); + native float fmn1(); + native double dmn1(); + native Object omn1(); + native String tmn1(); + native List gmn1(); + native void vmn1(); + + native byte bmn2(int i); + native short smn2(int i); + native int imn2(int i); + native long lmn2(int i); + native float fmn2(int i); + native double dmn2(int i); + native Object omn2(int i); + native String tmn2(int i); + native List gmn2(int i); + native void vmn2(int i); + + // arg types for Java methods + void mb(byte b) { } + void ms(short s) { } + void mi(int i) { } + void ml(long l) { } + void mf(float f) { } + void md(double d) { } + void mo(Object o) { } + void mt(String t) { } + void mg(List g) { } + + // arg types for native methods + native void mbn(byte b); + native void msn(short s); + native void min(int i); + native void mln(long l); + native void mfn(float f); + native void mdn(double d); + native void mon(Object o); + native void mtn(String t); + native void mgn(List g); + } + + class Inner2 { + // simple types + byte b; + short s; + int i; + long l; + float f; + double d; + Object o; + String t; + List g; + + // constants + static final byte bc = 0; + static final short sc = 0; + static final int ic = 0; + static final long lc = 0; + static final float fc = 0; + static final double dc = 0; + //static final Object oc = null; + static final String tc = ""; + //static final List gc = null; + + // simple arrays + byte[] ba; + // short[] sa; // not handled corrected by javah v6 + int[] ia; + long[] la; + float[] fa; + double[] da; + Object[] oa; + String[] ta; + List[] ga; + + // multidimensional arrays + byte[][] baa; + short[][] saa; + int[][] iaa; + long[][] laa; + float[][] faa; + double[][] daa; + Object[][] oaa; + String[][] taa; + List[] gaa; + + // simple Java methods + byte bm() { return 0; } + short sm() { return 0; } + int im() { return 0; } + long lm() { return 0; } + float fm() { return 0; } + double dm() { return 0; } + Object om() { return null; } + String tm() { return ""; } + List gm() { return null; } + void vm() { } + + // simple native methods + native byte bmn(); + native short smn(); + native int imn(); + native long lmn(); + native float fmn(); + native double dmn(); + native Object omn(); + native String tmn(); + native List gmn(); + native void vmn(); + + // overloaded Java methods + byte bm1() { return 0; } + short sm1() { return 0; } + int im1() { return 0; } + long lm1() { return 0; } + float fm1() { return 0; } + double dm1() { return 0; } + Object om1() { return null; } + String tm1() { return ""; } + List gm1() { return null; } + void vm1() { } + + byte bm2(int i) { return 0; } + short sm2(int i) { return 0; } + int im2(int i) { return 0; } + long lm2(int i) { return 0; } + float fm2(int i) { return 0; } + double dm2(int i) { return 0; } + Object om2(int i) { return null; } + String tm2(int i) { return ""; } + List gm2(int i) { return null; } + void vm2(int i) { } + + // overloaded native methods + native byte bmn1(); + native short smn1(); + native int imn1(); + native long lmn1(); + native float fmn1(); + native double dmn1(); + native Object omn1(); + native String tmn1(); + native List gmn1(); + native void vmn1(); + + native byte bmn2(int i); + native short smn2(int i); + native int imn2(int i); + native long lmn2(int i); + native float fmn2(int i); + native double dmn2(int i); + native Object omn2(int i); + native String tmn2(int i); + native List gmn2(int i); + native void vmn2(int i); + + // arg types for Java methods + void mb(byte b) { } + void ms(short s) { } + void mi(int i) { } + void ml(long l) { } + void mf(float f) { } + void md(double d) { } + void mo(Object o) { } + void mt(String t) { } + void mg(List g) { } + + // arg types for native methods + native void mbn(byte b); + native void msn(short s); + native void min(int i); + native void mln(long l); + native void mfn(float f); + native void mdn(double d); + native void mon(Object o); + native void mtn(String t); + native void mgn(List g); + } + +} diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javah/6572945/TestClass2.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javah/6572945/TestClass2.java Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,33 @@ +/* + * Copyright 2007 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. + */ + +public class TestClass2 { + byte b; + short s; + int i; + long l; + float f; + double d; + Object o; + String t; +} diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javah/6572945/TestClass3.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javah/6572945/TestClass3.java Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,51 @@ +/* + * Copyright 2007 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. + */ + +public class TestClass3 { + public int tc3; + + public class Inner1 { + public int tc3i1; + + public class Inner1A { + public int tc3i1i1a; + } + + public class Inner1B { + public int tc3i1i1b; + } + } + + public class Inner2 { + public int tc321; + + public class Inner2A { + public int tc3i2i2a; + } + + public class Inner2B { + public int tc3i2i2b; + } + } +} + diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javah/6572945/gold/jni.dir.1/TestClass1.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javah/6572945/gold/jni.dir.1/TestClass1.h Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,481 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class TestClass1 */ + +#ifndef _Included_TestClass1 +#define _Included_TestClass1 +#ifdef __cplusplus +extern "C" { +#endif +#undef TestClass1_bc +#define TestClass1_bc 0L +#undef TestClass1_sc +#define TestClass1_sc 0L +#undef TestClass1_ic +#define TestClass1_ic 0L +#undef TestClass1_lc +#define TestClass1_lc 0LL +#undef TestClass1_fc +#define TestClass1_fc 0.0f +#undef TestClass1_dc +#define TestClass1_dc 0.0 +/* + * Class: TestClass1 + * Method: bmn + * Signature: ()B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_bmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: smn + * Signature: ()S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_smn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: imn + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_TestClass1_imn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: lmn + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_lmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: fmn + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_fmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: dmn + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_dmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: omn + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_omn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: tmn + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_tmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: gmn + * Signature: ()Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_gmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: vmn + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_TestClass1_vmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: bamn + * Signature: ()[B + */ +JNIEXPORT jbyteArray JNICALL Java_TestClass1_bamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: samn + * Signature: ()[S + */ +JNIEXPORT jshortArray JNICALL Java_TestClass1_samn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: iamn + * Signature: ()[I + */ +JNIEXPORT jintArray JNICALL Java_TestClass1_iamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: lamn + * Signature: ()[J + */ +JNIEXPORT jlongArray JNICALL Java_TestClass1_lamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: famn + * Signature: ()[F + */ +JNIEXPORT jfloatArray JNICALL Java_TestClass1_famn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: damn + * Signature: ()[D + */ +JNIEXPORT jdoubleArray JNICALL Java_TestClass1_damn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: oamn + * Signature: ()[Ljava/lang/Object; + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_oamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: tamn + * Signature: ()[Ljava/lang/String; + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_tamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: gamn + * Signature: ()[Ljava/util/List; + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_gamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: baamn + * Signature: ()[[B + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_baamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: saamn + * Signature: ()[[S + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_saamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: iaamn + * Signature: ()[[I + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_iaamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: laamn + * Signature: ()[[J + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_laamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: faamn + * Signature: ()[[F + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_faamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: daamn + * Signature: ()[[D + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_daamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: oaamn + * Signature: ()[[Ljava/lang/Object; + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_oaamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: taamn + * Signature: ()[[Ljava/lang/String; + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_taamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: gaamn + * Signature: ()[Ljava/util/List; + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_gaamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: bmn1 + * Signature: ()B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_bmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: smn1 + * Signature: ()S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_smn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: imn1 + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_TestClass1_imn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: lmn1 + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_lmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: fmn1 + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_fmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: dmn1 + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_dmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: omn1 + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_omn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: tmn1 + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_tmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: gmn1 + * Signature: ()Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_gmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: vmn1 + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_TestClass1_vmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: bmn2 + * Signature: (I)B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_bmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: smn2 + * Signature: (I)S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_smn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: imn2 + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_TestClass1_imn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: lmn2 + * Signature: (I)J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_lmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: fmn2 + * Signature: (I)F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_fmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: dmn2 + * Signature: (I)D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_dmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: omn2 + * Signature: (I)Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_omn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: tmn2 + * Signature: (I)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_tmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: gmn2 + * Signature: (I)Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_gmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: vmn2 + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_TestClass1_vmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: mbn + * Signature: (B)V + */ +JNIEXPORT void JNICALL Java_TestClass1_mbn + (JNIEnv *, jobject, jbyte); + +/* + * Class: TestClass1 + * Method: msn + * Signature: (S)V + */ +JNIEXPORT void JNICALL Java_TestClass1_msn + (JNIEnv *, jobject, jshort); + +/* + * Class: TestClass1 + * Method: min + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_TestClass1_min + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: mln + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_TestClass1_mln + (JNIEnv *, jobject, jlong); + +/* + * Class: TestClass1 + * Method: mfn + * Signature: (F)V + */ +JNIEXPORT void JNICALL Java_TestClass1_mfn + (JNIEnv *, jobject, jfloat); + +/* + * Class: TestClass1 + * Method: mdn + * Signature: (D)V + */ +JNIEXPORT void JNICALL Java_TestClass1_mdn + (JNIEnv *, jobject, jdouble); + +/* + * Class: TestClass1 + * Method: mon + * Signature: (Ljava/lang/Object;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_mon + (JNIEnv *, jobject, jobject); + +/* + * Class: TestClass1 + * Method: mtn + * Signature: (Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_mtn + (JNIEnv *, jobject, jstring); + +/* + * Class: TestClass1 + * Method: mgn + * Signature: (Ljava/util/List;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_mgn + (JNIEnv *, jobject, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javah/6572945/gold/jni.dir.1/TestClass1_Inner1.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javah/6572945/gold/jni.dir.1/TestClass1_Inner1.h Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,337 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class TestClass1_Inner1 */ + +#ifndef _Included_TestClass1_Inner1 +#define _Included_TestClass1_Inner1 +#ifdef __cplusplus +extern "C" { +#endif +#undef TestClass1_Inner1_bc +#define TestClass1_Inner1_bc 0L +#undef TestClass1_Inner1_sc +#define TestClass1_Inner1_sc 0L +#undef TestClass1_Inner1_ic +#define TestClass1_Inner1_ic 0L +#undef TestClass1_Inner1_lc +#define TestClass1_Inner1_lc 0LL +#undef TestClass1_Inner1_fc +#define TestClass1_Inner1_fc 0.0f +#undef TestClass1_Inner1_dc +#define TestClass1_Inner1_dc 0.0 +/* + * Class: TestClass1_Inner1 + * Method: bmn + * Signature: ()B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_00024Inner1_bmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: smn + * Signature: ()S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_00024Inner1_smn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: imn + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_TestClass1_00024Inner1_imn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: lmn + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_00024Inner1_lmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: fmn + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_00024Inner1_fmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: dmn + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_00024Inner1_dmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: omn + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner1_omn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: tmn + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_00024Inner1_tmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: gmn + * Signature: ()Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner1_gmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: vmn + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_vmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: bmn1 + * Signature: ()B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_00024Inner1_bmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: smn1 + * Signature: ()S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_00024Inner1_smn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: imn1 + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_TestClass1_00024Inner1_imn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: lmn1 + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_00024Inner1_lmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: fmn1 + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_00024Inner1_fmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: dmn1 + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_00024Inner1_dmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: omn1 + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner1_omn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: tmn1 + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_00024Inner1_tmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: gmn1 + * Signature: ()Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner1_gmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: vmn1 + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_vmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: bmn2 + * Signature: (I)B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_00024Inner1_bmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: smn2 + * Signature: (I)S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_00024Inner1_smn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: imn2 + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_TestClass1_00024Inner1_imn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: lmn2 + * Signature: (I)J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_00024Inner1_lmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: fmn2 + * Signature: (I)F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_00024Inner1_fmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: dmn2 + * Signature: (I)D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_00024Inner1_dmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: omn2 + * Signature: (I)Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner1_omn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: tmn2 + * Signature: (I)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_00024Inner1_tmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: gmn2 + * Signature: (I)Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner1_gmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: vmn2 + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_vmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: mbn + * Signature: (B)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_mbn + (JNIEnv *, jobject, jbyte); + +/* + * Class: TestClass1_Inner1 + * Method: msn + * Signature: (S)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_msn + (JNIEnv *, jobject, jshort); + +/* + * Class: TestClass1_Inner1 + * Method: min + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_min + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: mln + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_mln + (JNIEnv *, jobject, jlong); + +/* + * Class: TestClass1_Inner1 + * Method: mfn + * Signature: (F)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_mfn + (JNIEnv *, jobject, jfloat); + +/* + * Class: TestClass1_Inner1 + * Method: mdn + * Signature: (D)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_mdn + (JNIEnv *, jobject, jdouble); + +/* + * Class: TestClass1_Inner1 + * Method: mon + * Signature: (Ljava/lang/Object;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_mon + (JNIEnv *, jobject, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: mtn + * Signature: (Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_mtn + (JNIEnv *, jobject, jstring); + +/* + * Class: TestClass1_Inner1 + * Method: mgn + * Signature: (Ljava/util/List;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_mgn + (JNIEnv *, jobject, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javah/6572945/gold/jni.dir.1/TestClass1_Inner2.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javah/6572945/gold/jni.dir.1/TestClass1_Inner2.h Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,337 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class TestClass1_Inner2 */ + +#ifndef _Included_TestClass1_Inner2 +#define _Included_TestClass1_Inner2 +#ifdef __cplusplus +extern "C" { +#endif +#undef TestClass1_Inner2_bc +#define TestClass1_Inner2_bc 0L +#undef TestClass1_Inner2_sc +#define TestClass1_Inner2_sc 0L +#undef TestClass1_Inner2_ic +#define TestClass1_Inner2_ic 0L +#undef TestClass1_Inner2_lc +#define TestClass1_Inner2_lc 0LL +#undef TestClass1_Inner2_fc +#define TestClass1_Inner2_fc 0.0f +#undef TestClass1_Inner2_dc +#define TestClass1_Inner2_dc 0.0 +/* + * Class: TestClass1_Inner2 + * Method: bmn + * Signature: ()B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_00024Inner2_bmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: smn + * Signature: ()S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_00024Inner2_smn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: imn + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_TestClass1_00024Inner2_imn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: lmn + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_00024Inner2_lmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: fmn + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_00024Inner2_fmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: dmn + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_00024Inner2_dmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: omn + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner2_omn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: tmn + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_00024Inner2_tmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: gmn + * Signature: ()Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner2_gmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: vmn + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_vmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: bmn1 + * Signature: ()B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_00024Inner2_bmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: smn1 + * Signature: ()S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_00024Inner2_smn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: imn1 + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_TestClass1_00024Inner2_imn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: lmn1 + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_00024Inner2_lmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: fmn1 + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_00024Inner2_fmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: dmn1 + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_00024Inner2_dmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: omn1 + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner2_omn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: tmn1 + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_00024Inner2_tmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: gmn1 + * Signature: ()Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner2_gmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: vmn1 + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_vmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: bmn2 + * Signature: (I)B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_00024Inner2_bmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: smn2 + * Signature: (I)S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_00024Inner2_smn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: imn2 + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_TestClass1_00024Inner2_imn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: lmn2 + * Signature: (I)J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_00024Inner2_lmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: fmn2 + * Signature: (I)F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_00024Inner2_fmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: dmn2 + * Signature: (I)D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_00024Inner2_dmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: omn2 + * Signature: (I)Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner2_omn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: tmn2 + * Signature: (I)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_00024Inner2_tmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: gmn2 + * Signature: (I)Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner2_gmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: vmn2 + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_vmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: mbn + * Signature: (B)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_mbn + (JNIEnv *, jobject, jbyte); + +/* + * Class: TestClass1_Inner2 + * Method: msn + * Signature: (S)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_msn + (JNIEnv *, jobject, jshort); + +/* + * Class: TestClass1_Inner2 + * Method: min + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_min + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: mln + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_mln + (JNIEnv *, jobject, jlong); + +/* + * Class: TestClass1_Inner2 + * Method: mfn + * Signature: (F)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_mfn + (JNIEnv *, jobject, jfloat); + +/* + * Class: TestClass1_Inner2 + * Method: mdn + * Signature: (D)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_mdn + (JNIEnv *, jobject, jdouble); + +/* + * Class: TestClass1_Inner2 + * Method: mon + * Signature: (Ljava/lang/Object;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_mon + (JNIEnv *, jobject, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: mtn + * Signature: (Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_mtn + (JNIEnv *, jobject, jstring); + +/* + * Class: TestClass1_Inner2 + * Method: mgn + * Signature: (Ljava/util/List;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_mgn + (JNIEnv *, jobject, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javah/6572945/gold/jni.dir.1/TestClass2.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javah/6572945/gold/jni.dir.1/TestClass2.h Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,13 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class TestClass2 */ + +#ifndef _Included_TestClass2 +#define _Included_TestClass2 +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javah/6572945/gold/jni.file.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javah/6572945/gold/jni.file.1 Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,1151 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class TestClass1 */ + +#ifndef _Included_TestClass1 +#define _Included_TestClass1 +#ifdef __cplusplus +extern "C" { +#endif +#undef TestClass1_bc +#define TestClass1_bc 0L +#undef TestClass1_sc +#define TestClass1_sc 0L +#undef TestClass1_ic +#define TestClass1_ic 0L +#undef TestClass1_lc +#define TestClass1_lc 0LL +#undef TestClass1_fc +#define TestClass1_fc 0.0f +#undef TestClass1_dc +#define TestClass1_dc 0.0 +/* + * Class: TestClass1 + * Method: bmn + * Signature: ()B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_bmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: smn + * Signature: ()S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_smn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: imn + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_TestClass1_imn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: lmn + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_lmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: fmn + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_fmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: dmn + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_dmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: omn + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_omn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: tmn + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_tmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: gmn + * Signature: ()Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_gmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: vmn + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_TestClass1_vmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: bamn + * Signature: ()[B + */ +JNIEXPORT jbyteArray JNICALL Java_TestClass1_bamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: samn + * Signature: ()[S + */ +JNIEXPORT jshortArray JNICALL Java_TestClass1_samn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: iamn + * Signature: ()[I + */ +JNIEXPORT jintArray JNICALL Java_TestClass1_iamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: lamn + * Signature: ()[J + */ +JNIEXPORT jlongArray JNICALL Java_TestClass1_lamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: famn + * Signature: ()[F + */ +JNIEXPORT jfloatArray JNICALL Java_TestClass1_famn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: damn + * Signature: ()[D + */ +JNIEXPORT jdoubleArray JNICALL Java_TestClass1_damn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: oamn + * Signature: ()[Ljava/lang/Object; + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_oamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: tamn + * Signature: ()[Ljava/lang/String; + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_tamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: gamn + * Signature: ()[Ljava/util/List; + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_gamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: baamn + * Signature: ()[[B + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_baamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: saamn + * Signature: ()[[S + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_saamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: iaamn + * Signature: ()[[I + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_iaamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: laamn + * Signature: ()[[J + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_laamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: faamn + * Signature: ()[[F + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_faamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: daamn + * Signature: ()[[D + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_daamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: oaamn + * Signature: ()[[Ljava/lang/Object; + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_oaamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: taamn + * Signature: ()[[Ljava/lang/String; + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_taamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: gaamn + * Signature: ()[Ljava/util/List; + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_gaamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: bmn1 + * Signature: ()B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_bmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: smn1 + * Signature: ()S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_smn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: imn1 + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_TestClass1_imn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: lmn1 + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_lmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: fmn1 + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_fmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: dmn1 + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_dmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: omn1 + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_omn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: tmn1 + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_tmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: gmn1 + * Signature: ()Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_gmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: vmn1 + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_TestClass1_vmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: bmn2 + * Signature: (I)B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_bmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: smn2 + * Signature: (I)S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_smn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: imn2 + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_TestClass1_imn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: lmn2 + * Signature: (I)J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_lmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: fmn2 + * Signature: (I)F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_fmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: dmn2 + * Signature: (I)D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_dmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: omn2 + * Signature: (I)Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_omn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: tmn2 + * Signature: (I)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_tmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: gmn2 + * Signature: (I)Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_gmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: vmn2 + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_TestClass1_vmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: mbn + * Signature: (B)V + */ +JNIEXPORT void JNICALL Java_TestClass1_mbn + (JNIEnv *, jobject, jbyte); + +/* + * Class: TestClass1 + * Method: msn + * Signature: (S)V + */ +JNIEXPORT void JNICALL Java_TestClass1_msn + (JNIEnv *, jobject, jshort); + +/* + * Class: TestClass1 + * Method: min + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_TestClass1_min + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: mln + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_TestClass1_mln + (JNIEnv *, jobject, jlong); + +/* + * Class: TestClass1 + * Method: mfn + * Signature: (F)V + */ +JNIEXPORT void JNICALL Java_TestClass1_mfn + (JNIEnv *, jobject, jfloat); + +/* + * Class: TestClass1 + * Method: mdn + * Signature: (D)V + */ +JNIEXPORT void JNICALL Java_TestClass1_mdn + (JNIEnv *, jobject, jdouble); + +/* + * Class: TestClass1 + * Method: mon + * Signature: (Ljava/lang/Object;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_mon + (JNIEnv *, jobject, jobject); + +/* + * Class: TestClass1 + * Method: mtn + * Signature: (Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_mtn + (JNIEnv *, jobject, jstring); + +/* + * Class: TestClass1 + * Method: mgn + * Signature: (Ljava/util/List;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_mgn + (JNIEnv *, jobject, jobject); + +#ifdef __cplusplus +} +#endif +#endif +/* Header for class TestClass1_Inner2 */ + +#ifndef _Included_TestClass1_Inner2 +#define _Included_TestClass1_Inner2 +#ifdef __cplusplus +extern "C" { +#endif +#undef TestClass1_Inner2_bc +#define TestClass1_Inner2_bc 0L +#undef TestClass1_Inner2_sc +#define TestClass1_Inner2_sc 0L +#undef TestClass1_Inner2_ic +#define TestClass1_Inner2_ic 0L +#undef TestClass1_Inner2_lc +#define TestClass1_Inner2_lc 0LL +#undef TestClass1_Inner2_fc +#define TestClass1_Inner2_fc 0.0f +#undef TestClass1_Inner2_dc +#define TestClass1_Inner2_dc 0.0 +/* + * Class: TestClass1_Inner2 + * Method: bmn + * Signature: ()B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_00024Inner2_bmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: smn + * Signature: ()S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_00024Inner2_smn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: imn + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_TestClass1_00024Inner2_imn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: lmn + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_00024Inner2_lmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: fmn + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_00024Inner2_fmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: dmn + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_00024Inner2_dmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: omn + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner2_omn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: tmn + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_00024Inner2_tmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: gmn + * Signature: ()Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner2_gmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: vmn + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_vmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: bmn1 + * Signature: ()B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_00024Inner2_bmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: smn1 + * Signature: ()S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_00024Inner2_smn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: imn1 + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_TestClass1_00024Inner2_imn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: lmn1 + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_00024Inner2_lmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: fmn1 + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_00024Inner2_fmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: dmn1 + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_00024Inner2_dmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: omn1 + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner2_omn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: tmn1 + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_00024Inner2_tmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: gmn1 + * Signature: ()Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner2_gmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: vmn1 + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_vmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: bmn2 + * Signature: (I)B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_00024Inner2_bmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: smn2 + * Signature: (I)S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_00024Inner2_smn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: imn2 + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_TestClass1_00024Inner2_imn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: lmn2 + * Signature: (I)J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_00024Inner2_lmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: fmn2 + * Signature: (I)F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_00024Inner2_fmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: dmn2 + * Signature: (I)D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_00024Inner2_dmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: omn2 + * Signature: (I)Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner2_omn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: tmn2 + * Signature: (I)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_00024Inner2_tmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: gmn2 + * Signature: (I)Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner2_gmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: vmn2 + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_vmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: mbn + * Signature: (B)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_mbn + (JNIEnv *, jobject, jbyte); + +/* + * Class: TestClass1_Inner2 + * Method: msn + * Signature: (S)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_msn + (JNIEnv *, jobject, jshort); + +/* + * Class: TestClass1_Inner2 + * Method: min + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_min + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: mln + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_mln + (JNIEnv *, jobject, jlong); + +/* + * Class: TestClass1_Inner2 + * Method: mfn + * Signature: (F)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_mfn + (JNIEnv *, jobject, jfloat); + +/* + * Class: TestClass1_Inner2 + * Method: mdn + * Signature: (D)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_mdn + (JNIEnv *, jobject, jdouble); + +/* + * Class: TestClass1_Inner2 + * Method: mon + * Signature: (Ljava/lang/Object;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_mon + (JNIEnv *, jobject, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: mtn + * Signature: (Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_mtn + (JNIEnv *, jobject, jstring); + +/* + * Class: TestClass1_Inner2 + * Method: mgn + * Signature: (Ljava/util/List;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_mgn + (JNIEnv *, jobject, jobject); + +#ifdef __cplusplus +} +#endif +#endif +/* Header for class TestClass1_Inner1 */ + +#ifndef _Included_TestClass1_Inner1 +#define _Included_TestClass1_Inner1 +#ifdef __cplusplus +extern "C" { +#endif +#undef TestClass1_Inner1_bc +#define TestClass1_Inner1_bc 0L +#undef TestClass1_Inner1_sc +#define TestClass1_Inner1_sc 0L +#undef TestClass1_Inner1_ic +#define TestClass1_Inner1_ic 0L +#undef TestClass1_Inner1_lc +#define TestClass1_Inner1_lc 0LL +#undef TestClass1_Inner1_fc +#define TestClass1_Inner1_fc 0.0f +#undef TestClass1_Inner1_dc +#define TestClass1_Inner1_dc 0.0 +/* + * Class: TestClass1_Inner1 + * Method: bmn + * Signature: ()B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_00024Inner1_bmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: smn + * Signature: ()S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_00024Inner1_smn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: imn + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_TestClass1_00024Inner1_imn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: lmn + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_00024Inner1_lmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: fmn + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_00024Inner1_fmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: dmn + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_00024Inner1_dmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: omn + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner1_omn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: tmn + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_00024Inner1_tmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: gmn + * Signature: ()Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner1_gmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: vmn + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_vmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: bmn1 + * Signature: ()B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_00024Inner1_bmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: smn1 + * Signature: ()S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_00024Inner1_smn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: imn1 + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_TestClass1_00024Inner1_imn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: lmn1 + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_00024Inner1_lmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: fmn1 + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_00024Inner1_fmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: dmn1 + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_00024Inner1_dmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: omn1 + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner1_omn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: tmn1 + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_00024Inner1_tmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: gmn1 + * Signature: ()Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner1_gmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: vmn1 + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_vmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: bmn2 + * Signature: (I)B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_00024Inner1_bmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: smn2 + * Signature: (I)S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_00024Inner1_smn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: imn2 + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_TestClass1_00024Inner1_imn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: lmn2 + * Signature: (I)J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_00024Inner1_lmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: fmn2 + * Signature: (I)F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_00024Inner1_fmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: dmn2 + * Signature: (I)D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_00024Inner1_dmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: omn2 + * Signature: (I)Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner1_omn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: tmn2 + * Signature: (I)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_00024Inner1_tmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: gmn2 + * Signature: (I)Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner1_gmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: vmn2 + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_vmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: mbn + * Signature: (B)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_mbn + (JNIEnv *, jobject, jbyte); + +/* + * Class: TestClass1_Inner1 + * Method: msn + * Signature: (S)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_msn + (JNIEnv *, jobject, jshort); + +/* + * Class: TestClass1_Inner1 + * Method: min + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_min + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: mln + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_mln + (JNIEnv *, jobject, jlong); + +/* + * Class: TestClass1_Inner1 + * Method: mfn + * Signature: (F)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_mfn + (JNIEnv *, jobject, jfloat); + +/* + * Class: TestClass1_Inner1 + * Method: mdn + * Signature: (D)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_mdn + (JNIEnv *, jobject, jdouble); + +/* + * Class: TestClass1_Inner1 + * Method: mon + * Signature: (Ljava/lang/Object;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_mon + (JNIEnv *, jobject, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: mtn + * Signature: (Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_mtn + (JNIEnv *, jobject, jstring); + +/* + * Class: TestClass1_Inner1 + * Method: mgn + * Signature: (Ljava/util/List;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_mgn + (JNIEnv *, jobject, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javah/6572945/gold/jni.file.2 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javah/6572945/gold/jni.file.2 Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,1162 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class TestClass1 */ + +#ifndef _Included_TestClass1 +#define _Included_TestClass1 +#ifdef __cplusplus +extern "C" { +#endif +#undef TestClass1_bc +#define TestClass1_bc 0L +#undef TestClass1_sc +#define TestClass1_sc 0L +#undef TestClass1_ic +#define TestClass1_ic 0L +#undef TestClass1_lc +#define TestClass1_lc 0LL +#undef TestClass1_fc +#define TestClass1_fc 0.0f +#undef TestClass1_dc +#define TestClass1_dc 0.0 +/* + * Class: TestClass1 + * Method: bmn + * Signature: ()B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_bmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: smn + * Signature: ()S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_smn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: imn + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_TestClass1_imn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: lmn + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_lmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: fmn + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_fmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: dmn + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_dmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: omn + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_omn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: tmn + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_tmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: gmn + * Signature: ()Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_gmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: vmn + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_TestClass1_vmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: bamn + * Signature: ()[B + */ +JNIEXPORT jbyteArray JNICALL Java_TestClass1_bamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: samn + * Signature: ()[S + */ +JNIEXPORT jshortArray JNICALL Java_TestClass1_samn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: iamn + * Signature: ()[I + */ +JNIEXPORT jintArray JNICALL Java_TestClass1_iamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: lamn + * Signature: ()[J + */ +JNIEXPORT jlongArray JNICALL Java_TestClass1_lamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: famn + * Signature: ()[F + */ +JNIEXPORT jfloatArray JNICALL Java_TestClass1_famn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: damn + * Signature: ()[D + */ +JNIEXPORT jdoubleArray JNICALL Java_TestClass1_damn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: oamn + * Signature: ()[Ljava/lang/Object; + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_oamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: tamn + * Signature: ()[Ljava/lang/String; + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_tamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: gamn + * Signature: ()[Ljava/util/List; + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_gamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: baamn + * Signature: ()[[B + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_baamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: saamn + * Signature: ()[[S + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_saamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: iaamn + * Signature: ()[[I + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_iaamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: laamn + * Signature: ()[[J + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_laamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: faamn + * Signature: ()[[F + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_faamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: daamn + * Signature: ()[[D + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_daamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: oaamn + * Signature: ()[[Ljava/lang/Object; + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_oaamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: taamn + * Signature: ()[[Ljava/lang/String; + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_taamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: gaamn + * Signature: ()[Ljava/util/List; + */ +JNIEXPORT jobjectArray JNICALL Java_TestClass1_gaamn + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: bmn1 + * Signature: ()B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_bmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: smn1 + * Signature: ()S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_smn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: imn1 + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_TestClass1_imn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: lmn1 + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_lmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: fmn1 + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_fmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: dmn1 + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_dmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: omn1 + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_omn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: tmn1 + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_tmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: gmn1 + * Signature: ()Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_gmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: vmn1 + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_TestClass1_vmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1 + * Method: bmn2 + * Signature: (I)B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_bmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: smn2 + * Signature: (I)S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_smn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: imn2 + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_TestClass1_imn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: lmn2 + * Signature: (I)J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_lmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: fmn2 + * Signature: (I)F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_fmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: dmn2 + * Signature: (I)D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_dmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: omn2 + * Signature: (I)Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_omn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: tmn2 + * Signature: (I)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_tmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: gmn2 + * Signature: (I)Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_gmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: vmn2 + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_TestClass1_vmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: mbn + * Signature: (B)V + */ +JNIEXPORT void JNICALL Java_TestClass1_mbn + (JNIEnv *, jobject, jbyte); + +/* + * Class: TestClass1 + * Method: msn + * Signature: (S)V + */ +JNIEXPORT void JNICALL Java_TestClass1_msn + (JNIEnv *, jobject, jshort); + +/* + * Class: TestClass1 + * Method: min + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_TestClass1_min + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1 + * Method: mln + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_TestClass1_mln + (JNIEnv *, jobject, jlong); + +/* + * Class: TestClass1 + * Method: mfn + * Signature: (F)V + */ +JNIEXPORT void JNICALL Java_TestClass1_mfn + (JNIEnv *, jobject, jfloat); + +/* + * Class: TestClass1 + * Method: mdn + * Signature: (D)V + */ +JNIEXPORT void JNICALL Java_TestClass1_mdn + (JNIEnv *, jobject, jdouble); + +/* + * Class: TestClass1 + * Method: mon + * Signature: (Ljava/lang/Object;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_mon + (JNIEnv *, jobject, jobject); + +/* + * Class: TestClass1 + * Method: mtn + * Signature: (Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_mtn + (JNIEnv *, jobject, jstring); + +/* + * Class: TestClass1 + * Method: mgn + * Signature: (Ljava/util/List;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_mgn + (JNIEnv *, jobject, jobject); + +#ifdef __cplusplus +} +#endif +#endif +/* Header for class TestClass1_Inner2 */ + +#ifndef _Included_TestClass1_Inner2 +#define _Included_TestClass1_Inner2 +#ifdef __cplusplus +extern "C" { +#endif +#undef TestClass1_Inner2_bc +#define TestClass1_Inner2_bc 0L +#undef TestClass1_Inner2_sc +#define TestClass1_Inner2_sc 0L +#undef TestClass1_Inner2_ic +#define TestClass1_Inner2_ic 0L +#undef TestClass1_Inner2_lc +#define TestClass1_Inner2_lc 0LL +#undef TestClass1_Inner2_fc +#define TestClass1_Inner2_fc 0.0f +#undef TestClass1_Inner2_dc +#define TestClass1_Inner2_dc 0.0 +/* + * Class: TestClass1_Inner2 + * Method: bmn + * Signature: ()B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_00024Inner2_bmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: smn + * Signature: ()S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_00024Inner2_smn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: imn + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_TestClass1_00024Inner2_imn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: lmn + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_00024Inner2_lmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: fmn + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_00024Inner2_fmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: dmn + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_00024Inner2_dmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: omn + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner2_omn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: tmn + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_00024Inner2_tmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: gmn + * Signature: ()Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner2_gmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: vmn + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_vmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: bmn1 + * Signature: ()B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_00024Inner2_bmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: smn1 + * Signature: ()S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_00024Inner2_smn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: imn1 + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_TestClass1_00024Inner2_imn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: lmn1 + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_00024Inner2_lmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: fmn1 + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_00024Inner2_fmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: dmn1 + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_00024Inner2_dmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: omn1 + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner2_omn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: tmn1 + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_00024Inner2_tmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: gmn1 + * Signature: ()Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner2_gmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: vmn1 + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_vmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: bmn2 + * Signature: (I)B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_00024Inner2_bmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: smn2 + * Signature: (I)S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_00024Inner2_smn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: imn2 + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_TestClass1_00024Inner2_imn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: lmn2 + * Signature: (I)J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_00024Inner2_lmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: fmn2 + * Signature: (I)F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_00024Inner2_fmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: dmn2 + * Signature: (I)D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_00024Inner2_dmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: omn2 + * Signature: (I)Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner2_omn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: tmn2 + * Signature: (I)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_00024Inner2_tmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: gmn2 + * Signature: (I)Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner2_gmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: vmn2 + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_vmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: mbn + * Signature: (B)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_mbn + (JNIEnv *, jobject, jbyte); + +/* + * Class: TestClass1_Inner2 + * Method: msn + * Signature: (S)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_msn + (JNIEnv *, jobject, jshort); + +/* + * Class: TestClass1_Inner2 + * Method: min + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_min + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner2 + * Method: mln + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_mln + (JNIEnv *, jobject, jlong); + +/* + * Class: TestClass1_Inner2 + * Method: mfn + * Signature: (F)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_mfn + (JNIEnv *, jobject, jfloat); + +/* + * Class: TestClass1_Inner2 + * Method: mdn + * Signature: (D)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_mdn + (JNIEnv *, jobject, jdouble); + +/* + * Class: TestClass1_Inner2 + * Method: mon + * Signature: (Ljava/lang/Object;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_mon + (JNIEnv *, jobject, jobject); + +/* + * Class: TestClass1_Inner2 + * Method: mtn + * Signature: (Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_mtn + (JNIEnv *, jobject, jstring); + +/* + * Class: TestClass1_Inner2 + * Method: mgn + * Signature: (Ljava/util/List;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner2_mgn + (JNIEnv *, jobject, jobject); + +#ifdef __cplusplus +} +#endif +#endif +/* Header for class TestClass1_Inner1 */ + +#ifndef _Included_TestClass1_Inner1 +#define _Included_TestClass1_Inner1 +#ifdef __cplusplus +extern "C" { +#endif +#undef TestClass1_Inner1_bc +#define TestClass1_Inner1_bc 0L +#undef TestClass1_Inner1_sc +#define TestClass1_Inner1_sc 0L +#undef TestClass1_Inner1_ic +#define TestClass1_Inner1_ic 0L +#undef TestClass1_Inner1_lc +#define TestClass1_Inner1_lc 0LL +#undef TestClass1_Inner1_fc +#define TestClass1_Inner1_fc 0.0f +#undef TestClass1_Inner1_dc +#define TestClass1_Inner1_dc 0.0 +/* + * Class: TestClass1_Inner1 + * Method: bmn + * Signature: ()B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_00024Inner1_bmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: smn + * Signature: ()S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_00024Inner1_smn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: imn + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_TestClass1_00024Inner1_imn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: lmn + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_00024Inner1_lmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: fmn + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_00024Inner1_fmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: dmn + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_00024Inner1_dmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: omn + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner1_omn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: tmn + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_00024Inner1_tmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: gmn + * Signature: ()Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner1_gmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: vmn + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_vmn + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: bmn1 + * Signature: ()B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_00024Inner1_bmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: smn1 + * Signature: ()S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_00024Inner1_smn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: imn1 + * Signature: ()I + */ +JNIEXPORT jint JNICALL Java_TestClass1_00024Inner1_imn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: lmn1 + * Signature: ()J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_00024Inner1_lmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: fmn1 + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_00024Inner1_fmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: dmn1 + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_00024Inner1_dmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: omn1 + * Signature: ()Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner1_omn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: tmn1 + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_00024Inner1_tmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: gmn1 + * Signature: ()Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner1_gmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: vmn1 + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_vmn1 + (JNIEnv *, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: bmn2 + * Signature: (I)B + */ +JNIEXPORT jbyte JNICALL Java_TestClass1_00024Inner1_bmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: smn2 + * Signature: (I)S + */ +JNIEXPORT jshort JNICALL Java_TestClass1_00024Inner1_smn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: imn2 + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_TestClass1_00024Inner1_imn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: lmn2 + * Signature: (I)J + */ +JNIEXPORT jlong JNICALL Java_TestClass1_00024Inner1_lmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: fmn2 + * Signature: (I)F + */ +JNIEXPORT jfloat JNICALL Java_TestClass1_00024Inner1_fmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: dmn2 + * Signature: (I)D + */ +JNIEXPORT jdouble JNICALL Java_TestClass1_00024Inner1_dmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: omn2 + * Signature: (I)Ljava/lang/Object; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner1_omn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: tmn2 + * Signature: (I)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_TestClass1_00024Inner1_tmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: gmn2 + * Signature: (I)Ljava/util/List; + */ +JNIEXPORT jobject JNICALL Java_TestClass1_00024Inner1_gmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: vmn2 + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_vmn2 + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: mbn + * Signature: (B)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_mbn + (JNIEnv *, jobject, jbyte); + +/* + * Class: TestClass1_Inner1 + * Method: msn + * Signature: (S)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_msn + (JNIEnv *, jobject, jshort); + +/* + * Class: TestClass1_Inner1 + * Method: min + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_min + (JNIEnv *, jobject, jint); + +/* + * Class: TestClass1_Inner1 + * Method: mln + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_mln + (JNIEnv *, jobject, jlong); + +/* + * Class: TestClass1_Inner1 + * Method: mfn + * Signature: (F)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_mfn + (JNIEnv *, jobject, jfloat); + +/* + * Class: TestClass1_Inner1 + * Method: mdn + * Signature: (D)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_mdn + (JNIEnv *, jobject, jdouble); + +/* + * Class: TestClass1_Inner1 + * Method: mon + * Signature: (Ljava/lang/Object;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_mon + (JNIEnv *, jobject, jobject); + +/* + * Class: TestClass1_Inner1 + * Method: mtn + * Signature: (Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_mtn + (JNIEnv *, jobject, jstring); + +/* + * Class: TestClass1_Inner1 + * Method: mgn + * Signature: (Ljava/util/List;)V + */ +JNIEXPORT void JNICALL Java_TestClass1_00024Inner1_mgn + (JNIEnv *, jobject, jobject); + +#ifdef __cplusplus +} +#endif +#endif +/* Header for class TestClass2 */ + +#ifndef _Included_TestClass2 +#define _Included_TestClass2 +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javah/6572945/gold/jni.file.3 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javah/6572945/gold/jni.file.3 Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,79 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class TestClass3 */ + +#ifndef _Included_TestClass3 +#define _Included_TestClass3 +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif +/* Header for class TestClass3_Inner2 */ + +#ifndef _Included_TestClass3_Inner2 +#define _Included_TestClass3_Inner2 +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif +/* Header for class TestClass3_Inner2_Inner2B */ + +#ifndef _Included_TestClass3_Inner2_Inner2B +#define _Included_TestClass3_Inner2_Inner2B +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif +/* Header for class TestClass3_Inner2_Inner2A */ + +#ifndef _Included_TestClass3_Inner2_Inner2A +#define _Included_TestClass3_Inner2_Inner2A +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif +/* Header for class TestClass3_Inner1 */ + +#ifndef _Included_TestClass3_Inner1 +#define _Included_TestClass3_Inner1 +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif +/* Header for class TestClass3_Inner1_Inner1B */ + +#ifndef _Included_TestClass3_Inner1_Inner1B +#define _Included_TestClass3_Inner1_Inner1B +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif +/* Header for class TestClass3_Inner1_Inner1A */ + +#ifndef _Included_TestClass3_Inner1_Inner1A +#define _Included_TestClass3_Inner1_Inner1A +#ifdef __cplusplus +extern "C" { +#endif +#ifdef __cplusplus +} +#endif +#endif diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javah/MissingParamClassTest.sh --- a/test/tools/javah/MissingParamClassTest.sh Fri Oct 02 11:26:53 2009 -0700 +++ b/test/tools/javah/MissingParamClassTest.sh Wed Oct 07 14:14:45 2009 -0700 @@ -77,10 +77,7 @@ rm -f ParamClassTest.class MissingParamClassException.class ParamClassTest.h rm -f ${TMP1} -cp ${TESTSRC}${FS}ParamClassTest.java . -cp ${TESTSRC}${FS}MissingParamClassException.java . - -"${TESTJAVA}${FS}bin${FS}javac" ${TESTTOOLVMOPTS} -d . "${TESTSRC}${FS}ParamClassTest.java" +"${TESTJAVA}${FS}bin${FS}javac" ${TESTTOOLVMOPTS} -d . "${TESTSRC}${FS}ParamClassTest.java" "${TESTSRC}${FS}MissingParamClassException.java" # Before running javah remove dependent class file rm -f MissingParamClassException.class @@ -88,15 +85,12 @@ "${TESTJAVA}${FS}bin${FS}javah" ${TESTTOOLVMOPTS} ParamClassTest 2>${TMP1} if [ -f $GENERATED_HEADER_FILE ]; then - echo "Failed" - exit 1 + echo "1-- Failed: $GENERATED_HEADER_FILE found" + rc=1 fi -if [ ! -f ${TMP1} ]; then - echo "Failed" - exit 1 -else - echo "Passed" - exit 0 +if [ ! -s ${TMP1} ]; then + echo "1-- Failed: ${TMP1} is empty" + rc=1 fi # Clean out work dir @@ -104,7 +98,9 @@ rm -f $GENERATED_HEADER_FILE $TMP1 # Re-compile everything -"${TESTJAVA}${FS}bin${FS}javac" ${TESTTOOLVMOPTS} -d . ${TESTSRC}${FS}ParamClassTest.java + +"${TESTJAVA}${FS}bin${FS}javac" ${TESTTOOLVMOPTS} -d . "${TESTSRC}${FS}ParamClassTest.java" "${TESTSRC}${FS}MissingParamClassException.java" + # Before re-run of javah remove dependent class file Param.class rm -f Param.class @@ -112,13 +108,17 @@ "${TESTJAVA}${FS}bin${FS}javah" ${TESTTOOLVMOPTS} ParamClassTest 2>${TMP1} if [ -f $GENERATED_HEADER_FILE ]; then - echo "Failed" - exit 1 + echo "2-- Failed: $GENERATED_HEADER_FILE found" + rc=1 fi -if [ ! -f ${TMP1} ]; then - echo "Failed" - exit 1 +if [ ! -s ${TMP1} ]; then + echo "2-- Failed: ${TMP1} is empty" + rc=1 +fi + +if [ "$rc" = "" ]; then + echo Passed else - echo "Passed" - exit 0 + echo Failed + exit 1 fi diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javah/compareTest/CompareTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javah/compareTest/CompareTest.java Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,265 @@ +/* + * Copyright 2009 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. + */ + +import java.io.DataInputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Enumeration; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +import com.sun.tools.classfile.AccessFlags; +import com.sun.tools.classfile.ClassFile; +import com.sun.tools.classfile.ConstantPoolException; +import com.sun.tools.classfile.Method; +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.InputStreamReader; +import java.util.LinkedHashSet; + +public class CompareTest { + String[][] testCases = { + { }, + { "-jni" }, +// { "-llni" }, + }; + + public static void main(String... args) throws Exception { + new CompareTest().run(args); + } + + public void run(String... args) throws Exception { + old_javah_cmd = new File(args[0]); + rt_jar = new File(args[1]); + + Set testClasses; + if (args.length > 2) { + testClasses = new LinkedHashSet(Arrays.asList(Arrays.copyOfRange(args, 2, args.length))); + } else + testClasses = getNativeClasses(new JarFile(rt_jar)); + + for (String[] options: testCases) { + for (String name: testClasses) { + test(Arrays.asList(options), rt_jar, name); + } + } + + if (errors == 0) + System.out.println(count + " tests passed"); + else + throw new Exception(errors + "/" + count + " tests failed"); + } + + public void test(List options, File bootclasspath, String className) + throws IOException, InterruptedException { + System.err.println("test: " + options + " " + className); + count++; + + testOptions = options; + testClassName = className; + + File oldOutDir = initDir(file(new File("old"), className)); + int old_rc = old_javah(options, oldOutDir, bootclasspath, className); + + File newOutDir = initDir(file(new File("new"), className)); + int new_rc = new_javah(options, newOutDir, bootclasspath, className); + + if (old_rc != new_rc) + error("return codes differ; old: " + old_rc + ", new: " + new_rc); + + compare(oldOutDir, newOutDir); + } + + int old_javah(List options, File outDir, File bootclasspath, String className) + throws IOException, InterruptedException { + List cmd = new ArrayList(); + cmd.add(old_javah_cmd.getPath()); + cmd.addAll(options); + cmd.add("-d"); + cmd.add(outDir.getPath()); + cmd.add("-bootclasspath"); + cmd.add(bootclasspath.getPath()); + cmd.add(className); + System.err.println("old_javah: " + cmd); + ProcessBuilder pb = new ProcessBuilder(cmd); + pb.redirectErrorStream(true); + Process p = pb.start(); + BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); + String line; + StringBuilder sb = new StringBuilder(); + while ((line = in.readLine()) != null) { + sb.append(line); + sb.append("\n"); + } + System.err.println("old javah out: " + sb.toString()); + return p.waitFor(); + } + + int new_javah(List options, File outDir, File bootclasspath, String className) { + List args = new ArrayList(); + args.addAll(options); + args.add("-d"); + args.add(outDir.getPath()); + args.add("-bootclasspath"); + args.add(bootclasspath.getPath()); + args.add(className); + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + int rc = com.sun.tools.javah.Main.run(args.toArray(new String[args.size()]), pw); + pw.close(); + System.err.println("new javah out: " + sw.toString()); + return rc; + } + + Set getNativeClasses(JarFile jar) throws IOException, ConstantPoolException { + System.err.println("getNativeClasses: " + jar.getName()); + Set results = new TreeSet(); + Enumeration e = jar.entries(); + while (e.hasMoreElements()) { + JarEntry je = e.nextElement(); + if (isNativeClass(jar, je)) { + String name = je.getName(); + results.add(name.substring(0, name.length() - 6).replace("/", ".")); + } + } + return results; + } + + boolean isNativeClass(JarFile jar, JarEntry entry) throws IOException, ConstantPoolException { + String name = entry.getName(); + if (name.startsWith("META-INF") || !name.endsWith(".class")) + return false; + //String className = name.substring(0, name.length() - 6).replace("/", "."); + //System.err.println("check " + className); + InputStream in = jar.getInputStream(entry); + ClassFile cf = ClassFile.read(in); + for (int i = 0; i < cf.methods.length; i++) { + Method m = cf.methods[i]; + if (m.access_flags.is(AccessFlags.ACC_NATIVE)) { + // System.err.println(className); + return true; + } + } + return false; + } + + void compare(File f1, File f2) throws IOException { + if (f1.isFile() && f2.isFile()) + compareFiles(f1, f2); + else if (f1.isDirectory() && f2.isDirectory()) + compareDirectories(f1, f2); + else + error("files differ: " + + f1 + " (" + getFileType(f1) + "), " + + f2 + " (" + getFileType(f2) + ")"); + } + + void compareDirectories(File d1, File d2) throws IOException { + Set list = new TreeSet(); + list.addAll(Arrays.asList(d1.list())); + list.addAll(Arrays.asList(d2.list())); + for (String c: list) + compare(new File(d1, c), new File(d2, c)); + } + + void compareFiles(File f1, File f2) throws IOException { + byte[] c1 = readFile(f1); + byte[] c2 = readFile(f2); + if (!Arrays.equals(c1, c2)) + error("files differ: " + f1 + ", " + f2); + } + + byte[] readFile(File file) throws IOException { + int size = (int) file.length(); + byte[] data = new byte[size]; + DataInputStream in = new DataInputStream(new FileInputStream(file)); + try { + in.readFully(data); + } finally { + in.close(); + } + return data; + } + + String getFileType(File f) { + return f.isDirectory() ? "directory" + : f.isFile() ? "file" + : f.exists() ? "other" + : "not found"; + } + + /** + * Set up an empty directory. + */ + public File initDir(File dir) { + if (dir.exists()) + deleteAll(dir); + dir.mkdirs(); + return dir; + } + + /** + * Delete a file or a directory (including all its contents). + */ + boolean deleteAll(File file) { + if (file.isDirectory()) { + for (File f: file.listFiles()) + deleteAll(f); + } + return file.delete(); + } + + File file(File dir, String... path) { + File f = dir; + for (String p: path) + f = new File(f, p); + return f; + } + + /** + * Report an error. + */ + void error(String msg, String... more) { + System.err.println("test: " + testOptions + " " + testClassName); + System.err.println("error: " + msg); + for (String s: more) + System.err.println(s); + errors++; + System.exit(1); + } + + File old_javah_cmd; + File rt_jar; + List testOptions; + String testClassName; + int count; + int errors; +} diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javah/compareTest/CompareTest.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javah/compareTest/CompareTest.sh Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,43 @@ +#!/bin/sh +# +# Copyright 2009 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. +# + +jdk=${1:-/opt/jdk/1.6.0} +javah=${jdk}/bin/javah +rtjar=${jdk}/jre/lib/rt.jar + +# compile test +mkdir -p build/compareTest +/opt/jdk/1.7.0/bin/javac -classpath build/classes -d build/compareTest test/tools/javah/compareTest/*.java + +# run test +/opt/jdk/1.7.0/bin/java -classpath build/compareTest:build/classes CompareTest $javah $rtjar 2>&1 | tee CompareTest.out + +# show diffs for tests that failed +grep 'error:' CompareTest.out | sed -e 's|.*new/||' -e 's/\.h$//' -e 's|_|.|g' > CompareTest.classes.fail + +for i in $(cat CompareTest.classes.fail) ; do + /opt/jdk/1.7.0/bin/java -classpath compareTest:build/classes CompareTest $javah $rtjar $i + diff -r old new +done + diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javah/compareTest/FindNativeFiles.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javah/compareTest/FindNativeFiles.java Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,86 @@ +/* + * Copyright 2009 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. + */ + +import java.io.IOException; +import java.io.InputStream; +import java.util.Enumeration; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +import com.sun.tools.classfile.AccessFlags; +import com.sun.tools.classfile.ClassFile; +import com.sun.tools.classfile.ConstantPoolException; +import com.sun.tools.classfile.Method; +import java.util.Comparator; +import java.util.Set; +import java.util.TreeSet; + +public class FindNativeFiles { + public static void main(String[] args) throws IOException, ConstantPoolException { + new FindNativeFiles().run(args); + } + + public void run(String[] args) throws IOException, ConstantPoolException { + JarFile jar = new JarFile(args[0]); + Set entries = getNativeClasses(jar); + for (JarEntry e: entries) { + String name = e.getName(); + String className = name.substring(0, name.length() - 6).replace("/", "."); + System.out.println(className); + } + } + + Set getNativeClasses(JarFile jar) throws IOException, ConstantPoolException { + Set results = new TreeSet(new Comparator() { + public int compare(JarEntry o1, JarEntry o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + Enumeration e = jar.entries(); + while (e.hasMoreElements()) { + JarEntry je = e.nextElement(); + if (isNativeClass(jar, je)) + results.add(je); + } + return results; + } + + boolean isNativeClass(JarFile jar, JarEntry entry) throws IOException, ConstantPoolException { + String name = entry.getName(); + if (name.startsWith("META-INF") || !name.endsWith(".class")) + return false; + //String className = name.substring(0, name.length() - 6).replace("/", "."); + //System.err.println("check " + className); + InputStream in = jar.getInputStream(entry); + ClassFile cf = ClassFile.read(in); + in.close(); + for (int i = 0; i < cf.methods.length; i++) { + Method m = cf.methods[i]; + if (m.access_flags.is(AccessFlags.ACC_NATIVE)) { + // System.err.println(className); + return true; + } + } + return false; + } +} diff -r d498d6ef9c6c -r 1a66b08deed0 test/tools/javah/compareTest/README --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javah/compareTest/README Wed Oct 07 14:14:45 2009 -0700 @@ -0,0 +1,16 @@ +test/tools/javah/compareTest/README + +This directory contains a program for comparing the output of new javah against the +output of JDK 6 or other older versions of javah. + +It cannot be run automatically because of the need for the older version of javah +to compare against. + +The test works by scanning a jar file, such as rt.jar, looking for all files with +native methods. It then runs both the old and new versions of javah on those +classes with native methods, and verifies that the results are character-for-character +identical. + +To run the test, build langtools, then execute the script in the root langtools +directory, providing the location of the JDK to be tested. The default is +/opt/jdk/1.6.0.