Generator: Support arbitrary @AutoResultSize expressions. Make Buffer result sizes long instead of int

This commit is contained in:
Elias Naur 2006-12-20 19:19:56 +00:00
parent 17d7df3f19
commit eaed716958
4 changed files with 19 additions and 27 deletions

View File

@ -33,8 +33,8 @@ package org.lwjgl.util.generator;
/**
*
* AutoResultSize specifies that a parameter should determine
* the size of a Buffer result.
* AutoResultSize specifies the size of a returned Buffer
* as an expression.
*
* @author elias_naur <elias_naur@users.sourceforge.net>
* @version $Revision$
@ -44,6 +44,7 @@ package org.lwjgl.util.generator;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
@Target(ElementType.PARAMETER)
@Target(ElementType.METHOD)
public @interface AutoResultSize {
String value(); // The size as a java expression
}

View File

@ -123,12 +123,14 @@ public class JavaMethodsGenerator {
if (!first_parameter)
writer.print(", ");
first_parameter = false;
writer.print("int " + Utils.RESULT_SIZE_NAME);
if (method.getAnnotation(CachedResult.class) != null) {
writer.print("long " + Utils.RESULT_SIZE_NAME);
}
if (method.getAnnotation(CachedResult.class) != null) {
if (!first_parameter)
writer.print(", ");
printResultType(writer, method);
writer.print(" " + Utils.CACHED_BUFFER_NAME);
}
first_parameter = false;
printResultType(writer, method);
writer.print(" " + Utils.CACHED_BUFFER_NAME);
}
return first_parameter;
}
@ -382,13 +384,13 @@ public class JavaMethodsGenerator {
if (!first_parameter)
writer.print(", ");
first_parameter = false;
ParameterDeclaration auto_result_size_parameter = Utils.getAutoResultSizeParameter(method);
String result_size_parameter_name;
if (auto_result_size_parameter == null)
result_size_parameter_name = Utils.RESULT_SIZE_NAME;
AutoResultSize auto_result_size_annotation = method.getAnnotation(AutoResultSize.class);
String result_size_expression;
if (auto_result_size_annotation == null)
result_size_expression = Utils.RESULT_SIZE_NAME;
else
result_size_parameter_name = auto_result_size_parameter.getSimpleName();
Utils.printExtraCallArguments(writer, method, result_size_parameter_name);
result_size_expression = auto_result_size_annotation.value();
Utils.printExtraCallArguments(writer, method, result_size_expression);
}
return first_parameter;
}

View File

@ -95,7 +95,7 @@ public class NativeMethodStubsGenerator {
writer.print("(JNIEnv *env, jclass clazz");
generateParameters(writer, method.getParameters(), mode);
if (Utils.getNIOBufferType(result_type) != null) {
writer.print(", jint " + Utils.RESULT_SIZE_NAME);
writer.print(", jlong " + Utils.RESULT_SIZE_NAME);
if (method.getAnnotation(CachedResult.class) != null)
writer.print(", jobject " + Utils.CACHED_BUFFER_NAME);
}

View File

@ -144,17 +144,6 @@ public class Utils {
}
}
public static ParameterDeclaration getAutoResultSizeParameter(MethodDeclaration method) {
ParameterDeclaration result = null;
for (ParameterDeclaration param : method.getParameters())
if (param.getAnnotation(AutoResultSize.class) != null) {
if (result != null)
throw new RuntimeException(method + " contains multiple AutoResultSize annotations");
result = param;
}
return result;
}
public static AnnotationMirror getParameterAutoAnnotation(ParameterDeclaration param) {
for (AnnotationMirror annotation : param.getAnnotationMirrors())
if (NativeTypeTranslator.getAnnotation(annotation, Auto.class) != null)
@ -210,7 +199,7 @@ public class Utils {
}
public static boolean needResultSize(MethodDeclaration method) {
return getNIOBufferType(getMethodReturnType(method)) != null && getAutoResultSizeParameter(method) == null;
return getNIOBufferType(getMethodReturnType(method)) != null && method.getAnnotation(AutoResultSize.class) == null;
}
public static void printExtraCallArguments(PrintWriter writer, MethodDeclaration method, String size_parameter_name) {