From cc8796ca9edbb63d4a1d139149f05259913013ba Mon Sep 17 00:00:00 2001 From: Kenneth Russel Date: Sun, 15 Jan 2006 03:24:40 +0000 Subject: Moved GlueGen out of the JOGL workspace and into its own project. Restructured JOGL and JOAL build processes to separately invoke GlueGen's main build.xml before using it to generate their code. Refactored OS/CPU detection code into gluegen-cpptasks.xml build file in GlueGen workspace, which is now imported by both the JOGL and JOAL build processes. Unfortunately it seems to be somewhat difficult to completely factor out the C compiler configuration into the GlueGen workspace so this has been left for a later date. Added missed ALProcAddressLookup file to JOAL workspace. Updated JOGL and JOAL build documentation. More documentation for the GlueGen workspace is forthcoming. git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/../svn-server-sync/gluegen/trunk@3 a78bb65f-1512-4460-ba86-f6dc96a7bf27 --- src/java/com/sun/gluegen/ant/StaticGLGenTask.java | 303 ++++++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100644 src/java/com/sun/gluegen/ant/StaticGLGenTask.java diff --git a/src/java/com/sun/gluegen/ant/StaticGLGenTask.java b/src/java/com/sun/gluegen/ant/StaticGLGenTask.java new file mode 100644 index 000000000..255ab8a1a --- /dev/null +++ b/src/java/com/sun/gluegen/ant/StaticGLGenTask.java @@ -0,0 +1,303 @@ +package com.sun.gluegen.ant; + +/* + * StaticGLGenTask.java + * Copyright (C) 2003 Rob Grzywinski (rgrzywinski@realityinteractive.com) + * + * Copying, distribution and use of this software in source and binary + * forms, with or without modification, is permitted provided that the + * following conditions are met: + * + * Distributions of source code must reproduce the copyright notice, + * this list of conditions and the following disclaimer in the source + * code header files; and Distributions of binary code must reproduce + * the copyright notice, this list of conditions and the following + * disclaimer in the documentation, Read me file, license file and/or + * other materials provided with the software distribution. + * + * The names of Sun Microsystems, Inc. ("Sun") and/or the copyright + * holder may not be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS," WITHOUT A WARRANTY OF ANY + * KIND. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND + * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, NON-INTERFERENCE, ACCURACY OF + * INFORMATIONAL CONTENT OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. THE + * COPYRIGHT HOLDER, SUN AND SUN'S LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL THE + * COPYRIGHT HOLDER, SUN OR SUN'S LICENSORS BE LIABLE FOR ANY LOST + * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, + * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND + * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR + * INABILITY TO USE THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGES. YOU ACKNOWLEDGE THAT THIS SOFTWARE IS NOT + * DESIGNED, LICENSED OR INTENDED FOR USE IN THE DESIGN, CONSTRUCTION, + * OPERATION OR MAINTENANCE OF ANY NUCLEAR FACILITY. THE COPYRIGHT + * HOLDER, SUN AND SUN'S LICENSORS DISCLAIM ANY EXPRESS OR IMPLIED + * WARRANTY OF FITNESS FOR SUCH USES. + */ + +import java.io.IOException; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.DirectoryScanner; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.taskdefs.Execute; +import org.apache.tools.ant.taskdefs.LogStreamHandler; +import org.apache.tools.ant.types.CommandlineJava; +import org.apache.tools.ant.types.FileSet; +import org.apache.tools.ant.types.Path; +import org.apache.tools.ant.types.PatternSet; +import org.apache.tools.ant.util.JavaEnvUtils; + +/** + *

An ANT {@link org.apache.tools.ant.Task} + * for using {@link com.sun.gluegen.opengl.BuildStaticGLInfo}.

+ * + *

Usage:

+ *
+    <staticglgen package="[generated files package]" 
+                    headers="[file pattern of GL headers]"
+                    outputdir="[directory to output the generated files]" />
+ * 
+ * + * @author Rob Grzywinski rgrzywinski@yahoo.com + */ +// FIXME: blow out javadoc +public class StaticGLGenTask extends Task +{ + /** + *

The {@link com.sun.gluegen.opengl.BuildStaticGLInfo} classname.

+ */ + private static final String GL_GEN = "com.sun.gluegen.opengl.BuildStaticGLInfo"; + + // ========================================================================= + /** + *

The {@link org.apache.tools.ant.types.CommandlineJava} that is used + * to execute {@link com.sun.gluegen.opengl.BuildStaticGLInfo}.

+ */ + private CommandlineJava glgenCommandline; + + // ========================================================================= + /** + *

The package name for the generated files.

+ */ + private String packageName; + + /** + *

The output directory.

+ */ + private String outputDirectory; + + /** + *

The {@link org.apache.tools.ant.types.FileSet} of GL headers.

+ */ + private FileSet headerSet = new FileSet(); + + // ========================================================================= + /** + *

Create and add the VM and classname to {@link org.apache.tools.ant.types.CommandlineJava}.

+ */ + public StaticGLGenTask() + { + // create the CommandlineJava that will be used to call BuildStaticGLInfo + glgenCommandline = new CommandlineJava(); + + // set the VM and classname in the commandline + glgenCommandline.setVm(JavaEnvUtils.getJreExecutable("java")); + glgenCommandline.setClassname(GL_GEN); + } + + // ========================================================================= + // ANT getters and setters + /** + *

Set the package name for the generated files. This is called by ANT.

+ * + * @param packageName the name of the package for the generated files + */ + public void setPackage(String packageName) + { + log( ("Setting package name to: " + packageName), Project.MSG_VERBOSE); + this.packageName = packageName; + } + + /** + *

Set the output directory. This is called by ANT.

+ * + * @param directory the output directory + */ + public void setOutputDir(String directory) + { + log( ("Setting output directory to: " + directory), + Project.MSG_VERBOSE); + this.outputDirectory = directory; + } + + /** + *

Add a header file to the list. This is called by ANT for a nested + * element.

+ * + * @return {@link org.apache.tools.ant.types.PatternSet.NameEntry} + */ + public PatternSet.NameEntry createHeader() + { + return headerSet.createInclude(); + } + + /** + *

Add a header file to the list. This is called by ANT for a nested + * element.

+ * + * @return {@link org.apache.tools.ant.types.PatternSet.NameEntry} + */ + public PatternSet.NameEntry createHeadersFile() + { + return headerSet.createIncludesFile(); + } + + /** + *

Set the set of header patterns. Patterns may be separated by a comma + * or a space. This is called by ANT.

+ * + * @param headers the string containing the header patterns + */ + public void setHeaders(String headers) + { + headerSet.setIncludes(headers); + } + + /** + *

Add an optional classpath that defines the location of {@link com.sun.gluegen.opengl.BuildStaticGLInfo} + * and BuildStaticGLInfo's dependencies.

+ * + * @returns {@link org.apache.tools.ant.types.Path} + */ + public Path createClasspath() + { + return glgenCommandline.createClasspath(project).createPath(); + } + + // ========================================================================= + /** + *

Run the task. This involves validating the set attributes, creating + * the command line to be executed and finally executing the command.

+ * + * @see org.apache.tools.ant.Task#execute() + */ + public void execute() + throws BuildException + { + // validate that all of the required attributes have been set + validateAttributes(); + + // TODO: add logic to determine if the generated file needs to be + // regenerated + + // add the attributes to the CommandlineJava + addAttributes(); + + log(glgenCommandline.describeCommand(), Project.MSG_VERBOSE); + + // execute the command and throw on error + final int error = execute(glgenCommandline.getCommandline()); + if(error == 1) + throw new BuildException( ("BuildStaticGLInfo returned: " + error), location); + } + + /** + *

Ensure that the user specified all required arguments.

+ * + * @throws BuildException if there are required arguments that are not + * present or not valid + */ + private void validateAttributes() + throws BuildException + { + // validate that the package name is set + if(!isValid(packageName)) + throw new BuildException("Invalid package name: " + packageName); + + // validate that the output directory is set + // TODO: switch to file and ensure that it exists + if(!isValid(outputDirectory)) + throw new BuildException("Invalid output directory name: " + outputDirectory); + + // TODO: validate that there are headers set + } + + /** + *

Is the specified string valid? A valid string is non-null + * and has a non-zero length.

+ * + * @param string the string to be tested for validity + * @return true if the string is valid. false + * otherwise. + */ + private boolean isValid(String string) + { + // check for null + if(string == null) + return false; + + // ensure that the string has a non-zero length + // NOTE: must trim() to remove leading and trailing whitespace + if(string.trim().length() < 1) + return false; + + // the string is valid + return true; + } + + /** + *

Add all of the attributes to the command line. They have already + * been validated.

+ */ + private void addAttributes() + { + // add the package name + glgenCommandline.createArgument().setValue(packageName); + + // add the output directory name + glgenCommandline.createArgument().setValue(outputDirectory); + + // add the header -files- from the FileSet + headerSet.setDir(getProject().getBaseDir()); + DirectoryScanner directoryScanner = headerSet.getDirectoryScanner(getProject()); + String[] directoryFiles = directoryScanner.getIncludedFiles(); + for(int i=0; iExecute {@link com.sun.gluegen.opengl.BuildStaticGLInfo} in a + * forked JVM.

+ * + * @throws BuildException + */ + private int execute(String[] command) + throws BuildException + { + // create the object that will perform the command execution + Execute execute = new Execute(new LogStreamHandler(this, Project.MSG_INFO, + Project.MSG_WARN), + null); + + // set the project and command line + execute.setAntRun(project); + execute.setCommandline(command); + + // execute the command + try + { + return execute.execute(); + } catch(IOException ioe) + { + throw new BuildException(ioe, location); + } + } +} -- cgit v1.2.3 From c29a7238fcd2c47443bca26796088fcdd131d853 Mon Sep 17 00:00:00 2001 From: Kenneth Russel Date: Mon, 6 Mar 2006 01:18:05 +0000 Subject: Added NativeSignatureEmitter git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/../svn-server-sync/gluegen/trunk@22 a78bb65f-1512-4460-ba86-f6dc96a7bf27 --- .../gluegen/nativesig/NativeSignatureEmitter.java | 188 ++++++++ .../NativeSignatureJavaMethodBindingEmitter.java | 486 +++++++++++++++++++++ 2 files changed, 674 insertions(+) create mode 100755 src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java create mode 100755 src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java diff --git a/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java b/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java new file mode 100755 index 000000000..4fe81afbb --- /dev/null +++ b/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of Sun Microsystems, Inc. or the names of + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN + * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR + * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR + * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE + * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF + * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for use + * in the design, construction, operation or maintenance of any nuclear + * facility. + * + * Sun gratefully acknowledges that this software was originally authored + * and developed by Kenneth Bradley Russell and Christopher John Kline. + */ + +package com.sun.gluegen.nativesig; + +import java.io.*; +import java.util.*; + +import com.sun.gluegen.*; +import com.sun.gluegen.cgram.types.*; +import com.sun.gluegen.opengl.*; +import com.sun.gluegen.procaddress.*; + +/** Emitter producing NativeSignature attributes. */ + +public class NativeSignatureEmitter extends GLEmitter { + protected List generateMethodBindingEmitters(FunctionSymbol sym) throws Exception { + // Allow superclass to do most of the work for us + List res = super.generateMethodBindingEmitters(sym); + + // Filter out all non-JavaMethodBindingEmitters + for (Iterator iter = res.iterator(); iter.hasNext(); ) { + FunctionEmitter emitter = (FunctionEmitter) iter.next(); + if (!(emitter instanceof JavaMethodBindingEmitter)) { + iter.remove(); + } + } + + if (res.isEmpty()) { + return res; + } + + PrintWriter writer = (getConfig().allStatic() ? javaWriter() : javaImplWriter()); + + List processed = new ArrayList(); + + // First, filter out all emitters going to the "other" (public) writer + for (Iterator iter = res.iterator(); iter.hasNext(); ) { + FunctionEmitter emitter = (FunctionEmitter) iter.next(); + if (emitter.getDefaultOutput() != writer) { + processed.add(emitter); + iter.remove(); + } + } + + // Now process all of the remaining emitters sorted by MethodBinding + while (!res.isEmpty()) { + List emittersForBinding = new ArrayList(); + JavaMethodBindingEmitter emitter = (JavaMethodBindingEmitter) res.remove(0); + emittersForBinding.add(emitter); + MethodBinding binding = emitter.getBinding(); + for (Iterator iter = res.iterator(); iter.hasNext(); ) { + JavaMethodBindingEmitter emitter2 = (JavaMethodBindingEmitter) iter.next(); + if (emitter2.getBinding() == binding) { + emittersForBinding.add(emitter2); + iter.remove(); + } + } + generateNativeSignatureEmitters(binding, emittersForBinding); + processed.addAll(emittersForBinding); + } + + return processed; + } + + protected void generateNativeSignatureEmitters(MethodBinding binding, + List allEmitters) { + if (allEmitters.isEmpty()) { + return; + } + + PrintWriter writer = (getConfig().allStatic() ? javaWriter() : javaImplWriter()); + + // Give ourselves the chance to interpose on the generation of all code to keep things simple + List newEmitters = new ArrayList(); + for (Iterator iter = allEmitters.iterator(); iter.hasNext(); ) { + JavaMethodBindingEmitter javaEmitter = (JavaMethodBindingEmitter) iter.next(); + NativeSignatureJavaMethodBindingEmitter newEmitter = null; + if (javaEmitter instanceof GLJavaMethodBindingEmitter) { + newEmitter = new NativeSignatureJavaMethodBindingEmitter((GLJavaMethodBindingEmitter) javaEmitter); + } else if (javaEmitter instanceof ProcAddressJavaMethodBindingEmitter) { + newEmitter = new NativeSignatureJavaMethodBindingEmitter((ProcAddressJavaMethodBindingEmitter) javaEmitter); + } else { + newEmitter = new NativeSignatureJavaMethodBindingEmitter(javaEmitter, this); + } + newEmitters.add(newEmitter); + } + allEmitters.clear(); + allEmitters.addAll(newEmitters); + + // Detect whether we need to produce more or modify some of these emitters. + // Note that at this point we are assuming that generatePublicEmitters has + // been called with signatureOnly both true and false. + if (signatureContainsStrings(binding) && + !haveEmitterWithBody(allEmitters)) { + // This basically handles glGetString but also any similar methods + NativeSignatureJavaMethodBindingEmitter javaEmitter = findEmitterWithWriter(allEmitters, writer); + + // First, we need to clone this emitter to produce the native + // entry point + NativeSignatureJavaMethodBindingEmitter emitter = + new NativeSignatureJavaMethodBindingEmitter(javaEmitter); + emitter.removeModifier(JavaMethodBindingEmitter.PUBLIC); + emitter.addModifier(JavaMethodBindingEmitter.PRIVATE); + emitter.setForImplementingMethodCall(true); + // Note: this is chosen so we don't have to change the logic in + // emitReturnVariableSetupAndCall which decides which variant + // (direct / indirect) to call + emitter.setForDirectBufferImplementation(true); + allEmitters.add(emitter); + + // Now make the original emitter non-native and cause it to emit a body + javaEmitter.removeModifier(JavaMethodBindingEmitter.NATIVE); + javaEmitter.setEmitBody(true); + } + } + + protected boolean signatureContainsStrings(MethodBinding binding) { + for (int i = 0; i < binding.getNumArguments(); i++) { + JavaType type = binding.getJavaArgumentType(i); + if (type.isString() || type.isStringArray()) { + return true; + } + } + JavaType retType = binding.getJavaReturnType(); + if (retType.isString() || retType.isStringArray()) { + return true; + } + return false; + } + + protected boolean haveEmitterWithBody(List allEmitters) { + for (Iterator iter = allEmitters.iterator(); iter.hasNext(); ) { + JavaMethodBindingEmitter emitter = (JavaMethodBindingEmitter) iter.next(); + if (!emitter.signatureOnly()) { + return true; + } + } + return false; + } + + protected NativeSignatureJavaMethodBindingEmitter findEmitterWithWriter(List allEmitters, PrintWriter writer) { + for (Iterator iter = allEmitters.iterator(); iter.hasNext(); ) { + NativeSignatureJavaMethodBindingEmitter emitter = + (NativeSignatureJavaMethodBindingEmitter) iter.next(); + if (emitter.getDefaultOutput() == writer) { + return emitter; + } + } + throw new RuntimeException("Unexpectedly failed to find an emitter with the given writer"); + } +} diff --git a/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java b/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java new file mode 100755 index 000000000..71382bfe1 --- /dev/null +++ b/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java @@ -0,0 +1,486 @@ +/* + * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of Sun Microsystems, Inc. or the names of + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN + * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR + * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR + * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE + * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF + * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for use + * in the design, construction, operation or maintenance of any nuclear + * facility. + * + * Sun gratefully acknowledges that this software was originally authored + * and developed by Kenneth Bradley Russell and Christopher John Kline. + */ + +package com.sun.gluegen.nativesig; + +import java.io.*; +import java.util.*; +import java.text.MessageFormat; + +import com.sun.gluegen.*; +import com.sun.gluegen.cgram.types.*; +import com.sun.gluegen.cgram.*; +import com.sun.gluegen.opengl.*; +import com.sun.gluegen.procaddress.*; + +public class NativeSignatureJavaMethodBindingEmitter extends GLJavaMethodBindingEmitter { + public NativeSignatureJavaMethodBindingEmitter(GLJavaMethodBindingEmitter methodToWrap) { + super(methodToWrap); + } + + public NativeSignatureJavaMethodBindingEmitter(ProcAddressJavaMethodBindingEmitter methodToWrap) { + super(methodToWrap, false); + } + + public NativeSignatureJavaMethodBindingEmitter(JavaMethodBindingEmitter methodToWrap, + NativeSignatureEmitter emitter) { + super(methodToWrap, false, null, false, false, emitter); + } + + protected void emitSignature(PrintWriter writer) { + writer.print(getBaseIndentString()); + emitNativeSignatureAnnotation(writer); + super.emitSignature(writer); + } + + protected void emitNativeSignatureAnnotation(PrintWriter writer) { + if (hasModifier(JavaMethodBindingEmitter.NATIVE)) { + // Emit everything as a leaf for now + // FIXME: make this configurable + writer.print("@NativeSignature(\"l"); + MethodBinding binding = getBinding(); + if (callThroughProcAddress) { + writer.print("p"); + } + writer.print("("); + if (callThroughProcAddress) { + writer.print("P"); + } + for (int i = 0; i < binding.getNumArguments(); i++) { + emitNativeSignatureElement(writer, binding.getJavaArgumentType(i), binding.getCArgumentType(i), i); + } + writer.print(")"); + emitNativeSignatureElement(writer, binding.getJavaReturnType(), binding.getCReturnType(), -1); + writer.println("\")"); + } + } + + protected void emitNativeSignatureElement(PrintWriter writer, JavaType type, Type cType, int index) { + if (type.isVoid()) { + if (index > 0) { + throw new InternalError("Error parsing arguments -- void should not be seen aside from argument 0"); + } + return; + } + + if (type.isNIOBuffer()) { + writer.print("A"); + } else if (type.isPrimitiveArray()) { + writer.print("MO"); + } else if (type.isPrimitive()) { + Class clazz = type.getJavaClass(); + if (clazz == Byte.TYPE) { writer.print("B"); } + else if (clazz == Character.TYPE) { writer.print("C"); } + else if (clazz == Double.TYPE) { writer.print("D"); } + else if (clazz == Float.TYPE) { writer.print("F"); } + else if (clazz == Integer.TYPE) { writer.print("I"); } + else if (clazz == Long.TYPE) { + // See if this is intended to be a pointer at the C level + if (cType.isPointer()) { + writer.print("A"); + } else { + writer.print("J"); + } + } + else if (clazz == Short.TYPE) { writer.print("S"); } + else if (clazz == Boolean.TYPE) { writer.print("Z"); } + else throw new InternalError("Unhandled primitive type " + clazz); + } else if (type.isString()) { + writer.print("A"); + } else { + throw new RuntimeException("Type not yet handled: " + type); + } + } + + protected String getReturnTypeString(boolean skipArray) { + if (isForImplementingMethodCall()) { + JavaType returnType = getBinding().getJavaReturnType(); + if (returnType.isString() || returnType.isNIOByteBuffer()) { + // Treat these as addresses + return "long"; + } + } + return super.getReturnTypeString(skipArray); + } + + protected void emitPreCallSetup(MethodBinding binding, PrintWriter writer) { + super.emitPreCallSetup(binding, writer); + for (int i = 0; i < binding.getNumArguments(); i++) { + JavaType type = binding.getJavaArgumentType(i); + if (type.isNIOBuffer() && !directNIOOnly) { + // Emit declarations for variables holding primitive arrays as type Object + // We don't know 100% sure we're going to use these at this point in the code, though + writer.println(" Object " + getNIOBufferArrayName(i) + " = (_direct ? null : BufferFactory.getArray(" + + getArgumentName(i) + "));"); + } else if (type.isString()) { + writer.println(" long " + binding.getArgumentName(i) + "_c_str = BufferFactoryInternal.newCString(" + binding.getArgumentName(i) + ");"); + } + // FIXME: going to need more of these for Buffer[] and String[], at least + } + } + + protected String getNIOBufferArrayName(int argNumber) { + return "__buffer_array_" + argNumber; + } + + protected int emitArguments(PrintWriter writer) + { + boolean needComma = false; + int numEmitted = 0; + + if (callThroughProcAddress) { + if (changeNameAndArguments) { + writer.print("long procAddress"); + ++numEmitted; + needComma = true; + } + } + + if (forImplementingMethodCall && binding.hasContainingType()) { + if (needComma) { + writer.print(", "); + } + + // Always emit outgoing "this" argument + writer.print("long "); + writer.print(javaThisArgumentName()); + ++numEmitted; + needComma = true; + } + + for (int i = 0; i < binding.getNumArguments(); i++) { + JavaType type = binding.getJavaArgumentType(i); + if (type.isVoid()) { + // Make sure this is the only param to the method; if it isn't, + // there's something wrong with our parsing of the headers. + if (binding.getNumArguments() != 1) { + throw new InternalError( + "\"void\" argument type found in " + + "multi-argument function \"" + binding + "\""); + } + continue; + } + + if (type.isJNIEnv() || binding.isArgumentThisPointer(i)) { + // Don't need to expose these at the Java level + continue; + } + + if (needComma) { + writer.print(", "); + } + + if (forImplementingMethodCall && + (forDirectBufferImplementation && type.isNIOBuffer() || + type.isString())) { + // Direct Buffers and Strings go out as longs + writer.print("long"); + // FIXME: will need more tests here to handle other constructs like String and direct Buffer arrays + } else { + writer.print(erasedTypeString(type, false)); + } + writer.print(" "); + writer.print(getArgumentName(i)); + + ++numEmitted; + needComma = true; + + // Add Buffer and array index offset arguments after each associated argument + if (forIndirectBufferAndArrayImplementation) { + if (type.isNIOBuffer()) { + writer.print(", int " + byteOffsetArgName(i)); + } else if (type.isNIOBufferArray()) { + writer.print(", int[] " + + byteOffsetArrayArgName(i)); + } + } + + // Add offset argument after each primitive array + if (type.isPrimitiveArray()) { + writer.print(", int " + offsetArgName(i)); + } + } + return numEmitted; + } + + protected void emitReturnVariableSetupAndCall(MethodBinding binding, PrintWriter writer) { + writer.print(" "); + JavaType returnType = binding.getJavaReturnType(); + boolean needsResultAssignment = false; + + if (!returnType.isVoid()) { + if (returnType.isCompoundTypeWrapper() || + returnType.isNIOByteBuffer()) { + writer.println("ByteBuffer _res;"); + needsResultAssignment = true; + } else if (returnType.isArrayOfCompoundTypeWrappers()) { + writer.println("ByteBuffer[] _res;"); + needsResultAssignment = true; + } else if (returnType.isString() || returnType.isNIOByteBuffer()) { + writer.print(returnType); + writer.println(" _res;"); + needsResultAssignment = true; + } else { + // Always assign to "_res" variable so we can clean up + // outgoing String arguments, for example + emitReturnType(writer); + writer.println(" _res;"); + needsResultAssignment = true; + } + } + + if (binding.signatureCanUseIndirectNIO() && !directNIOOnly) { + // Must generate two calls for this gated on whether the NIO + // buffers coming in are all direct or indirect + writer.println("if (_direct) {"); + writer.print (" "); + } + + if (needsResultAssignment) { + writer.print(" _res = "); + if (returnType.isString()) { + writer.print("BufferFactoryInternal.newJavaString("); + } else if (returnType.isNIOByteBuffer()) { + writer.print("BufferFactoryInternal.newDirectByteBuffer("); + } + } else { + writer.print(" "); + if (!returnType.isVoid()) { + writer.print("return "); + } + } + + if (binding.signatureUsesJavaPrimitiveArrays() && + !binding.signatureCanUseIndirectNIO()) { + // FIXME: what happens with a C function of the form + // void foo(int* arg0, void* arg1); + // ? + + // Only one call being made in this body, going to indirect + // buffer / array entry point + emitCall(binding, writer, false); + if (returnType.isString() || returnType.isNIOByteBuffer()) { + writer.print(")"); + } + writer.print(";"); + writer.println(); + } else { + emitCall(binding, writer, true); + if (returnType.isString() || returnType.isNIOByteBuffer()) { + writer.print(")"); + } + writer.print(";"); + } + + if (binding.signatureCanUseIndirectNIO() && !directNIOOnly) { + // Must generate two calls for this gated on whether the NIO + // buffers coming in are all direct or indirect + writer.println(); + writer.println(" } else {"); + writer.print (" "); + if (needsResultAssignment) { + writer.print(" _res = "); + } else { + writer.print(" "); + if (!returnType.isVoid()) { + writer.print("return "); + } + } + emitCall(binding, writer, false); + writer.print(";"); + writer.println(); + writer.println(" }"); + } else { + writer.println(); + } + emitPrologueOrEpilogue(epilogue, writer); + if (needsResultAssignment) { + emitCallResultReturn(binding, writer); + } + } + + protected int emitCallArguments(MethodBinding binding, PrintWriter writer, boolean direct) { + // Note that we override this completely because we both need to + // move the potential location of the outgoing proc address as + // well as change the way we pass out Buffers, arrays, Strings, etc. + + boolean needComma = false; + int numArgsEmitted = 0; + + if (callThroughProcAddress) { + writer.print("__addr_"); + needComma = true; + ++numArgsEmitted; + } + + if (binding.hasContainingType()) { + // Emit this pointer + assert(binding.getContainingType().isCompoundTypeWrapper()); + writer.print("BufferFactoryInternal.getDirectBufferAddress("); + writer.print("getBuffer()"); + writer.print(")"); + needComma = true; + ++numArgsEmitted; + } + for (int i = 0; i < binding.getNumArguments(); i++) { + JavaType type = binding.getJavaArgumentType(i); + if (type.isJNIEnv() || binding.isArgumentThisPointer(i)) { + // Don't need to expose these at the Java level + continue; + } + + if (type.isVoid()) { + // Make sure this is the only param to the method; if it isn't, + // there's something wrong with our parsing of the headers. + assert(binding.getNumArguments() == 1); + continue; + } + + if (needComma) { + writer.print(", "); + } + + if (type.isCompoundTypeWrapper()) { + writer.print("BufferFactoryInternal.getDirectBufferAddress("); + writer.print("(("); + } + + if (type.isNIOBuffer()) { + if (!direct) { + writer.print(getNIOBufferArrayName(i)); + } else { + writer.print("BufferFactoryInternal.getDirectBufferAddress("); + writer.print(getArgumentName(i)); + writer.print(")"); + } + } else { + writer.print(getArgumentName(i)); + } + + if (type.isCompoundTypeWrapper()) { + writer.print(" == null) ? null : "); + writer.print(getArgumentName(i)); + writer.print(".getBuffer())"); + writer.print(")"); + } + + if (type.isNIOBuffer()) { + if (direct) { + writer.print("+ BufferFactory.getDirectBufferByteOffset(" + getArgumentName(i) + ")"); + } else { + writer.print(", BufferFactoryInternal.arrayBaseOffset(" + + getNIOBufferArrayName(i) + + ") + BufferFactory.getIndirectBufferByteOffset(" + getArgumentName(i) + ")"); + } + } else if (type.isNIOBufferArray()) { + writer.print(", " + byteOffsetArrayArgName(i)); + } + + // Add Array offset parameter for primitive arrays + if (type.isPrimitiveArray()) { + writer.print(", "); + writer.print("BufferFactoryInternal.arrayBaseOffset(" + getArgumentName(i) + ") + "); + if(type.isFloatArray()) { + writer.print("BufferFactory.SIZEOF_FLOAT * "); + } else if(type.isDoubleArray()) { + writer.print("BufferFactory.SIZEOF_DOUBLE * "); + } else if(type.isByteArray()) { + writer.print("1 * "); + } else if(type.isLongArray()) { + writer.print("BufferFactory.SIZEOF_LONG * "); + } else if(type.isShortArray()) { + writer.print("BufferFactory.SIZEOF_SHORT * "); + } else if(type.isIntArray()) { + writer.print("BufferFactory.SIZEOF_INT * "); + } else { + throw new RuntimeException("Unsupported type for calculating array offset argument for " + + getArgumentName(i) + + "-- error occurred while processing Java glue code for " + getName()); + } + writer.print(offsetArgName(i)); + } + + if (type.isString()) { + writer.print("_c_str"); + } + + if (type.isCompoundTypeWrapper()) { + writer.print(")"); + } + + needComma = true; + ++numArgsEmitted; + } + return numArgsEmitted; + } + + protected void emitCallResultReturn(MethodBinding binding, PrintWriter writer) { + for (int i = 0; i < binding.getNumArguments(); i++) { + JavaType type = binding.getJavaArgumentType(i); + if (type.isString()) { + writer.println(";"); + writer.println(" BufferFactoryInternal.freeCString(" + binding.getArgumentName(i) + "_c_str);"); + } + // FIXME: will need more of these cleanups for things like Buffer[] and String[] (see above) + } + + super.emitCallResultReturn(binding, writer); + } + + public String getName() { + String res = super.getName(); + if (forImplementingMethodCall && bufferObjectVariant) { + return res + "BufObj"; + } + return res; + } + + protected String getImplMethodName(boolean direct) { + String name = null; + if (direct) { + name = binding.getRenamedMethodName() + "$0"; + } else { + name = binding.getRenamedMethodName() + "$1"; + } + if (bufferObjectVariant) { + return name + "BufObj"; + } + return name; + } +} -- cgit v1.2.3 From a168b43dc2163114daa19f88b6f5965678ad601e Mon Sep 17 00:00:00 2001 From: Kenneth Russel Date: Wed, 3 May 2006 07:32:57 +0000 Subject: Applied fix from user GKW on javagaming.org forums for building from within NetBeans git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/../svn-server-sync/gluegen/trunk@32 a78bb65f-1512-4460-ba86-f6dc96a7bf27 --- src/java/com/sun/gluegen/ant/StaticGLGenTask.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/java/com/sun/gluegen/ant/StaticGLGenTask.java b/src/java/com/sun/gluegen/ant/StaticGLGenTask.java index 255ab8a1a..87619422c 100644 --- a/src/java/com/sun/gluegen/ant/StaticGLGenTask.java +++ b/src/java/com/sun/gluegen/ant/StaticGLGenTask.java @@ -290,6 +290,7 @@ public class StaticGLGenTask extends Task // set the project and command line execute.setAntRun(project); execute.setCommandline(command); + execute.setWorkingDirectory( project.getBaseDir() ); // execute the command try -- cgit v1.2.3 From c5710fb549a8812fa1785fd703e5227229014aca Mon Sep 17 00:00:00 2001 From: Kenneth Russel Date: Sat, 19 Apr 2008 17:34:04 +0000 Subject: Fixed Issue 6: unqualified class names in generated java code Applied and expanded patch from user tck to fully qualify all references to New I/O classes in generated code. Tested by removing Import of java.nio.* from JOGL and JOAL; required modification of the custom Java code for those packages, but otherwise working well. git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/../svn-server-sync/gluegen/trunk@73 a78bb65f-1512-4460-ba86-f6dc96a7bf27 --- .../gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java b/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java index 71382bfe1..12a6c0e4c 100755 --- a/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java +++ b/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java @@ -247,10 +247,10 @@ public class NativeSignatureJavaMethodBindingEmitter extends GLJavaMethodBinding if (!returnType.isVoid()) { if (returnType.isCompoundTypeWrapper() || returnType.isNIOByteBuffer()) { - writer.println("ByteBuffer _res;"); + writer.println("java.nio.ByteBuffer _res;"); needsResultAssignment = true; } else if (returnType.isArrayOfCompoundTypeWrappers()) { - writer.println("ByteBuffer[] _res;"); + writer.println("java.nio.ByteBuffer[] _res;"); needsResultAssignment = true; } else if (returnType.isString() || returnType.isNIOByteBuffer()) { writer.print(returnType); -- cgit v1.2.3 From 69eb392cbaf4268af06dbafc25983dfdd2a685b0 Mon Sep 17 00:00:00 2001 From: Kenneth Russel Date: Mon, 15 Jun 2009 22:39:33 +0000 Subject: Deleted obsolete source code in preparation for copying JOGL_2_SANDBOX on to trunk git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/../svn-server-sync/gluegen/trunk@146 a78bb65f-1512-4460-ba86-f6dc96a7bf27 --- src/java/com/sun/gluegen/ant/StaticGLGenTask.java | 304 ------------- .../gluegen/nativesig/NativeSignatureEmitter.java | 188 -------- .../NativeSignatureJavaMethodBindingEmitter.java | 486 --------------------- 3 files changed, 978 deletions(-) delete mode 100644 src/java/com/sun/gluegen/ant/StaticGLGenTask.java delete mode 100755 src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java delete mode 100755 src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java diff --git a/src/java/com/sun/gluegen/ant/StaticGLGenTask.java b/src/java/com/sun/gluegen/ant/StaticGLGenTask.java deleted file mode 100644 index 87619422c..000000000 --- a/src/java/com/sun/gluegen/ant/StaticGLGenTask.java +++ /dev/null @@ -1,304 +0,0 @@ -package com.sun.gluegen.ant; - -/* - * StaticGLGenTask.java - * Copyright (C) 2003 Rob Grzywinski (rgrzywinski@realityinteractive.com) - * - * Copying, distribution and use of this software in source and binary - * forms, with or without modification, is permitted provided that the - * following conditions are met: - * - * Distributions of source code must reproduce the copyright notice, - * this list of conditions and the following disclaimer in the source - * code header files; and Distributions of binary code must reproduce - * the copyright notice, this list of conditions and the following - * disclaimer in the documentation, Read me file, license file and/or - * other materials provided with the software distribution. - * - * The names of Sun Microsystems, Inc. ("Sun") and/or the copyright - * holder may not be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS," WITHOUT A WARRANTY OF ANY - * KIND. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND - * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, NON-INTERFERENCE, ACCURACY OF - * INFORMATIONAL CONTENT OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. THE - * COPYRIGHT HOLDER, SUN AND SUN'S LICENSORS SHALL NOT BE LIABLE FOR - * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR - * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL THE - * COPYRIGHT HOLDER, SUN OR SUN'S LICENSORS BE LIABLE FOR ANY LOST - * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, - * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND - * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR - * INABILITY TO USE THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGES. YOU ACKNOWLEDGE THAT THIS SOFTWARE IS NOT - * DESIGNED, LICENSED OR INTENDED FOR USE IN THE DESIGN, CONSTRUCTION, - * OPERATION OR MAINTENANCE OF ANY NUCLEAR FACILITY. THE COPYRIGHT - * HOLDER, SUN AND SUN'S LICENSORS DISCLAIM ANY EXPRESS OR IMPLIED - * WARRANTY OF FITNESS FOR SUCH USES. - */ - -import java.io.IOException; - -import org.apache.tools.ant.BuildException; -import org.apache.tools.ant.DirectoryScanner; -import org.apache.tools.ant.Project; -import org.apache.tools.ant.Task; -import org.apache.tools.ant.taskdefs.Execute; -import org.apache.tools.ant.taskdefs.LogStreamHandler; -import org.apache.tools.ant.types.CommandlineJava; -import org.apache.tools.ant.types.FileSet; -import org.apache.tools.ant.types.Path; -import org.apache.tools.ant.types.PatternSet; -import org.apache.tools.ant.util.JavaEnvUtils; - -/** - *

An ANT {@link org.apache.tools.ant.Task} - * for using {@link com.sun.gluegen.opengl.BuildStaticGLInfo}.

- * - *

Usage:

- *
-    <staticglgen package="[generated files package]" 
-                    headers="[file pattern of GL headers]"
-                    outputdir="[directory to output the generated files]" />
- * 
- * - * @author Rob Grzywinski rgrzywinski@yahoo.com - */ -// FIXME: blow out javadoc -public class StaticGLGenTask extends Task -{ - /** - *

The {@link com.sun.gluegen.opengl.BuildStaticGLInfo} classname.

- */ - private static final String GL_GEN = "com.sun.gluegen.opengl.BuildStaticGLInfo"; - - // ========================================================================= - /** - *

The {@link org.apache.tools.ant.types.CommandlineJava} that is used - * to execute {@link com.sun.gluegen.opengl.BuildStaticGLInfo}.

- */ - private CommandlineJava glgenCommandline; - - // ========================================================================= - /** - *

The package name for the generated files.

- */ - private String packageName; - - /** - *

The output directory.

- */ - private String outputDirectory; - - /** - *

The {@link org.apache.tools.ant.types.FileSet} of GL headers.

- */ - private FileSet headerSet = new FileSet(); - - // ========================================================================= - /** - *

Create and add the VM and classname to {@link org.apache.tools.ant.types.CommandlineJava}.

- */ - public StaticGLGenTask() - { - // create the CommandlineJava that will be used to call BuildStaticGLInfo - glgenCommandline = new CommandlineJava(); - - // set the VM and classname in the commandline - glgenCommandline.setVm(JavaEnvUtils.getJreExecutable("java")); - glgenCommandline.setClassname(GL_GEN); - } - - // ========================================================================= - // ANT getters and setters - /** - *

Set the package name for the generated files. This is called by ANT.

- * - * @param packageName the name of the package for the generated files - */ - public void setPackage(String packageName) - { - log( ("Setting package name to: " + packageName), Project.MSG_VERBOSE); - this.packageName = packageName; - } - - /** - *

Set the output directory. This is called by ANT.

- * - * @param directory the output directory - */ - public void setOutputDir(String directory) - { - log( ("Setting output directory to: " + directory), - Project.MSG_VERBOSE); - this.outputDirectory = directory; - } - - /** - *

Add a header file to the list. This is called by ANT for a nested - * element.

- * - * @return {@link org.apache.tools.ant.types.PatternSet.NameEntry} - */ - public PatternSet.NameEntry createHeader() - { - return headerSet.createInclude(); - } - - /** - *

Add a header file to the list. This is called by ANT for a nested - * element.

- * - * @return {@link org.apache.tools.ant.types.PatternSet.NameEntry} - */ - public PatternSet.NameEntry createHeadersFile() - { - return headerSet.createIncludesFile(); - } - - /** - *

Set the set of header patterns. Patterns may be separated by a comma - * or a space. This is called by ANT.

- * - * @param headers the string containing the header patterns - */ - public void setHeaders(String headers) - { - headerSet.setIncludes(headers); - } - - /** - *

Add an optional classpath that defines the location of {@link com.sun.gluegen.opengl.BuildStaticGLInfo} - * and BuildStaticGLInfo's dependencies.

- * - * @returns {@link org.apache.tools.ant.types.Path} - */ - public Path createClasspath() - { - return glgenCommandline.createClasspath(project).createPath(); - } - - // ========================================================================= - /** - *

Run the task. This involves validating the set attributes, creating - * the command line to be executed and finally executing the command.

- * - * @see org.apache.tools.ant.Task#execute() - */ - public void execute() - throws BuildException - { - // validate that all of the required attributes have been set - validateAttributes(); - - // TODO: add logic to determine if the generated file needs to be - // regenerated - - // add the attributes to the CommandlineJava - addAttributes(); - - log(glgenCommandline.describeCommand(), Project.MSG_VERBOSE); - - // execute the command and throw on error - final int error = execute(glgenCommandline.getCommandline()); - if(error == 1) - throw new BuildException( ("BuildStaticGLInfo returned: " + error), location); - } - - /** - *

Ensure that the user specified all required arguments.

- * - * @throws BuildException if there are required arguments that are not - * present or not valid - */ - private void validateAttributes() - throws BuildException - { - // validate that the package name is set - if(!isValid(packageName)) - throw new BuildException("Invalid package name: " + packageName); - - // validate that the output directory is set - // TODO: switch to file and ensure that it exists - if(!isValid(outputDirectory)) - throw new BuildException("Invalid output directory name: " + outputDirectory); - - // TODO: validate that there are headers set - } - - /** - *

Is the specified string valid? A valid string is non-null - * and has a non-zero length.

- * - * @param string the string to be tested for validity - * @return true if the string is valid. false - * otherwise. - */ - private boolean isValid(String string) - { - // check for null - if(string == null) - return false; - - // ensure that the string has a non-zero length - // NOTE: must trim() to remove leading and trailing whitespace - if(string.trim().length() < 1) - return false; - - // the string is valid - return true; - } - - /** - *

Add all of the attributes to the command line. They have already - * been validated.

- */ - private void addAttributes() - { - // add the package name - glgenCommandline.createArgument().setValue(packageName); - - // add the output directory name - glgenCommandline.createArgument().setValue(outputDirectory); - - // add the header -files- from the FileSet - headerSet.setDir(getProject().getBaseDir()); - DirectoryScanner directoryScanner = headerSet.getDirectoryScanner(getProject()); - String[] directoryFiles = directoryScanner.getIncludedFiles(); - for(int i=0; iExecute {@link com.sun.gluegen.opengl.BuildStaticGLInfo} in a - * forked JVM.

- * - * @throws BuildException - */ - private int execute(String[] command) - throws BuildException - { - // create the object that will perform the command execution - Execute execute = new Execute(new LogStreamHandler(this, Project.MSG_INFO, - Project.MSG_WARN), - null); - - // set the project and command line - execute.setAntRun(project); - execute.setCommandline(command); - execute.setWorkingDirectory( project.getBaseDir() ); - - // execute the command - try - { - return execute.execute(); - } catch(IOException ioe) - { - throw new BuildException(ioe, location); - } - } -} diff --git a/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java b/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java deleted file mode 100755 index 4fe81afbb..000000000 --- a/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * - Redistribution of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistribution in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * This software is provided "AS IS," without a warranty of any kind. ALL - * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, - * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN - * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR - * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR - * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR - * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR - * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE - * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, - * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF - * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed or intended for use - * in the design, construction, operation or maintenance of any nuclear - * facility. - * - * Sun gratefully acknowledges that this software was originally authored - * and developed by Kenneth Bradley Russell and Christopher John Kline. - */ - -package com.sun.gluegen.nativesig; - -import java.io.*; -import java.util.*; - -import com.sun.gluegen.*; -import com.sun.gluegen.cgram.types.*; -import com.sun.gluegen.opengl.*; -import com.sun.gluegen.procaddress.*; - -/** Emitter producing NativeSignature attributes. */ - -public class NativeSignatureEmitter extends GLEmitter { - protected List generateMethodBindingEmitters(FunctionSymbol sym) throws Exception { - // Allow superclass to do most of the work for us - List res = super.generateMethodBindingEmitters(sym); - - // Filter out all non-JavaMethodBindingEmitters - for (Iterator iter = res.iterator(); iter.hasNext(); ) { - FunctionEmitter emitter = (FunctionEmitter) iter.next(); - if (!(emitter instanceof JavaMethodBindingEmitter)) { - iter.remove(); - } - } - - if (res.isEmpty()) { - return res; - } - - PrintWriter writer = (getConfig().allStatic() ? javaWriter() : javaImplWriter()); - - List processed = new ArrayList(); - - // First, filter out all emitters going to the "other" (public) writer - for (Iterator iter = res.iterator(); iter.hasNext(); ) { - FunctionEmitter emitter = (FunctionEmitter) iter.next(); - if (emitter.getDefaultOutput() != writer) { - processed.add(emitter); - iter.remove(); - } - } - - // Now process all of the remaining emitters sorted by MethodBinding - while (!res.isEmpty()) { - List emittersForBinding = new ArrayList(); - JavaMethodBindingEmitter emitter = (JavaMethodBindingEmitter) res.remove(0); - emittersForBinding.add(emitter); - MethodBinding binding = emitter.getBinding(); - for (Iterator iter = res.iterator(); iter.hasNext(); ) { - JavaMethodBindingEmitter emitter2 = (JavaMethodBindingEmitter) iter.next(); - if (emitter2.getBinding() == binding) { - emittersForBinding.add(emitter2); - iter.remove(); - } - } - generateNativeSignatureEmitters(binding, emittersForBinding); - processed.addAll(emittersForBinding); - } - - return processed; - } - - protected void generateNativeSignatureEmitters(MethodBinding binding, - List allEmitters) { - if (allEmitters.isEmpty()) { - return; - } - - PrintWriter writer = (getConfig().allStatic() ? javaWriter() : javaImplWriter()); - - // Give ourselves the chance to interpose on the generation of all code to keep things simple - List newEmitters = new ArrayList(); - for (Iterator iter = allEmitters.iterator(); iter.hasNext(); ) { - JavaMethodBindingEmitter javaEmitter = (JavaMethodBindingEmitter) iter.next(); - NativeSignatureJavaMethodBindingEmitter newEmitter = null; - if (javaEmitter instanceof GLJavaMethodBindingEmitter) { - newEmitter = new NativeSignatureJavaMethodBindingEmitter((GLJavaMethodBindingEmitter) javaEmitter); - } else if (javaEmitter instanceof ProcAddressJavaMethodBindingEmitter) { - newEmitter = new NativeSignatureJavaMethodBindingEmitter((ProcAddressJavaMethodBindingEmitter) javaEmitter); - } else { - newEmitter = new NativeSignatureJavaMethodBindingEmitter(javaEmitter, this); - } - newEmitters.add(newEmitter); - } - allEmitters.clear(); - allEmitters.addAll(newEmitters); - - // Detect whether we need to produce more or modify some of these emitters. - // Note that at this point we are assuming that generatePublicEmitters has - // been called with signatureOnly both true and false. - if (signatureContainsStrings(binding) && - !haveEmitterWithBody(allEmitters)) { - // This basically handles glGetString but also any similar methods - NativeSignatureJavaMethodBindingEmitter javaEmitter = findEmitterWithWriter(allEmitters, writer); - - // First, we need to clone this emitter to produce the native - // entry point - NativeSignatureJavaMethodBindingEmitter emitter = - new NativeSignatureJavaMethodBindingEmitter(javaEmitter); - emitter.removeModifier(JavaMethodBindingEmitter.PUBLIC); - emitter.addModifier(JavaMethodBindingEmitter.PRIVATE); - emitter.setForImplementingMethodCall(true); - // Note: this is chosen so we don't have to change the logic in - // emitReturnVariableSetupAndCall which decides which variant - // (direct / indirect) to call - emitter.setForDirectBufferImplementation(true); - allEmitters.add(emitter); - - // Now make the original emitter non-native and cause it to emit a body - javaEmitter.removeModifier(JavaMethodBindingEmitter.NATIVE); - javaEmitter.setEmitBody(true); - } - } - - protected boolean signatureContainsStrings(MethodBinding binding) { - for (int i = 0; i < binding.getNumArguments(); i++) { - JavaType type = binding.getJavaArgumentType(i); - if (type.isString() || type.isStringArray()) { - return true; - } - } - JavaType retType = binding.getJavaReturnType(); - if (retType.isString() || retType.isStringArray()) { - return true; - } - return false; - } - - protected boolean haveEmitterWithBody(List allEmitters) { - for (Iterator iter = allEmitters.iterator(); iter.hasNext(); ) { - JavaMethodBindingEmitter emitter = (JavaMethodBindingEmitter) iter.next(); - if (!emitter.signatureOnly()) { - return true; - } - } - return false; - } - - protected NativeSignatureJavaMethodBindingEmitter findEmitterWithWriter(List allEmitters, PrintWriter writer) { - for (Iterator iter = allEmitters.iterator(); iter.hasNext(); ) { - NativeSignatureJavaMethodBindingEmitter emitter = - (NativeSignatureJavaMethodBindingEmitter) iter.next(); - if (emitter.getDefaultOutput() == writer) { - return emitter; - } - } - throw new RuntimeException("Unexpectedly failed to find an emitter with the given writer"); - } -} diff --git a/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java b/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java deleted file mode 100755 index 12a6c0e4c..000000000 --- a/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java +++ /dev/null @@ -1,486 +0,0 @@ -/* - * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * - Redistribution of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistribution in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * This software is provided "AS IS," without a warranty of any kind. ALL - * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, - * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN - * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR - * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR - * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR - * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR - * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE - * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, - * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF - * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed or intended for use - * in the design, construction, operation or maintenance of any nuclear - * facility. - * - * Sun gratefully acknowledges that this software was originally authored - * and developed by Kenneth Bradley Russell and Christopher John Kline. - */ - -package com.sun.gluegen.nativesig; - -import java.io.*; -import java.util.*; -import java.text.MessageFormat; - -import com.sun.gluegen.*; -import com.sun.gluegen.cgram.types.*; -import com.sun.gluegen.cgram.*; -import com.sun.gluegen.opengl.*; -import com.sun.gluegen.procaddress.*; - -public class NativeSignatureJavaMethodBindingEmitter extends GLJavaMethodBindingEmitter { - public NativeSignatureJavaMethodBindingEmitter(GLJavaMethodBindingEmitter methodToWrap) { - super(methodToWrap); - } - - public NativeSignatureJavaMethodBindingEmitter(ProcAddressJavaMethodBindingEmitter methodToWrap) { - super(methodToWrap, false); - } - - public NativeSignatureJavaMethodBindingEmitter(JavaMethodBindingEmitter methodToWrap, - NativeSignatureEmitter emitter) { - super(methodToWrap, false, null, false, false, emitter); - } - - protected void emitSignature(PrintWriter writer) { - writer.print(getBaseIndentString()); - emitNativeSignatureAnnotation(writer); - super.emitSignature(writer); - } - - protected void emitNativeSignatureAnnotation(PrintWriter writer) { - if (hasModifier(JavaMethodBindingEmitter.NATIVE)) { - // Emit everything as a leaf for now - // FIXME: make this configurable - writer.print("@NativeSignature(\"l"); - MethodBinding binding = getBinding(); - if (callThroughProcAddress) { - writer.print("p"); - } - writer.print("("); - if (callThroughProcAddress) { - writer.print("P"); - } - for (int i = 0; i < binding.getNumArguments(); i++) { - emitNativeSignatureElement(writer, binding.getJavaArgumentType(i), binding.getCArgumentType(i), i); - } - writer.print(")"); - emitNativeSignatureElement(writer, binding.getJavaReturnType(), binding.getCReturnType(), -1); - writer.println("\")"); - } - } - - protected void emitNativeSignatureElement(PrintWriter writer, JavaType type, Type cType, int index) { - if (type.isVoid()) { - if (index > 0) { - throw new InternalError("Error parsing arguments -- void should not be seen aside from argument 0"); - } - return; - } - - if (type.isNIOBuffer()) { - writer.print("A"); - } else if (type.isPrimitiveArray()) { - writer.print("MO"); - } else if (type.isPrimitive()) { - Class clazz = type.getJavaClass(); - if (clazz == Byte.TYPE) { writer.print("B"); } - else if (clazz == Character.TYPE) { writer.print("C"); } - else if (clazz == Double.TYPE) { writer.print("D"); } - else if (clazz == Float.TYPE) { writer.print("F"); } - else if (clazz == Integer.TYPE) { writer.print("I"); } - else if (clazz == Long.TYPE) { - // See if this is intended to be a pointer at the C level - if (cType.isPointer()) { - writer.print("A"); - } else { - writer.print("J"); - } - } - else if (clazz == Short.TYPE) { writer.print("S"); } - else if (clazz == Boolean.TYPE) { writer.print("Z"); } - else throw new InternalError("Unhandled primitive type " + clazz); - } else if (type.isString()) { - writer.print("A"); - } else { - throw new RuntimeException("Type not yet handled: " + type); - } - } - - protected String getReturnTypeString(boolean skipArray) { - if (isForImplementingMethodCall()) { - JavaType returnType = getBinding().getJavaReturnType(); - if (returnType.isString() || returnType.isNIOByteBuffer()) { - // Treat these as addresses - return "long"; - } - } - return super.getReturnTypeString(skipArray); - } - - protected void emitPreCallSetup(MethodBinding binding, PrintWriter writer) { - super.emitPreCallSetup(binding, writer); - for (int i = 0; i < binding.getNumArguments(); i++) { - JavaType type = binding.getJavaArgumentType(i); - if (type.isNIOBuffer() && !directNIOOnly) { - // Emit declarations for variables holding primitive arrays as type Object - // We don't know 100% sure we're going to use these at this point in the code, though - writer.println(" Object " + getNIOBufferArrayName(i) + " = (_direct ? null : BufferFactory.getArray(" + - getArgumentName(i) + "));"); - } else if (type.isString()) { - writer.println(" long " + binding.getArgumentName(i) + "_c_str = BufferFactoryInternal.newCString(" + binding.getArgumentName(i) + ");"); - } - // FIXME: going to need more of these for Buffer[] and String[], at least - } - } - - protected String getNIOBufferArrayName(int argNumber) { - return "__buffer_array_" + argNumber; - } - - protected int emitArguments(PrintWriter writer) - { - boolean needComma = false; - int numEmitted = 0; - - if (callThroughProcAddress) { - if (changeNameAndArguments) { - writer.print("long procAddress"); - ++numEmitted; - needComma = true; - } - } - - if (forImplementingMethodCall && binding.hasContainingType()) { - if (needComma) { - writer.print(", "); - } - - // Always emit outgoing "this" argument - writer.print("long "); - writer.print(javaThisArgumentName()); - ++numEmitted; - needComma = true; - } - - for (int i = 0; i < binding.getNumArguments(); i++) { - JavaType type = binding.getJavaArgumentType(i); - if (type.isVoid()) { - // Make sure this is the only param to the method; if it isn't, - // there's something wrong with our parsing of the headers. - if (binding.getNumArguments() != 1) { - throw new InternalError( - "\"void\" argument type found in " + - "multi-argument function \"" + binding + "\""); - } - continue; - } - - if (type.isJNIEnv() || binding.isArgumentThisPointer(i)) { - // Don't need to expose these at the Java level - continue; - } - - if (needComma) { - writer.print(", "); - } - - if (forImplementingMethodCall && - (forDirectBufferImplementation && type.isNIOBuffer() || - type.isString())) { - // Direct Buffers and Strings go out as longs - writer.print("long"); - // FIXME: will need more tests here to handle other constructs like String and direct Buffer arrays - } else { - writer.print(erasedTypeString(type, false)); - } - writer.print(" "); - writer.print(getArgumentName(i)); - - ++numEmitted; - needComma = true; - - // Add Buffer and array index offset arguments after each associated argument - if (forIndirectBufferAndArrayImplementation) { - if (type.isNIOBuffer()) { - writer.print(", int " + byteOffsetArgName(i)); - } else if (type.isNIOBufferArray()) { - writer.print(", int[] " + - byteOffsetArrayArgName(i)); - } - } - - // Add offset argument after each primitive array - if (type.isPrimitiveArray()) { - writer.print(", int " + offsetArgName(i)); - } - } - return numEmitted; - } - - protected void emitReturnVariableSetupAndCall(MethodBinding binding, PrintWriter writer) { - writer.print(" "); - JavaType returnType = binding.getJavaReturnType(); - boolean needsResultAssignment = false; - - if (!returnType.isVoid()) { - if (returnType.isCompoundTypeWrapper() || - returnType.isNIOByteBuffer()) { - writer.println("java.nio.ByteBuffer _res;"); - needsResultAssignment = true; - } else if (returnType.isArrayOfCompoundTypeWrappers()) { - writer.println("java.nio.ByteBuffer[] _res;"); - needsResultAssignment = true; - } else if (returnType.isString() || returnType.isNIOByteBuffer()) { - writer.print(returnType); - writer.println(" _res;"); - needsResultAssignment = true; - } else { - // Always assign to "_res" variable so we can clean up - // outgoing String arguments, for example - emitReturnType(writer); - writer.println(" _res;"); - needsResultAssignment = true; - } - } - - if (binding.signatureCanUseIndirectNIO() && !directNIOOnly) { - // Must generate two calls for this gated on whether the NIO - // buffers coming in are all direct or indirect - writer.println("if (_direct) {"); - writer.print (" "); - } - - if (needsResultAssignment) { - writer.print(" _res = "); - if (returnType.isString()) { - writer.print("BufferFactoryInternal.newJavaString("); - } else if (returnType.isNIOByteBuffer()) { - writer.print("BufferFactoryInternal.newDirectByteBuffer("); - } - } else { - writer.print(" "); - if (!returnType.isVoid()) { - writer.print("return "); - } - } - - if (binding.signatureUsesJavaPrimitiveArrays() && - !binding.signatureCanUseIndirectNIO()) { - // FIXME: what happens with a C function of the form - // void foo(int* arg0, void* arg1); - // ? - - // Only one call being made in this body, going to indirect - // buffer / array entry point - emitCall(binding, writer, false); - if (returnType.isString() || returnType.isNIOByteBuffer()) { - writer.print(")"); - } - writer.print(";"); - writer.println(); - } else { - emitCall(binding, writer, true); - if (returnType.isString() || returnType.isNIOByteBuffer()) { - writer.print(")"); - } - writer.print(";"); - } - - if (binding.signatureCanUseIndirectNIO() && !directNIOOnly) { - // Must generate two calls for this gated on whether the NIO - // buffers coming in are all direct or indirect - writer.println(); - writer.println(" } else {"); - writer.print (" "); - if (needsResultAssignment) { - writer.print(" _res = "); - } else { - writer.print(" "); - if (!returnType.isVoid()) { - writer.print("return "); - } - } - emitCall(binding, writer, false); - writer.print(";"); - writer.println(); - writer.println(" }"); - } else { - writer.println(); - } - emitPrologueOrEpilogue(epilogue, writer); - if (needsResultAssignment) { - emitCallResultReturn(binding, writer); - } - } - - protected int emitCallArguments(MethodBinding binding, PrintWriter writer, boolean direct) { - // Note that we override this completely because we both need to - // move the potential location of the outgoing proc address as - // well as change the way we pass out Buffers, arrays, Strings, etc. - - boolean needComma = false; - int numArgsEmitted = 0; - - if (callThroughProcAddress) { - writer.print("__addr_"); - needComma = true; - ++numArgsEmitted; - } - - if (binding.hasContainingType()) { - // Emit this pointer - assert(binding.getContainingType().isCompoundTypeWrapper()); - writer.print("BufferFactoryInternal.getDirectBufferAddress("); - writer.print("getBuffer()"); - writer.print(")"); - needComma = true; - ++numArgsEmitted; - } - for (int i = 0; i < binding.getNumArguments(); i++) { - JavaType type = binding.getJavaArgumentType(i); - if (type.isJNIEnv() || binding.isArgumentThisPointer(i)) { - // Don't need to expose these at the Java level - continue; - } - - if (type.isVoid()) { - // Make sure this is the only param to the method; if it isn't, - // there's something wrong with our parsing of the headers. - assert(binding.getNumArguments() == 1); - continue; - } - - if (needComma) { - writer.print(", "); - } - - if (type.isCompoundTypeWrapper()) { - writer.print("BufferFactoryInternal.getDirectBufferAddress("); - writer.print("(("); - } - - if (type.isNIOBuffer()) { - if (!direct) { - writer.print(getNIOBufferArrayName(i)); - } else { - writer.print("BufferFactoryInternal.getDirectBufferAddress("); - writer.print(getArgumentName(i)); - writer.print(")"); - } - } else { - writer.print(getArgumentName(i)); - } - - if (type.isCompoundTypeWrapper()) { - writer.print(" == null) ? null : "); - writer.print(getArgumentName(i)); - writer.print(".getBuffer())"); - writer.print(")"); - } - - if (type.isNIOBuffer()) { - if (direct) { - writer.print("+ BufferFactory.getDirectBufferByteOffset(" + getArgumentName(i) + ")"); - } else { - writer.print(", BufferFactoryInternal.arrayBaseOffset(" + - getNIOBufferArrayName(i) + - ") + BufferFactory.getIndirectBufferByteOffset(" + getArgumentName(i) + ")"); - } - } else if (type.isNIOBufferArray()) { - writer.print(", " + byteOffsetArrayArgName(i)); - } - - // Add Array offset parameter for primitive arrays - if (type.isPrimitiveArray()) { - writer.print(", "); - writer.print("BufferFactoryInternal.arrayBaseOffset(" + getArgumentName(i) + ") + "); - if(type.isFloatArray()) { - writer.print("BufferFactory.SIZEOF_FLOAT * "); - } else if(type.isDoubleArray()) { - writer.print("BufferFactory.SIZEOF_DOUBLE * "); - } else if(type.isByteArray()) { - writer.print("1 * "); - } else if(type.isLongArray()) { - writer.print("BufferFactory.SIZEOF_LONG * "); - } else if(type.isShortArray()) { - writer.print("BufferFactory.SIZEOF_SHORT * "); - } else if(type.isIntArray()) { - writer.print("BufferFactory.SIZEOF_INT * "); - } else { - throw new RuntimeException("Unsupported type for calculating array offset argument for " + - getArgumentName(i) + - "-- error occurred while processing Java glue code for " + getName()); - } - writer.print(offsetArgName(i)); - } - - if (type.isString()) { - writer.print("_c_str"); - } - - if (type.isCompoundTypeWrapper()) { - writer.print(")"); - } - - needComma = true; - ++numArgsEmitted; - } - return numArgsEmitted; - } - - protected void emitCallResultReturn(MethodBinding binding, PrintWriter writer) { - for (int i = 0; i < binding.getNumArguments(); i++) { - JavaType type = binding.getJavaArgumentType(i); - if (type.isString()) { - writer.println(";"); - writer.println(" BufferFactoryInternal.freeCString(" + binding.getArgumentName(i) + "_c_str);"); - } - // FIXME: will need more of these cleanups for things like Buffer[] and String[] (see above) - } - - super.emitCallResultReturn(binding, writer); - } - - public String getName() { - String res = super.getName(); - if (forImplementingMethodCall && bufferObjectVariant) { - return res + "BufObj"; - } - return res; - } - - protected String getImplMethodName(boolean direct) { - String name = null; - if (direct) { - name = binding.getRenamedMethodName() + "$0"; - } else { - name = binding.getRenamedMethodName() + "$1"; - } - if (bufferObjectVariant) { - return name + "BufObj"; - } - return name; - } -} -- cgit v1.2.3 From 6221b5380137915ae3f2cb9d57c18a556484bd82 Mon Sep 17 00:00:00 2001 From: Kenneth Russel Date: Mon, 15 Jun 2009 22:42:48 +0000 Subject: Copied JOGL_2_SANDBOX r145 on to trunk; JOGL_2_SANDBOX branch is now closed git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/../svn-server-sync/gluegen/trunk@147 a78bb65f-1512-4460-ba86-f6dc96a7bf27 --- src/java/com/sun/gluegen/ant/StaticGLGenTask.java | 304 +++++++++++++ .../gluegen/nativesig/NativeSignatureEmitter.java | 188 ++++++++ .../NativeSignatureJavaMethodBindingEmitter.java | 486 +++++++++++++++++++++ 3 files changed, 978 insertions(+) create mode 100644 src/java/com/sun/gluegen/ant/StaticGLGenTask.java create mode 100755 src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java create mode 100755 src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java diff --git a/src/java/com/sun/gluegen/ant/StaticGLGenTask.java b/src/java/com/sun/gluegen/ant/StaticGLGenTask.java new file mode 100644 index 000000000..87619422c --- /dev/null +++ b/src/java/com/sun/gluegen/ant/StaticGLGenTask.java @@ -0,0 +1,304 @@ +package com.sun.gluegen.ant; + +/* + * StaticGLGenTask.java + * Copyright (C) 2003 Rob Grzywinski (rgrzywinski@realityinteractive.com) + * + * Copying, distribution and use of this software in source and binary + * forms, with or without modification, is permitted provided that the + * following conditions are met: + * + * Distributions of source code must reproduce the copyright notice, + * this list of conditions and the following disclaimer in the source + * code header files; and Distributions of binary code must reproduce + * the copyright notice, this list of conditions and the following + * disclaimer in the documentation, Read me file, license file and/or + * other materials provided with the software distribution. + * + * The names of Sun Microsystems, Inc. ("Sun") and/or the copyright + * holder may not be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS," WITHOUT A WARRANTY OF ANY + * KIND. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND + * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, NON-INTERFERENCE, ACCURACY OF + * INFORMATIONAL CONTENT OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. THE + * COPYRIGHT HOLDER, SUN AND SUN'S LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL THE + * COPYRIGHT HOLDER, SUN OR SUN'S LICENSORS BE LIABLE FOR ANY LOST + * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, + * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND + * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR + * INABILITY TO USE THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGES. YOU ACKNOWLEDGE THAT THIS SOFTWARE IS NOT + * DESIGNED, LICENSED OR INTENDED FOR USE IN THE DESIGN, CONSTRUCTION, + * OPERATION OR MAINTENANCE OF ANY NUCLEAR FACILITY. THE COPYRIGHT + * HOLDER, SUN AND SUN'S LICENSORS DISCLAIM ANY EXPRESS OR IMPLIED + * WARRANTY OF FITNESS FOR SUCH USES. + */ + +import java.io.IOException; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.DirectoryScanner; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.taskdefs.Execute; +import org.apache.tools.ant.taskdefs.LogStreamHandler; +import org.apache.tools.ant.types.CommandlineJava; +import org.apache.tools.ant.types.FileSet; +import org.apache.tools.ant.types.Path; +import org.apache.tools.ant.types.PatternSet; +import org.apache.tools.ant.util.JavaEnvUtils; + +/** + *

An ANT {@link org.apache.tools.ant.Task} + * for using {@link com.sun.gluegen.opengl.BuildStaticGLInfo}.

+ * + *

Usage:

+ *
+    <staticglgen package="[generated files package]" 
+                    headers="[file pattern of GL headers]"
+                    outputdir="[directory to output the generated files]" />
+ * 
+ * + * @author Rob Grzywinski rgrzywinski@yahoo.com + */ +// FIXME: blow out javadoc +public class StaticGLGenTask extends Task +{ + /** + *

The {@link com.sun.gluegen.opengl.BuildStaticGLInfo} classname.

+ */ + private static final String GL_GEN = "com.sun.gluegen.opengl.BuildStaticGLInfo"; + + // ========================================================================= + /** + *

The {@link org.apache.tools.ant.types.CommandlineJava} that is used + * to execute {@link com.sun.gluegen.opengl.BuildStaticGLInfo}.

+ */ + private CommandlineJava glgenCommandline; + + // ========================================================================= + /** + *

The package name for the generated files.

+ */ + private String packageName; + + /** + *

The output directory.

+ */ + private String outputDirectory; + + /** + *

The {@link org.apache.tools.ant.types.FileSet} of GL headers.

+ */ + private FileSet headerSet = new FileSet(); + + // ========================================================================= + /** + *

Create and add the VM and classname to {@link org.apache.tools.ant.types.CommandlineJava}.

+ */ + public StaticGLGenTask() + { + // create the CommandlineJava that will be used to call BuildStaticGLInfo + glgenCommandline = new CommandlineJava(); + + // set the VM and classname in the commandline + glgenCommandline.setVm(JavaEnvUtils.getJreExecutable("java")); + glgenCommandline.setClassname(GL_GEN); + } + + // ========================================================================= + // ANT getters and setters + /** + *

Set the package name for the generated files. This is called by ANT.

+ * + * @param packageName the name of the package for the generated files + */ + public void setPackage(String packageName) + { + log( ("Setting package name to: " + packageName), Project.MSG_VERBOSE); + this.packageName = packageName; + } + + /** + *

Set the output directory. This is called by ANT.

+ * + * @param directory the output directory + */ + public void setOutputDir(String directory) + { + log( ("Setting output directory to: " + directory), + Project.MSG_VERBOSE); + this.outputDirectory = directory; + } + + /** + *

Add a header file to the list. This is called by ANT for a nested + * element.

+ * + * @return {@link org.apache.tools.ant.types.PatternSet.NameEntry} + */ + public PatternSet.NameEntry createHeader() + { + return headerSet.createInclude(); + } + + /** + *

Add a header file to the list. This is called by ANT for a nested + * element.

+ * + * @return {@link org.apache.tools.ant.types.PatternSet.NameEntry} + */ + public PatternSet.NameEntry createHeadersFile() + { + return headerSet.createIncludesFile(); + } + + /** + *

Set the set of header patterns. Patterns may be separated by a comma + * or a space. This is called by ANT.

+ * + * @param headers the string containing the header patterns + */ + public void setHeaders(String headers) + { + headerSet.setIncludes(headers); + } + + /** + *

Add an optional classpath that defines the location of {@link com.sun.gluegen.opengl.BuildStaticGLInfo} + * and BuildStaticGLInfo's dependencies.

+ * + * @returns {@link org.apache.tools.ant.types.Path} + */ + public Path createClasspath() + { + return glgenCommandline.createClasspath(project).createPath(); + } + + // ========================================================================= + /** + *

Run the task. This involves validating the set attributes, creating + * the command line to be executed and finally executing the command.

+ * + * @see org.apache.tools.ant.Task#execute() + */ + public void execute() + throws BuildException + { + // validate that all of the required attributes have been set + validateAttributes(); + + // TODO: add logic to determine if the generated file needs to be + // regenerated + + // add the attributes to the CommandlineJava + addAttributes(); + + log(glgenCommandline.describeCommand(), Project.MSG_VERBOSE); + + // execute the command and throw on error + final int error = execute(glgenCommandline.getCommandline()); + if(error == 1) + throw new BuildException( ("BuildStaticGLInfo returned: " + error), location); + } + + /** + *

Ensure that the user specified all required arguments.

+ * + * @throws BuildException if there are required arguments that are not + * present or not valid + */ + private void validateAttributes() + throws BuildException + { + // validate that the package name is set + if(!isValid(packageName)) + throw new BuildException("Invalid package name: " + packageName); + + // validate that the output directory is set + // TODO: switch to file and ensure that it exists + if(!isValid(outputDirectory)) + throw new BuildException("Invalid output directory name: " + outputDirectory); + + // TODO: validate that there are headers set + } + + /** + *

Is the specified string valid? A valid string is non-null + * and has a non-zero length.

+ * + * @param string the string to be tested for validity + * @return true if the string is valid. false + * otherwise. + */ + private boolean isValid(String string) + { + // check for null + if(string == null) + return false; + + // ensure that the string has a non-zero length + // NOTE: must trim() to remove leading and trailing whitespace + if(string.trim().length() < 1) + return false; + + // the string is valid + return true; + } + + /** + *

Add all of the attributes to the command line. They have already + * been validated.

+ */ + private void addAttributes() + { + // add the package name + glgenCommandline.createArgument().setValue(packageName); + + // add the output directory name + glgenCommandline.createArgument().setValue(outputDirectory); + + // add the header -files- from the FileSet + headerSet.setDir(getProject().getBaseDir()); + DirectoryScanner directoryScanner = headerSet.getDirectoryScanner(getProject()); + String[] directoryFiles = directoryScanner.getIncludedFiles(); + for(int i=0; iExecute {@link com.sun.gluegen.opengl.BuildStaticGLInfo} in a + * forked JVM.

+ * + * @throws BuildException + */ + private int execute(String[] command) + throws BuildException + { + // create the object that will perform the command execution + Execute execute = new Execute(new LogStreamHandler(this, Project.MSG_INFO, + Project.MSG_WARN), + null); + + // set the project and command line + execute.setAntRun(project); + execute.setCommandline(command); + execute.setWorkingDirectory( project.getBaseDir() ); + + // execute the command + try + { + return execute.execute(); + } catch(IOException ioe) + { + throw new BuildException(ioe, location); + } + } +} diff --git a/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java b/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java new file mode 100755 index 000000000..4fe81afbb --- /dev/null +++ b/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of Sun Microsystems, Inc. or the names of + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN + * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR + * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR + * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE + * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF + * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for use + * in the design, construction, operation or maintenance of any nuclear + * facility. + * + * Sun gratefully acknowledges that this software was originally authored + * and developed by Kenneth Bradley Russell and Christopher John Kline. + */ + +package com.sun.gluegen.nativesig; + +import java.io.*; +import java.util.*; + +import com.sun.gluegen.*; +import com.sun.gluegen.cgram.types.*; +import com.sun.gluegen.opengl.*; +import com.sun.gluegen.procaddress.*; + +/** Emitter producing NativeSignature attributes. */ + +public class NativeSignatureEmitter extends GLEmitter { + protected List generateMethodBindingEmitters(FunctionSymbol sym) throws Exception { + // Allow superclass to do most of the work for us + List res = super.generateMethodBindingEmitters(sym); + + // Filter out all non-JavaMethodBindingEmitters + for (Iterator iter = res.iterator(); iter.hasNext(); ) { + FunctionEmitter emitter = (FunctionEmitter) iter.next(); + if (!(emitter instanceof JavaMethodBindingEmitter)) { + iter.remove(); + } + } + + if (res.isEmpty()) { + return res; + } + + PrintWriter writer = (getConfig().allStatic() ? javaWriter() : javaImplWriter()); + + List processed = new ArrayList(); + + // First, filter out all emitters going to the "other" (public) writer + for (Iterator iter = res.iterator(); iter.hasNext(); ) { + FunctionEmitter emitter = (FunctionEmitter) iter.next(); + if (emitter.getDefaultOutput() != writer) { + processed.add(emitter); + iter.remove(); + } + } + + // Now process all of the remaining emitters sorted by MethodBinding + while (!res.isEmpty()) { + List emittersForBinding = new ArrayList(); + JavaMethodBindingEmitter emitter = (JavaMethodBindingEmitter) res.remove(0); + emittersForBinding.add(emitter); + MethodBinding binding = emitter.getBinding(); + for (Iterator iter = res.iterator(); iter.hasNext(); ) { + JavaMethodBindingEmitter emitter2 = (JavaMethodBindingEmitter) iter.next(); + if (emitter2.getBinding() == binding) { + emittersForBinding.add(emitter2); + iter.remove(); + } + } + generateNativeSignatureEmitters(binding, emittersForBinding); + processed.addAll(emittersForBinding); + } + + return processed; + } + + protected void generateNativeSignatureEmitters(MethodBinding binding, + List allEmitters) { + if (allEmitters.isEmpty()) { + return; + } + + PrintWriter writer = (getConfig().allStatic() ? javaWriter() : javaImplWriter()); + + // Give ourselves the chance to interpose on the generation of all code to keep things simple + List newEmitters = new ArrayList(); + for (Iterator iter = allEmitters.iterator(); iter.hasNext(); ) { + JavaMethodBindingEmitter javaEmitter = (JavaMethodBindingEmitter) iter.next(); + NativeSignatureJavaMethodBindingEmitter newEmitter = null; + if (javaEmitter instanceof GLJavaMethodBindingEmitter) { + newEmitter = new NativeSignatureJavaMethodBindingEmitter((GLJavaMethodBindingEmitter) javaEmitter); + } else if (javaEmitter instanceof ProcAddressJavaMethodBindingEmitter) { + newEmitter = new NativeSignatureJavaMethodBindingEmitter((ProcAddressJavaMethodBindingEmitter) javaEmitter); + } else { + newEmitter = new NativeSignatureJavaMethodBindingEmitter(javaEmitter, this); + } + newEmitters.add(newEmitter); + } + allEmitters.clear(); + allEmitters.addAll(newEmitters); + + // Detect whether we need to produce more or modify some of these emitters. + // Note that at this point we are assuming that generatePublicEmitters has + // been called with signatureOnly both true and false. + if (signatureContainsStrings(binding) && + !haveEmitterWithBody(allEmitters)) { + // This basically handles glGetString but also any similar methods + NativeSignatureJavaMethodBindingEmitter javaEmitter = findEmitterWithWriter(allEmitters, writer); + + // First, we need to clone this emitter to produce the native + // entry point + NativeSignatureJavaMethodBindingEmitter emitter = + new NativeSignatureJavaMethodBindingEmitter(javaEmitter); + emitter.removeModifier(JavaMethodBindingEmitter.PUBLIC); + emitter.addModifier(JavaMethodBindingEmitter.PRIVATE); + emitter.setForImplementingMethodCall(true); + // Note: this is chosen so we don't have to change the logic in + // emitReturnVariableSetupAndCall which decides which variant + // (direct / indirect) to call + emitter.setForDirectBufferImplementation(true); + allEmitters.add(emitter); + + // Now make the original emitter non-native and cause it to emit a body + javaEmitter.removeModifier(JavaMethodBindingEmitter.NATIVE); + javaEmitter.setEmitBody(true); + } + } + + protected boolean signatureContainsStrings(MethodBinding binding) { + for (int i = 0; i < binding.getNumArguments(); i++) { + JavaType type = binding.getJavaArgumentType(i); + if (type.isString() || type.isStringArray()) { + return true; + } + } + JavaType retType = binding.getJavaReturnType(); + if (retType.isString() || retType.isStringArray()) { + return true; + } + return false; + } + + protected boolean haveEmitterWithBody(List allEmitters) { + for (Iterator iter = allEmitters.iterator(); iter.hasNext(); ) { + JavaMethodBindingEmitter emitter = (JavaMethodBindingEmitter) iter.next(); + if (!emitter.signatureOnly()) { + return true; + } + } + return false; + } + + protected NativeSignatureJavaMethodBindingEmitter findEmitterWithWriter(List allEmitters, PrintWriter writer) { + for (Iterator iter = allEmitters.iterator(); iter.hasNext(); ) { + NativeSignatureJavaMethodBindingEmitter emitter = + (NativeSignatureJavaMethodBindingEmitter) iter.next(); + if (emitter.getDefaultOutput() == writer) { + return emitter; + } + } + throw new RuntimeException("Unexpectedly failed to find an emitter with the given writer"); + } +} diff --git a/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java b/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java new file mode 100755 index 000000000..12a6c0e4c --- /dev/null +++ b/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java @@ -0,0 +1,486 @@ +/* + * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of Sun Microsystems, Inc. or the names of + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN + * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR + * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR + * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE + * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF + * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for use + * in the design, construction, operation or maintenance of any nuclear + * facility. + * + * Sun gratefully acknowledges that this software was originally authored + * and developed by Kenneth Bradley Russell and Christopher John Kline. + */ + +package com.sun.gluegen.nativesig; + +import java.io.*; +import java.util.*; +import java.text.MessageFormat; + +import com.sun.gluegen.*; +import com.sun.gluegen.cgram.types.*; +import com.sun.gluegen.cgram.*; +import com.sun.gluegen.opengl.*; +import com.sun.gluegen.procaddress.*; + +public class NativeSignatureJavaMethodBindingEmitter extends GLJavaMethodBindingEmitter { + public NativeSignatureJavaMethodBindingEmitter(GLJavaMethodBindingEmitter methodToWrap) { + super(methodToWrap); + } + + public NativeSignatureJavaMethodBindingEmitter(ProcAddressJavaMethodBindingEmitter methodToWrap) { + super(methodToWrap, false); + } + + public NativeSignatureJavaMethodBindingEmitter(JavaMethodBindingEmitter methodToWrap, + NativeSignatureEmitter emitter) { + super(methodToWrap, false, null, false, false, emitter); + } + + protected void emitSignature(PrintWriter writer) { + writer.print(getBaseIndentString()); + emitNativeSignatureAnnotation(writer); + super.emitSignature(writer); + } + + protected void emitNativeSignatureAnnotation(PrintWriter writer) { + if (hasModifier(JavaMethodBindingEmitter.NATIVE)) { + // Emit everything as a leaf for now + // FIXME: make this configurable + writer.print("@NativeSignature(\"l"); + MethodBinding binding = getBinding(); + if (callThroughProcAddress) { + writer.print("p"); + } + writer.print("("); + if (callThroughProcAddress) { + writer.print("P"); + } + for (int i = 0; i < binding.getNumArguments(); i++) { + emitNativeSignatureElement(writer, binding.getJavaArgumentType(i), binding.getCArgumentType(i), i); + } + writer.print(")"); + emitNativeSignatureElement(writer, binding.getJavaReturnType(), binding.getCReturnType(), -1); + writer.println("\")"); + } + } + + protected void emitNativeSignatureElement(PrintWriter writer, JavaType type, Type cType, int index) { + if (type.isVoid()) { + if (index > 0) { + throw new InternalError("Error parsing arguments -- void should not be seen aside from argument 0"); + } + return; + } + + if (type.isNIOBuffer()) { + writer.print("A"); + } else if (type.isPrimitiveArray()) { + writer.print("MO"); + } else if (type.isPrimitive()) { + Class clazz = type.getJavaClass(); + if (clazz == Byte.TYPE) { writer.print("B"); } + else if (clazz == Character.TYPE) { writer.print("C"); } + else if (clazz == Double.TYPE) { writer.print("D"); } + else if (clazz == Float.TYPE) { writer.print("F"); } + else if (clazz == Integer.TYPE) { writer.print("I"); } + else if (clazz == Long.TYPE) { + // See if this is intended to be a pointer at the C level + if (cType.isPointer()) { + writer.print("A"); + } else { + writer.print("J"); + } + } + else if (clazz == Short.TYPE) { writer.print("S"); } + else if (clazz == Boolean.TYPE) { writer.print("Z"); } + else throw new InternalError("Unhandled primitive type " + clazz); + } else if (type.isString()) { + writer.print("A"); + } else { + throw new RuntimeException("Type not yet handled: " + type); + } + } + + protected String getReturnTypeString(boolean skipArray) { + if (isForImplementingMethodCall()) { + JavaType returnType = getBinding().getJavaReturnType(); + if (returnType.isString() || returnType.isNIOByteBuffer()) { + // Treat these as addresses + return "long"; + } + } + return super.getReturnTypeString(skipArray); + } + + protected void emitPreCallSetup(MethodBinding binding, PrintWriter writer) { + super.emitPreCallSetup(binding, writer); + for (int i = 0; i < binding.getNumArguments(); i++) { + JavaType type = binding.getJavaArgumentType(i); + if (type.isNIOBuffer() && !directNIOOnly) { + // Emit declarations for variables holding primitive arrays as type Object + // We don't know 100% sure we're going to use these at this point in the code, though + writer.println(" Object " + getNIOBufferArrayName(i) + " = (_direct ? null : BufferFactory.getArray(" + + getArgumentName(i) + "));"); + } else if (type.isString()) { + writer.println(" long " + binding.getArgumentName(i) + "_c_str = BufferFactoryInternal.newCString(" + binding.getArgumentName(i) + ");"); + } + // FIXME: going to need more of these for Buffer[] and String[], at least + } + } + + protected String getNIOBufferArrayName(int argNumber) { + return "__buffer_array_" + argNumber; + } + + protected int emitArguments(PrintWriter writer) + { + boolean needComma = false; + int numEmitted = 0; + + if (callThroughProcAddress) { + if (changeNameAndArguments) { + writer.print("long procAddress"); + ++numEmitted; + needComma = true; + } + } + + if (forImplementingMethodCall && binding.hasContainingType()) { + if (needComma) { + writer.print(", "); + } + + // Always emit outgoing "this" argument + writer.print("long "); + writer.print(javaThisArgumentName()); + ++numEmitted; + needComma = true; + } + + for (int i = 0; i < binding.getNumArguments(); i++) { + JavaType type = binding.getJavaArgumentType(i); + if (type.isVoid()) { + // Make sure this is the only param to the method; if it isn't, + // there's something wrong with our parsing of the headers. + if (binding.getNumArguments() != 1) { + throw new InternalError( + "\"void\" argument type found in " + + "multi-argument function \"" + binding + "\""); + } + continue; + } + + if (type.isJNIEnv() || binding.isArgumentThisPointer(i)) { + // Don't need to expose these at the Java level + continue; + } + + if (needComma) { + writer.print(", "); + } + + if (forImplementingMethodCall && + (forDirectBufferImplementation && type.isNIOBuffer() || + type.isString())) { + // Direct Buffers and Strings go out as longs + writer.print("long"); + // FIXME: will need more tests here to handle other constructs like String and direct Buffer arrays + } else { + writer.print(erasedTypeString(type, false)); + } + writer.print(" "); + writer.print(getArgumentName(i)); + + ++numEmitted; + needComma = true; + + // Add Buffer and array index offset arguments after each associated argument + if (forIndirectBufferAndArrayImplementation) { + if (type.isNIOBuffer()) { + writer.print(", int " + byteOffsetArgName(i)); + } else if (type.isNIOBufferArray()) { + writer.print(", int[] " + + byteOffsetArrayArgName(i)); + } + } + + // Add offset argument after each primitive array + if (type.isPrimitiveArray()) { + writer.print(", int " + offsetArgName(i)); + } + } + return numEmitted; + } + + protected void emitReturnVariableSetupAndCall(MethodBinding binding, PrintWriter writer) { + writer.print(" "); + JavaType returnType = binding.getJavaReturnType(); + boolean needsResultAssignment = false; + + if (!returnType.isVoid()) { + if (returnType.isCompoundTypeWrapper() || + returnType.isNIOByteBuffer()) { + writer.println("java.nio.ByteBuffer _res;"); + needsResultAssignment = true; + } else if (returnType.isArrayOfCompoundTypeWrappers()) { + writer.println("java.nio.ByteBuffer[] _res;"); + needsResultAssignment = true; + } else if (returnType.isString() || returnType.isNIOByteBuffer()) { + writer.print(returnType); + writer.println(" _res;"); + needsResultAssignment = true; + } else { + // Always assign to "_res" variable so we can clean up + // outgoing String arguments, for example + emitReturnType(writer); + writer.println(" _res;"); + needsResultAssignment = true; + } + } + + if (binding.signatureCanUseIndirectNIO() && !directNIOOnly) { + // Must generate two calls for this gated on whether the NIO + // buffers coming in are all direct or indirect + writer.println("if (_direct) {"); + writer.print (" "); + } + + if (needsResultAssignment) { + writer.print(" _res = "); + if (returnType.isString()) { + writer.print("BufferFactoryInternal.newJavaString("); + } else if (returnType.isNIOByteBuffer()) { + writer.print("BufferFactoryInternal.newDirectByteBuffer("); + } + } else { + writer.print(" "); + if (!returnType.isVoid()) { + writer.print("return "); + } + } + + if (binding.signatureUsesJavaPrimitiveArrays() && + !binding.signatureCanUseIndirectNIO()) { + // FIXME: what happens with a C function of the form + // void foo(int* arg0, void* arg1); + // ? + + // Only one call being made in this body, going to indirect + // buffer / array entry point + emitCall(binding, writer, false); + if (returnType.isString() || returnType.isNIOByteBuffer()) { + writer.print(")"); + } + writer.print(";"); + writer.println(); + } else { + emitCall(binding, writer, true); + if (returnType.isString() || returnType.isNIOByteBuffer()) { + writer.print(")"); + } + writer.print(";"); + } + + if (binding.signatureCanUseIndirectNIO() && !directNIOOnly) { + // Must generate two calls for this gated on whether the NIO + // buffers coming in are all direct or indirect + writer.println(); + writer.println(" } else {"); + writer.print (" "); + if (needsResultAssignment) { + writer.print(" _res = "); + } else { + writer.print(" "); + if (!returnType.isVoid()) { + writer.print("return "); + } + } + emitCall(binding, writer, false); + writer.print(";"); + writer.println(); + writer.println(" }"); + } else { + writer.println(); + } + emitPrologueOrEpilogue(epilogue, writer); + if (needsResultAssignment) { + emitCallResultReturn(binding, writer); + } + } + + protected int emitCallArguments(MethodBinding binding, PrintWriter writer, boolean direct) { + // Note that we override this completely because we both need to + // move the potential location of the outgoing proc address as + // well as change the way we pass out Buffers, arrays, Strings, etc. + + boolean needComma = false; + int numArgsEmitted = 0; + + if (callThroughProcAddress) { + writer.print("__addr_"); + needComma = true; + ++numArgsEmitted; + } + + if (binding.hasContainingType()) { + // Emit this pointer + assert(binding.getContainingType().isCompoundTypeWrapper()); + writer.print("BufferFactoryInternal.getDirectBufferAddress("); + writer.print("getBuffer()"); + writer.print(")"); + needComma = true; + ++numArgsEmitted; + } + for (int i = 0; i < binding.getNumArguments(); i++) { + JavaType type = binding.getJavaArgumentType(i); + if (type.isJNIEnv() || binding.isArgumentThisPointer(i)) { + // Don't need to expose these at the Java level + continue; + } + + if (type.isVoid()) { + // Make sure this is the only param to the method; if it isn't, + // there's something wrong with our parsing of the headers. + assert(binding.getNumArguments() == 1); + continue; + } + + if (needComma) { + writer.print(", "); + } + + if (type.isCompoundTypeWrapper()) { + writer.print("BufferFactoryInternal.getDirectBufferAddress("); + writer.print("(("); + } + + if (type.isNIOBuffer()) { + if (!direct) { + writer.print(getNIOBufferArrayName(i)); + } else { + writer.print("BufferFactoryInternal.getDirectBufferAddress("); + writer.print(getArgumentName(i)); + writer.print(")"); + } + } else { + writer.print(getArgumentName(i)); + } + + if (type.isCompoundTypeWrapper()) { + writer.print(" == null) ? null : "); + writer.print(getArgumentName(i)); + writer.print(".getBuffer())"); + writer.print(")"); + } + + if (type.isNIOBuffer()) { + if (direct) { + writer.print("+ BufferFactory.getDirectBufferByteOffset(" + getArgumentName(i) + ")"); + } else { + writer.print(", BufferFactoryInternal.arrayBaseOffset(" + + getNIOBufferArrayName(i) + + ") + BufferFactory.getIndirectBufferByteOffset(" + getArgumentName(i) + ")"); + } + } else if (type.isNIOBufferArray()) { + writer.print(", " + byteOffsetArrayArgName(i)); + } + + // Add Array offset parameter for primitive arrays + if (type.isPrimitiveArray()) { + writer.print(", "); + writer.print("BufferFactoryInternal.arrayBaseOffset(" + getArgumentName(i) + ") + "); + if(type.isFloatArray()) { + writer.print("BufferFactory.SIZEOF_FLOAT * "); + } else if(type.isDoubleArray()) { + writer.print("BufferFactory.SIZEOF_DOUBLE * "); + } else if(type.isByteArray()) { + writer.print("1 * "); + } else if(type.isLongArray()) { + writer.print("BufferFactory.SIZEOF_LONG * "); + } else if(type.isShortArray()) { + writer.print("BufferFactory.SIZEOF_SHORT * "); + } else if(type.isIntArray()) { + writer.print("BufferFactory.SIZEOF_INT * "); + } else { + throw new RuntimeException("Unsupported type for calculating array offset argument for " + + getArgumentName(i) + + "-- error occurred while processing Java glue code for " + getName()); + } + writer.print(offsetArgName(i)); + } + + if (type.isString()) { + writer.print("_c_str"); + } + + if (type.isCompoundTypeWrapper()) { + writer.print(")"); + } + + needComma = true; + ++numArgsEmitted; + } + return numArgsEmitted; + } + + protected void emitCallResultReturn(MethodBinding binding, PrintWriter writer) { + for (int i = 0; i < binding.getNumArguments(); i++) { + JavaType type = binding.getJavaArgumentType(i); + if (type.isString()) { + writer.println(";"); + writer.println(" BufferFactoryInternal.freeCString(" + binding.getArgumentName(i) + "_c_str);"); + } + // FIXME: will need more of these cleanups for things like Buffer[] and String[] (see above) + } + + super.emitCallResultReturn(binding, writer); + } + + public String getName() { + String res = super.getName(); + if (forImplementingMethodCall && bufferObjectVariant) { + return res + "BufObj"; + } + return res; + } + + protected String getImplMethodName(boolean direct) { + String name = null; + if (direct) { + name = binding.getRenamedMethodName() + "$0"; + } else { + name = binding.getRenamedMethodName() + "$1"; + } + if (bufferObjectVariant) { + return name + "BufObj"; + } + return name; + } +} -- cgit v1.2.3 -- cgit v1.2.3 From 77b3e23485e3d53febd07c2d6dfcf2ade111ba63 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Wed, 5 Aug 2009 07:31:49 -0700 Subject: Cleanup for a better OpenGL 3.2 integration, for subsuming extensions: - Allow RenameExtensionIntoCore generate duplicate names, ie those will not be generated. - Add proper comment showing the extension of the symbol. - Fail if no 'GLHeader' is specified, but we are processing a GL/ProcAddress config - Fail if a GL function is not part of an extension MethodBinding, ConstantDefinition cleanup: - getName() returns the renamed name - getOrigName() returns the original - getAliasedNames() returns the aliased ones MethodBinding: - Change: equals() operates on renamed name - Add: hashCode() function - same criteria as equals() Impact: - All config options etc shall trigger with the renamed name, but ignore, rename etc. - Generated Java impl. uses the renamed base name as well Change: emitDefine() uses the ConstantDefinition Add: JavaConfiguration: dumpRenames() Change JavaConfiguration.shouldIgnoreInInterface/Impl(): - respect the renamed symbol name as well Change JavaEmitter.emitFunctions(): - only emit a generated MethodBinding once, therefor store emitted method bindings in a HashSet Fix BuildStaticGLInfo: - Allow white space at the end of #ifndef and #define - Trim strings - Allow 'const' qualifier in function pattern Fix GLEmitter: - Fail if no 'GLHeader' is specified, but a RenameIntoCore option .. - Don't emit marker defines, marking an extension (ie not part of an extension) Fix GLJavaMethodBindingEmitter: - Fail if a GL function is not part of an extension Fix PCPP: - Pass constant type qualifiers for hex-constants: 'l' 'L' ... Fix ProcAddressEmitter: - Operate on the aliased/renamed name for querying ProcAddress usage and generating code. --- src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java | 4 ++-- .../gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java b/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java index 4fe81afbb..314a9bb79 100755 --- a/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java +++ b/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java @@ -50,9 +50,9 @@ import com.sun.gluegen.procaddress.*; /** Emitter producing NativeSignature attributes. */ public class NativeSignatureEmitter extends GLEmitter { - protected List generateMethodBindingEmitters(FunctionSymbol sym) throws Exception { + protected List generateMethodBindingEmitters(HashSet/**/ methodBindingSet, FunctionSymbol sym) throws Exception { // Allow superclass to do most of the work for us - List res = super.generateMethodBindingEmitters(sym); + List res = super.generateMethodBindingEmitters(methodBindingSet, sym); // Filter out all non-JavaMethodBindingEmitters for (Iterator iter = res.iterator(); iter.hasNext(); ) { diff --git a/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java b/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java index 12a6c0e4c..63d95fe51 100755 --- a/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java +++ b/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java @@ -474,9 +474,9 @@ public class NativeSignatureJavaMethodBindingEmitter extends GLJavaMethodBinding protected String getImplMethodName(boolean direct) { String name = null; if (direct) { - name = binding.getRenamedMethodName() + "$0"; + name = binding.getName() + "$0"; } else { - name = binding.getRenamedMethodName() + "$1"; + name = binding.getName() + "$1"; } if (bufferObjectVariant) { return name + "BufObj"; -- cgit v1.2.3 -- cgit v1.2.3 -- cgit v1.2.3 From 045a6ed7595f576dabfc8a565d7038fd46aacfbf Mon Sep 17 00:00:00 2001 From: Michael Bien Date: Mon, 29 Mar 2010 04:02:08 +0200 Subject: renamed BufferFactory into Buffers. --- .../NativeSignatureJavaMethodBindingEmitter.java | 34 +++++++++++----------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java b/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java index 63d95fe51..b4dc13096 100755 --- a/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java +++ b/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java @@ -146,10 +146,10 @@ public class NativeSignatureJavaMethodBindingEmitter extends GLJavaMethodBinding if (type.isNIOBuffer() && !directNIOOnly) { // Emit declarations for variables holding primitive arrays as type Object // We don't know 100% sure we're going to use these at this point in the code, though - writer.println(" Object " + getNIOBufferArrayName(i) + " = (_direct ? null : BufferFactory.getArray(" + + writer.println(" Object " + getNIOBufferArrayName(i) + " = (_direct ? null : Buffers.getArray(" + getArgumentName(i) + "));"); } else if (type.isString()) { - writer.println(" long " + binding.getArgumentName(i) + "_c_str = BufferFactoryInternal.newCString(" + binding.getArgumentName(i) + ");"); + writer.println(" long " + binding.getArgumentName(i) + "_c_str = BuffersInternal.newCString(" + binding.getArgumentName(i) + ");"); } // FIXME: going to need more of these for Buffer[] and String[], at least } @@ -275,9 +275,9 @@ public class NativeSignatureJavaMethodBindingEmitter extends GLJavaMethodBinding if (needsResultAssignment) { writer.print(" _res = "); if (returnType.isString()) { - writer.print("BufferFactoryInternal.newJavaString("); + writer.print("BuffersInternal.newJavaString("); } else if (returnType.isNIOByteBuffer()) { - writer.print("BufferFactoryInternal.newDirectByteBuffer("); + writer.print("BuffersInternal.newDirectByteBuffer("); } } else { writer.print(" "); @@ -352,7 +352,7 @@ public class NativeSignatureJavaMethodBindingEmitter extends GLJavaMethodBinding if (binding.hasContainingType()) { // Emit this pointer assert(binding.getContainingType().isCompoundTypeWrapper()); - writer.print("BufferFactoryInternal.getDirectBufferAddress("); + writer.print("BuffersInternal.getDirectBufferAddress("); writer.print("getBuffer()"); writer.print(")"); needComma = true; @@ -377,7 +377,7 @@ public class NativeSignatureJavaMethodBindingEmitter extends GLJavaMethodBinding } if (type.isCompoundTypeWrapper()) { - writer.print("BufferFactoryInternal.getDirectBufferAddress("); + writer.print("BuffersInternal.getDirectBufferAddress("); writer.print("(("); } @@ -385,7 +385,7 @@ public class NativeSignatureJavaMethodBindingEmitter extends GLJavaMethodBinding if (!direct) { writer.print(getNIOBufferArrayName(i)); } else { - writer.print("BufferFactoryInternal.getDirectBufferAddress("); + writer.print("BuffersInternal.getDirectBufferAddress("); writer.print(getArgumentName(i)); writer.print(")"); } @@ -402,11 +402,11 @@ public class NativeSignatureJavaMethodBindingEmitter extends GLJavaMethodBinding if (type.isNIOBuffer()) { if (direct) { - writer.print("+ BufferFactory.getDirectBufferByteOffset(" + getArgumentName(i) + ")"); + writer.print("+ Buffers.getDirectBufferByteOffset(" + getArgumentName(i) + ")"); } else { - writer.print(", BufferFactoryInternal.arrayBaseOffset(" + + writer.print(", BuffersInternal.arrayBaseOffset(" + getNIOBufferArrayName(i) + - ") + BufferFactory.getIndirectBufferByteOffset(" + getArgumentName(i) + ")"); + ") + Buffers.getIndirectBufferByteOffset(" + getArgumentName(i) + ")"); } } else if (type.isNIOBufferArray()) { writer.print(", " + byteOffsetArrayArgName(i)); @@ -415,19 +415,19 @@ public class NativeSignatureJavaMethodBindingEmitter extends GLJavaMethodBinding // Add Array offset parameter for primitive arrays if (type.isPrimitiveArray()) { writer.print(", "); - writer.print("BufferFactoryInternal.arrayBaseOffset(" + getArgumentName(i) + ") + "); + writer.print("BuffersInternal.arrayBaseOffset(" + getArgumentName(i) + ") + "); if(type.isFloatArray()) { - writer.print("BufferFactory.SIZEOF_FLOAT * "); + writer.print("Buffers.SIZEOF_FLOAT * "); } else if(type.isDoubleArray()) { - writer.print("BufferFactory.SIZEOF_DOUBLE * "); + writer.print("Buffers.SIZEOF_DOUBLE * "); } else if(type.isByteArray()) { writer.print("1 * "); } else if(type.isLongArray()) { - writer.print("BufferFactory.SIZEOF_LONG * "); + writer.print("Buffers.SIZEOF_LONG * "); } else if(type.isShortArray()) { - writer.print("BufferFactory.SIZEOF_SHORT * "); + writer.print("Buffers.SIZEOF_SHORT * "); } else if(type.isIntArray()) { - writer.print("BufferFactory.SIZEOF_INT * "); + writer.print("Buffers.SIZEOF_INT * "); } else { throw new RuntimeException("Unsupported type for calculating array offset argument for " + getArgumentName(i) + @@ -455,7 +455,7 @@ public class NativeSignatureJavaMethodBindingEmitter extends GLJavaMethodBinding JavaType type = binding.getJavaArgumentType(i); if (type.isString()) { writer.println(";"); - writer.println(" BufferFactoryInternal.freeCString(" + binding.getArgumentName(i) + "_c_str);"); + writer.println(" BuffersInternal.freeCString(" + binding.getArgumentName(i) + "_c_str);"); } // FIXME: will need more of these cleanups for things like Buffer[] and String[] (see above) } -- cgit v1.2.3 From ff295aa4b012730594a33a4f3a2b443b7ea6b892 Mon Sep 17 00:00:00 2001 From: Michael Bien Date: Wed, 31 Mar 2010 19:05:36 +0200 Subject: refactoring and code cleanup in gluegen.opengl and gluegen.procaddress package. --- .../gluegen/nativesig/NativeSignatureEmitter.java | 246 ++++++++++----------- .../NativeSignatureJavaMethodBindingEmitter.java | 8 +- 2 files changed, 125 insertions(+), 129 deletions(-) diff --git a/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java b/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java index 314a9bb79..f20495b65 100755 --- a/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java +++ b/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java @@ -36,7 +36,6 @@ * Sun gratefully acknowledges that this software was originally authored * and developed by Kenneth Bradley Russell and Christopher John Kline. */ - package com.sun.gluegen.nativesig; import java.io.*; @@ -47,142 +46,141 @@ import com.sun.gluegen.cgram.types.*; import com.sun.gluegen.opengl.*; import com.sun.gluegen.procaddress.*; -/** Emitter producing NativeSignature attributes. */ - +/** + * Emitter producing NativeSignature attributes. + */ public class NativeSignatureEmitter extends GLEmitter { - protected List generateMethodBindingEmitters(HashSet/**/ methodBindingSet, FunctionSymbol sym) throws Exception { - // Allow superclass to do most of the work for us - List res = super.generateMethodBindingEmitters(methodBindingSet, sym); - - // Filter out all non-JavaMethodBindingEmitters - for (Iterator iter = res.iterator(); iter.hasNext(); ) { - FunctionEmitter emitter = (FunctionEmitter) iter.next(); - if (!(emitter instanceof JavaMethodBindingEmitter)) { - iter.remove(); - } - } - if (res.isEmpty()) { - return res; - } + @Override + protected List generateMethodBindingEmitters(Set methodBindingSet, FunctionSymbol sym) throws Exception { - PrintWriter writer = (getConfig().allStatic() ? javaWriter() : javaImplWriter()); + // Allow superclass to do most of the work for us + List res = super.generateMethodBindingEmitters(methodBindingSet, sym); - List processed = new ArrayList(); + // Filter out all non-JavaMethodBindingEmitters + for (Iterator iter = res.iterator(); iter.hasNext();) { + FunctionEmitter emitter = iter.next(); + if (!(emitter instanceof JavaMethodBindingEmitter)) { + iter.remove(); + } + } - // First, filter out all emitters going to the "other" (public) writer - for (Iterator iter = res.iterator(); iter.hasNext(); ) { - FunctionEmitter emitter = (FunctionEmitter) iter.next(); - if (emitter.getDefaultOutput() != writer) { - processed.add(emitter); - iter.remove(); - } - } + if (res.isEmpty()) { + return res; + } + + PrintWriter writer = (getConfig().allStatic() ? javaWriter() : javaImplWriter()); + + List processed = new ArrayList(); - // Now process all of the remaining emitters sorted by MethodBinding - while (!res.isEmpty()) { - List emittersForBinding = new ArrayList(); - JavaMethodBindingEmitter emitter = (JavaMethodBindingEmitter) res.remove(0); - emittersForBinding.add(emitter); - MethodBinding binding = emitter.getBinding(); - for (Iterator iter = res.iterator(); iter.hasNext(); ) { - JavaMethodBindingEmitter emitter2 = (JavaMethodBindingEmitter) iter.next(); - if (emitter2.getBinding() == binding) { - emittersForBinding.add(emitter2); - iter.remove(); + // First, filter out all emitters going to the "other" (public) writer + for (Iterator iter = res.iterator(); iter.hasNext();) { + FunctionEmitter emitter = iter.next(); + if (emitter.getDefaultOutput() != writer) { + processed.add(emitter); + iter.remove(); + } } - } - generateNativeSignatureEmitters(binding, emittersForBinding); - processed.addAll(emittersForBinding); - } - return processed; - } + // Now process all of the remaining emitters sorted by MethodBinding + while (!res.isEmpty()) { + List emittersForBinding = new ArrayList(); + JavaMethodBindingEmitter emitter = (JavaMethodBindingEmitter) res.remove(0); + emittersForBinding.add(emitter); + MethodBinding binding = emitter.getBinding(); + for (Iterator iter = res.iterator(); iter.hasNext();) { + JavaMethodBindingEmitter emitter2 = (JavaMethodBindingEmitter) iter.next(); + if (emitter2.getBinding() == binding) { + emittersForBinding.add(emitter2); + iter.remove(); + } + } + generateNativeSignatureEmitters(binding, emittersForBinding); + processed.addAll(emittersForBinding); + } - protected void generateNativeSignatureEmitters(MethodBinding binding, - List allEmitters) { - if (allEmitters.isEmpty()) { - return; + return processed; } - PrintWriter writer = (getConfig().allStatic() ? javaWriter() : javaImplWriter()); - - // Give ourselves the chance to interpose on the generation of all code to keep things simple - List newEmitters = new ArrayList(); - for (Iterator iter = allEmitters.iterator(); iter.hasNext(); ) { - JavaMethodBindingEmitter javaEmitter = (JavaMethodBindingEmitter) iter.next(); - NativeSignatureJavaMethodBindingEmitter newEmitter = null; - if (javaEmitter instanceof GLJavaMethodBindingEmitter) { - newEmitter = new NativeSignatureJavaMethodBindingEmitter((GLJavaMethodBindingEmitter) javaEmitter); - } else if (javaEmitter instanceof ProcAddressJavaMethodBindingEmitter) { - newEmitter = new NativeSignatureJavaMethodBindingEmitter((ProcAddressJavaMethodBindingEmitter) javaEmitter); - } else { - newEmitter = new NativeSignatureJavaMethodBindingEmitter(javaEmitter, this); - } - newEmitters.add(newEmitter); - } - allEmitters.clear(); - allEmitters.addAll(newEmitters); - - // Detect whether we need to produce more or modify some of these emitters. - // Note that at this point we are assuming that generatePublicEmitters has - // been called with signatureOnly both true and false. - if (signatureContainsStrings(binding) && - !haveEmitterWithBody(allEmitters)) { - // This basically handles glGetString but also any similar methods - NativeSignatureJavaMethodBindingEmitter javaEmitter = findEmitterWithWriter(allEmitters, writer); - - // First, we need to clone this emitter to produce the native - // entry point - NativeSignatureJavaMethodBindingEmitter emitter = - new NativeSignatureJavaMethodBindingEmitter(javaEmitter); - emitter.removeModifier(JavaMethodBindingEmitter.PUBLIC); - emitter.addModifier(JavaMethodBindingEmitter.PRIVATE); - emitter.setForImplementingMethodCall(true); - // Note: this is chosen so we don't have to change the logic in - // emitReturnVariableSetupAndCall which decides which variant - // (direct / indirect) to call - emitter.setForDirectBufferImplementation(true); - allEmitters.add(emitter); - - // Now make the original emitter non-native and cause it to emit a body - javaEmitter.removeModifier(JavaMethodBindingEmitter.NATIVE); - javaEmitter.setEmitBody(true); - } - } - - protected boolean signatureContainsStrings(MethodBinding binding) { - for (int i = 0; i < binding.getNumArguments(); i++) { - JavaType type = binding.getJavaArgumentType(i); - if (type.isString() || type.isStringArray()) { - return true; - } + protected void generateNativeSignatureEmitters(MethodBinding binding, List allEmitters) { + + if (allEmitters.isEmpty()) { + return; + } + + PrintWriter writer = (getConfig().allStatic() ? javaWriter() : javaImplWriter()); + + // Give ourselves the chance to interpose on the generation of all code to keep things simple + List newEmitters = new ArrayList(); + for (JavaMethodBindingEmitter javaEmitter : allEmitters) { + NativeSignatureJavaMethodBindingEmitter newEmitter = null; + if (javaEmitter instanceof GLJavaMethodBindingEmitter) { + newEmitter = new NativeSignatureJavaMethodBindingEmitter((GLJavaMethodBindingEmitter) javaEmitter); + } else if (javaEmitter instanceof ProcAddressJavaMethodBindingEmitter) { + newEmitter = new NativeSignatureJavaMethodBindingEmitter((ProcAddressJavaMethodBindingEmitter) javaEmitter); + } else { + newEmitter = new NativeSignatureJavaMethodBindingEmitter(javaEmitter, this); + } + newEmitters.add(newEmitter); + } + allEmitters.clear(); + allEmitters.addAll(newEmitters); + + // Detect whether we need to produce more or modify some of these emitters. + // Note that at this point we are assuming that generatePublicEmitters has + // been called with signatureOnly both true and false. + if (signatureContainsStrings(binding) && !haveEmitterWithBody(allEmitters)) { + // This basically handles glGetString but also any similar methods + NativeSignatureJavaMethodBindingEmitter javaEmitter = findEmitterWithWriter(allEmitters, writer); + + // First, we need to clone this emitter to produce the native + // entry point + NativeSignatureJavaMethodBindingEmitter emitter = new NativeSignatureJavaMethodBindingEmitter(javaEmitter); + emitter.removeModifier(JavaMethodBindingEmitter.PUBLIC); + emitter.addModifier(JavaMethodBindingEmitter.PRIVATE); + emitter.setForImplementingMethodCall(true); + // Note: this is chosen so we don't have to change the logic in + // emitReturnVariableSetupAndCall which decides which variant + // (direct / indirect) to call + emitter.setForDirectBufferImplementation(true); + allEmitters.add(emitter); + + // Now make the original emitter non-native and cause it to emit a body + javaEmitter.removeModifier(JavaMethodBindingEmitter.NATIVE); + javaEmitter.setEmitBody(true); + } } - JavaType retType = binding.getJavaReturnType(); - if (retType.isString() || retType.isStringArray()) { - return true; + + protected boolean signatureContainsStrings(MethodBinding binding) { + for (int i = 0; i < binding.getNumArguments(); i++) { + JavaType type = binding.getJavaArgumentType(i); + if (type.isString() || type.isStringArray()) { + return true; + } + } + JavaType retType = binding.getJavaReturnType(); + if (retType.isString() || retType.isStringArray()) { + return true; + } + return false; } - return false; - } - - protected boolean haveEmitterWithBody(List allEmitters) { - for (Iterator iter = allEmitters.iterator(); iter.hasNext(); ) { - JavaMethodBindingEmitter emitter = (JavaMethodBindingEmitter) iter.next(); - if (!emitter.signatureOnly()) { - return true; - } + + protected boolean haveEmitterWithBody(List allEmitters) { + for (JavaMethodBindingEmitter emitter : allEmitters) { + if (!emitter.signatureOnly()) { + return true; + } + } + return false; } - return false; - } - - protected NativeSignatureJavaMethodBindingEmitter findEmitterWithWriter(List allEmitters, PrintWriter writer) { - for (Iterator iter = allEmitters.iterator(); iter.hasNext(); ) { - NativeSignatureJavaMethodBindingEmitter emitter = - (NativeSignatureJavaMethodBindingEmitter) iter.next(); - if (emitter.getDefaultOutput() == writer) { - return emitter; - } + + protected NativeSignatureJavaMethodBindingEmitter findEmitterWithWriter(List allEmitters, PrintWriter writer) { + for (JavaMethodBindingEmitter jemitter : allEmitters) { + NativeSignatureJavaMethodBindingEmitter emitter = (NativeSignatureJavaMethodBindingEmitter)jemitter; + if (emitter.getDefaultOutput() == writer) { + return emitter; + } + } + throw new RuntimeException("Unexpectedly failed to find an emitter with the given writer"); } - throw new RuntimeException("Unexpectedly failed to find an emitter with the given writer"); - } } diff --git a/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java b/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java index b4dc13096..379eccf1f 100755 --- a/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java +++ b/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java @@ -40,16 +40,14 @@ package com.sun.gluegen.nativesig; import java.io.*; -import java.util.*; -import java.text.MessageFormat; import com.sun.gluegen.*; import com.sun.gluegen.cgram.types.*; -import com.sun.gluegen.cgram.*; import com.sun.gluegen.opengl.*; import com.sun.gluegen.procaddress.*; public class NativeSignatureJavaMethodBindingEmitter extends GLJavaMethodBindingEmitter { + public NativeSignatureJavaMethodBindingEmitter(GLJavaMethodBindingEmitter methodToWrap) { super(methodToWrap); } @@ -58,11 +56,11 @@ public class NativeSignatureJavaMethodBindingEmitter extends GLJavaMethodBinding super(methodToWrap, false); } - public NativeSignatureJavaMethodBindingEmitter(JavaMethodBindingEmitter methodToWrap, - NativeSignatureEmitter emitter) { + public NativeSignatureJavaMethodBindingEmitter(JavaMethodBindingEmitter methodToWrap, NativeSignatureEmitter emitter) { super(methodToWrap, false, null, false, false, emitter); } + @Override protected void emitSignature(PrintWriter writer) { writer.print(getBaseIndentString()); emitNativeSignatureAnnotation(writer); -- cgit v1.2.3 -- cgit v1.2.3 -- cgit v1.2.3 -- cgit v1.2.3 -- cgit v1.2.3 -- cgit v1.2.3 -- cgit v1.2.3 -- cgit v1.2.3 -- cgit v1.2.3 -- cgit v1.2.3 From 40495c4e04ab8b15e17ec6bdc6b6c35f4144c34e Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Sat, 6 Nov 2010 23:13:39 +0100 Subject: Renamed com.sun.gluegen -> com.jogamp.gluegen --- .../com/jogamp/gluegen/ant/StaticGLGenTask.java | 304 +++++++++++++ .../gluegen/nativesig/NativeSignatureEmitter.java | 190 ++++++++ .../NativeSignatureJavaMethodBindingEmitter.java | 487 +++++++++++++++++++++ src/java/com/sun/gluegen/ant/StaticGLGenTask.java | 304 ------------- .../gluegen/nativesig/NativeSignatureEmitter.java | 186 -------- .../NativeSignatureJavaMethodBindingEmitter.java | 484 -------------------- 6 files changed, 981 insertions(+), 974 deletions(-) create mode 100644 src/java/com/jogamp/gluegen/ant/StaticGLGenTask.java create mode 100755 src/java/com/jogamp/gluegen/nativesig/NativeSignatureEmitter.java create mode 100755 src/java/com/jogamp/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java delete mode 100644 src/java/com/sun/gluegen/ant/StaticGLGenTask.java delete mode 100755 src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java delete mode 100755 src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java diff --git a/src/java/com/jogamp/gluegen/ant/StaticGLGenTask.java b/src/java/com/jogamp/gluegen/ant/StaticGLGenTask.java new file mode 100644 index 000000000..2785344a5 --- /dev/null +++ b/src/java/com/jogamp/gluegen/ant/StaticGLGenTask.java @@ -0,0 +1,304 @@ +package com.jogamp.gluegen.ant; + +/* + * StaticGLGenTask.java + * Copyright (C) 2003 Rob Grzywinski (rgrzywinski@realityinteractive.com) + * + * Copying, distribution and use of this software in source and binary + * forms, with or without modification, is permitted provided that the + * following conditions are met: + * + * Distributions of source code must reproduce the copyright notice, + * this list of conditions and the following disclaimer in the source + * code header files; and Distributions of binary code must reproduce + * the copyright notice, this list of conditions and the following + * disclaimer in the documentation, Read me file, license file and/or + * other materials provided with the software distribution. + * + * The names of Sun Microsystems, Inc. ("Sun") and/or the copyright + * holder may not be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS," WITHOUT A WARRANTY OF ANY + * KIND. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND + * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, NON-INTERFERENCE, ACCURACY OF + * INFORMATIONAL CONTENT OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. THE + * COPYRIGHT HOLDER, SUN AND SUN'S LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL THE + * COPYRIGHT HOLDER, SUN OR SUN'S LICENSORS BE LIABLE FOR ANY LOST + * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, + * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND + * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR + * INABILITY TO USE THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGES. YOU ACKNOWLEDGE THAT THIS SOFTWARE IS NOT + * DESIGNED, LICENSED OR INTENDED FOR USE IN THE DESIGN, CONSTRUCTION, + * OPERATION OR MAINTENANCE OF ANY NUCLEAR FACILITY. THE COPYRIGHT + * HOLDER, SUN AND SUN'S LICENSORS DISCLAIM ANY EXPRESS OR IMPLIED + * WARRANTY OF FITNESS FOR SUCH USES. + */ + +import java.io.IOException; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.DirectoryScanner; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.Task; +import org.apache.tools.ant.taskdefs.Execute; +import org.apache.tools.ant.taskdefs.LogStreamHandler; +import org.apache.tools.ant.types.CommandlineJava; +import org.apache.tools.ant.types.FileSet; +import org.apache.tools.ant.types.Path; +import org.apache.tools.ant.types.PatternSet; +import org.apache.tools.ant.util.JavaEnvUtils; + +/** + *

An ANT {@link org.apache.tools.ant.Task} + * for using {@link com.jogamp.gluegen.opengl.BuildStaticGLInfo}.

+ * + *

Usage:

+ *
+    <staticglgen package="[generated files package]" 
+                    headers="[file pattern of GL headers]"
+                    outputdir="[directory to output the generated files]" />
+ * 
+ * + * @author Rob Grzywinski rgrzywinski@yahoo.com + */ +// FIXME: blow out javadoc +public class StaticGLGenTask extends Task +{ + /** + *

The {@link com.jogamp.gluegen.opengl.BuildStaticGLInfo} classname.

+ */ + private static final String GL_GEN = "com.jogamp.gluegen.opengl.BuildStaticGLInfo"; + + // ========================================================================= + /** + *

The {@link org.apache.tools.ant.types.CommandlineJava} that is used + * to execute {@link com.jogamp.gluegen.opengl.BuildStaticGLInfo}.

+ */ + private CommandlineJava glgenCommandline; + + // ========================================================================= + /** + *

The package name for the generated files.

+ */ + private String packageName; + + /** + *

The output directory.

+ */ + private String outputDirectory; + + /** + *

The {@link org.apache.tools.ant.types.FileSet} of GL headers.

+ */ + private FileSet headerSet = new FileSet(); + + // ========================================================================= + /** + *

Create and add the VM and classname to {@link org.apache.tools.ant.types.CommandlineJava}.

+ */ + public StaticGLGenTask() + { + // create the CommandlineJava that will be used to call BuildStaticGLInfo + glgenCommandline = new CommandlineJava(); + + // set the VM and classname in the commandline + glgenCommandline.setVm(JavaEnvUtils.getJreExecutable("java")); + glgenCommandline.setClassname(GL_GEN); + } + + // ========================================================================= + // ANT getters and setters + /** + *

Set the package name for the generated files. This is called by ANT.

+ * + * @param packageName the name of the package for the generated files + */ + public void setPackage(String packageName) + { + log( ("Setting package name to: " + packageName), Project.MSG_VERBOSE); + this.packageName = packageName; + } + + /** + *

Set the output directory. This is called by ANT.

+ * + * @param directory the output directory + */ + public void setOutputDir(String directory) + { + log( ("Setting output directory to: " + directory), + Project.MSG_VERBOSE); + this.outputDirectory = directory; + } + + /** + *

Add a header file to the list. This is called by ANT for a nested + * element.

+ * + * @return {@link org.apache.tools.ant.types.PatternSet.NameEntry} + */ + public PatternSet.NameEntry createHeader() + { + return headerSet.createInclude(); + } + + /** + *

Add a header file to the list. This is called by ANT for a nested + * element.

+ * + * @return {@link org.apache.tools.ant.types.PatternSet.NameEntry} + */ + public PatternSet.NameEntry createHeadersFile() + { + return headerSet.createIncludesFile(); + } + + /** + *

Set the set of header patterns. Patterns may be separated by a comma + * or a space. This is called by ANT.

+ * + * @param headers the string containing the header patterns + */ + public void setHeaders(String headers) + { + headerSet.setIncludes(headers); + } + + /** + *

Add an optional classpath that defines the location of {@link com.jogamp.gluegen.opengl.BuildStaticGLInfo} + * and BuildStaticGLInfo's dependencies.

+ * + * @returns {@link org.apache.tools.ant.types.Path} + */ + public Path createClasspath() + { + return glgenCommandline.createClasspath(project).createPath(); + } + + // ========================================================================= + /** + *

Run the task. This involves validating the set attributes, creating + * the command line to be executed and finally executing the command.

+ * + * @see org.apache.tools.ant.Task#execute() + */ + public void execute() + throws BuildException + { + // validate that all of the required attributes have been set + validateAttributes(); + + // TODO: add logic to determine if the generated file needs to be + // regenerated + + // add the attributes to the CommandlineJava + addAttributes(); + + log(glgenCommandline.describeCommand(), Project.MSG_VERBOSE); + + // execute the command and throw on error + final int error = execute(glgenCommandline.getCommandline()); + if(error == 1) + throw new BuildException( ("BuildStaticGLInfo returned: " + error), location); + } + + /** + *

Ensure that the user specified all required arguments.

+ * + * @throws BuildException if there are required arguments that are not + * present or not valid + */ + private void validateAttributes() + throws BuildException + { + // validate that the package name is set + if(!isValid(packageName)) + throw new BuildException("Invalid package name: " + packageName); + + // validate that the output directory is set + // TODO: switch to file and ensure that it exists + if(!isValid(outputDirectory)) + throw new BuildException("Invalid output directory name: " + outputDirectory); + + // TODO: validate that there are headers set + } + + /** + *

Is the specified string valid? A valid string is non-null + * and has a non-zero length.

+ * + * @param string the string to be tested for validity + * @return true if the string is valid. false + * otherwise. + */ + private boolean isValid(String string) + { + // check for null + if(string == null) + return false; + + // ensure that the string has a non-zero length + // NOTE: must trim() to remove leading and trailing whitespace + if(string.trim().length() < 1) + return false; + + // the string is valid + return true; + } + + /** + *

Add all of the attributes to the command line. They have already + * been validated.

+ */ + private void addAttributes() + { + // add the package name + glgenCommandline.createArgument().setValue(packageName); + + // add the output directory name + glgenCommandline.createArgument().setValue(outputDirectory); + + // add the header -files- from the FileSet + headerSet.setDir(getProject().getBaseDir()); + DirectoryScanner directoryScanner = headerSet.getDirectoryScanner(getProject()); + String[] directoryFiles = directoryScanner.getIncludedFiles(); + for(int i=0; iExecute {@link com.jogamp.gluegen.opengl.BuildStaticGLInfo} in a + * forked JVM.

+ * + * @throws BuildException + */ + private int execute(String[] command) + throws BuildException + { + // create the object that will perform the command execution + Execute execute = new Execute(new LogStreamHandler(this, Project.MSG_INFO, + Project.MSG_WARN), + null); + + // set the project and command line + execute.setAntRun(project); + execute.setCommandline(command); + execute.setWorkingDirectory( project.getBaseDir() ); + + // execute the command + try + { + return execute.execute(); + } catch(IOException ioe) + { + throw new BuildException(ioe, location); + } + } +} diff --git a/src/java/com/jogamp/gluegen/nativesig/NativeSignatureEmitter.java b/src/java/com/jogamp/gluegen/nativesig/NativeSignatureEmitter.java new file mode 100755 index 000000000..bbc33d706 --- /dev/null +++ b/src/java/com/jogamp/gluegen/nativesig/NativeSignatureEmitter.java @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of Sun Microsystems, Inc. or the names of + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN + * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR + * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR + * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE + * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF + * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for use + * in the design, construction, operation or maintenance of any nuclear + * facility. + * + * Sun gratefully acknowledges that this software was originally authored + * and developed by Kenneth Bradley Russell and Christopher John Kline. + */ +package com.jogamp.gluegen.nativesig; + +import com.jogamp.gluegen.MethodBinding; +import com.jogamp.gluegen.FunctionEmitter; +import com.jogamp.gluegen.JavaMethodBindingEmitter; +import com.jogamp.gluegen.JavaType; +import java.io.*; +import java.util.*; + +import com.jogamp.gluegen.*; +import com.jogamp.gluegen.cgram.types.*; +import com.jogamp.gluegen.opengl.*; +import com.jogamp.gluegen.procaddress.*; + +/** + * Emitter producing NativeSignature attributes. + */ +public class NativeSignatureEmitter extends GLEmitter { + + @Override + protected List generateMethodBindingEmitters(Set methodBindingSet, FunctionSymbol sym) throws Exception { + + // Allow superclass to do most of the work for us + List res = super.generateMethodBindingEmitters(methodBindingSet, sym); + + // Filter out all non-JavaMethodBindingEmitters + for (Iterator iter = res.iterator(); iter.hasNext();) { + FunctionEmitter emitter = iter.next(); + if (!(emitter instanceof JavaMethodBindingEmitter)) { + iter.remove(); + } + } + + if (res.isEmpty()) { + return res; + } + + PrintWriter writer = (getConfig().allStatic() ? javaWriter() : javaImplWriter()); + + List processed = new ArrayList(); + + // First, filter out all emitters going to the "other" (public) writer + for (Iterator iter = res.iterator(); iter.hasNext();) { + FunctionEmitter emitter = iter.next(); + if (emitter.getDefaultOutput() != writer) { + processed.add(emitter); + iter.remove(); + } + } + + // Now process all of the remaining emitters sorted by MethodBinding + while (!res.isEmpty()) { + List emittersForBinding = new ArrayList(); + JavaMethodBindingEmitter emitter = (JavaMethodBindingEmitter) res.remove(0); + emittersForBinding.add(emitter); + MethodBinding binding = emitter.getBinding(); + for (Iterator iter = res.iterator(); iter.hasNext();) { + JavaMethodBindingEmitter emitter2 = (JavaMethodBindingEmitter) iter.next(); + if (emitter2.getBinding() == binding) { + emittersForBinding.add(emitter2); + iter.remove(); + } + } + generateNativeSignatureEmitters(binding, emittersForBinding); + processed.addAll(emittersForBinding); + } + + return processed; + } + + protected void generateNativeSignatureEmitters(MethodBinding binding, List allEmitters) { + + if (allEmitters.isEmpty()) { + return; + } + + PrintWriter writer = (getConfig().allStatic() ? javaWriter() : javaImplWriter()); + + // Give ourselves the chance to interpose on the generation of all code to keep things simple + List newEmitters = new ArrayList(); + for (JavaMethodBindingEmitter javaEmitter : allEmitters) { + NativeSignatureJavaMethodBindingEmitter newEmitter = null; + if (javaEmitter instanceof GLJavaMethodBindingEmitter) { + newEmitter = new NativeSignatureJavaMethodBindingEmitter((GLJavaMethodBindingEmitter) javaEmitter); + } else if (javaEmitter instanceof ProcAddressJavaMethodBindingEmitter) { + newEmitter = new NativeSignatureJavaMethodBindingEmitter((ProcAddressJavaMethodBindingEmitter) javaEmitter); + } else { + newEmitter = new NativeSignatureJavaMethodBindingEmitter(javaEmitter, this); + } + newEmitters.add(newEmitter); + } + allEmitters.clear(); + allEmitters.addAll(newEmitters); + + // Detect whether we need to produce more or modify some of these emitters. + // Note that at this point we are assuming that generatePublicEmitters has + // been called with signatureOnly both true and false. + if (signatureContainsStrings(binding) && !haveEmitterWithBody(allEmitters)) { + // This basically handles glGetString but also any similar methods + NativeSignatureJavaMethodBindingEmitter javaEmitter = findEmitterWithWriter(allEmitters, writer); + + // First, we need to clone this emitter to produce the native + // entry point + NativeSignatureJavaMethodBindingEmitter emitter = new NativeSignatureJavaMethodBindingEmitter(javaEmitter); + emitter.removeModifier(JavaMethodBindingEmitter.PUBLIC); + emitter.addModifier(JavaMethodBindingEmitter.PRIVATE); + emitter.setForImplementingMethodCall(true); + // Note: this is chosen so we don't have to change the logic in + // emitReturnVariableSetupAndCall which decides which variant + // (direct / indirect) to call + emitter.setForDirectBufferImplementation(true); + allEmitters.add(emitter); + + // Now make the original emitter non-native and cause it to emit a body + javaEmitter.removeModifier(JavaMethodBindingEmitter.NATIVE); + javaEmitter.setEmitBody(true); + } + } + + protected boolean signatureContainsStrings(MethodBinding binding) { + for (int i = 0; i < binding.getNumArguments(); i++) { + JavaType type = binding.getJavaArgumentType(i); + if (type.isString() || type.isStringArray()) { + return true; + } + } + JavaType retType = binding.getJavaReturnType(); + if (retType.isString() || retType.isStringArray()) { + return true; + } + return false; + } + + protected boolean haveEmitterWithBody(List allEmitters) { + for (JavaMethodBindingEmitter emitter : allEmitters) { + if (!emitter.signatureOnly()) { + return true; + } + } + return false; + } + + protected NativeSignatureJavaMethodBindingEmitter findEmitterWithWriter(List allEmitters, PrintWriter writer) { + for (JavaMethodBindingEmitter jemitter : allEmitters) { + NativeSignatureJavaMethodBindingEmitter emitter = (NativeSignatureJavaMethodBindingEmitter)jemitter; + if (emitter.getDefaultOutput() == writer) { + return emitter; + } + } + throw new RuntimeException("Unexpectedly failed to find an emitter with the given writer"); + } +} diff --git a/src/java/com/jogamp/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java b/src/java/com/jogamp/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java new file mode 100755 index 000000000..060d00861 --- /dev/null +++ b/src/java/com/jogamp/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java @@ -0,0 +1,487 @@ +/* + * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of Sun Microsystems, Inc. or the names of + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN + * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR + * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR + * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE + * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF + * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for use + * in the design, construction, operation or maintenance of any nuclear + * facility. + * + * Sun gratefully acknowledges that this software was originally authored + * and developed by Kenneth Bradley Russell and Christopher John Kline. + */ + +package com.jogamp.gluegen.nativesig; + +import com.jogamp.gluegen.MethodBinding; +import com.jogamp.gluegen.JavaMethodBindingEmitter; +import com.jogamp.gluegen.JavaType; +import java.io.*; + +import com.jogamp.gluegen.*; +import com.jogamp.gluegen.cgram.types.*; +import com.jogamp.gluegen.opengl.*; +import com.jogamp.gluegen.procaddress.*; + +public class NativeSignatureJavaMethodBindingEmitter extends GLJavaMethodBindingEmitter { + + public NativeSignatureJavaMethodBindingEmitter(GLJavaMethodBindingEmitter methodToWrap) { + super(methodToWrap); + } + + public NativeSignatureJavaMethodBindingEmitter(ProcAddressJavaMethodBindingEmitter methodToWrap) { + super(methodToWrap, false); + } + + public NativeSignatureJavaMethodBindingEmitter(JavaMethodBindingEmitter methodToWrap, NativeSignatureEmitter emitter) { + super(methodToWrap, false, null, false, false, emitter); + } + + @Override + protected void emitSignature(PrintWriter writer) { + writer.print(getBaseIndentString()); + emitNativeSignatureAnnotation(writer); + super.emitSignature(writer); + } + + protected void emitNativeSignatureAnnotation(PrintWriter writer) { + if (hasModifier(JavaMethodBindingEmitter.NATIVE)) { + // Emit everything as a leaf for now + // FIXME: make this configurable + writer.print("@NativeSignature(\"l"); + MethodBinding binding = getBinding(); + if (callThroughProcAddress) { + writer.print("p"); + } + writer.print("("); + if (callThroughProcAddress) { + writer.print("P"); + } + for (int i = 0; i < binding.getNumArguments(); i++) { + emitNativeSignatureElement(writer, binding.getJavaArgumentType(i), binding.getCArgumentType(i), i); + } + writer.print(")"); + emitNativeSignatureElement(writer, binding.getJavaReturnType(), binding.getCReturnType(), -1); + writer.println("\")"); + } + } + + protected void emitNativeSignatureElement(PrintWriter writer, JavaType type, Type cType, int index) { + if (type.isVoid()) { + if (index > 0) { + throw new InternalError("Error parsing arguments -- void should not be seen aside from argument 0"); + } + return; + } + + if (type.isNIOBuffer()) { + writer.print("A"); + } else if (type.isPrimitiveArray()) { + writer.print("MO"); + } else if (type.isPrimitive()) { + Class clazz = type.getJavaClass(); + if (clazz == Byte.TYPE) { writer.print("B"); } + else if (clazz == Character.TYPE) { writer.print("C"); } + else if (clazz == Double.TYPE) { writer.print("D"); } + else if (clazz == Float.TYPE) { writer.print("F"); } + else if (clazz == Integer.TYPE) { writer.print("I"); } + else if (clazz == Long.TYPE) { + // See if this is intended to be a pointer at the C level + if (cType.isPointer()) { + writer.print("A"); + } else { + writer.print("J"); + } + } + else if (clazz == Short.TYPE) { writer.print("S"); } + else if (clazz == Boolean.TYPE) { writer.print("Z"); } + else throw new InternalError("Unhandled primitive type " + clazz); + } else if (type.isString()) { + writer.print("A"); + } else { + throw new RuntimeException("Type not yet handled: " + type); + } + } + + protected String getReturnTypeString(boolean skipArray) { + if (isForImplementingMethodCall()) { + JavaType returnType = getBinding().getJavaReturnType(); + if (returnType.isString() || returnType.isNIOByteBuffer()) { + // Treat these as addresses + return "long"; + } + } + return super.getReturnTypeString(skipArray); + } + + protected void emitPreCallSetup(MethodBinding binding, PrintWriter writer) { + super.emitPreCallSetup(binding, writer); + for (int i = 0; i < binding.getNumArguments(); i++) { + JavaType type = binding.getJavaArgumentType(i); + if (type.isNIOBuffer() && !directNIOOnly) { + // Emit declarations for variables holding primitive arrays as type Object + // We don't know 100% sure we're going to use these at this point in the code, though + writer.println(" Object " + getNIOBufferArrayName(i) + " = (_direct ? null : Buffers.getArray(" + + getArgumentName(i) + "));"); + } else if (type.isString()) { + writer.println(" long " + binding.getArgumentName(i) + "_c_str = BuffersInternal.newCString(" + binding.getArgumentName(i) + ");"); + } + // FIXME: going to need more of these for Buffer[] and String[], at least + } + } + + protected String getNIOBufferArrayName(int argNumber) { + return "__buffer_array_" + argNumber; + } + + protected int emitArguments(PrintWriter writer) + { + boolean needComma = false; + int numEmitted = 0; + + if (callThroughProcAddress) { + if (changeNameAndArguments) { + writer.print("long procAddress"); + ++numEmitted; + needComma = true; + } + } + + if (forImplementingMethodCall && binding.hasContainingType()) { + if (needComma) { + writer.print(", "); + } + + // Always emit outgoing "this" argument + writer.print("long "); + writer.print(javaThisArgumentName()); + ++numEmitted; + needComma = true; + } + + for (int i = 0; i < binding.getNumArguments(); i++) { + JavaType type = binding.getJavaArgumentType(i); + if (type.isVoid()) { + // Make sure this is the only param to the method; if it isn't, + // there's something wrong with our parsing of the headers. + if (binding.getNumArguments() != 1) { + throw new InternalError( + "\"void\" argument type found in " + + "multi-argument function \"" + binding + "\""); + } + continue; + } + + if (type.isJNIEnv() || binding.isArgumentThisPointer(i)) { + // Don't need to expose these at the Java level + continue; + } + + if (needComma) { + writer.print(", "); + } + + if (forImplementingMethodCall && + (forDirectBufferImplementation && type.isNIOBuffer() || + type.isString())) { + // Direct Buffers and Strings go out as longs + writer.print("long"); + // FIXME: will need more tests here to handle other constructs like String and direct Buffer arrays + } else { + writer.print(erasedTypeString(type, false)); + } + writer.print(" "); + writer.print(getArgumentName(i)); + + ++numEmitted; + needComma = true; + + // Add Buffer and array index offset arguments after each associated argument + if (forIndirectBufferAndArrayImplementation) { + if (type.isNIOBuffer()) { + writer.print(", int " + byteOffsetArgName(i)); + } else if (type.isNIOBufferArray()) { + writer.print(", int[] " + + byteOffsetArrayArgName(i)); + } + } + + // Add offset argument after each primitive array + if (type.isPrimitiveArray()) { + writer.print(", int " + offsetArgName(i)); + } + } + return numEmitted; + } + + protected void emitReturnVariableSetupAndCall(MethodBinding binding, PrintWriter writer) { + writer.print(" "); + JavaType returnType = binding.getJavaReturnType(); + boolean needsResultAssignment = false; + + if (!returnType.isVoid()) { + if (returnType.isCompoundTypeWrapper() || + returnType.isNIOByteBuffer()) { + writer.println("java.nio.ByteBuffer _res;"); + needsResultAssignment = true; + } else if (returnType.isArrayOfCompoundTypeWrappers()) { + writer.println("java.nio.ByteBuffer[] _res;"); + needsResultAssignment = true; + } else if (returnType.isString() || returnType.isNIOByteBuffer()) { + writer.print(returnType); + writer.println(" _res;"); + needsResultAssignment = true; + } else { + // Always assign to "_res" variable so we can clean up + // outgoing String arguments, for example + emitReturnType(writer); + writer.println(" _res;"); + needsResultAssignment = true; + } + } + + if (binding.signatureCanUseIndirectNIO() && !directNIOOnly) { + // Must generate two calls for this gated on whether the NIO + // buffers coming in are all direct or indirect + writer.println("if (_direct) {"); + writer.print (" "); + } + + if (needsResultAssignment) { + writer.print(" _res = "); + if (returnType.isString()) { + writer.print("BuffersInternal.newJavaString("); + } else if (returnType.isNIOByteBuffer()) { + writer.print("BuffersInternal.newDirectByteBuffer("); + } + } else { + writer.print(" "); + if (!returnType.isVoid()) { + writer.print("return "); + } + } + + if (binding.signatureUsesJavaPrimitiveArrays() && + !binding.signatureCanUseIndirectNIO()) { + // FIXME: what happens with a C function of the form + // void foo(int* arg0, void* arg1); + // ? + + // Only one call being made in this body, going to indirect + // buffer / array entry point + emitCall(binding, writer, false); + if (returnType.isString() || returnType.isNIOByteBuffer()) { + writer.print(")"); + } + writer.print(";"); + writer.println(); + } else { + emitCall(binding, writer, true); + if (returnType.isString() || returnType.isNIOByteBuffer()) { + writer.print(")"); + } + writer.print(";"); + } + + if (binding.signatureCanUseIndirectNIO() && !directNIOOnly) { + // Must generate two calls for this gated on whether the NIO + // buffers coming in are all direct or indirect + writer.println(); + writer.println(" } else {"); + writer.print (" "); + if (needsResultAssignment) { + writer.print(" _res = "); + } else { + writer.print(" "); + if (!returnType.isVoid()) { + writer.print("return "); + } + } + emitCall(binding, writer, false); + writer.print(";"); + writer.println(); + writer.println(" }"); + } else { + writer.println(); + } + emitPrologueOrEpilogue(epilogue, writer); + if (needsResultAssignment) { + emitCallResultReturn(binding, writer); + } + } + + protected int emitCallArguments(MethodBinding binding, PrintWriter writer, boolean direct) { + // Note that we override this completely because we both need to + // move the potential location of the outgoing proc address as + // well as change the way we pass out Buffers, arrays, Strings, etc. + + boolean needComma = false; + int numArgsEmitted = 0; + + if (callThroughProcAddress) { + writer.print("__addr_"); + needComma = true; + ++numArgsEmitted; + } + + if (binding.hasContainingType()) { + // Emit this pointer + assert(binding.getContainingType().isCompoundTypeWrapper()); + writer.print("BuffersInternal.getDirectBufferAddress("); + writer.print("getBuffer()"); + writer.print(")"); + needComma = true; + ++numArgsEmitted; + } + for (int i = 0; i < binding.getNumArguments(); i++) { + JavaType type = binding.getJavaArgumentType(i); + if (type.isJNIEnv() || binding.isArgumentThisPointer(i)) { + // Don't need to expose these at the Java level + continue; + } + + if (type.isVoid()) { + // Make sure this is the only param to the method; if it isn't, + // there's something wrong with our parsing of the headers. + assert(binding.getNumArguments() == 1); + continue; + } + + if (needComma) { + writer.print(", "); + } + + if (type.isCompoundTypeWrapper()) { + writer.print("BuffersInternal.getDirectBufferAddress("); + writer.print("(("); + } + + if (type.isNIOBuffer()) { + if (!direct) { + writer.print(getNIOBufferArrayName(i)); + } else { + writer.print("BuffersInternal.getDirectBufferAddress("); + writer.print(getArgumentName(i)); + writer.print(")"); + } + } else { + writer.print(getArgumentName(i)); + } + + if (type.isCompoundTypeWrapper()) { + writer.print(" == null) ? null : "); + writer.print(getArgumentName(i)); + writer.print(".getBuffer())"); + writer.print(")"); + } + + if (type.isNIOBuffer()) { + if (direct) { + writer.print("+ Buffers.getDirectBufferByteOffset(" + getArgumentName(i) + ")"); + } else { + writer.print(", BuffersInternal.arrayBaseOffset(" + + getNIOBufferArrayName(i) + + ") + Buffers.getIndirectBufferByteOffset(" + getArgumentName(i) + ")"); + } + } else if (type.isNIOBufferArray()) { + writer.print(", " + byteOffsetArrayArgName(i)); + } + + // Add Array offset parameter for primitive arrays + if (type.isPrimitiveArray()) { + writer.print(", "); + writer.print("BuffersInternal.arrayBaseOffset(" + getArgumentName(i) + ") + "); + if(type.isFloatArray()) { + writer.print("Buffers.SIZEOF_FLOAT * "); + } else if(type.isDoubleArray()) { + writer.print("Buffers.SIZEOF_DOUBLE * "); + } else if(type.isByteArray()) { + writer.print("1 * "); + } else if(type.isLongArray()) { + writer.print("Buffers.SIZEOF_LONG * "); + } else if(type.isShortArray()) { + writer.print("Buffers.SIZEOF_SHORT * "); + } else if(type.isIntArray()) { + writer.print("Buffers.SIZEOF_INT * "); + } else { + throw new RuntimeException("Unsupported type for calculating array offset argument for " + + getArgumentName(i) + + "-- error occurred while processing Java glue code for " + getName()); + } + writer.print(offsetArgName(i)); + } + + if (type.isString()) { + writer.print("_c_str"); + } + + if (type.isCompoundTypeWrapper()) { + writer.print(")"); + } + + needComma = true; + ++numArgsEmitted; + } + return numArgsEmitted; + } + + protected void emitCallResultReturn(MethodBinding binding, PrintWriter writer) { + for (int i = 0; i < binding.getNumArguments(); i++) { + JavaType type = binding.getJavaArgumentType(i); + if (type.isString()) { + writer.println(";"); + writer.println(" BuffersInternal.freeCString(" + binding.getArgumentName(i) + "_c_str);"); + } + // FIXME: will need more of these cleanups for things like Buffer[] and String[] (see above) + } + + super.emitCallResultReturn(binding, writer); + } + + public String getName() { + String res = super.getName(); + if (forImplementingMethodCall && bufferObjectVariant) { + return res + "BufObj"; + } + return res; + } + + protected String getImplMethodName(boolean direct) { + String name = null; + if (direct) { + name = binding.getName() + "$0"; + } else { + name = binding.getName() + "$1"; + } + if (bufferObjectVariant) { + return name + "BufObj"; + } + return name; + } +} diff --git a/src/java/com/sun/gluegen/ant/StaticGLGenTask.java b/src/java/com/sun/gluegen/ant/StaticGLGenTask.java deleted file mode 100644 index 87619422c..000000000 --- a/src/java/com/sun/gluegen/ant/StaticGLGenTask.java +++ /dev/null @@ -1,304 +0,0 @@ -package com.sun.gluegen.ant; - -/* - * StaticGLGenTask.java - * Copyright (C) 2003 Rob Grzywinski (rgrzywinski@realityinteractive.com) - * - * Copying, distribution and use of this software in source and binary - * forms, with or without modification, is permitted provided that the - * following conditions are met: - * - * Distributions of source code must reproduce the copyright notice, - * this list of conditions and the following disclaimer in the source - * code header files; and Distributions of binary code must reproduce - * the copyright notice, this list of conditions and the following - * disclaimer in the documentation, Read me file, license file and/or - * other materials provided with the software distribution. - * - * The names of Sun Microsystems, Inc. ("Sun") and/or the copyright - * holder may not be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS," WITHOUT A WARRANTY OF ANY - * KIND. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND - * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, NON-INTERFERENCE, ACCURACY OF - * INFORMATIONAL CONTENT OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. THE - * COPYRIGHT HOLDER, SUN AND SUN'S LICENSORS SHALL NOT BE LIABLE FOR - * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR - * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL THE - * COPYRIGHT HOLDER, SUN OR SUN'S LICENSORS BE LIABLE FOR ANY LOST - * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, - * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND - * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR - * INABILITY TO USE THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY - * OF SUCH DAMAGES. YOU ACKNOWLEDGE THAT THIS SOFTWARE IS NOT - * DESIGNED, LICENSED OR INTENDED FOR USE IN THE DESIGN, CONSTRUCTION, - * OPERATION OR MAINTENANCE OF ANY NUCLEAR FACILITY. THE COPYRIGHT - * HOLDER, SUN AND SUN'S LICENSORS DISCLAIM ANY EXPRESS OR IMPLIED - * WARRANTY OF FITNESS FOR SUCH USES. - */ - -import java.io.IOException; - -import org.apache.tools.ant.BuildException; -import org.apache.tools.ant.DirectoryScanner; -import org.apache.tools.ant.Project; -import org.apache.tools.ant.Task; -import org.apache.tools.ant.taskdefs.Execute; -import org.apache.tools.ant.taskdefs.LogStreamHandler; -import org.apache.tools.ant.types.CommandlineJava; -import org.apache.tools.ant.types.FileSet; -import org.apache.tools.ant.types.Path; -import org.apache.tools.ant.types.PatternSet; -import org.apache.tools.ant.util.JavaEnvUtils; - -/** - *

An ANT {@link org.apache.tools.ant.Task} - * for using {@link com.sun.gluegen.opengl.BuildStaticGLInfo}.

- * - *

Usage:

- *
-    <staticglgen package="[generated files package]" 
-                    headers="[file pattern of GL headers]"
-                    outputdir="[directory to output the generated files]" />
- * 
- * - * @author Rob Grzywinski rgrzywinski@yahoo.com - */ -// FIXME: blow out javadoc -public class StaticGLGenTask extends Task -{ - /** - *

The {@link com.sun.gluegen.opengl.BuildStaticGLInfo} classname.

- */ - private static final String GL_GEN = "com.sun.gluegen.opengl.BuildStaticGLInfo"; - - // ========================================================================= - /** - *

The {@link org.apache.tools.ant.types.CommandlineJava} that is used - * to execute {@link com.sun.gluegen.opengl.BuildStaticGLInfo}.

- */ - private CommandlineJava glgenCommandline; - - // ========================================================================= - /** - *

The package name for the generated files.

- */ - private String packageName; - - /** - *

The output directory.

- */ - private String outputDirectory; - - /** - *

The {@link org.apache.tools.ant.types.FileSet} of GL headers.

- */ - private FileSet headerSet = new FileSet(); - - // ========================================================================= - /** - *

Create and add the VM and classname to {@link org.apache.tools.ant.types.CommandlineJava}.

- */ - public StaticGLGenTask() - { - // create the CommandlineJava that will be used to call BuildStaticGLInfo - glgenCommandline = new CommandlineJava(); - - // set the VM and classname in the commandline - glgenCommandline.setVm(JavaEnvUtils.getJreExecutable("java")); - glgenCommandline.setClassname(GL_GEN); - } - - // ========================================================================= - // ANT getters and setters - /** - *

Set the package name for the generated files. This is called by ANT.

- * - * @param packageName the name of the package for the generated files - */ - public void setPackage(String packageName) - { - log( ("Setting package name to: " + packageName), Project.MSG_VERBOSE); - this.packageName = packageName; - } - - /** - *

Set the output directory. This is called by ANT.

- * - * @param directory the output directory - */ - public void setOutputDir(String directory) - { - log( ("Setting output directory to: " + directory), - Project.MSG_VERBOSE); - this.outputDirectory = directory; - } - - /** - *

Add a header file to the list. This is called by ANT for a nested - * element.

- * - * @return {@link org.apache.tools.ant.types.PatternSet.NameEntry} - */ - public PatternSet.NameEntry createHeader() - { - return headerSet.createInclude(); - } - - /** - *

Add a header file to the list. This is called by ANT for a nested - * element.

- * - * @return {@link org.apache.tools.ant.types.PatternSet.NameEntry} - */ - public PatternSet.NameEntry createHeadersFile() - { - return headerSet.createIncludesFile(); - } - - /** - *

Set the set of header patterns. Patterns may be separated by a comma - * or a space. This is called by ANT.

- * - * @param headers the string containing the header patterns - */ - public void setHeaders(String headers) - { - headerSet.setIncludes(headers); - } - - /** - *

Add an optional classpath that defines the location of {@link com.sun.gluegen.opengl.BuildStaticGLInfo} - * and BuildStaticGLInfo's dependencies.

- * - * @returns {@link org.apache.tools.ant.types.Path} - */ - public Path createClasspath() - { - return glgenCommandline.createClasspath(project).createPath(); - } - - // ========================================================================= - /** - *

Run the task. This involves validating the set attributes, creating - * the command line to be executed and finally executing the command.

- * - * @see org.apache.tools.ant.Task#execute() - */ - public void execute() - throws BuildException - { - // validate that all of the required attributes have been set - validateAttributes(); - - // TODO: add logic to determine if the generated file needs to be - // regenerated - - // add the attributes to the CommandlineJava - addAttributes(); - - log(glgenCommandline.describeCommand(), Project.MSG_VERBOSE); - - // execute the command and throw on error - final int error = execute(glgenCommandline.getCommandline()); - if(error == 1) - throw new BuildException( ("BuildStaticGLInfo returned: " + error), location); - } - - /** - *

Ensure that the user specified all required arguments.

- * - * @throws BuildException if there are required arguments that are not - * present or not valid - */ - private void validateAttributes() - throws BuildException - { - // validate that the package name is set - if(!isValid(packageName)) - throw new BuildException("Invalid package name: " + packageName); - - // validate that the output directory is set - // TODO: switch to file and ensure that it exists - if(!isValid(outputDirectory)) - throw new BuildException("Invalid output directory name: " + outputDirectory); - - // TODO: validate that there are headers set - } - - /** - *

Is the specified string valid? A valid string is non-null - * and has a non-zero length.

- * - * @param string the string to be tested for validity - * @return true if the string is valid. false - * otherwise. - */ - private boolean isValid(String string) - { - // check for null - if(string == null) - return false; - - // ensure that the string has a non-zero length - // NOTE: must trim() to remove leading and trailing whitespace - if(string.trim().length() < 1) - return false; - - // the string is valid - return true; - } - - /** - *

Add all of the attributes to the command line. They have already - * been validated.

- */ - private void addAttributes() - { - // add the package name - glgenCommandline.createArgument().setValue(packageName); - - // add the output directory name - glgenCommandline.createArgument().setValue(outputDirectory); - - // add the header -files- from the FileSet - headerSet.setDir(getProject().getBaseDir()); - DirectoryScanner directoryScanner = headerSet.getDirectoryScanner(getProject()); - String[] directoryFiles = directoryScanner.getIncludedFiles(); - for(int i=0; iExecute {@link com.sun.gluegen.opengl.BuildStaticGLInfo} in a - * forked JVM.

- * - * @throws BuildException - */ - private int execute(String[] command) - throws BuildException - { - // create the object that will perform the command execution - Execute execute = new Execute(new LogStreamHandler(this, Project.MSG_INFO, - Project.MSG_WARN), - null); - - // set the project and command line - execute.setAntRun(project); - execute.setCommandline(command); - execute.setWorkingDirectory( project.getBaseDir() ); - - // execute the command - try - { - return execute.execute(); - } catch(IOException ioe) - { - throw new BuildException(ioe, location); - } - } -} diff --git a/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java b/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java deleted file mode 100755 index f20495b65..000000000 --- a/src/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * - Redistribution of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistribution in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * This software is provided "AS IS," without a warranty of any kind. ALL - * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, - * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN - * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR - * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR - * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR - * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR - * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE - * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, - * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF - * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed or intended for use - * in the design, construction, operation or maintenance of any nuclear - * facility. - * - * Sun gratefully acknowledges that this software was originally authored - * and developed by Kenneth Bradley Russell and Christopher John Kline. - */ -package com.sun.gluegen.nativesig; - -import java.io.*; -import java.util.*; - -import com.sun.gluegen.*; -import com.sun.gluegen.cgram.types.*; -import com.sun.gluegen.opengl.*; -import com.sun.gluegen.procaddress.*; - -/** - * Emitter producing NativeSignature attributes. - */ -public class NativeSignatureEmitter extends GLEmitter { - - @Override - protected List generateMethodBindingEmitters(Set methodBindingSet, FunctionSymbol sym) throws Exception { - - // Allow superclass to do most of the work for us - List res = super.generateMethodBindingEmitters(methodBindingSet, sym); - - // Filter out all non-JavaMethodBindingEmitters - for (Iterator iter = res.iterator(); iter.hasNext();) { - FunctionEmitter emitter = iter.next(); - if (!(emitter instanceof JavaMethodBindingEmitter)) { - iter.remove(); - } - } - - if (res.isEmpty()) { - return res; - } - - PrintWriter writer = (getConfig().allStatic() ? javaWriter() : javaImplWriter()); - - List processed = new ArrayList(); - - // First, filter out all emitters going to the "other" (public) writer - for (Iterator iter = res.iterator(); iter.hasNext();) { - FunctionEmitter emitter = iter.next(); - if (emitter.getDefaultOutput() != writer) { - processed.add(emitter); - iter.remove(); - } - } - - // Now process all of the remaining emitters sorted by MethodBinding - while (!res.isEmpty()) { - List emittersForBinding = new ArrayList(); - JavaMethodBindingEmitter emitter = (JavaMethodBindingEmitter) res.remove(0); - emittersForBinding.add(emitter); - MethodBinding binding = emitter.getBinding(); - for (Iterator iter = res.iterator(); iter.hasNext();) { - JavaMethodBindingEmitter emitter2 = (JavaMethodBindingEmitter) iter.next(); - if (emitter2.getBinding() == binding) { - emittersForBinding.add(emitter2); - iter.remove(); - } - } - generateNativeSignatureEmitters(binding, emittersForBinding); - processed.addAll(emittersForBinding); - } - - return processed; - } - - protected void generateNativeSignatureEmitters(MethodBinding binding, List allEmitters) { - - if (allEmitters.isEmpty()) { - return; - } - - PrintWriter writer = (getConfig().allStatic() ? javaWriter() : javaImplWriter()); - - // Give ourselves the chance to interpose on the generation of all code to keep things simple - List newEmitters = new ArrayList(); - for (JavaMethodBindingEmitter javaEmitter : allEmitters) { - NativeSignatureJavaMethodBindingEmitter newEmitter = null; - if (javaEmitter instanceof GLJavaMethodBindingEmitter) { - newEmitter = new NativeSignatureJavaMethodBindingEmitter((GLJavaMethodBindingEmitter) javaEmitter); - } else if (javaEmitter instanceof ProcAddressJavaMethodBindingEmitter) { - newEmitter = new NativeSignatureJavaMethodBindingEmitter((ProcAddressJavaMethodBindingEmitter) javaEmitter); - } else { - newEmitter = new NativeSignatureJavaMethodBindingEmitter(javaEmitter, this); - } - newEmitters.add(newEmitter); - } - allEmitters.clear(); - allEmitters.addAll(newEmitters); - - // Detect whether we need to produce more or modify some of these emitters. - // Note that at this point we are assuming that generatePublicEmitters has - // been called with signatureOnly both true and false. - if (signatureContainsStrings(binding) && !haveEmitterWithBody(allEmitters)) { - // This basically handles glGetString but also any similar methods - NativeSignatureJavaMethodBindingEmitter javaEmitter = findEmitterWithWriter(allEmitters, writer); - - // First, we need to clone this emitter to produce the native - // entry point - NativeSignatureJavaMethodBindingEmitter emitter = new NativeSignatureJavaMethodBindingEmitter(javaEmitter); - emitter.removeModifier(JavaMethodBindingEmitter.PUBLIC); - emitter.addModifier(JavaMethodBindingEmitter.PRIVATE); - emitter.setForImplementingMethodCall(true); - // Note: this is chosen so we don't have to change the logic in - // emitReturnVariableSetupAndCall which decides which variant - // (direct / indirect) to call - emitter.setForDirectBufferImplementation(true); - allEmitters.add(emitter); - - // Now make the original emitter non-native and cause it to emit a body - javaEmitter.removeModifier(JavaMethodBindingEmitter.NATIVE); - javaEmitter.setEmitBody(true); - } - } - - protected boolean signatureContainsStrings(MethodBinding binding) { - for (int i = 0; i < binding.getNumArguments(); i++) { - JavaType type = binding.getJavaArgumentType(i); - if (type.isString() || type.isStringArray()) { - return true; - } - } - JavaType retType = binding.getJavaReturnType(); - if (retType.isString() || retType.isStringArray()) { - return true; - } - return false; - } - - protected boolean haveEmitterWithBody(List allEmitters) { - for (JavaMethodBindingEmitter emitter : allEmitters) { - if (!emitter.signatureOnly()) { - return true; - } - } - return false; - } - - protected NativeSignatureJavaMethodBindingEmitter findEmitterWithWriter(List allEmitters, PrintWriter writer) { - for (JavaMethodBindingEmitter jemitter : allEmitters) { - NativeSignatureJavaMethodBindingEmitter emitter = (NativeSignatureJavaMethodBindingEmitter)jemitter; - if (emitter.getDefaultOutput() == writer) { - return emitter; - } - } - throw new RuntimeException("Unexpectedly failed to find an emitter with the given writer"); - } -} diff --git a/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java b/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java deleted file mode 100755 index 379eccf1f..000000000 --- a/src/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java +++ /dev/null @@ -1,484 +0,0 @@ -/* - * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * - Redistribution of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistribution in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * Neither the name of Sun Microsystems, Inc. or the names of - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * This software is provided "AS IS," without a warranty of any kind. ALL - * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, - * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A - * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN - * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR - * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR - * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR - * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR - * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE - * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, - * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF - * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - * - * You acknowledge that this software is not designed or intended for use - * in the design, construction, operation or maintenance of any nuclear - * facility. - * - * Sun gratefully acknowledges that this software was originally authored - * and developed by Kenneth Bradley Russell and Christopher John Kline. - */ - -package com.sun.gluegen.nativesig; - -import java.io.*; - -import com.sun.gluegen.*; -import com.sun.gluegen.cgram.types.*; -import com.sun.gluegen.opengl.*; -import com.sun.gluegen.procaddress.*; - -public class NativeSignatureJavaMethodBindingEmitter extends GLJavaMethodBindingEmitter { - - public NativeSignatureJavaMethodBindingEmitter(GLJavaMethodBindingEmitter methodToWrap) { - super(methodToWrap); - } - - public NativeSignatureJavaMethodBindingEmitter(ProcAddressJavaMethodBindingEmitter methodToWrap) { - super(methodToWrap, false); - } - - public NativeSignatureJavaMethodBindingEmitter(JavaMethodBindingEmitter methodToWrap, NativeSignatureEmitter emitter) { - super(methodToWrap, false, null, false, false, emitter); - } - - @Override - protected void emitSignature(PrintWriter writer) { - writer.print(getBaseIndentString()); - emitNativeSignatureAnnotation(writer); - super.emitSignature(writer); - } - - protected void emitNativeSignatureAnnotation(PrintWriter writer) { - if (hasModifier(JavaMethodBindingEmitter.NATIVE)) { - // Emit everything as a leaf for now - // FIXME: make this configurable - writer.print("@NativeSignature(\"l"); - MethodBinding binding = getBinding(); - if (callThroughProcAddress) { - writer.print("p"); - } - writer.print("("); - if (callThroughProcAddress) { - writer.print("P"); - } - for (int i = 0; i < binding.getNumArguments(); i++) { - emitNativeSignatureElement(writer, binding.getJavaArgumentType(i), binding.getCArgumentType(i), i); - } - writer.print(")"); - emitNativeSignatureElement(writer, binding.getJavaReturnType(), binding.getCReturnType(), -1); - writer.println("\")"); - } - } - - protected void emitNativeSignatureElement(PrintWriter writer, JavaType type, Type cType, int index) { - if (type.isVoid()) { - if (index > 0) { - throw new InternalError("Error parsing arguments -- void should not be seen aside from argument 0"); - } - return; - } - - if (type.isNIOBuffer()) { - writer.print("A"); - } else if (type.isPrimitiveArray()) { - writer.print("MO"); - } else if (type.isPrimitive()) { - Class clazz = type.getJavaClass(); - if (clazz == Byte.TYPE) { writer.print("B"); } - else if (clazz == Character.TYPE) { writer.print("C"); } - else if (clazz == Double.TYPE) { writer.print("D"); } - else if (clazz == Float.TYPE) { writer.print("F"); } - else if (clazz == Integer.TYPE) { writer.print("I"); } - else if (clazz == Long.TYPE) { - // See if this is intended to be a pointer at the C level - if (cType.isPointer()) { - writer.print("A"); - } else { - writer.print("J"); - } - } - else if (clazz == Short.TYPE) { writer.print("S"); } - else if (clazz == Boolean.TYPE) { writer.print("Z"); } - else throw new InternalError("Unhandled primitive type " + clazz); - } else if (type.isString()) { - writer.print("A"); - } else { - throw new RuntimeException("Type not yet handled: " + type); - } - } - - protected String getReturnTypeString(boolean skipArray) { - if (isForImplementingMethodCall()) { - JavaType returnType = getBinding().getJavaReturnType(); - if (returnType.isString() || returnType.isNIOByteBuffer()) { - // Treat these as addresses - return "long"; - } - } - return super.getReturnTypeString(skipArray); - } - - protected void emitPreCallSetup(MethodBinding binding, PrintWriter writer) { - super.emitPreCallSetup(binding, writer); - for (int i = 0; i < binding.getNumArguments(); i++) { - JavaType type = binding.getJavaArgumentType(i); - if (type.isNIOBuffer() && !directNIOOnly) { - // Emit declarations for variables holding primitive arrays as type Object - // We don't know 100% sure we're going to use these at this point in the code, though - writer.println(" Object " + getNIOBufferArrayName(i) + " = (_direct ? null : Buffers.getArray(" + - getArgumentName(i) + "));"); - } else if (type.isString()) { - writer.println(" long " + binding.getArgumentName(i) + "_c_str = BuffersInternal.newCString(" + binding.getArgumentName(i) + ");"); - } - // FIXME: going to need more of these for Buffer[] and String[], at least - } - } - - protected String getNIOBufferArrayName(int argNumber) { - return "__buffer_array_" + argNumber; - } - - protected int emitArguments(PrintWriter writer) - { - boolean needComma = false; - int numEmitted = 0; - - if (callThroughProcAddress) { - if (changeNameAndArguments) { - writer.print("long procAddress"); - ++numEmitted; - needComma = true; - } - } - - if (forImplementingMethodCall && binding.hasContainingType()) { - if (needComma) { - writer.print(", "); - } - - // Always emit outgoing "this" argument - writer.print("long "); - writer.print(javaThisArgumentName()); - ++numEmitted; - needComma = true; - } - - for (int i = 0; i < binding.getNumArguments(); i++) { - JavaType type = binding.getJavaArgumentType(i); - if (type.isVoid()) { - // Make sure this is the only param to the method; if it isn't, - // there's something wrong with our parsing of the headers. - if (binding.getNumArguments() != 1) { - throw new InternalError( - "\"void\" argument type found in " + - "multi-argument function \"" + binding + "\""); - } - continue; - } - - if (type.isJNIEnv() || binding.isArgumentThisPointer(i)) { - // Don't need to expose these at the Java level - continue; - } - - if (needComma) { - writer.print(", "); - } - - if (forImplementingMethodCall && - (forDirectBufferImplementation && type.isNIOBuffer() || - type.isString())) { - // Direct Buffers and Strings go out as longs - writer.print("long"); - // FIXME: will need more tests here to handle other constructs like String and direct Buffer arrays - } else { - writer.print(erasedTypeString(type, false)); - } - writer.print(" "); - writer.print(getArgumentName(i)); - - ++numEmitted; - needComma = true; - - // Add Buffer and array index offset arguments after each associated argument - if (forIndirectBufferAndArrayImplementation) { - if (type.isNIOBuffer()) { - writer.print(", int " + byteOffsetArgName(i)); - } else if (type.isNIOBufferArray()) { - writer.print(", int[] " + - byteOffsetArrayArgName(i)); - } - } - - // Add offset argument after each primitive array - if (type.isPrimitiveArray()) { - writer.print(", int " + offsetArgName(i)); - } - } - return numEmitted; - } - - protected void emitReturnVariableSetupAndCall(MethodBinding binding, PrintWriter writer) { - writer.print(" "); - JavaType returnType = binding.getJavaReturnType(); - boolean needsResultAssignment = false; - - if (!returnType.isVoid()) { - if (returnType.isCompoundTypeWrapper() || - returnType.isNIOByteBuffer()) { - writer.println("java.nio.ByteBuffer _res;"); - needsResultAssignment = true; - } else if (returnType.isArrayOfCompoundTypeWrappers()) { - writer.println("java.nio.ByteBuffer[] _res;"); - needsResultAssignment = true; - } else if (returnType.isString() || returnType.isNIOByteBuffer()) { - writer.print(returnType); - writer.println(" _res;"); - needsResultAssignment = true; - } else { - // Always assign to "_res" variable so we can clean up - // outgoing String arguments, for example - emitReturnType(writer); - writer.println(" _res;"); - needsResultAssignment = true; - } - } - - if (binding.signatureCanUseIndirectNIO() && !directNIOOnly) { - // Must generate two calls for this gated on whether the NIO - // buffers coming in are all direct or indirect - writer.println("if (_direct) {"); - writer.print (" "); - } - - if (needsResultAssignment) { - writer.print(" _res = "); - if (returnType.isString()) { - writer.print("BuffersInternal.newJavaString("); - } else if (returnType.isNIOByteBuffer()) { - writer.print("BuffersInternal.newDirectByteBuffer("); - } - } else { - writer.print(" "); - if (!returnType.isVoid()) { - writer.print("return "); - } - } - - if (binding.signatureUsesJavaPrimitiveArrays() && - !binding.signatureCanUseIndirectNIO()) { - // FIXME: what happens with a C function of the form - // void foo(int* arg0, void* arg1); - // ? - - // Only one call being made in this body, going to indirect - // buffer / array entry point - emitCall(binding, writer, false); - if (returnType.isString() || returnType.isNIOByteBuffer()) { - writer.print(")"); - } - writer.print(";"); - writer.println(); - } else { - emitCall(binding, writer, true); - if (returnType.isString() || returnType.isNIOByteBuffer()) { - writer.print(")"); - } - writer.print(";"); - } - - if (binding.signatureCanUseIndirectNIO() && !directNIOOnly) { - // Must generate two calls for this gated on whether the NIO - // buffers coming in are all direct or indirect - writer.println(); - writer.println(" } else {"); - writer.print (" "); - if (needsResultAssignment) { - writer.print(" _res = "); - } else { - writer.print(" "); - if (!returnType.isVoid()) { - writer.print("return "); - } - } - emitCall(binding, writer, false); - writer.print(";"); - writer.println(); - writer.println(" }"); - } else { - writer.println(); - } - emitPrologueOrEpilogue(epilogue, writer); - if (needsResultAssignment) { - emitCallResultReturn(binding, writer); - } - } - - protected int emitCallArguments(MethodBinding binding, PrintWriter writer, boolean direct) { - // Note that we override this completely because we both need to - // move the potential location of the outgoing proc address as - // well as change the way we pass out Buffers, arrays, Strings, etc. - - boolean needComma = false; - int numArgsEmitted = 0; - - if (callThroughProcAddress) { - writer.print("__addr_"); - needComma = true; - ++numArgsEmitted; - } - - if (binding.hasContainingType()) { - // Emit this pointer - assert(binding.getContainingType().isCompoundTypeWrapper()); - writer.print("BuffersInternal.getDirectBufferAddress("); - writer.print("getBuffer()"); - writer.print(")"); - needComma = true; - ++numArgsEmitted; - } - for (int i = 0; i < binding.getNumArguments(); i++) { - JavaType type = binding.getJavaArgumentType(i); - if (type.isJNIEnv() || binding.isArgumentThisPointer(i)) { - // Don't need to expose these at the Java level - continue; - } - - if (type.isVoid()) { - // Make sure this is the only param to the method; if it isn't, - // there's something wrong with our parsing of the headers. - assert(binding.getNumArguments() == 1); - continue; - } - - if (needComma) { - writer.print(", "); - } - - if (type.isCompoundTypeWrapper()) { - writer.print("BuffersInternal.getDirectBufferAddress("); - writer.print("(("); - } - - if (type.isNIOBuffer()) { - if (!direct) { - writer.print(getNIOBufferArrayName(i)); - } else { - writer.print("BuffersInternal.getDirectBufferAddress("); - writer.print(getArgumentName(i)); - writer.print(")"); - } - } else { - writer.print(getArgumentName(i)); - } - - if (type.isCompoundTypeWrapper()) { - writer.print(" == null) ? null : "); - writer.print(getArgumentName(i)); - writer.print(".getBuffer())"); - writer.print(")"); - } - - if (type.isNIOBuffer()) { - if (direct) { - writer.print("+ Buffers.getDirectBufferByteOffset(" + getArgumentName(i) + ")"); - } else { - writer.print(", BuffersInternal.arrayBaseOffset(" + - getNIOBufferArrayName(i) + - ") + Buffers.getIndirectBufferByteOffset(" + getArgumentName(i) + ")"); - } - } else if (type.isNIOBufferArray()) { - writer.print(", " + byteOffsetArrayArgName(i)); - } - - // Add Array offset parameter for primitive arrays - if (type.isPrimitiveArray()) { - writer.print(", "); - writer.print("BuffersInternal.arrayBaseOffset(" + getArgumentName(i) + ") + "); - if(type.isFloatArray()) { - writer.print("Buffers.SIZEOF_FLOAT * "); - } else if(type.isDoubleArray()) { - writer.print("Buffers.SIZEOF_DOUBLE * "); - } else if(type.isByteArray()) { - writer.print("1 * "); - } else if(type.isLongArray()) { - writer.print("Buffers.SIZEOF_LONG * "); - } else if(type.isShortArray()) { - writer.print("Buffers.SIZEOF_SHORT * "); - } else if(type.isIntArray()) { - writer.print("Buffers.SIZEOF_INT * "); - } else { - throw new RuntimeException("Unsupported type for calculating array offset argument for " + - getArgumentName(i) + - "-- error occurred while processing Java glue code for " + getName()); - } - writer.print(offsetArgName(i)); - } - - if (type.isString()) { - writer.print("_c_str"); - } - - if (type.isCompoundTypeWrapper()) { - writer.print(")"); - } - - needComma = true; - ++numArgsEmitted; - } - return numArgsEmitted; - } - - protected void emitCallResultReturn(MethodBinding binding, PrintWriter writer) { - for (int i = 0; i < binding.getNumArguments(); i++) { - JavaType type = binding.getJavaArgumentType(i); - if (type.isString()) { - writer.println(";"); - writer.println(" BuffersInternal.freeCString(" + binding.getArgumentName(i) + "_c_str);"); - } - // FIXME: will need more of these cleanups for things like Buffer[] and String[] (see above) - } - - super.emitCallResultReturn(binding, writer); - } - - public String getName() { - String res = super.getName(); - if (forImplementingMethodCall && bufferObjectVariant) { - return res + "BufObj"; - } - return res; - } - - protected String getImplMethodName(boolean direct) { - String name = null; - if (direct) { - name = binding.getName() + "$0"; - } else { - name = binding.getName() + "$1"; - } - if (bufferObjectVariant) { - return name + "BufObj"; - } - return name; - } -} -- cgit v1.2.3