Merge
This commit is contained in:
commit
12468f7bcf
@ -250,9 +250,13 @@ class AnnotationProxyMaker {
|
||||
/**
|
||||
* Sets "value" to an ExceptionProxy indicating a type mismatch.
|
||||
*/
|
||||
private void typeMismatch(final Method method, final Attribute attr) {
|
||||
value = new ExceptionProxy() {
|
||||
private void typeMismatch(Method method, final Attribute attr) {
|
||||
class AnnotationTypeMismatchExceptionProxy extends ExceptionProxy {
|
||||
private static final long serialVersionUID = 8473323277815075163L;
|
||||
transient final Method method;
|
||||
AnnotationTypeMismatchExceptionProxy(Method method) {
|
||||
this.method = method;
|
||||
}
|
||||
public String toString() {
|
||||
return "<error>"; // eg: @Anno(value=<error>)
|
||||
}
|
||||
@ -260,7 +264,8 @@ class AnnotationProxyMaker {
|
||||
return new AnnotationTypeMismatchException(method,
|
||||
attr.type.toString());
|
||||
}
|
||||
};
|
||||
}
|
||||
value = new AnnotationTypeMismatchExceptionProxy(method);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -553,12 +553,24 @@ public class Infer {
|
||||
//the enclosing tree E, as follows: if E is a cast, then use the
|
||||
//target type of the cast expression as a return type; if E is an
|
||||
//expression statement, the return type is 'void' - otherwise the
|
||||
//return type is simply 'Object'.
|
||||
switch (env.outer.tree.getTag()) {
|
||||
//return type is simply 'Object'. A correctness check ensures that
|
||||
//env.next refers to the lexically enclosing environment in which
|
||||
//the polymorphic signature call environment is nested.
|
||||
|
||||
switch (env.next.tree.getTag()) {
|
||||
case JCTree.TYPECAST:
|
||||
restype = ((JCTypeCast)env.outer.tree).clazz.type; break;
|
||||
JCTypeCast castTree = (JCTypeCast)env.next.tree;
|
||||
restype = (castTree.expr == env.tree) ?
|
||||
castTree.clazz.type :
|
||||
syms.objectType;
|
||||
break;
|
||||
case JCTree.EXEC:
|
||||
restype = syms.voidType; break;
|
||||
JCTree.JCExpressionStatement execTree =
|
||||
(JCTree.JCExpressionStatement)env.next.tree;
|
||||
restype = (execTree.expr == env.tree) ?
|
||||
syms.voidType :
|
||||
syms.objectType;
|
||||
break;
|
||||
default:
|
||||
restype = syms.objectType;
|
||||
}
|
||||
|
@ -668,9 +668,9 @@ public class MemberEnter extends JCTree.Visitor implements Completer {
|
||||
public void visitTree(JCTree tree) {
|
||||
}
|
||||
|
||||
|
||||
public void visitErroneous(JCErroneous tree) {
|
||||
memberEnter(tree.errs, env);
|
||||
if (tree.errs != null)
|
||||
memberEnter(tree.errs, env);
|
||||
}
|
||||
|
||||
public Env<AttrContext> getMethodEnv(JCMethodDecl tree, Env<AttrContext> env) {
|
||||
|
@ -511,7 +511,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter {
|
||||
|
||||
protected boolean shouldStop(CompileState cs) {
|
||||
if (shouldStopPolicy == null)
|
||||
return (errorCount() > 0);
|
||||
return (errorCount() > 0 || unrecoverableError());
|
||||
else
|
||||
return cs.ordinal() > shouldStopPolicy.ordinal();
|
||||
}
|
||||
|
@ -250,9 +250,13 @@ public class AnnotationProxyMaker {
|
||||
/**
|
||||
* Sets "value" to an ExceptionProxy indicating a type mismatch.
|
||||
*/
|
||||
private void typeMismatch(final Method method, final Attribute attr) {
|
||||
value = new ExceptionProxy() {
|
||||
private void typeMismatch(Method method, final Attribute attr) {
|
||||
class AnnotationTypeMismatchExceptionProxy extends ExceptionProxy {
|
||||
static final long serialVersionUID = 269;
|
||||
transient final Method method;
|
||||
AnnotationTypeMismatchExceptionProxy(Method method) {
|
||||
this.method = method;
|
||||
}
|
||||
public String toString() {
|
||||
return "<error>"; // eg: @Anno(value=<error>)
|
||||
}
|
||||
@ -260,7 +264,8 @@ public class AnnotationProxyMaker {
|
||||
return new AnnotationTypeMismatchException(method,
|
||||
attr.type.toString());
|
||||
}
|
||||
};
|
||||
}
|
||||
value = new AnnotationTypeMismatchExceptionProxy(method);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -66,32 +66,26 @@ public class JavacElements implements Elements {
|
||||
private Types types;
|
||||
private Enter enter;
|
||||
|
||||
private static final Context.Key<JavacElements> KEY =
|
||||
new Context.Key<JavacElements>();
|
||||
|
||||
public static JavacElements instance(Context context) {
|
||||
JavacElements instance = context.get(KEY);
|
||||
if (instance == null) {
|
||||
JavacElements instance = context.get(JavacElements.class);
|
||||
if (instance == null)
|
||||
instance = new JavacElements(context);
|
||||
context.put(KEY, instance);
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Public for use only by JavacProcessingEnvironment
|
||||
*/
|
||||
// TODO JavacElements constructor should be protected
|
||||
public JavacElements(Context context) {
|
||||
protected JavacElements(Context context) {
|
||||
setContext(context);
|
||||
}
|
||||
|
||||
/**
|
||||
* Use a new context. May be called from outside to update
|
||||
* internal state for a new annotation-processing round.
|
||||
* This instance is *not* then registered with the new context.
|
||||
*/
|
||||
public void setContext(Context context) {
|
||||
context.put(JavacElements.class, this);
|
||||
javaCompiler = JavaCompiler.instance(context);
|
||||
syms = Symtab.instance(context);
|
||||
names = Names.instance(context);
|
||||
|
@ -47,32 +47,26 @@ public class JavacTypes implements javax.lang.model.util.Types {
|
||||
private Symtab syms;
|
||||
private Types types;
|
||||
|
||||
private static final Context.Key<JavacTypes> KEY =
|
||||
new Context.Key<JavacTypes>();
|
||||
|
||||
public static JavacTypes instance(Context context) {
|
||||
JavacTypes instance = context.get(KEY);
|
||||
if (instance == null) {
|
||||
JavacTypes instance = context.get(JavacTypes.class);
|
||||
if (instance == null)
|
||||
instance = new JavacTypes(context);
|
||||
context.put(KEY, instance);
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Public for use only by JavacProcessingEnvironment
|
||||
*/
|
||||
// TODO JavacTypes constructor should be protected
|
||||
public JavacTypes(Context context) {
|
||||
protected JavacTypes(Context context) {
|
||||
setContext(context);
|
||||
}
|
||||
|
||||
/**
|
||||
* Use a new context. May be called from outside to update
|
||||
* internal state for a new annotation-processing round.
|
||||
* This instance is *not* then registered with the new context.
|
||||
*/
|
||||
public void setContext(Context context) {
|
||||
context.put(JavacTypes.class, this);
|
||||
syms = Symtab.instance(context);
|
||||
types = Types.instance(context);
|
||||
}
|
||||
|
@ -173,12 +173,12 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea
|
||||
platformAnnotations = initPlatformAnnotations();
|
||||
foundTypeProcessors = false;
|
||||
|
||||
// Initialize services before any processors are initialzied
|
||||
// Initialize services before any processors are initialized
|
||||
// in case processors use them.
|
||||
filer = new JavacFiler(context);
|
||||
messager = new JavacMessager(context, this);
|
||||
elementUtils = new JavacElements(context);
|
||||
typeUtils = new JavacTypes(context);
|
||||
elementUtils = JavacElements.instance(context);
|
||||
typeUtils = JavacTypes.instance(context);
|
||||
processorOptions = initProcessorOptions(context);
|
||||
unmatchedProcessorOptions = initUnmatchedProcessorOptions();
|
||||
messages = JavacMessages.instance(context);
|
||||
@ -865,8 +865,6 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea
|
||||
this(prev.nextContext(), prev.number+1, prev.compiler.log.nwarnings);
|
||||
this.genClassFiles = prev.genClassFiles;
|
||||
|
||||
updateProcessingState();
|
||||
|
||||
List<JCCompilationUnit> parsedFiles = compiler.parseFiles(newSourceFiles);
|
||||
roots = cleanTrees(prev.roots).appendList(parsedFiles);
|
||||
|
||||
@ -1029,15 +1027,6 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea
|
||||
log.reportDeferredDiagnostics(kinds);
|
||||
}
|
||||
|
||||
/** Update the processing state for the current context. */
|
||||
private void updateProcessingState() {
|
||||
filer.newRound(context);
|
||||
messager.newRound(context);
|
||||
|
||||
elementUtils.setContext(context);
|
||||
typeUtils.setContext(context);
|
||||
}
|
||||
|
||||
/** Print info about this round. */
|
||||
private void printRoundInfo(boolean lastRound) {
|
||||
if (printRounds || verbose) {
|
||||
@ -1100,6 +1089,11 @@ public class JavacProcessingEnvironment implements ProcessingEnvironment, Closea
|
||||
JavaCompiler nextCompiler = JavaCompiler.instance(next);
|
||||
nextCompiler.initRound(oldCompiler);
|
||||
|
||||
filer.newRound(next);
|
||||
messager.newRound(next);
|
||||
elementUtils.setContext(next);
|
||||
typeUtils.setContext(next);
|
||||
|
||||
JavacTaskImpl task = context.get(JavacTaskImpl.class);
|
||||
if (task != null) {
|
||||
next.put(JavacTaskImpl.class, task);
|
||||
|
@ -59,72 +59,76 @@ public class JNI extends Gen {
|
||||
}
|
||||
|
||||
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());
|
||||
try {
|
||||
String cname = mangler.mangle(clazz.getQualifiedName(), Mangle.Type.CLASS);
|
||||
PrintWriter pw = wrapWriter(o);
|
||||
pw.println(guardBegin(cname));
|
||||
pw.println(cppGuardBegin());
|
||||
|
||||
/* Write statics. */
|
||||
List<VariableElement> classfields = getAllFields(clazz);
|
||||
/* Write statics. */
|
||||
List<VariableElement> classfields = getAllFields(clazz);
|
||||
|
||||
for (VariableElement v: classfields) {
|
||||
if (!v.getModifiers().contains(Modifier.STATIC))
|
||||
continue;
|
||||
String s = null;
|
||||
s = defineForStatic(clazz, v);
|
||||
if (s != null) {
|
||||
pw.println(s);
|
||||
for (VariableElement v: classfields) {
|
||||
if (!v.getModifiers().contains(Modifier.STATIC))
|
||||
continue;
|
||||
String s = null;
|
||||
s = defineForStatic(clazz, v);
|
||||
if (s != null) {
|
||||
pw.println(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Write methods. */
|
||||
List<ExecutableElement> 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 (ExecutableElement md2: classmethods) {
|
||||
if ((md2 != md)
|
||||
&& (methodName.equals(md2.getSimpleName()))
|
||||
&& (md2.getModifiers().contains(Modifier.NATIVE)))
|
||||
longName = true;
|
||||
/* Write methods. */
|
||||
List<ExecutableElement> 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 (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: " +
|
||||
mangler.mangle(methodName, Mangle.Type.FIELDSTUB));
|
||||
pw.println(" * Signature: " + newtypesig.getTypeSignature(sig, mtr));
|
||||
pw.println(" */");
|
||||
pw.println("JNIEXPORT " + jniType(mtr) +
|
||||
" JNICALL " +
|
||||
mangler.mangleMethod(md, clazz,
|
||||
(longName) ?
|
||||
Mangle.Type.METHOD_JNI_LONG :
|
||||
Mangle.Type.METHOD_JNI_SHORT));
|
||||
pw.print(" (JNIEnv *, ");
|
||||
List<? extends VariableElement> paramargs = md.getParameters();
|
||||
List<TypeMirror> args = new ArrayList<TypeMirror>();
|
||||
for (VariableElement p: paramargs) {
|
||||
args.add(types.erasure(p.asType()));
|
||||
}
|
||||
if (md.getModifiers().contains(Modifier.STATIC))
|
||||
pw.print("jclass");
|
||||
else
|
||||
pw.print("jobject");
|
||||
}
|
||||
pw.println("/*");
|
||||
pw.println(" * Class: " + cname);
|
||||
pw.println(" * Method: " +
|
||||
mangler.mangle(methodName, Mangle.Type.FIELDSTUB));
|
||||
pw.println(" * Signature: " + newtypesig.getTypeSignature(sig, mtr));
|
||||
pw.println(" */");
|
||||
pw.println("JNIEXPORT " + jniType(mtr) +
|
||||
" JNICALL " +
|
||||
mangler.mangleMethod(md, clazz,
|
||||
(longName) ?
|
||||
Mangle.Type.METHOD_JNI_LONG :
|
||||
Mangle.Type.METHOD_JNI_SHORT));
|
||||
pw.print(" (JNIEnv *, ");
|
||||
List<? extends VariableElement> paramargs = md.getParameters();
|
||||
List<TypeMirror> args = new ArrayList<TypeMirror>();
|
||||
for (VariableElement p: paramargs) {
|
||||
args.add(types.erasure(p.asType()));
|
||||
}
|
||||
if (md.getModifiers().contains(Modifier.STATIC))
|
||||
pw.print("jclass");
|
||||
else
|
||||
pw.print("jobject");
|
||||
|
||||
for (TypeMirror arg: args) {
|
||||
pw.print(", ");
|
||||
pw.print(jniType(arg));
|
||||
for (TypeMirror arg: args) {
|
||||
pw.print(", ");
|
||||
pw.print(jniType(arg));
|
||||
}
|
||||
pw.println(");" + lineSep);
|
||||
}
|
||||
pw.println(");" + lineSep);
|
||||
}
|
||||
pw.println(cppGuardEnd());
|
||||
pw.println(guardEnd(cname));
|
||||
} catch (TypeSignature.SignatureException e) {
|
||||
util.error("jni.sigerror", e.getMessage());
|
||||
}
|
||||
pw.println(cppGuardEnd());
|
||||
pw.println(guardEnd(cname));
|
||||
}
|
||||
|
||||
|
||||
|
@ -46,9 +46,9 @@ import java.util.Set;
|
||||
|
||||
import javax.annotation.processing.AbstractProcessor;
|
||||
import javax.annotation.processing.Messager;
|
||||
import javax.annotation.processing.ProcessingEnvironment;
|
||||
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;
|
||||
@ -71,6 +71,9 @@ import javax.tools.JavaFileObject;
|
||||
import javax.tools.StandardJavaFileManager;
|
||||
import javax.tools.StandardLocation;
|
||||
import javax.tools.ToolProvider;
|
||||
import static javax.tools.Diagnostic.Kind.*;
|
||||
|
||||
import com.sun.tools.javac.code.Symbol.CompletionFailure;
|
||||
|
||||
/**
|
||||
* Javah generates support files for native methods.
|
||||
@ -173,7 +176,7 @@ public class JavahTask implements NativeHeaderTool.NativeHeaderTask {
|
||||
}
|
||||
},
|
||||
|
||||
new Option(false, "-help", "--help", "-?") {
|
||||
new Option(false, "-h", "-help", "--help", "-?") {
|
||||
void process(JavahTask task, String opt, String arg) {
|
||||
task.help = true;
|
||||
}
|
||||
@ -233,6 +236,15 @@ public class JavahTask implements NativeHeaderTool.NativeHeaderTask {
|
||||
task.doubleAlign = true;
|
||||
}
|
||||
},
|
||||
|
||||
new HiddenOption(false) {
|
||||
boolean matches(String opt) {
|
||||
return opt.startsWith("-XD");
|
||||
}
|
||||
void process(JavahTask task, String opt, String arg) {
|
||||
task.javac_extras.add(opt);
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
JavahTask() {
|
||||
@ -326,6 +338,8 @@ public class JavahTask implements NativeHeaderTool.NativeHeaderTask {
|
||||
} catch (InternalError e) {
|
||||
diagnosticListener.report(createDiagnostic("err.internal.error", e.getMessage()));
|
||||
return 1;
|
||||
} catch (Util.Exit e) {
|
||||
return e.exitValue;
|
||||
} finally {
|
||||
log.flush();
|
||||
}
|
||||
@ -475,7 +489,9 @@ public class JavahTask implements NativeHeaderTool.NativeHeaderTask {
|
||||
((JavahFileManager) fileManager).setIgnoreSymbolFile(true);
|
||||
|
||||
JavaCompiler c = ToolProvider.getSystemJavaCompiler();
|
||||
List<String> opts = Arrays.asList("-proc:only");
|
||||
List<String> opts = new ArrayList<String>();
|
||||
opts.add("-proc:only");
|
||||
opts.addAll(javac_extras);
|
||||
CompilationTask t = c.getTask(log, fileManager, diagnosticListener, opts, internalize(classes), null);
|
||||
JavahProcessor p = new JavahProcessor(g);
|
||||
t.setProcessors(Collections.singleton(p));
|
||||
@ -642,6 +658,7 @@ public class JavahTask implements NativeHeaderTool.NativeHeaderTask {
|
||||
boolean doubleAlign;
|
||||
boolean force;
|
||||
boolean old;
|
||||
Set<String> javac_extras = new LinkedHashSet<String>();
|
||||
|
||||
PrintWriter log;
|
||||
JavaFileManager fileManager;
|
||||
@ -652,30 +669,45 @@ public class JavahTask implements NativeHeaderTool.NativeHeaderTask {
|
||||
private static final String progname = "javah";
|
||||
|
||||
@SupportedAnnotationTypes("*")
|
||||
@SupportedSourceVersion(SourceVersion.RELEASE_7)
|
||||
class JavahProcessor extends AbstractProcessor {
|
||||
private Messager messager;
|
||||
|
||||
JavahProcessor(Gen g) {
|
||||
this.g = g;
|
||||
}
|
||||
|
||||
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
|
||||
Messager messager = processingEnv.getMessager();
|
||||
Set<TypeElement> classes = getAllClasses(ElementFilter.typesIn(roundEnv.getRootElements()));
|
||||
if (classes.size() > 0) {
|
||||
checkMethodParameters(classes);
|
||||
g.setProcessingEnvironment(processingEnv);
|
||||
g.setClasses(classes);
|
||||
@Override
|
||||
public SourceVersion getSupportedSourceVersion() {
|
||||
// since this is co-bundled with javac, we can assume it supports
|
||||
// the latest source version
|
||||
return SourceVersion.latest();
|
||||
}
|
||||
|
||||
try {
|
||||
@Override
|
||||
public void init(ProcessingEnvironment pEnv) {
|
||||
super.init(pEnv);
|
||||
messager = processingEnv.getMessager();
|
||||
}
|
||||
|
||||
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
|
||||
try {
|
||||
Set<TypeElement> classes = getAllClasses(ElementFilter.typesIn(roundEnv.getRootElements()));
|
||||
if (classes.size() > 0) {
|
||||
checkMethodParameters(classes);
|
||||
g.setProcessingEnvironment(processingEnv);
|
||||
g.setClasses(classes);
|
||||
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;
|
||||
}
|
||||
} catch (CompletionFailure cf) {
|
||||
messager.printMessage(ERROR, getMessage("class.not.found", cf.sym.getQualifiedName().toString()));
|
||||
} catch (ClassNotFoundException cnfe) {
|
||||
messager.printMessage(ERROR, getMessage("class.not.found", cnfe.getMessage()));
|
||||
} catch (IOException ioe) {
|
||||
messager.printMessage(ERROR, getMessage("io.exception", ioe.getMessage()));
|
||||
} catch (Util.Exit e) {
|
||||
exit = e;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -74,16 +74,21 @@ public class LLNI extends Gen {
|
||||
}
|
||||
|
||||
protected void write(OutputStream o, TypeElement clazz) throws Util.Exit {
|
||||
String cname = mangleClassName(clazz.getQualifiedName().toString());
|
||||
PrintWriter pw = wrapWriter(o);
|
||||
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
|
||||
try {
|
||||
String cname = mangleClassName(clazz.getQualifiedName().toString());
|
||||
PrintWriter pw = wrapWriter(o);
|
||||
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
|
||||
} catch (TypeSignature.SignatureException e) {
|
||||
util.error("llni.sigerror", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
protected void generateDeclsForClass(PrintWriter pw,
|
||||
TypeElement clazz, String cname) throws Util.Exit {
|
||||
TypeElement clazz, String cname)
|
||||
throws TypeSignature.SignatureException, Util.Exit {
|
||||
doneHandleTypes = new HashSet<String>();
|
||||
/* The following handle types are predefined in "typedefs.h". Suppress
|
||||
inclusion in the output by generating them "into the blue" here. */
|
||||
@ -127,7 +132,8 @@ public class LLNI extends Gen {
|
||||
.replace(innerDelim, '_');
|
||||
}
|
||||
|
||||
protected void forwardDecls(PrintWriter pw, TypeElement clazz) {
|
||||
protected void forwardDecls(PrintWriter pw, TypeElement clazz)
|
||||
throws TypeSignature.SignatureException {
|
||||
TypeElement object = elems.getTypeElement("java.lang.Object");
|
||||
if (clazz.equals(object))
|
||||
return;
|
||||
@ -403,7 +409,7 @@ public class LLNI extends Gen {
|
||||
|
||||
protected void methodSectionForClass(PrintWriter pw,
|
||||
TypeElement clazz, String cname)
|
||||
throws Util.Exit {
|
||||
throws TypeSignature.SignatureException, Util.Exit {
|
||||
String methods = methodDecls(clazz, cname);
|
||||
|
||||
if (methods.length() != 0) {
|
||||
@ -418,7 +424,8 @@ public class LLNI extends Gen {
|
||||
}
|
||||
}
|
||||
|
||||
protected String methodDecls(TypeElement clazz, String cname) throws Util.Exit {
|
||||
protected String methodDecls(TypeElement clazz, String cname)
|
||||
throws TypeSignature.SignatureException, Util.Exit {
|
||||
|
||||
String res = "";
|
||||
for (ExecutableElement method: methods) {
|
||||
@ -430,7 +437,7 @@ public class LLNI extends Gen {
|
||||
|
||||
protected String methodDecl(ExecutableElement method,
|
||||
TypeElement clazz, String cname)
|
||||
throws Util.Exit {
|
||||
throws TypeSignature.SignatureException, Util.Exit {
|
||||
String res = null;
|
||||
|
||||
TypeMirror retType = types.erasure(method.getReturnType());
|
||||
@ -474,7 +481,8 @@ public class LLNI extends Gen {
|
||||
}
|
||||
|
||||
protected final String jniMethodName(ExecutableElement method, String cname,
|
||||
boolean longName) {
|
||||
boolean longName)
|
||||
throws TypeSignature.SignatureException {
|
||||
String res = "Java_" + cname + "_" + method.getSimpleName();
|
||||
|
||||
if (longName) {
|
||||
|
@ -114,7 +114,7 @@ public class Mangle {
|
||||
}
|
||||
|
||||
public String mangleMethod(ExecutableElement method, TypeElement clazz,
|
||||
int mtype) {
|
||||
int mtype) throws TypeSignature.SignatureException {
|
||||
StringBuffer result = new StringBuffer(100);
|
||||
result.append("Java_");
|
||||
|
||||
|
@ -51,7 +51,13 @@ import javax.lang.model.util.SimpleTypeVisitor7;
|
||||
* @author Sucheta Dambalkar
|
||||
*/
|
||||
|
||||
public class TypeSignature{
|
||||
public class TypeSignature {
|
||||
static class SignatureException extends Exception {
|
||||
private static final long serialVersionUID = 1L;
|
||||
SignatureException(String reason) {
|
||||
super(reason);
|
||||
}
|
||||
}
|
||||
|
||||
Elements elems;
|
||||
|
||||
@ -78,14 +84,15 @@ public class TypeSignature{
|
||||
/*
|
||||
* Returns the type signature of a field according to JVM specs
|
||||
*/
|
||||
public String getTypeSignature(String javasignature){
|
||||
public String getTypeSignature(String javasignature) throws SignatureException {
|
||||
return getParamJVMSignature(javasignature);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns the type signature of a method according to JVM specs
|
||||
*/
|
||||
public String getTypeSignature(String javasignature, TypeMirror returnType){
|
||||
public String getTypeSignature(String javasignature, TypeMirror returnType)
|
||||
throws SignatureException {
|
||||
String signature = null; //Java type signature.
|
||||
String typeSignature = null; //Internal type signature.
|
||||
List<String> params = new ArrayList<String>(); //List of parameters.
|
||||
@ -166,7 +173,7 @@ public class TypeSignature{
|
||||
/*
|
||||
* Returns internal signature of a parameter.
|
||||
*/
|
||||
private String getParamJVMSignature(String paramsig) {
|
||||
private String getParamJVMSignature(String paramsig) throws SignatureException {
|
||||
String paramJVMSig = "";
|
||||
String componentType ="";
|
||||
|
||||
@ -197,7 +204,7 @@ public class TypeSignature{
|
||||
/*
|
||||
* Returns internal signature of a component.
|
||||
*/
|
||||
private String getComponentType(String componentType){
|
||||
private String getComponentType(String componentType) throws SignatureException {
|
||||
|
||||
String JVMSig = "";
|
||||
|
||||
@ -216,8 +223,7 @@ public class TypeSignature{
|
||||
TypeElement classNameDoc = elems.getTypeElement(componentType);
|
||||
|
||||
if(classNameDoc == null){
|
||||
System.out.println("Invalid class type for " + componentType);
|
||||
new Exception().printStackTrace();
|
||||
throw new SignatureException(componentType);
|
||||
}else {
|
||||
String classname = classNameDoc.getQualifiedName().toString();
|
||||
String newclassname = classname.replace('.', '/');
|
||||
|
@ -45,6 +45,8 @@ jni.llni.mixed=\
|
||||
Can''t mix options -jni and -llni. Try -help.
|
||||
jni.no.stubs=\
|
||||
JNI does not require stubs, please refer to the JNI documentation.
|
||||
jni.sigerror=\
|
||||
Cannot determine signature for {0}
|
||||
dir.file.mixed=\
|
||||
Can''t mix options -d and -o. Try -help.
|
||||
no.classes.specified=\
|
||||
@ -94,7 +96,7 @@ main.opt.d=\
|
||||
\ -d <dir> Output directory
|
||||
main.opt.v=\
|
||||
\ -v -verbose Enable verbose output
|
||||
main.opt.help=\
|
||||
main.opt.h=\
|
||||
\ -h --help -? Print this message
|
||||
main.opt.version=\
|
||||
\ -version Print version information
|
||||
|
@ -31,6 +31,8 @@ import java.io.*;
|
||||
import java.util.*;
|
||||
import javax.tools.*;
|
||||
import com.sun.tools.javac.file.*;
|
||||
import com.sun.tools.javac.file.ZipArchive.ZipFileObject;
|
||||
import com.sun.tools.javac.file.ZipFileIndexArchive.ZipFileIndexFileObject;
|
||||
|
||||
public class T6705935 {
|
||||
public static void main(String... args) throws Exception {
|
||||
@ -43,11 +45,22 @@ public class T6705935 {
|
||||
java_home = java_home.getParentFile();
|
||||
|
||||
JavaCompiler c = ToolProvider.getSystemJavaCompiler();
|
||||
JavaFileManager fm = c.getStandardFileManager(null, null, null);
|
||||
StandardJavaFileManager fm = c.getStandardFileManager(null, null, null);
|
||||
//System.err.println("platform class path: " + asList(fm.getLocation(StandardLocation.PLATFORM_CLASS_PATH)));
|
||||
|
||||
for (JavaFileObject fo: fm.list(StandardLocation.PLATFORM_CLASS_PATH,
|
||||
"java.lang",
|
||||
Collections.singleton(JavaFileObject.Kind.CLASS),
|
||||
false)) {
|
||||
test++;
|
||||
|
||||
if (!(fo instanceof ZipFileObject || fo instanceof ZipFileIndexFileObject)) {
|
||||
System.out.println("Skip " + fo.getClass().getSimpleName() + " " + fo.getName());
|
||||
skip++;
|
||||
continue;
|
||||
}
|
||||
|
||||
//System.err.println(fo.getName());
|
||||
String p = fo.getName();
|
||||
int bra = p.indexOf("(");
|
||||
int ket = p.indexOf(")");
|
||||
@ -61,5 +74,26 @@ public class T6705935 {
|
||||
throw new Exception("bad path: " + p);
|
||||
|
||||
}
|
||||
|
||||
if (test == 0)
|
||||
throw new Exception("no files found");
|
||||
|
||||
if (skip == 0)
|
||||
System.out.println(test + " files found");
|
||||
else
|
||||
System.out.println(test + " files found, " + skip + " files skipped");
|
||||
|
||||
if (test == skip)
|
||||
System.out.println("Warning: all files skipped; no platform classes found in zip files.");
|
||||
}
|
||||
|
||||
private <T> List<T> asList(Iterable<? extends T> items) {
|
||||
List<T> list = new ArrayList<T>();
|
||||
for (T item: items)
|
||||
list.add(item);
|
||||
return list;
|
||||
}
|
||||
|
||||
private int skip;
|
||||
private int test;
|
||||
}
|
||||
|
@ -1,4 +1,26 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
@Deprecated
|
||||
class A {
|
||||
class A {}
|
||||
class A extends Missing {
|
||||
}
|
||||
|
@ -40,7 +40,7 @@ import java.util.*;
|
||||
* compiler.properties bundle. A list of exceptions may be given in the
|
||||
* not-yet.txt file. Entries on the not-yet.txt list should not be
|
||||
* covered by examples.
|
||||
* When new keys are added to the resource buncle, it is strongly recommended
|
||||
* When new keys are added to the resource bundle, it is strongly recommended
|
||||
* that corresponding new examples be added here, if at all practical, instead
|
||||
* of simply and lazily being added to the not-yet.txt list.
|
||||
*/
|
||||
|
@ -177,12 +177,14 @@ public class FileManager
|
||||
}
|
||||
|
||||
void checkRead() throws IOException {
|
||||
if (cantRead != null && cantRead.matcher(getName()).matches())
|
||||
String canonName = getName().replace(File.separatorChar, '/');
|
||||
if (cantRead != null && cantRead.matcher(canonName).matches())
|
||||
throw new IOException("FileManager: Can't read");
|
||||
}
|
||||
|
||||
void checkWrite() throws IOException {
|
||||
if (cantWrite != null && cantWrite.matcher(getName()).matches())
|
||||
String canonName = getName().replace(File.separatorChar, '/');
|
||||
if (cantWrite != null && cantWrite.matcher(canonName).matches())
|
||||
throw new IOException("FileManager: Can't write");
|
||||
}
|
||||
|
||||
|
111
langtools/test/tools/javac/meth/TestCP.java
Normal file
111
langtools/test/tools/javac/meth/TestCP.java
Normal file
@ -0,0 +1,111 @@
|
||||
/*
|
||||
* Copyright (c) 2010, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 6991980
|
||||
* @summary polymorphic signature calls don't share the same CP entries
|
||||
* @run main TestCP
|
||||
*/
|
||||
|
||||
import com.sun.tools.classfile.Instruction;
|
||||
import com.sun.tools.classfile.Attribute;
|
||||
import com.sun.tools.classfile.ClassFile;
|
||||
import com.sun.tools.classfile.Code_attribute;
|
||||
import com.sun.tools.classfile.ConstantPool.*;
|
||||
import com.sun.tools.classfile.Method;
|
||||
|
||||
import java.dyn.*;
|
||||
import java.io.*;
|
||||
|
||||
public class TestCP {
|
||||
|
||||
static class TestClass {
|
||||
void test(MethodHandle mh) throws Throwable {
|
||||
Number n = mh.<Number>invokeExact("daddy",1,'n');
|
||||
n = (Number)mh.invokeExact("bunny",1,'d');
|
||||
}
|
||||
}
|
||||
|
||||
static final String PS_TYPE = "(Ljava/lang/String;IC)Ljava/lang/Number;";
|
||||
static final int PS_CALLS_COUNT = 2;
|
||||
static final String SUBTEST_NAME = TestClass.class.getName() + ".class";
|
||||
static final String TEST_METHOD_NAME = "test";
|
||||
|
||||
public static void main(String... args) throws Exception {
|
||||
new TestCP().run();
|
||||
}
|
||||
|
||||
public void run() throws Exception {
|
||||
String workDir = System.getProperty("test.classes");
|
||||
File compiledTest = new File(workDir, SUBTEST_NAME);
|
||||
verifyMethodHandleInvocationDescriptors(compiledTest);
|
||||
}
|
||||
|
||||
void verifyMethodHandleInvocationDescriptors(File f) {
|
||||
System.err.println("verify: " + f);
|
||||
try {
|
||||
int count = 0;
|
||||
ClassFile cf = ClassFile.read(f);
|
||||
Method testMethod = null;
|
||||
for (Method m : cf.methods) {
|
||||
if (m.getName(cf.constant_pool).equals(TEST_METHOD_NAME)) {
|
||||
testMethod = m;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (testMethod == null) {
|
||||
throw new Error("Test method not found");
|
||||
}
|
||||
Code_attribute ea = (Code_attribute)testMethod.attributes.get(Attribute.Code);
|
||||
if (testMethod == null) {
|
||||
throw new Error("Code attribute for test() method not found");
|
||||
}
|
||||
int instr_count = 0;
|
||||
int cp_entry = -1;
|
||||
|
||||
for (Instruction i : ea.getInstructions()) {
|
||||
if (i.getMnemonic().equals("invokevirtual")) {
|
||||
instr_count++;
|
||||
if (cp_entry == -1) {
|
||||
cp_entry = i.getUnsignedShort(1);
|
||||
} else if (cp_entry != i.getUnsignedShort(1)) {
|
||||
throw new Error("Unexpected CP entry in polymorphic signature call");
|
||||
}
|
||||
CONSTANT_Methodref_info methRef =
|
||||
(CONSTANT_Methodref_info)cf.constant_pool.get(cp_entry);
|
||||
String type = methRef.getNameAndTypeInfo().getType();
|
||||
if (!type.equals(PS_TYPE)) {
|
||||
throw new Error("Unexpected type in polymorphic signature call: " + type);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (instr_count != PS_CALLS_COUNT) {
|
||||
throw new Error("Wrong number of polymorphic signature call found: " + instr_count);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
throw new Error("error reading " + f +": " + e);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,96 @@
|
||||
/*
|
||||
* Copyright (c) 2010, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 6988836
|
||||
* @summary A new JavacElements is created for each round of annotation processing
|
||||
* @library ../../../lib
|
||||
* @build JavacTestingAbstractProcessor TestContext
|
||||
* @compile/process -processor TestContext -XprintRounds TestContext
|
||||
*/
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
import javax.annotation.processing.*;
|
||||
import javax.lang.model.element.*;
|
||||
import javax.tools.*;
|
||||
import static javax.tools.Diagnostic.Kind.*;
|
||||
|
||||
import com.sun.source.util.Trees;
|
||||
import com.sun.tools.javac.api.JavacTrees;
|
||||
import com.sun.tools.javac.model.JavacElements;
|
||||
import com.sun.tools.javac.model.JavacTypes;
|
||||
import com.sun.tools.javac.processing.JavacProcessingEnvironment;
|
||||
import com.sun.tools.javac.util.Context;
|
||||
|
||||
public class TestContext extends JavacTestingAbstractProcessor {
|
||||
|
||||
Trees treeUtils;
|
||||
int round = 0;
|
||||
|
||||
@Override
|
||||
public void init(ProcessingEnvironment pEnv) {
|
||||
super.init(pEnv);
|
||||
treeUtils = Trees.instance(processingEnv);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
|
||||
round++;
|
||||
|
||||
JavacProcessingEnvironment jpe = (JavacProcessingEnvironment) processingEnv;
|
||||
Context c = jpe.getContext();
|
||||
check(c.get(JavacElements.class), eltUtils);
|
||||
check(c.get(JavacTypes.class), typeUtils);
|
||||
check(c.get(JavacTrees.class), treeUtils);
|
||||
|
||||
final int MAXROUNDS = 3;
|
||||
if (round < MAXROUNDS)
|
||||
generateSource("Gen" + round);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
<T> void check(T actual, T expected) {
|
||||
// messager.printMessage(NOTE, "expect: " + expected);
|
||||
// messager.printMessage(NOTE, "actual: " + actual);
|
||||
|
||||
if (actual != expected) {
|
||||
messager.printMessage(ERROR,
|
||||
"round " + round + " unexpected value for " + expected.getClass().getName() + ": " + actual);
|
||||
}
|
||||
}
|
||||
|
||||
void generateSource(String name) {
|
||||
String text = "class " + name + " { }\n";
|
||||
|
||||
try (Writer out = filer.createSourceFile(name).openWriter()) {
|
||||
out.write(text);
|
||||
} catch (IOException e) {
|
||||
throw new Error(e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Copyright (c) 2010, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Vector;
|
||||
|
||||
class test {
|
||||
|
||||
public String m(List<? extends String> v, String s ) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public String m2(Vector<String> vs, String s) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public void m3(testclass<String>,
|
||||
}
|
||||
|
||||
class testclass<T> {
|
||||
T t;
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Copyright (c) 2010, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 6988407
|
||||
* @summary javac crashes running processor on errant code; it used to print error message
|
||||
* @library ../../../lib
|
||||
* @build JavacTestingAbstractProcessor TestParseErrors
|
||||
* @compile/fail/ref=TestParseErrors.out -XDrawDiagnostics -proc:only -processor TestParseErrors ParseErrors.java
|
||||
*/
|
||||
|
||||
import java.util.*;
|
||||
import javax.annotation.processing.*;
|
||||
import javax.lang.model.element.*;
|
||||
|
||||
public class TestParseErrors extends JavacTestingAbstractProcessor {
|
||||
|
||||
public boolean process(Set<? extends TypeElement> annotations,
|
||||
RoundEnvironment roundEnvironment) {
|
||||
throw new Error("Should not be called");
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
ParseErrors.java:37:37: compiler.err.expected: token.identifier
|
||||
ParseErrors.java:38:1: compiler.err.illegal.start.of.type
|
||||
ParseErrors.java:38:2: compiler.err.expected: ')'
|
||||
ParseErrors.java:40:6: compiler.err.expected: ';'
|
||||
ParseErrors.java:40:20: compiler.err.illegal.start.of.type
|
||||
ParseErrors.java:41:5: compiler.err.expected: '('
|
||||
ParseErrors.java:41:8: compiler.err.expected: token.identifier
|
||||
7 errors
|
@ -22,5 +22,5 @@
|
||||
*/
|
||||
|
||||
public class FileWithTabs {
|
||||
public void tabbedMethod() {}
|
||||
\tpublic void tabbedMethod() {}
|
||||
}
|
||||
|
@ -30,7 +30,7 @@
|
||||
*/
|
||||
|
||||
import com.sun.javadoc.*;
|
||||
import java.io.File;
|
||||
import java.io.*;
|
||||
import static com.sun.tools.javadoc.Main.execute;
|
||||
|
||||
public class T4994049 extends Doclet {
|
||||
@ -52,12 +52,47 @@ public class T4994049 extends Doclet {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static void main(String... args) {
|
||||
public static void main(String... args) throws Exception {
|
||||
File testSrc = new File(System.getProperty("test.src"));
|
||||
File tmpSrc = new File("tmpSrc");
|
||||
initTabs(testSrc, tmpSrc);
|
||||
|
||||
for (String file : args) {
|
||||
File source = new File(System.getProperty("test.src", "."), file);
|
||||
if (execute("javadoc", "T4994049", T4994049.class.getClassLoader(),
|
||||
new String[]{source.getPath()} ) != 0)
|
||||
throw new Error();
|
||||
File source = new File(tmpSrc, file);
|
||||
int rc = execute("javadoc", "T4994049", T4994049.class.getClassLoader(),
|
||||
new String[]{ source.getPath() } );
|
||||
if (rc != 0)
|
||||
throw new Error("Unexpected return code from javadoc: " + rc);
|
||||
}
|
||||
}
|
||||
|
||||
static void initTabs(File from, File to) throws IOException {
|
||||
for (File f: from.listFiles()) {
|
||||
File t = new File(to, f.getName());
|
||||
if (f.isDirectory()) {
|
||||
initTabs(f, t);
|
||||
} else if (f.getName().endsWith(".java")) {
|
||||
write(t, read(f).replace("\\t", "\t"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static String read(File f) throws IOException {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
try (BufferedReader in = new BufferedReader(new FileReader(f))) {
|
||||
String line;
|
||||
while ((line = in.readLine()) != null) {
|
||||
sb.append(line);
|
||||
sb.append("\n");
|
||||
}
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
static void write(File f, String s) throws IOException {
|
||||
f.getParentFile().mkdirs();
|
||||
try (Writer out = new FileWriter(f)) {
|
||||
out.write(s);
|
||||
}
|
||||
}
|
||||
|
||||
|
36
langtools/test/tools/javah/4942232/ParamClassTest.java
Normal file
36
langtools/test/tools/javah/4942232/ParamClassTest.java
Normal file
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Copyright (c) 2010, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
public class ParamClassTest {
|
||||
static {
|
||||
System.loadLibrary("Test");
|
||||
}
|
||||
|
||||
public native void method(Param s);
|
||||
|
||||
public static void main(String[] a) {
|
||||
}
|
||||
}
|
||||
|
||||
class Param {
|
||||
}
|
141
langtools/test/tools/javah/4942232/Test.java
Normal file
141
langtools/test/tools/javah/4942232/Test.java
Normal file
@ -0,0 +1,141 @@
|
||||
/*
|
||||
* Copyright (c) 2010, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 4942232
|
||||
* @summary missing param class processes without error
|
||||
* @build ParamClassTest Test
|
||||
* @run main Test
|
||||
*/
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
|
||||
public class Test {
|
||||
public static void main(String... args) throws Exception {
|
||||
new Test().run();
|
||||
}
|
||||
|
||||
void run() throws Exception {
|
||||
File testSrc = new File(System.getProperty("test.src"));
|
||||
File testClasses = new File(System.getProperty("test.classes"));
|
||||
|
||||
// standard use of javah on valid class file
|
||||
String[] test1Args = {
|
||||
"-d", mkdir("test1/out").getPath(),
|
||||
"-classpath", testClasses.getPath(),
|
||||
"ParamClassTest"
|
||||
};
|
||||
test(test1Args, 0);
|
||||
|
||||
// extended use of javah on valid source file
|
||||
String[] test2Args = {
|
||||
"-d", mkdir("test2/out").getPath(),
|
||||
"-classpath", testSrc.getPath(),
|
||||
"ParamClassTest"
|
||||
};
|
||||
test(test2Args, 0);
|
||||
|
||||
// javah on class file with missing referents
|
||||
File test3Classes = mkdir("test3/classes");
|
||||
copy(new File(testClasses, "ParamClassTest.class"), test3Classes);
|
||||
String[] test3Args = {
|
||||
"-d", mkdir("test3/out").getPath(),
|
||||
"-classpath", test3Classes.getPath(),
|
||||
"ParamClassTest"
|
||||
};
|
||||
test(test3Args, 1);
|
||||
|
||||
// javah on source file with missing referents
|
||||
File test4Src = mkdir("test4/src");
|
||||
String paramClassTestSrc = readFile(new File(testSrc, "ParamClassTest.java"));
|
||||
writeFile(new File(test4Src, "ParamClassTest.java"),
|
||||
paramClassTestSrc.replaceAll("class Param \\{\\s+\\}", ""));
|
||||
String[] test4Args = {
|
||||
"-d", mkdir("test4/out").getPath(),
|
||||
"-classpath", test4Src.getPath(),
|
||||
"ParamClassTest"
|
||||
};
|
||||
test(test4Args, 15);
|
||||
|
||||
if (errors > 0)
|
||||
throw new Exception(errors + " errors occurred");
|
||||
}
|
||||
|
||||
void test(String[] args, int expect) {
|
||||
System.err.println("test: " + Arrays.asList(args));
|
||||
int rc = javah(args);
|
||||
if (rc != expect)
|
||||
error("Unexpected return code: " + rc + "; expected: " + expect);
|
||||
}
|
||||
|
||||
int javah(String... args) {
|
||||
StringWriter sw = new StringWriter();
|
||||
PrintWriter pw = new PrintWriter(sw);
|
||||
int rc = com.sun.tools.javah.Main.run(args, pw);
|
||||
pw.close();
|
||||
String out = sw.toString();
|
||||
if (!out.isEmpty())
|
||||
System.err.println(out);
|
||||
return rc;
|
||||
}
|
||||
|
||||
File mkdir(String path) {
|
||||
File f = new File(path);
|
||||
f.mkdirs();
|
||||
return f;
|
||||
}
|
||||
|
||||
void copy(File from, File to) throws IOException {
|
||||
if (to.isDirectory())
|
||||
to = new File(to, from.getName());
|
||||
try (DataInputStream in = new DataInputStream(new FileInputStream(from));
|
||||
FileOutputStream out = new FileOutputStream(to)) {
|
||||
byte[] buf = new byte[(int) from.length()];
|
||||
in.readFully(buf);
|
||||
out.write(buf);
|
||||
}
|
||||
}
|
||||
|
||||
String readFile(File f) throws IOException {
|
||||
try (DataInputStream in = new DataInputStream(new FileInputStream(f))) {
|
||||
byte[] buf = new byte[(int) f.length()];
|
||||
in.readFully(buf);
|
||||
return new String(buf);
|
||||
}
|
||||
}
|
||||
|
||||
void writeFile(File f, String body) throws IOException {
|
||||
try (FileWriter out = new FileWriter(f)) {
|
||||
out.write(body);
|
||||
}
|
||||
}
|
||||
|
||||
void error(String msg) {
|
||||
System.err.println(msg);
|
||||
errors++;
|
||||
}
|
||||
|
||||
int errors;
|
||||
}
|
81
langtools/test/tools/javah/TestHelpOpts.java
Normal file
81
langtools/test/tools/javah/TestHelpOpts.java
Normal file
@ -0,0 +1,81 @@
|
||||
/*
|
||||
* Copyright (c) 2010, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 6893932 6990390
|
||||
* @summary javah help screen lists -h and -? but does not accept them
|
||||
*/
|
||||
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
|
||||
public class TestHelpOpts {
|
||||
public static void main(String... args) throws Exception {
|
||||
new TestHelpOpts().run();
|
||||
}
|
||||
|
||||
void run() throws Exception {
|
||||
Locale prev = Locale.getDefault();
|
||||
try {
|
||||
Locale.setDefault(Locale.ENGLISH);
|
||||
|
||||
String[] opts = { "-h", "-help", "-?", "--help" };
|
||||
for (String opt: opts)
|
||||
test(opt);
|
||||
} finally {
|
||||
Locale.setDefault(prev);
|
||||
}
|
||||
|
||||
if (errors > 0)
|
||||
throw new Exception(errors + " errors occurred");
|
||||
}
|
||||
|
||||
void test(String opt) {
|
||||
System.err.println("test " + opt);
|
||||
String[] args = { opt };
|
||||
|
||||
StringWriter sw = new StringWriter();
|
||||
PrintWriter pw = new PrintWriter(sw);
|
||||
int rc = com.sun.tools.javah.Main.run(args, pw);
|
||||
pw.close();
|
||||
String out = sw.toString();
|
||||
if (!out.isEmpty())
|
||||
System.err.println(out);
|
||||
if (rc != 0)
|
||||
error("Unexpected exit: rc=" + rc);
|
||||
|
||||
String flat = out.replaceAll("\\s+", " "); // canonicalize whitespace
|
||||
if (!flat.contains("Usage: javah [options] <classes> where [options] include:"))
|
||||
error("expected text not found");
|
||||
if (flat.contains("main.opt"))
|
||||
error("key not found in resource bundle: " + flat.replaceAll(".*(main.opt.[^ ]*).*", "$1"));
|
||||
}
|
||||
|
||||
void error(String msg) {
|
||||
System.err.println(msg);
|
||||
errors++;
|
||||
}
|
||||
|
||||
int errors;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user