summaryrefslogtreecommitdiffstats
path: root/src/java/com
diff options
context:
space:
mode:
authorKenneth Russel <[email protected]>2009-06-15 22:39:33 +0000
committerKenneth Russel <[email protected]>2009-06-15 22:39:33 +0000
commit90bcb596e88898f807b39c9e7c85485ab8c006b6 (patch)
treecd8364c36dc0035fde6660808a803d28e69b3fbc /src/java/com
parent9e979e542165358b5c3684078e193f9c706f1eab (diff)
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
Diffstat (limited to 'src/java/com')
-rw-r--r--src/java/com/sun/gluegen/ArrayTypes.java125
-rw-r--r--src/java/com/sun/gluegen/CMethodBindingEmitter.java1568
-rw-r--r--src/java/com/sun/gluegen/CodeGenUtils.java150
-rw-r--r--src/java/com/sun/gluegen/CommentEmitter.java52
-rw-r--r--src/java/com/sun/gluegen/DebugEmitter.java108
-rw-r--r--src/java/com/sun/gluegen/FunctionEmitter.java222
-rw-r--r--src/java/com/sun/gluegen/GlueEmitter.java120
-rw-r--r--src/java/com/sun/gluegen/GlueEmitterControls.java53
-rw-r--r--src/java/com/sun/gluegen/GlueGen.java319
-rw-r--r--src/java/com/sun/gluegen/JavaConfiguration.java1387
-rw-r--r--src/java/com/sun/gluegen/JavaEmitter.java1698
-rw-r--r--src/java/com/sun/gluegen/JavaMethodBindingEmitter.java828
-rw-r--r--src/java/com/sun/gluegen/JavaType.java549
-rw-r--r--src/java/com/sun/gluegen/MethodBinding.java593
-rw-r--r--src/java/com/sun/gluegen/ReferencedStructs.java72
-rw-r--r--src/java/com/sun/gluegen/StructLayout.java153
-rw-r--r--src/java/com/sun/gluegen/TypeInfo.java70
-rw-r--r--src/java/com/sun/gluegen/ant/GlueGenTask.java495
-rw-r--r--src/java/com/sun/gluegen/ant/StaticGLGenTask.java304
-rw-r--r--src/java/com/sun/gluegen/cgram/CSymbolTable.java132
-rw-r--r--src/java/com/sun/gluegen/cgram/CToken.java32
-rw-r--r--src/java/com/sun/gluegen/cgram/Define.java56
-rw-r--r--src/java/com/sun/gluegen/cgram/GnuCEmitter.g1145
-rw-r--r--src/java/com/sun/gluegen/cgram/GnuCParser.g865
-rw-r--r--src/java/com/sun/gluegen/cgram/GnuCTreeParser.g852
-rw-r--r--src/java/com/sun/gluegen/cgram/HeaderParser.g725
-rw-r--r--src/java/com/sun/gluegen/cgram/LineObject.java126
-rw-r--r--src/java/com/sun/gluegen/cgram/PreprocessorInfoChannel.java73
-rw-r--r--src/java/com/sun/gluegen/cgram/StdCParser.g1375
-rw-r--r--src/java/com/sun/gluegen/cgram/TNode.java443
-rw-r--r--src/java/com/sun/gluegen/cgram/TNodeFactory.java33
-rw-r--r--src/java/com/sun/gluegen/cgram/types/ArrayType.java131
-rw-r--r--src/java/com/sun/gluegen/cgram/types/BitType.java87
-rw-r--r--src/java/com/sun/gluegen/cgram/types/CVAttributes.java48
-rw-r--r--src/java/com/sun/gluegen/cgram/types/CompoundType.java206
-rw-r--r--src/java/com/sun/gluegen/cgram/types/CompoundTypeKind.java50
-rw-r--r--src/java/com/sun/gluegen/cgram/types/DoubleType.java64
-rw-r--r--src/java/com/sun/gluegen/cgram/types/EnumType.java145
-rw-r--r--src/java/com/sun/gluegen/cgram/types/Field.java101
-rw-r--r--src/java/com/sun/gluegen/cgram/types/FloatType.java64
-rw-r--r--src/java/com/sun/gluegen/cgram/types/FunctionSymbol.java117
-rw-r--r--src/java/com/sun/gluegen/cgram/types/FunctionType.java175
-rw-r--r--src/java/com/sun/gluegen/cgram/types/IntType.java82
-rw-r--r--src/java/com/sun/gluegen/cgram/types/MachineDescription.java82
-rw-r--r--src/java/com/sun/gluegen/cgram/types/MachineDescription32Bit.java46
-rw-r--r--src/java/com/sun/gluegen/cgram/types/MachineDescription64Bit.java46
-rw-r--r--src/java/com/sun/gluegen/cgram/types/PointerType.java140
-rw-r--r--src/java/com/sun/gluegen/cgram/types/PrimitiveType.java50
-rwxr-xr-xsrc/java/com/sun/gluegen/cgram/types/SizeThunk.java171
-rw-r--r--src/java/com/sun/gluegen/cgram/types/Type.java262
-rw-r--r--src/java/com/sun/gluegen/cgram/types/TypeDictionary.java169
-rw-r--r--src/java/com/sun/gluegen/cgram/types/TypeVisitor.java44
-rw-r--r--src/java/com/sun/gluegen/cgram/types/VoidType.java56
-rwxr-xr-xsrc/java/com/sun/gluegen/nativesig/NativeSignatureEmitter.java188
-rwxr-xr-xsrc/java/com/sun/gluegen/nativesig/NativeSignatureJavaMethodBindingEmitter.java486
-rw-r--r--src/java/com/sun/gluegen/opengl/BuildComposablePipeline.java607
-rw-r--r--src/java/com/sun/gluegen/opengl/BuildStaticGLInfo.java320
-rw-r--r--src/java/com/sun/gluegen/opengl/ConvertFromGL4Java.java91
-rwxr-xr-xsrc/java/com/sun/gluegen/opengl/GLConfiguration.java214
-rw-r--r--src/java/com/sun/gluegen/opengl/GLEmitter.java179
-rwxr-xr-xsrc/java/com/sun/gluegen/opengl/GLJavaMethodBindingEmitter.java99
-rwxr-xr-xsrc/java/com/sun/gluegen/pcpp/ConcatenatingReader.java174
-rw-r--r--src/java/com/sun/gluegen/pcpp/PCPP.java873
-rwxr-xr-xsrc/java/com/sun/gluegen/procaddress/ProcAddressCMethodBindingEmitter.java212
-rwxr-xr-xsrc/java/com/sun/gluegen/procaddress/ProcAddressConfiguration.java261
-rwxr-xr-xsrc/java/com/sun/gluegen/procaddress/ProcAddressEmitter.java393
-rwxr-xr-xsrc/java/com/sun/gluegen/procaddress/ProcAddressJavaMethodBindingEmitter.java153
-rwxr-xr-xsrc/java/com/sun/gluegen/runtime/BufferFactory.java.javame_cdc_fp230
-rwxr-xr-xsrc/java/com/sun/gluegen/runtime/BufferFactory.java.javase284
-rwxr-xr-xsrc/java/com/sun/gluegen/runtime/BufferFactoryInternal.java115
-rwxr-xr-xsrc/java/com/sun/gluegen/runtime/CPU.java82
-rwxr-xr-xsrc/java/com/sun/gluegen/runtime/DynamicLinker.java49
-rwxr-xr-xsrc/java/com/sun/gluegen/runtime/DynamicLookupHelper.java50
-rwxr-xr-xsrc/java/com/sun/gluegen/runtime/MacOSXDynamicLinkerImpl.java49
-rwxr-xr-xsrc/java/com/sun/gluegen/runtime/NativeLibLoader.java105
-rwxr-xr-xsrc/java/com/sun/gluegen/runtime/NativeLibrary.java404
-rw-r--r--src/java/com/sun/gluegen/runtime/ProcAddressHelper.java118
-rwxr-xr-xsrc/java/com/sun/gluegen/runtime/StructAccessor.java.javame_cdc_fp135
-rwxr-xr-xsrc/java/com/sun/gluegen/runtime/StructAccessor.java.javase191
-rwxr-xr-xsrc/java/com/sun/gluegen/runtime/UnixDynamicLinkerImpl.java55
-rwxr-xr-xsrc/java/com/sun/gluegen/runtime/WindowsDynamicLinkerImpl.java38
81 files changed, 0 insertions, 23214 deletions
diff --git a/src/java/com/sun/gluegen/ArrayTypes.java b/src/java/com/sun/gluegen/ArrayTypes.java
deleted file mode 100644
index 7e5dd95..0000000
--- a/src/java/com/sun/gluegen/ArrayTypes.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (c) 2003 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;
-
-import java.nio.*;
-
-/**
- * Convenience class containing the Class objects corresponding to arrays of
- * various types (e.g., {@link #booleanArrayClass} is the Class of Java type
- * "boolean[]").
- */
-public class ArrayTypes {
- /** Class for Java type boolean[] */
- public static final Class booleanArrayClass;
- /** Class for Java type byte[] */
- public static final Class byteArrayClass;
- /** Class for Java type char[] */
- public static final Class charArrayClass;
- /** Class for Java type short[] */
- public static final Class shortArrayClass;
- /** Class for Java type int[] */
- public static final Class intArrayClass;
- /** Class for Java type long[] */
- public static final Class longArrayClass;
- /** Class for Java type float[] */
- public static final Class floatArrayClass;
- /** Class for Java type double[] */
- public static final Class doubleArrayClass;
- /** Class for Java type String[] */
- public static final Class stringArrayClass;
-
- // Classes for two-dimensional arrays.
- //
- // GlueGen converts C types like int** into Java arrays of direct
- // buffers of the appropriate type (like IntBuffer[]). If the tool
- // supported conversions like byte[][] -> char**, it would
- // effectively be necessary to copy all of the data from the Java
- // heap to the C heap during each call. The reason for this is that
- // if we wanted to use GetPrimitiveArrayCritical to lock down the
- // storage for each individual array element, we would need to fetch
- // each element of the two-dimensional Java array into temporary
- // storage before making the first GetPrimitiveArrayCritical call,
- // since one can not call GetObjectArrayElement inside a Get /
- // ReleasePrimitiveArrayCritical pair. This means that we would need
- // two top-level pieces of temporary storage for the two-dimensional
- // array as well as two loops to set up the contents, which would be
- // too complicated.
- //
- // The one concession we make is converting String[] -> char**. The
- // JVM takes care of the C heap allocation for GetStringUTFChars and
- // ReleaseStringUTFChars, and this conversion is important for
- // certain OpenGL operations.
-
- /** Class for Java type Buffer[] */
- public static final Class bufferArrayClass;
- /** Class for Java type ByteBuffer[] */
- public static final Class byteBufferArrayClass;
- /** Class for Java type ShortBuffer[] */
- public static final Class shortBufferArrayClass;
- /** Class for Java type IntBuffer[] */
- public static final Class intBufferArrayClass;
- /** Class for Java type LongBuffer[] */
- public static final Class longBufferArrayClass;
- /** Class for Java type FloatBuffer[] */
- public static final Class floatBufferArrayClass;
- /** Class for Java type DoubleBuffer[] */
- public static final Class doubleBufferArrayClass;
-
- static {
- booleanArrayClass = new boolean[0].getClass();
- byteArrayClass = new byte [0].getClass();
- charArrayClass = new char [0].getClass();
- shortArrayClass = new short [0].getClass();
- intArrayClass = new int [0].getClass();
- longArrayClass = new long [0].getClass();
- floatArrayClass = new float [0].getClass();
- doubleArrayClass = new double [0].getClass();
- stringArrayClass = new String [0].getClass();
-
- bufferArrayClass = new Buffer [0].getClass();
- byteBufferArrayClass = new ByteBuffer [0].getClass();
- shortBufferArrayClass = new ShortBuffer [0].getClass();
- intBufferArrayClass = new IntBuffer [0].getClass();
- longBufferArrayClass = new LongBuffer [0].getClass();
- floatBufferArrayClass = new FloatBuffer [0].getClass();
- doubleBufferArrayClass = new DoubleBuffer[0].getClass();
- }
-}
diff --git a/src/java/com/sun/gluegen/CMethodBindingEmitter.java b/src/java/com/sun/gluegen/CMethodBindingEmitter.java
deleted file mode 100644
index 03b8422..0000000
--- a/src/java/com/sun/gluegen/CMethodBindingEmitter.java
+++ /dev/null
@@ -1,1568 +0,0 @@
-/*
- * Copyright (c) 2003 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;
-
-import java.util.*;
-import java.io.*;
-import java.text.MessageFormat;
-
-import com.sun.gluegen.cgram.types.*;
-
-/** Emits the C-side component of the Java<->C JNI binding. */
-public class CMethodBindingEmitter extends FunctionEmitter
-{
- protected static final CommentEmitter defaultCommentEmitter =
- new DefaultCommentEmitter();
-
- protected static final String arrayResLength = "_array_res_length";
- protected static final String arrayRes = "_array_res";
- protected static final String arrayIdx = "_array_idx";
-
- protected MethodBinding binding;
-
- /** Name of the package in which the corresponding Java method resides.*/
- private String packageName;
-
- /** Name of the class in which the corresponding Java method resides.*/
- private String className;
-
- /**
- * Whether or not the Java<->C JNI binding for this emitter's MethodBinding
- * is overloaded.
- */
- private boolean isOverloadedBinding;
-
- /**
- * Whether or not the Java-side of the Java<->C JNI binding for this
- * emitter's MethodBinding is static.
- */
- private boolean isJavaMethodStatic;
-
- // Flags which change various aspects of glue code generation
- protected boolean forImplementingMethodCall;
- protected boolean forIndirectBufferAndArrayImplementation;
-
- /**
- * Optional List of Strings containing temporary C variables to declare.
- */
- private List/*<String>*/ temporaryCVariableDeclarations;
-
- /**
- * Optional List of Strings containing assignments to temporary C variables
- * to make after the call is completed.
- */
- private List/*<String>*/ temporaryCVariableAssignments;
-
- /**
- * Capacity of the return value in the event that it is encapsulated in a
- * java.nio.Buffer. Is ignored if binding.getJavaReturnType().isNIOBuffer()
- * == false;
- */
- private MessageFormat returnValueCapacityExpression = null;
-
- /**
- * Length of the returned array. Is ignored if
- * binding.getJavaReturnType().isArray() is false.
- */
- private MessageFormat returnValueLengthExpression = null;
-
- // Note: the VC++ 6.0 compiler emits hundreds of warnings when the
- // (necessary) null-checking code is enabled. This appears to just
- // be a compiler bug, but would be good to track down exactly why it
- // is happening. When the null checking is enabled for just the
- // GetPrimitiveArrayCritical calls, there are five warnings
- // generated for several thousand new if tests added to the code.
- // Which ones are the ones at fault? The line numbers for the
- // warnings are incorrect.
- private static final boolean EMIT_NULL_CHECKS = true;
-
- protected static final String STRING_CHARS_PREFIX = "_strchars_";
-
- // We need this in order to compute sizes of certain types
- protected MachineDescription machDesc;
-
- /**
- * Constructs an emitter for the specified binding, and sets a default
- * comment emitter that will emit the signature of the C function that is
- * being bound.
- */
- public CMethodBindingEmitter(MethodBinding binding,
- PrintWriter output,
- String javaPackageName,
- String javaClassName,
- boolean isOverloadedBinding,
- boolean isJavaMethodStatic,
- boolean forImplementingMethodCall,
- boolean forIndirectBufferAndArrayImplementation,
- MachineDescription machDesc)
- {
- super(output);
-
- assert(binding != null);
- assert(javaClassName != null);
- assert(javaPackageName != null);
-
- this.binding = binding;
- this.packageName = javaPackageName;
- this.className = javaClassName;
- this.isOverloadedBinding = isOverloadedBinding;
- this.isJavaMethodStatic = isJavaMethodStatic;
-
- this.forImplementingMethodCall = forImplementingMethodCall;
- this.forIndirectBufferAndArrayImplementation = forIndirectBufferAndArrayImplementation;
- this.machDesc = machDesc;
-
- setCommentEmitter(defaultCommentEmitter);
- }
-
- public final MethodBinding getBinding() { return binding; }
-
- public String getName() {
- return binding.getRenamedMethodName();
- }
-
- /**
- * Get the expression for the capacity of the returned java.nio.Buffer.
- */
- public final MessageFormat getReturnValueCapacityExpression()
- {
- return returnValueCapacityExpression;
- }
-
- /**
- * If this function returns a void* encapsulated in a
- * java.nio.Buffer (or compound type wrapper), sets the expression
- * for the capacity of the returned Buffer.
- *
- * @param expression a MessageFormat which, when applied to an array
- * of type String[] that contains each of the arguments names of the
- * Java-side binding, returns an expression that will (when compiled
- * by a C compiler) evaluate to an integer-valued expression. The
- * value of this expression is the capacity of the java.nio.Buffer
- * returned from this method.
- *
- * @throws IllegalArgumentException if the <code>
- * binding.getJavaReturnType().isNIOBuffer() == false and
- * binding.getJavaReturnType().isCompoundTypeWrapper() == false
- * </code>
- */
- public final void setReturnValueCapacityExpression(MessageFormat expression)
- {
- returnValueCapacityExpression = expression;
-
- if (!binding.getJavaReturnType().isNIOBuffer() &&
- !binding.getJavaReturnType().isCompoundTypeWrapper())
- {
- throw new IllegalArgumentException(
- "Cannot specify return value capacity for a method that does not " +
- "return java.nio.Buffer or a compound type wrapper: \"" + binding + "\"");
- }
- }
-
- /**
- * Get the expression for the length of the returned array
- */
- public final MessageFormat getReturnValueLengthExpression()
- {
- return returnValueLengthExpression;
- }
-
- /**
- * If this function returns an array, sets the expression for the
- * length of the returned array.
- *
- * @param expression a MessageFormat which, when applied to an array
- * of type String[] that contains each of the arguments names of the
- * Java-side binding, returns an expression that will (when compiled
- * by a C compiler) evaluate to an integer-valued expression. The
- * value of this expression is the length of the array returned from
- * this method.
- *
- * @throws IllegalArgumentException if the <code>
- * binding.getJavaReturnType().isNIOBuffer() == false
- * </code>
- */
- public final void setReturnValueLengthExpression(MessageFormat expression)
- {
- returnValueLengthExpression = expression;
-
- if (!binding.getJavaReturnType().isArray() &&
- !binding.getJavaReturnType().isArrayOfCompoundTypeWrappers())
- {
- throw new IllegalArgumentException(
- "Cannot specify return value length for a method that does not " +
- "return an array: \"" + binding + "\"");
- }
- }
-
- /**
- * Returns the List of Strings containing declarations for temporary
- * C variables to be assigned to after the underlying function call.
- */
- public final List/*<String>*/ getTemporaryCVariableDeclarations() {
- return temporaryCVariableDeclarations;
- }
-
- /**
- * Sets up a List of Strings containing declarations for temporary C
- * variables to be assigned to after the underlying function call. A
- * null argument indicates that no manual declarations are to be made.
- */
- public final void setTemporaryCVariableDeclarations(List/*<String>*/ arg) {
- temporaryCVariableDeclarations = arg;
- }
-
- /**
- * Returns the List of Strings containing assignments for temporary
- * C variables which are made after the underlying function call. A
- * null argument indicates that no manual assignments are to be
- * made.
- */
- public final List/*<String>*/ getTemporaryCVariableAssignments() {
- return temporaryCVariableAssignments;
- }
-
- /**
- * Sets up a List of Strings containing assignments for temporary C
- * variables which are made after the underlying function call. A
- * null argument indicates that no manual assignments are to be made.
- */
- public final void setTemporaryCVariableAssignments(List/*<String>*/ arg) {
- temporaryCVariableAssignments = arg;
- }
-
- /**
- * Get the name of the class in which the corresponding Java method
- * resides.
- */
- public String getJavaPackageName() { return packageName; }
-
- /**
- * Get the name of the package in which the corresponding Java method
- * resides.
- */
- public String getJavaClassName() { return className; }
-
- /**
- * Is the Java<->C JNI binding for this emitter's MethodBinding one of
- * several overloaded methods with the same name?
- */
- public final boolean getIsOverloadedBinding() { return isOverloadedBinding; }
-
- /**
- * Is the Java side of the Java<->C JNI binding for this emitter's
- * MethodBinding a static method?.
- */
- public final boolean getIsJavaMethodStatic() { return isJavaMethodStatic; }
-
- /**
- * Is this CMethodBindingEmitter implementing the case of an
- * indirect buffer or array being passed down to C code?
- */
- public final boolean forIndirectBufferAndArrayImplementation() { return forIndirectBufferAndArrayImplementation; }
-
- /**
- * Used for certain internal type size computations
- */
- public final MachineDescription getMachineDescription() { return machDesc; }
-
-
- protected void emitReturnType(PrintWriter writer)
- {
- writer.print("JNIEXPORT ");
- writer.print(binding.getJavaReturnType().jniTypeName());
- writer.print(" JNICALL");
- }
-
- protected void emitName(PrintWriter writer)
- {
- writer.println(); // start name on new line
- writer.print("Java_");
- writer.print(jniMangle(getJavaPackageName()));
- writer.print("_");
- writer.print(jniMangle(getJavaClassName()));
- writer.print("_");
- if (isOverloadedBinding)
- {
- writer.print(jniMangle(binding));
- //System.err.println("OVERLOADED MANGLING FOR " + getName() +
- // " = " + jniMangle(binding));
- }
- else
- {
- writer.print(jniMangle(getName()));
- //System.err.println(" NORMAL MANGLING FOR " + binding.getName() +
- // " = " + jniMangle(getName()));
- }
- }
-
- protected String getImplSuffix() {
- if (forImplementingMethodCall) {
- if (forIndirectBufferAndArrayImplementation) {
- return "1";
- } else {
- return "0";
- }
- }
- return "";
- }
-
- protected int emitArguments(PrintWriter writer)
- {
- writer.print("JNIEnv *env, ");
- int numEmitted = 1; // initially just the JNIEnv
- if (isJavaMethodStatic && !binding.hasContainingType())
- {
- writer.print("jclass");
- }
- else
- {
- writer.print("jobject");
- }
- writer.print(" _unused");
- ++numEmitted;
-
- if (binding.hasContainingType())
- {
- // "this" argument always comes down in argument 0 as direct buffer
- writer.print(", jobject " + JavaMethodBindingEmitter.javaThisArgumentName());
- }
- for (int i = 0; i < binding.getNumArguments(); i++) {
- JavaType javaArgType = binding.getJavaArgumentType(i);
- // Handle case where only param is void
- if (javaArgType.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 (javaArgType.isJNIEnv() || binding.isArgumentThisPointer(i)) {
- continue;
- }
- writer.print(", ");
- writer.print(javaArgType.jniTypeName());
- writer.print(" ");
- writer.print(binding.getArgumentName(i));
- ++numEmitted;
-
- if (javaArgType.isPrimitiveArray() ||
- javaArgType.isNIOBuffer()) {
- writer.print(", jint " + byteOffsetArgName(i));
- } else if (javaArgType.isNIOBufferArray()) {
- writer.print(", jintArray " +
- byteOffsetArrayArgName(i));
- }
- }
- return numEmitted;
- }
-
-
- protected void emitBody(PrintWriter writer)
- {
- writer.println(" {");
- emitBodyVariableDeclarations(writer);
- emitBodyUserVariableDeclarations(writer);
- emitBodyVariablePreCallSetup(writer, false);
- emitBodyVariablePreCallSetup(writer, true);
- emitBodyCallCFunction(writer);
- emitBodyUserVariableAssignments(writer);
- emitBodyVariablePostCallCleanup(writer, true);
- emitBodyVariablePostCallCleanup(writer, false);
- emitBodyReturnResult(writer);
- writer.println("}");
- writer.println();
- }
-
- protected void emitBodyVariableDeclarations(PrintWriter writer)
- {
- // Emit declarations for all pointer and String conversion variables
- if (binding.hasContainingType()) {
- emitPointerDeclaration(writer,
- binding.getContainingType(),
- binding.getContainingCType(),
- CMethodBindingEmitter.cThisArgumentName(),
- null);
- }
-
- boolean emittedDataCopyTemps = false;
- for (int i = 0; i < binding.getNumArguments(); i++) {
- JavaType type = binding.getJavaArgumentType(i);
- if (type.isJNIEnv() || binding.isArgumentThisPointer(i)) {
- continue;
- }
-
- if (type.isArray() || type.isNIOBuffer() || type.isCompoundTypeWrapper() || type.isArrayOfCompoundTypeWrappers()) {
- String convName = pointerConversionArgumentName(i);
- // handle array/buffer argument types
- boolean needsDataCopy =
- emitPointerDeclaration(writer,
- binding.getJavaArgumentType(i),
- binding.getCArgumentType(i),
- convName,
- binding.getArgumentName(i));
- if (needsDataCopy && !emittedDataCopyTemps) {
- // emit loop counter and array length variables used during data
- // copy
- writer.println(" jobject _tmpObj;");
- writer.println(" int _copyIndex;");
- writer.println(" jsize _tmpArrayLen;");
-
- // Pointer to the data in the Buffer, taking the offset into account
- writer.println(" int * _offsetHandle = NULL;");
-
- emittedDataCopyTemps = true;
- }
- } else if (type.isString()) {
- Type cType = binding.getCArgumentType(i);
- if (isUTF8Type(cType)) {
- writer.print(" const char* ");
- } else {
- writer.print(" jchar* ");
- }
- writer.print(STRING_CHARS_PREFIX);
- writer.print(binding.getArgumentName(i));
- writer.println(" = NULL;");
- }
-
- }
-
- // Emit declaration for return value if necessary
- Type cReturnType = binding.getCReturnType();
-
- JavaType javaReturnType = binding.getJavaReturnType();
- String capitalizedComponentType = null;
- if (!cReturnType.isVoid()) {
- writer.print(" ");
- // Note we must respect const/volatile for return argument
- writer.print(binding.getCSymbol().getReturnType().getName(true));
- writer.println(" _res;");
- if (javaReturnType.isNIOByteBufferArray() ||
- javaReturnType.isArrayOfCompoundTypeWrappers()) {
- writer.print(" int ");
- writer.print(arrayResLength);
- writer.println(";");
- writer.print(" int ");
- writer.print(arrayIdx);
- writer.println(";");
- writer.print(" jobjectArray ");
- writer.print(arrayRes);
- writer.println(";");
- } else if (javaReturnType.isArray()) {
- writer.print(" int ");
- writer.print(arrayResLength);
- writer.println(";");
-
- Class componentType = javaReturnType.getJavaClass().getComponentType();
- if (componentType.isArray()) {
- throw new RuntimeException("Multi-dimensional arrays not supported yet");
- }
-
- String javaTypeName = componentType.getName();
- capitalizedComponentType =
- "" + Character.toUpperCase(javaTypeName.charAt(0)) + javaTypeName.substring(1);
- String javaArrayTypeName = "j" + javaTypeName + "Array";
- writer.print(" ");
- writer.print(javaArrayTypeName);
- writer.print(" ");
- writer.print(arrayRes);
- writer.println(";");
- }
- }
- }
-
- /** Emits the user-defined C variable declarations from the
- TemporaryCVariableDeclarations directive in the .cfg file. */
- protected void emitBodyUserVariableDeclarations(PrintWriter writer) {
- if (temporaryCVariableDeclarations != null) {
- for (Iterator iter = temporaryCVariableDeclarations.iterator(); iter.hasNext(); ) {
- String val = (String) iter.next();
- writer.print(" ");
- writer.println(val);
- }
- }
- }
-
- /** Checks a type to see whether it is for a UTF-8 pointer type
- (i.e., "const char *", "const char **"). False implies that this
- type is for a Unicode pointer type ("jchar *", "jchar **"). */
- protected boolean isUTF8Type(Type type) {
- int i = 0;
- // Try to dereference the type at most two levels
- while (!type.isInt() && !type.isVoid() && (i < 2)) {
- PointerType pt = type.asPointer();
- if (pt != null) {
- type = pt.getTargetType();
- } else {
- ArrayType arrt = type.asArray();
- if (arrt == null) {
- throw new IllegalArgumentException("Type " + type + " should have been a pointer or array type");
- }
- type = arrt.getElementType();
- }
- }
- if (type.isVoid()) {
- // Assume UTF-8 since UTF-16 is rare
- return true;
- }
- if (!type.isInt()) {
- throw new IllegalArgumentException("Type " + type + " should have been a one- or two-dimensional integer pointer or array type");
- }
- if (type.getSize(machDesc) != 1 && type.getSize(machDesc) != 2) {
- throw new IllegalArgumentException("Type " + type + " should have been a one- or two-dimensional pointer to char or short");
- }
- return (type.getSize(machDesc) == 1);
- }
-
- /** Checks a type (expected to be pointer-to-pointer) for const-ness */
- protected boolean isConstPtrPtr(Type type) {
- if (type.pointerDepth() != 2) {
- return false;
- }
- if (type.asPointer().getTargetType().asPointer().getTargetType().isConst()) {
- return true;
- }
- return false;
- }
-
- /**
- * Code to init the variables that were declared in
- * emitBodyVariableDeclarations(), PRIOR TO calling the actual C
- * function.
- */
- protected void emitBodyVariablePreCallSetup(PrintWriter writer,
- boolean emittingPrimitiveArrayCritical)
- {
- if (!emittingPrimitiveArrayCritical) {
- // Convert all Buffers to pointers first so we don't have to
- // call ReleasePrimitiveArrayCritical for any arrays if any
- // incoming buffers aren't direct
- if (binding.hasContainingType()) {
- emitPointerConversion(writer, binding,
- binding.getContainingType(),
- binding.getContainingCType(),
- JavaMethodBindingEmitter.javaThisArgumentName(),
- CMethodBindingEmitter.cThisArgumentName(),
- null);
- }
-
- for (int i = 0; i < binding.getNumArguments(); i++) {
- JavaType type = binding.getJavaArgumentType(i);
- if (type.isJNIEnv() || binding.isArgumentThisPointer(i)) {
- continue;
- }
-
- if (type.isCompoundTypeWrapper() ||
- (type.isNIOBuffer() && !forIndirectBufferAndArrayImplementation)) {
- emitPointerConversion(writer, binding, type,
- binding.getCArgumentType(i),
- binding.getArgumentName(i),
- pointerConversionArgumentName(i),
- byteOffsetArgName(i));
- }
- }
- }
-
- // Convert all arrays to pointers, and get UTF-8 versions of jstring args
- for (int i = 0; i < binding.getNumArguments(); i++) {
- JavaType javaArgType = binding.getJavaArgumentType(i);
-
- if (javaArgType.isJNIEnv() || binding.isArgumentThisPointer(i)) {
- continue;
- }
-
- if (javaArgType.isArray() ||
- (javaArgType.isNIOBuffer() && forIndirectBufferAndArrayImplementation) ||
- javaArgType.isArrayOfCompoundTypeWrappers()) {
- boolean needsDataCopy = javaArgTypeNeedsDataCopy(javaArgType);
-
- // We only defer the emission of GetPrimitiveArrayCritical
- // calls that won't be matched up until after the function
- // we're calling
- if ((!needsDataCopy && !emittingPrimitiveArrayCritical) ||
- (needsDataCopy && emittingPrimitiveArrayCritical)) {
- continue;
- }
-
- if (EMIT_NULL_CHECKS) {
- writer.print(" if (");
- writer.print(binding.getArgumentName(i));
- writer.println(" != NULL) {");
- }
-
- Type cArgType = binding.getCArgumentType(i);
- String cArgTypeName = cArgType.getName();
-
- String convName = pointerConversionArgumentName(i);
-
- if (!needsDataCopy) {
- writer.print(" ");
- writer.print(convName);
- writer.print(" = (");
- if (javaArgType.isStringArray()) {
- // java-side type is String[]
- cArgTypeName = "jstring *";
- }
- writer.print(cArgTypeName);
- writer.print(") (((char*) (*env)->GetPrimitiveArrayCritical(env, ");
- writer.print(binding.getArgumentName(i));
- writer.println(", NULL)) + " + byteOffsetArgName(i) + ");");
-//if(cargtypename is void*)
-// _ptrX = ((char*)convName + index1*sizeof(thisArgsJavaType));
-
- } else {
- // Handle the case where the array elements are of a type that needs a
- // data copy operation to convert from the java memory model to the C
- // memory model (e.g., int[][], String[], etc)
- //
- // FIXME: should factor out this whole block of code into a separate
- // method for clarity and maintenance purposes
- //
- // Note that we properly handle only the case of an array of
- // compound type wrappers in emitBodyVariablePostCallCleanup below
- if (!isConstPtrPtr(cArgType) &&
- !javaArgType.isArrayOfCompoundTypeWrappers()) {
- // FIXME: if the arg type is non-const, the sematics might be that
- // the function modifies the argument -- we don't yet support
- // this.
- throw new RuntimeException(
- "Cannot copy data for ptr-to-ptr arg type \"" + cArgType +
- "\": support for non-const ptr-to-ptr types not implemented.");
- }
-
- writer.println();
- writer.println(" /* Copy contents of " + binding.getArgumentName(i) +
- " into " + convName + "_copy */");
-
- // get length of array being copied
- String arrayLenName = "_tmpArrayLen";
- writer.print(" ");
- writer.print(arrayLenName);
- writer.print(" = (*env)->GetArrayLength(env, ");
- writer.print(binding.getArgumentName(i));
- writer.println(");");
-
- // allocate an array to hold each element
- if (cArgType.pointerDepth() != 2) {
- throw new RuntimeException(
- "Could not copy data for type \"" + cArgType +
- "\"; copying only supported for types of the form " +
- "ptr-to-ptr-to-type.");
- }
- PointerType cArgPtrType = cArgType.asPointer();
- if (cArgPtrType == null) {
- throw new RuntimeException(
- "Could not copy data for type \"" + cArgType +
- "\"; currently only pointer types supported.");
- }
- PointerType cArgElementType = cArgPtrType.getTargetType().asPointer();
- emitMalloc(
- writer,
- convName+"_copy",
- cArgElementType.getName(),
- arrayLenName,
- "Could not allocate buffer for copying data in argument \\\""+binding.getArgumentName(i)+"\\\"");
-
- // Get the handle for the byte offset array sent down for Buffers
- // FIXME: not 100% sure this is correct with respect to the
- // JNI spec because it may be illegal to call
- // GetObjectArrayElement while in a critical section. May
- // need to do another loop and add in the offsets.
- if (javaArgType.isNIOBufferArray()) {
- writer.println
- (" _offsetHandle = (int *) (*env)->GetPrimitiveArrayCritical(env, " +
- byteOffsetArrayArgName(i) +
- ", NULL);");
- }
-
- // process each element in the array
- writer.println(" for (_copyIndex = 0; _copyIndex < "+arrayLenName+"; ++_copyIndex) {");
-
- // get each array element
- writer.println(" /* get each element of the array argument \"" + binding.getArgumentName(i) + "\" */");
- writer.print(" _tmpObj = (*env)->GetObjectArrayElement(env, ");
- writer.print(binding.getArgumentName(i));
- writer.println(", _copyIndex);");
-
- if (javaArgType.isStringArray()) {
- writer.print(" ");
- emitGetStringChars(writer,
- "(jstring) _tmpObj",
- convName+"_copy[_copyIndex]",
- isUTF8Type(cArgType),
- true);
- } else if (javaArgType.isNIOBufferArray()) {
- /* We always assume an integer "byte offset" argument follows any Buffer
- in the method binding. */
- emitGetDirectBufferAddress(writer,
- "_tmpObj",
- cArgElementType.getName(),
- convName + "_copy[_copyIndex]",
- "_offsetHandle[_copyIndex]",
- true);
- } else if (javaArgType.isArrayOfCompoundTypeWrappers()) {
- // These come down in similar fashion to an array of NIO
- // Buffers only we do not pass down any integer byte
- // offset argument
- emitGetDirectBufferAddress(writer,
- "_tmpObj",
- cArgElementType.getName(),
- convName + "_copy[_copyIndex]",
- null,
- true);
- } else {
- // Question: do we always need to copy the sub-arrays, or just
- // GetPrimitiveArrayCritical on each jobjectarray element and
- // assign it to the appropriate elements at pointer depth 1?
- // Probably depends on const-ness of the argument.
- // Malloc enough space to hold a copy of each sub-array
- writer.print(" ");
- emitMalloc(
- writer,
- convName+"_copy[_copyIndex]",
- cArgElementType.getTargetType().getName(), // assumes cArgPtrType is ptr-to-ptr-to-primitive !!
- "(*env)->GetArrayLength(env, _tmpObj)",
- "Could not allocate buffer during copying of data in argument \\\""+binding.getArgumentName(i)+"\\\"");
- // FIXME: copy the data (use matched Get/ReleasePrimitiveArrayCritical() calls)
- if (true) throw new RuntimeException(
- "Cannot yet handle type \"" + cArgType.getName() +
- "\"; need to add support for copying ptr-to-ptr-to-primitiveType subarrays");
-
-
- }
- writer.println(" }");
-
- if (javaArgType.isNIOBufferArray()) {
- writer.println
- (" (*env)->ReleasePrimitiveArrayCritical(env, " +
- byteOffsetArrayArgName(i) +
- ", _offsetHandle, JNI_ABORT);");
- }
-
- writer.println();
- } // end of data copy
-
- if (EMIT_NULL_CHECKS) {
- writer.println(" }");
- }
- } else if (javaArgType.isString()) {
- if (!emittingPrimitiveArrayCritical) {
- continue;
- }
-
- emitGetStringChars(writer,
- binding.getArgumentName(i),
- STRING_CHARS_PREFIX + binding.getArgumentName(i),
- isUTF8Type(binding.getCArgumentType(i)),
- false);
- }
- }
- }
-
-
- /**
- * Code to clean up any variables that were declared in
- * emitBodyVariableDeclarations(), AFTER calling the actual C function.
- */
- protected void emitBodyVariablePostCallCleanup(PrintWriter writer,
- boolean emittingPrimitiveArrayCritical)
- {
- // Release primitive arrays and temporary UTF8 strings if necessary
- for (int i = 0; i < binding.getNumArguments(); i++) {
- JavaType javaArgType = binding.getJavaArgumentType(i);
- if (javaArgType.isJNIEnv() || binding.isArgumentThisPointer(i)) {
- continue;
- }
- Type cArgType = binding.getCArgumentType(i);
-
- if (javaArgType.isArray() ||
- (javaArgType.isNIOBuffer() && forIndirectBufferAndArrayImplementation) ||
- javaArgType.isArrayOfCompoundTypeWrappers()) {
- boolean needsDataCopy = javaArgTypeNeedsDataCopy(javaArgType);
-
- if ((!needsDataCopy && !emittingPrimitiveArrayCritical) ||
- (needsDataCopy && emittingPrimitiveArrayCritical)) {
- continue;
- }
-
- if (EMIT_NULL_CHECKS) {
- writer.print(" if (");
- writer.print(binding.getArgumentName(i));
- writer.println(" != NULL) {");
- }
-
- String convName = pointerConversionArgumentName(i);
-
- if (!needsDataCopy) {
- // Release array
- writer.print(" (*env)->ReleasePrimitiveArrayCritical(env, ");
- writer.print(binding.getArgumentName(i));
- writer.print(", ");
- writer.print(convName);
- writer.println(", 0);");
- } else {
- // clean up the case where the array elements are of a type that needed
- // a data copy operation to convert from the java memory model to the
- // C memory model (e.g., int[][], String[], etc)
- //
- // FIXME: should factor out this whole block of code into a separate
- // method for clarity and maintenance purposes
- if (!isConstPtrPtr(cArgType)) {
- // FIXME: handle any cleanup from treatment of non-const args,
- // assuming they were treated differently in
- // emitBodyVariablePreCallSetup() (see the similar section in that
- // method for details).
- if (javaArgType.isArrayOfCompoundTypeWrappers()) {
- // This is the only form of cleanup we handle right now
- String argName = binding.getArgumentName(i);
- writer.println(" _tmpArrayLen = (*env)->GetArrayLength(env, " + argName + ");");
- writer.println(" for (_copyIndex = 0; _copyIndex < _tmpArrayLen; ++_copyIndex) {");
- writer.println(" _tmpObj = (*env)->GetObjectArrayElement(env, " + argName + ", _copyIndex);");
- // We only skip the copy back in limited situations
- String copyName = pointerConversionArgumentName(i) + "_copy";
- writer.println(" if ((" + copyName + "[_copyIndex] == NULL && _tmpObj == NULL) ||");
- writer.println(" (" + copyName + "[_copyIndex] != NULL && _tmpObj != NULL &&");
- writer.println(" (*env)->GetDirectBufferAddress(env, _tmpObj) == " + copyName + "[_copyIndex])) {");
- writer.println(" /* No copy back needed */");
- writer.println(" } else {");
- writer.println(" if (" + copyName + "[_copyIndex] == NULL) {");
- writer.println(" (*env)->SetObjectArrayElement(env, " + argName + ", _copyIndex, NULL);");
- writer.println(" } else {");
- writer.println(" _tmpObj = (*env)->NewDirectByteBuffer(env, " + copyName + "[_copyIndex], sizeof(" + cArgType.getName() + "));");
- writer.println(" (*env)->SetObjectArrayElement(env, " + argName + ", _copyIndex, _tmpObj);");
- writer.println(" }");
- writer.println(" }");
- writer.println(" }");
- } else {
- throw new RuntimeException(
- "Cannot clean up copied data for ptr-to-ptr arg type \"" + cArgType +
- "\": support for cleaning up most non-const ptr-to-ptr types not implemented.");
- }
- }
-
- writer.println(" /* Clean up " + convName + "_copy */");
-
- // Only need to perform cleanup for individual array
- // elements if they are not direct buffers
- if (!javaArgType.isNIOBufferArray() &&
- !javaArgType.isArrayOfCompoundTypeWrappers()) {
- // Re-fetch length of array that was copied
- String arrayLenName = "_tmpArrayLen";
- writer.print(" ");
- writer.print(arrayLenName);
- writer.print(" = (*env)->GetArrayLength(env, ");
- writer.print(binding.getArgumentName(i));
- writer.println(");");
-
- // free each element
- PointerType cArgPtrType = cArgType.asPointer();
- if (cArgPtrType == null) {
- throw new RuntimeException(
- "Could not copy data for type \"" + cArgType +
- "\"; currently only pointer types supported.");
- }
- PointerType cArgElementType = cArgPtrType.getTargetType().asPointer();
-
- // process each element in the array
- writer.println(" for (_copyIndex = 0; _copyIndex < " + arrayLenName +"; ++_copyIndex) {");
-
- // get each array element
- writer.println(" /* free each element of " +convName +"_copy */");
- writer.print(" _tmpObj = (*env)->GetObjectArrayElement(env, ");
- writer.print(binding.getArgumentName(i));
- writer.println(", _copyIndex);");
-
- if (javaArgType.isStringArray()) {
- writer.print(" (*env)->ReleaseStringUTFChars(env, ");
- writer.print("(jstring) _tmpObj");
- writer.print(", ");
- writer.print(convName+"_copy[_copyIndex]");
- writer.println(");");
- } else {
- if (true) throw new RuntimeException(
- "Cannot yet handle type \"" + cArgType.getName() +
- "\"; need to add support for cleaning up copied ptr-to-ptr-to-primitiveType subarrays");
- }
- writer.println(" }");
- }
-
- // free the main array
- writer.print(" free((void*) ");
- writer.print(convName+"_copy");
- writer.println(");");
- } // end of cleaning up copied data
-
- if (EMIT_NULL_CHECKS) {
- writer.println(" }");
- }
- } else if (javaArgType.isString()) {
- if (emittingPrimitiveArrayCritical) {
- continue;
- }
-
- if (EMIT_NULL_CHECKS) {
- writer.print(" if (");
- writer.print(binding.getArgumentName(i));
- writer.println(" != NULL) {");
- }
-
- if (isUTF8Type(cArgType)) {
- writer.print(" (*env)->ReleaseStringUTFChars(env, ");
- writer.print(binding.getArgumentName(i));
- writer.print(", " + STRING_CHARS_PREFIX);
- writer.print(binding.getArgumentName(i));
- writer.println(");");
- } else {
- writer.println(" free((void*) " + STRING_CHARS_PREFIX + binding.getArgumentName(i) + ");");
- }
-
- if (EMIT_NULL_CHECKS) {
- writer.println(" }");
- }
- }
- }
- }
-
- /** Returns the number of arguments passed so calling code knows
- whether to print a comma */
- protected int emitBodyPassCArguments(PrintWriter writer) {
- for (int i = 0; i < binding.getNumArguments(); i++) {
- if (i != 0) {
- writer.print(", ");
- }
- JavaType javaArgType = binding.getJavaArgumentType(i);
- // Handle case where only param is void.
- if (javaArgType.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 (javaArgType.isJNIEnv()) {
- writer.print("env");
- } else if (binding.isArgumentThisPointer(i)) {
- writer.print(CMethodBindingEmitter.cThisArgumentName());
- } else {
- writer.print("(");
- Type cArgType = binding.getCSymbol().getArgumentType(i);
- writer.print(cArgType.getName());
- writer.print(") ");
- if (binding.getCArgumentType(i).isPointer() && binding.getJavaArgumentType(i).isPrimitive()) {
- writer.print("(intptr_t) ");
- }
- if (javaArgType.isArray() || javaArgType.isNIOBuffer() ||
- javaArgType.isCompoundTypeWrapper() || javaArgType.isArrayOfCompoundTypeWrappers()) {
- writer.print(pointerConversionArgumentName(i));
- if (javaArgTypeNeedsDataCopy(javaArgType)) {
- writer.print("_copy");
- }
- } else {
- if (javaArgType.isString()) { writer.print(STRING_CHARS_PREFIX); }
- writer.print(binding.getArgumentName(i));
- }
- }
- }
- return binding.getNumArguments();
- }
-
- protected void emitBodyCallCFunction(PrintWriter writer) {
-
- // Make the call to the actual C function
- writer.print(" ");
-
- // WARNING: this code assumes that the return type has already been
- // typedef-resolved.
- Type cReturnType = binding.getCReturnType();
-
- if (!cReturnType.isVoid()) {
- writer.print("_res = ");
- }
- if (binding.hasContainingType()) {
- // Call through function pointer
- writer.print(CMethodBindingEmitter.cThisArgumentName() + "->");
- }
- writer.print(binding.getCSymbol().getName());
- writer.print("(");
- emitBodyPassCArguments(writer);
- writer.println(");");
- }
-
- /** Emits the user-defined C variable assignments from the
- TemporaryCVariableAssignments directive in the .cfg file. */
- protected void emitBodyUserVariableAssignments(PrintWriter writer) {
- if (temporaryCVariableAssignments != null) {
- for (Iterator iter = temporaryCVariableAssignments.iterator(); iter.hasNext(); ) {
- String val = (String) iter.next();
- writer.print(" ");
- writer.println(val);
- }
- }
- }
-
- protected void emitBodyReturnResult(PrintWriter writer)
- {
- // WARNING: this code assumes that the return type has already been
- // typedef-resolved.
- Type cReturnType = binding.getCReturnType();
-
- // Return result if necessary
- if (!cReturnType.isVoid()) {
- JavaType javaReturnType = binding.getJavaReturnType();
- if (javaReturnType.isPrimitive()) {
- writer.print(" return ");
- if (cReturnType.isPointer()) {
- // Pointer being converted to int or long: cast this result
- // (through intptr_t to avoid compiler warnings with gcc)
- writer.print("(" + javaReturnType.jniTypeName() + ") (intptr_t) ");
- }
- writer.println("_res;");
- } else if (javaReturnType.isNIOBuffer() ||
- javaReturnType.isCompoundTypeWrapper()) {
- writer.println(" if (_res == NULL) return NULL;");
- writer.print(" return (*env)->NewDirectByteBuffer(env, _res, ");
- // See whether capacity has been specified
- if (returnValueCapacityExpression != null) {
- writer.print(
- returnValueCapacityExpression.format(argumentNameArray()));
- } else {
- if (cReturnType.isPointer() &&
- cReturnType.asPointer().getTargetType().isCompound()) {
- if (cReturnType.asPointer().getTargetType().getSize() == null) {
- throw new RuntimeException(
- "Error emitting code for compound return type "+
- "for function \"" + binding + "\": " +
- "Structs to be emitted should have been laid out by this point " +
- "(type " + cReturnType.asPointer().getTargetType().getName() + " / " +
- cReturnType.asPointer().getTargetType() + " was not)"
- );
- }
- }
- writer.print("sizeof(" + cReturnType.getName() + ")");
- System.err.println(
- "WARNING: No capacity specified for java.nio.Buffer return " +
- "value for function \"" + binding + "\";" +
- " assuming size of equivalent C return type (sizeof(" + cReturnType.getName() + ")): " + binding);
- }
- writer.println(");");
- } else if (javaReturnType.isString()) {
- writer.print(" if (_res == NULL) return NULL;");
- writer.println(" return (*env)->NewStringUTF(env, _res);");
- } else if (javaReturnType.isArrayOfCompoundTypeWrappers() ||
- (javaReturnType.isArray() && javaReturnType.isNIOByteBufferArray())) {
- writer.println(" if (_res == NULL) return NULL;");
- if (returnValueLengthExpression == null) {
- throw new RuntimeException("Error while generating C code: no length specified for array returned from function " +
- binding);
- }
- writer.println(" " + arrayResLength + " = " + returnValueLengthExpression.format(argumentNameArray()) + ";");
- writer.println(" " + arrayRes + " = (*env)->NewObjectArray(env, " + arrayResLength + ", (*env)->FindClass(env, \"java/nio/ByteBuffer\"), NULL);");
- writer.println(" for (" + arrayIdx + " = 0; " + arrayIdx + " < " + arrayResLength + "; " + arrayIdx + "++) {");
- Type retType = binding.getCSymbol().getReturnType();
- Type pointerType;
- if (retType.isPointer()) {
- pointerType = retType.asPointer().getTargetType();
- } else {
- pointerType = retType.asArray().getElementType();
- }
- Type baseType = pointerType.asPointer().getTargetType();
- writer.println(" (*env)->SetObjectArrayElement(env, " + arrayRes + ", " + arrayIdx +
- ", (*env)->NewDirectByteBuffer(env, _res[" + arrayIdx + "], sizeof(" + pointerType.getName() + ")));");
- writer.println(" }");
- writer.println(" return " + arrayRes + ";");
- } else if (javaReturnType.isArray()) {
- // FIXME: must have user provide length of array in .cfg file
- // by providing a constant value, input parameter, or
- // expression which computes the array size (already present
- // as ReturnValueCapacity, not yet implemented / tested here)
-
- throw new RuntimeException(
- "Could not emit native code for function \"" + binding +
- "\": array return values for non-char types not implemented yet");
-
- // FIXME: This is approximately what will be required here
- //
- //writer.print(" ");
- //writer.print(arrayRes);
- //writer.print(" = (*env)->New");
- //writer.print(capitalizedComponentType);
- //writer.print("Array(env, ");
- //writer.print(arrayResLength);
- //writer.println(");");
- //writer.print(" (*env)->Set");
- //writer.print(capitalizedComponentType);
- //writer.print("ArrayRegion(env, ");
- //writer.print(arrayRes);
- //writer.print(", 0, ");
- //writer.print(arrayResLength);
- //writer.println(", _res);");
- //writer.print(" return ");
- //writer.print(arrayRes);
- //writer.println(";");
- } else {
- System.err.print("Unhandled return type: ");
- javaReturnType.dump();
- throw new RuntimeException("Unhandled return type");
- }
- }
- }
-
- protected static String cThisArgumentName() {
- return "this0";
- }
-
- // Mangle a class, package or function name
- protected String jniMangle(String name) {
- return name.replaceAll("_", "_1").replace('.', '_');
- }
-
- protected String jniMangle(MethodBinding binding) {
- StringBuffer buf = new StringBuffer();
- buf.append(jniMangle(getName()));
- buf.append(getImplSuffix());
- buf.append("__");
- if (binding.hasContainingType()) {
- // "this" argument always comes down in argument 0 as direct buffer
- jniMangle(java.nio.ByteBuffer.class, buf, true);
- }
- for (int i = 0; i < binding.getNumArguments(); i++) {
- if (binding.isArgumentThisPointer(i)) {
- continue;
- }
- JavaType type = binding.getJavaArgumentType(i);
- if (type.isVoid()) {
- // We should only see "void" as the first argument of a 1-argument function
- // FIXME: should normalize this in the parser
- if ((i != 0) || (binding.getNumArguments() > 1)) {
- throw new RuntimeException("Saw illegal \"void\" argument while emitting \"" + getName() + "\"");
- }
- } else {
- Class c = type.getJavaClass();
- if (c != null) {
- jniMangle(c, buf, false);
- // If Buffer offset arguments were added, we need to mangle the JNI for the
- // extra arguments
- if (type.isNIOBuffer()) {
- jniMangle(Integer.TYPE, buf, false);
- } else if (type.isNIOBufferArray()) {
- int[] intArrayType = new int[0];
- c = intArrayType.getClass();
- jniMangle(c , buf, true);
- }
- if (type.isPrimitiveArray()) {
- jniMangle(Integer.TYPE, buf, false);
- }
- } else if (type.isCompoundTypeWrapper()) {
- // Mangle wrappers for C structs as ByteBuffer
- jniMangle(java.nio.ByteBuffer.class, buf, true);
- } else if (type.isArrayOfCompoundTypeWrappers()) {
- // Mangle arrays of C structs as ByteBuffer[]
- java.nio.ByteBuffer[] tmp = new java.nio.ByteBuffer[0];
- jniMangle(tmp.getClass(), buf, true);
- } else if (type.isJNIEnv()) {
- // These are not exposed at the Java level
- } else {
- // FIXME: add support for char* -> String conversion
- throw new RuntimeException("Unknown kind of JavaType: name="+type.getName());
- }
- }
- }
-
- return buf.toString();
- }
-
- protected void jniMangle(Class c, StringBuffer res, boolean syntheticArgument) {
- if (c.isPrimitive()) {
- if (c == Boolean.TYPE) res.append("Z");
- else if (c == Byte.TYPE) res.append("B");
- else if (c == Character.TYPE) res.append("C");
- else if (c == Short.TYPE) res.append("S");
- else if (c == Integer.TYPE) res.append("I");
- else if (c == Long.TYPE) res.append("J");
- else if (c == Float.TYPE) res.append("F");
- else if (c == Double.TYPE) res.append("D");
- else throw new RuntimeException("Illegal primitive type \"" + c.getName() + "\"");
- } else {
- // Arrays and NIO Buffers are always passed down as java.lang.Object.
- // The only arrays that show up as true arrays in the signature
- // are the synthetic byte offset arrays created when passing
- // down arrays of direct Buffers. Compound type wrappers are
- // passed down as ByteBuffers (no good reason, just to avoid
- // accidental conflation) so we mangle them differently.
- if (syntheticArgument) {
- if (c.isArray()) {
- res.append("_3");
- Class componentType = c.getComponentType();
- // Handle arrays of compound type wrappers differently for
- // convenience of the Java-level glue code generation
- jniMangle(componentType, res,
- (componentType == java.nio.ByteBuffer.class));
- } else {
- res.append("L");
- res.append(c.getName().replace('.', '_'));
- res.append("_2");
- }
- } else {
- if (c.isArray()) {
- res.append("_3");
- jniMangle(c.getComponentType(), res, false);
- } else if (c == java.lang.String.class) {
- res.append("L");
- res.append(c.getName().replace('.', '_'));
- res.append("_2");
- } else {
- res.append("L");
- res.append("java_lang_Object");
- res.append("_2");
- }
- }
- }
- }
-
- private void emitOutOfMemoryCheck(PrintWriter writer, String varName,
- String errorMessage)
- {
- writer.print(" if (");
- writer.print(varName);
- writer.println(" == NULL) {");
- writer.println(" (*env)->ThrowNew(env, (*env)->FindClass(env, \"java/lang/OutOfMemoryError\"),");
- writer.print(" \"" + errorMessage);
- writer.print(" in native dispatcher for \\\"");
- writer.print(getName());
- writer.println("\\\"\");");
- writer.print(" return");
- if (!binding.getJavaReturnType().isVoid()) {
- writer.print(" 0");
- }
- writer.println(";");
- writer.println(" }");
- }
-
- private void emitMalloc(PrintWriter writer,
- String targetVarName,
- String elementTypeString,
- String numElementsExpression,
- String mallocFailureErrorString)
- {
- writer.print(" ");
- writer.print(targetVarName);
- writer.print(" = (");
- writer.print(elementTypeString);
- writer.print(" *) malloc(");
- writer.print(numElementsExpression);
- writer.print(" * sizeof(");
- writer.print(elementTypeString);
- writer.println("));");
- // Catch memory allocation failure
- if (EMIT_NULL_CHECKS) {
- emitOutOfMemoryCheck(
- writer, targetVarName,
- mallocFailureErrorString);
- }
- }
-
- private void emitCalloc(PrintWriter writer,
- String targetVarName,
- String elementTypeString,
- String numElementsExpression,
- String mallocFailureErrorString)
- {
- writer.print(" ");
- writer.print(targetVarName);
- writer.print(" = (");
- writer.print(elementTypeString);
- writer.print(" *) calloc(");
- writer.print(numElementsExpression);
- writer.print(", sizeof(");
- writer.print(elementTypeString);
- writer.println("));");
- // Catch memory allocation failure
- if (EMIT_NULL_CHECKS) {
- emitOutOfMemoryCheck(
- writer, targetVarName,
- mallocFailureErrorString);
- }
- }
-
- private void emitGetStringChars(PrintWriter writer,
- String sourceVarName,
- String receivingVarName,
- boolean isUTF8,
- boolean emitElseClause)
- {
- if (EMIT_NULL_CHECKS) {
- writer.print(" if (");
- writer.print(sourceVarName);
- writer.println(" != NULL) {");
- }
- if (isUTF8) {
- writer.print(" ");
- writer.print(receivingVarName);
- writer.print(" = (*env)->GetStringUTFChars(env, ");
- writer.print(sourceVarName);
- writer.println(", (jboolean*)NULL);");
- // Catch memory allocation failure in the event that the VM didn't pin
- // the String and failed to allocate a copy
- if (EMIT_NULL_CHECKS) {
- emitOutOfMemoryCheck(
- writer, receivingVarName,
- "Failed to get UTF-8 chars for argument \\\""+sourceVarName+"\\\"");
- }
- } else {
- // The UTF-16 case is basically Windows specific. Unix platforms
- // tend to use only the UTF-8 encoding. On Windows the problem
- // is that wide character strings are expected to be null
- // terminated, but the JNI GetStringChars doesn't return a
- // null-terminated Unicode string. For this reason we explicitly
- // calloc our buffer, including the null terminator, and use
- // GetStringRegion to fetch the string's characters.
- emitCalloc(writer,
- receivingVarName,
- "jchar",
- "(*env)->GetStringLength(env, " + sourceVarName + ") + 1",
- "Could not allocate temporary buffer for copying string argument \\\""+sourceVarName+"\\\"");
- writer.println(" (*env)->GetStringRegion(env, " + sourceVarName + ", 0, (*env)->GetStringLength(env, " + sourceVarName + "), " + receivingVarName + ");");
- }
- if (EMIT_NULL_CHECKS) {
- writer.print(" }");
- if (emitElseClause) {
- writer.print(" else {");
- writer.print(" ");
- writer.print(receivingVarName);
- writer.println(" = NULL;");
- writer.println(" }");
- } else {
- writer.println();
- }
- }
- }
-
- private void emitGetDirectBufferAddress(PrintWriter writer,
- String sourceVarName,
- String receivingVarTypeString,
- String receivingVarName,
- String byteOffsetVarName,
- boolean emitElseClause) {
- if (EMIT_NULL_CHECKS) {
- writer.print(" if (");
- writer.print(sourceVarName);
- writer.println(" != NULL) {");
- writer.print(" ");
- }
-
- writer.print(" ");
- writer.print(receivingVarName);
- writer.print(" = (");
- writer.print(receivingVarTypeString);
-
- writer.print(") (((char*) (*env)->GetDirectBufferAddress(env, ");
- writer.print(sourceVarName);
- writer.println(")) + " + ((byteOffsetVarName != null) ? byteOffsetVarName : "0") + ");");
-
- if (EMIT_NULL_CHECKS) {
- writer.print(" }");
- if (emitElseClause) {
- writer.println(" else {");
- writer.print(" ");
- writer.print(receivingVarName);
- writer.println(" = NULL;");
- writer.println(" }");
- } else {
- writer.println();
- }
- }
- }
-
- // Note: if the data in the Type needs to be converted from the Java memory
- // model to the C memory model prior to calling any C-side functions, then
- // an extra variable named XXX_copy (where XXX is the value of the
- // cVariableName argument) will be emitted and TRUE will be returned.
- private boolean emitPointerDeclaration(PrintWriter writer,
- JavaType javaType,
- Type cType,
- String cVariableName,
- String javaArgumentName) {
- String ptrTypeString = null;
- boolean needsDataCopy = false;
-
- // Emit declaration for the pointer variable.
- //
- // Note that we don't need to obey const/volatile for outgoing arguments
- //
- if (javaType.isNIOBuffer()) {
- ptrTypeString = cType.getName();
- } else if (javaType.isArray() || javaType.isArrayOfCompoundTypeWrappers()) {
- needsDataCopy = javaArgTypeNeedsDataCopy(javaType);
- if (javaType.isPrimitiveArray() ||
- javaType.isNIOBufferArray() ||
- javaType.isArrayOfCompoundTypeWrappers()) {
- ptrTypeString = cType.getName();
- } else if (!javaType.isStringArray()) {
- Class elementType = javaType.getJavaClass().getComponentType();
- if (elementType.isArray()) {
- Class subElementType = elementType.getComponentType();
- if (subElementType.isPrimitive()) {
- // type is pointer to pointer to primitive
- ptrTypeString = cType.getName();
- } else {
- // type is pointer to pointer of some type we don't support (maybe
- // it's an array of pointers to structs?)
- throw new RuntimeException("Unsupported pointer type: \"" + cType.getName() + "\"");
- }
- } else {
- // type is pointer to pointer of some type we don't support (maybe
- // it's an array of pointers to structs?)
- throw new RuntimeException("Unsupported pointer type: \"" + cType.getName() + "\"");
- }
- }
- } else {
- ptrTypeString = cType.getName();
- }
-
- if (!needsDataCopy) {
- // declare the pointer variable
- writer.print(" ");
- writer.print(ptrTypeString);
- writer.print(" ");
- writer.print(cVariableName);
- writer.println(" = NULL;");
- } else {
- // Declare a variable to hold a copy of the argument data in which the
- // incoming data has been properly laid out in memory to match the C
- // memory model
- if (javaType.isStringArray()) {
- writer.print(" const char **");
- } else {
- writer.print(" " + ptrTypeString);
- }
- writer.print(" ");
- writer.print(cVariableName);
- writer.print("_copy = NULL; /* copy of data in ");
- writer.print(javaArgumentName);
- writer.println(", laid out according to C memory model */");
- }
-
- return needsDataCopy;
- }
-
- private void emitPointerConversion(PrintWriter writer,
- MethodBinding binding,
- JavaType type,
- Type cType,
- String incomingArgumentName,
- String cVariableName,
- String byteOffsetVarName) {
- // Compound type wrappers do not get byte offsets added on
- if (type.isCompoundTypeWrapper()) {
- byteOffsetVarName = null;
- }
-
- emitGetDirectBufferAddress(writer,
- incomingArgumentName,
- cType.getName(),
- cVariableName,
- byteOffsetVarName,
- false);
- }
-
- protected String byteOffsetArgName(int i) {
- return byteOffsetArgName(binding.getArgumentName(i));
- }
-
- protected String byteOffsetArgName(String s) {
- return s + "_byte_offset";
- }
-
- protected String byteOffsetArrayArgName(int i) {
- return binding.getArgumentName(i) + "_byte_offset_array";
- }
-
- protected String[] argumentNameArray() {
- String[] argumentNames = new String[binding.getNumArguments()];
- for (int i = 0; i < binding.getNumArguments(); i++) {
- argumentNames[i] = binding.getArgumentName(i);
- if (binding.getJavaArgumentType(i).isPrimitiveArray()) {
- // Add on _offset argument in comma-separated expression
- argumentNames[i] = argumentNames[i] + ", " + byteOffsetArgName(i);
- }
- }
- return argumentNames;
- }
-
- protected String pointerConversionArgumentName(int i) {
- return "_ptr" + i;
- }
-
- /**
- * Class that emits a generic comment for CMethodBindingEmitters; the comment
- * includes the C signature of the native method that is being bound by the
- * emitter java method.
- */
- protected static class DefaultCommentEmitter implements CommentEmitter {
- public void emit(FunctionEmitter emitter, PrintWriter writer) {
- emitBeginning((CMethodBindingEmitter)emitter, writer);
- emitEnding((CMethodBindingEmitter)emitter, writer);
- }
- protected void emitBeginning(CMethodBindingEmitter emitter, PrintWriter writer) {
- writer.println(" Java->C glue code:");
- writer.print(" * Java package: ");
- writer.print(emitter.getJavaPackageName());
- writer.print(".");
- writer.println(emitter.getJavaClassName());
- writer.print(" * Java method: ");
- MethodBinding binding = emitter.getBinding();
- writer.println(binding);
- writer.println(" * C function: " + binding.getCSymbol());
- }
- protected void emitEnding(CMethodBindingEmitter emitter, PrintWriter writer) {
- }
- }
-
- protected boolean javaArgTypeNeedsDataCopy(JavaType javaArgType) {
- if (javaArgType.isArray()) {
- return (javaArgType.isNIOBufferArray() ||
- javaArgType.isStringArray() ||
- javaArgType.getJavaClass().getComponentType().isArray());
- }
- if (javaArgType.isArrayOfCompoundTypeWrappers()) {
- return true;
- }
- return false;
- }
-}
diff --git a/src/java/com/sun/gluegen/CodeGenUtils.java b/src/java/com/sun/gluegen/CodeGenUtils.java
deleted file mode 100644
index ab81bec..0000000
--- a/src/java/com/sun/gluegen/CodeGenUtils.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (c) 2003 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;
-
-import java.io.*;
-import java.util.*;
-
-public class CodeGenUtils
-{
- /**
- * Given a java package name (e.g., "java.lang"), return the package as a
- * directory path (i.e., "java/lang").
- */
- public static String packageAsPath(String packageName) {
- String path = packageName.replace('.', File.separatorChar);
- //System.out.println("Converted package [" + packageName + "] to path [" + path +"]");
- return path;
- }
-
- /**
- * @param generator the object that is emitting the autogenerated code. If
- * null, the generator will not be mentioned in the warning message.
- */
- public static void emitAutogeneratedWarning(PrintWriter w, Object generator) {
- w.print("/* !---- DO NOT EDIT: This file autogenerated ");
- if (generator != null)
- {
- w.print("by ");
- w.print(packageAsPath(generator.getClass().getName()));
- w.print(".java ");
- }
- w.print("on ");
- w.print((new Date()).toString());
- w.println(" ----! */");
- w.println();
- }
-
- /**
- * Emit the opening headers for one java class/interface file.
- */
- public static void emitJavaHeaders(
- PrintWriter w,
- String packageName,
- String className,
- String gluegenRuntimePackage,
- boolean isClassNotInterface,
- String[] imports,
- String[] accessModifiers,
- String[] interfaces,
- String classExtended,
- EmissionCallback classDocComment) throws IOException
- {
- w.println("package " + packageName + ";");
- w.println();
-
- for (int i = 0; imports != null && i < imports.length; ++i) {
- w.print("import ");
- w.print(imports[i]);
- w.println(';');
- }
- w.println("import " + gluegenRuntimePackage + ".*;");
-
- w.println();
-
- if (classDocComment != null)
- {
- classDocComment.emit(w);
- }
-
- for (int i = 0; accessModifiers != null && i < accessModifiers.length; ++i) {
- w.print(accessModifiers[i]);
- w.print(' ');
- }
-
- if (isClassNotInterface) {
- w.print("class ");
- w.print(className);
- w.print(' ');
- if (classExtended != null) {
- w.print("extends ");
- w.print(classExtended);
- }
- }
- else {
- if (classExtended != null) {
- throw new IllegalArgumentException(
- "Autogenerated interface class " + className +
- " cannot extend class " + classExtended);
- }
- w.print("interface ");
- w.print(className);
- w.print(' ');
- }
-
- for (int i = 0; interfaces != null && i < interfaces.length; ++i) {
- if (i == 0) { w.print(isClassNotInterface ? "implements " : "extends "); }
- w.print(interfaces[i]);
- if (i < interfaces.length-1) { w.print(", "); }
- }
-
- w.println();
- w.println('{');
- }
-
- //-----------------------------------------
-
- /** A class that emits source code of some time when activated. */
- public interface EmissionCallback
- {
- /** Emit appropriate source code through the given writer. */
- public void emit(PrintWriter output);
- }
-}
diff --git a/src/java/com/sun/gluegen/CommentEmitter.java b/src/java/com/sun/gluegen/CommentEmitter.java
deleted file mode 100644
index 30004f8..0000000
--- a/src/java/com/sun/gluegen/CommentEmitter.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 2003 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;
-
-import java.io.*;
-
-public interface CommentEmitter
-{
- /**
- * Emit the body of a comment for the specified function; do NOT emit the
- * open (e.g., comment "/*") or close (e.g., "*\/") characters.
- */
- public void emit(FunctionEmitter funcEmitter, PrintWriter output);
-}
-
diff --git a/src/java/com/sun/gluegen/DebugEmitter.java b/src/java/com/sun/gluegen/DebugEmitter.java
deleted file mode 100644
index 40d6c2d..0000000
--- a/src/java/com/sun/gluegen/DebugEmitter.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2003 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;
-
-import java.util.*;
-
-import com.sun.gluegen.cgram.types.*;
-
-/** Debug emitter which prints the parsing results to standard output. */
-
-public class DebugEmitter implements GlueEmitter {
- public void readConfigurationFile(String filename) {}
-
- public void setMachineDescription(MachineDescription md32,
- MachineDescription md64) {}
-
- public void beginEmission(GlueEmitterControls controls) {
- System.out.println("----- BEGIN EMISSION OF GLUE CODE -----");
- }
- public void endEmission() {
- System.out.println("----- END EMISSION OF GLUE CODE -----");
- }
- public void beginDefines() {}
- public void emitDefine(String name, String value, String optionalComment) {
- System.out.println("#define " + name + " " + value +
- (optionalComment != null ? ("// " + optionalComment) : ""));
- }
- public void endDefines() {}
-
- public void beginFunctions(TypeDictionary typedefDictionary,
- TypeDictionary structDictionary,
- Map canonMap) {
- Set keys = typedefDictionary.keySet();
- for (Iterator iter = keys.iterator(); iter.hasNext(); ) {
- String key = (String) iter.next();
- Type value = typedefDictionary.get(key);
- System.out.println("typedef " + value + " " + key + ";");
- }
- }
- public Iterator emitFunctions(List/*<FunctionSymbol>*/ originalCFunctions)
- throws Exception {
- for (Iterator iter = originalCFunctions.iterator(); iter.hasNext(); ) {
- FunctionSymbol sym = (FunctionSymbol) iter.next();
- emitSingleFunction(sym);
- }
- return originalCFunctions.iterator();
- }
- public void emitSingleFunction(FunctionSymbol sym) {
- System.out.println(sym);
- System.out.println(" -> " + sym.toString());
- }
- public void endFunctions() {}
-
- public void beginStructLayout() throws Exception {}
- public void layoutStruct(CompoundType t) throws Exception {}
- public void endStructLayout() throws Exception {}
-
- public void beginStructs(TypeDictionary typedefDictionary,
- TypeDictionary structDictionary,
- Map canonMap) {
- }
- public void emitStruct(CompoundType t, String alternateName) {
- String name = t.getName();
- if (name == null && alternateName != null) {
- name = alternateName;
- }
-
- System.out.println("Referenced type \"" + name + "\"");
- }
- public void endStructs() {}
-}
diff --git a/src/java/com/sun/gluegen/FunctionEmitter.java b/src/java/com/sun/gluegen/FunctionEmitter.java
deleted file mode 100644
index 0d0f225..0000000
--- a/src/java/com/sun/gluegen/FunctionEmitter.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * Copyright (c) 2003 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;
-
-import java.util.*;
-import java.io.*;
-import com.sun.gluegen.cgram.types.MachineDescription;
-
-public abstract class FunctionEmitter
-{
- public static final EmissionModifier STATIC = new EmissionModifier("static");
-
- private ArrayList modifiers = new ArrayList();
- private CommentEmitter commentEmitter = null;
- private PrintWriter defaultOutput;
-
- /**
- * Constructs the FunctionEmitter with a CommentEmitter that emits nothing.
- */
- public FunctionEmitter(PrintWriter defaultOutput)
- {
- assert(defaultOutput != null);
- this.defaultOutput = defaultOutput;
- }
-
- /**
- * Makes this FunctionEmitter a copy of the passed one.
- */
- public FunctionEmitter(FunctionEmitter arg) {
- modifiers = (ArrayList) arg.modifiers.clone();
- commentEmitter = arg.commentEmitter;
- defaultOutput = arg.defaultOutput;
- }
-
- public PrintWriter getDefaultOutput() { return defaultOutput; }
-
- public void addModifiers(Iterator/*<EmissionModifier>*/ mi)
- {
- while (mi.hasNext())
- {
- modifiers.add((EmissionModifier) mi.next());
- }
- }
- public void addModifier(EmissionModifier m) { modifiers.add(m); }
-
- public boolean removeModifier(EmissionModifier m) { return modifiers.remove(m); }
-
- public void clearModifiers() { modifiers.clear(); }
-
- public boolean hasModifier(EmissionModifier m) { return modifiers.contains(m); }
-
- public Iterator getModifiers() { return modifiers.iterator(); }
-
- public abstract String getName();
-
- /**
- * Emit the function to the specified output (instead of the default
- * output).
- */
- public void emit(PrintWriter output)
- {
- emitDocComment(output);
- //output.println(" // Emitter: " + getClass().getName());
- emitSignature(output);
- emitBody(output);
- }
-
- /**
- * Emit the function to the default output (the output that was passed to
- * the constructor)
- */
- public final void emit()
- {
- emit(getDefaultOutput());
- }
-
- /** Returns, as a String, whatever {@link #emit} would output. */
- public String toString()
- {
- StringWriter sw = new StringWriter(500);
- PrintWriter w = new PrintWriter(sw);
- emit(w);
- return sw.toString();
- }
-
- /**
- * Set the object that will emit the comment for this function. If the
- * parameter is null, no comment will be emitted.
- */
- public void setCommentEmitter(CommentEmitter cEmitter)
- {
- commentEmitter = cEmitter;
- }
-
- /**
- * Get the comment emitter for this FunctionEmitter. The return value may be
- * null, in which case no comment emitter has been set.
- */
- public CommentEmitter getCommentEmitter() { return commentEmitter; }
-
- protected void emitDocComment(PrintWriter writer)
- {
- if (commentEmitter != null)
- {
- writer.print(getBaseIndentString()); //indent
-
- writer.print(getCommentStartString());
-
- commentEmitter.emit(this, writer);
-
- writer.print(getBaseIndentString()); //indent
-
- writer.println(getCommentEndString());
- }
- }
-
- protected void emitSignature(PrintWriter writer)
- {
- writer.print(getBaseIndentString()); // indent method
-
- int numEmitted = emitModifiers(writer);
- if (numEmitted > 0)
- {
- writer.print(" ");
- }
-
- emitReturnType(writer);
- writer.print(" ");
-
- emitName(writer);
- writer.print("(");
-
- emitArguments(writer);
- writer.print(")");
- }
-
- protected int emitModifiers(PrintWriter writer)
- {
- PrintWriter w = getDefaultOutput();
- int numEmitted = 0;
- for (Iterator it = getModifiers(); it.hasNext(); )
- {
- writer.print(it.next());
- ++numEmitted;
- if (it.hasNext())
- {
- writer.print(" ");
- }
- }
- return numEmitted;
- }
-
- protected String getBaseIndentString() { return ""; }
-
- protected String getCommentStartString() { return "/* "; }
- protected String getCommentEndString() { return " */"; }
-
- protected abstract void emitReturnType(PrintWriter writer);
- protected abstract void emitName(PrintWriter writer);
- /** Returns the number of arguments emitted. */
- protected abstract int emitArguments(PrintWriter writer);
- protected abstract void emitBody(PrintWriter writer);
-
- public static class EmissionModifier
- {
- public final String toString() { return emittedForm; }
-
- private String emittedForm;
-
- public int hashCode() {
- return emittedForm.hashCode();
- }
-
- public boolean equals(Object arg) {
- if (arg == null || (!(arg instanceof EmissionModifier))) {
- return false;
- }
-
- return emittedForm.equals(((EmissionModifier) arg).emittedForm);
- }
-
- protected EmissionModifier(String emittedForm) { this.emittedForm = emittedForm; }
- }
-}
-
diff --git a/src/java/com/sun/gluegen/GlueEmitter.java b/src/java/com/sun/gluegen/GlueEmitter.java
deleted file mode 100644
index e21bc87..0000000
--- a/src/java/com/sun/gluegen/GlueEmitter.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (c) 2003 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;
-
-import java.util.*;
-import com.sun.gluegen.cgram.types.*;
-
-/** Specifies the interface by which GlueGen requests glue code to be
- generated. Can be replaced to generate glue code for other
- languages and foreign function interfaces. */
-
-public interface GlueEmitter {
-
- public void readConfigurationFile(String filename) throws Exception;
-
- /** Sets the description of the underlying hardware. "md32"
- specifies the description of a 32-bit version of the underlying
- CPU architecture. "md64" specifies the description of a 64-bit
- version of the underlying CPU architecture. At least one must be
- specified. When both are specified, the bulk of the glue code is
- generated using the 32-bit machine description, but structs are
- laid out twice and the base class delegates between the 32-bit
- and 64-bit implementation at run time. This allows Java code
- which can access both 32-bit and 64-bit versions of the data
- structures to be included in the same jar file. <P>
-
- It is up to the end user to provide the appropriate opaque
- definitions to ensure that types of varying size (longs and
- pointers in particular) are exposed to Java in such a way that
- changing the machine description does not cause different shared
- glue code to be generated for the 32- and 64-bit ports.
- */
- public void setMachineDescription(MachineDescription md32,
- MachineDescription md64);
-
- /**
- * Begin the emission of glue code. This might include opening files,
- * emitting class headers, etc.
- */
- public void beginEmission(GlueEmitterControls controls) throws Exception;
-
- /**
- * Finish the emission of glue code. This might include closing files,
- * closing open class definitions, etc.
- */
- public void endEmission() throws Exception;
-
- public void beginDefines() throws Exception;
- /**
- * @param optionalComment If optionalComment is non-null, the emitter can
- * emit that string as a comment providing extra information about the
- * define.
- */
- public void emitDefine(String name, String value, String optionalComment) throws Exception;
- public void endDefines() throws Exception;
-
- public void beginFunctions(TypeDictionary typedefDictionary,
- TypeDictionary structDictionary,
- Map canonMap) throws Exception;
-
- /** Emit glue code for the list of FunctionSymbols. */
- public Iterator emitFunctions(java.util.List/*<FunctionSymbol>*/ cFunctions) throws Exception;
- public void endFunctions() throws Exception;
-
- /** Begins the process of computing field offsets and type sizes for
- the structs to be emitted. */
- public void beginStructLayout() throws Exception;
- /** Lays out one struct which will be emitted later. */
- public void layoutStruct(CompoundType t) throws Exception;
- /** Finishes the struct layout process. */
- public void endStructLayout() throws Exception;
-
- public void beginStructs(TypeDictionary typedefDictionary,
- TypeDictionary structDictionary,
- Map canonMap) throws Exception;
- /** Emit glue code for the given CompoundType. alternateName is
- provided when the CompoundType (e.g. "struct foo_t") has not
- been typedefed to anything but the type of "pointer to struct
- foo_t" has (e.g. "typedef struct foo_t {} *Foo"); in this case
- alternateName would be set to Foo. */
- public void emitStruct(CompoundType t, String alternateName) throws Exception;
- public void endStructs() throws Exception;
-}
diff --git a/src/java/com/sun/gluegen/GlueEmitterControls.java b/src/java/com/sun/gluegen/GlueEmitterControls.java
deleted file mode 100644
index 46ff9fd..0000000
--- a/src/java/com/sun/gluegen/GlueEmitterControls.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2003 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;
-
-/** Specifies the interface by which a GlueEmitter can request
- additional information from the glue generator. */
-
-public interface GlueEmitterControls {
- /** Requests emission of an accessor for a struct that will not be
- referenced by any functions or other structs. */
- public void forceStructEmission(String typedefName);
-
- /** Finds the full path name of the specified header file based on
- the include directories specified on the command line. */
- public String findHeaderFile(String headerFileName);
-}
diff --git a/src/java/com/sun/gluegen/GlueGen.java b/src/java/com/sun/gluegen/GlueGen.java
deleted file mode 100644
index a7c64a8..0000000
--- a/src/java/com/sun/gluegen/GlueGen.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Copyright (c) 2003 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;
-
-import java.io.*;
-import java.util.*;
-
-import antlr.*;
-import antlr.collections.*;
-import com.sun.gluegen.cgram.*;
-import com.sun.gluegen.cgram.types.*;
-import com.sun.gluegen.pcpp.*;
-
-/** Glue code generator for C functions and data structures. */
-
-public class GlueGen implements GlueEmitterControls {
- private java.util.List forcedStructNames = new ArrayList();
- private PCPP preprocessor;
-
- public void forceStructEmission(String typedefName) {
- forcedStructNames.add(typedefName);
- }
-
- public String findHeaderFile(String headerFileName) {
- return preprocessor.findFile(headerFileName);
- }
-
- public void run(String[] args) {
- try {
- Reader reader = null;
- String filename = null;
- String emitterClass = null;
- java.util.List cfgFiles = new ArrayList();
-
- if (args.length == 0) {
- usage();
- }
-
- java.util.List includePaths = new ArrayList();
- for (int i = 0; i < args.length; i++) {
- if (i < args.length - 1) {
- String arg = args[i];
- if (arg.startsWith("-I")) {
- String[] paths = arg.substring(2).split(System.getProperty("path.separator"));
- for (int j = 0; j < paths.length; j++) {
- includePaths.add(paths[j]);
- }
- } else if (arg.startsWith("-E")) {
- emitterClass = arg.substring(2);
- } else if (arg.startsWith("-C")) {
- cfgFiles.add(arg.substring(2));
- } else {
- usage();
- }
- } else {
- String arg = args[i];
- if (arg.equals("-")) {
- reader = new InputStreamReader(System.in);
- filename = "standard input";
- } else {
- if (arg.startsWith("-")) {
- usage();
- }
- filename = arg;
- reader = new BufferedReader(new FileReader(filename));
- }
- }
- }
-
- preprocessor = new PCPP(includePaths);
- PipedInputStream ppIn = new PipedInputStream();
- final PipedOutputStream ppOut = new PipedOutputStream(ppIn);
- preprocessor.setOut(ppOut);
- final Reader rdr = reader;
- final String fn = filename;
- new Thread(new Runnable() {
- public void run() {
- try {
- preprocessor.run(rdr, fn);
- ppOut.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }).start();
-
- DataInputStream dis = new DataInputStream(ppIn);
- GnuCLexer lexer = new GnuCLexer(dis);
- lexer.setTokenObjectClass(CToken.class.getName());
- lexer.initialize();
- // Parse the input expression.
- GnuCParser parser = new GnuCParser(lexer);
-
- // set AST node type to TNode or get nasty cast class errors
- parser.setASTNodeType(TNode.class.getName());
- TNode.setTokenVocabulary(GNUCTokenTypes.class.getName());
-
- // invoke parser
- try {
- parser.translationUnit();
- }
- catch (RecognitionException e) {
- System.err.println("Fatal IO error:\n"+e);
- System.exit(1);
- }
- catch (TokenStreamException e) {
- System.err.println("Fatal IO error:\n"+e);
- System.exit(1);
- }
-
- HeaderParser headerParser = new HeaderParser();
- TypeDictionary td = new TypeDictionary();
- headerParser.setTypedefDictionary(td);
- TypeDictionary sd = new TypeDictionary();
- headerParser.setStructDictionary(sd);
- // set AST node type to TNode or get nasty cast class errors
- headerParser.setASTNodeType(TNode.class.getName());
- // walk that tree
- headerParser.translationUnit( parser.getAST() );
-
- // For debugging: Dump type dictionary and struct dictionary to System.err
- //td.dumpDictionary(System.err, "All Types");
- //sd.dumpDictionary(System.err, "All Structs");
-
- // At this point we have all of the pieces we need in order to
- // generate glue code: the #defines to constants, the set of
- // typedefs, and the set of functions.
-
- GlueEmitter emit = null;
- if (emitterClass == null) {
- emit = new JavaEmitter();
- } else {
- try {
- emit = (GlueEmitter) Class.forName(emitterClass).newInstance();
- } catch (Exception e) {
- System.err.println("Exception occurred while instantiating emitter class. Exiting.");
- e.printStackTrace();
- System.exit(1);
- }
- }
-
- for (Iterator iter = cfgFiles.iterator(); iter.hasNext(); ) {
- emit.readConfigurationFile((String) iter.next());
- }
-
- // Provide MachineDescriptions to emitter
- MachineDescription md32 = new MachineDescription32Bit();
- MachineDescription md64 = new MachineDescription64Bit();
- emit.setMachineDescription(md32, md64);
-
- // begin emission of glue code
- emit.beginEmission(this);
-
- emit.beginDefines();
- Set emittedDefines = new HashSet(100);
- // emit java equivalent of enum { ... } statements
- for (Iterator iter = headerParser.getEnums().iterator(); iter.hasNext(); ) {
- EnumType enumeration = (EnumType)iter.next();
- // iterate over all values in the enumeration
- for (int i = 0; i < enumeration.getNumEnumerates(); ++i) {
- String enumElementName = enumeration.getEnumName(i);
- if (emittedDefines.contains(enumElementName) == false) {
- emittedDefines.add(enumElementName);
- String comment = null;
- if (! enumeration.getName().equals("<anonymous>")) {
- comment = "Defined as part of enum type \"" +
- enumeration.getName() + "\"";
- }
- emit.emitDefine(
- enumElementName,
- String.valueOf(enumeration.getEnumValue(i)),
- comment);
- }
- }
- }
- // emit java equivalent of #define statements
- for (Iterator iter = lexer.getDefines().iterator(); iter.hasNext(); ) {
- Define def = (Define) iter.next();
- if (emittedDefines.contains(def.getName()) == false) {
- emittedDefines.add(def.getName());
- emit.emitDefine(def.getName(), def.getValue(), null);
- }
- }
- emit.endDefines();
-
- java.util.List functions = headerParser.getParsedFunctions();
-
- // Iterate through the functions finding structs that are referenced in
- // the function signatures; these will be remembered for later emission
- ReferencedStructs referencedStructs = new ReferencedStructs();
- for (Iterator iter = functions.iterator(); iter.hasNext(); ) {
- FunctionSymbol sym = (FunctionSymbol) iter.next();
- // FIXME: this doesn't take into account the possibility that some of
- // the functions we send to emitMethodBindings() might not actually be
- // emitted (e.g., if an Ignore directive in the JavaEmitter causes it
- // to be skipped).
- sym.getType().visit(referencedStructs);
- }
-
- // Normally only referenced types will be emitted. The user can force a
- // type to be emitted via a .cfg file directive. Those directives are
- // processed here.
- for (Iterator iter = forcedStructNames.iterator(); iter.hasNext(); ) {
- String name = (String) iter.next();
- Type type = td.get(name);
- if (type == null) {
- System.err.println("WARNING: during forced struct emission: struct \"" + name + "\" not found");
- } else if (!type.isCompound()) {
- System.err.println("WARNING: during forced struct emission: type \"" + name + "\" was not a struct");
- } else {
- type.visit(referencedStructs);
- }
- }
-
- // Lay out structs
- emit.beginStructLayout();
- for (Iterator iter = referencedStructs.results(); iter.hasNext(); ) {
- Type t = (Type) iter.next();
- if (t.isCompound()) {
- emit.layoutStruct(t.asCompound());
- } else if (t.isPointer()) {
- PointerType p = t.asPointer();
- CompoundType c = p.getTargetType().asCompound();
- emit.layoutStruct(c);
- }
- }
- emit.endStructLayout();
-
- // Emit structs
- emit.beginStructs(td, sd, headerParser.getCanonMap());
- for (Iterator iter = referencedStructs.results(); iter.hasNext(); ) {
- Type t = (Type) iter.next();
- if (t.isCompound()) {
- emit.emitStruct(t.asCompound(), null);
- } else if (t.isPointer()) {
- PointerType p = t.asPointer();
- CompoundType c = p.getTargetType().asCompound();
- assert p.hasTypedefedName() && c.getName() == null : "ReferencedStructs incorrectly recorded pointer type " + p;
- emit.emitStruct(c, p.getName());
- }
- }
- emit.endStructs();
-
- // emit java and C code to interface with the native functions
- emit.beginFunctions(td, sd, headerParser.getCanonMap());
- emit.emitFunctions(functions);
- emit.endFunctions();
-
- // end emission of glue code
- emit.endEmission();
-
- } catch ( Exception e ) {
- e.printStackTrace();
- System.err.println("Exception occurred while generating glue code. Exiting.");
- System.exit(1);
- }
- }
-
- public static void main(String[] args) {
- new GlueGen().run(args);
- }
-
- //----------------------------------------------------------------------
- // Internals only below this point
- //
-
- private static void usage() {
- System.out.println("Usage: java GlueGen [-I...] [-Eemitter_class_name] [-Ccfg_file_name...] <filename | ->");
- System.out.println();
- System.out.println("Runs C header parser on input file or standard input, first");
- System.out.println("passing input through minimal pseudo-C-preprocessor. Use -I");
- System.out.println("command-line arguments to specify the search path for #includes.");
- System.out.println("Emitter class name can be specified with -E option: i.e.,");
- System.out.println("-Ecom.sun.gluegen.JavaEmitter (the default). Use");
- System.out.println("-Ecom.sun.gluegen.DebugEmitter to print recognized entities");
- System.out.println("(#define directives to constant numbers, typedefs, and function");
- System.out.println("declarations) to standard output. Emitter-specific configuration");
- System.out.println("file or files can be specified with -C option; e.g,");
- System.out.println("-Cjava-emitter.cfg.");
- System.exit(1);
- }
-}
diff --git a/src/java/com/sun/gluegen/JavaConfiguration.java b/src/java/com/sun/gluegen/JavaConfiguration.java
deleted file mode 100644
index a452183..0000000
--- a/src/java/com/sun/gluegen/JavaConfiguration.java
+++ /dev/null
@@ -1,1387 +0,0 @@
-/*
- * Copyright (c) 2003 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;
-
-import java.io.*;
-import java.lang.reflect.Array;
-import java.util.*;
-import java.util.regex.*;
-
-import com.sun.gluegen.cgram.types.*;
-
-/** Parses and provides access to the contents of .cfg files for the
- JavaEmitter. */
-
-public class JavaConfiguration {
-
- private int nestedReads;
- private String packageName;
- private String implPackageName;
- private String className;
- private String implClassName;
- /**
- * Root directory for the hierarchy of generated java classes. Default is
- * working directory.
- */
- private String javaOutputDir = ".";
- /**
- * Directory into which generated native JNI code will be written. Default
- * is current working directory.
- */
- private String nativeOutputDir = ".";
- /**
- * If true, then each native *.c and *.h file will be generated in the
- * directory nativeOutputDir/packageAsPath(packageName). Default is false.
- */
- private boolean nativeOutputUsesJavaHierarchy;
- /**
- * If true, then the comment of a native method binding will include a @native tag
- * to allow taglets to augment the javadoc with additional information regarding
- * the mapped C function. Defaults to false.
- */
- private boolean tagNativeBinding;
- /**
- * Style of code emission. Can emit everything into one class
- * (AllStatic), separate interface and implementing classes
- * (InterfaceAndImpl), only the interface (InterfaceOnly), or only
- * the implementation (ImplOnly).
- */
- private int emissionStyle = JavaEmitter.ALL_STATIC;
- /**
- * List of imports to emit at the head of the output files.
- */
- private List/*<String>*/ imports = new ArrayList();
- /**
- * The package in which the generated glue code expects to find its
- * run-time helper classes (BufferFactory, CPU,
- * StructAccessor). Defaults to "com.sun.gluegen.runtime".
- */
- private String gluegenRuntimePackage = "com.sun.gluegen.runtime";
-
- /**
- * The kind of exception raised by the generated code if run-time
- * checks fail. Defaults to RuntimeException.
- */
- private String runtimeExceptionType = "RuntimeException";
- private Map/*<String,Integer>*/ accessControl = new HashMap();
- private Map/*<String,TypeInfo>*/ typeInfoMap = new HashMap();
- private Set/*<String>*/ returnsString = new HashSet();
- private Map/*<String, String>*/ returnedArrayLengths = new HashMap();
- /**
- * Key is function that has some byte[] or short[] arguments that should be
- * converted to String args; value is List of Integer argument indices
- */
- private Map/*<String,List<Integer>>*/ argumentsAreString = new HashMap();
- private Set/*<Pattern>*/ ignores = new HashSet();
- private Map/*<String,Pattern>*/ ignoreMap = new HashMap();
- private Set/*<Pattern>*/ ignoreNots = new HashSet();
- private Set/*<Pattern>*/ unignores = new HashSet();
- private Set/*<Pattern>*/ unimplemented = new HashSet();
- private Set/*<String>*/ nioDirectOnly = new HashSet();
- private Set/*<String>*/ manuallyImplement = new HashSet();
- private Map/*<String,List<String>>*/ customJavaCode = new HashMap();
- private Map/*<String,List<String>>*/ classJavadoc = new HashMap();
- private Map/*<String,String>*/ structPackages = new HashMap();
- private List/*<String>*/ customCCode = new ArrayList();
- private List/*<String>*/ forcedStructs = new ArrayList();
- private Map/*<String, String>*/ returnValueCapacities = new HashMap();
- private Map/*<String, String>*/ returnValueLengths = new HashMap();
- private Map/*<String, List<String>>*/ temporaryCVariableDeclarations = new HashMap();
- private Map/*<String, List<String>>*/ temporaryCVariableAssignments = new HashMap();
- private Map/*<String,List<String>>*/ extendedInterfaces = new HashMap();
- private Map/*<String,List<String>>*/ implementedInterfaces = new HashMap();
- private Map/*<String,String>*/ javaTypeRenames = new HashMap();
- private Map/*<String,String>*/ javaMethodRenames = new HashMap();
- private Map/*<String,List<String>>*/ javaPrologues = new HashMap();
- private Map/*<String,List<String>>*/ javaEpilogues = new HashMap();
-
- /** Reads the configuration file.
- @param filename path to file that should be read
- */
- public final void read(String filename) throws IOException {
- read(filename, null);
- }
-
- /** Reads the specified file, treating each line as if it started with the
- specified string.
- @param filename path to file that should be read
- @param linePrefix if not null, treat each line read as if it were
- prefixed with the specified string.
- */
- protected final void read(String filename, String linePrefix) throws IOException {
- File file = new File(filename);
- BufferedReader reader = null;
- try {
- reader = new BufferedReader(new FileReader(file));
- }
- catch (FileNotFoundException fnfe) {
- throw new RuntimeException("Could not read file \"" + file + "\"", fnfe);
- }
- int lineNo = 0;
- String line = null;
- boolean hasPrefix = linePrefix != null && linePrefix.length() > 0;
- try {
- ++nestedReads;
- while ((line = reader.readLine()) != null) {
- ++lineNo;
- if (hasPrefix)
- {
- line = linePrefix + " " + line;
- }
-
- if (line.trim().startsWith("#"))
- {
- // comment line
- continue;
- }
-
- StringTokenizer tok = new StringTokenizer(line);
- if (tok.hasMoreTokens())
- {
- // always reset delimiters in case of CustomJavaCode, etc.
- String cmd = tok.nextToken(" \t\n\r\f");
-
- dispatch(cmd, tok, file, filename, lineNo);
- }
- }
- reader.close();
- } finally {
- --nestedReads;
- }
-
- if (nestedReads == 0) {
- if (allStatic() && implClassName != null) {
- throw new IllegalStateException(
- "Error in configuration file \"" + filename + "\": Cannot use " +
- "directive \"ImplJavaClass\" in conjunction with " +
- "\"Style AllStatic\"");
- }
-
- if (className == null && (emissionStyle() != JavaEmitter.IMPL_ONLY)) {
- throw new RuntimeException("Output class name was not specified in configuration file \"" + filename + "\"");
- }
- if (packageName == null && (emissionStyle() != JavaEmitter.IMPL_ONLY)) {
- throw new RuntimeException("Output package name was not specified in configuration file \"" + filename + "\"");
- }
-
- if (allStatic()) {
- implClassName = className;
- // If we're using the "Style AllStatic" directive, then the
- // implPackageName is the same as the regular package name
- implPackageName = packageName;
- } else {
- if (implClassName == null) {
- // implClassName defaults to "<className>Impl" if ImplJavaClass
- // directive is not used
- if (className == null) {
- throw new RuntimeException("If ImplJavaClass is not specified, must specify JavaClass");
- }
- implClassName = className + "Impl";
- }
- if (implPackageName == null) {
- // implPackageName defaults to "<packageName>.impl" if ImplPackage
- // directive is not used
- if (packageName == null) {
- throw new RuntimeException("If ImplPackageName is not specified, must specify PackageName");
- }
- implPackageName = packageName + ".impl";
- }
- }
- }
- }
-
- /** Returns the package name parsed from the configuration file. */
- public String packageName() { return packageName; }
- /** Returns the implementation package name parsed from the configuration file. */
- public String implPackageName() { return implPackageName; }
- /** Returns the class name parsed from the configuration file. */
- public String className() { return className; }
- /** Returns the implementation class name parsed from the configuration file. */
- public String implClassName() { return implClassName; }
- /** Returns the Java code output directory parsed from the configuration file. */
- public String javaOutputDir() { return javaOutputDir; }
- /** Returns the native code output directory parsed from the configuration file. */
- public String nativeOutputDir() { return nativeOutputDir; }
- /** Returns whether the native code directory structure mirrors the Java hierarchy. */
- public boolean nativeOutputUsesJavaHierarchy() { return nativeOutputUsesJavaHierarchy; }
- /** Returns whether the comment of a native method binding should include a @native tag. */
- public boolean tagNativeBinding() { return tagNativeBinding; }
- /** Returns the code emission style (constants in JavaEmitter) parsed from the configuration file. */
- public int emissionStyle() { return emissionStyle; }
- /** Returns the access control for the emitted Java method. Returns one of JavaEmitter.ACC_PUBLIC, JavaEmitter.ACC_PROTECTED, JavaEmitter.ACC_PRIVATE, or JavaEmitter.ACC_PACKAGE_PRIVATE. */
- public int accessControl(String methodName) {
- Integer ret = (Integer) accessControl.get(methodName);
- if (ret != null) {
- return ret.intValue();
- }
- // Default access control is public
- return JavaEmitter.ACC_PUBLIC;
- }
-
- /** Returns the package in which the generated glue code expects to
- find its run-time helper classes (BufferFactory, CPU,
- StructAccessor). Defaults to "com.sun.gluegen.runtime". */
- public String gluegenRuntimePackage() { return gluegenRuntimePackage; }
- /** Returns the kind of exception to raise if run-time checks fail in the generated code. */
- public String runtimeExceptionType() { return runtimeExceptionType; }
- /** Returns the list of imports that should be emitted at the top of each .java file. */
- public List/*<String>*/ imports() { return imports; }
-
- private static final boolean DEBUG_TYPE_INFO = false;
- /** If this type should be considered opaque, returns the TypeInfo
- describing the replacement type. Returns null if this type
- should not be considered opaque. */
- public TypeInfo typeInfo(Type type, TypeDictionary typedefDictionary) {
- // Because typedefs of pointer types can show up at any point,
- // walk the pointer chain looking for a typedef name that is in
- // the TypeInfo map.
- if (DEBUG_TYPE_INFO)
- System.err.println("Incoming type = " + type);
- int pointerDepth = type.pointerDepth();
- for (int i = 0; i <= pointerDepth; i++) {
- String name = type.getName();
- if (DEBUG_TYPE_INFO) {
- System.err.println(" Type = " + type);
- System.err.println(" Name = " + name);
- }
- if (name != null) {
- TypeInfo info = closestTypeInfo(name, i + type.pointerDepth());
- if (info != null) {
- if (DEBUG_TYPE_INFO) {
- System.err.println(" info.name=" + info.name() + ", name=" + name +
- ", info.pointerDepth=" + info.pointerDepth() +
- ", type.pointerDepth=" + type.pointerDepth());
- }
- return promoteTypeInfo(info, i);
- }
- }
-
- if (type.isCompound()) {
- // Try struct name as well
- name = type.asCompound().getStructName();
- if (name != null) {
- TypeInfo info = closestTypeInfo(name, i + type.pointerDepth());
- if (info != null) {
- if (DEBUG_TYPE_INFO) {
- System.err.println(" info.name=" + info.name() + ", name=" + name +
- ", info.pointerDepth=" + info.pointerDepth() +
- ", type.pointerDepth=" + type.pointerDepth());
- }
- return promoteTypeInfo(info, i);
- }
- }
- }
-
- // Try all typedef names that map to this type
- Set entrySet = typedefDictionary.entrySet();
- for (Iterator iter = entrySet.iterator(); iter.hasNext(); ) {
- Map.Entry entry = (Map.Entry) iter.next();
- // "eq" equality is OK to use here since all types have been canonicalized
- if (entry.getValue() == type) {
- name = (String) entry.getKey();
- if (DEBUG_TYPE_INFO) {
- System.err.println("Looking under typedef name " + name);
- }
- TypeInfo info = closestTypeInfo(name, i + type.pointerDepth());
- if (info != null) {
- if (DEBUG_TYPE_INFO) {
- System.err.println(" info.name=" + info.name() + ", name=" + name +
- ", info.pointerDepth=" + info.pointerDepth() +
- ", type.pointerDepth=" + type.pointerDepth());
- }
- return promoteTypeInfo(info, i);
- }
- }
- }
-
- if (type.isPointer()) {
- type = type.asPointer().getTargetType();
- }
- }
-
- return null;
- }
-
- // Helper functions for above
- private TypeInfo closestTypeInfo(String name, int pointerDepth) {
- TypeInfo info = (TypeInfo) typeInfoMap.get(name);
- TypeInfo closest = null;
- while (info != null) {
- if (DEBUG_TYPE_INFO)
- System.err.println(" Checking TypeInfo for " + name + " at pointerDepth " + pointerDepth);
- if (info.pointerDepth() <= pointerDepth &&
- (closest == null ||
- info.pointerDepth() > closest.pointerDepth())) {
- if (DEBUG_TYPE_INFO)
- System.err.println(" Accepted");
- closest = info;
- }
- info = info.next();
- }
- return closest;
- }
-
- // Promotes a TypeInfo to a higher pointer type (if necessary)
- private TypeInfo promoteTypeInfo(TypeInfo info, int numPointersStripped) {
- int diff = numPointersStripped - info.pointerDepth();
- if (diff == 0) {
- return info;
- }
-
- if (diff < 0) {
- throw new RuntimeException("TypeInfo for " + info.name() + " and pointerDepth " +
- info.pointerDepth() + " should not have matched for depth " +
- numPointersStripped);
- }
-
- Class c = info.javaType().getJavaClass();
- int pd = info.pointerDepth();
-
- // Handle single-pointer stripping for types compatible with C
- // integral and floating-point types specially so we end up
- // generating NIO variants for these
- if (diff == 1) {
- JavaType jt = null;
- if (c == Boolean.TYPE) jt = JavaType.createForCCharPointer();
- else if (c == Byte.TYPE) jt = JavaType.createForCCharPointer();
- else if (c == Short.TYPE) jt = JavaType.createForCShortPointer();
- else if (c == Integer.TYPE) jt = JavaType.createForCInt32Pointer();
- else if (c == Long.TYPE) jt = JavaType.createForCInt64Pointer();
- else if (c == Float.TYPE) jt = JavaType.createForCFloatPointer();
- else if (c == Double.TYPE) jt = JavaType.createForCDoublePointer();
-
- if (jt != null)
- return new TypeInfo(info.name(), pd + numPointersStripped, jt);
- }
-
- while (diff > 0) {
- c = Array.newInstance(c, 0).getClass();
- --diff;
- }
-
- return new TypeInfo(info.name(),
- numPointersStripped,
- JavaType.createForClass(c));
- }
-
- /** Indicates whether the given function (which returns a
- <code>char*</code> in C) should be translated as returning a
- <code>java.lang.String</code>. */
- public boolean returnsString(String functionName) {
- return returnsString.contains(functionName);
- }
-
- /** Provides a Java MessageFormat expression indicating the number
- of elements in the returned array from the specified function
- name. Indicates that the given return value, which must be a
- pointer to a CompoundType, is actually an array of the
- CompoundType rather than a pointer to a single object. */
- public String returnedArrayLength(String functionName) {
- return (String) returnedArrayLengths.get(functionName);
- }
-
- /** Returns a list of <code>Integer</code>s which are the indices of <code>const char*</code>
- arguments that should be converted to <code>String</code>s. Returns null if there are no
- such hints for the given function name. */
-
- public List/*<Integer>*/ stringArguments(String functionName) {
- return (List) argumentsAreString.get(functionName);
- }
-
- /** Returns true if the given function should only create a java.nio
- variant, and no array variants, for <code>void*</code> and other
- C primitive pointers. */
- public boolean nioDirectOnly(String functionName) {
- return nioDirectOnly.contains(functionName);
- }
-
- /** Returns true if the glue code for the given function will be
- manually implemented by the end user. */
- public boolean manuallyImplement(String functionName) {
- return manuallyImplement.contains(functionName);
- }
-
- /** Returns a list of Strings containing user-implemented code for
- the given Java type name (not fully-qualified, only the class
- name); returns either null or an empty list if there is no
- custom code for the class. */
- public List customJavaCodeForClass(String className) {
- List res = (List) customJavaCode.get(className);
- if (res == null) {
- res = new ArrayList();
- customJavaCode.put(className, res);
- }
- return res;
- }
-
- /** Returns a list of Strings containing Javadoc documentation for
- the given Java type name (not fully-qualified, only the class
- name); returns either null or an empty list if there is no
- Javadoc documentation for the class. */
- public List javadocForClass(String className) {
- List res = (List) classJavadoc.get(className);
- if (res == null) {
- res = new ArrayList();
- classJavadoc.put(className, res);
- }
- return res;
- }
-
- /** Returns the package into which to place the glue code for
- accessing the specified struct. Defaults to emitting into the
- regular package (i.e., the result of {@link #packageName}). */
- public String packageForStruct(String structName) {
- String res = (String) structPackages.get(structName);
- if (res == null) {
- res = packageName;
- }
- return res;
- }
-
- /** Returns, as a List of Strings, the custom C code to be emitted
- along with the glue code for the main class. */
- public List/*<String>*/ customCCode() {
- return customCCode;
- }
-
- /** Returns, as a List of Strings, the structs for which glue code
- emission should be forced. */
- public List/*<String>*/ forcedStructs() {
- return forcedStructs;
- }
-
- /** Returns a MessageFormat string of the C expression calculating
- the capacity of the java.nio.ByteBuffer being returned from a
- native method, or null if no expression has been specified. */
- public String returnValueCapacity(String functionName) {
- return (String) returnValueCapacities.get(functionName);
- }
-
- /** Returns a MessageFormat string of the C expression calculating
- the length of the array being returned from a native method, or
- null if no expression has been specified. */
- public String returnValueLength(String functionName) {
- return (String) returnValueLengths.get(functionName);
- }
-
- /** Returns a List of Strings of expressions declaring temporary C
- variables in the glue code for the specified function. */
- public List/*<String>*/ temporaryCVariableDeclarations(String functionName) {
- return (List) temporaryCVariableDeclarations.get(functionName);
- }
-
- /** Returns a List of Strings of expressions containing assignments
- to temporary C variables in the glue code for the specified
- function. */
- public List/*<String>*/ temporaryCVariableAssignments(String functionName) {
- return (List) temporaryCVariableAssignments.get(functionName);
- }
-
- /** Returns a List of Strings indicating the interfaces the passed
- interface should declare it extends. May return null or a list
- of zero length if there are none. */
- public List/*<String>*/ extendedInterfaces(String interfaceName) {
- List res = (List) extendedInterfaces.get(interfaceName);
- if (res == null) {
- res = new ArrayList();
- extendedInterfaces.put(interfaceName, res);
- }
- return res;
- }
-
- /** Returns a List of Strings indicating the interfaces the passed
- class should declare it implements. May return null or a list
- of zero length if there are none. */
- public List/*<String>*/ implementedInterfaces(String className) {
- List res = (List) implementedInterfaces.get(className);
- if (res == null) {
- res = new ArrayList();
- implementedInterfaces.put(className, res);
- }
- return res;
- }
-
- /** Returns true if this #define, function, struct, or field within
- a struct should be ignored during glue code generation. */
- public boolean shouldIgnore(String symbol) {
-
- //System.err.println("CHECKING IGNORE: " + symbol);
-
- // Simple case; the entire symbol is in the ignore table.
- if (ignores.contains(symbol)) {
- return true;
- }
-
- // Ok, the slow case. We need to check the entire table, in case the table
- // contains an regular expression that matches the symbol.
- for (Iterator iter = ignores.iterator(); iter.hasNext(); ) {
- Pattern regexp = (Pattern)iter.next();
- Matcher matcher = regexp.matcher(symbol);
- if (matcher.matches()) {
- return true;
- }
- }
-
- // Check negated ignore table if not empty
- if (ignoreNots.size() > 0) {
- // Ok, the slow case. We need to check the entire table, in case the table
- // contains an regular expression that matches the symbol.
- for (Iterator iter = ignoreNots.iterator(); iter.hasNext(); ) {
- Pattern regexp = (Pattern)iter.next();
- Matcher matcher = regexp.matcher(symbol);
- if (!matcher.matches()) {
- // Special case as this is most often likely to be the case.
- // Unignores are not used very often.
- if(unignores.size() == 0)
- return true;
-
- boolean unignoreFound = false;
- for (Iterator iter2 = unignores.iterator(); iter2.hasNext(); ) {
- Pattern unignoreRegexp = (Pattern)iter2.next();
- Matcher unignoreMatcher = unignoreRegexp.matcher(symbol);
- if (unignoreMatcher.matches()) {
- unignoreFound = true;
- break;
- }
- }
-
- if (!unignoreFound)
- return true;
- }
- }
- }
-
- return false;
- }
-
- /** Returns true if this function should be given a body which
- throws a run-time exception with an "unimplemented" message
- during glue code generation. */
- public boolean isUnimplemented(String symbol) {
-
- // Simple case; the entire symbol is in the ignore table.
- if (unimplemented.contains(symbol)) {
- return true;
- }
-
- // Ok, the slow case. We need to check the entire table, in case the table
- // contains an regular expression that matches the symbol.
- for (Iterator iter = unimplemented.iterator(); iter.hasNext(); ) {
- Pattern regexp = (Pattern)iter.next();
- Matcher matcher = regexp.matcher(symbol);
- if (matcher.matches()) {
- return true;
- }
- }
-
- return false;
- }
-
- /** Returns a replacement name for this type, which should be the
- name of a Java wrapper class for a C struct, or the name
- unchanged if no RenameJavaType directive was specified for this
- type. */
- public String renameJavaType(String javaTypeName) {
- String rename = (String) javaTypeRenames.get(javaTypeName);
- if (rename != null) {
- return rename;
- }
- return javaTypeName;
- }
-
- /** Returns a replacement name for this function which should be
- used as the Java name for the bound method. It still calls the
- originally-named C function under the hood. Returns null if this
- function has not been explicitly renamed. */
- public String getJavaMethodRename(String functionName) {
- return (String) javaMethodRenames.get(functionName);
- }
-
- /** Returns true if the emission style is AllStatic. */
- public boolean allStatic() {
- return (emissionStyle == JavaEmitter.ALL_STATIC);
- }
-
- /** Returns true if an interface should be emitted during glue code generation. */
- public boolean emitInterface() {
- return (emissionStyle() == JavaEmitter.INTERFACE_AND_IMPL ||
- emissionStyle() == JavaEmitter.INTERFACE_ONLY);
- }
-
- /** Returns true if an implementing class should be emitted during glue code generation. */
- public boolean emitImpl() {
- return (emissionStyle() == JavaEmitter.ALL_STATIC ||
- emissionStyle() == JavaEmitter.INTERFACE_AND_IMPL ||
- emissionStyle() == JavaEmitter.IMPL_ONLY);
- }
-
- /** Returns a list of Strings which should be emitted as a prologue
- to the body for the Java-side glue code for the given method.
- Returns null if no prologue was specified. */
- public List/*<String>*/ javaPrologueForMethod(MethodBinding binding,
- boolean forImplementingMethodCall,
- boolean eraseBufferAndArrayTypes) {
- List/*<String>*/ res = (List/*<String>*/) javaPrologues.get(binding.getName());
- if (res == null) {
- // Try again with method name and descriptor
- res = (List/*<String>*/) javaPrologues.get(binding.getName() +
- binding.getDescriptor(forImplementingMethodCall,
- eraseBufferAndArrayTypes));
- }
- return res;
- }
-
- /** Returns a list of Strings which should be emitted as an epilogue
- to the body for the Java-side glue code for the given method.
- Returns null if no epilogue was specified. */
- public List/*<String>*/ javaEpilogueForMethod(MethodBinding binding,
- boolean forImplementingMethodCall,
- boolean eraseBufferAndArrayTypes) {
- List/*<String>*/ res = (List/*<String>*/) javaEpilogues.get(binding.getName());
- if (res == null) {
- // Try again with method name and descriptor
- res = (List/*<String>*/) javaEpilogues.get(binding.getName() +
- binding.getDescriptor(forImplementingMethodCall,
- eraseBufferAndArrayTypes));
- }
- return res;
- }
-
- //----------------------------------------------------------------------
- // Internals only below this point
- //
-
- protected void dispatch(String cmd, StringTokenizer tok, File file, String filename, int lineNo) throws IOException {
- //System.err.println("read cmd = [" + cmd + "]");
- if (cmd.equalsIgnoreCase("Package")) {
- packageName = readString("package", tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("GlueGenRuntimePackage")) {
- gluegenRuntimePackage = readString("GlueGenRuntimePackage", tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("ImplPackage")) {
- implPackageName = readString("ImplPackage", tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("JavaClass")) {
- className = readString("JavaClass", tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("ImplJavaClass")) {
- implClassName = readString("ImplJavaClass", tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("JavaOutputDir")) {
- javaOutputDir = readString("JavaOutputDir", tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("NativeOutputDir")) {
- nativeOutputDir = readString("NativeOutputDir", tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("HierarchicalNativeOutput")) {
- String tmp = readString("HierarchicalNativeOutput", tok, filename, lineNo);
- nativeOutputUsesJavaHierarchy = Boolean.valueOf(tmp).booleanValue();
- } else if (cmd.equalsIgnoreCase("TagNativeBinding")) {
- tagNativeBinding = readBoolean("TagNativeBinding", tok, filename, lineNo).booleanValue();
- } else if (cmd.equalsIgnoreCase("Style")) {
- String style = readString("Style", tok, filename, lineNo);
- if (style.equalsIgnoreCase("AllStatic")) {
- emissionStyle = JavaEmitter.ALL_STATIC;
- } else if (style.equalsIgnoreCase("InterfaceAndImpl")) {
- emissionStyle = JavaEmitter.INTERFACE_AND_IMPL;
- } else if (style.equalsIgnoreCase("InterfaceOnly")) {
- emissionStyle = JavaEmitter.INTERFACE_ONLY;
- } else if (style.equalsIgnoreCase("ImplOnly")) {
- emissionStyle = JavaEmitter.IMPL_ONLY;
- } else {
- System.err.println("WARNING: Error parsing \"style\" command at line " + lineNo +
- " in file \"" + filename + "\"");
- }
- } else if (cmd.equalsIgnoreCase("AccessControl")) {
- readAccessControl(tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("Import")) {
- imports.add(readString("Import", tok, filename, lineNo));
- } else if (cmd.equalsIgnoreCase("Opaque")) {
- readOpaque(tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("ReturnsString")) {
- readReturnsString(tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("ReturnedArrayLength")) {
- readReturnedArrayLength(tok, filename, lineNo);
- // Warning: make sure delimiters are reset at the top of this loop
- // because ReturnedArrayLength changes them.
- } else if (cmd.equalsIgnoreCase("ArgumentIsString")) {
- readArgumentIsString(tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("Ignore")) {
- readIgnore(tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("Unignore")) {
- readUnignore(tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("IgnoreNot")) {
- readIgnoreNot(tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("Unimplemented")) {
- readUnimplemented(tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("IgnoreField")) {
- readIgnoreField(tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("ManuallyImplement")) {
- readManuallyImplement(tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("CustomJavaCode")) {
- readCustomJavaCode(tok, filename, lineNo);
- // Warning: make sure delimiters are reset at the top of this loop
- // because readCustomJavaCode changes them.
- } else if (cmd.equalsIgnoreCase("CustomCCode")) {
- readCustomCCode(tok, filename, lineNo);
- // Warning: make sure delimiters are reset at the top of this loop
- // because readCustomCCode changes them.
- } else if (cmd.equalsIgnoreCase("ClassJavadoc")) {
- readClassJavadoc(tok, filename, lineNo);
- // Warning: make sure delimiters are reset at the top of this loop
- // because readClassJavadoc changes them.
- } else if (cmd.equalsIgnoreCase("NioDirectOnly")) {
- nioDirectOnly.add(readString("NioDirectOnly", tok, filename, lineNo));
- } else if (cmd.equalsIgnoreCase("EmitStruct")) {
- forcedStructs.add(readString("EmitStruct", tok, filename, lineNo));
- } else if (cmd.equalsIgnoreCase("StructPackage")) {
- readStructPackage(tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("TemporaryCVariableDeclaration")) {
- readTemporaryCVariableDeclaration(tok, filename, lineNo);
- // Warning: make sure delimiters are reset at the top of this loop
- // because TemporaryCVariableDeclaration changes them.
- } else if (cmd.equalsIgnoreCase("TemporaryCVariableAssignment")) {
- readTemporaryCVariableAssignment(tok, filename, lineNo);
- // Warning: make sure delimiters are reset at the top of this loop
- // because TemporaryCVariableAssignment changes them.
- } else if (cmd.equalsIgnoreCase("ReturnValueCapacity")) {
- readReturnValueCapacity(tok, filename, lineNo);
- // Warning: make sure delimiters are reset at the top of this loop
- // because ReturnValueCapacity changes them.
- } else if (cmd.equalsIgnoreCase("ReturnValueLength")) {
- readReturnValueLength(tok, filename, lineNo);
- // Warning: make sure delimiters are reset at the top of this loop
- // because ReturnValueLength changes them.
- } else if (cmd.equalsIgnoreCase("Include")) {
- doInclude(tok, file, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("IncludeAs")) {
- doIncludeAs(tok, file, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("Extends")) {
- readExtend(tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("Implements")) {
- readImplements(tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("RenameJavaType")) {
- readRenameJavaType(tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("RenameJavaMethod")) {
- readRenameJavaMethod(tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("RuntimeExceptionType")) {
- runtimeExceptionType = readString("RuntimeExceptionType", tok, filename, lineNo);
- } else if (cmd.equalsIgnoreCase("JavaPrologue")) {
- readJavaPrologueOrEpilogue(tok, filename, lineNo, true);
- // Warning: make sure delimiters are reset at the top of this loop
- // because readJavaPrologueOrEpilogue changes them.
- } else if (cmd.equalsIgnoreCase("JavaEpilogue")) {
- readJavaPrologueOrEpilogue(tok, filename, lineNo, false);
- // Warning: make sure delimiters are reset at the top of this loop
- // because readJavaPrologueOrEpilogue changes them.
- } else if (cmd.equalsIgnoreCase("RangeCheck")) {
- readRangeCheck(tok, filename, lineNo, false);
- // Warning: make sure delimiters are reset at the top of this loop
- // because RangeCheck changes them.
- } else if (cmd.equalsIgnoreCase("RangeCheckBytes")) {
- readRangeCheck(tok, filename, lineNo, true);
- // Warning: make sure delimiters are reset at the top of this loop
- // because RangeCheckBytes changes them.
- } else {
- throw new RuntimeException("Unknown command \"" + cmd +
- "\" in command file " + filename +
- " at line number " + lineNo);
- }
- }
-
- protected String readString(String cmd, StringTokenizer tok, String filename, int lineNo) {
- try {
- return tok.nextToken();
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"" + cmd + "\" command at line " + lineNo +
- " in file \"" + filename + "\": missing expected parameter", e);
- }
- }
-
- protected Boolean readBoolean(String cmd, StringTokenizer tok, String filename, int lineNo) {
- try {
- return Boolean.valueOf(tok.nextToken());
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"" + cmd + "\" command at line " + lineNo +
- " in file \"" + filename + "\": missing expected boolean value", e);
- }
- }
-
- protected Class stringToPrimitiveType(String type) throws ClassNotFoundException {
- if (type.equals("boolean")) return Boolean.TYPE;
- if (type.equals("byte")) return Byte.TYPE;
- if (type.equals("char")) return Character.TYPE;
- if (type.equals("short")) return Short.TYPE;
- if (type.equals("int")) return Integer.TYPE;
- if (type.equals("long")) return Long.TYPE;
- if (type.equals("float")) return Float.TYPE;
- if (type.equals("double")) return Double.TYPE;
- throw new RuntimeException("Only primitive types are supported here");
- }
-
- protected void readAccessControl(StringTokenizer tok, String filename, int lineNo) {
- try {
- String methodName = tok.nextToken();
- String style = tok.nextToken();
- int acc = 0;
- if (style.equalsIgnoreCase("PUBLIC")) {
- acc = JavaEmitter.ACC_PUBLIC;
- } else if (style.equalsIgnoreCase("PROTECTED")) {
- acc = JavaEmitter.ACC_PROTECTED;
- } else if (style.equalsIgnoreCase("PRIVATE")) {
- acc = JavaEmitter.ACC_PRIVATE;
- } else if (style.equalsIgnoreCase("PACKAGE_PRIVATE")) {
- acc = JavaEmitter.ACC_PACKAGE_PRIVATE;
- } else {
- throw new RuntimeException("Error parsing \"AccessControl\" command at line " + lineNo +
- " in file \"" + filename + "\"");
- }
- accessControl.put(methodName, new Integer(acc));
- } catch (Exception e) {
- throw new RuntimeException("Error parsing \"AccessControl\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void readOpaque(StringTokenizer tok, String filename, int lineNo) {
- try {
- JavaType javaType = JavaType.createForClass(stringToPrimitiveType(tok.nextToken()));
- String cType = null;
- while (tok.hasMoreTokens()) {
- if (cType == null) {
- cType = tok.nextToken();
- } else {
- cType = cType + " " + tok.nextToken();
- }
- }
- if (cType == null) {
- throw new RuntimeException("No C type for \"Opaque\" command at line " + lineNo +
- " in file \"" + filename + "\"");
- }
- TypeInfo info = parseTypeInfo(cType, javaType);
- addTypeInfo(info);
- } catch (Exception e) {
- throw new RuntimeException("Error parsing \"Opaque\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void readReturnsString(StringTokenizer tok, String filename, int lineNo) {
- try {
- String name = tok.nextToken();
- returnsString.add(name);
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"ReturnsString\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void readReturnedArrayLength(StringTokenizer tok, String filename, int lineNo) {
- try {
- String functionName = tok.nextToken();
- String restOfLine = tok.nextToken("\n\r\f");
- restOfLine = restOfLine.trim();
- returnedArrayLengths.put(functionName, restOfLine);
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"ReturnedArrayLength\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void readIgnore(StringTokenizer tok, String filename, int lineNo) {
- try {
- String regex = tok.nextToken();
- Pattern pattern = Pattern.compile(regex);
- ignores.add(pattern);
- ignoreMap.put(regex, pattern);
- //System.err.println("IGNORING " + regex + " / " + ignores.get(regex));
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"Ignore\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void readUnignore(StringTokenizer tok, String filename, int lineNo) {
- try {
- String regex = tok.nextToken();
- Pattern pattern = (Pattern) ignoreMap.get(regex);
- ignoreMap.remove(regex);
- ignores.remove(pattern);
-
- // If the pattern wasn't registered before, then make sure we have a
- // valid pattern instance to put into the unignores set.
- if(pattern == null)
- pattern = Pattern.compile(regex);
- unignores.add(pattern);
-
- //System.err.println("UN-IGNORING " + regex + " / " + ignores.get(regex));
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"Unignore\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void readIgnoreNot(StringTokenizer tok, String filename, int lineNo) {
- try {
- String regex = tok.nextToken();
- ignoreNots.add(Pattern.compile(regex));
- //System.err.println("IGNORING NEGATION OF " + regex + " / " + ignores.get(regex));
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"IgnoreNot\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void readUnimplemented(StringTokenizer tok, String filename, int lineNo) {
- try {
- String regex = tok.nextToken();
- unimplemented.add(Pattern.compile(regex));
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"Unimplemented\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void readIgnoreField(StringTokenizer tok, String filename, int lineNo) {
- try {
- String containingStruct = tok.nextToken();
- String name = tok.nextToken();
- ignores.add(Pattern.compile(containingStruct + " " + name));
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"IgnoreField\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void readManuallyImplement(StringTokenizer tok, String filename, int lineNo) {
- try {
- String name = tok.nextToken();
- manuallyImplement.add(name);
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"ManuallyImplement\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void readCustomJavaCode(StringTokenizer tok, String filename, int lineNo) {
- try {
- String className = tok.nextToken();
- String restOfLine = tok.nextToken("\n\r\f");
- addCustomJavaCode(className, restOfLine);
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"CustomJavaCode\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void addCustomJavaCode(String className, String code) {
- List codeList = customJavaCodeForClass(className);
- codeList.add(code);
- }
-
- protected void readCustomCCode(StringTokenizer tok, String filename, int lineNo) {
- try {
- String restOfLine = tok.nextToken("\n\r\f");
- customCCode.add(restOfLine);
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"CustomCCode\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void readClassJavadoc(StringTokenizer tok, String filename, int lineNo) {
- try {
- String className = tok.nextToken();
- String restOfLine = tok.nextToken("\n\r\f");
- addClassJavadoc(className, restOfLine);
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"ClassJavadoc\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void addClassJavadoc(String className, String code) {
- List codeList = javadocForClass(className);
- codeList.add(code);
- }
-
- /**
- * When const char* arguments in the C function prototypes are encountered,
- * the emitter will normally convert them to <code>byte[]</code>
- * arguments. This directive lets you specify which of those arguments
- * should be converted to <code>String</code> arguments instead of <code>
- * byte[] </code>. <p>
- *
- * For example, given the C prototype:
- * <pre>
- * void FuncName(const char* ugh, int bar, const char *foo, const char* goop);
- * </pre>
- *
- * The emitter will normally emit:
- * <pre>
- * public abstract void FuncName(byte[] ugh, int bar, byte[] foo, byte[] goop);
- * </pre>
- *
- * However, if you supplied the following directive:
- *
- * <pre>
- * ArgumentIsString FuncName 0 2
- * </pre>
- *
- * The emitter will instead emit:
- * <pre>
- * public abstract void FuncName(String ugh, int bar, String foo, byte[] goop);
- * </pre>
- *
- */
- protected void readArgumentIsString(StringTokenizer tok, String filename, int lineNo) {
- try {
- String methodName = tok.nextToken();
- ArrayList argIndices = new ArrayList(2);
- while (tok.hasMoreTokens()) {
- Integer idx = Integer.valueOf(tok.nextToken());
- argIndices.add(idx);
- }
-
- if (argIndices.size() > 0) {
- argumentsAreString.put(methodName, argIndices);
- } else {
- throw new RuntimeException("ERROR: Error parsing \"ArgumentIsString\" command at line " + lineNo +
- " in file \"" + filename + "\": directive requires specification of at least 1 index");
- }
- } catch (NoSuchElementException e) {
- throw new RuntimeException(
- "Error parsing \"ArgumentIsString\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void readStructPackage(StringTokenizer tok, String filename, int lineNo) {
- try {
- String struct = tok.nextToken();
- String pkg = tok.nextToken();
- structPackages.put(struct, pkg);
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"StructPackage\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void readReturnValueCapacity(StringTokenizer tok, String filename, int lineNo) {
- try {
- String functionName = tok.nextToken();
- String restOfLine = tok.nextToken("\n\r\f");
- restOfLine = restOfLine.trim();
- returnValueCapacities.put(functionName, restOfLine);
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"ReturnValueCapacity\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void readReturnValueLength(StringTokenizer tok, String filename, int lineNo) {
- try {
- String functionName = tok.nextToken();
- String restOfLine = tok.nextToken("\n\r\f");
- restOfLine = restOfLine.trim();
- returnValueLengths.put(functionName, restOfLine);
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"ReturnValueLength\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void readTemporaryCVariableDeclaration(StringTokenizer tok, String filename, int lineNo) {
- try {
- String functionName = tok.nextToken();
- String restOfLine = tok.nextToken("\n\r\f");
- restOfLine = restOfLine.trim();
- List list = (List) temporaryCVariableDeclarations.get(functionName);
- if (list == null) {
- list = new ArrayList/*<String>*/();
- temporaryCVariableDeclarations.put(functionName, list);
- }
- list.add(restOfLine);
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"TemporaryCVariableDeclaration\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void readTemporaryCVariableAssignment(StringTokenizer tok, String filename, int lineNo) {
- try {
- String functionName = tok.nextToken();
- String restOfLine = tok.nextToken("\n\r\f");
- restOfLine = restOfLine.trim();
- List list = (List) temporaryCVariableAssignments.get(functionName);
- if (list == null) {
- list = new ArrayList/*<String>*/();
- temporaryCVariableAssignments.put(functionName, list);
- }
- list.add(restOfLine);
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"TemporaryCVariableAssignment\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void doInclude(StringTokenizer tok, File file, String filename, int lineNo) throws IOException {
- try {
- String includedFilename = tok.nextToken();
- File includedFile = new File(includedFilename);
- if (!includedFile.isAbsolute()) {
- includedFile = new File(file.getParentFile(), includedFilename);
- }
- read(includedFile.getAbsolutePath());
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"Include\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void doIncludeAs(StringTokenizer tok, File file, String filename, int lineNo) throws IOException {
- try {
- StringBuffer linePrefix = new StringBuffer(128);
- while (tok.countTokens() > 1)
- {
- linePrefix.append(tok.nextToken());
- linePrefix.append(" ");
- }
- // last token is filename
- String includedFilename = tok.nextToken();
- File includedFile = new File(includedFilename);
- if (!includedFile.isAbsolute()) {
- includedFile = new File(file.getParentFile(), includedFilename);
- }
- read(includedFile.getAbsolutePath(), linePrefix.toString());
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"IncludeAs\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void readExtend(StringTokenizer tok, String filename, int lineNo) {
- try {
- String interfaceName = tok.nextToken();
- List intfs = extendedInterfaces(interfaceName);
- intfs.add(tok.nextToken());
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"Extends\" command at line " + lineNo +
- " in file \"" + filename + "\": missing expected parameter", e);
- }
- }
-
- protected void readImplements(StringTokenizer tok, String filename, int lineNo) {
- try {
- String className = tok.nextToken();
- List intfs = implementedInterfaces(className);
- intfs.add(tok.nextToken());
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"Implements\" command at line " + lineNo +
- " in file \"" + filename + "\": missing expected parameter", e);
- }
- }
-
- protected void readRenameJavaType(StringTokenizer tok, String filename, int lineNo) {
- try {
- String fromName = tok.nextToken();
- String toName = tok.nextToken();
- javaTypeRenames.put(fromName, toName);
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"RenameJavaType\" command at line " + lineNo +
- " in file \"" + filename + "\": missing expected parameter", e);
- }
- }
-
- protected void readRenameJavaMethod(StringTokenizer tok, String filename, int lineNo) {
- try {
- String fromName = tok.nextToken();
- String toName = tok.nextToken();
- javaMethodRenames.put(fromName, toName);
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"RenameJavaMethod\" command at line " + lineNo +
- " in file \"" + filename + "\": missing expected parameter", e);
- }
- }
-
- protected void readJavaPrologueOrEpilogue(StringTokenizer tok, String filename, int lineNo, boolean prologue) {
- try {
- String methodName = tok.nextToken();
- String restOfLine = tok.nextToken("\n\r\f");
- restOfLine = restOfLine.trim();
- if (startsWithDescriptor(restOfLine)) {
- // Assume it starts with signature for disambiguation
- int spaceIdx = restOfLine.indexOf(' ');
- if (spaceIdx > 0) {
- String descriptor = restOfLine.substring(0, spaceIdx);
- restOfLine = restOfLine.substring(spaceIdx + 1, restOfLine.length());
- methodName = methodName + descriptor;
- }
- }
- addJavaPrologueOrEpilogue(methodName, restOfLine, prologue);
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"" +
- (prologue ? "JavaPrologue" : "JavaEpilogue") +
- "\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void addJavaPrologueOrEpilogue(String methodName, String code, boolean prologue) {
- Map codes = (prologue ? javaPrologues : javaEpilogues);
- List/*<String>*/ data = (List/*<String>*/) codes.get(methodName);
- if (data == null) {
- data = new ArrayList/*<String>*/();
- codes.put(methodName, data);
- }
- data.add(code);
- }
-
- protected void readRangeCheck(StringTokenizer tok, String filename, int lineNo, boolean inBytes) {
- try {
- String functionName = tok.nextToken();
- int argNum = Integer.parseInt(tok.nextToken());
- String restOfLine = tok.nextToken("\n\r\f");
- restOfLine = restOfLine.trim();
- // Construct a JavaPrologue for this
- addJavaPrologueOrEpilogue(functionName,
- "BufferFactory.rangeCheck" +
- (inBytes ? "Bytes" : "") +
- "({" + argNum + "}, " + restOfLine + ");",
- true);
- } catch (Exception e) {
- throw new RuntimeException("Error parsing \"RangeCheck" + (inBytes ? "Bytes" : "") + "\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected static TypeInfo parseTypeInfo(String cType, JavaType javaType) {
- String typeName = null;
- int pointerDepth = 0;
- int idx = 0;
- while (idx < cType.length() &&
- (cType.charAt(idx) != ' ') &&
- (cType.charAt(idx) != '*')) {
- ++idx;
- }
- typeName = cType.substring(0, idx);
- // Count pointer depth
- while (idx < cType.length()) {
- if (cType.charAt(idx) == '*') {
- ++pointerDepth;
- }
- ++idx;
- }
- return new TypeInfo(typeName, pointerDepth, javaType);
- }
-
- protected void addTypeInfo(TypeInfo info) {
- TypeInfo tmp = (TypeInfo) typeInfoMap.get(info.name());
- if (tmp == null) {
- typeInfoMap.put(info.name(), info);
- return;
- }
- while (tmp.next() != null) {
- tmp = tmp.next();
- }
- tmp.setNext(info);
- }
-
- private static int nextIndexAfterType(String s, int idx) {
- int len = s.length();
- while (idx < len) {
- char c = s.charAt(idx);
-
- if (Character.isJavaIdentifierStart(c) ||
- Character.isJavaIdentifierPart(c) ||
- (c == '/')) {
- idx++;
- } else if (c == ';') {
- return (idx + 1);
- } else {
- return -1;
- }
- }
- return -1;
- }
-
- private static int nextIndexAfterDescriptor(String s, int idx) {
- char c = s.charAt(idx);
- switch (c) {
- case 'B':
- case 'C':
- case 'D':
- case 'F':
- case 'I':
- case 'J':
- case 'S':
- case 'Z':
- case 'V': return (1 + idx);
- case 'L': return nextIndexAfterType(s, idx + 1);
- case ')': return idx;
- default: break;
- }
- return -1;
- }
-
- protected static boolean startsWithDescriptor(String s) {
- // Try to see whether the String s starts with a valid Java
- // descriptor.
-
- int idx = 0;
- int len = s.length();
- while ((idx < len) && s.charAt(idx) == ' ') {
- ++idx;
- }
-
- if (idx >= len) return false;
- if (s.charAt(idx++) != '(') return false;
- while (idx < len) {
- int nextIdx = nextIndexAfterDescriptor(s, idx);
- if (nextIdx < 0) {
- return false;
- }
- if (nextIdx == idx) {
- // ')'
- break;
- }
- idx = nextIdx;
- }
- int nextIdx = nextIndexAfterDescriptor(s, idx + 1);
- if (nextIdx < 0) {
- return false;
- }
- return true;
- }
-}
diff --git a/src/java/com/sun/gluegen/JavaEmitter.java b/src/java/com/sun/gluegen/JavaEmitter.java
deleted file mode 100644
index ef5c36d..0000000
--- a/src/java/com/sun/gluegen/JavaEmitter.java
+++ /dev/null
@@ -1,1698 +0,0 @@
-/*
- * Copyright (c) 2003 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;
-
-import java.io.*;
-import java.util.*;
-import java.text.MessageFormat;
-
-import com.sun.gluegen.cgram.types.*;
-
-// PROBLEMS:
-// - what if something returns 'const int *'? Could we
-// return an IntBuffer that has read-only behavior? Or do we copy the array
-// (but we don't know its size!). What do we do if it returns a non-const
-// int*? Should the user be allowed to write back to the returned pointer?
-//
-// - Non-const array types must be properly released with JNI_COMMIT
-// in order to see side effects if the array was copied.
-
-
-public class JavaEmitter implements GlueEmitter {
- private StructLayout layout;
- private TypeDictionary typedefDictionary;
- private TypeDictionary structDictionary;
- private Map canonMap;
- private JavaConfiguration cfg;
-
- /**
- * Style of code emission. Can emit everything into one class
- * (AllStatic), separate interface and implementing classes
- * (InterfaceAndImpl), only the interface (InterfaceOnly), or only
- * the implementation (ImplOnly).
- */
- public static final int ALL_STATIC = 1;
- public static final int INTERFACE_AND_IMPL = 2;
- public static final int INTERFACE_ONLY = 3;
- public static final int IMPL_ONLY = 4;
-
- /**
- * Access control for emitted Java methods.
- */
- public static final int ACC_PUBLIC = 1;
- public static final int ACC_PROTECTED = 2;
- public static final int ACC_PRIVATE = 3;
- public static final int ACC_PACKAGE_PRIVATE = 4;
-
- private PrintWriter javaWriter; // Emits either interface or, in AllStatic mode, everything
- private PrintWriter javaImplWriter; // Only used in non-AllStatic modes for impl class
- private PrintWriter cWriter;
- private MachineDescription machDesc32;
- private MachineDescription machDesc64;
-
- public void readConfigurationFile(String filename) throws Exception {
- cfg = createConfig();
- cfg.read(filename);
- }
-
- public void setMachineDescription(MachineDescription md32,
- MachineDescription md64) {
- if ((md32 == null) && (md64 == null)) {
- throw new RuntimeException("Must specify at least one MachineDescription");
- }
-
- machDesc32 = md32;
- machDesc64 = md64;
- }
-
- public void beginEmission(GlueEmitterControls controls) throws IOException
- {
- try
- {
- openWriters();
- }
- catch (Exception e)
- {
- throw new RuntimeException(
- "Unable to open files for writing", e);
- }
-
- emitAllFileHeaders();
-
- // Request emission of any structs requested
- for (Iterator iter = cfg.forcedStructs().iterator(); iter.hasNext(); ) {
- controls.forceStructEmission((String) iter.next());
- }
- }
-
- public void endEmission()
- {
- emitAllFileFooters();
-
- try
- {
- closeWriters();
- }
- catch (Exception e)
- {
- throw new RuntimeException(
- "Unable to close open files", e);
- }
- }
-
- public void beginDefines() throws Exception
- {
- if (cfg.allStatic() || cfg.emitInterface()) {
- javaWriter().println();
- }
- }
-
- public void emitDefine(String name, String value, String optionalComment) throws Exception
- {
- if (cfg.allStatic() || cfg.emitInterface()) {
- // TODO: Some defines (e.g., GL_DOUBLE_EXT in gl.h) are defined in terms
- // of other defines -- should we emit them as references to the original
- // define (not even sure if the lexer supports this)? Right now they're
- // emitted as the numeric value of the original definition. If we decide
- // emit them as references we'll also have to emit them in the correct
- // order. It's probably not an issue right now because the emitter
- // currently only emits only numeric defines -- if it handled #define'd
- // objects it would make a bigger difference.
-
- if (!cfg.shouldIgnore(name)) {
- String type = null;
-
- // FIXME: need to handle when type specifier is in last char (e.g.,
- // "1.0d or 2759L", because parseXXX() methods don't allow the type
- // specifier character in the string.
- //
- //char lastChar = value.charAt(value.length()-1);
-
- try {
- // see if it's a long or int
- int radix;
- String parseValue;
- // FIXME: are you allowed to specify hex/octal constants with
- // negation, e.g. "-0xFF" or "-056"? If so, need to modify the
- // following "if(..)" checks and parseValue computation
- if (value.startsWith("0x") || value.startsWith("0X")) {
- radix = 16;
- parseValue = value.substring(2);
- }
- else if (value.startsWith("0") && value.length() > 1) {
- // TODO: is "0" the prefix in C to indicate octal???
- radix = 8;
- parseValue = value.substring(1);
- }
- else {
- radix = 10;
- parseValue = value;
- }
- //System.err.println("parsing " + value + " as long w/ radix " + radix);
- long longVal = Long.parseLong(parseValue, radix);
- type = "long";
- // if constant is small enough, store it as an int instead of a long
- if (longVal > Integer.MIN_VALUE && longVal < Integer.MAX_VALUE) {
- type = "int";
- }
-
- } catch (NumberFormatException e) {
- try {
- // see if it's a double or float
- double dVal = Double.parseDouble(value);
- type = "double";
- // if constant is small enough, store it as a float instead of a double
- if (dVal > Float.MIN_VALUE && dVal < Float.MAX_VALUE) {
- type = "float";
- }
-
- } catch (NumberFormatException e2) {
- throw new RuntimeException(
- "Cannot emit define \""+name+"\": value \""+value+
- "\" cannot be assigned to a int, long, float, or double", e2);
- }
- }
-
- if (type == null) {
- throw new RuntimeException(
- "Cannot emit define (2) \""+name+"\": value \""+value+
- "\" cannot be assigned to a int, long, float, or double");
- }
- if (optionalComment != null && optionalComment.length() != 0) {
- javaWriter().println(" /** " + optionalComment + " */");
- }
- javaWriter().println(" public static final " + type + " " + name + " = " + value + ";");
- }
- }
- }
-
- public void endDefines() throws Exception
- {
- }
-
- public void beginFunctions(TypeDictionary typedefDictionary,
- TypeDictionary structDictionary,
- Map canonMap) throws Exception {
- this.typedefDictionary = typedefDictionary;
- this.structDictionary = structDictionary;
- this.canonMap = canonMap;
- if (cfg.allStatic() || cfg.emitInterface()) {
- javaWriter().println();
- }
- }
-
- public Iterator emitFunctions(List/*<FunctionSymbol>*/ originalCFunctions)
- throws Exception {
- // Sometimes headers will have the same function prototype twice, once
- // with the argument names and once without. We'll remember the signatures
- // we've already processed we don't generate duplicate bindings.
- //
- // Note: this code assumes that on the equals() method in FunctionSymbol
- // only considers function name and argument types (i.e., it does not
- // consider argument *names*) when comparing FunctionSymbols for equality
- Set funcsToBindSet = new HashSet(100);
- for (Iterator cIter = originalCFunctions.iterator(); cIter.hasNext(); ) {
- FunctionSymbol cFunc = (FunctionSymbol) cIter.next();
- if (!funcsToBindSet.contains(cFunc)) {
- funcsToBindSet.add(cFunc);
- }
- }
-
- ArrayList funcsToBind = new ArrayList(funcsToBindSet.size());
- funcsToBind.addAll(funcsToBindSet);
- // sort functions to make them easier to find in native code
- Collections.sort(
- funcsToBind,
- new Comparator() {
- public int compare(Object o1, Object o2) {
- return ((FunctionSymbol)o1).getName().compareTo(
- ((FunctionSymbol)o2).getName());
- }
- public boolean equals(Object obj) {
- return obj.getClass() == this.getClass();
- }
- });
-
- // Bind all the C funcs to Java methods
- ArrayList/*<FunctionEmitter>*/ methodBindingEmitters = new ArrayList(2*funcsToBind.size());
- for (Iterator iter = funcsToBind.iterator(); iter.hasNext(); ) {
- FunctionSymbol cFunc = (FunctionSymbol) iter.next();
- // Check to see whether this function should be ignored
- if (cfg.shouldIgnore(cFunc.getName())) {
- continue; // don't generate bindings for this symbol
- }
-
- List allBindings = generateMethodBindingEmitters(cFunc);
- methodBindingEmitters.addAll(allBindings);
- }
-
- // Emit all the methods
- for (int i = 0; i < methodBindingEmitters.size(); ++i) {
- FunctionEmitter emitter = (FunctionEmitter)methodBindingEmitters.get(i);
- try {
- emitter.emit();
- } catch (Exception e) {
- throw new RuntimeException(
- "Error while emitting binding for \"" + emitter.getName() + "\"", e);
- }
- emitter.getDefaultOutput().println(); // put newline after method body
- }
-
- // Return the list of FunctionSymbols that we generated gluecode for
- return funcsToBind.iterator();
- }
-
- /**
- * Create the object that will read and store configuration information for
- * this JavaEmitter.
- */
- protected JavaConfiguration createConfig() {
- return new JavaConfiguration();
- }
-
- /**
- * Get the configuration information for this JavaEmitter.
- */
- protected JavaConfiguration getConfig() {
- return cfg;
- }
-
- /**
- * Generates the public emitters for this MethodBinding which will
- * produce either simply signatures (for the interface class, if
- * any) or function definitions with or without a body (depending on
- * whether or not the implementing function can go directly to
- * native code because it doesn't need any processing of the
- * outgoing arguments).
- */
- protected void generatePublicEmitters(MethodBinding binding,
- List allEmitters,
- boolean signatureOnly) {
- PrintWriter writer = ((signatureOnly || cfg.allStatic()) ? javaWriter() : javaImplWriter());
-
- if (cfg.manuallyImplement(binding.getName()) && !signatureOnly) {
- // We only generate signatures for manually-implemented methods;
- // user provides the implementation
- return;
- }
-
- int accessControl = cfg.accessControl(binding.getName());
- // We should not emit anything except public APIs into interfaces
- if (signatureOnly && (accessControl != ACC_PUBLIC)) {
- return;
- }
-
- // It's possible we may not need a body even if signatureOnly is
- // set to false; for example, if the routine doesn't take any
- // arrays or buffers as arguments
- boolean isUnimplemented = cfg.isUnimplemented(binding.getName());
- List/*<String>*/ prologue = cfg.javaPrologueForMethod(binding, false, false);
- List/*<String>*/ epilogue = cfg.javaEpilogueForMethod(binding, false, false);
- boolean needsBody = (isUnimplemented ||
- (binding.needsNIOWrappingOrUnwrapping() ||
- binding.signatureUsesJavaPrimitiveArrays()) ||
- (prologue != null) ||
- (epilogue != null));
-
- JavaMethodBindingEmitter emitter =
- new JavaMethodBindingEmitter(binding,
- writer,
- cfg.runtimeExceptionType(),
- !signatureOnly && needsBody,
- cfg.tagNativeBinding(),
- false,
- cfg.nioDirectOnly(binding.getName()),
- false,
- false,
- false,
- isUnimplemented);
- switch (accessControl) {
- case ACC_PUBLIC: emitter.addModifier(JavaMethodBindingEmitter.PUBLIC); break;
- case ACC_PROTECTED: emitter.addModifier(JavaMethodBindingEmitter.PROTECTED); break;
- case ACC_PRIVATE: emitter.addModifier(JavaMethodBindingEmitter.PRIVATE); break;
- default: break; // package-private adds no modifiers
- }
- if (cfg.allStatic()) {
- emitter.addModifier(JavaMethodBindingEmitter.STATIC);
- }
- if (!isUnimplemented && !needsBody && !signatureOnly) {
- emitter.addModifier(JavaMethodBindingEmitter.NATIVE);
- }
- emitter.setReturnedArrayLengthExpression(cfg.returnedArrayLength(binding.getName()));
- emitter.setPrologue(prologue);
- emitter.setEpilogue(epilogue);
- allEmitters.add(emitter);
- }
-
- /**
- * Generates the private emitters for this MethodBinding. On the
- * Java side these will simply produce signatures for native
- * methods. On the C side these will create the emitters which will
- * write the JNI code to interface to the functions. We need to be
- * careful to make the signatures all match up and not produce too
- * many emitters which would lead to compilation errors from
- * creating duplicated methods / functions.
- */
- protected void generatePrivateEmitters(MethodBinding binding,
- List allEmitters) {
- if (cfg.manuallyImplement(binding.getName())) {
- // Don't produce emitters for the implementation class
- return;
- }
-
- boolean hasPrologueOrEpilogue =
- ((cfg.javaPrologueForMethod(binding, false, false) != null) ||
- (cfg.javaEpilogueForMethod(binding, false, false) != null));
-
- // If we already generated a public native entry point for this
- // method, don't emit another one
- if (!cfg.isUnimplemented(binding.getName()) &&
- (binding.needsNIOWrappingOrUnwrapping() ||
- binding.signatureUsesJavaPrimitiveArrays() ||
- hasPrologueOrEpilogue)) {
- PrintWriter writer = (cfg.allStatic() ? javaWriter() : javaImplWriter());
-
- // If the binding uses primitive arrays, we are going to emit
- // the private native entry point for it along with the version
- // taking only NIO buffers
- if (!binding.signatureUsesJavaPrimitiveArrays()) {
- // (Always) emit the entry point taking only direct buffers
- JavaMethodBindingEmitter emitter =
- new JavaMethodBindingEmitter(binding,
- writer,
- cfg.runtimeExceptionType(),
- false,
- cfg.tagNativeBinding(),
- true,
- cfg.nioDirectOnly(binding.getName()),
- true,
- true,
- false,
- false);
- emitter.addModifier(JavaMethodBindingEmitter.PRIVATE);
- if (cfg.allStatic()) {
- emitter.addModifier(JavaMethodBindingEmitter.STATIC);
- }
- emitter.addModifier(JavaMethodBindingEmitter.NATIVE);
- emitter.setReturnedArrayLengthExpression(cfg.returnedArrayLength(binding.getName()));
- allEmitters.add(emitter);
-
- // Optionally emit the entry point taking arrays which handles
- // both the public entry point taking arrays as well as the
- // indirect buffer case
- if (!cfg.nioDirectOnly(binding.getName()) &&
- binding.signatureCanUseIndirectNIO()) {
- emitter =
- new JavaMethodBindingEmitter(binding,
- writer,
- cfg.runtimeExceptionType(),
- false,
- cfg.tagNativeBinding(),
- true,
- false,
- true,
- false,
- true,
- false);
-
- emitter.addModifier(JavaMethodBindingEmitter.PRIVATE);
- if (cfg.allStatic()) {
- emitter.addModifier(JavaMethodBindingEmitter.STATIC);
- }
- emitter.addModifier(JavaMethodBindingEmitter.NATIVE);
- emitter.setReturnedArrayLengthExpression(cfg.returnedArrayLength(binding.getName()));
- allEmitters.add(emitter);
- }
- }
- }
-
- // Now generate the C emitter(s). We need to produce one for every
- // Java native entry point (public or private). The only
- // situations where we don't produce one are (a) when the method
- // is unimplemented, and (b) when the signature contains primitive
- // arrays, since the latter is handled by the method binding
- // variant taking only NIO Buffers.
- if (!cfg.isUnimplemented(binding.getName()) &&
- !binding.signatureUsesJavaPrimitiveArrays()) {
- // See whether we need an expression to help calculate the
- // length of any return type
- MessageFormat returnValueCapacityFormat = null;
- MessageFormat returnValueLengthFormat = null;
- JavaType javaReturnType = binding.getJavaReturnType();
- if (javaReturnType.isNIOBuffer() ||
- javaReturnType.isCompoundTypeWrapper()) {
- // See whether capacity has been specified
- String capacity = cfg.returnValueCapacity(binding.getName());
- if (capacity != null) {
- returnValueCapacityFormat = new MessageFormat(capacity);
- }
- } else if (javaReturnType.isArray() ||
- javaReturnType.isArrayOfCompoundTypeWrappers()) {
- // NOTE: adding a check here because the CMethodBindingEmitter
- // also doesn't yet handle returning scalar arrays. In order
- // to implement this, return the type as a Buffer instead
- // (i.e., IntBuffer, FloatBuffer) and add code as necessary.
- if (javaReturnType.isPrimitiveArray()) {
- throw new RuntimeException("Primitive array return types not yet supported");
- }
-
- // See whether length has been specified
- String len = cfg.returnValueLength(binding.getName());
- if (len != null) {
- returnValueLengthFormat = new MessageFormat(len);
- }
- }
-
- CMethodBindingEmitter cEmitter =
- new CMethodBindingEmitter(binding,
- cWriter(),
- cfg.implPackageName(),
- cfg.implClassName(),
- true, /* NOTE: we always disambiguate with a suffix now, so this is optional */
- cfg.allStatic(),
- (binding.needsNIOWrappingOrUnwrapping() || hasPrologueOrEpilogue),
- false,
- machDesc64);
- if (returnValueCapacityFormat != null) {
- cEmitter.setReturnValueCapacityExpression(returnValueCapacityFormat);
- }
- if (returnValueLengthFormat != null) {
- cEmitter.setReturnValueLengthExpression(returnValueLengthFormat);
- }
- cEmitter.setTemporaryCVariableDeclarations(cfg.temporaryCVariableDeclarations(binding.getName()));
- cEmitter.setTemporaryCVariableAssignments(cfg.temporaryCVariableAssignments(binding.getName()));
- allEmitters.add(cEmitter);
-
- // Now see if we have to emit another entry point to handle the
- // indirect buffer and array case
- if (binding.argumentsUseNIO() &&
- binding.signatureCanUseIndirectNIO() &&
- !cfg.nioDirectOnly(binding.getName())) {
- cEmitter =
- new CMethodBindingEmitter(binding,
- cWriter(),
- cfg.implPackageName(),
- cfg.implClassName(),
- true, /* NOTE: we always disambiguate with a suffix now, so this is optional */
- cfg.allStatic(),
- binding.needsNIOWrappingOrUnwrapping(),
- true,
- machDesc64);
- if (returnValueCapacityFormat != null) {
- cEmitter.setReturnValueCapacityExpression(returnValueCapacityFormat);
- }
- if (returnValueLengthFormat != null) {
- cEmitter.setReturnValueLengthExpression(returnValueLengthFormat);
- }
- cEmitter.setTemporaryCVariableDeclarations(cfg.temporaryCVariableDeclarations(binding.getName()));
- cEmitter.setTemporaryCVariableAssignments(cfg.temporaryCVariableAssignments(binding.getName()));
- allEmitters.add(cEmitter);
- }
- }
- }
-
- /**
- * Generate all appropriate Java bindings for the specified C function
- * symbols.
- */
- protected List generateMethodBindingEmitters(FunctionSymbol sym) throws Exception {
-
- ArrayList/*<FunctionEmitter>*/ allEmitters = new ArrayList();
-
- try {
- // Get Java binding for the function
- MethodBinding mb = bindFunction(sym, null, null, machDesc64);
-
- // JavaTypes representing C pointers in the initial
- // MethodBinding have not been lowered yet to concrete types
- List bindings = expandMethodBinding(mb);
-
- for (Iterator iter = bindings.iterator(); iter.hasNext(); ) {
- MethodBinding binding = (MethodBinding) iter.next();
-
- if (cfg.allStatic() && binding.hasContainingType()) {
- // This should not currently happen since structs are emitted using a different mechanism
- throw new IllegalArgumentException("Cannot create binding in AllStatic mode because method has containing type: \"" +
- binding + "\"");
- }
-
- // The structure of the generated glue code looks something like this:
- // Simple method (no arrays, void pointers, etc.):
- // Interface class:
- // public void fooMethod();
- // Implementation class:
- // public native void fooMethod();
- //
- // Method taking void* argument:
- // Interface class:
- // public void fooMethod(Buffer arg);
- // Implementation class:
- // public void fooMethod(Buffer arg) {
- // ... bounds checks, etc. ...
- // if (arg.isDirect()) {
- // fooMethod0(arg, computeDirectBufferByteOffset(arg));
- // } else {
- // fooMethod1(getIndirectBufferArray(arg), computeIndirectBufferByteOffset(arg));
- // }
- // }
- // private native void fooMethod0(Object arg, int arg_byte_offset);
- // private native void fooMethod1(Object arg, int arg_byte_offset);
- //
- // Method taking primitive array argument:
- // Interface class:
- // public void fooMethod(int[] arg, int arg_offset);
- // public void fooMethod(IntBuffer arg);
- // Implementing class:
- // public void fooMethod(int[] arg, int arg_offset) {
- // ... range checks, etc. ...
- // fooMethod1(arg, SIZEOF_INT * arg_offset);
- // }
- // public void fooMethod(IntBuffer arg) {
- // ... bounds checks, etc. ...
- // if (arg.isDirect()) {
- // fooMethod0(arg, computeDirectBufferByteOffset(arg));
- // } else {
- // fooMethod1(getIndirectBufferArray(arg), computeIndirectBufferByteOffset(arg));
- // }
- // }
- // private native void fooMethod0(Object arg, int arg_byte_offset);
- // private native void fooMethod1(Object arg, int arg_byte_offset);
- //
- // Note in particular that the public entry point taking an
- // array is merely a special case of the indirect buffer case.
-
- if (cfg.emitInterface()) {
- generatePublicEmitters(binding, allEmitters, true);
- }
- if (cfg.emitImpl()) {
- generatePublicEmitters(binding, allEmitters, false);
- generatePrivateEmitters(binding, allEmitters);
- }
- } // end iteration over expanded bindings
- } catch (Exception e) {
- throw new RuntimeException(
- "Error while generating bindings for \"" + sym + "\"", e);
- }
-
- return allEmitters;
- }
-
-
- public void endFunctions() throws Exception
- {
- if (cfg.allStatic() || cfg.emitInterface()) {
- emitCustomJavaCode(javaWriter(), cfg.className());
- }
- if (!cfg.allStatic() && cfg.emitImpl()) {
- emitCustomJavaCode(javaImplWriter(), cfg.implClassName());
- }
- }
-
- public void beginStructLayout() throws Exception {}
- public void layoutStruct(CompoundType t) throws Exception {
- getLayout().layout(t);
- }
- public void endStructLayout() throws Exception {}
-
- public void beginStructs(TypeDictionary typedefDictionary,
- TypeDictionary structDictionary,
- Map canonMap) throws Exception {
- this.typedefDictionary = typedefDictionary;
- this.structDictionary = structDictionary;
- this.canonMap = canonMap;
- }
-
- public void emitStruct(CompoundType structType, String alternateName) throws Exception {
- // Emit abstract base class delegating to 32-bit or 64-bit implementations
- emitStructImpl(structType, alternateName, machDesc32, machDesc64, true, false);
- // Emit concrete implementing class for each variant
- emitStructImpl(structType, alternateName, machDesc32, machDesc64, false, true);
- emitStructImpl(structType, alternateName, machDesc32, machDesc64, false, false);
- }
-
- public void emitStructImpl(CompoundType structType,
- String alternateName,
- MachineDescription md32,
- MachineDescription md64,
- boolean doBaseClass,
- boolean do32Bit) throws Exception {
- String name = structType.getName();
- if (name == null && alternateName != null) {
- name = alternateName;
- }
-
- if (name == null) {
- System.err.println("WARNING: skipping emission of unnamed struct \"" + structType + "\"");
- return;
- }
-
- if (cfg.shouldIgnore(name)) {
- return;
- }
-
- Type containingCType = canonicalize(new PointerType(SizeThunk.POINTER, structType, 0));
- JavaType containingType = typeToJavaType(containingCType, false, null);
- if (!containingType.isCompoundTypeWrapper()) {
- return;
- }
- String containingTypeName = containingType.getName();
-
- if ((md32 == null) || (md64 == null)) {
- throw new RuntimeException("Must supply both 32- and 64-bit MachineDescriptions to emitStructImpl");
- }
- String suffix = "";
-
- // The "external" MachineDescription is the one used to determine
- // the sizes of the primitive types seen in the public API. For
- // example, if a C long is an element of a struct, it is the size
- // of a Java int on a 32-bit machine but the size of a Java long
- // on a 64-bit machine. To support both of these sizes with the
- // same API, the abstract base class must take and return a Java
- // long from the setter and getter for this field. However the
- // implementation on a 32-bit platform must downcast this to an
- // int and set only an int's worth of data in the struct. The
- // "internal" MachineDescription is the one used to determine how
- // much data to set in or get from the struct and exactly from
- // where it comes.
- //
- // Note that the 64-bit MachineDescription is always used as the
- // external MachineDescription.
-
- MachineDescription extMachDesc = md64;
- MachineDescription intMachDesc = null;
-
- if (!doBaseClass) {
- if (do32Bit) {
- intMachDesc = md32;
- suffix = "32";
- } else {
- intMachDesc = md64;
- suffix = "64";
- }
- }
-
- boolean needsNativeCode = false;
- // Native code for calls through function pointers gets emitted
- // into the abstract base class; Java code which accesses fields
- // gets emitted into the concrete classes
- if (doBaseClass) {
- for (int i = 0; i < structType.getNumFields(); i++) {
- if (structType.getField(i).getType().isFunctionPointer()) {
- needsNativeCode = true;
- break;
- }
- }
- }
-
- String structClassPkg = cfg.packageForStruct(name);
- PrintWriter writer = null;
- PrintWriter cWriter = null;
- try
- {
- writer = openFile(
- cfg.javaOutputDir() + File.separator +
- CodeGenUtils.packageAsPath(structClassPkg) +
- File.separator + containingTypeName + suffix + ".java");
- CodeGenUtils.emitAutogeneratedWarning(writer, this);
- if (needsNativeCode) {
- String nRoot = cfg.nativeOutputDir();
- if (cfg.nativeOutputUsesJavaHierarchy()) {
- nRoot +=
- File.separator +
- CodeGenUtils.packageAsPath(cfg.packageName());
- }
- cWriter = openFile(nRoot + File.separator + containingTypeName + "_JNI.c");
- CodeGenUtils.emitAutogeneratedWarning(cWriter, this);
- emitCHeader(cWriter, containingTypeName);
- }
- }
- catch(Exception e)
- {
- throw new RuntimeException(
- "Unable to open files for emission of struct class", e);
- }
-
- writer.println();
- writer.println("package " + structClassPkg + ";");
- writer.println();
- writer.println("import java.nio.*;");
- writer.println();
- writer.println("import " + cfg.gluegenRuntimePackage() + ".*;");
- writer.println();
- List/*<String>*/ imports = cfg.imports();
- for (Iterator iter = imports.iterator(); iter.hasNext(); ) {
- writer.print("import ");
- writer.print(iter.next());
- writer.println(";");
- }
- List/*<String>*/ javadoc = cfg.javadocForClass(containingTypeName);
- for (Iterator iter = javadoc.iterator(); iter.hasNext(); ) {
- writer.println((String) iter.next());
- }
- writer.println();
- writer.print((doBaseClass ? "public " : "") + (doBaseClass ? "abstract " : "") + "class " + containingTypeName + suffix + " ");
- if (!doBaseClass) {
- writer.print("extends " + containingTypeName + " ");
- }
- boolean firstIteration = true;
- List/*<String>*/ userSpecifiedInterfaces = cfg.implementedInterfaces(containingTypeName);
- for (Iterator iter = userSpecifiedInterfaces.iterator(); iter.hasNext(); ) {
- if (firstIteration) {
- writer.print("implements ");
- }
- firstIteration = false;
- writer.print(iter.next());
- writer.print(" ");
- }
- writer.println("{");
- if (doBaseClass) {
- writer.println(" StructAccessor accessor;");
- writer.println();
- }
- writer.println(" public static int size() {");
- if (doBaseClass) {
- writer.println(" if (CPU.is32Bit()) {");
- writer.println(" return " + containingTypeName + "32" + ".size();");
- writer.println(" } else {");
- writer.println(" return " + containingTypeName + "64" + ".size();");
- writer.println(" }");
- } else {
- writer.println(" return " + structType.getSize(intMachDesc) + ";");
- }
- writer.println(" }");
- writer.println();
- if (doBaseClass) {
- writer.println(" public static " + containingTypeName + " create() {");
- writer.println(" return create(BufferFactory.newDirectByteBuffer(size()));");
- writer.println(" }");
- writer.println();
- writer.println(" public static " + containingTypeName + " create(java.nio.ByteBuffer buf) {");
- writer.println(" if (CPU.is32Bit()) {");
- writer.println(" return new " + containingTypeName + "32(buf);");
- writer.println(" } else {");
- writer.println(" return new " + containingTypeName + "64(buf);");
- writer.println(" }");
- writer.println(" }");
- writer.println();
- writer.println(" " + containingTypeName + "(java.nio.ByteBuffer buf) {");
- writer.println(" accessor = new StructAccessor(buf);");
- writer.println(" }");
- writer.println();
- writer.println(" public java.nio.ByteBuffer getBuffer() {");
- writer.println(" return accessor.getBuffer();");
- writer.println(" }");
- } else {
- writer.println(" " + containingTypeName + suffix + "(java.nio.ByteBuffer buf) {");
- writer.println(" super(buf);");
- writer.println(" }");
- writer.println();
- }
- for (int i = 0; i < structType.getNumFields(); i++) {
- Field field = structType.getField(i);
- Type fieldType = field.getType();
- if (!cfg.shouldIgnore(name + " " + field.getName())) {
- if (fieldType.isFunctionPointer()) {
- if (doBaseClass) {
- try {
- // Emit method call and associated native code
- FunctionType funcType = fieldType.asPointer().getTargetType().asFunction();
- FunctionSymbol funcSym = new FunctionSymbol(field.getName(), funcType);
- MethodBinding binding = bindFunction(funcSym, containingType, containingCType, machDesc64);
- binding.findThisPointer(); // FIXME: need to provide option to disable this on per-function basis
- writer.println();
-
- // Emit public Java entry point for calling this function pointer
- JavaMethodBindingEmitter emitter =
- new JavaMethodBindingEmitter(binding,
- writer,
- cfg.runtimeExceptionType(),
- true,
- cfg.tagNativeBinding(),
- false,
- true, // FIXME: should unify this with the general emission code
- false,
- false, // FIXME: should unify this with the general emission code
- false, // FIXME: should unify this with the general emission code
- false);
- emitter.addModifier(JavaMethodBindingEmitter.PUBLIC);
- emitter.emit();
-
- // Emit private native Java entry point for calling this function pointer
- emitter =
- new JavaMethodBindingEmitter(binding,
- writer,
- cfg.runtimeExceptionType(),
- false,
- cfg.tagNativeBinding(),
- true,
- true, // FIXME: should unify this with the general emission code
- true,
- true, // FIXME: should unify this with the general emission code
- false, // FIXME: should unify this with the general emission code
- false);
- emitter.addModifier(JavaMethodBindingEmitter.PRIVATE);
- emitter.addModifier(JavaMethodBindingEmitter.NATIVE);
- emitter.emit();
-
- // Emit (private) C entry point for calling this function pointer
- CMethodBindingEmitter cEmitter =
- new CMethodBindingEmitter(binding,
- cWriter,
- structClassPkg,
- containingTypeName,
- true, // FIXME: this is optional at this point
- false,
- true,
- false, // FIXME: should unify this with the general emission code
- machDesc64);
- cEmitter.emit();
- } catch (Exception e) {
- System.err.println("While processing field " + field + " of type " + name + ":");
- throw(e);
- }
- }
- } else if (fieldType.isCompound()) {
- // FIXME: will need to support this at least in order to
- // handle the union in jawt_Win32DrawingSurfaceInfo (fabricate
- // a name?)
- if (fieldType.getName() == null) {
- throw new RuntimeException("Anonymous structs as fields not supported yet (field \"" +
- field + "\" in type \"" + name + "\")");
- }
-
- writer.println();
- writer.print(" public " + (doBaseClass ? "abstract " : "") + fieldType.getName() + " " + field.getName() + "()");
- if (doBaseClass) {
- writer.println(";");
- } else {
- writer.println(" {");
- writer.println(" return " + fieldType.getName() + ".create(accessor.slice(" +
- field.getOffset(intMachDesc) + ", " + fieldType.getSize(intMachDesc) + "));");
- writer.println(" }");
- }
- // FIXME: add setter by autogenerating "copyTo" for all compound type wrappers
- } else if (fieldType.isArray()) {
- if (!doBaseClass) {
- System.err.println("WARNING: Array fields (field \"" + field + "\" of type \"" + name +
- "\") not implemented yet");
- }
- } else {
- JavaType internalJavaType = null;
- JavaType externalJavaType = null;
-
- try {
- externalJavaType = typeToJavaType(fieldType, false, extMachDesc);
- if (!doBaseClass) {
- internalJavaType = typeToJavaType(fieldType, false, intMachDesc);
- }
- } catch (Exception e) {
- System.err.println("Error occurred while creating accessor for field \"" +
- field.getName() + "\" in type \"" + name + "\"");
- e.printStackTrace();
- throw(e);
- }
- if (externalJavaType.isPrimitive()) {
- // Primitive type
- String externalJavaTypeName = null;
- String internalJavaTypeName = null;
- externalJavaTypeName = externalJavaType.getName();
- if (!doBaseClass) {
- internalJavaTypeName = internalJavaType.getName();
- }
- if (isOpaque(fieldType)) {
- externalJavaTypeName = compatiblePrimitiveJavaTypeName(fieldType, externalJavaType, extMachDesc);
- if (!doBaseClass) {
- internalJavaTypeName = compatiblePrimitiveJavaTypeName(fieldType, internalJavaType, intMachDesc);
- }
- }
- String capitalized = null;
- if (!doBaseClass) {
- capitalized =
- "" + Character.toUpperCase(internalJavaTypeName.charAt(0)) + internalJavaTypeName.substring(1);
- }
- int slot = -1;
- if (!doBaseClass) {
- slot = slot(fieldType, (int) field.getOffset(intMachDesc), intMachDesc);
- }
- // Setter
- writer.println();
- writer.print(" public " + (doBaseClass ? "abstract " : "") + containingTypeName + " " + field.getName() + "(" + externalJavaTypeName + " val)");
- if (doBaseClass) {
- writer.println(";");
- } else {
- writer.println(" {");
- writer.print (" accessor.set" + capitalized + "At(" + slot + ", ");
- if (!externalJavaTypeName.equals(internalJavaTypeName)) {
- writer.print("(" + internalJavaTypeName + ") ");
- }
- writer.println("val);");
- writer.println(" return this;");
- writer.println(" }");
- }
- writer.println();
- // Getter
- writer.print(" public " + (doBaseClass ? "abstract " : "") + externalJavaTypeName + " " + field.getName() + "()");
- if (doBaseClass) {
- writer.println(";");
- } else {
- writer.println(" {");
- writer.print (" return ");
- if (!externalJavaTypeName.equals(internalJavaTypeName)) {
- writer.print("(" + externalJavaTypeName + ") ");
- }
- writer.println("accessor.get" + capitalized + "At(" + slot + ");");
- writer.println(" }");
- }
- } else {
- // FIXME
- System.err.println("WARNING: Complicated fields (field \"" + field + "\" of type \"" + name +
- "\") not implemented yet");
- // throw new RuntimeException("Complicated fields (field \"" + field + "\" of type \"" + t +
- // "\") not implemented yet");
- }
- }
- }
- }
- if (doBaseClass) {
- emitCustomJavaCode(writer, containingTypeName);
- }
- writer.println("}");
- writer.flush();
- writer.close();
- if (needsNativeCode) {
- cWriter.flush();
- cWriter.close();
- }
- }
- public void endStructs() throws Exception {}
-
- //----------------------------------------------------------------------
- // Internals only below this point
- //
-
- private JavaType typeToJavaType(Type cType, boolean outgoingArgument, MachineDescription curMachDesc) {
- // Recognize JNIEnv* case up front
- PointerType opt = cType.asPointer();
- if ((opt != null) &&
- (opt.getTargetType().getName() != null) &&
- (opt.getTargetType().getName().equals("JNIEnv"))) {
- return JavaType.createForJNIEnv();
- }
-
- // Opaque specifications override automatic conversions
- TypeInfo info = cfg.typeInfo(cType, typedefDictionary);
- if (info != null) {
- return info.javaType();
- }
- Type t = cType;
- if (t.isInt() || t.isEnum()) {
- switch ((int) t.getSize(curMachDesc)) {
- case 1: return javaType(Byte.TYPE);
- case 2: return javaType(Short.TYPE);
- case 4: return javaType(Integer.TYPE);
- case 8: return javaType(Long.TYPE);
- default: throw new RuntimeException("Unknown integer type of size " +
- t.getSize(curMachDesc) + " and name " + t.getName());
- }
- } else if (t.isFloat()) {
- return javaType(Float.TYPE);
- } else if (t.isDouble()) {
- return javaType(Double.TYPE);
- } else if (t.isVoid()) {
- return javaType(Void.TYPE);
- } else {
- if (t.pointerDepth() > 0 || t.arrayDimension() > 0) {
- Type targetType; // target type
- if (t.isPointer()) {
- // t is <type>*, we need to get <type>
- targetType = t.asPointer().getTargetType();
- } else {
- // t is <type>[], we need to get <type>
- targetType = t.asArray().getElementType();
- }
-
- // Handle Types of form pointer-to-type or array-of-type, like
- // char* or int[]; these are expanded out into Java primitive
- // arrays, NIO buffers, or both in expandMethodBinding
- if (t.pointerDepth() == 1 || t.arrayDimension() == 1) {
- if (targetType.isVoid()) {
- return JavaType.createForVoidPointer();
- } else if (targetType.isInt()) {
- switch ((int) targetType.getSize(curMachDesc)) {
- case 1: return JavaType.createForCCharPointer();
- case 2: return JavaType.createForCShortPointer();
- case 4: return JavaType.createForCInt32Pointer();
- case 8: return JavaType.createForCInt64Pointer();
- default: throw new RuntimeException("Unknown integer array type of size " +
- t.getSize(curMachDesc) + " and name " + t.getName());
- }
- } else if (targetType.isFloat()) {
- return JavaType.createForCFloatPointer();
- } else if (targetType.isDouble()) {
- return JavaType.createForCDoublePointer();
- } else if (targetType.isCompound()) {
- if (t.isArray()) {
- throw new RuntimeException("Arrays of compound types not handled yet");
- }
- // Special cases for known JNI types (in particular for converting jawt.h)
- if (t.getName() != null &&
- t.getName().equals("jobject")) {
- return javaType(java.lang.Object.class);
- }
-
- String name = targetType.getName();
- if (name == null) {
- // Try containing pointer type for any typedefs
- name = t.getName();
- if (name == null) {
- throw new RuntimeException("Couldn't find a proper type name for pointer type " + t);
- }
- }
-
- return JavaType.createForCStruct(cfg.renameJavaType(name));
- } else {
- throw new RuntimeException("Don't know how to convert pointer/array type \"" +
- t + "\"");
- }
- }
- // Handle Types of form pointer-to-pointer-to-type or
- // array-of-arrays-of-type, like char** or int[][]
- else if (t.pointerDepth() == 2 || t.arrayDimension() == 2) {
- // Get the target type of the target type (targetType was computer earlier
- // as to be a pointer to the target type, so now we need to get its
- // target type)
- Type bottomType;
- if (targetType.isPointer()) {
- // t is<type>**, targetType is <type>*, we need to get <type>
- bottomType = targetType.asPointer().getTargetType();
- } else {
- // t is<type>[][], targetType is <type>[], we need to get <type>
- bottomType = targetType.asArray().getElementType();
- }
-
- if (bottomType.isPrimitive()) {
- if (bottomType.isInt()) {
- switch ((int) bottomType.getSize(curMachDesc)) {
- case 1: return javaType(ArrayTypes.byteBufferArrayClass);
- case 2: return javaType(ArrayTypes.shortBufferArrayClass);
- case 4: return javaType(ArrayTypes.intBufferArrayClass);
- case 8: return javaType(ArrayTypes.longBufferArrayClass);
- default: throw new RuntimeException("Unknown two-dimensional integer array type of element size " +
- bottomType.getSize(curMachDesc) + " and name " + bottomType.getName());
- }
- } else if (bottomType.isFloat()) {
- return javaType(ArrayTypes.floatBufferArrayClass);
- } else if (bottomType.isDouble()) {
- return javaType(ArrayTypes.doubleBufferArrayClass);
- } else {
- throw new RuntimeException("Unexpected primitive type " + bottomType.getName() +
- " in two-dimensional array");
- }
- } else if (bottomType.isVoid()) {
- return javaType(ArrayTypes.bufferArrayClass);
- } else if (targetType.isPointer() && (targetType.pointerDepth() == 1) &&
- targetType.asPointer().getTargetType().isCompound()) {
- // Array of pointers; convert as array of StructAccessors
- return JavaType.createForCArray(bottomType);
- } else {
- throw new RuntimeException(
- "Could not convert C type \"" + t + "\" " +
- "to appropriate Java type; need to add more support for " +
- "depth=2 pointer/array types [debug info: targetType=\"" +
- targetType + "\"]");
- }
- } else {
- // can't handle this type of pointer/array argument
- throw new RuntimeException(
- "Could not convert C pointer/array \"" + t + "\" to " +
- "appropriate Java type; types with pointer/array depth " +
- "greater than 2 are not yet supported [debug info: " +
- "pointerDepth=" + t.pointerDepth() + " arrayDimension=" +
- t.arrayDimension() + " targetType=\"" + targetType + "\"]");
- }
-
- } else {
- throw new RuntimeException(
- "Could not convert C type \"" + t + "\" (class " +
- t.getClass().getName() + ") to appropriate Java type");
- }
- }
- }
-
- private static boolean isIntegerType(Class c) {
- return ((c == Byte.TYPE) ||
- (c == Short.TYPE) ||
- (c == Character.TYPE) ||
- (c == Integer.TYPE) ||
- (c == Long.TYPE));
- }
-
- private int slot(Type t, int byteOffset, MachineDescription curMachDesc) {
- if (t.isInt()) {
- switch ((int) t.getSize(curMachDesc)) {
- case 1:
- case 2:
- case 4:
- case 8: return byteOffset / (int) t.getSize(curMachDesc);
- default: throw new RuntimeException("Illegal type");
- }
- } else if (t.isFloat()) {
- return byteOffset / 4;
- } else if (t.isDouble()) {
- return byteOffset / 8;
- } else if (t.isPointer()) {
- return byteOffset / curMachDesc.pointerSizeInBytes();
- } else {
- throw new RuntimeException("Illegal type " + t);
- }
- }
-
- private StructLayout getLayout() {
- if (layout == null) {
- layout = StructLayout.createForCurrentPlatform();
- }
- return layout;
- }
-
- protected PrintWriter openFile(String filename) throws IOException {
- //System.out.println("Trying to open: " + filename);
- File file = new File(filename);
- String parentDir = file.getParent();
- if (parentDir != null)
- {
- File pDirFile = new File(parentDir);
- pDirFile.mkdirs();
- }
- return new PrintWriter(new BufferedWriter(new FileWriter(file)));
- }
-
- private boolean isOpaque(Type type) {
- return (cfg.typeInfo(type, typedefDictionary) != null);
- }
-
- private String compatiblePrimitiveJavaTypeName(Type fieldType,
- JavaType javaType,
- MachineDescription curMachDesc) {
- Class c = javaType.getJavaClass();
- if (!isIntegerType(c)) {
- // FIXME
- throw new RuntimeException("Can't yet handle opaque definitions of structs' fields to non-integer types (byte, short, int, long, etc.)");
- }
- switch ((int) fieldType.getSize(curMachDesc)) {
- case 1: return "byte";
- case 2: return "short";
- case 4: return "int";
- case 8: return "long";
- default: throw new RuntimeException("Can't handle opaque definitions if the starting type isn't compatible with integral types");
- }
- }
-
- private void openWriters() throws IOException {
- String jRoot = null;
- if (cfg.allStatic() || cfg.emitInterface()) {
- jRoot = cfg.javaOutputDir() + File.separator +
- CodeGenUtils.packageAsPath(cfg.packageName());
- }
- String jImplRoot = null;
- if (!cfg.allStatic()) {
- jImplRoot =
- cfg.javaOutputDir() + File.separator +
- CodeGenUtils.packageAsPath(cfg.implPackageName());
- }
- String nRoot = cfg.nativeOutputDir();
- if (cfg.nativeOutputUsesJavaHierarchy())
- {
- nRoot +=
- File.separator + CodeGenUtils.packageAsPath(cfg.packageName());
- }
-
- if (cfg.allStatic() || cfg.emitInterface()) {
- javaWriter = openFile(jRoot + File.separator + cfg.className() + ".java");
- }
- if (!cfg.allStatic() && cfg.emitImpl()) {
- javaImplWriter = openFile(jImplRoot + File.separator + cfg.implClassName() + ".java");
- }
- if (cfg.emitImpl()) {
- cWriter = openFile(nRoot + File.separator + cfg.implClassName() + "_JNI.c");
- }
-
- if (javaWriter != null) {
- CodeGenUtils.emitAutogeneratedWarning(javaWriter, this);
- }
- if (javaImplWriter != null) {
- CodeGenUtils.emitAutogeneratedWarning(javaImplWriter, this);
- }
- if (cWriter != null) {
- CodeGenUtils.emitAutogeneratedWarning(cWriter, this);
- }
- }
-
- protected PrintWriter javaWriter() {
- if (!cfg.allStatic() && !cfg.emitInterface()) {
- throw new InternalError("Should not call this");
- }
- return javaWriter;
- }
-
- protected PrintWriter javaImplWriter() {
- if (cfg.allStatic() || !cfg.emitImpl()) {
- throw new InternalError("Should not call this");
- }
- return javaImplWriter;
- }
-
- protected PrintWriter cWriter() {
- if (!cfg.emitImpl()) {
- throw new InternalError("Should not call this");
- }
- return cWriter;
- }
-
- private void closeWriter(PrintWriter writer) throws IOException {
- writer.flush();
- writer.close();
- }
-
- private void closeWriters() throws IOException {
- if (javaWriter != null) {
- closeWriter(javaWriter);
- }
- if (javaImplWriter != null) {
- closeWriter(javaImplWriter);
- }
- if (cWriter != null) {
- closeWriter(cWriter);
- }
- javaWriter = null;
- javaImplWriter = null;
- cWriter = null;
- }
-
- /**
- * Returns the value that was specified by the configuration directive
- * "JavaOutputDir", or the default if none was specified.
- */
- protected String getJavaOutputDir() {
- return cfg.javaOutputDir();
- }
-
- /**
- * Returns the value that was specified by the configuration directive
- * "Package", or the default if none was specified.
- */
- protected String getJavaPackageName() {
- return cfg.packageName();
- }
-
- /**
- * Returns the value that was specified by the configuration directive
- * "ImplPackage", or the default if none was specified.
- */
- protected String getImplPackageName() {
- return cfg.implPackageName();
- }
-
- /**
- * Emit all the strings specified in the "CustomJavaCode" parameters of
- * the configuration file.
- */
- protected void emitCustomJavaCode(PrintWriter writer, String className) throws Exception
- {
- List code = cfg.customJavaCodeForClass(className);
- if (code.size() == 0)
- return;
-
- writer.println();
- writer.println(" // --- Begin CustomJavaCode .cfg declarations");
- for (Iterator iter = code.iterator(); iter.hasNext(); ) {
- writer.println((String) iter.next());
- }
- writer.println(" // ---- End CustomJavaCode .cfg declarations");
- }
-
- /**
- * Write out any header information for the output files (class declaration
- * and opening brace, import statements, etc).
- */
- protected void emitAllFileHeaders() throws IOException {
- try {
- if (cfg.allStatic() || cfg.emitInterface()) {
- String[] interfaces;
- List userSpecifiedInterfaces = null;
- if (cfg.emitInterface()) {
- userSpecifiedInterfaces = cfg.extendedInterfaces(cfg.className());
- } else {
- userSpecifiedInterfaces = cfg.implementedInterfaces(cfg.className());
- }
- interfaces = new String[userSpecifiedInterfaces.size()];
- userSpecifiedInterfaces.toArray(interfaces);
-
- final List/*<String>*/ intfDocs = cfg.javadocForClass(cfg.className());
- CodeGenUtils.EmissionCallback docEmitter =
- new CodeGenUtils.EmissionCallback() {
- public void emit(PrintWriter w) {
- for (Iterator iter = intfDocs.iterator(); iter.hasNext(); ) {
- w.println((String) iter.next());
- }
- }
- };
-
- CodeGenUtils.emitJavaHeaders(
- javaWriter,
- cfg.packageName(),
- cfg.className(),
- cfg.gluegenRuntimePackage(),
- cfg.allStatic() ? true : false,
- (String[]) cfg.imports().toArray(new String[] {}),
- new String[] { "public" },
- interfaces,
- null,
- docEmitter);
- }
-
- if (!cfg.allStatic() && cfg.emitImpl()) {
- final List/*<String>*/ implDocs = cfg.javadocForClass(cfg.implClassName());
- CodeGenUtils.EmissionCallback docEmitter =
- new CodeGenUtils.EmissionCallback() {
- public void emit(PrintWriter w) {
- for (Iterator iter = implDocs.iterator(); iter.hasNext(); ) {
- w.println((String) iter.next());
- }
- }
- };
-
- String[] interfaces;
- List userSpecifiedInterfaces = null;
- userSpecifiedInterfaces = cfg.implementedInterfaces(cfg.implClassName());
- int additionalNum = 0;
- if (cfg.className() != null) {
- additionalNum = 1;
- }
- interfaces = new String[additionalNum + userSpecifiedInterfaces.size()];
- userSpecifiedInterfaces.toArray(interfaces);
- if (additionalNum == 1) {
- interfaces[userSpecifiedInterfaces.size()] = cfg.className();
- }
-
- CodeGenUtils.emitJavaHeaders(
- javaImplWriter,
- cfg.implPackageName(),
- cfg.implClassName(),
- cfg.gluegenRuntimePackage(),
- true,
- (String[]) cfg.imports().toArray(new String[] {}),
- new String[] { "public" },
- interfaces,
- null,
- docEmitter);
- }
-
- if (cfg.emitImpl()) {
- PrintWriter cWriter = cWriter();
- emitCHeader(cWriter, cfg.implClassName());
- }
- } catch (Exception e) {
- throw new RuntimeException(
- "Error emitting all file headers: cfg.allStatic()=" + cfg.allStatic() +
- " cfg.emitImpl()=" + cfg.emitImpl() + " cfg.emitInterface()=" + cfg.emitInterface(),
- e);
- }
-
- }
-
- protected void emitCHeader(PrintWriter cWriter, String className) {
- cWriter.println("#include <jni.h>");
- cWriter.println("#include <stdlib.h>");
- cWriter.println();
-
- if (getConfig().emitImpl()) {
- cWriter.println("#include <assert.h>");
- cWriter.println();
- }
-
- for (Iterator iter = cfg.customCCode().iterator(); iter.hasNext(); ) {
- cWriter.println((String) iter.next());
- }
- cWriter.println();
- }
-
- /**
- * Write out any footer information for the output files (closing brace of
- * class definition, etc).
- */
- protected void emitAllFileFooters(){
- if (cfg.allStatic() || cfg.emitInterface()) {
- javaWriter().println();
- javaWriter().println("} // end of class " + cfg.className());
- }
- if (!cfg.allStatic() && cfg.emitImpl())
- {
- javaImplWriter().println();
- javaImplWriter().println("} // end of class " + cfg.implClassName());
- }
- }
-
- private JavaType javaType(Class c) {
- return JavaType.createForClass(c);
- }
-
- /** Maps the C types in the specified function to Java types through
- the MethodBinding interface. Note that the JavaTypes in the
- returned MethodBinding are "intermediate" JavaTypes (some
- potentially representing C pointers rather than true Java types)
- and must be lowered to concrete Java types before creating
- emitters for them. */
- private MethodBinding bindFunction(FunctionSymbol sym,
- JavaType containingType,
- Type containingCType,
- MachineDescription curMachDesc) {
-
- MethodBinding binding = new MethodBinding(sym, containingType, containingCType);
-
- binding.setRenamedMethodName(cfg.getJavaMethodRename(sym.getName()));
-
- if (cfg.returnsString(binding.getName())) {
- PointerType prt = sym.getReturnType().asPointer();
- if (prt == null ||
- prt.getTargetType().asInt() == null ||
- prt.getTargetType().getSize(curMachDesc) != 1) {
- throw new RuntimeException(
- "Cannot apply ReturnsString configuration directive to \"" + sym +
- "\". ReturnsString requires native method to have return type \"char *\"");
- }
- binding.setJavaReturnType(javaType(java.lang.String.class));
- } else {
- binding.setJavaReturnType(typeToJavaType(sym.getReturnType(), false, curMachDesc));
- }
-
- // List of the indices of the arguments in this function that should be
- // converted from byte[] or short[] to String
- List stringArgIndices = cfg.stringArguments(binding.getName());
-
- for (int i = 0; i < sym.getNumArguments(); i++) {
- Type cArgType = sym.getArgumentType(i);
- JavaType mappedType = typeToJavaType(cArgType, true, curMachDesc);
- //System.out.println("C arg type -> \"" + cArgType + "\"" );
- //System.out.println(" Java -> \"" + mappedType + "\"" );
-
- // Take into account any ArgumentIsString configuration directives that apply
- if (stringArgIndices != null && stringArgIndices.contains(new Integer(i))) {
- //System.out.println("Forcing conversion of " + binding.getName() + " arg #" + i + " from byte[] to String ");
- if (mappedType.isCVoidPointerType() ||
- mappedType.isCCharPointerType() ||
- mappedType.isCShortPointerType() ||
- (mappedType.isArray() &&
- (mappedType.getJavaClass() == ArrayTypes.byteBufferArrayClass) ||
- (mappedType.getJavaClass() == ArrayTypes.shortBufferArrayClass))) {
- // convert mapped type from:
- // void*, byte[], and short[] to String
- // ByteBuffer[] and ShortBuffer[] to String[]
- if (mappedType.isArray()) {
- mappedType = javaType(ArrayTypes.stringArrayClass);
- } else {
- mappedType = javaType(String.class);
- }
- }
- else {
- throw new RuntimeException(
- "Cannot apply ArgumentIsString configuration directive to " +
- "argument " + i + " of \"" + sym + "\": argument type is not " +
- "a \"void*\", \"char *\", \"short *\", \"char**\", or \"short**\" equivalent");
- }
- }
- binding.addJavaArgumentType(mappedType);
- //System.out.println("During binding of [" + sym + "], added mapping from C type: " + cArgType + " to Java type: " + mappedType);
- }
-
- //System.err.println("---> " + binding);
- //System.err.println(" ---> " + binding.getCSymbol());
- return binding;
- }
-
- private MethodBinding lowerMethodBindingPointerTypes(MethodBinding inputBinding,
- boolean convertToArrays,
- boolean[] canProduceArrayVariant) {
- MethodBinding result = inputBinding;
- boolean arrayPossible = false;
-
- for (int i = 0; i < inputBinding.getNumArguments(); i++) {
- JavaType t = inputBinding.getJavaArgumentType(i);
- if (t.isCPrimitivePointerType()) {
- if (t.isCVoidPointerType()) {
- // These are always bound to java.nio.Buffer
- result = result.replaceJavaArgumentType(i, JavaType.forNIOBufferClass());
- } else if (t.isCCharPointerType()) {
- arrayPossible = true;
- if (convertToArrays) {
- result = result.replaceJavaArgumentType(i, javaType(ArrayTypes.byteArrayClass));
- } else {
- result = result.replaceJavaArgumentType(i, JavaType.forNIOByteBufferClass());
- }
- } else if (t.isCShortPointerType()) {
- arrayPossible = true;
- if (convertToArrays) {
- result = result.replaceJavaArgumentType(i, javaType(ArrayTypes.shortArrayClass));
- } else {
- result = result.replaceJavaArgumentType(i, JavaType.forNIOShortBufferClass());
- }
- } else if (t.isCInt32PointerType()) {
- arrayPossible = true;
- if (convertToArrays) {
- result = result.replaceJavaArgumentType(i, javaType(ArrayTypes.intArrayClass));
- } else {
- result = result.replaceJavaArgumentType(i, JavaType.forNIOIntBufferClass());
- }
- } else if (t.isCInt64PointerType()) {
- arrayPossible = true;
- if (convertToArrays) {
- result = result.replaceJavaArgumentType(i, javaType(ArrayTypes.longArrayClass));
- } else {
- result = result.replaceJavaArgumentType(i, JavaType.forNIOLongBufferClass());
- }
- } else if (t.isCFloatPointerType()) {
- arrayPossible = true;
- if (convertToArrays) {
- result = result.replaceJavaArgumentType(i, javaType(ArrayTypes.floatArrayClass));
- } else {
- result = result.replaceJavaArgumentType(i, JavaType.forNIOFloatBufferClass());
- }
- } else if (t.isCDoublePointerType()) {
- arrayPossible = true;
- if (convertToArrays) {
- result = result.replaceJavaArgumentType(i, javaType(ArrayTypes.doubleArrayClass));
- } else {
- result = result.replaceJavaArgumentType(i, JavaType.forNIODoubleBufferClass());
- }
- } else {
- throw new RuntimeException("Unknown C pointer type " + t);
- }
- }
- }
-
- // Always return primitive pointer types as NIO buffers
- JavaType t = result.getJavaReturnType();
- if (t.isCPrimitivePointerType()) {
- if (t.isCVoidPointerType()) {
- result = result.replaceJavaArgumentType(-1, JavaType.forNIOByteBufferClass());
- } else if (t.isCCharPointerType()) {
- result = result.replaceJavaArgumentType(-1, JavaType.forNIOByteBufferClass());
- } else if (t.isCShortPointerType()) {
- result = result.replaceJavaArgumentType(-1, JavaType.forNIOShortBufferClass());
- } else if (t.isCInt32PointerType()) {
- result = result.replaceJavaArgumentType(-1, JavaType.forNIOIntBufferClass());
- } else if (t.isCInt64PointerType()) {
- result = result.replaceJavaArgumentType(-1, JavaType.forNIOLongBufferClass());
- } else if (t.isCFloatPointerType()) {
- result = result.replaceJavaArgumentType(-1, JavaType.forNIOFloatBufferClass());
- } else if (t.isCDoublePointerType()) {
- result = result.replaceJavaArgumentType(-1, JavaType.forNIODoubleBufferClass());
- } else {
- throw new RuntimeException("Unknown C pointer type " + t);
- }
- }
-
- if (canProduceArrayVariant != null) {
- canProduceArrayVariant[0] = arrayPossible;
- }
-
- return result;
- }
-
- // Expands a MethodBinding containing C primitive pointer types into
- // multiple variants taking Java primitive arrays and NIO buffers, subject
- // to the per-function "NIO only" rule in the configuration file
- protected List/*<MethodBinding>*/ expandMethodBinding(MethodBinding binding) {
- List result = new ArrayList();
- // Indicates whether it is possible to produce an array variant
- // Prevents e.g. char* -> String conversions from emitting two entry points
- boolean[] canProduceArrayVariant = new boolean[1];
-
- if (binding.signatureUsesCPrimitivePointers() ||
- binding.signatureUsesCVoidPointers() ||
- binding.signatureUsesCArrays()) {
- result.add(lowerMethodBindingPointerTypes(binding, false, canProduceArrayVariant));
-
- // FIXME: should add new configuration flag for this
- if (canProduceArrayVariant[0] &&
- (binding.signatureUsesCPrimitivePointers() ||
- binding.signatureUsesCArrays()) &&
- !cfg.nioDirectOnly(binding.getName())) {
- result.add(lowerMethodBindingPointerTypes(binding, true, null));
- }
- } else {
- result.add(binding);
- }
-
- return result;
- }
-
- private String resultName() {
- return "_res";
- }
-
- private Type canonicalize(Type t) {
- Type res = (Type) canonMap.get(t);
- if (res != null) {
- return res;
- }
- canonMap.put(t, t);
- return t;
- }
-}
diff --git a/src/java/com/sun/gluegen/JavaMethodBindingEmitter.java b/src/java/com/sun/gluegen/JavaMethodBindingEmitter.java
deleted file mode 100644
index 528a0cb..0000000
--- a/src/java/com/sun/gluegen/JavaMethodBindingEmitter.java
+++ /dev/null
@@ -1,828 +0,0 @@
-/*
- * Copyright (c) 2003 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;
-
-import java.io.*;
-import java.util.*;
-import java.text.MessageFormat;
-
-import com.sun.gluegen.cgram.types.*;
-import com.sun.gluegen.cgram.*;
-
-/**
- * An emitter that emits only the interface for a Java<->C JNI binding.
- */
-public class JavaMethodBindingEmitter extends FunctionEmitter
-{
- public static final EmissionModifier PUBLIC = new EmissionModifier("public");
- public static final EmissionModifier PROTECTED = new EmissionModifier("protected");
- public static final EmissionModifier PRIVATE = new EmissionModifier("private");
- public static final EmissionModifier ABSTRACT = new EmissionModifier("abstract");
- public static final EmissionModifier FINAL = new EmissionModifier("final");
- public static final EmissionModifier NATIVE = new EmissionModifier("native");
- public static final EmissionModifier SYNCHRONIZED = new EmissionModifier("synchronized");
-
- protected final CommentEmitter defaultJavaCommentEmitter = new DefaultCommentEmitter();
- protected final CommentEmitter defaultInterfaceCommentEmitter =
- new InterfaceCommentEmitter();
-
- // Exception type raised in the generated code if runtime checks fail
- private String runtimeExceptionType;
-
- protected boolean emitBody;
- protected boolean eraseBufferAndArrayTypes;
- protected boolean directNIOOnly;
- protected boolean forImplementingMethodCall;
- protected boolean forDirectBufferImplementation;
- protected boolean forIndirectBufferAndArrayImplementation;
- protected boolean isUnimplemented;
- protected boolean tagNativeBinding;
-
- protected MethodBinding binding;
-
- // Manually-specified prologue and epilogue code
- protected List/*<String>*/ prologue;
- protected List/*<String>*/ epilogue;
-
- // A non-null value indicates that rather than returning a compound
- // type accessor we are returning an array of such accessors; this
- // expression is a MessageFormat string taking the names of the
- // incoming Java arguments as parameters and computing as an int the
- // number of elements of the returned array.
- private String returnedArrayLengthExpression;
-
- // A suffix used to create a temporary outgoing array of Buffers to
- // represent an array of compound type wrappers
- private static final String COMPOUND_ARRAY_SUFFIX = "_buf_array_copy";
-
- public JavaMethodBindingEmitter(MethodBinding binding,
- PrintWriter output,
- String runtimeExceptionType,
- boolean emitBody,
- boolean tagNativeBinding,
- boolean eraseBufferAndArrayTypes,
- boolean directNIOOnly,
- boolean forImplementingMethodCall,
- boolean forDirectBufferImplementation,
- boolean forIndirectBufferAndArrayImplementation,
- boolean isUnimplemented)
- {
- super(output);
- this.binding = binding;
- this.runtimeExceptionType = runtimeExceptionType;
- this.emitBody = emitBody;
- this.tagNativeBinding = tagNativeBinding;
- this.eraseBufferAndArrayTypes = eraseBufferAndArrayTypes;
- this.directNIOOnly = directNIOOnly;
- this.forImplementingMethodCall = forImplementingMethodCall;
- this.forDirectBufferImplementation = forDirectBufferImplementation;
- this.forIndirectBufferAndArrayImplementation = forIndirectBufferAndArrayImplementation;
- this.isUnimplemented = isUnimplemented;
- if (forImplementingMethodCall) {
- setCommentEmitter(defaultJavaCommentEmitter);
- } else {
- setCommentEmitter(defaultInterfaceCommentEmitter);
- }
- }
-
- public JavaMethodBindingEmitter(JavaMethodBindingEmitter arg) {
- super(arg);
- binding = arg.binding;
- runtimeExceptionType = arg.runtimeExceptionType;
- emitBody = arg.emitBody;
- tagNativeBinding = arg.tagNativeBinding;
- eraseBufferAndArrayTypes = arg.eraseBufferAndArrayTypes;
- directNIOOnly = arg.directNIOOnly;
- forImplementingMethodCall = arg.forImplementingMethodCall;
- forDirectBufferImplementation = arg.forDirectBufferImplementation;
- forIndirectBufferAndArrayImplementation = arg.forIndirectBufferAndArrayImplementation;
- isUnimplemented = arg.isUnimplemented;
- prologue = arg.prologue;
- epilogue = arg.epilogue;
- returnedArrayLengthExpression = arg.returnedArrayLengthExpression;
- }
-
- public final MethodBinding getBinding() { return binding; }
-
- public boolean isForImplementingMethodCall() { return forImplementingMethodCall; }
- public boolean isForDirectBufferImplementation() { return forDirectBufferImplementation; }
- public boolean isForIndirectBufferAndArrayImplementation() { return forIndirectBufferAndArrayImplementation; }
-
- public String getName() {
- return binding.getRenamedMethodName();
- }
-
- protected String getArgumentName(int i) {
- return binding.getArgumentName(i);
- }
-
- /** The type of exception (must subclass
- <code>java.lang.RuntimeException</code>) raised if runtime
- checks fail in the generated code. */
- public String getRuntimeExceptionType() {
- return runtimeExceptionType;
- }
-
- /** If the underlying function returns an array (currently only
- arrays of compound types are supported) as opposed to a pointer
- to an object, this method should be called to provide a
- MessageFormat string containing an expression that computes the
- number of elements of the returned array. The parameters to the
- MessageFormat expression are the names of the incoming Java
- arguments. */
- public void setReturnedArrayLengthExpression(String expr) {
- returnedArrayLengthExpression = expr;
- }
-
- /** Sets the manually-generated prologue code for this emitter. */
- public void setPrologue(List/*<String>*/ prologue) {
- this.prologue = prologue;
- }
-
- /** Sets the manually-generated epilogue code for this emitter. */
- public void setEpilogue(List/*<String>*/ epilogue) {
- this.epilogue = epilogue;
- }
-
- /** Indicates whether this emitter will print only a signature, or
- whether it will emit Java code for the body of the method as
- well. */
- public boolean signatureOnly() {
- return !emitBody;
- }
-
- /** Accessor for subclasses. */
- public void setEmitBody(boolean emitBody) {
- this.emitBody = emitBody;
- }
-
- /** Accessor for subclasses. */
- public void setEraseBufferAndArrayTypes(boolean erase) {
- this.eraseBufferAndArrayTypes = erase;
- }
-
- /** Accessor for subclasses. */
- public void setForImplementingMethodCall(boolean impl) {
- this.forImplementingMethodCall = impl;
- }
-
- /** Accessor for subclasses. */
- public void setForDirectBufferImplementation(boolean direct) {
- this.forDirectBufferImplementation = direct;
- }
-
- /** Accessor for subclasses. */
- public void setForIndirectBufferAndArrayImplementation(boolean indirect) {
- this.forIndirectBufferAndArrayImplementation = indirect;
- }
-
- protected void emitReturnType(PrintWriter writer)
- {
- writer.print(getReturnTypeString(false));
- }
-
- protected String erasedTypeString(JavaType type, boolean skipBuffers) {
- if (eraseBufferAndArrayTypes) {
- if (type.isNIOBuffer() ||
- type.isPrimitiveArray()) {
- if (!skipBuffers) {
- // Direct buffers and arrays sent down as Object (but
- // returned as e.g. ByteBuffer)
- return "Object";
- }
- } else if (type.isNIOBufferArray()) {
- // Arrays of direct Buffers sent down as Object[]
- // (Note we don't yet support returning void**)
- return "Object[]";
- } else if (type.isCompoundTypeWrapper()) {
- // Compound type wrappers are unwrapped to ByteBuffer
- return "java.nio.ByteBuffer";
- } else if (type.isArrayOfCompoundTypeWrappers()) {
- if (skipBuffers) {
- return "java.nio.ByteBuffer";
- } else {
- // In the case where this is called with a false skipBuffers
- // argument we want to erase the array of compound type
- // wrappers to ByteBuffer[]
- return "java.nio.ByteBuffer[]";
- }
- }
- }
- if (type.isArrayOfCompoundTypeWrappers()) {
- // We don't want to bake the array specification into the type name
- return type.getName() + "[]";
- }
- return type.getName();
- }
-
- protected String getReturnTypeString(boolean skipArray) {
- // The first arm of the "if" clause is used by the glue code
- // generation for arrays of compound type wrappers
- if (skipArray ||
- // The following arm is used by most other kinds of return types
- (getReturnedArrayLengthExpression() == null &&
- !binding.getJavaReturnType().isArrayOfCompoundTypeWrappers()) ||
- // The following arm is used specifically to get the splitting up
- // of one returned ByteBuffer into an array of compound type
- // wrappers to work (e.g., XGetVisualInfo)
- (eraseBufferAndArrayTypes &&
- binding.getJavaReturnType().isCompoundTypeWrapper() &&
- (getReturnedArrayLengthExpression() != null))) {
- return erasedTypeString(binding.getJavaReturnType(), true);
- }
- return erasedTypeString(binding.getJavaReturnType(), true) + "[]";
- }
-
- protected void emitName(PrintWriter writer)
- {
- if (forImplementingMethodCall) {
- if (forIndirectBufferAndArrayImplementation) {
- writer.print(getImplMethodName(false));
- } else {
- writer.print(getImplMethodName(true));
- }
- } else {
- writer.print(getName());
- }
- }
-
- protected int emitArguments(PrintWriter writer)
- {
- boolean needComma = false;
- int numEmitted = 0;
-
- if (forImplementingMethodCall && binding.hasContainingType()) {
- // Always emit outgoing "this" argument
- writer.print("java.nio.ByteBuffer ");
- 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(", ");
- }
-
- 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 (forDirectBufferImplementation || 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 String getImplMethodName(boolean direct) {
- if (direct) {
- return binding.getRenamedMethodName() + "0";
- } else {
- return binding.getRenamedMethodName() + "1";
- }
- }
-
- protected String byteOffsetArgName(int i) {
- return byteOffsetArgName(getArgumentName(i));
- }
-
- protected String byteOffsetArgName(String s) {
- return s + "_byte_offset";
- }
-
- protected String byteOffsetArrayArgName(int i) {
- return getArgumentName(i) + "_byte_offset_array";
- }
-
- protected String offsetArgName(int i) {
- return getArgumentName(i) + "_offset";
- }
-
- protected void emitBody(PrintWriter writer)
- {
- if (!emitBody) {
- writer.println(';');
- } else {
- MethodBinding binding = getBinding();
- writer.println();
- writer.println(" {");
- if (isUnimplemented) {
- writer.println(" throw new " + getRuntimeExceptionType() + "(\"Unimplemented\");");
- } else {
- emitPrologueOrEpilogue(prologue, writer);
- emitPreCallSetup(binding, writer);
- //emitReturnVariableSetup(binding, writer);
- emitReturnVariableSetupAndCall(binding, writer);
- }
- writer.println(" }");
- }
- }
-
- protected void emitPrologueOrEpilogue(List/*<String>*/ code, PrintWriter writer) {
- if (code != null) {
- String[] argumentNames = argumentNameArray();
- for (Iterator iter = code.iterator(); iter.hasNext(); ) {
- MessageFormat fmt = new MessageFormat((String) iter.next());
- writer.println(" " + fmt.format(argumentNames));
- }
- }
- }
-
- protected void emitPreCallSetup(MethodBinding binding, PrintWriter writer) {
- emitArrayLengthAndNIOBufferChecks(binding, writer);
- emitCompoundArrayCopies(binding, writer);
- }
-
- protected void emitArrayLengthAndNIOBufferChecks(MethodBinding binding, PrintWriter writer) {
- int numBufferOffsetArrayArgs = 0;
- boolean firstBuffer = true;
- // Check lengths of any incoming arrays if necessary
- for (int i = 0; i < binding.getNumArguments(); i++) {
- Type type = binding.getCArgumentType(i);
- if (type.isArray()) {
- ArrayType arrayType = type.asArray();
- writer.println(" if (" + getArgumentName(i) + ".length < " +
- arrayType.getLength() + ")");
- writer.println(" throw new " + getRuntimeExceptionType() +
- "(\"Length of array \\\"" + getArgumentName(i) +
- "\\\" was less than the required " + arrayType.getLength() + "\");");
- } else {
- JavaType javaType = binding.getJavaArgumentType(i);
- if (javaType.isNIOBuffer()) {
- if (directNIOOnly) {
- writer.println(" if (!BufferFactory.isDirect(" + getArgumentName(i) + "))");
- writer.println(" throw new " + getRuntimeExceptionType() + "(\"Argument \\\"" +
- getArgumentName(i) + "\\\" was not a direct buffer\");");
- } else {
- if(firstBuffer) {
- firstBuffer = false;
- writer.println(" boolean _direct = BufferFactory.isDirect(" + getArgumentName(i) + ");");
- } else {
- writer.println(" if (" + getArgumentName(i) + " != null && _direct != BufferFactory.isDirect(" + getArgumentName(i) + "))");
- writer.println(" throw new " + getRuntimeExceptionType() +
- "(\"Argument \\\"" + getArgumentName(i) +
- "\\\" : Buffers passed to this method must all be either direct or indirect\");");
- }
- }
- } else if (javaType.isNIOBufferArray()) {
- // All buffers passed down in an array of NIO buffers must be direct
- String argName = getArgumentName(i);
- String arrayName = byteOffsetArrayArgName(i);
- writer.println(" int[] " + arrayName + " = new int[" + argName + ".length];");
- // Check direct buffer properties of all buffers within
- writer.println(" if (" + argName + " != null) {");
- writer.println(" for (int _ctr = 0; _ctr < " + argName + ".length; _ctr++) {");
- writer.println(" if (!BufferFactory.isDirect(" + argName + "[_ctr])) {");
- writer.println(" throw new " + getRuntimeExceptionType() +
- "(\"Element \" + _ctr + \" of argument \\\"" +
- getArgumentName(i) + "\\\" was not a direct buffer\");");
- writer.println(" }");
- // get the Buffer Array offset values and save them into another array to send down to JNI
- writer.print (" " + arrayName + "[_ctr] = BufferFactory.getDirectBufferByteOffset(");
- writer.println(argName + "[_ctr]);");
- writer.println(" }");
- writer.println(" }");
- } else if (javaType.isPrimitiveArray()) {
- String argName = getArgumentName(i);
- String offsetArg = offsetArgName(i);
- writer.println(" if(" + argName + " != null && " + argName + ".length <= " + offsetArg + ")");
- writer.print (" throw new " + getRuntimeExceptionType());
- writer.println("(\"array offset argument \\\"" + offsetArg + "\\\" (\" + " + offsetArg +
- " + \") equals or exceeds array length (\" + " + argName + ".length + \")\");");
- }
- }
- }
- }
-
- protected void emitCompoundArrayCopies(MethodBinding binding, PrintWriter writer) {
- // If the method binding uses outgoing arrays of compound type
- // wrappers, we need to generate a temporary copy of this array
- // into a ByteBuffer[] for processing by the native code
- if (binding.signatureUsesArraysOfCompoundTypeWrappers()) {
- for (int i = 0; i < binding.getNumArguments(); i++) {
- JavaType javaType = binding.getJavaArgumentType(i);
- if (javaType.isArrayOfCompoundTypeWrappers()) {
- String argName = getArgumentName(i);
- String tempArrayName = argName + COMPOUND_ARRAY_SUFFIX;
- writer.println(" ByteBuffer[] " + tempArrayName + " = new ByteBuffer[" + argName + ".length];");
- writer.println(" for (int _ctr = 0; _ctr < + " + argName + ".length; _ctr++) {");
- writer.println(" " + javaType.getName() + " _tmp = " + argName + "[_ctr];");
- writer.println(" " + tempArrayName + "[_ctr] = ((_tmp == null) ? null : _tmp.getBuffer());");
- writer.println(" }");
- }
- }
- }
- }
-
- protected void emitCall(MethodBinding binding, PrintWriter writer, boolean direct) {
- writer.print(getImplMethodName(direct));
- writer.print("(");
- emitCallArguments(binding, writer, direct);
- writer.print(")");
- }
-
-
- 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 (((epilogue != null) && (epilogue.size() > 0)) ||
- binding.signatureUsesArraysOfCompoundTypeWrappers()) {
- 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 = ");
- } 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);
- writer.print(";");
- writer.println();
- } else {
- emitCall(binding, writer, true);
- 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();
- }
- emitPostCallCleanup(binding, writer);
- emitPrologueOrEpilogue(epilogue, writer);
- if (needsResultAssignment) {
- emitCallResultReturn(binding, writer);
- }
- }
-
- protected int emitCallArguments(MethodBinding binding, PrintWriter writer, boolean direct) {
- boolean needComma = false;
- int numArgsEmitted = 0;
-
- if (binding.hasContainingType()) {
- // Emit this pointer
- assert(binding.getContainingType().isCompoundTypeWrapper());
- writer.print("getBuffer()");
- 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("((");
- }
-
- if (type.isNIOBuffer() && !direct) {
- writer.print("BufferFactory.getArray(" + getArgumentName(i) + ")");
- } else if (type.isArrayOfCompoundTypeWrappers()) {
- writer.print(getArgumentName(i) + COMPOUND_ARRAY_SUFFIX);
- } else {
- writer.print(getArgumentName(i));
- }
-
- if (type.isCompoundTypeWrapper()) {
- writer.print(" == null) ? null : ");
- writer.print(getArgumentName(i));
- writer.print(".getBuffer())");
- }
- if (type.isNIOBuffer()) {
- if (direct) {
- writer.print(", BufferFactory.getDirectBufferByteOffset(" + getArgumentName(i) + ")");
- } else {
- writer.print(", BufferFactory.getIndirectBufferByteOffset(" + getArgumentName(i) + ")");
- }
- } else if (type.isNIOBufferArray()) {
- writer.print(", " + byteOffsetArrayArgName(i));
- }
-
- // Add Array offset parameter for primitive arrays
- if (type.isPrimitiveArray()) {
- if(type.isFloatArray()) {
- writer.print(", BufferFactory.SIZEOF_FLOAT * ");
- } else if(type.isDoubleArray()) {
- writer.print(", BufferFactory.SIZEOF_DOUBLE * ");
- } else if(type.isByteArray()) {
- writer.print(", ");
- } 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));
- }
-
- needComma = true;
- ++numArgsEmitted;
- }
- return numArgsEmitted;
- }
-
- protected void emitPostCallCleanup(MethodBinding binding, PrintWriter writer) {
- if (binding.signatureUsesArraysOfCompoundTypeWrappers()) {
- // For each such array, we need to take the ByteBuffer[] that
- // came back from the C method invocation and wrap the
- // ByteBuffers back into the wrapper types
- for (int i = 0; i < binding.getNumArguments(); i++) {
- JavaType javaArgType = binding.getJavaArgumentType(i);
- if (javaArgType.isArrayOfCompoundTypeWrappers()) {
- String argName = binding.getArgumentName(i);
- writer.println(" for (int _ctr = 0; _ctr < " + argName + ".length; _ctr++) {");
- writer.println(" if ((" + argName + "[_ctr] == null && " + argName + COMPOUND_ARRAY_SUFFIX + "[_ctr] == null) ||");
- writer.println(" (" + argName + "[_ctr] != null && " + argName + "[_ctr].getBuffer() == " + argName + COMPOUND_ARRAY_SUFFIX + "[_ctr])) {");
- writer.println(" // No copy back needed");
- writer.println(" } else {");
- writer.println(" if (" + argName + COMPOUND_ARRAY_SUFFIX + "[_ctr] == null) {");
- writer.println(" " + argName + "[_ctr] = null;");
- writer.println(" } else {");
- writer.println(" " + argName + "[_ctr] = " + javaArgType.getName() + ".create(" + argName + COMPOUND_ARRAY_SUFFIX + "[_ctr]);");
- writer.println(" }");
- writer.println(" }");
- writer.println(" }");
- }
- }
- }
- }
-
- protected void emitCallResultReturn(MethodBinding binding, PrintWriter writer) {
- JavaType returnType = binding.getJavaReturnType();
-
- if (returnType.isCompoundTypeWrapper()) {
- String fmt = getReturnedArrayLengthExpression();
- writer.println(" if (_res == null) return null;");
- if (fmt == null) {
- writer.print(" return " + returnType.getName() + ".create(BufferFactory.nativeOrder(_res))");
- } else {
- writer.println(" BufferFactory.nativeOrder(_res);");
- String expr = new MessageFormat(fmt).format(argumentNameArray());
- PointerType cReturnTypePointer = binding.getCReturnType().asPointer();
- CompoundType cReturnType = null;
- if (cReturnTypePointer != null) {
- cReturnType = cReturnTypePointer.getTargetType().asCompound();
- }
- if (cReturnType == null) {
- throw new RuntimeException("ReturnedArrayLength directive currently only supported for pointers to compound types " +
- "(error occurred while generating Java glue code for " + getName() + ")");
- }
- writer.println(" " + getReturnTypeString(false) + " _retarray = new " + getReturnTypeString(true) + "[" + expr + "];");
- writer.println(" for (int _count = 0; _count < " + expr + "; _count++) {");
- // Create temporary ByteBuffer slice
- // FIXME: probably need Type.getAlignedSize() for arrays of
- // compound types (rounding up to machine-dependent alignment)
- writer.println(" _res.position(_count * " + getReturnTypeString(true) + ".size());");
- writer.println(" _res.limit ((1 + _count) * " + getReturnTypeString(true) + ".size());");
- writer.println(" java.nio.ByteBuffer _tmp = _res.slice();");
- writer.println(" BufferFactory.nativeOrder(_tmp);");
- writer.println(" _res.position(0);");
- writer.println(" _res.limit(_res.capacity());");
- writer.println(" _retarray[_count] = " + getReturnTypeString(true) + ".create(_tmp);");
- writer.println(" }");
- writer.print (" return _retarray");
- }
- writer.println(";");
- } else if (returnType.isNIOBuffer()) {
- writer.println(" if (_res == null) return null;");
- writer.println(" return _res.order(java.nio.ByteOrder.nativeOrder());");
- } else if (returnType.isArrayOfCompoundTypeWrappers()) {
- writer.println(" if (_res == null) return null;");
- writer.println(" " + getReturnTypeString(false) + " _retarray = new " + getReturnTypeString(true) + "[_res.length];");
- writer.println(" for (int _count = 0; _count < _res.length; _count++) {");
- writer.println(" _retarray[_count] = " + getReturnTypeString(true) + ".create(_res[_count]);");
- writer.println(" }");
- writer.println(" return _retarray;");
- } else {
- // Assume it's a primitive type or other type we don't have to
- // do any conversion on
- writer.println(" return _res;");
- }
- }
-
- protected String[] argumentNameArray() {
- String[] argumentNames = new String[binding.getNumArguments()];
- for (int i = 0; i < binding.getNumArguments(); i++) {
- argumentNames[i] = getArgumentName(i);
- if (binding.getJavaArgumentType(i).isPrimitiveArray()) {
- // Add on _offset argument in comma-separated expression
- argumentNames[i] = argumentNames[i] + ", " + offsetArgName(i);
- }
- }
- return argumentNames;
- }
-
- public static String javaThisArgumentName() {
- return "jthis0";
- }
-
- protected String getCommentStartString() { return "/** "; }
-
- protected String getBaseIndentString() { return " "; }
-
- protected String getReturnedArrayLengthExpression() {
- return returnedArrayLengthExpression;
- }
-
- /**
- * Class that emits a generic comment for JavaMethodBindingEmitters; the comment
- * includes the C signature of the native method that is being bound by the
- * emitter java method.
- */
- protected class DefaultCommentEmitter implements CommentEmitter {
- public void emit(FunctionEmitter emitter, PrintWriter writer) {
- emitBeginning(emitter, writer);
- emitBindingCSignature(((JavaMethodBindingEmitter)emitter).getBinding(), writer);
- emitEnding(emitter, writer);
- }
- protected void emitBeginning(FunctionEmitter emitter, PrintWriter writer) {
- writer.print("Entry point to C language function: <br> ");
- }
- protected void emitBindingCSignature(MethodBinding binding, PrintWriter writer) {
- writer.print("<code> ");
- writer.print(binding.getCSymbol().toString(tagNativeBinding));
- writer.print(" </code> ");
- }
- protected void emitEnding(FunctionEmitter emitter, PrintWriter writer) {
- // If argument type is a named enum, then emit a comment detailing the
- // acceptable values of that enum.
- // If we're emitting a direct buffer variant only, then declare
- // that the NIO buffer arguments must be direct.
- MethodBinding binding = ((JavaMethodBindingEmitter)emitter).getBinding();
- for (int i = 0; i < binding.getNumArguments(); i++) {
- Type type = binding.getCArgumentType(i);
- JavaType javaType = binding.getJavaArgumentType(i);
- // don't emit param comments for anonymous enums, since we can't
- // distinguish between the values found within multiple anonymous
- // enums in the same C translation unit.
- if (type.isEnum() && type.getName() != HeaderParser.ANONYMOUS_ENUM_NAME) {
- EnumType enumType = (EnumType)type;
- writer.println();
- writer.print(emitter.getBaseIndentString());
- writer.print(" ");
- writer.print("@param ");
- writer.print(getArgumentName(i));
- writer.print(" valid values are: <code>");
- for (int j = 0; j < enumType.getNumEnumerates(); ++j) {
- if (j>0) writer.print(", ");
- writer.print(enumType.getEnumName(j));
- }
- writer.println("</code>");
- } else if (directNIOOnly && javaType.isNIOBuffer()) {
- writer.println();
- writer.print(emitter.getBaseIndentString());
- writer.print(" ");
- writer.print("@param ");
- writer.print(getArgumentName(i));
- writer.print(" a direct {@link " + javaType.getName() + "}");
- }
- }
- }
- }
-
- protected class InterfaceCommentEmitter
- extends JavaMethodBindingEmitter.DefaultCommentEmitter
- {
- protected void emitBeginning(FunctionEmitter emitter,
- PrintWriter writer) {
- writer.print("Interface to C language function: <br> ");
- }
- }
-}
-
diff --git a/src/java/com/sun/gluegen/JavaType.java b/src/java/com/sun/gluegen/JavaType.java
deleted file mode 100644
index b520888..0000000
--- a/src/java/com/sun/gluegen/JavaType.java
+++ /dev/null
@@ -1,549 +0,0 @@
-/*
- * Copyright (c) 2003 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;
-
-import java.nio.*;
-
-import com.sun.gluegen.cgram.types.*;
-
-/**
- * Describes a java-side representation of a type that is used to represent
- * the same data on both the Java-side and C-side during a JNI operation. Also
- * contains some utility methods for creating common types.
- */
-public class JavaType {
- private static final int PTR_C_VOID = 1;
- private static final int PTR_C_CHAR = 2;
- private static final int PTR_C_SHORT = 3;
- private static final int PTR_C_INT32 = 4;
- private static final int PTR_C_INT64 = 5;
- private static final int PTR_C_FLOAT = 6;
- private static final int PTR_C_DOUBLE = 7;
-
- private Class clazz; // Primitive types and other types representable as Class objects
- private String name; // Types we're generating glue code for (i.e., C structs)
- private Type elementType; // Element type if this JavaType represents a C array
- private int primitivePointerType; // Represents C arrays that
- // will / can be represented
- // with NIO buffers (resolved
- // down to another JavaType
- // later in processing)
- private static JavaType nioBufferType;
- private static JavaType nioByteBufferType;
- private static JavaType nioShortBufferType;
- private static JavaType nioIntBufferType;
- private static JavaType nioLongBufferType;
- private static JavaType nioFloatBufferType;
- private static JavaType nioDoubleBufferType;
- private static JavaType nioByteBufferArrayType;
-
- public boolean equals(Object arg) {
- if ((arg == null) || (!(arg instanceof JavaType))) {
- return false;
- }
- JavaType t = (JavaType) arg;
- return (this == t ||
- (t.clazz == clazz &&
- ((name == t.name) ||
- ((name != null) && (t.name != null) && (name.equals(t.name)))) &&
- ((elementType == t.elementType) ||
- (elementType != null) && (t.elementType != null) && (elementType.equals(t.elementType))) &&
- (primitivePointerType == t.primitivePointerType)));
- }
-
- public int hashCode() {
- if (clazz == null) {
- if (name == null) {
- return 0;
- }
- return name.hashCode();
- }
- return clazz.hashCode();
- }
-
- public JavaType getElementType() {
- return new JavaType(elementType);
- }
-
- /** Creates a JavaType corresponding to the given Java type. This
- can be used to represent arrays of primitive values or Strings;
- the emitters understand how to perform proper conversion from
- the corresponding C type. */
- public static JavaType createForClass(Class clazz) {
- return new JavaType(clazz);
- }
-
- /** Creates a JavaType corresponding to the specified C CompoundType
- name; for example, if "Foo" is supplied, then this JavaType
- represents a "Foo *" by way of a StructAccessor. */
- public static JavaType createForCStruct(String name) {
- return new JavaType(name);
- }
-
- /** Creates a JavaType corresponding to an array of the given
- element type. This is used to represent arrays of "Foo **" which
- should be mapped to Foo[] in Java. */
- public static JavaType createForCArray(Type elementType) {
- return new JavaType(elementType);
- }
-
- public static JavaType createForVoidPointer() {
- return new JavaType(PTR_C_VOID);
- }
-
- public static JavaType createForCCharPointer() {
- return new JavaType(PTR_C_CHAR);
- }
-
- public static JavaType createForCShortPointer() {
- return new JavaType(PTR_C_SHORT);
- }
-
- public static JavaType createForCInt32Pointer() {
- return new JavaType(PTR_C_INT32);
- }
-
- public static JavaType createForCInt64Pointer() {
- return new JavaType(PTR_C_INT64);
- }
-
- public static JavaType createForCFloatPointer() {
- return new JavaType(PTR_C_FLOAT);
- }
-
- public static JavaType createForCDoublePointer() {
- return new JavaType(PTR_C_DOUBLE);
- }
-
- public static JavaType createForJNIEnv() {
- return createForCStruct("JNIEnv");
- }
-
- public static JavaType forNIOBufferClass() {
- if (nioBufferType == null) {
- nioBufferType = createForClass(java.nio.Buffer.class);
- }
- return nioBufferType;
- }
-
- public static JavaType forNIOByteBufferClass() {
- if (nioByteBufferType == null) {
- nioByteBufferType = createForClass(java.nio.ByteBuffer.class);
- }
- return nioByteBufferType;
- }
-
- public static JavaType forNIOShortBufferClass() {
- if (nioShortBufferType == null) {
- nioShortBufferType = createForClass(java.nio.ShortBuffer.class);
- }
- return nioShortBufferType;
- }
-
- public static JavaType forNIOIntBufferClass() {
- if (nioIntBufferType == null) {
- nioIntBufferType = createForClass(java.nio.IntBuffer.class);
- }
- return nioIntBufferType;
- }
-
- public static JavaType forNIOLongBufferClass() {
- if (nioLongBufferType == null) {
- nioLongBufferType = createForClass(java.nio.LongBuffer.class);
- }
- return nioLongBufferType;
- }
-
- public static JavaType forNIOFloatBufferClass() {
- if (nioFloatBufferType == null) {
- nioFloatBufferType = createForClass(java.nio.FloatBuffer.class);
- }
- return nioFloatBufferType;
- }
-
- public static JavaType forNIODoubleBufferClass() {
- if (nioDoubleBufferType == null) {
- nioDoubleBufferType = createForClass(java.nio.DoubleBuffer.class);
- }
- return nioDoubleBufferType;
- }
-
- public static JavaType forNIOByteBufferArrayClass() {
- if (nioByteBufferArrayType == null) {
- ByteBuffer[] tmp = new ByteBuffer[0];
- nioByteBufferArrayType = createForClass(tmp.getClass());
- }
- return nioByteBufferArrayType;
- }
-
- /**
- * Returns the Java Class corresponding to this type. Returns null if this
- * object corresponds to a C primitive array type.
- */
- public Class getJavaClass() {
- return clazz;
- }
-
- /**
- * Returns the Java type name corresponding to this type.
- */
- public String getName() {
- if (clazz != null) {
- if (clazz.isArray()) {
- return arrayName(clazz);
- }
- return clazz.getName();
- }
- if (elementType != null) {
- return elementType.getName();
- }
- return name;
- }
-
- /**
- * Returns the descriptor (internal type signature) corresponding to
- * this type.
- */
- public String getDescriptor() {
- // FIXME: this is not completely accurate at this point (for
- // example, it knows nothing about the packages for compound
- // types)
- if (clazz != null) {
- return descriptor(clazz);
- }
- if (elementType != null) {
- return "[" + descriptor(elementType.getName());
- }
- return descriptor(name);
- }
-
- /** Returns the String corresponding to the JNI type for this type,
- or NULL if it can't be represented (i.e., it's a boxing class
- that we need to call getBuffer() on.) */
- public String jniTypeName() {
- if (isCompoundTypeWrapper()) {
- // These are sent down as Buffers (e.g., jobject)
- return "jobject";
- }
-
- if (isArrayOfCompoundTypeWrappers()) {
- // These are returned as arrays of ByteBuffers (e.g., jobjectArray)
- return "jobjectArray /* of ByteBuffer */";
- }
-
- if (clazz == null) {
- return null;
- }
-
- if (isVoid()) {
- return "void";
- }
-
- if (isPrimitive()) {
- return "j" + clazz.getName();
- }
-
- if (isPrimitiveArray() || isNIOBuffer()) {
- // We now pass primitive arrays and buffers uniformly down to native code as java.lang.Object.
- return "jobject";
- }
-
- if (isArray()) {
- if (isStringArray()) {
- return "jobjectArray /*elements are String*/";
- }
-
- Class elementType = clazz.getComponentType();
-
- if (isNIOBufferArray()) {
- return "jobjectArray /*elements are " + elementType.getName() + "*/";
- }
-
- if (elementType.isArray()) {
- // Type is array-of-arrays-of-something
-
- if (elementType.getComponentType().isPrimitive()) {
- // Type is an array-of-arrays-of-primitive
- return "jobjectArray /* elements are " + elementType.getComponentType() + "[]*/";
- //return "jobjectArray";
- } else {
- throw new RuntimeException("Multi-dimensional arrays of types that are not primitives or Strings are not supported.");
- }
- }
-
- // Some unusual type that we don't handle
- throw new RuntimeException("Unexpected and unsupported array type: \"" + this + "\"");
- }
-
- if (isString()) {
- return "jstring";
- }
-
- return "jobject";
- }
-
- public boolean isNIOBuffer() {
- return (clazz != null && java.nio.Buffer.class.isAssignableFrom(clazz));
- }
-
- public boolean isNIOByteBuffer() {
- return (clazz == java.nio.ByteBuffer.class);
- }
-
- public boolean isNIOByteBufferArray() {
- return (this == nioByteBufferArrayType);
- }
-
- public boolean isNIOBufferArray() {
- return (isArray() &&
- (java.nio.Buffer.class.isAssignableFrom(clazz.getComponentType())));
- }
-
- public boolean isString() {
- return (clazz == java.lang.String.class);
- }
-
- public boolean isArray() {
- return ((clazz != null) && clazz.isArray());
- }
-
- public boolean isFloatArray() {
- return (clazz != null && clazz.isArray() && clazz.getComponentType() == Float.TYPE);
- }
-
- public boolean isDoubleArray() {
- return (clazz != null && clazz.isArray() && clazz.getComponentType() == Double.TYPE);
- }
-
- public boolean isByteArray() {
- return (clazz != null && clazz.isArray() && clazz.getComponentType() == Byte.TYPE);
- }
-
- public boolean isIntArray() {
- return (clazz != null && clazz.isArray() && clazz.getComponentType() == Integer.TYPE);
- }
-
- public boolean isShortArray() {
- return (clazz != null && clazz.isArray() && clazz.getComponentType() == Short.TYPE);
- }
-
- public boolean isLongArray() {
- return (clazz != null && clazz.isArray() && clazz.getComponentType() == Long.TYPE);
- }
-
- public boolean isStringArray() {
- return (clazz != null && clazz.isArray() && clazz.getComponentType() == java.lang.String.class);
- }
-
-
- public boolean isPrimitive() {
- return ((clazz != null) && !isArray() && clazz.isPrimitive() && (clazz != Void.TYPE));
- }
-
- public boolean isPrimitiveArray() {
- return (isArray() && (clazz.getComponentType().isPrimitive()));
- }
-
- public boolean isShort() {
- return (clazz == Short.TYPE);
- }
-
- public boolean isFloat() {
- return (clazz == Float.TYPE);
- }
-
- public boolean isDouble() {
- return (clazz == Double.TYPE);
- }
-
- public boolean isByte() {
- return (clazz == Byte.TYPE);
- }
-
- public boolean isLong() {
- return (clazz == Long.TYPE);
- }
-
- public boolean isInt() {
- return (clazz == Integer.TYPE);
- }
-
- public boolean isVoid() {
- return (clazz == Void.TYPE);
- }
-
- public boolean isCompoundTypeWrapper() {
- return (clazz == null && name != null && !isJNIEnv());
- }
-
- public boolean isArrayOfCompoundTypeWrappers() {
- return (elementType != null);
- }
-
- public boolean isCPrimitivePointerType() {
- return (primitivePointerType != 0);
- }
-
- public boolean isCVoidPointerType() {
- return (primitivePointerType == PTR_C_VOID);
- }
-
- public boolean isCCharPointerType() {
- return (primitivePointerType == PTR_C_CHAR);
- }
-
- public boolean isCShortPointerType() {
- return (primitivePointerType == PTR_C_SHORT);
- }
-
- public boolean isCInt32PointerType() {
- return (primitivePointerType == PTR_C_INT32);
- }
-
- public boolean isCInt64PointerType() {
- return (primitivePointerType == PTR_C_INT64);
- }
-
- public boolean isCFloatPointerType() {
- return (primitivePointerType == PTR_C_FLOAT);
- }
-
- public boolean isCDoublePointerType() {
- return (primitivePointerType == PTR_C_DOUBLE);
- }
-
- public boolean isJNIEnv() {
- return clazz == null && name == "JNIEnv";
- }
-
- public Object clone() {
- JavaType clone = new JavaType(primitivePointerType);
-
- clone.clazz = this.clazz;
- clone.name = this.name;
- clone.elementType = this.elementType;
-
- return clone;
- }
-
- public String toString() {
- return getName();
- }
-
- //----------------------------------------------------------------------
- // Internals only below this point
- //
-
- // For debugging
- public void dump() {
- System.err.println("[clazz = " + clazz + " , name = " + name + " , elementType = " + elementType + " , primitivePointerType = " + primitivePointerType + "]");
- }
-
- /**
- * Constructs a representation for a type corresponding to the given Class
- * argument.
- */
- private JavaType(Class clazz) {
- this.clazz = clazz;
- }
-
- /** Constructs a type representing a named C struct. */
- private JavaType(String name) {
- this.name = name;
- }
-
- /** Constructs a type representing an array of C pointers. */
- private JavaType(Type elementType) {
- this.elementType = elementType;
- }
-
- /** Constructs a type representing a pointer to a C primitive
- (integer, floating-point, or void pointer) type. */
- private JavaType(int primitivePointerType) {
- this.primitivePointerType = primitivePointerType;
- }
-
- private String arrayName(Class clazz) {
- StringBuffer buf = new StringBuffer();
- int arrayCount = 0;
- while (clazz.isArray()) {
- ++arrayCount;
- clazz = clazz.getComponentType();
- }
- buf.append(clazz.getName());
- while (--arrayCount >= 0) {
- buf.append("[]");
- }
- return buf.toString();
- }
-
- private String arrayDescriptor(Class clazz) {
- StringBuffer buf = new StringBuffer();
- int arrayCount = 0;
- while (clazz.isArray()) {
- buf.append("[");
- clazz = clazz.getComponentType();
- }
- buf.append(descriptor(clazz));
- return buf.toString();
- }
-
- private String descriptor(Class clazz) {
- if (clazz.isPrimitive()) {
- if (clazz == Boolean.TYPE) return "Z";
- if (clazz == Byte.TYPE) return "B";
- if (clazz == Double.TYPE) return "D";
- if (clazz == Float.TYPE) return "F";
- if (clazz == Integer.TYPE) return "I";
- if (clazz == Long.TYPE) return "J";
- if (clazz == Short.TYPE) return "S";
- if (clazz == Void.TYPE) return "V";
- throw new RuntimeException("Unexpected primitive type " + clazz.getName());
- }
- if (clazz.isArray()) {
- return arrayDescriptor(clazz);
- }
- return descriptor(clazz.getName());
- }
-
- private String descriptor(String referenceTypeName) {
- return "L" + referenceTypeName.replace('.', '/') + ";";
- }
-}
diff --git a/src/java/com/sun/gluegen/MethodBinding.java b/src/java/com/sun/gluegen/MethodBinding.java
deleted file mode 100644
index 04b73e2..0000000
--- a/src/java/com/sun/gluegen/MethodBinding.java
+++ /dev/null
@@ -1,593 +0,0 @@
-/*
- * Copyright (c) 2003 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;
-
-import java.util.*;
-
-import com.sun.gluegen.cgram.types.*;
-
-/** Represents the binding of a C function to a Java method. Also used
- to represent calls through function pointers contained in
- structs. */
-
-public class MethodBinding {
-
- private FunctionSymbol sym;
- private String renamedMethodName;
- private JavaType javaReturnType;
- private List javaArgumentTypes;
- private boolean computedSignatureProperties;
- private boolean argumentsUseNIO;
- private boolean signatureUsesNIO;
- private boolean signatureCanUseIndirectNIO;
- private boolean signatureUsesCompoundTypeWrappers;
- private boolean signatureUsesArraysOfCompoundTypeWrappers;
- private boolean signatureUsesCVoidPointers;
- private boolean signatureUsesCPrimitivePointers;
- private boolean signatureUsesCArrays;
- private boolean signatureUsesJavaPrimitiveArrays;
- private JavaType containingType;
- private Type containingCType;
- private int thisPointerIndex = -1;
-
- /**
- * Constructs a new MethodBinding that is an exact clone of the
- * argument, including the java return type and java argument
- * types. It's safe to modify this binding after construction.
- */
- public MethodBinding(MethodBinding bindingToCopy) {
- this.sym = bindingToCopy.sym;
-
- this.renamedMethodName = bindingToCopy.renamedMethodName;
- this.containingType = bindingToCopy.containingType;
- this.containingCType = bindingToCopy.containingCType;
- this.javaReturnType = bindingToCopy.javaReturnType;
- this.javaArgumentTypes = (List)((ArrayList)bindingToCopy.javaArgumentTypes).clone();
- this.computedSignatureProperties = bindingToCopy.computedSignatureProperties;
- this.argumentsUseNIO = bindingToCopy.argumentsUseNIO;
- this.signatureUsesNIO = bindingToCopy.signatureUsesNIO;
- this.signatureCanUseIndirectNIO = bindingToCopy.signatureCanUseIndirectNIO;
- this.signatureUsesCompoundTypeWrappers = bindingToCopy.signatureUsesCompoundTypeWrappers;
- this.signatureUsesArraysOfCompoundTypeWrappers = bindingToCopy.signatureUsesArraysOfCompoundTypeWrappers;
- this.signatureUsesCVoidPointers = bindingToCopy.signatureUsesCVoidPointers;
- this.signatureUsesCPrimitivePointers = bindingToCopy.signatureUsesCPrimitivePointers;
- this.signatureUsesCArrays = bindingToCopy.signatureUsesCArrays;
- this.signatureUsesJavaPrimitiveArrays = bindingToCopy.signatureUsesJavaPrimitiveArrays;
- this.thisPointerIndex = bindingToCopy.thisPointerIndex;
- }
-
- /** Constructor for calling a C function. */
- public MethodBinding(FunctionSymbol sym) {
- this.sym = sym;
- }
-
- /** Constructor for calling a function pointer contained in a
- struct. */
- public MethodBinding(FunctionSymbol sym, JavaType containingType, Type containingCType) {
- this.sym = sym;
- this.containingType = containingType;
- this.containingCType = containingCType;
- }
-
- public void setJavaReturnType(JavaType type) {
- javaReturnType = type;
- computedSignatureProperties = false;
- }
-
- public void addJavaArgumentType(JavaType type) {
- if (javaArgumentTypes == null) {
- javaArgumentTypes = new ArrayList();
- }
- javaArgumentTypes.add(type);
- computedSignatureProperties = false;
- }
-
- public JavaType getJavaReturnType() {
- return javaReturnType;
- }
-
- public int getNumArguments() {
- return sym.getNumArguments();
- }
-
- public JavaType getJavaArgumentType(int i) {
- return (JavaType) javaArgumentTypes.get(i);
- }
-
- public Type getCReturnType() {
- return sym.getReturnType();
- }
-
- public Type getCArgumentType(int i) {
- return sym.getArgumentType(i);
- }
-
- public FunctionSymbol getCSymbol() {
- return sym;
- }
-
- /** Returns either the argument name specified by the underlying
- FunctionSymbol or a fabricated argument name based on the
- position. Note that it is currently not guaranteed that there
- are no namespace clashes with these fabricated argument
- names. */
- public String getArgumentName(int i) {
- String ret = sym.getArgumentName(i);
- if (ret != null) {
- return ret;
- }
- return "arg" + i;
- }
-
- public String getName() {
- return sym.getName();
- }
-
- public String getRenamedMethodName() {
- // Defaults to same as C symbol unless renamed
- if (renamedMethodName != null) {
- return renamedMethodName;
- }
- return sym.getName();
- }
-
- /** Supports renaming C function in Java binding. */
- public void setRenamedMethodName(String name) {
- renamedMethodName = name;
- }
-
- /** Creates a new MethodBinding replacing the specified Java
- argument type with a new argument type. If argumentNumber is
- less than 0 then replaces the return type. */
- public MethodBinding replaceJavaArgumentType(int argumentNumber,
- JavaType newArgType) {
- MethodBinding binding = (MethodBinding) clone();
- binding.javaArgumentTypes = null;
- if (argumentNumber < 0) {
- binding.setJavaReturnType(newArgType);
- } else {
- binding.setJavaReturnType(javaReturnType);
- }
- for (int i = 0; i < getNumArguments(); i++) {
- JavaType type = getJavaArgumentType(i);
- if (i == argumentNumber) {
- type = newArgType;
- }
- binding.addJavaArgumentType(type);
- }
- return binding;
- }
-
- /**
- * Returns true if any of the outgoing arguments in the method's
- * signature require conversion or checking due to the use of New
- * I/O.
- */
- public boolean argumentsUseNIO() {
- computeSignatureProperties();
- return argumentsUseNIO;
- }
-
- /**
- * Returns true if the return type or any of the outgoing arguments
- * in the method's signature require conversion or checking due to
- * the use of New I/O.
- */
- public boolean signatureUsesNIO() {
- computeSignatureProperties();
- return signatureUsesNIO;
- }
-
- /**
- * Returns true if it is possible for any of the outgoing arguments
- * to be indirect NIO buffers.
- */
- public boolean signatureCanUseIndirectNIO() {
- computeSignatureProperties();
- return signatureCanUseIndirectNIO;
- }
-
- /**
- * Returns true if the return type or any of the outgoing arguments
- * in the method's signature use "compound type wrappers", or
- * NIO-based wrappers for C data structures.
- */
- public boolean signatureUsesCompoundTypeWrappers() {
- computeSignatureProperties();
- return signatureUsesCompoundTypeWrappers;
- }
-
- /**
- * Returns true if the return type or any of the outgoing arguments
- * in the method's signature use arrays of "compound type wrappers",
- * or NIO-based wrappers for C data structures.
- */
- public boolean signatureUsesArraysOfCompoundTypeWrappers() {
- computeSignatureProperties();
- return signatureUsesArraysOfCompoundTypeWrappers;
- }
-
- /**
- * Returns true if the function needs NIO-related
- * wrapping/unwrapping or conversion of various arguments. Currently
- * this returns the logical OR of signatureUsesNIO() and
- * signatureUsesCompoundTypeWrappers().
- */
- public boolean needsNIOWrappingOrUnwrapping() {
- return (signatureUsesNIO() || signatureUsesCompoundTypeWrappers());
- }
-
- /**
- * Returns true if the return type or any of the outgoing arguments
- * in the method's signature represent C void* pointers.
- */
- public boolean signatureUsesCVoidPointers() {
- computeSignatureProperties();
- return signatureUsesCVoidPointers;
- }
-
- /**
- * Returns true if the return type or any of the outgoing arguments
- * in the method's signature represent C primitive pointers.
- */
- public boolean signatureUsesCPrimitivePointers() {
- computeSignatureProperties();
- return signatureUsesCPrimitivePointers;
- }
-
- /**
- * Returns true if the return type or any of the outgoing arguments
- * in the method's signature represent C arrays.
- */
- public boolean signatureUsesCArrays() {
- computeSignatureProperties();
- return signatureUsesCArrays;
- }
-
- /**
- * Returns true if the return type or any of the outgoing arguments
- * in the method's signature represent Java primitive arrays.
- */
- public boolean signatureUsesJavaPrimitiveArrays() {
- computeSignatureProperties();
- return signatureUsesJavaPrimitiveArrays;
- }
-
- /**
- * Computes summary information about the method's C and Java
- * signatures.
- */
- protected void computeSignatureProperties() {
- if (computedSignatureProperties)
- return;
-
- argumentsUseNIO = false;
- signatureUsesNIO = false;
- signatureCanUseIndirectNIO = false;
- signatureUsesCompoundTypeWrappers = false;
- signatureUsesArraysOfCompoundTypeWrappers = false;
- signatureUsesCVoidPointers = false;
- signatureUsesCPrimitivePointers = false;
- signatureUsesCArrays = false;
- signatureUsesJavaPrimitiveArrays = false;
-
- if (javaReturnType.isCompoundTypeWrapper()) {
- // Needs wrapping and/or setting of byte order (neither of which
- // can be done easily from native code)
- signatureUsesCompoundTypeWrappers = true;
- }
-
- if (javaReturnType.isNIOByteBuffer() ||
- javaReturnType.isArrayOfCompoundTypeWrappers()) {
- // Needs setting of byte order which can't be done easily from
- // native code
- signatureUsesNIO = true;
- }
-
- Type cRetType = sym.getReturnType();
- if (cRetType.isArray()) {
- // Needs checking of array lengths
- signatureUsesCArrays = true;
- if (cRetType.asArray().getElementType().isPrimitive()) {
- signatureUsesCPrimitivePointers = true;
- }
- }
-
- if (cRetType.isPointer()) {
- if (cRetType.asPointer().getTargetType().isPrimitive()) {
- signatureUsesCPrimitivePointers = true;
- } else if (cRetType.asPointer().getTargetType().isVoid()) {
- signatureUsesCVoidPointers = true;
- }
- }
-
- for (int i = 0; i < getNumArguments(); i++) {
- JavaType javaArgType = getJavaArgumentType(i);
- Type cArgType = getCArgumentType(i);
- if (javaArgType.isCompoundTypeWrapper()) {
- // Needs unwrapping of accessors
- signatureUsesCompoundTypeWrappers = true;
- }
-
- if (javaArgType.isArrayOfCompoundTypeWrappers()) {
- // Needs to be duplicated and this array lowered to an array
- // of Buffers for code emission
- signatureUsesArraysOfCompoundTypeWrappers = true;
- }
-
- if (javaArgType.isNIOBuffer() ||
- javaArgType.isNIOBufferArray()) {
- // Needs checking of direct buffer property
- signatureUsesNIO = true;
- argumentsUseNIO = true;
-
- if (javaArgType.isNIOBuffer()) {
- // Potential conversion to indirect buffer
- signatureCanUseIndirectNIO = true;
- }
- }
-
- if (cArgType.isArray()) {
- // Needs checking of array lengths
- signatureUsesCArrays = true;
- if (cArgType.asArray().getElementType().isPrimitive()) {
- signatureUsesCPrimitivePointers = true;
- }
- }
-
- if (cArgType.isPointer()) {
- // Handle both real C primitive pointers and any constructions
- // due to opaque directives
- if (cArgType.asPointer().getTargetType().isPrimitive() ||
- javaArgType.isCPrimitivePointerType()) {
- signatureUsesCPrimitivePointers = true;
- } else if (cArgType.asPointer().getTargetType().isVoid()) {
- signatureUsesCVoidPointers = true;
- }
- }
-
- if (javaArgType.isPrimitiveArray()) {
- // Needs getPrimitiveArrayCritical or similar construct
- // depending on native code calling convention
- signatureUsesJavaPrimitiveArrays = true;
- }
- }
-
- computedSignatureProperties = true;
- }
-
- /** Indicates whether this MethodBinding is for a function pointer
- contained in a struct. */
- public boolean hasContainingType() {
- return (getContainingType() != null);
- }
-
- /** Retrieves the containing type of this MethodBinding if it is for
- a function pointer contained in a struct. */
- public JavaType getContainingType() {
- return containingType;
- }
-
- /** Retrieves the containing C type of this MethodBinding if it is for
- a function pointer contained in a struct. */
- public Type getContainingCType() {
- return containingCType;
- }
-
- /** Find the leftmost argument matching the type of the containing
- type (for function pointer MethodBindings) and record that as a
- "this" pointer, meaning that it does not need to be explicitly
- passed at the Java level. */
- public void findThisPointer() {
- clearThisPointer();
- for (int i = 0; i < getNumArguments(); i++) {
- JavaType arg = getJavaArgumentType(i);
- if (arg.equals(containingType)) {
- thisPointerIndex = i;
- break;
- }
-
- if (!arg.isJNIEnv()) {
- break; // this pointer must be leftmost argument excluding JNIEnvs
- }
- }
- }
-
- /** Clears any record of a this pointer for this MethodBinding. */
- public void clearThisPointer() {
- thisPointerIndex = -1;
- }
-
- /** Indicates whether the <i>i</i>th argument to this MethodBinding
- is actually a "this" pointer. */
- public boolean isArgumentThisPointer(int i) {
- return (thisPointerIndex == i);
- }
- public boolean equals(Object obj) {
- if (obj == this) {
- return true;
- }
-
- if (obj == null || ! (obj instanceof MethodBinding)) {
- return false;
- }
-
- MethodBinding other = (MethodBinding)obj;
- if (!(sym.equals(other.sym))) { return false; }
- if (!(javaReturnType.equals(other.getJavaReturnType()))) { return false; }
- if (containingType != null &&
- other.getContainingCType() != null &&
- (!(containingCType.equals(other.getContainingCType())))) {
- return false;
- }
- if (javaArgumentTypes.size() != other.javaArgumentTypes.size()) {
- return false;
- }
-
- for (int i = 0; i < javaArgumentTypes.size(); ++i) {
- Object typeThis = javaArgumentTypes.get(i);
- Object typeOther = other.getJavaArgumentType(i);
- if (!(typeThis.equals(typeOther))) {
- return false;
- }
- }
-
- return true;
- }
-
- // FIXME!! Implement hashCode() to match equals(Object)
-
- /** Returns the signature of this binding. */
- public String toString() {
- StringBuffer buf = new StringBuffer(200);
- buf.append(getJavaReturnType().getName());
- buf.append(" ");
- buf.append(getRenamedMethodName());
- buf.append("(");
- boolean needComma = false;
- for (int i = 0; i < getNumArguments(); i++) {
- JavaType type = 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.
- assert(getNumArguments() == 1);
- continue;
- }
- if (type.isJNIEnv() || isArgumentThisPointer(i)) {
- // Don't need to expose these at the Java level
- continue;
- }
-
- if (needComma) {
- buf.append(", ");
- }
-
- buf.append(type.getName());
- buf.append(" ");
- buf.append(getArgumentName(i));
- needComma = true;
- }
- buf.append(")");
- return buf.toString();
- }
-
- public final Object clone() {
- return new MethodBinding(this);
- }
-
- /** Returns a String containing the descriptor (signature in
- internal format) of this MethodBinding as it will be
- emitted. This is used to disambiguate between overloadings when
- manually specifying prologue and epilogue code, for example. */
- public String getDescriptor(boolean forImplementingMethodCall,
- boolean eraseBufferAndArrayTypes) {
- StringBuffer buf = new StringBuffer();
-
- buf.append("(");
-
- if (forImplementingMethodCall && hasContainingType()) {
- // Always emit outgoing "this" argument
- buf.append("Ljava/nio/ByteBuffer;");
- }
-
- for (int i = 0; i < getNumArguments(); i++) {
- JavaType type = 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 (getNumArguments() != 1) {
- throw new InternalError(
- "\"void\" argument type found in " +
- "multi-argument function \"" + this + "\"");
- }
- continue;
- }
-
- if (type.isJNIEnv() || isArgumentThisPointer(i)) {
- // Don't need to expose these at the Java level
- continue;
- }
-
- buf.append(erasedTypeDescriptor(type, eraseBufferAndArrayTypes, false));
-
- // Add Buffer and array index offset arguments after each associated argument
- if (forImplementingMethodCall) {
- if (type.isNIOBuffer()) {
- buf.append("I");
- } else if (type.isNIOBufferArray()) {
- buf.append("[I");
- }
- }
-
- // Add offset argument after each primitive array
- if (type.isPrimitiveArray()) {
- buf.append("I");
- }
- }
-
- buf.append(")");
-
- // Emit return type for completeness even though we can't overload
- // based solely on return type
- buf.append(erasedTypeDescriptor(getJavaReturnType(), eraseBufferAndArrayTypes, false));
-
- return buf.toString();
- }
-
- protected String erasedTypeDescriptor(JavaType type, boolean eraseBufferAndArrayTypes, boolean skipBuffers) {
- if (eraseBufferAndArrayTypes) {
- if (type.isNIOBuffer() ||
- type.isPrimitiveArray()) {
- if (!skipBuffers) {
- // Direct buffers and arrays sent down as Object (but
- // returned as e.g. ByteBuffer)
- return "Ljava/lang/Object;";
- }
- } else if (type.isCompoundTypeWrapper()) {
- // Compound type wrappers are unwrapped to ByteBuffer
- return "Ljava/nio/ByteBuffer;";
- } else if (type.isArrayOfCompoundTypeWrappers()) {
- return "Ljava/nio/ByteBuffer;";
- }
- }
- return type.getDescriptor();
- }
-}
-
diff --git a/src/java/com/sun/gluegen/ReferencedStructs.java b/src/java/com/sun/gluegen/ReferencedStructs.java
deleted file mode 100644
index 6c0dfb4..0000000
--- a/src/java/com/sun/gluegen/ReferencedStructs.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (c) 2003 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;
-
-import java.util.*;
-import com.sun.gluegen.cgram.types.*;
-
-public class ReferencedStructs implements TypeVisitor {
- private Set results = new HashSet();
-
- public void clear() {
- results.clear();
- }
-
- public Iterator results() {
- return results.iterator();
- }
-
- public void visitType(Type t) {
- if (t.isPointer()) {
- PointerType p = t.asPointer();
- if (p.hasTypedefedName()) {
- CompoundType c = p.getTargetType().asCompound();
- if (c != null && c.getName() == null) {
- // This otherwise-unnamed CompoundType is referred to by a
- // PointerType that has a typedef name. Assume that it is
- // referred to in the glue code and emit it.
- results.add(p);
- }
- }
- } else if (t.isCompound()) {
- results.add(t);
- }
- }
-}
diff --git a/src/java/com/sun/gluegen/StructLayout.java b/src/java/com/sun/gluegen/StructLayout.java
deleted file mode 100644
index 7045f89..0000000
--- a/src/java/com/sun/gluegen/StructLayout.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (c) 2003 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;
-
-import com.sun.gluegen.cgram.types.*;
-
-/** Encapsulates algorithm for laying out data structures. Note that
- this ends up embedding code in various places via SizeThunks. If
- the 32-bit and 64-bit ports on a given platform differ
- fundamentally in their handling of struct layout then this code
- will need to be updated and, most likely, two versions of the
- SizeThunks maintained in various places. */
-
-public class StructLayout {
- private int baseOffset;
- private int structAlignment;
-
- protected StructLayout(int baseOffset,
- int structAlignment) {
- this.baseOffset = baseOffset;
- this.structAlignment = structAlignment;
- }
-
- public void layout(CompoundType t) {
- int n = t.getNumFields();
- SizeThunk curOffset = SizeThunk.constant(baseOffset);
- SizeThunk maxSize = SizeThunk.constant(0);
- for (int i = 0; i < n; i++) {
- Field f = t.getField(i);
- Type ft = f.getType();
- if (ft.isInt() || ft.isFloat() || ft.isDouble() || ft.isPointer()) {
- SizeThunk sz = ft.getSize();
- curOffset = SizeThunk.roundUp(curOffset, sz);
- f.setOffset(curOffset);
- if (t.isUnion()) {
- maxSize = SizeThunk.max(maxSize, sz);
- } else {
- curOffset = SizeThunk.add(curOffset, sz);
- }
- } else if (ft.isCompound()) {
- new StructLayout(0, structAlignment).layout(ft.asCompound());
- curOffset = SizeThunk.roundUp(curOffset, SizeThunk.constant(structAlignment));
- f.setOffset(curOffset);
- if (t.isUnion()) {
- maxSize = SizeThunk.max(maxSize, ft.getSize());
- } else {
- curOffset = SizeThunk.add(curOffset, ft.getSize());
- }
- } else if (ft.isArray()) {
- ArrayType arrayType = ft.asArray();
- CompoundType compoundElementType = arrayType.getBaseElementType().asCompound();
- if (compoundElementType != null) {
- new StructLayout(0, structAlignment).layout(compoundElementType);
- arrayType.recomputeSize();
- }
- // Note: not sure how this rounding is done
- curOffset = SizeThunk.roundUp(curOffset, SizeThunk.constant(structAlignment));
- f.setOffset(curOffset);
- curOffset = SizeThunk.add(curOffset, ft.getSize());
- } else {
- // FIXME
- String name = t.getName();
- if (name == null) {
- name = t.toString();
- }
- throw new RuntimeException("Complicated field types (" + ft +
- " " + f.getName() +
- " in type " + name +
- ") not implemented yet");
- }
- }
- // FIXME: I think the below is wrong; better check with some examples
- // if ((curOffset % structAlignment) != 0) {
- // curOffset += structAlignment - (curOffset % structAlignment);
- // }
- if (t.isUnion()) {
- t.setSize(maxSize);
- } else {
- t.setSize(curOffset);
- }
- }
-
-
-
- public static StructLayout createForCurrentPlatform() {
- // Note: this code is replicated in CPU.java
- String os = System.getProperty("os.name").toLowerCase();
- String cpu = System.getProperty("os.arch").toLowerCase();
- if ((os.startsWith("windows") && cpu.equals("x86"))) {
- // It appears that Windows uses a packing alignment of 4 bytes in 32-bit mode
- return new StructLayout(0, 4);
- } else if ((os.startsWith("windows") && cpu.equals("amd64")) ||
- (os.startsWith("linux") && cpu.equals("i386")) ||
- (os.startsWith("linux") && cpu.equals("x86")) ||
- (os.startsWith("linux") && cpu.equals("amd64")) ||
- (os.startsWith("linux") && cpu.equals("x86_64")) ||
- (os.startsWith("linux") && cpu.equals("ia64")) ||
- (os.startsWith("sunos") && cpu.equals("sparc")) ||
- (os.startsWith("sunos") && cpu.equals("sparcv9")) ||
- (os.startsWith("sunos") && cpu.equals("x86")) ||
- (os.startsWith("sunos") && cpu.equals("amd64")) ||
- (os.startsWith("mac os") && cpu.equals("ppc")) ||
- (os.startsWith("mac os") && cpu.equals("i386")) ||
- (os.startsWith("mac os") && cpu.equals("x86_64")) ||
- (os.startsWith("freebsd") && cpu.equals("i386")) ||
- (os.startsWith("hp-ux") && cpu.equals("pa_risc2.0"))
- ) {
- // FIXME: make struct alignment configurable? May need to change
- // packing rules on a per-type basis?
- return new StructLayout(0, 8);
- } else {
- // FIXME: add more ports
- throw new RuntimeException("Please port StructLayout to your OS (" + os + ") and CPU (" + cpu + ")");
- }
- }
-}
diff --git a/src/java/com/sun/gluegen/TypeInfo.java b/src/java/com/sun/gluegen/TypeInfo.java
deleted file mode 100644
index 8f21c9f..0000000
--- a/src/java/com/sun/gluegen/TypeInfo.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2003 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;
-
-/** Utility class for handling Opaque directives for JavaEmitter. */
-
-public class TypeInfo {
- private String name;
- private int pointerDepth;
- private JavaType javaType;
- private TypeInfo next;
-
- public TypeInfo(String name, int pointerDepth, JavaType javaType) {
- this.name = name;
- this.pointerDepth = pointerDepth;
- this.javaType = javaType;
- }
-
- public String name() { return name; }
- public int pointerDepth() { return pointerDepth; }
- public JavaType javaType() { return javaType; }
- public void setNext(TypeInfo info) { this.next = info; }
- public TypeInfo next() { return next; }
-
- public String toString() {
- StringBuffer buf = new StringBuffer("TypeInfo: ");
- buf.append(name);
- buf.append(" pointerDepth ");
- buf.append(pointerDepth);
- buf.append(" JavaType " + javaType);
- return buf.toString();
- }
-}
diff --git a/src/java/com/sun/gluegen/ant/GlueGenTask.java b/src/java/com/sun/gluegen/ant/GlueGenTask.java
deleted file mode 100644
index 45ce1b0..0000000
--- a/src/java/com/sun/gluegen/ant/GlueGenTask.java
+++ /dev/null
@@ -1,495 +0,0 @@
-package com.sun.gluegen.ant;
-
-/*
- * GlueGenTask.java
- * Copyright (C) 2003 Rob Grzywinski ([email protected])
- *
- * 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 java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-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.DirSet;
-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.types.Reference;
-import org.apache.tools.ant.util.JavaEnvUtils;
-
-/**
- * <p>An <a href="http://ant.apache.org">ANT</a> {@link org.apache.tools.ant.Task}
- * for using {@link com.sun.gluegen.GlueGen}.</p>
- *
- * <p>Usage:</p>
- * <pre>
- &lt;gluegen src="[source C file]"
- includes="[optional directory pattern of include files to include]"
- excludes="[optional directory pattern of include files to exclude]"
- includeRefid="[optional FileSet or DirSet for include files]"
- literalInclude="[optional hack to get around FileSet / DirSet issues with different drives]"
- emitter="[emitter class name]"
- config="[configuration file]" /&gt;
- * </pre>
- *
- * @author Rob Grzywinski <a href="mailto:[email protected]">[email protected]</a>
- */
-// FIXME: blow out javadoc
-// NOTE: this has not been exhaustively tested
-public class GlueGenTask extends Task
-{
- /**
- * <p>The {@link com.sun.gluegen.GlueGen} classname.</p>
- */
- private static final String GLUE_GEN = "com.sun.gluegen.GlueGen";
-
- // =========================================================================
- /**
- * <p>The {@link org.apache.tools.ant.types.CommandlineJava} that is used
- * to execute {@link com.sun.gluegen.GlueGen}.</p>
- */
- private CommandlineJava gluegenCommandline;
-
- // =========================================================================
- /**
- * <p>The name of the emitter class.</p>
- */
- private String emitter;
-
- /**
- * <p>The configuration file name.</p>
- */
- private String configuration;
-
- /**
- * <p>The name of the source C file that is to be parsed.</p>
- */
- private String sourceFile;
-
- /**
- * <p>The {@link org.apache.tools.ant.types.FileSet} of includes.</p>
- */
- private FileSet includeSet = new FileSet();
-
- /**
- * <p>Because a {@link org.apache.tools.ant.types.FileSet} will include
- * everything in its base directory if it is left untouched, the <code>includeSet</code>
- * must only be added to the set of includes if it has been <i>explicitly</i>
- * set.</p>
- */
- private boolean usedIncludeSet = false; // by default it is not used
-
- /**
- * <p>The set of include sets. This allows includes to be added in multiple
- * fashions.</p>
- */
- // FIXME: rename to listXXXX
- private List setOfIncludeSets = new LinkedList();
-
- /**
- * <p>A single literal directory to include. This is to get around the
- * fact that neither {@link org.apache.tools.ant.types.FileSet} nor
- * {@link org.apache.tools.ant.types.DirSet} can handle multiple drives in
- * a sane manner. If <code>null</code> then it has not been specified.</p>
- */
- private String literalInclude;
-
- // =========================================================================
- /**
- * <p>Create and add the VM and classname to {@link org.apache.tools.ant.types.CommandlineJava}.</p>
- */
- public GlueGenTask()
- {
- // create the CommandlineJava that will be used to call GlueGen
- gluegenCommandline = new CommandlineJava();
-
- // set the VM and classname in the commandline
- gluegenCommandline.setVm(JavaEnvUtils.getJreExecutable("java"));
- gluegenCommandline.setClassname(GLUE_GEN);
- // gluegenCommandline.createVmArgument().setValue("-verbose:class");
- }
-
- // =========================================================================
- // ANT getters and setters
- /**
- * <p>Set the emitter class name. This is called by ANT.</p>
- *
- * @param emitter the name of the emitter class
- */
- public void setEmitter(String emitter)
- {
- log( ("Setting emitter class name to: " + emitter), Project.MSG_VERBOSE);
- this.emitter = emitter;
- }
-
- /**
- * <p>Set the configuration file name. This is called by ANT.</p>
- *
- * @param configuration the name of the configuration file
- */
- public void setConfig(String configuration)
- {
- log( ("Setting configuration file name to: " + configuration),
- Project.MSG_VERBOSE);
- this.configuration = configuration;
- }
-
- /**
- * <p>Set the source C file that is to be parsed. This is called by ANT.</p>
- *
- * @param sourceFile the name of the source file
- */
- public void setSrc(String sourceFile)
- {
- log( ("Setting source file name to: " + sourceFile), Project.MSG_VERBOSE);
- this.sourceFile = sourceFile;
- }
-
- /**
- * <p>Set a single literal include directory. See the <code>literalInclude</code>
- * javadoc for more information.</p>
- *
- * @param directory the directory to include
- */
- public void setLiteralInclude(String directory)
- {
- this.literalInclude = directory;
- }
-
- /**
- * <p>Add an include file to the list. This is called by ANT for a nested
- * element.</p>
- *
- * @return {@link org.apache.tools.ant.types.PatternSet.NameEntry}
- */
- public PatternSet.NameEntry createInclude()
- {
- usedIncludeSet = true;
- return includeSet.createInclude();
- }
-
- /**
- * <p>Add an include file to the list. This is called by ANT for a nested
- * element.</p>
- *
- * @return {@link org.apache.tools.ant.types.PatternSet.NameEntry}
- */
- public PatternSet.NameEntry createIncludesFile()
- {
- usedIncludeSet = true;
- return includeSet.createIncludesFile();
- }
-
- /**
- * <p>Set the set of include patterns. Patterns may be separated by a comma
- * or a space. This is called by ANT.</p>
- *
- * @param includes the string containing the include patterns
- */
- public void setIncludes(String includes)
- {
- usedIncludeSet = true;
- includeSet.setIncludes(includes);
- }
-
- /**
- * <p>Add an include file to the list that is to be exluded. This is called
- * by ANT for a nested element.</p>
- *
- * @return {@link org.apache.tools.ant.types.PatternSet.NameEntry}
- */
- public PatternSet.NameEntry createExclude()
- {
- usedIncludeSet = true;
- return includeSet.createExclude();
- }
-
- /**
- * <p>Add an exclude file to the list. This is called by ANT for a nested
- * element.</p>
- *
- * @return {@link org.apache.tools.ant.types.PatternSet.NameEntry}
- */
- public PatternSet.NameEntry createExcludesFile()
- {
- usedIncludeSet = true;
- return includeSet.createExcludesFile();
- }
-
- /**
- * <p>Set the set of exclude patterns. Patterns may be separated by a comma
- * or a space. This is called by ANT.</p>
- *
- * @param includes the string containing the exclude patterns
- */
- public void setExcludes(String excludes)
- {
- usedIncludeSet = true;
- includeSet.setExcludes(excludes);
- }
-
- /**
- * <p>Set a {@link org.apache.tools.ant.types.Reference} to simplify adding
- * of complex sets of files to include. This is called by ANT.</p>?
- *
- * @param reference a <code>Reference</code> to a {@link org.apache.tools.ant.types.FileSet}
- * or {@link org.apache.tools.ant.types.DirSet}
- * @throws BuildException if the specified <code>Reference</code> is not
- * either a <code>FileSet</code> or <code>DirSet</code>
- */
- public void setIncludeRefid(Reference reference)
- {
- // ensure that the referenced object is either a FileSet or DirSet
- final Object referencedObject = reference.getReferencedObject(getProject());
- if( !( (referencedObject instanceof FileSet) ||
- (referencedObject instanceof DirSet)) )
- {
- throw new BuildException("Only FileSets or DirSets are allowed as an include refid.");
- }
-
- // add the referenced object to the set of include sets
- setOfIncludeSets.add(referencedObject);
- }
-
- /**
- * <p>Add a nested {@link org.apache.tools.ant.types.DirSet} to specify
- * the files to include. This is called by ANT.</p>
- *
- * @param dirset the <code>DirSet</code> to be added
- */
- public void addDirset(DirSet dirset)
- {
- setOfIncludeSets.add(dirset);
- }
-
- /**
- * <p>Add an optional classpath that defines the location of {@link com.sun.gluegen.GlueGen}
- * and <code>GlueGen</code>'s dependencies.</p>
- *
- * @returns {@link org.apache.tools.ant.types.Path}
- */
- public Path createClasspath()
- {
- return gluegenCommandline.createClasspath(project).createPath();
- }
-
- // =========================================================================
- /**
- * <p>Run the task. This involves validating the set attributes, creating
- * the command line to be executed and finally executing the command.</p>
- *
- * @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(gluegenCommandline.describeCommand(), Project.MSG_VERBOSE);
-
- // execute the command and throw on error
- final int error = execute(gluegenCommandline.getCommandline());
- if(error == 1)
- throw new BuildException( ("GlueGen returned: " + error), location);
- }
-
- /**
- * <p>Ensure that the user specified all required arguments.</p>
- *
- * @throws BuildException if there are required arguments that are not
- * present or not valid
- */
- private void validateAttributes()
- throws BuildException
- {
- // validate that the emitter class is set
- if(!isValid(emitter))
- throw new BuildException("Invalid emitter class name: " + emitter);
-
- // validate that the configuration file is set
- if(!isValid(configuration))
- throw new BuildException("Invalid configuration file name: " + configuration);
-
- // validate that the source file is set
- if(!isValid(sourceFile))
- throw new BuildException("Invalid source file name: " + sourceFile);
-
- // CHECK: do there need to be includes to be valid?
- }
-
- /**
- * <p>Is the specified string valid? A valid string is non-<code>null</code>
- * and has a non-zero length.</p>
- *
- * @param string the string to be tested for validity
- * @return <code>true</code> if the string is valid. <code>false</code>
- * 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;
- }
-
- /**
- * <p>Add all of the attributes to the command line. They have already
- * been validated.</p>
- */
- private void addAttributes()
- throws BuildException
- {
- // NOTE: GlueGen uses concatenated flag / value rather than two
- // separate arguments
-
- // add the emitter class name
- gluegenCommandline.createArgument().setValue("-E" + emitter);
-
- // add the configuration file name
- gluegenCommandline.createArgument().setValue("-C" + configuration);
-
- // add the includedSet to the setOfIncludeSets to simplify processing
- // all types of include sets ONLY if it has been set.
- // NOTE: see the usedIncludeSet member javadoc for more info
- // NOTE: references and nested DirSets have already been added to the
- // set of include sets
- if(usedIncludeSet)
- {
- includeSet.setDir(getProject().getBaseDir()); // NOTE: the base dir must be set
- setOfIncludeSets.add(includeSet);
- }
-
- // iterate over all include sets and add their directories to the
- // list of included directories.
- final List includedDirectories = new LinkedList();
- for(Iterator includes=setOfIncludeSets.iterator(); includes.hasNext(); )
- {
- // get the included set and based on its type add the directories
- // to includedDirectories
- Object include = (Object)includes.next();
- final String[] directoryDirs;
- if(include instanceof FileSet)
- {
- final FileSet fileSet = (FileSet)include;
- DirectoryScanner directoryScanner = fileSet.getDirectoryScanner(getProject());
- directoryDirs = directoryScanner.getIncludedDirectories();
- } else if(include instanceof DirSet)
- {
- final DirSet dirSet = (DirSet)include;
- DirectoryScanner directoryScanner = dirSet.getDirectoryScanner(getProject());
- directoryDirs = directoryScanner.getIncludedDirectories();
- } else
- {
- // NOTE: this cannot occur as it is checked on setXXX() but
- // just to be pedantic this is here
- throw new BuildException("Invalid included construct.");
- }
-
- // add the directoryDirs to the includedDirectories
- // TODO: exclude any directory that is already in the list
- for(int i=0; i<directoryDirs.length; i++)
- {
- includedDirectories.add(directoryDirs[i]);
- }
- }
-
- // if literalInclude is valid then add it to the list of included
- // directories
- if(isValid(literalInclude))
- includedDirectories.add(literalInclude);
-
- // add the included directories to the command
- for(Iterator includes=includedDirectories.iterator(); includes.hasNext(); )
- {
- String directory = (String)includes.next();
- gluegenCommandline.createArgument().setValue("-I" + directory);
- }
-
- // finally, add the source file
- gluegenCommandline.createArgument().setValue(sourceFile);
- }
-
- /**
- * <p>Execute {@link com.sun.gluegen.GlueGen} in a forked JVM.</p>
- *
- * @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/ant/StaticGLGenTask.java b/src/java/com/sun/gluegen/ant/StaticGLGenTask.java
deleted file mode 100644
index 8761942..0000000
--- 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 ([email protected])
- *
- * 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;
-
-/**
- * <p>An <a href="http://ant.apache.org">ANT</a> {@link org.apache.tools.ant.Task}
- * for using {@link com.sun.gluegen.opengl.BuildStaticGLInfo}.</p>
- *
- * <p>Usage:</p>
- * <pre>
- &lt;staticglgen package="[generated files package]"
- headers="[file pattern of GL headers]"
- outputdir="[directory to output the generated files]" /&gt;
- * </pre>
- *
- * @author Rob Grzywinski <a href="mailto:[email protected]">[email protected]</a>
- */
-// FIXME: blow out javadoc
-public class StaticGLGenTask extends Task
-{
- /**
- * <p>The {@link com.sun.gluegen.opengl.BuildStaticGLInfo} classname.</p>
- */
- private static final String GL_GEN = "com.sun.gluegen.opengl.BuildStaticGLInfo";
-
- // =========================================================================
- /**
- * <p>The {@link org.apache.tools.ant.types.CommandlineJava} that is used
- * to execute {@link com.sun.gluegen.opengl.BuildStaticGLInfo}.</p>
- */
- private CommandlineJava glgenCommandline;
-
- // =========================================================================
- /**
- * <p>The package name for the generated files.</p>
- */
- private String packageName;
-
- /**
- * <p>The output directory.</p>
- */
- private String outputDirectory;
-
- /**
- * <p>The {@link org.apache.tools.ant.types.FileSet} of GL headers.</p>
- */
- private FileSet headerSet = new FileSet();
-
- // =========================================================================
- /**
- * <p>Create and add the VM and classname to {@link org.apache.tools.ant.types.CommandlineJava}.</p>
- */
- 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
- /**
- * <p>Set the package name for the generated files. This is called by ANT.</p>
- *
- * @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;
- }
-
- /**
- * <p>Set the output directory. This is called by ANT.</p>
- *
- * @param directory the output directory
- */
- public void setOutputDir(String directory)
- {
- log( ("Setting output directory to: " + directory),
- Project.MSG_VERBOSE);
- this.outputDirectory = directory;
- }
-
- /**
- * <p>Add a header file to the list. This is called by ANT for a nested
- * element.</p>
- *
- * @return {@link org.apache.tools.ant.types.PatternSet.NameEntry}
- */
- public PatternSet.NameEntry createHeader()
- {
- return headerSet.createInclude();
- }
-
- /**
- * <p>Add a header file to the list. This is called by ANT for a nested
- * element.</p>
- *
- * @return {@link org.apache.tools.ant.types.PatternSet.NameEntry}
- */
- public PatternSet.NameEntry createHeadersFile()
- {
- return headerSet.createIncludesFile();
- }
-
- /**
- * <p>Set the set of header patterns. Patterns may be separated by a comma
- * or a space. This is called by ANT.</p>
- *
- * @param headers the string containing the header patterns
- */
- public void setHeaders(String headers)
- {
- headerSet.setIncludes(headers);
- }
-
- /**
- * <p>Add an optional classpath that defines the location of {@link com.sun.gluegen.opengl.BuildStaticGLInfo}
- * and <code>BuildStaticGLInfo</code>'s dependencies.</p>
- *
- * @returns {@link org.apache.tools.ant.types.Path}
- */
- public Path createClasspath()
- {
- return glgenCommandline.createClasspath(project).createPath();
- }
-
- // =========================================================================
- /**
- * <p>Run the task. This involves validating the set attributes, creating
- * the command line to be executed and finally executing the command.</p>
- *
- * @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);
- }
-
- /**
- * <p>Ensure that the user specified all required arguments.</p>
- *
- * @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
- }
-
- /**
- * <p>Is the specified string valid? A valid string is non-<code>null</code>
- * and has a non-zero length.</p>
- *
- * @param string the string to be tested for validity
- * @return <code>true</code> if the string is valid. <code>false</code>
- * 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;
- }
-
- /**
- * <p>Add all of the attributes to the command line. They have already
- * been validated.</p>
- */
- 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; i<directoryFiles.length; i++)
- {
- glgenCommandline.createArgument().setValue(directoryFiles[i]);
- }
- }
-
- /**
- * <p>Execute {@link com.sun.gluegen.opengl.BuildStaticGLInfo} in a
- * forked JVM.</p>
- *
- * @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/cgram/CSymbolTable.java b/src/java/com/sun/gluegen/cgram/CSymbolTable.java
deleted file mode 100644
index 51edf44..0000000
--- a/src/java/com/sun/gluegen/cgram/CSymbolTable.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package com.sun.gluegen.cgram;
-
-import java.util.Vector;
-import java.util.Hashtable;
-import java.util.Enumeration;
-
-
-
-public class CSymbolTable {
-
- /** holds list of scopes */
- private Vector scopeStack;
-
- /** table where all defined names are mapped to TNode tree nodes */
- private Hashtable symTable;
-
- public CSymbolTable() {
- scopeStack = new Vector(10);
- symTable = new Hashtable(533);
- }
-
-
- /** push a new scope onto the scope stack.
- */
- public void pushScope(String s) {
- //System.out.println("push scope:" + s);
- scopeStack.addElement(s);
- }
-
- /** pop the last scope off the scope stack.
- */
- public void popScope() {
- //System.out.println("pop scope");
- int size = scopeStack.size();
- if(size > 0)
- scopeStack.removeElementAt(size - 1);
- }
-
- /** return the current scope as a string
- */
- public String currentScopeAsString() {
- StringBuffer buf = new StringBuffer(100);
- boolean first = true;
- Enumeration e = scopeStack.elements();
- while(e.hasMoreElements()) {
- if(first)
- first = false;
- else
- buf.append("::");
- buf.append(e.nextElement().toString());
- }
- return buf.toString();
- }
-
- /** given a name for a type, append it with the
- current scope.
- */
- public String addCurrentScopeToName(String name) {
- String currScope = currentScopeAsString();
- return addScopeToName(currScope, name);
- }
-
- /** given a name for a type, append it with the
- given scope. MBZ
- */
- public String addScopeToName(String scope, String name) {
- if(scope == null || scope.length() > 0)
- return scope + "::" + name;
- else
- return name;
- }
-
- /** remove one level of scope from name MBZ*/
- public String removeOneLevelScope(String scopeName) {
- int index = scopeName.lastIndexOf("::");
- if (index > 0) {
- return scopeName.substring(0,index);
- }
- if (scopeName.length() > 0) {
- return "";
- }
- return null;
- }
-
- /** add a node to the table with it's key as
- the current scope and the name */
- public TNode add(String name, TNode node) {
- return (TNode)symTable.put(addCurrentScopeToName(name),node);
- }
-
-
- /** lookup a fully scoped name in the symbol table */
- public TNode lookupScopedName(String scopedName) {
- return (TNode)symTable.get(scopedName);
- }
-
- /** lookup an unscoped name in the table by prepending
- the current scope.
- MBZ -- if not found, pop scopes and look again
- */
- public TNode lookupNameInCurrentScope(String name) {
- String scope = currentScopeAsString();
- String scopedName;
- TNode tnode = null;
-
- //System.out.println( "\n"+ this.toString() );
-
- while (tnode == null && scope != null) {
- scopedName = addScopeToName(scope, name);
- //System.out.println("lookup trying " + scopedName);
- tnode = (TNode)symTable.get(scopedName);
- scope = removeOneLevelScope(scope);
- }
- return tnode;
- }
-
- /** convert this table to a string */
- public String toString() {
- StringBuffer buff = new StringBuffer(300);
- buff.append("CSymbolTable { \nCurrentScope: " + currentScopeAsString() +
- "\nDefinedSymbols:\n");
- Enumeration ke = symTable.keys();
- Enumeration ve = symTable.elements();
- while(ke.hasMoreElements()) {
- buff.append(ke.nextElement().toString() + " (" +
- TNode.getNameForType(((TNode)ve.nextElement()).getType()) + ")\n");
- }
- buff.append("}\n");
- return buff.toString();
- }
-
-};
diff --git a/src/java/com/sun/gluegen/cgram/CToken.java b/src/java/com/sun/gluegen/cgram/CToken.java
deleted file mode 100644
index 5d85c48..0000000
--- a/src/java/com/sun/gluegen/cgram/CToken.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.sun.gluegen.cgram;
-
-import antlr.CommonToken;
-
-public class CToken extends antlr.CommonToken {
- String source = "";
- int tokenNumber;
-
- public String getSource()
- {
- return source;
- }
-
- public void setSource(String src)
- {
- source = src;
- }
-
- public int getTokenNumber()
- {
- return tokenNumber;
- }
-
- public void setTokenNumber(int i)
- {
- tokenNumber = i;
- }
-
- public String toString() {
- return "CToken:" +"(" + hashCode() + ")" + "[" + getType() + "] "+ getText() + " line:" + getLine() + " source:" + source ;
- }
-}
diff --git a/src/java/com/sun/gluegen/cgram/Define.java b/src/java/com/sun/gluegen/cgram/Define.java
deleted file mode 100644
index a71c538..0000000
--- a/src/java/com/sun/gluegen/cgram/Define.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2003 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.cgram;
-
-/** Represents a #define of a literal to a value (a number represented
- in string form.) */
-
-public class Define {
- private String name;
- private String value;
-
- public Define(String name, String value) {
- this.name = name;
- this.value = value;
- }
-
- public String getName() { return name; }
- public String getValue() { return value; }
-}
diff --git a/src/java/com/sun/gluegen/cgram/GnuCEmitter.g b/src/java/com/sun/gluegen/cgram/GnuCEmitter.g
deleted file mode 100644
index 82003c3..0000000
--- a/src/java/com/sun/gluegen/cgram/GnuCEmitter.g
+++ /dev/null
@@ -1,1145 +0,0 @@
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- Copyright (c) Non, Inc. 1998 -- All Rights Reserved
-
-PROJECT: C Compiler
-MODULE: GnuCEmitter
-FILE: GnuCEmitter.g
-
-AUTHOR: Monty Zukowski ([email protected]) April 28, 1998
-
-DESCRIPTION:
-
- This tree grammar is for a Gnu C AST.
- It turns the tree back into source code.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-
-
-header {
- package com.sun.gluegen.cgram;
-
- import java.io.*;
- import java.util.*;
-
- import antlr.CommonAST;
- import antlr.DumpASTVisitor;
-}
-
-
-class GnuCEmitter extends GnuCTreeParser;
-
-options
- {
- importVocab = GNUC;
- buildAST = false;
- ASTLabelType = "TNode";
-
- // Copied following options from java grammar.
- codeGenMakeSwitchThreshold = 2;
- codeGenBitsetTestThreshold = 3;
- }
-
-
-{
-
-
-int tabs = 0;
-PrintStream currentOutput = System.out;
-int lineNum = 1;
-String currentSource = "";
-LineObject trueSourceFile;
-final int lineDirectiveThreshold = Integer.MAX_VALUE;
-PreprocessorInfoChannel preprocessorInfoChannel = null;
-Stack sourceFiles = new Stack();
-
-public GnuCEmitter( PreprocessorInfoChannel preprocChannel )
-{
- preprocessorInfoChannel = preprocChannel;
-}
-
-void initializePrinting()
-{
- Vector preprocs = preprocessorInfoChannel.extractLinesPrecedingTokenNumber( new Integer(1) );
- printPreprocs(preprocs);
-/* if ( currentSource.equals("") ) {
- trueSourceFile = new LineObject(currentSource);
- currentOutput.println("# 1 \"" + currentSource + "\"\n");
- sourceFiles.push(trueSourceFile);
- }
-*/
-}
-
-void finalizePrinting() {
- // flush any leftover preprocessing instructions to the stream
-
- printPreprocs(
- preprocessorInfoChannel.extractLinesPrecedingTokenNumber(
- new Integer( preprocessorInfoChannel.getMaxTokenNumber() + 1 ) ));
- //print a newline so file ends at a new line
- currentOutput.println();
-}
-
-void printPreprocs( Vector preprocs )
-{
- // if there was a preprocessingDirective previous to this token then
- // print a newline and the directive, line numbers handled later
- if ( preprocs.size() > 0 ) {
- if ( trueSourceFile != null ) {
- currentOutput.println(); //make sure we're starting a new line unless this is the first line directive
- }
- lineNum++;
- Enumeration e = preprocs.elements();
- while (e.hasMoreElements())
- {
- Object o = e.nextElement();
- if ( o.getClass().getName().equals("LineObject") ) {
- LineObject l = (LineObject) o;
-
- // we always return to the trueSourceFile, we never enter it from another file
- // force it to be returning if in fact we aren't currently in trueSourceFile
- if (( trueSourceFile != null ) //trueSource exists
- && ( !currentSource.equals(trueSourceFile.getSource()) ) //currently not in trueSource
- && ( trueSourceFile.getSource().equals(l.getSource()) ) ) { //returning to trueSource
- l.setEnteringFile( false );
- l.setReturningToFile( true );
- }
-
-
- // print the line directive
- currentOutput.println(l);
- lineNum = l.getLine();
- currentSource = l.getSource();
-
-
- // the very first line directive always represents the true sourcefile
- if ( trueSourceFile == null ) {
- trueSourceFile = new LineObject(currentSource);
- sourceFiles.push(trueSourceFile);
- }
-
- // keep our own stack of files entered
- if ( l.getEnteringFile() ) {
- sourceFiles.push(l);
- }
-
- // if returning to a file, pop the exited files off the stack
- if ( l.getReturningToFile() ) {
- LineObject top = (LineObject) sourceFiles.peek();
- while (( top != trueSourceFile ) && (! l.getSource().equals(top.getSource()) )) {
- sourceFiles.pop();
- top = (LineObject) sourceFiles.peek();
- }
- }
- }
- else { // it was a #pragma or such
- currentOutput.println(o);
- lineNum++;
- }
- }
- }
-
-}
-
-void print( TNode t ) {
- int tLineNum = t.getLocalLineNum();
- if ( tLineNum == 0 ) tLineNum = lineNum;
-
- Vector preprocs = preprocessorInfoChannel.extractLinesPrecedingTokenNumber((Integer)t.getAttribute("tokenNumber"));
- printPreprocs(preprocs);
-
- if ( (lineNum != tLineNum) ) {
- // we know we'll be newlines or a line directive or it probably
- // is just the case that this token is on the next line
- // either way start a new line and indent it
- currentOutput.println();
- lineNum++;
- printTabs();
- }
-
- if ( lineNum == tLineNum ){
- // do nothing special, we're at the right place
- }
- else {
- int diff = tLineNum - lineNum;
- if ( lineNum < tLineNum ) {
- // print out the blank lines to bring us up to right line number
- for ( ; lineNum < tLineNum ; lineNum++ ) {
- currentOutput.println();
- }
- printTabs();
- }
- else { // just reset lineNum
- lineNum = tLineNum;
- }
- }
- currentOutput.print( t.getText() + " " );
-}
-
-
-/* This was my attempt at being smart about line numbers
- It didn't work quite right but I don't know why, I didn't
- have enough test cases. Worked ok compiling rcs and ghostscript
-*/
-void printAddingLineDirectives( TNode t ) {
- int tLineNum = t.getLocalLineNum();
- String tSource = (String) t.getAttribute("source");
-
- if ( tSource == null ) tSource = currentSource;
- if ( tLineNum == 0 ) tLineNum = lineNum;
-
- Vector preprocs = preprocessorInfoChannel.extractLinesPrecedingTokenNumber((Integer)t.getAttribute("tokenNumber"));
- printPreprocs(preprocs);
-
- if ( (lineNum != tLineNum) || !currentSource.equals(tSource) ) {
- // we know we'll be newlines or a line directive or it probably
- // is just the case that this token is on the next line
- // either way start a new line and indent it
- currentOutput.println();
- lineNum++;
- printTabs();
- }
-
- if ( ( lineNum == tLineNum ) && ( currentSource.equals(tSource) ) ){
- // do nothing special, we're at the right place
- }
- else if ( currentSource.equals(tSource) ) {
- int diff = tLineNum - lineNum;
- if (diff > 0 && diff < lineDirectiveThreshold) {
- // print out the blank lines to bring us up to right line number
- for ( ; lineNum < tLineNum ; lineNum++ ) {
- currentOutput.println();
- }
- }
- else { // print line directive to get us to right line number
- // preserve flags 3 and 4 if present in current file
- if ( ! sourceFiles.empty() ) {
- LineObject l = (LineObject) sourceFiles.peek();
- StringBuffer tFlags = new StringBuffer("");
- if (l.getSystemHeader()) {
- tFlags.append(" 3");
- }
- if (l.getTreatAsC()) {
- tFlags.append(" 4");
- }
- currentOutput.println("# " + tLineNum + " \"" + tSource + "\"" + tFlags.toString());
- lineNum = tLineNum;
- }
- }
-
- printTabs();
- }
- else { // different source
- Enumeration sources = sourceFiles.elements();
- // see if we're returning to a file we entered earlier
- boolean returningToEarlierFile = false;
- while (sources.hasMoreElements()) {
- LineObject l = (LineObject) sources.nextElement();
- if (l.getSource().equals(tSource)) {
- returningToEarlierFile = true;
- break;
- }
- }
- if (returningToEarlierFile) {
- // pop off the files we're exiting, but never pop the trueSourceFile
- LineObject l = (LineObject) sourceFiles.peek();
- while ( ( l != trueSourceFile ) &&(! l.getSource().equals(tSource) ) ) {
- sourceFiles.pop();
- l = (LineObject) sourceFiles.peek();
- }
-
- // put in the return flag, plus others as needed
- StringBuffer tFlags = new StringBuffer(" 2");
- if (l.getSystemHeader()) {
- tFlags.append(" 3");
- }
- if (l.getTreatAsC()) {
- tFlags.append(" 4");
- }
-
- currentOutput.println("# " + tLineNum + " \"" + tSource + "\"" + tFlags);
- lineNum = tLineNum;
- currentSource = tSource;
- printTabs();
- }
- else { // entering a file that wasn't in the original source
- // pretend we're entering it from top of stack
- currentOutput.println("# " + tLineNum + " \"" + tSource + "\"" + " 1");
- lineNum = tLineNum;
- currentSource = tSource;
- printTabs();
- }
- }
- currentOutput.print( t.getText() + " " );
-}
-
-/** It is not ok to print newlines from the String passed in as
-it will screw up the line number handling **/
-void print( String s ) {
- currentOutput.print( s + " " );
-}
-
-void printTabs() {
- for ( int i = 0; i< tabs; i++ ) {
- currentOutput.print( "\t" );
- }
-}
-
-void commaSep( TNode t ) {
- print( t );
- if ( t.getNextSibling() != null ) {
- print( "," );
- }
-}
-
- int traceDepth = 0;
- public void reportError(RecognitionException ex) {
- if ( ex != null) {
- System.err.println("ANTLR Tree Parsing RecognitionException Error: " + ex.getClass().getName() + " " + ex );
- ex.printStackTrace(System.err);
- }
- }
- public void reportError(NoViableAltException ex) {
- System.err.println("ANTLR Tree Parsing NoViableAltException Error: " + ex.toString());
- TNode.printTree( ex.node );
- ex.printStackTrace(System.err);
- }
- public void reportError(MismatchedTokenException ex) {
- if ( ex != null) {
- TNode.printTree( ex.node );
- System.err.println("ANTLR Tree Parsing MismatchedTokenException Error: " + ex );
- ex.printStackTrace(System.err);
- }
- }
- public void reportError(String s) {
- System.err.println("ANTLR Error from String: " + s);
- }
- public void reportWarning(String s) {
- System.err.println("ANTLR Warning from String: " + s);
- }
- protected void match(AST t, int ttype) throws MismatchedTokenException {
- //System.out.println("match("+ttype+"); cursor is "+t);
- super.match(t, ttype);
- }
- public void match(AST t, BitSet b) throws MismatchedTokenException {
- //System.out.println("match("+b+"); cursor is "+t);
- super.match(t, b);
- }
- protected void matchNot(AST t, int ttype) throws MismatchedTokenException {
- //System.out.println("matchNot("+ttype+"); cursor is "+t);
- super.matchNot(t, ttype);
- }
- public void traceIn(String rname, AST t) {
- traceDepth += 1;
- for (int x=0; x<traceDepth; x++) System.out.print(" ");
- super.traceIn(rname, t);
- }
- public void traceOut(String rname, AST t) {
- for (int x=0; x<traceDepth; x++) System.out.print(" ");
- super.traceOut(rname, t);
- traceDepth -= 1;
- }
-
-
-
-}
-
-
-translationUnit options {
- defaultErrorHandler=false;
-}
- :
- { initializePrinting(); }
- ( externalList )?
- { finalizePrinting(); }
- ;
-/*
-exception
-catch [RecognitionException ex]
- {
- reportError(ex);
- System.out.println("PROBLEM TREE:\n"
- + _t.toStringList());
- if (_t!=null) {_t = _t.getNextSibling();}
- }
-*/
-
-
-externalList
- : ( externalDef )+
- ;
-
-
-externalDef
- : declaration
- | functionDef
- | asm_expr
- | typelessDeclaration
- | s:SEMI { print( s ); }
- ;
-
-typelessDeclaration
- : #(NTypeMissing initDeclList s: SEMI) { print( s ); }
- ;
-
-
-
-asm_expr
- : #( a:"asm" { print( a ); }
- ( v:"volatile" { print( v ); }
- )?
- lc:LCURLY { print( lc ); tabs++; }
- expr
- rc:RCURLY { tabs--; print( rc ); }
- s:SEMI { print( s ); }
- )
- ;
-
-
-declaration
- : #( NDeclaration
- declSpecifiers
- (
- initDeclList
- )?
- ( s:SEMI { print( s ); } )+
- )
- ;
-
-
-declSpecifiers
- : ( storageClassSpecifier
- | typeQualifier
- | typeSpecifier
- )+
- ;
-
-storageClassSpecifier
- : a:"auto" { print( a ); }
- | b:"register" { print( b ); }
- | c:"typedef" { print( c ); }
- | functionStorageClassSpecifier
- ;
-
-
-functionStorageClassSpecifier
- : a:"extern" { print( a ); }
- | b:"static" { print( b ); }
- | c:"inline" { print( c ); }
- ;
-
-
-typeQualifier
- : a:"const" { print( a ); }
- | b:"volatile" { print( b ); }
- ;
-
-
-typeSpecifier
- : a:"void" { print( a ); }
- | b:"char" { print( b ); }
- | c:"short" { print( c ); }
- | d:"int" { print( d ); }
- | e:"long" { print( e ); }
- | f:"float" { print( f ); }
- | g:"double" { print( g ); }
- | h:"signed" { print( h ); }
- | i:"unsigned" { print( i ); }
- | structSpecifier ( attributeDecl )*
- | unionSpecifier ( attributeDecl )*
- | enumSpecifier
- | typedefName
- | #(n:"typeof" lp:LPAREN { print( n ); print( lp ); }
- ( (typeName )=> typeName
- | expr
- )
- rp:RPAREN { print( rp ); }
- )
- | p:"__complex" { print( p ); }
- ;
-
-
-typedefName
- : #(NTypedefName i:ID { print( i ); } )
- ;
-
-
-structSpecifier
- : #( a:"struct" { print( a ); }
- structOrUnionBody
- )
- ;
-
-unionSpecifier
- : #( a:"union" { print( a ); }
- structOrUnionBody
- )
- ;
-
-structOrUnionBody
- : ( (ID LCURLY) => i1:ID lc1:LCURLY { print( i1 ); print ( "{" ); tabs++; }
- ( structDeclarationList )?
- rc1:RCURLY { tabs--; print( rc1 ); }
- | lc2:LCURLY { print( lc2 ); tabs++; }
- ( structDeclarationList )?
- rc2:RCURLY { tabs--; print( rc2 ); }
- | i2:ID { print( i2 ); }
- )
- ;
-
-structDeclarationList
- : ( structDeclaration { print( ";" ); }
- )+
- ;
-
-
-structDeclaration
- : specifierQualifierList structDeclaratorList
- ;
-
-
-specifierQualifierList
- : (
- typeSpecifier
- | typeQualifier
- )+
- ;
-
-
-structDeclaratorList
- : structDeclarator
- ( { print(","); } structDeclarator )*
- ;
-
-
-structDeclarator
- :
- #( NStructDeclarator
- ( declarator )?
- ( c:COLON { print( c ); } expr )?
- ( attributeDecl )*
- )
- ;
-
-
-enumSpecifier
- : #( a:"enum" { print( a ); }
- ( i:ID { print( i ); } )?
- ( lc:LCURLY { print( lc ); tabs++; }
- enumList
- rc:RCURLY { tabs--; print( rc ); }
- )?
- )
- ;
-
-
-enumList
- :
- enumerator ( {print(",");} enumerator)*
- ;
-
-
-enumerator
- : i:ID { print( i ); }
- ( b:ASSIGN { print( b ); }
- expr
- )?
- ;
-
-
-attributeDecl:
- #( a:"__attribute" { print( a ); }
- (b:. { print( b ); } )*
- )
- | #( n:NAsmAttribute { print( n ); }
- lp:LPAREN { print( lp ); }
- expr { print( ")" ); }
- rp:RPAREN { print( rp ); }
- )
- ;
-
-initDeclList
- : initDecl
- ( { print( "," ); } initDecl )*
- ;
-
-
-initDecl
- { String declName = ""; }
- : #(NInitDecl
- declarator
- ( attributeDecl )*
- ( a:ASSIGN { print( a ); }
- initializer
- | b:COLON { print( b ); }
- expr
- )?
- )
- ;
-
-
-pointerGroup
- : #( NPointerGroup
- ( a:STAR { print( a ); }
- ( typeQualifier )*
- )+
- )
- ;
-
-
-
-idList
- : i:ID { print( i ); }
- ( c:COMMA { print( c ); }
- id:ID { print( id ); }
- )*
- ;
-
-
-
-initializer
- : #( NInitializer (initializerElementLabel)? expr )
- | lcurlyInitializer
- ;
-
-initializerElementLabel
- : #( NInitializerElementLabel
- (
- ( l:LBRACKET { print( l ); }
- expr
- r:RBRACKET { print( r ); }
- (a1:ASSIGN { print( a1 ); } )?
- )
- | i1:ID c:COLON { print( i1 ); print( c ); }
- | d:DOT i2:ID a2:ASSIGN { print( d ); print( i2 ); print( a2 ); }
- )
- )
- ;
-
-lcurlyInitializer
- : #(n:NLcurlyInitializer { print( n ); tabs++; }
- initializerList
- rc:RCURLY { tabs--; print( rc ); }
- )
- ;
-
-initializerList
- : ( i:initializer { commaSep( i ); }
- )*
- ;
-
-
-declarator
- : #( NDeclarator
- ( pointerGroup )?
-
- ( id:ID { print( id ); }
- | lp:LPAREN { print( lp ); } declarator rp:RPAREN { print( rp ); }
- )
-
- ( #( n:NParameterTypeList { print( n ); }
- (
- parameterTypeList
- | (idList)?
- )
- r:RPAREN { print( r ); }
- )
- | lb:LBRACKET { print( lb );} ( expr )? rb:RBRACKET { print( rb ); }
- )*
- )
- ;
-
-
-
-parameterTypeList
- : ( parameterDeclaration
- ( c:COMMA { print( c ); }
- | s:SEMI { print( s ); }
- )?
- )+
- ( v:VARARGS { print( v ); } )?
- ;
-
-
-
-parameterDeclaration
- : #( NParameterDeclaration
- declSpecifiers
- (declarator | nonemptyAbstractDeclarator)?
- )
- ;
-
-
-functionDef
- : #( NFunctionDef
- ( functionDeclSpecifiers)?
- declarator
- (declaration
- | v:VARARGS { print( v ); }
- )*
- compoundStatement
- )
- ;
-/*
-exception
-catch [RecognitionException ex]
- {
- reportError(ex);
- System.out.println("PROBLEM TREE:\n"
- + _t.toStringList());
- if (_t!=null) {_t = _t.getNextSibling();}
- }
-*/
-
-functionDeclSpecifiers
- :
- ( functionStorageClassSpecifier
- | typeQualifier
- | typeSpecifier
- )+
- ;
-
-declarationList
- :
- ( //ANTLR doesn't know that declarationList properly eats all the declarations
- //so it warns about the ambiguity
- options {
- warnWhenFollowAmbig = false;
- } :
- localLabelDecl
- | declaration
- )+
- ;
-
-localLabelDecl
- : #(a:"__label__" { print( a ); }
- ( i:ID { commaSep( i ); }
- )+
- { print( ";" ); }
- )
- ;
-
-
-
-compoundStatement
- : #( cs:NCompoundStatement { print( cs ); tabs++; }
- ( declarationList
- | functionDef
- )*
- ( statementList )?
- rc:RCURLY { tabs--; print( rc ); }
- )
-
- ;
-
-statementList
- : ( statement )+
- ;
-
-statement
- : statementBody
- ;
-
-statementBody
- : s:SEMI { print( s ); }
-
- | compoundStatement // Group of statements
-
- | #(NStatementExpr
- expr { print( ";" ); }
- ) // Expressions
-
-// Iteration statements:
-
- | #( w:"while" { print( w ); print( "(" ); }
- expr { print( ")" ); }
- statement )
-
- | #( d:"do" { print( d ); }
- statement
- { print( " while ( " ); }
- expr
- { print( " );" ); }
- )
-
- | #( f:"for" { print( f ); print( "(" ); }
- expr { print( ";" ); }
- expr { print( ";" ); }
- expr { print( ")" ); }
- statement
- )
-
-
-// Jump statements:
-
- | #( g:"goto" { print( g );}
- expr { print( ";" ); }
- )
- | c:"continue" { print( c ); print( ";" );}
- | b:"break" { print( b ); print( ";" );}
- | #( r:"return" { print( r ); }
- ( expr )?
- { print( ";" ); }
- )
-
-
-// Labeled statements:
- | #( NLabel
- ni:ID { print( ni ); print( ":" ); }
- ( statement )?
- )
-
- | #(
- ca:"case" { print( ca ); }
- expr { print( ":" ); }
- (statement)?
- )
-
- | #(
- de:"default" { print( de ); print( ":" ); }
- (statement)?
- )
-
-
-
-// Selection statements:
-
- | #( i:"if" { print( i ); print( "(" ); }
- expr { print( ")" ); }
- statement
- ( e:"else" { print( e ); }
- statement
- )?
- )
- | #( sw:"switch" { print( sw ); print( "(" ); }
- expr { print( ")" ); }
- statement
- )
-
-
-
- ;
-/*
-exception
-catch [RecognitionException ex]
- {
- reportError(ex);
- System.out.println("PROBLEM TREE:\n"
- + _t.toStringList());
- if (_t!=null) {_t = _t.getNextSibling();}
- }
-*/
-
-
-
-
-
-
-expr
- :
- binaryExpr
- | conditionalExpr
- | castExpr
- | unaryExpr
- | postfixExpr
- | primaryExpr
- | emptyExpr
- | compoundStatementExpr
- | initializer
- | rangeExpr
- | gnuAsmExpr
- ;
-
-emptyExpr
- : NEmptyExpression
- ;
-
-compoundStatementExpr
- : #(l:LPAREN { print( l ); }
- compoundStatement
- r:RPAREN { print( r ); }
- )
- ;
-
-rangeExpr
- : #(NRangeExpr expr v:VARARGS{ print( v ); } expr)
- ;
-
-gnuAsmExpr
- : #(n:NGnuAsmExpr { print( n ); }
- (v:"volatile" { print( v ); } )?
- lp:LPAREN { print( lp ); }
- stringConst
- ( options { warnWhenFollowAmbig = false; }:
- c1:COLON { print( c1 );}
- (strOptExprPair
- ( c2:COMMA { print( c2 ); } strOptExprPair)*
- )?
- ( options { warnWhenFollowAmbig = false; }:
- c3:COLON { print( c3 ); }
- (strOptExprPair
- ( c4:COMMA { print( c4 ); } strOptExprPair)*
- )?
- )?
- )?
- ( c5:COLON { print( c5 ); }
- stringConst
- ( c6:COMMA { print( c6 ); }
- stringConst
- )*
- )?
- rp:RPAREN { print( rp ); }
- )
- ;
-
-strOptExprPair
- : stringConst
- (
- l:LPAREN { print( l ); }
- expr
- r:RPAREN { print( r ); }
- )?
- ;
-
-binaryOperator
- : ASSIGN
- | DIV_ASSIGN
- | PLUS_ASSIGN
- | MINUS_ASSIGN
- | STAR_ASSIGN
- | MOD_ASSIGN
- | RSHIFT_ASSIGN
- | LSHIFT_ASSIGN
- | BAND_ASSIGN
- | BOR_ASSIGN
- | BXOR_ASSIGN
- | LOR
- | LAND
- | BOR
- | BXOR
- | BAND
- | EQUAL
- | NOT_EQUAL
- | LT
- | LTE
- | GT
- | GTE
- | LSHIFT
- | RSHIFT
- | PLUS
- | MINUS
- | STAR
- | DIV
- | MOD
- | NCommaExpr
- ;
-
-binaryExpr
- : b:binaryOperator
- // no rules allowed as roots, so here I manually get
- // the first and second children of the binary operator
- // and then print them out in the right order
- { TNode e1, e2;
- e1 = (TNode) b.getFirstChild();
- e2 = (TNode) e1.getNextSibling();
- expr( e1 );
- print( b );
- expr( e2 );
- }
-
- ;
-
-
-conditionalExpr
- : #( q:QUESTION
- expr { print( q ); }
- ( expr )?
- c:COLON { print( c ); }
- expr
- )
- ;
-
-
-castExpr
- : #(
- c:NCast { print( c ); }
- typeName
- rp:RPAREN { print( rp ); }
- expr
- )
- ;
-
-
-typeName
- : specifierQualifierList (nonemptyAbstractDeclarator)?
- ;
-
-nonemptyAbstractDeclarator
- : #( NNonemptyAbstractDeclarator
- ( pointerGroup
- ( (lp1:LPAREN { print( lp1 ); }
- ( nonemptyAbstractDeclarator
- | parameterTypeList
- )?
- rp1:RPAREN { print( rp1 ); }
- )
- | (
- lb1:LBRACKET { print( lb1 ); }
- (expr)?
- rb1:RBRACKET { print( rb1 ); }
- )
- )*
-
- | ( (lp2:LPAREN { print( lp2 ); }
- ( nonemptyAbstractDeclarator
- | parameterTypeList
- )?
- rp2:RPAREN { print( rp2 ); }
- )
- | (
- lb2:LBRACKET { print( lb2 ); }
- (expr)?
- rb2:RBRACKET { print( rb2 ); }
- )
- )+
- )
- )
- ;
-
-
-
-unaryExpr
- : #( i:INC { print( i ); } expr )
- | #( d:DEC { print( d ); } expr )
- | #( NUnaryExpr u:unaryOperator { print( u ); } expr)
- | #( s:"sizeof" { print( s ); }
- ( ( LPAREN typeName )=>
- lps:LPAREN { print( lps ); }
- typeName
- rps:RPAREN { print( rps ); }
- | expr
- )
- )
- | #( a:"__alignof" { print( a ); }
- ( ( LPAREN typeName )=>
- lpa:LPAREN { print( lpa ); }
- typeName
- rpa:RPAREN { print( rpa ); }
- | expr
- )
- )
- ;
-/*
-exception
-catch [RecognitionException ex]
- {
- reportError(ex);
- System.out.println("PROBLEM TREE:\n"
- + _t.toStringList());
- if (_t!=null) {_t = _t.getNextSibling();}
- }
-*/
-
- unaryOperator
- : BAND
- | STAR
- | PLUS
- | MINUS
- | BNOT
- | LNOT
- | LAND
- | "__real"
- | "__imag"
- ;
-
-
-postfixExpr
- : #( NPostfixExpr
- primaryExpr
- ( a:PTR b:ID { print( a ); print( b ); }
- | c:DOT d:ID { print( c ); print( d ); }
- | #( n:NFunctionCallArgs { print( n ); }
- (argExprList)?
- rp:RPAREN { print( rp ); }
- )
- | lb:LBRACKET { print( lb ); }
- expr
- rb:RBRACKET { print( rb ); }
- | f:INC { print( f ); }
- | g:DEC { print( g ); }
- )+
- )
- ;
-
-
-
-primaryExpr
- : i:ID { print( i ); }
- | n:Number { print( n ); }
- | charConst
- | stringConst
-
-// JTC:
-// ID should catch the enumerator
-// leaving it in gives ambiguous err
-// | enumerator
-
- | #( eg:NExpressionGroup { print( eg ); }
- expr { print( ")" ); }
- )
- ;
-
-
-
-argExprList
- : expr ( {print( "," );} expr )*
- ;
-
-
-
-protected
-charConst
- : c:CharLiteral { print( c ); }
- ;
-
-
-protected
-stringConst
- : #( NStringSeq
- (
- s:StringLiteral { print( s ); }
- )+
- )
- ;
-
-
-protected
-intConst
- : IntOctalConst
- | LongOctalConst
- | UnsignedOctalConst
- | IntIntConst
- | LongIntConst
- | UnsignedIntConst
- | IntHexConst
- | LongHexConst
- | UnsignedHexConst
- ;
-
-
-protected
-floatConst
- : FloatDoubleConst
- | DoubleDoubleConst
- | LongDoubleConst
- ;
-
-
-
-
-
-
-
-
-
-
diff --git a/src/java/com/sun/gluegen/cgram/GnuCParser.g b/src/java/com/sun/gluegen/cgram/GnuCParser.g
deleted file mode 100644
index e087a5c..0000000
--- a/src/java/com/sun/gluegen/cgram/GnuCParser.g
+++ /dev/null
@@ -1,865 +0,0 @@
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- Copyright (c) Non, Inc. 1998 -- All Rights Reserved
-
-PROJECT: C Compiler
-MODULE: GnuCParser
-FILE: GnuCParser.g
-
-AUTHOR: Monty Zukowski ([email protected]) April 28, 1998
-
-DESCRIPTION:
- This is a grammar for the GNU C compiler. It is a
- grammar subclass of StdCParser, overriding only those
- rules which are different from Standard C.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-
-
-header {
- package com.sun.gluegen.cgram;
-
- import java.io.*;
-
- import antlr.CommonAST;
- import antlr.DumpASTVisitor;
-}
-
-
-class GnuCParser extends StdCParser;
-
-options
- {
- k = 2;
- exportVocab = GNUC;
- buildAST = true;
- ASTLabelType = "TNode";
-
- // Copied following options from java grammar.
- codeGenMakeSwitchThreshold = 2;
- codeGenBitsetTestThreshold = 3;
- }
-
-
-{
- // Suppport C++-style single-line comments?
- public static boolean CPPComments = true;
-
- // access to symbol table
- public CSymbolTable symbolTable = new CSymbolTable();
-
- // source for names to unnamed scopes
- protected int unnamedScopeCounter = 0;
-
- public boolean isTypedefName(String name) {
- boolean returnValue = false;
- TNode node = symbolTable.lookupNameInCurrentScope(name);
- for (; node != null; node = (TNode) node.getNextSibling() ) {
- if(node.getType() == LITERAL_typedef) {
- returnValue = true;
- break;
- }
- }
- return returnValue;
- }
-
-
- public String getAScopeName() {
- return "" + (unnamedScopeCounter++);
- }
-
- public void pushScope(String scopeName) {
- symbolTable.pushScope(scopeName);
- }
-
- public void popScope() {
- symbolTable.popScope();
- }
-
- int traceDepth = 0;
- public void reportError(RecognitionException ex) {
- try {
- System.err.println("ANTLR Parsing Error: "+ex + " token name:" + tokenNames[LA(1)]);
- ex.printStackTrace(System.err);
- }
- catch (TokenStreamException e) {
- System.err.println("ANTLR Parsing Error: "+ex);
- ex.printStackTrace(System.err);
- }
- }
- public void reportError(String s) {
- System.err.println("ANTLR Parsing Error from String: " + s);
- }
- public void reportWarning(String s) {
- System.err.println("ANTLR Parsing Warning from String: " + s);
- }
- public void match(int t) throws MismatchedTokenException {
- boolean debugging = false;
-
- if ( debugging ) {
- for (int x=0; x<traceDepth; x++) System.out.print(" ");
- try {
- System.out.println("Match("+tokenNames[t]+") with LA(1)="+
- tokenNames[LA(1)] + ((inputState.guessing>0)?" [inputState.guessing "+ inputState.guessing + "]":""));
- }
- catch (TokenStreamException e) {
- System.out.println("Match("+tokenNames[t]+") " + ((inputState.guessing>0)?" [inputState.guessing "+ inputState.guessing + "]":""));
-
- }
-
- }
- try {
- if ( LA(1)!=t ) {
- if ( debugging ){
- for (int x=0; x<traceDepth; x++) System.out.print(" ");
- System.out.println("token mismatch: "+tokenNames[LA(1)]
- + "!="+tokenNames[t]);
- }
- throw new MismatchedTokenException(tokenNames, LT(1), t, false, getFilename());
-
- } else {
- // mark token as consumed -- fetch next token deferred until LA/LT
- consume();
- }
- }
- catch (TokenStreamException e) {
- }
-
- }
- public void traceIn(String rname) {
- traceDepth += 1;
- for (int x=0; x<traceDepth; x++) System.out.print(" ");
- try {
- System.out.println("> "+rname+"; LA(1)==("+ tokenNames[LT(1).getType()]
- + ") " + LT(1).getText() + " [inputState.guessing "+ inputState.guessing + "]");
- }
- catch (TokenStreamException e) {
- }
- }
- public void traceOut(String rname) {
- for (int x=0; x<traceDepth; x++) System.out.print(" ");
- try {
- System.out.println("< "+rname+"; LA(1)==("+ tokenNames[LT(1).getType()]
- + ") "+LT(1).getText() + " [inputState.guessing "+ inputState.guessing + "]");
- }
- catch (TokenStreamException e) {
- }
- traceDepth -= 1;
- }
-
-}
-
-
-translationUnit
- : ( externalList )? /* Empty source files are allowed. */
- ;
-asm_expr
- : "asm"^
- ("volatile")? LCURLY expr RCURLY ( SEMI )+
- ;
-
-idList
- : ID ( options{warnWhenFollowAmbig=false;}: COMMA ID )*
- ;
-
-externalDef
- : ( "typedef" | declaration )=> declaration
- | ( functionPrefix )=> functionDef
- | typelessDeclaration
- | asm_expr
- | SEMI
- ;
-
-/* these two are here because GCC allows "cat = 13;" as a valid program! */
-functionPrefix
- { String declName; }
- : ( (functionDeclSpecifiers)=> ds:functionDeclSpecifiers
- | //epsilon
- )
- declName = d:declarator[true]
- ( declaration )* (VARARGS)? ( SEMI )*
- LCURLY
- ;
-
-typelessDeclaration
- { AST typeMissing = #[NTypeMissing]; }
- : initDeclList[typeMissing] SEMI { ## = #( #[NTypeMissing], ##); }
- ;
-
-initializer
- : ( ( ( (initializerElementLabel)=> initializerElementLabel )?
- ( assignExpr | lcurlyInitializer ) { ## = #( #[NInitializer], ## ); }
- )
- | lcurlyInitializer
- )
- ;
-
-// GCC allows more specific initializers
-initializerElementLabel
- : ( ( LBRACKET ((constExpr VARARGS)=> rangeExpr | constExpr) RBRACKET (ASSIGN)? )
- | ID COLON
- | DOT ID ASSIGN
- )
- { ## = #( #[NInitializerElementLabel], ##) ; }
- ;
-
-// GCC allows empty initializer lists
-lcurlyInitializer
- :
- LCURLY^ (initializerList ( COMMA! )? )? RCURLY
- { ##.setType( NLcurlyInitializer ); }
- ;
-
-initializerList
- : initializer ( options{warnWhenFollowAmbig=false;}:COMMA! initializer )*
- ;
-
-
-declarator[boolean isFunctionDefinition] returns [String declName]
- { declName = ""; }
- :
- ( pointerGroup )?
-
- ( id:ID { declName = id.getText(); }
- | LPAREN declName = declarator[false] RPAREN
- )
-
- ( declaratorParamaterList[isFunctionDefinition, declName]
- | LBRACKET ( expr )? RBRACKET
- )*
- { ## = #( #[NDeclarator], ## ); }
- ;
-
-declaratorParamaterList[boolean isFunctionDefinition, String declName]
- :
- LPAREN^
- {
- if (isFunctionDefinition) {
- pushScope(declName);
- }
- else {
- pushScope("!"+declName);
- }
- }
- (
- (declSpecifiers)=> parameterTypeList
- | (idList)?
- )
- {
- popScope();
- }
- ( COMMA! )?
- RPAREN
- { ##.setType(NParameterTypeList); }
- ;
-
-parameterTypeList
- : parameterDeclaration
- ( options {
- warnWhenFollowAmbig = false;
- } :
- ( COMMA | SEMI )
- parameterDeclaration
- )*
- ( ( COMMA | SEMI )
- VARARGS
- )?
- ;
-
-
-declarationList
- : ( options { // this loop properly aborts when
- // it finds a non-typedefName ID MBZ
- warnWhenFollowAmbig = false;
- } :
-
- localLabelDeclaration
- | ( declarationPredictor )=> declaration
- )+
- ;
-localLabelDeclaration
- : ( //GNU note: any __label__ declarations must come before regular declarations.
- "__label__"^ ID (options{warnWhenFollowAmbig=false;}: COMMA! ID)* ( COMMA! )? ( SEMI! )+
- )
- ;
-
-
-declaration
- { AST ds1 = null; }
- : ds:declSpecifiers { ds1 = astFactory.dupList(#ds); }
- (
- initDeclList[ds1]
- )?
- ( SEMI )+
- { ## = #( #[NDeclaration], ##); }
-
- ;
-
-functionStorageClassSpecifier
- : "extern"
- | "static"
- | "inline"
- ;
-
-typeSpecifier [int specCount] returns [int retSpecCount]
- { retSpecCount = specCount + 1; }
- :
- ( "void"
- | "char"
- | "short"
- | "int"
- | "__int32"
- | "__int64"
- | "long"
- | "float"
- | "double"
- | "signed"
- | "unsigned"
- | structOrUnionSpecifier ( options{warnWhenFollowAmbig=false;}: attributeDecl )*
- | enumSpecifier
- | { specCount==0 }? typedefName
- | "typeof"^ LPAREN
- ( ( typeName )=> typeName
- | expr
- )
- RPAREN
- | "__complex"
- )
- ;
-
-
-structOrUnionSpecifier
- { String scopeName; }
- : sou:structOrUnion!
- ( ( ID LCURLY )=> i:ID l:LCURLY
- {
- scopeName = #sou.getText() + " " + #i.getText();
- #l.setText(scopeName);
- pushScope(scopeName);
- }
- ( structDeclarationList )?
- { popScope();}
- RCURLY
- | l1:LCURLY
- {
- scopeName = getAScopeName();
- #l1.setText(scopeName);
- pushScope(scopeName);
- }
- ( structDeclarationList )?
- { popScope(); }
- RCURLY
- | ID
- )
- {
- ## = #( #sou, ## );
- }
- ;
-
-
-structDeclaration
- : specifierQualifierList structDeclaratorList ( COMMA! )? ( SEMI! )+
- ;
-
-structDeclaratorList
- : structDeclarator ( options{warnWhenFollowAmbig=false;}: COMMA! structDeclarator )*
- ;
-
-structDeclarator
- : ( declarator[false] )?
- ( COLON constExpr )?
- ( attributeDecl )*
- { ## = #( #[NStructDeclarator], ##); }
- ;
-
-
-
-enumSpecifier
- : "enum"^
- ( ( ID LCURLY )=> i:ID LCURLY enumList[i.getText()] RCURLY
- | LCURLY enumList["anonymous"] RCURLY
- | ID
- )
- ;
-enumList[String enumName]
- : enumerator[enumName] ( options{warnWhenFollowAmbig=false;}: COMMA! enumerator[enumName] )* ( COMMA! )?
- ;
-
-
-initDeclList[AST declarationSpecifiers]
- : initDecl[declarationSpecifiers]
- ( options{warnWhenFollowAmbig=false;}: COMMA! initDecl[declarationSpecifiers] )*
- ( COMMA! )?
- ;
-
-initDecl[AST declarationSpecifiers]
- { String declName = ""; }
- : declName = d:declarator[false]
- { AST ds1, d1;
- ds1 = astFactory.dupList(declarationSpecifiers);
- d1 = astFactory.dupList(#d);
- symbolTable.add(declName, #(null, ds1, d1) );
- }
- ( attributeDecl )*
- ( ASSIGN initializer
- | COLON expr
- )?
- { ## = #( #[NInitDecl], ## ); }
- ;
-
-attributeDecl
- : "__attribute"^ LPAREN LPAREN attributeList RPAREN RPAREN
- | "asm"^ LPAREN stringConst RPAREN { ##.setType( NAsmAttribute ); }
- ;
-
-attributeList
- : attribute ( options{warnWhenFollowAmbig=false;}: COMMA attribute)* ( COMMA )?
- ;
-
-attribute
- : ( ~(LPAREN | RPAREN | COMMA)
- | LPAREN attributeList RPAREN
- )*
- ;
-compoundStatement[String scopeName]
- : LCURLY^
-
- {
- pushScope(scopeName);
- }
- ( //this ambiguity is ok, declarationList and nestedFunctionDef end properly
- options {
- warnWhenFollowAmbig = false;
- } :
- ( "typedef" | "__label__" | declaration )=> declarationList
- | (nestedFunctionDef)=> nestedFunctionDef
- )*
- ( statementList )?
- { popScope(); }
- RCURLY
- { ##.setType( NCompoundStatement ); ##.setAttribute( "scopeName", scopeName ); }
- ;
-
-nestedFunctionDef
- { String declName; }
- : ( "auto" )? //only for nested functions
- ( (functionDeclSpecifiers)=> ds:functionDeclSpecifiers
- )?
- declName = d:declarator[false]
- {
- AST d2, ds2;
- d2 = astFactory.dupList(#d);
- ds2 = astFactory.dupList(#ds);
- symbolTable.add(declName, #(null, ds2, d2));
- pushScope(declName);
- }
- ( declaration )*
- { popScope(); }
- compoundStatement[declName]
- { ## = #( #[NFunctionDef], ## );}
- ;
-
-statement
- : SEMI // Empty statements
-
- | compoundStatement[getAScopeName()] // Group of statements
-
- | expr SEMI! { ## = #( #[NStatementExpr], ## );} // Expressions
-
-// Iteration statements:
-
- | "while"^ LPAREN! expr RPAREN! statement
- | "do"^ statement "while"! LPAREN! expr RPAREN! SEMI!
- |! "for"
- LPAREN ( e1:expr )? SEMI ( e2:expr )? SEMI ( e3:expr )? RPAREN
- s:statement
- {
- if ( #e1 == null) { #e1 = (TNode) #[ NEmptyExpression ]; }
- if ( #e2 == null) { #e2 = (TNode) #[ NEmptyExpression ]; }
- if ( #e3 == null) { #e3 = (TNode) #[ NEmptyExpression ]; }
- ## = #( #[LITERAL_for, "for"], #e1, #e2, #e3, #s );
- }
-
-
-// Jump statements:
-
- | "goto"^ expr SEMI!
- | "continue" SEMI!
- | "break" SEMI!
- | "return"^ ( expr )? SEMI!
-
-
- | ID COLON! (options {warnWhenFollowAmbig=false;}: statement)? { ## = #( #[NLabel], ## ); }
-// GNU allows range expressions in case statements
- | "case"^ ((constExpr VARARGS)=> rangeExpr | constExpr) COLON! ( options{warnWhenFollowAmbig=false;}:statement )?
- | "default"^ COLON! ( options{warnWhenFollowAmbig=false;}: statement )?
-
-// Selection statements:
-
- | "if"^
- LPAREN! expr RPAREN! statement
- ( //standard if-else ambiguity
- options {
- warnWhenFollowAmbig = false;
- } :
- "else" statement )?
- | "switch"^ LPAREN! expr RPAREN! statement
- ;
-
-
-
-conditionalExpr
- : logicalOrExpr
- ( QUESTION^ (expr)? COLON conditionalExpr )?
- ;
-
-rangeExpr //used in initializers only
- : constExpr VARARGS constExpr
- { ## = #(#[NRangeExpr], ##); }
- ;
-
-castExpr
- : ( LPAREN typeName RPAREN )=>
- LPAREN^ typeName RPAREN ( castExpr | lcurlyInitializer )
- { ##.setType(NCast); }
-
- | unaryExpr
- ;
-nonemptyAbstractDeclarator
- : (
- pointerGroup
- ( (LPAREN
- ( nonemptyAbstractDeclarator
- | parameterTypeList
- )?
- ( COMMA! )?
- RPAREN)
- | (LBRACKET (expr)? RBRACKET)
- )*
-
- | ( (LPAREN
- ( nonemptyAbstractDeclarator
- | parameterTypeList
- )?
- ( COMMA! )?
- RPAREN)
- | (LBRACKET (expr)? RBRACKET)
- )+
- )
- { ## = #( #[NNonemptyAbstractDeclarator], ## ); }
-
- ;
-
-
-
-unaryExpr
- : postfixExpr
- | INC^ castExpr
- | DEC^ castExpr
- | u:unaryOperator castExpr { ## = #( #[NUnaryExpr], ## ); }
-
- | "sizeof"^
- ( ( LPAREN typeName )=> LPAREN typeName RPAREN
- | unaryExpr
- )
- | "__alignof"^
- ( ( LPAREN typeName )=> LPAREN typeName RPAREN
- | unaryExpr
- )
- | gnuAsmExpr
- ;
-
-unaryOperator
- : BAND
- | STAR
- | PLUS
- | MINUS
- | BNOT //also stands for complex conjugation
- | LNOT
- | LAND //for label dereference (&&label)
- | "__real"
- | "__imag"
- ;
-
-gnuAsmExpr
- : "asm"^ ("volatile")?
- LPAREN stringConst
- ( options { warnWhenFollowAmbig = false; }:
- COLON (strOptExprPair ( COMMA strOptExprPair)* )?
- ( options { warnWhenFollowAmbig = false; }:
- COLON (strOptExprPair ( COMMA strOptExprPair)* )?
- )?
- )?
- ( COLON stringConst ( COMMA stringConst)* )?
- RPAREN
- { ##.setType(NGnuAsmExpr); }
- ;
-
-//GCC requires the PARENs
-strOptExprPair
- : stringConst ( LPAREN expr RPAREN )?
- ;
-
-
-primaryExpr
- : ID
- | Number
- | charConst
- | stringConst
-// JTC:
-// ID should catch the enumerator
-// leaving it in gives ambiguous err
-// | enumerator
- | (LPAREN LCURLY) => LPAREN^ compoundStatement[getAScopeName()] RPAREN
- | LPAREN^ expr RPAREN { ##.setType(NExpressionGroup); }
- ;
-
-
-{
- import java.io.*;
- import java.util.*;
- import antlr.*;
-}
-
-class GnuCLexer extends StdCLexer;
-options
- {
- k = 3;
- importVocab = GNUC;
- testLiterals = false;
- }
-tokens {
- LITERAL___extension__ = "__extension__";
-}
-
-{
- public void initialize(String src)
- {
- setOriginalSource(src);
- initialize();
- }
-
- public void initialize()
- {
- literals.put(new ANTLRHashString("__alignof__", this), new Integer(LITERAL___alignof));
- literals.put(new ANTLRHashString("__asm", this), new Integer(LITERAL_asm));
- literals.put(new ANTLRHashString("__asm__", this), new Integer(LITERAL_asm));
- literals.put(new ANTLRHashString("__attribute__", this), new Integer(LITERAL___attribute));
- literals.put(new ANTLRHashString("__complex__", this), new Integer(LITERAL___complex));
- literals.put(new ANTLRHashString("__const", this), new Integer(LITERAL_const));
- literals.put(new ANTLRHashString("__const__", this), new Integer(LITERAL_const));
- literals.put(new ANTLRHashString("__imag__", this), new Integer(LITERAL___imag));
- literals.put(new ANTLRHashString("__inline", this), new Integer(LITERAL_inline));
- literals.put(new ANTLRHashString("__inline__", this), new Integer(LITERAL_inline));
- literals.put(new ANTLRHashString("__real__", this), new Integer(LITERAL___real));
- literals.put(new ANTLRHashString("__signed", this), new Integer(LITERAL_signed));
- literals.put(new ANTLRHashString("__signed__", this), new Integer(LITERAL_signed));
- literals.put(new ANTLRHashString("__typeof", this), new Integer(LITERAL_typeof));
- literals.put(new ANTLRHashString("__typeof__", this), new Integer(LITERAL_typeof));
- literals.put(new ANTLRHashString("__volatile", this), new Integer(LITERAL_volatile));
- literals.put(new ANTLRHashString("__volatile__", this), new Integer(LITERAL_volatile));
- }
-
-
- LineObject lineObject = new LineObject();
- String originalSource = "";
- PreprocessorInfoChannel preprocessorInfoChannel = new PreprocessorInfoChannel();
- int tokenNumber = 0;
- boolean countingTokens = true;
- int deferredLineCount = 0;
- List defines = new ArrayList();
-
- public void setCountingTokens(boolean ct)
- {
- countingTokens = ct;
- if ( countingTokens ) {
- tokenNumber = 0;
- }
- else {
- tokenNumber = 1;
- }
- }
-
- public void setOriginalSource(String src)
- {
- originalSource = src;
- lineObject.setSource(src);
- }
- public void setSource(String src)
- {
- lineObject.setSource(src);
- }
-
- public PreprocessorInfoChannel getPreprocessorInfoChannel()
- {
- return preprocessorInfoChannel;
- }
-
- public void setPreprocessingDirective(String pre)
- {
- preprocessorInfoChannel.addLineForTokenNumber( pre, new Integer(tokenNumber) );
- }
-
- public void addDefine(String name, String value)
- {
- defines.add(new Define(name, value));
- }
-
- /** Returns a list of Define objects corresponding to the
- preprocessor definitions seen during parsing. */
- public List getDefines() {
- return defines;
- }
-
- protected Token makeToken(int t)
- {
- if ( t != Token.SKIP && countingTokens) {
- tokenNumber++;
- }
- CToken tok = (CToken) super.makeToken(t);
- tok.setLine(lineObject.line);
- tok.setSource(lineObject.source);
- tok.setTokenNumber(tokenNumber);
-
- lineObject.line += deferredLineCount;
- deferredLineCount = 0;
- return tok;
- }
-
- public void deferredNewline() {
- deferredLineCount++;
- }
-
- public void newline() {
- lineObject.newline();
- }
-
-
-
-
-
-
-}
-Whitespace
- : ( ( ' ' | '\t' | '\014')
- | "\r\n" { newline(); }
- | ( '\n' | '\r' ) { newline(); }
- ) { _ttype = Token.SKIP; }
- ;
-
-
-protected
-Escape
- : '\\'
- ( options{warnWhenFollowAmbig=false;}:
- ~('0'..'7' | 'x')
- | ('0'..'3') ( options{warnWhenFollowAmbig=false;}: Digit )*
- | ('4'..'7') ( options{warnWhenFollowAmbig=false;}: Digit )*
- | 'x' ( options{warnWhenFollowAmbig=false;}: Digit | 'a'..'f' | 'A'..'F' )+
- )
- ;
-
-protected IntSuffix
- : 'L'
- | 'l'
- | 'U'
- | 'u'
- | 'I'
- | 'i'
- | 'J'
- | 'j'
- ;
-protected NumberSuffix
- :
- IntSuffix
- | 'F'
- | 'f'
- ;
-
-Number
- : ( ( Digit )+ ( '.' | 'e' | 'E' ) )=> ( Digit )+
- ( '.' ( Digit )* ( Exponent )?
- | Exponent
- )
- ( NumberSuffix
- )*
-
- | ( "..." )=> "..." { _ttype = VARARGS; }
-
- | '.' { _ttype = DOT; }
- ( ( Digit )+ ( Exponent )?
- { _ttype = Number; }
- ( NumberSuffix
- )*
- )?
-
- | '0' ( '0'..'7' )*
- ( NumberSuffix
- )*
-
- | '1'..'9' ( Digit )*
- ( NumberSuffix
- )*
-
- | '0' ( 'x' | 'X' ) ( 'a'..'f' | 'A'..'F' | Digit )+
- ( IntSuffix
- )*
- ;
-
-IDMEAT
- :
- i:ID {
-
- if ( i.getType() == LITERAL___extension__ ) {
- $setType(Token.SKIP);
- }
- else {
- $setType(i.getType());
- }
-
- }
- ;
-
-protected ID
- options
- {
- testLiterals = true;
- }
- : ( 'a'..'z' | 'A'..'Z' | '_' | '$')
- ( 'a'..'z' | 'A'..'Z' | '_' | '$' | '0'..'9' )*
- ;
-
-WideCharLiteral
- :
- 'L' CharLiteral
- { $setType(CharLiteral); }
- ;
-
-
-
-WideStringLiteral
- :
- 'L' StringLiteral
- { $setType(StringLiteral); }
- ;
-
-StringLiteral
- :
- '"'
- ( ('\\' ~('\n'))=> Escape
- | ( '\r' { newline(); }
- | '\n' {
- newline();
- }
- | '\\' '\n' {
- newline();
- }
- )
- | ~( '"' | '\r' | '\n' | '\\' )
- )*
- '"'
- ;
-
-
-
-
diff --git a/src/java/com/sun/gluegen/cgram/GnuCTreeParser.g b/src/java/com/sun/gluegen/cgram/GnuCTreeParser.g
deleted file mode 100644
index 5231dee..0000000
--- a/src/java/com/sun/gluegen/cgram/GnuCTreeParser.g
+++ /dev/null
@@ -1,852 +0,0 @@
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- Copyright (c) Non, Inc. 1998 -- All Rights Reserved
-
-PROJECT: C Compiler
-MODULE: GnuCTreeParser
-FILE: GnuCTreeParser.g
-
-AUTHOR: Monty Zukowski ([email protected]) April 28, 1998
-
-DESCRIPTION:
-
- This tree grammar is for a Gnu C AST. No actions in it,
- subclass to do something useful.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-
-
-header {
- package com.sun.gluegen.cgram;
-
- import java.io.*;
-
- import antlr.CommonAST;
- import antlr.DumpASTVisitor;
-}
-
-
-class GnuCTreeParser extends TreeParser;
-
-options
- {
- importVocab = GNUC;
- buildAST = false;
- ASTLabelType = "TNode";
-
- // Copied following options from java grammar.
- codeGenMakeSwitchThreshold = 2;
- codeGenBitsetTestThreshold = 3;
- }
-
-
-{
- int traceDepth = 0;
- public void reportError(RecognitionException ex) {
- if ( ex != null) {
- System.err.println("ANTLR Tree Parsing RecognitionException Error: " + ex.getClass().getName() + " " + ex );
- ex.printStackTrace(System.err);
- }
- }
- public void reportError(NoViableAltException ex) {
- System.err.println("ANTLR Tree Parsing NoViableAltException Error: " + ex.toString());
- TNode.printTree( ex.node );
- ex.printStackTrace(System.err);
- }
- public void reportError(MismatchedTokenException ex) {
- if ( ex != null) {
- TNode.printTree( ex.node );
- System.err.println("ANTLR Tree Parsing MismatchedTokenException Error: " + ex );
- ex.printStackTrace(System.err);
- }
- }
- public void reportError(String s) {
- System.err.println("ANTLR Error from String: " + s);
- }
- public void reportWarning(String s) {
- System.err.println("ANTLR Warning from String: " + s);
- }
- protected void match(AST t, int ttype) throws MismatchedTokenException {
- //System.out.println("match("+ttype+"); cursor is "+t);
- super.match(t, ttype);
- }
- public void match(AST t, BitSet b) throws MismatchedTokenException {
- //System.out.println("match("+b+"); cursor is "+t);
- super.match(t, b);
- }
- protected void matchNot(AST t, int ttype) throws MismatchedTokenException {
- //System.out.println("matchNot("+ttype+"); cursor is "+t);
- super.matchNot(t, ttype);
- }
- public void traceIn(String rname, AST t) {
- traceDepth += 1;
- for (int x=0; x<traceDepth; x++) System.out.print(" ");
- super.traceIn(rname, t);
- }
- public void traceOut(String rname, AST t) {
- for (int x=0; x<traceDepth; x++) System.out.print(" ");
- super.traceOut(rname, t);
- traceDepth -= 1;
- }
-
-
-}
-
-translationUnit options {
- defaultErrorHandler=false;
-}
- : ( externalList )?
- ;
-
-/*
-exception
-catch [RecognitionException ex]
- {
- reportError(ex);
- System.out.println("PROBLEM TREE:\n"
- + _t.toStringList());
- if (_t!=null) {_t = _t.getNextSibling();}
- }
-*/
-
-
-externalList
- : ( externalDef )+
- ;
-
-
-externalDef
- : declaration
- | functionDef
- | asm_expr
- | SEMI
- | typelessDeclaration
- ;
-
-typelessDeclaration
- : #(NTypeMissing initDeclList SEMI)
- ;
-
-
-
-asm_expr
- : #( "asm" ( "volatile" )? LCURLY expr RCURLY ( SEMI )+ )
- ;
-
-
-declaration
- : #( NDeclaration
- declSpecifiers
- (
- initDeclList
- )?
- ( SEMI )+
- )
- ;
-
-
-declSpecifiers
- : ( storageClassSpecifier
- | typeQualifier
- | typeSpecifier
- )+
- ;
-
-storageClassSpecifier
- : "auto"
- | "register"
- | "typedef"
- | functionStorageClassSpecifier
- ;
-
-
-functionStorageClassSpecifier
- : "extern"
- | "static"
- | "inline"
- ;
-
-
-typeQualifier
- : "const"
- | "volatile"
- ;
-
-
-typeSpecifier
- : "void"
- | "char"
- | "short"
- | "int"
- | "long"
- | "float"
- | "double"
- | "signed"
- | "unsigned"
- | structSpecifier ( attributeDecl )*
- | unionSpecifier ( attributeDecl )*
- | enumSpecifier
- | typedefName
- | #("typeof" LPAREN
- ( (typeName )=> typeName
- | expr
- )
- RPAREN
- )
- | "__complex"
- ;
-
-
-typedefName
- : #(NTypedefName ID)
- ;
-
-
-structSpecifier
- : #( "struct" structOrUnionBody )
- ;
-
-unionSpecifier
- : #( "union" structOrUnionBody )
- ;
-
-structOrUnionBody
- : ( (ID LCURLY) => ID LCURLY
- ( structDeclarationList )?
- RCURLY
- | LCURLY
- ( structDeclarationList )?
- RCURLY
- | ID
- )
- ;
-/*
-exception
-catch [RecognitionException ex]
- {
- reportError(ex);
- System.out.println("PROBLEM TREE:\n"
- + _t.toStringList());
- if (_t!=null) {_t = _t.getNextSibling();}
- }
-*/
-
-
-structDeclarationList
- : ( structDeclaration )+
- ;
-/*
-exception
-catch [RecognitionException ex]
- {
- reportError(ex);
- System.out.println("PROBLEM TREE:\n"
- + _t.toStringList());
- if (_t!=null) {_t = _t.getNextSibling();}
- }
-*/
-
-
-
-structDeclaration
- : specifierQualifierList structDeclaratorList
- ;
-/*
-exception
-catch [RecognitionException ex]
- {
- reportError(ex);
- System.out.println("PROBLEM TREE:\n"
- + _t.toStringList());
- if (_t!=null) {_t = _t.getNextSibling();}
- }
-*/
-
-
-
-specifierQualifierList
- : (
- typeSpecifier
- | typeQualifier
- )+
- ;
-/*
-exception
-catch [RecognitionException ex]
- {
- reportError(ex);
- System.out.println("PROBLEM TREE:\n"
- + _t.toStringList());
- if (_t!=null) {_t = _t.getNextSibling();}
- }
-*/
-
-
-
-structDeclaratorList
- : ( structDeclarator )+
- ;
-/*
-exception
-catch [RecognitionException ex]
- {
- reportError(ex);
- System.out.println("PROBLEM TREE:\n"
- + _t.toStringList());
- if (_t!=null) {_t = _t.getNextSibling();}
- }
-*/
-
-
-
-structDeclarator
- :
- #( NStructDeclarator
- ( declarator )?
- ( COLON expr )?
- ( attributeDecl )*
- )
- ;
-/*
-exception
-catch [RecognitionException ex]
- {
- reportError(ex);
- System.out.println("PROBLEM TREE:\n"
- + _t.toStringList());
- if (_t!=null) {_t = _t.getNextSibling();}
- }
-*/
-
-
-
-
-enumSpecifier
- : #( "enum"
- ( ID )?
- ( LCURLY enumList RCURLY )?
- )
- ;
-
-
-enumList
- : ( enumerator )+
- ;
-
-
-enumerator
- : ID ( ASSIGN expr )?
- ;
-
-
-
-attributeDecl:
- #( "__attribute" (.)* )
- | #( NAsmAttribute LPAREN expr RPAREN )
- ;
-
-initDeclList
- : ( initDecl )+
- ;
-
-
-initDecl
- { String declName = ""; }
- : #( NInitDecl
- declarator
- ( attributeDecl )*
- ( ASSIGN initializer
- | COLON expr
- )?
- )
- ;
-
-
-pointerGroup
- : #( NPointerGroup ( STAR ( typeQualifier )* )+ )
- ;
-
-
-
-idList
- : ID ( COMMA ID )*
- ;
-
-
-
-initializer
- : #( NInitializer (initializerElementLabel)? expr )
- | lcurlyInitializer
- ;
-
-initializerElementLabel
- : #( NInitializerElementLabel
- (
- ( LBRACKET expr RBRACKET (ASSIGN)? )
- | ID COLON
- | DOT ID ASSIGN
- )
- )
- ;
-
-lcurlyInitializer
- : #( NLcurlyInitializer
- initializerList
- RCURLY
- )
- ;
-
-initializerList
- : ( initializer )*
- ;
-
-
-declarator
- : #( NDeclarator
- ( pointerGroup )?
-
- ( id:ID
- | LPAREN declarator RPAREN
- )
-
- ( #( NParameterTypeList
- (
- parameterTypeList
- | (idList)?
- )
- RPAREN
- )
- | LBRACKET ( expr )? RBRACKET
- )*
- )
- ;
-
-
-
-parameterTypeList
- : ( parameterDeclaration ( COMMA | SEMI )? )+ ( VARARGS )?
- ;
-
-
-
-parameterDeclaration
- : #( NParameterDeclaration
- declSpecifiers
- (declarator | nonemptyAbstractDeclarator)?
- )
- ;
-
-
-functionDef
- : #( NFunctionDef
- ( functionDeclSpecifiers)?
- declarator
- (declaration | VARARGS)*
- compoundStatement
- )
- ;
-/*
-exception
-catch [RecognitionException ex]
- {
- reportError(ex);
- System.out.println("PROBLEM TREE:\n"
- + _t.toStringList());
- if (_t!=null) {_t = _t.getNextSibling();}
- }
-*/
-
-functionDeclSpecifiers
- :
- ( functionStorageClassSpecifier
- | typeQualifier
- | typeSpecifier
- )+
- ;
-
-declarationList
- :
- ( //ANTLR doesn't know that declarationList properly eats all the declarations
- //so it warns about the ambiguity
- options {
- warnWhenFollowAmbig = false;
- } :
- localLabelDecl
- | declaration
- )+
- ;
-
-localLabelDecl
- : #("__label__" (ID)+ )
- ;
-
-
-
-compoundStatement
- : #( NCompoundStatement
- ( declarationList
- | functionDef
- )*
- ( statementList )?
- RCURLY
- )
- ;
-
-statementList
- : ( statement )+
- ;
-
-statement
- : statementBody
- ;
-
-statementBody
- : SEMI // Empty statements
-
- | compoundStatement // Group of statements
-
- | #(NStatementExpr expr) // Expressions
-
-// Iteration statements:
-
- | #( "while" expr statement )
- | #( "do" statement expr )
- | #( "for"
- expr expr expr
- statement
- )
-
-
-// Jump statements:
-
- | #( "goto" expr )
- | "continue"
- | "break"
- | #( "return" ( expr )? )
-
-
-// Labeled statements:
- | #( NLabel ID (statement)? )
- | #( "case" expr (statement)? )
- | #( "default" (statement)? )
-
-
-
-// Selection statements:
-
- | #( "if"
- expr statement
- ( "else" statement )?
- )
- | #( "switch" expr statement )
-
-
-
- ;
-/*
-exception
-catch [RecognitionException ex]
- {
- reportError(ex);
- System.out.println("PROBLEM TREE:\n"
- + _t.toStringList());
- if (_t!=null) {_t = _t.getNextSibling();}
- }
-*/
-
-
-
-
-
-
-expr
- : assignExpr
- | conditionalExpr
- | logicalOrExpr
- | logicalAndExpr
- | inclusiveOrExpr
- | exclusiveOrExpr
- | bitAndExpr
- | equalityExpr
- | relationalExpr
- | shiftExpr
- | additiveExpr
- | multExpr
- | castExpr
- | unaryExpr
- | postfixExpr
- | primaryExpr
- | commaExpr
- | emptyExpr
- | compoundStatementExpr
- | initializer
- | rangeExpr
- | gnuAsmExpr
- ;
-
-commaExpr
- : #(NCommaExpr expr expr)
- ;
-
-emptyExpr
- : NEmptyExpression
- ;
-
-compoundStatementExpr
- : #(LPAREN compoundStatement RPAREN)
- ;
-
-rangeExpr
- : #(NRangeExpr expr VARARGS expr)
- ;
-
-gnuAsmExpr
- : #(NGnuAsmExpr
- ("volatile")?
- LPAREN stringConst
- ( options { warnWhenFollowAmbig = false; }:
- COLON (strOptExprPair ( COMMA strOptExprPair)* )?
- ( options { warnWhenFollowAmbig = false; }:
- COLON (strOptExprPair ( COMMA strOptExprPair)* )?
- )?
- )?
- ( COLON stringConst ( COMMA stringConst)* )?
- RPAREN
- )
- ;
-
-strOptExprPair
- : stringConst ( LPAREN expr RPAREN )?
- ;
-
-assignExpr
- : #( ASSIGN expr expr)
- | #( DIV_ASSIGN expr expr)
- | #( PLUS_ASSIGN expr expr)
- | #( MINUS_ASSIGN expr expr)
- | #( STAR_ASSIGN expr expr)
- | #( MOD_ASSIGN expr expr)
- | #( RSHIFT_ASSIGN expr expr)
- | #( LSHIFT_ASSIGN expr expr)
- | #( BAND_ASSIGN expr expr)
- | #( BOR_ASSIGN expr expr)
- | #( BXOR_ASSIGN expr expr)
- ;
-
-
-conditionalExpr
- : #( QUESTION expr (expr)? COLON expr )
- ;
-
-
-logicalOrExpr
- : #( LOR expr expr)
- ;
-
-
-logicalAndExpr
- : #( LAND expr expr )
- ;
-
-
-inclusiveOrExpr
- : #( BOR expr expr )
- ;
-
-
-exclusiveOrExpr
- : #( BXOR expr expr )
- ;
-
-
-bitAndExpr
- : #( BAND expr expr )
- ;
-
-
-
-equalityExpr
- : #( EQUAL expr expr)
- | #( NOT_EQUAL expr expr)
- ;
-
-
-relationalExpr
- : #( LT expr expr)
- | #( LTE expr expr)
- | #( GT expr expr)
- | #( GTE expr expr)
- ;
-
-
-
-shiftExpr
- : #( LSHIFT expr expr)
- | #( RSHIFT expr expr)
- ;
-
-
-additiveExpr
- : #( PLUS expr expr)
- | #( MINUS expr expr)
- ;
-
-
-multExpr
- : #( STAR expr expr)
- | #( DIV expr expr)
- | #( MOD expr expr)
- ;
-
-
-
-castExpr
- : #( NCast typeName RPAREN expr)
- ;
-
-
-typeName
- : specifierQualifierList (nonemptyAbstractDeclarator)?
- ;
-
-nonemptyAbstractDeclarator
- : #( NNonemptyAbstractDeclarator
- ( pointerGroup
- ( (LPAREN
- ( nonemptyAbstractDeclarator
- | parameterTypeList
- )?
- RPAREN)
- | (LBRACKET (expr)? RBRACKET)
- )*
-
- | ( (LPAREN
- ( nonemptyAbstractDeclarator
- | parameterTypeList
- )?
- RPAREN)
- | (LBRACKET (expr)? RBRACKET)
- )+
- )
- )
- ;
-
-
-
-unaryExpr
- : #( INC expr )
- | #( DEC expr )
- | #( NUnaryExpr unaryOperator expr)
- | #( "sizeof"
- ( ( LPAREN typeName )=> LPAREN typeName RPAREN
- | expr
- )
- )
- | #( "__alignof"
- ( ( LPAREN typeName )=> LPAREN typeName RPAREN
- | expr
- )
- )
- ;
-/*
-exception
-catch [RecognitionException ex]
- {
- reportError(ex);
- System.out.println("PROBLEM TREE:\n"
- + _t.toStringList());
- if (_t!=null) {_t = _t.getNextSibling();}
- }
-*/
-
- unaryOperator
- : BAND
- | STAR
- | PLUS
- | MINUS
- | BNOT
- | LNOT
- | LAND
- | "__real"
- | "__imag"
- ;
-
-
-postfixExpr
- : #( NPostfixExpr
- primaryExpr
- ( PTR ID
- | DOT ID
- | #( NFunctionCallArgs (argExprList)? RPAREN )
- | LBRACKET expr RBRACKET
- | INC
- | DEC
- )+
- )
- ;
-
-
-
-primaryExpr
- : ID
- | Number
- | charConst
- | stringConst
-
-// JTC:
-// ID should catch the enumerator
-// leaving it in gives ambiguous err
-// | enumerator
-
- | #( NExpressionGroup expr )
- ;
-
-
-
-argExprList
- : ( expr )+
- ;
-
-
-
-protected
-charConst
- : CharLiteral
- ;
-
-
-protected
-stringConst
- : #(NStringSeq (StringLiteral)+)
- ;
-
-
-protected
-intConst
- : IntOctalConst
- | LongOctalConst
- | UnsignedOctalConst
- | IntIntConst
- | LongIntConst
- | UnsignedIntConst
- | IntHexConst
- | LongHexConst
- | UnsignedHexConst
- ;
-
-
-protected
-floatConst
- : FloatDoubleConst
- | DoubleDoubleConst
- | LongDoubleConst
- ;
-
-
-
-
-
-
-
-
-
diff --git a/src/java/com/sun/gluegen/cgram/HeaderParser.g b/src/java/com/sun/gluegen/cgram/HeaderParser.g
deleted file mode 100644
index 7c13968..0000000
--- a/src/java/com/sun/gluegen/cgram/HeaderParser.g
+++ /dev/null
@@ -1,725 +0,0 @@
-/*
- * Copyright (c) 2003 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
- * MIDROSYSTEMS, 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.
- */
-
-header {
- package com.sun.gluegen.cgram;
-
- import java.io.*;
- import java.util.*;
-
- import antlr.CommonAST;
- import com.sun.gluegen.cgram.types.*;
-}
-
-class HeaderParser extends GnuCTreeParser;
-options {
- k = 1;
-}
-
-{
- /** Name assigned to a anonymous EnumType (e.g., "enum { ... }"). */
- public static final String ANONYMOUS_ENUM_NAME = "<anonymous>";
-
- /** Set the dictionary mapping typedef names to types for this
- HeaderParser. Must be done before parsing. */
- public void setTypedefDictionary(TypeDictionary dict) {
- this.typedefDictionary = dict;
- }
-
- /** Returns the typedef dictionary this HeaderParser uses. */
- public TypeDictionary getTypedefDictionary() {
- return typedefDictionary;
- }
-
- /** Set the dictionary mapping struct names (i.e., the "foo" in
- "struct foo { ... };") to types for this HeaderParser. Must be done
- before parsing. */
- public void setStructDictionary(TypeDictionary dict) {
- this.structDictionary = dict;
- }
-
- /** Returns the struct name dictionary this HeaderParser uses. */
- public TypeDictionary getStructDictionary() {
- return structDictionary;
- }
-
- /** Get the canonicalization map, which is a regular HashMap
- mapping Type to Type and which is used for looking up the unique
- instances of e.g. pointer-to-structure types that have been typedefed
- and therefore have names. */
- public Map getCanonMap() {
- return canonMap;
- }
-
- /** Pre-define the list of EnumTypes for this HeaderParser. Must be
- done before parsing. */
- public void setEnums(List/*<EnumType>*/ enumTypes) {
- // FIXME: Need to take the input set of EnumTypes, extract all
- // the enumerates from each EnumType, and fill in the enumHash
- // so that each enumerate maps to the enumType to which it
- // belongs.
- throw new RuntimeException("setEnums is Unimplemented!");
- }
-
- /** Returns the EnumTypes this HeaderParser processed. */
- public List/*<EnumType>*/ getEnums() {
- return new ArrayList(enumHash.values());
- }
-
- /** Clears the list of functions this HeaderParser has parsed.
- Useful when reusing the same HeaderParser for more than one
- header file. */
- public void clearParsedFunctions() {
- functions.clear();
- }
-
- /** Returns the list of FunctionSymbols this HeaderParser has parsed. */
- public List getParsedFunctions() {
- return functions;
- }
-
- private CompoundType lookupInStructDictionary(String typeName,
- CompoundTypeKind kind,
- int cvAttrs) {
- CompoundType t = (CompoundType) structDictionary.get(typeName);
- if (t == null) {
- t = new CompoundType(null, null, kind, cvAttrs);
- t.setStructName(typeName);
- structDictionary.put(typeName, t);
- }
- return t;
- }
-
- private Type lookupInTypedefDictionary(String typeName) {
- Type t = typedefDictionary.get(typeName);
- if (t == null) {
- throw new RuntimeException("Undefined reference to typedef name " + typeName);
- }
- return t;
- }
-
- static class ParameterDeclaration {
- private String id;
- private Type type;
-
- ParameterDeclaration(String id, Type type) {
- this.id = id;
- this.type = type;
- }
- String id() { return id; }
- Type type() { return type; }
- }
-
- // A box for a Type. Allows type to be passed down to be modified by recursive rules.
- static class TypeBox {
- private Type origType;
- private Type type;
- private boolean isTypedef;
-
- TypeBox(Type type) {
- this(type, false);
- }
-
- TypeBox(Type type, boolean isTypedef) {
- this.origType = type;
- this.isTypedef = isTypedef;
- }
-
- Type type() {
- if (type == null) {
- return origType;
- }
- return type;
- }
- void setType(Type type) {
- this.type = type;
- }
- void reset() {
- type = null;
- }
-
- boolean isTypedef() { return isTypedef; }
-
- // for easier debugging
- public String toString() {
- String tStr = "Type=NULL_REF";
- if (type == origType) {
- tStr = "Type=ORIG_TYPE";
- } else if (type != null) {
- tStr = "Type: name=\"" + type.getCVAttributesString() + " " +
- type.getName() + "\"; signature=\"" + type + "\"; class " +
- type.getClass().getName();
- }
- String oStr = "OrigType=NULL_REF";
- if (origType != null) {
- oStr = "OrigType: name=\"" + origType.getCVAttributesString() + " " +
- origType.getName() + "\"; signature=\"" + origType + "\"; class " +
- origType.getClass().getName();
- }
- return "<["+tStr + "] [" + oStr + "] " + " isTypedef=" + isTypedef+">";
- }
- }
-
- private boolean doDeclaration; // Used to only process function typedefs
- private String declId;
- private List parameters;
- private TypeDictionary typedefDictionary;
- private TypeDictionary structDictionary;
- private List/*<FunctionSymbol>*/ functions = new ArrayList();
- // hash from name of an enumerated value to the EnumType to which it belongs
- private HashMap/*<String,EnumType>*/ enumHash = new HashMap();
-
- // Storage class specifiers
- private static final int AUTO = 1 << 0;
- private static final int REGISTER = 1 << 1;
- private static final int TYPEDEF = 1 << 2;
- // Function storage class specifiers
- private static final int EXTERN = 1 << 3;
- private static final int STATIC = 1 << 4;
- private static final int INLINE = 1 << 5;
- // Type qualifiers
- private static final int CONST = 1 << 6;
- private static final int VOLATILE = 1 << 7;
- private static final int SIGNED = 1 << 8;
- private static final int UNSIGNED = 1 << 9;
-
- private void initDeclaration() {
- doDeclaration = false;
- declId = null;
- }
-
- private void doDeclaration() {
- doDeclaration = true;
- }
-
- private void processDeclaration(Type returnType) {
- if (doDeclaration) {
- FunctionSymbol sym = new FunctionSymbol(declId, new FunctionType(null, null, returnType, 0));
- if (parameters != null) { // handle funcs w/ empty parameter lists (e.g., "foo()")
- for (Iterator iter = parameters.iterator(); iter.hasNext(); ) {
- ParameterDeclaration pd = (ParameterDeclaration) iter.next();
- sym.addArgument(pd.type(), pd.id());
- }
- }
- functions.add(sym);
- }
- }
-
- private int attrs2CVAttrs(int attrs) {
- int cvAttrs = 0;
- if ((attrs & CONST) != 0) {
- cvAttrs |= CVAttributes.CONST;
- }
- if ((attrs & VOLATILE) != 0) {
- cvAttrs |= CVAttributes.VOLATILE;
- }
- return cvAttrs;
- }
-
- /** Helper routine which handles creating a pointer or array type
- for [] expressions */
- private void handleArrayExpr(TypeBox tb, AST t) {
- if (t != null) {
- try {
- // FIXME: this doesn't take into account struct alignment, which may be necessary
- // See also FIXMEs in ArrayType.java
- int len = parseIntConstExpr(t);
- tb.setType(canonicalize(new ArrayType(tb.type(), SizeThunk.mul(SizeThunk.constant(len), tb.type().getSize()), len, 0)));
- return;
- } catch (RecognitionException e) {
- // Fall through
- }
- }
- tb.setType(canonicalize(new PointerType(SizeThunk.POINTER,
- tb.type(),
- 0)));
- }
-
- private int parseIntConstExpr(AST t) throws RecognitionException {
- return intConstExpr(t);
- }
-
- /** Utility function: creates a new EnumType with the given name, or
- returns an existing one if it has already been created. */
- private EnumType getEnumType(String enumTypeName) {
- EnumType enumType = null;
- Iterator it = enumHash.values().iterator();
- while (it.hasNext()) {
- EnumType potentialMatch = (EnumType)it.next();
- if (potentialMatch.getName().equals(enumTypeName)) {
- enumType = potentialMatch;
- break;
- }
- }
-
- if (enumType == null) {
- // This isn't quite correct. In theory the enum should expand to
- // the size of the largest element, so if there were a long long
- // entry the enum should expand to e.g. int64. However, using
- // "long" here (which is what used to be the case) was
- // definitely incorrect and caused problems.
- enumType = new EnumType(enumTypeName, SizeThunk.INT);
- }
-
- return enumType;
- }
-
- // Map used to canonicalize types. For example, we may typedef
- // struct foo { ... } *pfoo; subsequent references to struct foo* should
- // point to the same PointerType object that had its name set to "pfoo".
- private Map canonMap = new HashMap();
- private Type canonicalize(Type t) {
- Type res = (Type) canonMap.get(t);
- if (res != null) {
- return res;
- }
- canonMap.put(t, t);
- return t;
- }
-}
-
-declarator[TypeBox tb] returns [String s] {
- initDeclaration();
- s = null;
- List params = null;
- String funcPointerName = null;
- TypeBox dummyTypeBox = null;
-}
- : #( NDeclarator
- ( pointerGroup[tb] )?
-
- ( id:ID { s = id.getText(); }
- | LPAREN funcPointerName = declarator[dummyTypeBox] RPAREN
- )
-
- ( #( NParameterTypeList
- (
- params = parameterTypeList
- | (idList)?
- )
- RPAREN
- ) {
- if (id != null) {
- declId = id.getText();
- parameters = params; // FIXME: Ken, why are we setting this class member here?
- doDeclaration();
- } else if ( funcPointerName != null ) {
- /* TypeBox becomes function pointer in this case */
- FunctionType ft = new FunctionType(null, null, tb.type(), 0);
- if (params == null) {
- // If the function pointer has no declared parameters, it's a
- // void function. I'm not sure if the parameter name is
- // ever referenced anywhere when the type is VoidType, so
- // just in case I'll set it to a comment string so it will
- // still compile if written out to code anywhere.
- ft.addArgument(new VoidType(0), "/*unnamed-void*/");
- } else {
- for (Iterator iter = params.iterator(); iter.hasNext(); ) {
- ParameterDeclaration pd = (ParameterDeclaration) iter.next();
- ft.addArgument(pd.type(), pd.id());
- }
- }
- tb.setType(canonicalize(new PointerType(SizeThunk.POINTER,
- ft,
- 0)));
- s = funcPointerName;
- }
- }
- | LBRACKET ( e:expr )? RBRACKET { handleArrayExpr(tb, e); }
- )*
- )
- ;
-
-typelessDeclaration {
- TypeBox tb = null;
-}
- : #(NTypeMissing initDeclList[tb] SEMI)
- ;
-
-declaration {
- TypeBox tb = null;
-}
- : #( NDeclaration
- tb = declSpecifiers
- (
- initDeclList[tb]
- )?
- ( SEMI )+
- ) { processDeclaration(tb.type()); }
- ;
-
-parameterTypeList returns [List l] { l = new ArrayList(); ParameterDeclaration decl = null; }
- : ( decl = parameterDeclaration { if (decl != null) l.add(decl); } ( COMMA | SEMI )? )+ ( VARARGS )?
- ;
-
-parameterDeclaration returns [ParameterDeclaration pd] {
- Type t = null;
- String decl = null;
- pd = null;
- TypeBox tb = null;
-}
- : #( NParameterDeclaration
- tb = declSpecifiers
- (decl = declarator[tb] | nonemptyAbstractDeclarator[tb])?
- ) { pd = new ParameterDeclaration(decl, tb.type()); }
- ;
-
-functionDef {
- TypeBox tb = null;
-}
- : #( NFunctionDef
- ( functionDeclSpecifiers)?
- declarator[tb]
- (declaration | VARARGS)*
- compoundStatement
- )
- ;
-
-declSpecifiers returns [TypeBox tb] {
- tb = null;
- Type t = null;
- int x = 0;
- int y = 0;
-}
- : ( y = storageClassSpecifier { x |= y; }
- | y = typeQualifier { x |= y; }
- | t = typeSpecifier[x]
- )+
-{
- if (t == null &&
- (x & (SIGNED | UNSIGNED)) != 0) {
- t = new IntType("int", SizeThunk.INT, ((x & UNSIGNED) != 0), attrs2CVAttrs(x));
- }
- tb = new TypeBox(t, ((x & TYPEDEF) != 0));
-}
- ;
-
-storageClassSpecifier returns [int x] { x = 0; }
- : "auto" { x |= AUTO; }
- | "register" { x |= REGISTER; }
- | "typedef" { x |= TYPEDEF; }
- | x = functionStorageClassSpecifier
- ;
-
-
-functionStorageClassSpecifier returns [int x] { x = 0; }
- : "extern" { x |= EXTERN; }
- | "static" { x |= STATIC; }
- | "inline" { x |= INLINE; }
- ;
-
-
-typeQualifier returns [int x] { x = 0; }
- : "const" { x |= CONST; }
- | "volatile" { x |= VOLATILE; }
- | "signed" { x |= SIGNED; }
- | "unsigned" { x |= UNSIGNED; }
- ;
-
-typeSpecifier[int attributes] returns [Type t] {
- t = null;
- int cvAttrs = attrs2CVAttrs(attributes);
- boolean unsigned = ((attributes & UNSIGNED) != 0);
-}
- : "void" { t = new VoidType(cvAttrs); }
- | "char" { t = new IntType("char" , SizeThunk.CHAR, unsigned, cvAttrs); }
- | "short" { t = new IntType("short", SizeThunk.SHORT, unsigned, cvAttrs); }
- | "int" { t = new IntType("int" , SizeThunk.INT, unsigned, cvAttrs); }
- | "long" { t = new IntType("long" , SizeThunk.LONG, unsigned, cvAttrs); }
- | "__int32" { t = new IntType("__int32", SizeThunk.INT, unsigned, cvAttrs); }
- | "__int64" { t = new IntType("__int64", SizeThunk.INT64, unsigned, cvAttrs); }
- | "float" { t = new FloatType("float", SizeThunk.FLOAT, cvAttrs); }
- | "double" { t = new DoubleType("double", SizeThunk.DOUBLE, cvAttrs); }
- | t = structSpecifier[cvAttrs] ( attributeDecl )*
- | t = unionSpecifier [cvAttrs] ( attributeDecl )*
- | t = enumSpecifier [cvAttrs]
- | t = typedefName [cvAttrs]
- | #("typeof" LPAREN
- ( (typeName )=> typeName
- | expr
- )
- RPAREN
- )
- | "__complex"
- ;
-
-typedefName[int cvAttrs] returns [Type t] { t = null; }
- : #(NTypedefName id : ID)
- {
- t = canonicalize(lookupInTypedefDictionary(id.getText()).getCVVariant(cvAttrs));
- }
- ;
-
-structSpecifier[int cvAttrs] returns [Type t] { t = null; }
- : #( "struct" t = structOrUnionBody[CompoundTypeKind.STRUCT, cvAttrs] )
- ;
-
-unionSpecifier[int cvAttrs] returns [Type t] { t = null; }
- : #( "union" t = structOrUnionBody[CompoundTypeKind.UNION, cvAttrs] )
- ;
-
-structOrUnionBody[CompoundTypeKind kind, int cvAttrs] returns [CompoundType t] {
- t = null;
-}
- : ( (ID LCURLY) => id:ID LCURLY {
- t = (CompoundType) canonicalize(lookupInStructDictionary(id.getText(), kind, cvAttrs));
- } ( structDeclarationList[t] )?
- RCURLY { t.setBodyParsed(); }
- | LCURLY { t = new CompoundType(null, null, kind, cvAttrs); }
- ( structDeclarationList[t] )?
- RCURLY { t.setBodyParsed(); }
- | id2:ID { t = (CompoundType) canonicalize(lookupInStructDictionary(id2.getText(), kind, cvAttrs)); }
- )
- ;
-
-structDeclarationList[CompoundType t]
- : ( structDeclaration[t] )+
- ;
-
-structDeclaration[CompoundType containingType] {
- Type t = null;
- boolean addedAny = false;
-}
- : t = specifierQualifierList addedAny = structDeclaratorList[containingType, t] {
- if (!addedAny) {
- if (t != null) {
- CompoundType ct = t.asCompound();
- if (ct.isUnion()) {
- // Anonymous union
- containingType.addField(new Field(null, t, null));
- }
- }
- }
- }
- ;
-
-specifierQualifierList returns [Type t] {
- t = null; int x = 0; int y = 0;
-}
- : (
- t = typeSpecifier[x]
- | y = typeQualifier { x |= y; }
- )+ {
- if (t == null &&
- (x & (SIGNED | UNSIGNED)) != 0) {
- t = new IntType("int", SizeThunk.INT, ((x & UNSIGNED) != 0), attrs2CVAttrs(x));
- }
-}
- ;
-
-structDeclaratorList[CompoundType containingType, Type t] returns [boolean addedAny] {
- addedAny = false;
- boolean y = false;
-}
- : ( y = structDeclarator[containingType, t] { addedAny = y; })+
- ;
-
-structDeclarator[CompoundType containingType, Type t] returns [boolean addedAny] {
- addedAny = false;
- String s = null;
- TypeBox tb = new TypeBox(t);
-}
- :
- #( NStructDeclarator
- ( s = declarator[tb] { containingType.addField(new Field(s, tb.type(), null)); addedAny = true; } )?
- ( COLON expr { /* FIXME: bit types not handled yet */ } ) ?
- ( attributeDecl )*
- )
- ;
-
-// FIXME: this will not correctly set the name of the enumeration when
-// encountering a declaration like this:
-//
-// typedef enum { } enumName;
-//
-// In this case calling getName() on the EnumType return value will
-// incorrectly return HeaderParser.ANONYMOUS_ENUM_NAME instead of
-// "enumName"
-//
-// I haven't implemented it yet because I'm not sure how to get the
-// "enumName" *before* executing the enumList rule.
-enumSpecifier [int cvAttrs] returns [Type t] {
- t = null;
-}
- : #( "enum"
- ( ( ID LCURLY )=> i:ID LCURLY enumList[(EnumType)(t = getEnumType(i.getText()))] RCURLY
- | LCURLY enumList[(EnumType)(t = getEnumType(ANONYMOUS_ENUM_NAME))] RCURLY
- | ID { t = getEnumType(i.getText()); }
- )
- )
- ;
-
-enumList[EnumType enumeration] {
- long defaultEnumerantValue = 0;
-}
- : ( defaultEnumerantValue = enumerator[enumeration, defaultEnumerantValue] )+
- ;
-
-enumerator[EnumType enumeration, long defaultValue] returns [long newDefaultValue] {
- newDefaultValue = defaultValue;
-}
- : eName:ID ( ASSIGN eVal:expr )? {
- long value = 0;
- if (eVal != null) {
- String vTxt = eVal.getAllChildrenText();
- if (enumHash.containsKey(vTxt)) {
- EnumType oldEnumType = (EnumType) enumHash.get(vTxt);
- value = oldEnumType.getEnumValue(vTxt);
- } else {
- try {
- value = Long.decode(vTxt).longValue();
- } catch (NumberFormatException e) {
- System.err.println("NumberFormatException: ID[" + eName.getText() + "], VALUE=[" + vTxt + "]");
- throw e;
- }
- }
- } else {
- value = defaultValue;
- }
-
- newDefaultValue = value+1;
- String eTxt = eName.getText();
- if (enumHash.containsKey(eTxt)) {
- EnumType oldEnumType = (EnumType) enumHash.get(eTxt);
- long oldValue = oldEnumType.getEnumValue(eTxt);
- System.err.println("WARNING: redefinition of enumerated value '" + eTxt + "';" +
- " existing definition is in enumeration '" + oldEnumType.getName() +
- "' with value " + oldValue + " and new definition is in enumeration '" +
- enumeration.getName() + "' with value " + value);
- // remove old definition
- oldEnumType.removeEnumerate(eTxt);
- }
- // insert new definition
- enumeration.addEnum(eTxt, value);
- enumHash.put(eTxt, enumeration);
- //System.err.println("ENUM [" + enumeration.getName() + "]: " + eTxt + " = " + enumeration.getEnumValue(eTxt) +
- // " (new default = " + newDefaultValue + ")");
- }
- ;
-
-initDeclList[TypeBox tb]
- : ( initDecl[tb] )+
- ;
-
-initDecl[TypeBox tb] {
- String declName = null;
-}
- : #( NInitDecl
- declName = declarator[tb] {
- //System.err.println("GOT declName: " + declName + " TB=" + tb);
- }
- ( attributeDecl )*
- ( ASSIGN initializer
- | COLON expr
- )?
- )
-{
- if ((declName != null) && (tb != null) && tb.isTypedef()) {
- Type t = tb.type();
- //System.err.println("Adding typedef mapping: [" + declName + "] -> [" + t + "]");
- if (!t.hasTypedefName()) {
- t.setName(declName);
- }
- t = canonicalize(t);
- typedefDictionary.put(declName, t);
- // Clear out PointerGroup effects in case another typedef variant follows
- tb.reset();
- }
-}
- ;
-
-pointerGroup[TypeBox tb] { int x = 0; int y = 0; }
- : #( NPointerGroup ( STAR { x = 0; y = 0; } ( y = typeQualifier { x |= y; } )*
- {
- //System.err.println("IN PTR GROUP: TB=" + tb);
- if (tb != null) {
- tb.setType(canonicalize(new PointerType(SizeThunk.POINTER,
- tb.type(),
- attrs2CVAttrs(x))));
- }
- }
- )+ )
- ;
-
-
-functionDeclSpecifiers
- :
- ( functionStorageClassSpecifier
- | typeQualifier
- | typeSpecifier[0]
- )+
- ;
-
-typeName {
- TypeBox tb = null;
-}
- : specifierQualifierList (nonemptyAbstractDeclarator[tb])?
- ;
-
-
-/* FIXME: the handling of types in this rule has not been well thought
- out and is known to be incomplete. Currently it is only used to handle
- pointerGroups for unnamed parameters. */
-nonemptyAbstractDeclarator[TypeBox tb]
- : #( NNonemptyAbstractDeclarator
- ( pointerGroup[tb]
- ( (LPAREN
- ( nonemptyAbstractDeclarator[tb]
- | parameterTypeList
- )?
- RPAREN)
- | (LBRACKET (e1:expr)? RBRACKET) { handleArrayExpr(tb, e1); }
- )*
-
- | ( (LPAREN
- ( nonemptyAbstractDeclarator[tb]
- | parameterTypeList
- )?
- RPAREN)
- | (LBRACKET (e2:expr)? RBRACKET) { handleArrayExpr(tb, e2); }
- )+
- )
- )
- ;
-
-/* Helper routine for parsing expressions which evaluate to integer
- constants. Can be made more complicated as necessary. */
-intConstExpr returns [int i] { i = -1; }
- : n:Number { return Integer.parseInt(n.getText()); }
- ;
diff --git a/src/java/com/sun/gluegen/cgram/LineObject.java b/src/java/com/sun/gluegen/cgram/LineObject.java
deleted file mode 100644
index 0ed470c..0000000
--- a/src/java/com/sun/gluegen/cgram/LineObject.java
+++ /dev/null
@@ -1,126 +0,0 @@
-package com.sun.gluegen.cgram;
-
-class LineObject {
- LineObject parent = null;
- String source = "";
- int line = 1;
- boolean enteringFile = false;
- boolean returningToFile = false;
- boolean systemHeader = false;
- boolean treatAsC = false;
-
- public LineObject()
- {
- super();
- }
-
- public LineObject( LineObject lobj )
- {
- parent = lobj.getParent();
- source = lobj.getSource();
- line = lobj.getLine();
- enteringFile = lobj.getEnteringFile();
- returningToFile = lobj.getReturningToFile();
- systemHeader = lobj.getSystemHeader();
- treatAsC = lobj.getTreatAsC();
- }
-
- public LineObject( String src)
- {
- source = src;
- }
-
- public void setSource(String src)
- {
- source = src;
- }
-
- public String getSource()
- {
- return source;
- }
-
- public void setParent(LineObject par)
- {
- parent = par;
- }
-
- public LineObject getParent()
- {
- return parent;
- }
-
- public void setLine(int l)
- {
- line = l;
- }
-
- public int getLine()
- {
- return line;
- }
-
- public void newline()
- {
- line++;
- }
-
- public void setEnteringFile(boolean v)
- {
- enteringFile = v;
- }
-
- public boolean getEnteringFile()
- {
- return enteringFile;
- }
-
- public void setReturningToFile(boolean v)
- {
- returningToFile = v;
- }
-
- public boolean getReturningToFile()
- {
- return returningToFile;
- }
-
- public void setSystemHeader(boolean v)
- {
- systemHeader = v;
- }
-
- public boolean getSystemHeader()
- {
- return systemHeader;
- }
-
- public void setTreatAsC(boolean v)
- {
- treatAsC = v;
- }
-
- public boolean getTreatAsC()
- {
- return treatAsC;
- }
-
- public String toString() {
- StringBuffer ret;
- ret = new StringBuffer("# " + line + " \"" + source + "\"");
- if (enteringFile) {
- ret.append(" 1");
- }
- if (returningToFile) {
- ret.append(" 2");
- }
- if (systemHeader) {
- ret.append(" 3");
- }
- if (treatAsC) {
- ret.append(" 4");
- }
- return ret.toString();
- }
-}
-
diff --git a/src/java/com/sun/gluegen/cgram/PreprocessorInfoChannel.java b/src/java/com/sun/gluegen/cgram/PreprocessorInfoChannel.java
deleted file mode 100644
index 431af91..0000000
--- a/src/java/com/sun/gluegen/cgram/PreprocessorInfoChannel.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package com.sun.gluegen.cgram;
-
-import java.util.*;
-
-public class PreprocessorInfoChannel
-{
- Hashtable lineLists = new Hashtable(); // indexed by Token number
- int firstValidTokenNumber = 0;
- int maxTokenNumber = 0;
-
- public void addLineForTokenNumber( Object line, Integer toknum )
- {
- if ( lineLists.containsKey( toknum ) ) {
- Vector lines = (Vector) lineLists.get( toknum );
- lines.addElement(line);
- }
- else {
- Vector lines = new Vector();
- lines.addElement(line);
- lineLists.put(toknum, lines);
- if ( maxTokenNumber < toknum.intValue() ) {
- maxTokenNumber = toknum.intValue();
- }
- }
- }
-
- public int getMaxTokenNumber()
- {
- return maxTokenNumber;
- }
-
- public Vector extractLinesPrecedingTokenNumber( Integer toknum )
- {
- Vector lines = new Vector();
- if (toknum == null) return lines;
- for (int i = firstValidTokenNumber; i < toknum.intValue(); i++){
- Integer inti = new Integer(i);
- if ( lineLists.containsKey( inti ) ) {
- Vector tokenLineVector = (Vector) lineLists.get( inti );
- if ( tokenLineVector != null) {
- Enumeration tokenLines = tokenLineVector.elements();
- while ( tokenLines.hasMoreElements() ) {
- lines.addElement( tokenLines.nextElement() );
- }
- lineLists.remove(inti);
- }
- }
- }
- firstValidTokenNumber = toknum.intValue();
- return lines;
- }
-
- public String toString()
- {
- StringBuffer sb = new StringBuffer("PreprocessorInfoChannel:\n");
- for (int i = 0; i <= maxTokenNumber + 1; i++){
- Integer inti = new Integer(i);
- if ( lineLists.containsKey( inti ) ) {
- Vector tokenLineVector = (Vector) lineLists.get( inti );
- if ( tokenLineVector != null) {
- Enumeration tokenLines = tokenLineVector.elements();
- while ( tokenLines.hasMoreElements() ) {
- sb.append(inti + ":" + tokenLines.nextElement() + '\n');
- }
- }
- }
- }
- return sb.toString();
- }
-}
-
-
-
diff --git a/src/java/com/sun/gluegen/cgram/StdCParser.g b/src/java/com/sun/gluegen/cgram/StdCParser.g
deleted file mode 100644
index e84fbfd..0000000
--- a/src/java/com/sun/gluegen/cgram/StdCParser.g
+++ /dev/null
@@ -1,1375 +0,0 @@
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
- Copyright (c) Non, Inc. 1997 -- All Rights Reserved
-
-PROJECT: C Compiler
-MODULE: Parser
-FILE: stdc.g
-
-AUTHOR: John D. Mitchell ([email protected]), Jul 12, 1997
-
-REVISION HISTORY:
-
- Name Date Description
- ---- ---- -----------
- JDM 97.07.12 Initial version.
- JTC 97.11.18 Declaration vs declarator & misc. hacking.
- JDM 97.11.20 Fixed: declaration vs funcDef,
- parenthesized expressions,
- declarator iteration,
- varargs recognition,
- empty source file recognition,
- and some typos.
-
-
-DESCRIPTION:
-
- This grammar supports the Standard C language.
-
- Note clearly that this grammar does *NOT* deal with
- preprocessor functionality (including things like trigraphs)
- Nor does this grammar deal with multi-byte characters nor strings
- containing multi-byte characters [these constructs are "exercises
- for the reader" as it were :-)].
-
- Please refer to the ISO/ANSI C Language Standard if you believe
- this grammar to be in error. Please cite chapter and verse in any
- correspondence to the author to back up your claim.
-
-TODO:
-
- - typedefName is commented out, needs a symbol table to resolve
- ambiguity.
-
- - trees
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-
-
-header {
- package com.sun.gluegen.cgram;
-
- import java.io.*;
-
- import antlr.CommonAST;
- import antlr.DumpASTVisitor;
-}
-
-
-class StdCParser extends Parser;
-
-options
- {
- k = 2;
- exportVocab = STDC;
- buildAST = true;
- ASTLabelType = "TNode";
-
- // Copied following options from java grammar.
- codeGenMakeSwitchThreshold = 2;
- codeGenBitsetTestThreshold = 3;
- }
-
-
-{
- // Suppport C++-style single-line comments?
- public static boolean CPPComments = true;
-
- // access to symbol table
- public CSymbolTable symbolTable = new CSymbolTable();
-
- // source for names to unnamed scopes
- protected int unnamedScopeCounter = 0;
-
- public boolean isTypedefName(String name) {
- boolean returnValue = false;
- TNode node = symbolTable.lookupNameInCurrentScope(name);
- for (; node != null; node = (TNode) node.getNextSibling() ) {
- if(node.getType() == LITERAL_typedef) {
- returnValue = true;
- break;
- }
- }
- return returnValue;
- }
-
-
- public String getAScopeName() {
- return "" + (unnamedScopeCounter++);
- }
-
- public void pushScope(String scopeName) {
- symbolTable.pushScope(scopeName);
- }
-
- public void popScope() {
- symbolTable.popScope();
- }
-
- int traceDepth = 0;
- public void reportError(RecognitionException ex) {
- try {
- System.err.println("ANTLR Parsing Error: "+ex + " token name:" + tokenNames[LA(1)]);
- ex.printStackTrace(System.err);
- }
- catch (TokenStreamException e) {
- System.err.println("ANTLR Parsing Error: "+ex);
- ex.printStackTrace(System.err);
- }
- }
- public void reportError(String s) {
- System.err.println("ANTLR Parsing Error from String: " + s);
- }
- public void reportWarning(String s) {
- System.err.println("ANTLR Parsing Warning from String: " + s);
- }
- public void match(int t) throws MismatchedTokenException {
- boolean debugging = false;
-
- if ( debugging ) {
- for (int x=0; x<traceDepth; x++) System.out.print(" ");
- try {
- System.out.println("Match("+tokenNames[t]+") with LA(1)="+
- tokenNames[LA(1)] + ((inputState.guessing>0)?" [inputState.guessing "+ inputState.guessing + "]":""));
- }
- catch (TokenStreamException e) {
- System.out.println("Match("+tokenNames[t]+") " + ((inputState.guessing>0)?" [inputState.guessing "+ inputState.guessing + "]":""));
-
- }
-
- }
- try {
- if ( LA(1)!=t ) {
- if ( debugging ){
- for (int x=0; x<traceDepth; x++) System.out.print(" ");
- System.out.println("token mismatch: "+tokenNames[LA(1)]
- + "!="+tokenNames[t]);
- }
- throw new MismatchedTokenException(tokenNames, LT(1), t, false, getFilename());
-
- } else {
- // mark token as consumed -- fetch next token deferred until LA/LT
- consume();
- }
- }
- catch (TokenStreamException e) {
- }
-
- }
- public void traceIn(String rname) {
- traceDepth += 1;
- for (int x=0; x<traceDepth; x++) System.out.print(" ");
- try {
- System.out.println("> "+rname+"; LA(1)==("+ tokenNames[LT(1).getType()]
- + ") " + LT(1).getText() + " [inputState.guessing "+ inputState.guessing + "]");
- }
- catch (TokenStreamException e) {
- }
- }
- public void traceOut(String rname) {
- for (int x=0; x<traceDepth; x++) System.out.print(" ");
- try {
- System.out.println("< "+rname+"; LA(1)==("+ tokenNames[LT(1).getType()]
- + ") "+LT(1).getText() + " [inputState.guessing "+ inputState.guessing + "]");
- }
- catch (TokenStreamException e) {
- }
- traceDepth -= 1;
- }
-
-}
-
-
-
-translationUnit
- : externalList
-
- | /* Empty source files are *not* allowed. */
- {
- System.err.println ( "Empty source file!" );
- }
- ;
-
-
-externalList
- : ( externalDef )+
- ;
-
-
-externalDef
- : ( "typedef" | declaration )=> declaration
- | functionDef
- | asm_expr
- ;
-
-
-asm_expr
- : "asm"^
- ("volatile")? LCURLY! expr RCURLY! SEMI!
- ;
-
-
-declaration
- { AST ds1 = null; }
- : ds:declSpecifiers { ds1 = astFactory.dupList(#ds); }
- (
- initDeclList[ds1]
- )?
- SEMI!
- { ## = #( #[NDeclaration], ##); }
-
- ;
-
-
-declSpecifiers
- { int specCount=0; }
- : ( options { // this loop properly aborts when
- // it finds a non-typedefName ID MBZ
- warnWhenFollowAmbig = false;
- } :
- s:storageClassSpecifier
- | typeQualifier
- | ( "struct" | "union" | "enum" | typeSpecifier[specCount] )=>
- specCount = typeSpecifier[specCount]
- )+
- ;
-
-storageClassSpecifier
- : "auto"
- | "register"
- | "typedef"
- | functionStorageClassSpecifier
- ;
-
-
-functionStorageClassSpecifier
- : "extern"
- | "static"
- ;
-
-
-typeQualifier
- : "const"
- | "volatile"
- ;
-
-typeSpecifier [int specCount] returns [int retSpecCount]
- { retSpecCount = specCount + 1; }
- :
- ( "void"
- | "char"
- | "short"
- | "int"
- | "long"
- | "float"
- | "double"
- | "signed"
- | "unsigned"
- | structOrUnionSpecifier
- | enumSpecifier
- | { specCount == 0 }? typedefName
- )
- ;
-
-
-typedefName
- : { isTypedefName ( LT(1).getText() ) }?
- i:ID { ## = #(#[NTypedefName], #i); }
- ;
-
-structOrUnionSpecifier
- { String scopeName; }
- : sou:structOrUnion!
- ( ( ID LCURLY )=> i:ID l:LCURLY
- {
- scopeName = #sou.getText() + " " + #i.getText();
- #l.setText(scopeName);
- pushScope(scopeName);
- }
- structDeclarationList
- { popScope();}
- RCURLY!
- | l1:LCURLY
- {
- scopeName = getAScopeName();
- #l1.setText(scopeName);
- pushScope(scopeName);
- }
- structDeclarationList
- { popScope(); }
- RCURLY!
- | ID
- )
- {
- ## = #( #sou, ## );
- }
- ;
-
-
-structOrUnion
- : "struct"
- | "union"
- ;
-
-
-structDeclarationList
- : ( structDeclaration )+
- ;
-
-
-structDeclaration
- : specifierQualifierList structDeclaratorList ( SEMI! )+
- ;
-
-
-specifierQualifierList
- { int specCount = 0; }
- : ( options { // this loop properly aborts when
- // it finds a non-typedefName ID MBZ
- warnWhenFollowAmbig = false;
- } :
- ( "struct" | "union" | "enum" | typeSpecifier[specCount] )=>
- specCount = typeSpecifier[specCount]
- | typeQualifier
- )+
- ;
-
-
-structDeclaratorList
- : structDeclarator ( COMMA! structDeclarator )*
- ;
-
-
-structDeclarator
- :
- ( COLON constExpr
- | declarator[false] ( COLON constExpr )?
- )
- { ## = #( #[NStructDeclarator], ##); }
- ;
-
-
-enumSpecifier
- : "enum"^
- ( ( ID LCURLY )=> i:ID LCURLY enumList[i.getText()] RCURLY!
- | LCURLY enumList["anonymous"] RCURLY!
- | ID
- )
- ;
-
-
-enumList[String enumName]
- : enumerator[enumName] ( COMMA! enumerator[enumName] )*
- ;
-
-enumerator[String enumName]
- : i:ID { symbolTable.add( i.getText(),
- #( null,
- #[LITERAL_enum, "enum"],
- #[ ID, enumName]
- )
- );
- }
- (ASSIGN constExpr)?
- ;
-
-
-initDeclList[AST declarationSpecifiers]
- : initDecl[declarationSpecifiers]
- ( COMMA! initDecl[declarationSpecifiers] )*
- ;
-
-
-initDecl[AST declarationSpecifiers]
- { String declName = ""; }
- : declName = d:declarator[false]
- { AST ds1, d1;
- ds1 = astFactory.dupList(declarationSpecifiers);
- d1 = astFactory.dupList(#d);
- symbolTable.add(declName, #(null, ds1, d1) );
- }
- ( ASSIGN initializer
- | COLON expr
- )?
- { ## = #( #[NInitDecl], ## ); }
-
- ;
-
-pointerGroup
- : ( STAR ( typeQualifier )* )+ { ## = #( #[NPointerGroup], ##); }
- ;
-
-
-
-idList
- : ID ( COMMA! ID )*
- ;
-
-
-initializer
- : ( assignExpr
- | LCURLY initializerList ( COMMA! )? RCURLY!
- )
- { ## = #( #[NInitializer], ## ); }
- ;
-
-
-initializerList
- : initializer ( COMMA! initializer )*
- ;
-
-
-declarator[boolean isFunctionDefinition] returns [String declName]
- { declName = ""; }
- :
- ( pointerGroup )?
-
- ( id:ID { declName = id.getText(); }
- | LPAREN declName = declarator[false] RPAREN
- )
-
- ( ! LPAREN
- {
- if (isFunctionDefinition) {
- pushScope(declName);
- }
- else {
- pushScope("!"+declName);
- }
- }
- (
- (declSpecifiers)=> p:parameterTypeList
- {
- ## = #( null, ##, #( #[NParameterTypeList], #p ) );
- }
-
- | (i:idList)?
- {
- ## = #( null, ##, #( #[NParameterTypeList], #i ) );
- }
- )
- {
- popScope();
- }
- RPAREN
- | LBRACKET ( constExpr )? RBRACKET
- )*
- { ## = #( #[NDeclarator], ## ); }
- ;
-
-parameterTypeList
- : parameterDeclaration
- ( options {
- warnWhenFollowAmbig = false;
- } :
- COMMA!
- parameterDeclaration
- )*
- ( COMMA!
- VARARGS
- )?
- ;
-
-
-parameterDeclaration
- { String declName; }
- : ds:declSpecifiers
- ( ( declarator[false] )=> declName = d:declarator[false]
- {
- AST d2, ds2;
- d2 = astFactory.dupList(#d);
- ds2 = astFactory.dupList(#ds);
- symbolTable.add(declName, #(null, ds2, d2));
- }
- | nonemptyAbstractDeclarator
- )?
- {
- ## = #( #[NParameterDeclaration], ## );
- }
- ;
-
-/* JTC:
- * This handles both new and old style functions.
- * see declarator rule to see differences in parameters
- * and here (declaration SEMI)* is the param type decls for the
- * old style. may want to do some checking to check for illegal
- * combinations (but I assume all parsed code will be legal?)
- */
-
-functionDef
- { String declName; }
- : ( (functionDeclSpecifiers)=> ds:functionDeclSpecifiers
- | //epsilon
- )
- declName = d:declarator[true]
- {
- AST d2, ds2;
- d2 = astFactory.dupList(#d);
- ds2 = astFactory.dupList(#ds);
- symbolTable.add(declName, #(null, ds2, d2));
- pushScope(declName);
- }
- ( declaration )* (VARARGS)? ( SEMI! )*
- { popScope(); }
- compoundStatement[declName]
- { ## = #( #[NFunctionDef], ## );}
- ;
-
-functionDeclSpecifiers
- { int specCount = 0; }
- : ( options { // this loop properly aborts when
- // it finds a non-typedefName ID MBZ
- warnWhenFollowAmbig = false;
- } :
- functionStorageClassSpecifier
- | typeQualifier
- | ( "struct" | "union" | "enum" | typeSpecifier[specCount] )=>
- specCount = typeSpecifier[specCount]
- )+
- ;
-
-declarationList
- : ( options { // this loop properly aborts when
- // it finds a non-typedefName ID MBZ
- warnWhenFollowAmbig = false;
- } :
- ( declarationPredictor )=> declaration
- )+
- ;
-
-declarationPredictor
- : (options { //only want to look at declaration if I don't see typedef
- warnWhenFollowAmbig = false;
- }:
- "typedef"
- | declaration
- )
- ;
-
-
-compoundStatement[String scopeName]
- : LCURLY!
- {
- pushScope(scopeName);
- }
- ( ( declarationPredictor)=> declarationList )?
- ( statementList )?
- { popScope(); }
- RCURLY!
- { ## = #( #[NCompoundStatement, scopeName], ##); }
- ;
-
-
-statementList
- : ( statement )+
- ;
-statement
- : SEMI // Empty statements
-
- | compoundStatement[getAScopeName()] // Group of statements
-
- | expr SEMI! { ## = #( #[NStatementExpr], ## ); } // Expressions
-
-// Iteration statements:
-
- | "while"^ LPAREN! expr RPAREN! statement
- | "do"^ statement "while"! LPAREN! expr RPAREN! SEMI!
- |! "for"
- LPAREN ( e1:expr )? SEMI ( e2:expr )? SEMI ( e3:expr )? RPAREN
- s:statement
- {
- if ( #e1 == null) { #e1 = (TNode) #[ NEmptyExpression ]; }
- if ( #e2 == null) { #e2 = (TNode) #[ NEmptyExpression ]; }
- if ( #e3 == null) { #e3 = (TNode) #[ NEmptyExpression ]; }
- ## = #( #[LITERAL_for, "for"], #e1, #e2, #e3, #s );
- }
-
-
-// Jump statements:
-
- | "goto"^ ID SEMI!
- | "continue" SEMI!
- | "break" SEMI!
- | "return"^ ( expr )? SEMI!
-
-
-// Labeled statements:
- | ID COLON! (options {warnWhenFollowAmbig=false;}:statement)? { ## = #( #[NLabel], ## ); }
- | "case"^ constExpr COLON! statement
- | "default"^ COLON! statement
-
-
-
-// Selection statements:
-
- | "if"^
- LPAREN! expr RPAREN! statement
- ( //standard if-else ambiguity
- options {
- warnWhenFollowAmbig = false;
- } :
- "else" statement )?
- | "switch"^ LPAREN! expr RPAREN! statement
- ;
-
-
-
-
-
-
-expr
- : assignExpr (options {
- /* MBZ:
- COMMA is ambiguous between comma expressions and
- argument lists. argExprList should get priority,
- and it does by being deeper in the expr rule tree
- and using (COMMA assignExpr)*
- */
- warnWhenFollowAmbig = false;
- } :
- c:COMMA^ { #c.setType(NCommaExpr); } assignExpr
- )*
- ;
-
-
-assignExpr
- : conditionalExpr ( a:assignOperator! assignExpr { ## = #( #a, ## );} )?
- ;
-
-assignOperator
- : ASSIGN
- | DIV_ASSIGN
- | PLUS_ASSIGN
- | MINUS_ASSIGN
- | STAR_ASSIGN
- | MOD_ASSIGN
- | RSHIFT_ASSIGN
- | LSHIFT_ASSIGN
- | BAND_ASSIGN
- | BOR_ASSIGN
- | BXOR_ASSIGN
- ;
-
-
-conditionalExpr
- : logicalOrExpr
- ( QUESTION^ expr COLON! conditionalExpr )?
- ;
-
-
-constExpr
- : conditionalExpr
- ;
-
-logicalOrExpr
- : logicalAndExpr ( LOR^ logicalAndExpr )*
- ;
-
-
-logicalAndExpr
- : inclusiveOrExpr ( LAND^ inclusiveOrExpr )*
- ;
-
-inclusiveOrExpr
- : exclusiveOrExpr ( BOR^ exclusiveOrExpr )*
- ;
-
-
-exclusiveOrExpr
- : bitAndExpr ( BXOR^ bitAndExpr )*
- ;
-
-
-bitAndExpr
- : equalityExpr ( BAND^ equalityExpr )*
- ;
-
-
-
-equalityExpr
- : relationalExpr
- ( ( EQUAL^ | NOT_EQUAL^ ) relationalExpr )*
- ;
-
-
-relationalExpr
- : shiftExpr
- ( ( LT^ | LTE^ | GT^ | GTE^ ) shiftExpr )*
- ;
-
-
-
-shiftExpr
- : additiveExpr
- ( ( LSHIFT^ | RSHIFT^ ) additiveExpr )*
- ;
-
-
-additiveExpr
- : multExpr
- ( ( PLUS^ | MINUS^ ) multExpr )*
- ;
-
-
-multExpr
- : castExpr
- ( ( STAR^ | DIV^ | MOD^ ) castExpr )*
- ;
-
-
-castExpr
- : ( LPAREN typeName RPAREN )=>
- LPAREN! typeName RPAREN! ( castExpr )
- { ## = #( #[NCast, "("], ## ); }
-
- | unaryExpr
- ;
-
-
-typeName
- : specifierQualifierList (nonemptyAbstractDeclarator)?
- ;
-
-nonemptyAbstractDeclarator
- : (
- pointerGroup
- ( (LPAREN
- ( nonemptyAbstractDeclarator
- | parameterTypeList
- )?
- RPAREN)
- | (LBRACKET (expr)? RBRACKET)
- )*
-
- | ( (LPAREN
- ( nonemptyAbstractDeclarator
- | parameterTypeList
- )?
- RPAREN)
- | (LBRACKET (expr)? RBRACKET)
- )+
- )
- { ## = #( #[NNonemptyAbstractDeclarator], ## ); }
-
- ;
-
-/* JTC:
-
-LR rules:
-
-abstractDeclarator
- : nonemptyAbstractDeclarator
- | // null
- ;
-
-nonemptyAbstractDeclarator
- : LPAREN nonemptyAbstractDeclarator RPAREN
- | abstractDeclarator LPAREN RPAREN
- | abstractDeclarator (LBRACKET (expr)? RBRACKET)
- | STAR abstractDeclarator
- ;
-*/
-
-unaryExpr
- : postfixExpr
- | INC^ unaryExpr
- | DEC^ unaryExpr
- | u:unaryOperator castExpr { ## = #( #[NUnaryExpr], ## ); }
-
- | "sizeof"^
- ( ( LPAREN typeName )=> LPAREN typeName RPAREN
- | unaryExpr
- )
- ;
-
-
-unaryOperator
- : BAND
- | STAR
- | PLUS
- | MINUS
- | BNOT
- | LNOT
- ;
-
-postfixExpr
- : primaryExpr
- (
- postfixSuffix {## = #( #[NPostfixExpr], ## );}
- )?
- ;
-postfixSuffix
- :
- ( PTR ID
- | DOT ID
- | functionCall
- | LBRACKET expr RBRACKET
- | INC
- | DEC
- )+
- ;
-
-functionCall
- :
- LPAREN^ (a:argExprList)? RPAREN
- {
- ##.setType( NFunctionCallArgs );
- }
- ;
-
-
-primaryExpr
- : ID
- | charConst
- | intConst
- | floatConst
- | stringConst
-
-// JTC:
-// ID should catch the enumerator
-// leaving it in gives ambiguous err
-// | enumerator
- | LPAREN! expr RPAREN! { ## = #( #[NExpressionGroup, "("], ## ); }
- ;
-
-argExprList
- : assignExpr ( COMMA! assignExpr )*
- ;
-
-
-
-protected
-charConst
- : CharLiteral
- ;
-
-
-protected
-stringConst
- : (StringLiteral)+ { ## = #(#[NStringSeq], ##); }
- ;
-
-
-protected
-intConst
- : IntOctalConst
- | LongOctalConst
- | UnsignedOctalConst
- | IntIntConst
- | LongIntConst
- | UnsignedIntConst
- | IntHexConst
- | LongHexConst
- | UnsignedHexConst
- ;
-
-
-protected
-floatConst
- : FloatDoubleConst
- | DoubleDoubleConst
- | LongDoubleConst
- ;
-
-
-
-
-
-
-dummy
- : NTypedefName
- | NInitDecl
- | NDeclarator
- | NStructDeclarator
- | NDeclaration
- | NCast
- | NPointerGroup
- | NExpressionGroup
- | NFunctionCallArgs
- | NNonemptyAbstractDeclarator
- | NInitializer
- | NStatementExpr
- | NEmptyExpression
- | NParameterTypeList
- | NFunctionDef
- | NCompoundStatement
- | NParameterDeclaration
- | NCommaExpr
- | NUnaryExpr
- | NLabel
- | NPostfixExpr
- | NRangeExpr
- | NStringSeq
- | NInitializerElementLabel
- | NLcurlyInitializer
- | NAsmAttribute
- | NGnuAsmExpr
- | NTypeMissing
- ;
-
-
-
-
-
-
-{
- import java.io.*;
- import antlr.*;
-}
-
-class StdCLexer extends Lexer;
-
-options
- {
- k = 3;
- exportVocab = STDC;
- testLiterals = false;
- }
-
-{
- LineObject lineObject = new LineObject();
- String originalSource = "";
- PreprocessorInfoChannel preprocessorInfoChannel = new PreprocessorInfoChannel();
- int tokenNumber = 0;
- boolean countingTokens = true;
- int deferredLineCount = 0;
-
- public void setCountingTokens(boolean ct)
- {
- countingTokens = ct;
- if ( countingTokens ) {
- tokenNumber = 0;
- }
- else {
- tokenNumber = 1;
- }
- }
-
- public void setOriginalSource(String src)
- {
- originalSource = src;
- lineObject.setSource(src);
- }
- public void setSource(String src)
- {
- lineObject.setSource(src);
- }
-
- public PreprocessorInfoChannel getPreprocessorInfoChannel()
- {
- return preprocessorInfoChannel;
- }
-
- public void setPreprocessingDirective(String pre)
- {
- preprocessorInfoChannel.addLineForTokenNumber( pre, new Integer(tokenNumber) );
- }
-
- public void addDefine(String name, String value)
- {
- }
-
- protected Token makeToken(int t)
- {
- if ( t != Token.SKIP && countingTokens) {
- tokenNumber++;
- }
- CToken tok = (CToken) super.makeToken(t);
- tok.setLine(lineObject.line);
- tok.setSource(lineObject.source);
- tok.setTokenNumber(tokenNumber);
-
- lineObject.line += deferredLineCount;
- deferredLineCount = 0;
- return tok;
- }
-
- public void deferredNewline() {
- deferredLineCount++;
- }
-
- public void newline() {
- lineObject.newline();
- }
-
-
-
-
-
-
-}
-
-protected
-Vocabulary
- : '\3'..'\377'
- ;
-
-
-/* Operators: */
-
-ASSIGN : '=' ;
-COLON : ':' ;
-COMMA : ',' ;
-QUESTION : '?' ;
-SEMI : ';' ;
-PTR : "->" ;
-
-
-// DOT & VARARGS are commented out since they are generated as part of
-// the Number rule below due to some bizarre lexical ambiguity shme.
-
-// DOT : '.' ;
-protected
-DOT:;
-
-// VARARGS : "..." ;
-protected
-VARARGS:;
-
-
-LPAREN : '(' ;
-RPAREN : ')' ;
-LBRACKET : '[' ;
-RBRACKET : ']' ;
-LCURLY : '{' ;
-RCURLY : '}' ;
-
-EQUAL : "==" ;
-NOT_EQUAL : "!=" ;
-LTE : "<=" ;
-LT : "<" ;
-GTE : ">=" ;
-GT : ">" ;
-
-DIV : '/' ;
-DIV_ASSIGN : "/=" ;
-PLUS : '+' ;
-PLUS_ASSIGN : "+=" ;
-INC : "++" ;
-MINUS : '-' ;
-MINUS_ASSIGN : "-=" ;
-DEC : "--" ;
-STAR : '*' ;
-STAR_ASSIGN : "*=" ;
-MOD : '%' ;
-MOD_ASSIGN : "%=" ;
-RSHIFT : ">>" ;
-RSHIFT_ASSIGN : ">>=" ;
-LSHIFT : "<<" ;
-LSHIFT_ASSIGN : "<<=" ;
-
-LAND : "&&" ;
-LNOT : '!' ;
-LOR : "||" ;
-
-BAND : '&' ;
-BAND_ASSIGN : "&=" ;
-BNOT : '~' ;
-BOR : '|' ;
-BOR_ASSIGN : "|=" ;
-BXOR : '^' ;
-BXOR_ASSIGN : "^=" ;
-
-
-Whitespace
- : ( ( '\003'..'\010' | '\t' | '\013' | '\f' | '\016'.. '\037' | '\177'..'\377' | ' ' )
- | "\r\n" { newline(); }
- | ( '\n' | '\r' ) { newline(); }
- ) { _ttype = Token.SKIP; }
- ;
-
-
-Comment
- : "/*"
- ( { LA(2) != '/' }? '*'
- | "\r\n" { deferredNewline(); }
- | ( '\r' | '\n' ) { deferredNewline(); }
- | ~( '*'| '\r' | '\n' )
- )*
- "*/" { _ttype = Token.SKIP;
- }
- ;
-
-
-CPPComment
- :
- "//" ( ~('\n') )*
- {
- _ttype = Token.SKIP;
- }
- ;
-
-protected NonWhitespace
- : (~('\r' | '\n'))*
- ;
-
-
-PREPROC_DIRECTIVE
-options {
- paraphrase = "a line directive";
-}
-
- :
- '#'
- ( ( "line" || (( ' ' | '\t' | '\014')+ '0'..'9')) => LineDirective
- | ( (Space)* "define" (Space)* i:ID (Space)* (n:Number)?
- nw:NonWhitespace
- ("\r\n" | "\r" | "\n") ) { if (n != null) {
- addDefine(i.getText(), n.getText());
- } else {
- setPreprocessingDirective("#define " + i.getText() + " " +
- nw.getText());
- }
- }
- | (~'\n')* { setPreprocessingDirective(getText()); }
- )
- {
- _ttype = Token.SKIP;
- }
- ;
-
-protected Space:
- ( ' ' | '\t' | '\014')
- ;
-
-protected LineDirective
-{
- boolean oldCountingTokens = countingTokens;
- countingTokens = false;
-}
-:
- {
- lineObject = new LineObject();
- deferredLineCount = 0;
- }
- ("line")? //this would be for if the directive started "#line", but not there for GNU directives
- (Space)+
- n:Number { lineObject.setLine(Integer.parseInt(n.getText())); }
- (Space)+
- ( fn:StringLiteral { try {
- lineObject.setSource(fn.getText().substring(1,fn.getText().length()-1));
- }
- catch (StringIndexOutOfBoundsException e) { /*not possible*/ }
- }
- | fi:ID { lineObject.setSource(fi.getText()); }
- )?
- (Space)*
- ("1" { lineObject.setEnteringFile(true); } )?
- (Space)*
- ("2" { lineObject.setReturningToFile(true); } )?
- (Space)*
- ("3" { lineObject.setSystemHeader(true); } )?
- (Space)*
- ("4" { lineObject.setTreatAsC(true); } )?
- (~('\r' | '\n'))*
- ("\r\n" | "\r" | "\n")
- {
- preprocessorInfoChannel.addLineForTokenNumber(new LineObject(lineObject), new Integer(tokenNumber));
- countingTokens = oldCountingTokens;
- }
- ;
-
-
-
-/* Literals: */
-
-/*
- * Note that we do NOT handle tri-graphs nor multi-byte sequences.
- */
-
-
-/*
- * Note that we can't have empty character constants (even though we
- * can have empty strings :-).
- */
-CharLiteral
- : '\'' ( Escape | ~( '\'' ) ) '\''
- ;
-
-
-/*
- * Can't have raw imbedded newlines in string constants. Strict reading of
- * the standard gives odd dichotomy between newlines & carriage returns.
- * Go figure.
- */
-StringLiteral
- : '"'
- ( Escape
- | (
- '\r' { deferredNewline(); }
- | '\n' {
- deferredNewline();
- _ttype = BadStringLiteral;
- }
- | '\\' '\n' {
- deferredNewline();
- }
- )
- | ~( '"' | '\r' | '\n' | '\\' )
- )*
- '"'
- ;
-
-
-protected BadStringLiteral
- : // Imaginary token.
- ;
-
-
-/*
- * Handle the various escape sequences.
- *
- * Note carefully that these numeric escape *sequences* are *not* of the
- * same form as the C language numeric *constants*.
- *
- * There is no such thing as a binary numeric escape sequence.
- *
- * Octal escape sequences are either 1, 2, or 3 octal digits exactly.
- *
- * There is no such thing as a decimal escape sequence.
- *
- * Hexadecimal escape sequences are begun with a leading \x and continue
- * until a non-hexadecimal character is found.
- *
- * No real handling of tri-graph sequences, yet.
- */
-
-protected
-Escape
- : '\\'
- ( options{warnWhenFollowAmbig=false;}:
- 'a'
- | 'b'
- | 'f'
- | 'n'
- | 'r'
- | 't'
- | 'v'
- | '"'
- | '\''
- | '\\'
- | '?'
- | ('0'..'3') ( options{warnWhenFollowAmbig=false;}: Digit ( options{warnWhenFollowAmbig=false;}: Digit )? )?
- | ('4'..'7') ( options{warnWhenFollowAmbig=false;}: Digit )?
- | 'x' ( options{warnWhenFollowAmbig=false;}: Digit | 'a'..'f' | 'A'..'F' )+
- )
- ;
-
-
-/* Numeric Constants: */
-
-protected
-Digit
- : '0'..'9'
- ;
-
-protected
-LongSuffix
- : 'l'
- | 'L'
- ;
-
-protected
-UnsignedSuffix
- : 'u'
- | 'U'
- ;
-
-protected
-FloatSuffix
- : 'f'
- | 'F'
- ;
-
-protected
-Exponent
- : ( 'e' | 'E' ) ( '+' | '-' )? ( Digit )+
- ;
-
-
-protected
-DoubleDoubleConst:;
-
-protected
-FloatDoubleConst:;
-
-protected
-LongDoubleConst:;
-
-protected
-IntOctalConst:;
-
-protected
-LongOctalConst:;
-
-protected
-UnsignedOctalConst:;
-
-protected
-IntIntConst:;
-
-protected
-LongIntConst:;
-
-protected
-UnsignedIntConst:;
-
-protected
-IntHexConst:;
-
-protected
-LongHexConst:;
-
-protected
-UnsignedHexConst:;
-
-
-
-
-Number
- : ( ( Digit )+ ( '.' | 'e' | 'E' ) )=> ( Digit )+
- ( '.' ( Digit )* ( Exponent )?
- | Exponent
- ) { _ttype = DoubleDoubleConst; }
- ( FloatSuffix { _ttype = FloatDoubleConst; }
- | LongSuffix { _ttype = LongDoubleConst; }
- )?
-
- | ( "..." )=> "..." { _ttype = VARARGS; }
-
- | '.' { _ttype = DOT; }
- ( ( Digit )+ ( Exponent )?
- { _ttype = DoubleDoubleConst; }
- ( FloatSuffix { _ttype = FloatDoubleConst; }
- | LongSuffix { _ttype = LongDoubleConst; }
- )?
- )?
-
- | '0' ( '0'..'7' )* { _ttype = IntOctalConst; }
- ( LongSuffix { _ttype = LongOctalConst; }
- | UnsignedSuffix { _ttype = UnsignedOctalConst; }
- )?
-
- | '1'..'9' ( Digit )* { _ttype = IntIntConst; }
- ( LongSuffix { _ttype = LongIntConst; }
- | UnsignedSuffix { _ttype = UnsignedIntConst; }
- )?
-
- | '0' ( 'x' | 'X' ) ( 'a'..'f' | 'A'..'F' | Digit )+
- { _ttype = IntHexConst; }
- ( LongSuffix { _ttype = LongHexConst; }
- | UnsignedSuffix { _ttype = UnsignedHexConst; }
- )?
- ;
-
-
-ID
- options
- {
- testLiterals = true;
- }
- : ( 'a'..'z' | 'A'..'Z' | '_' )
- ( 'a'..'z' | 'A'..'Z' | '_' | '0'..'9' )*
- ;
-
-
diff --git a/src/java/com/sun/gluegen/cgram/TNode.java b/src/java/com/sun/gluegen/cgram/TNode.java
deleted file mode 100644
index 9fca506..0000000
--- a/src/java/com/sun/gluegen/cgram/TNode.java
+++ /dev/null
@@ -1,443 +0,0 @@
-package com.sun.gluegen.cgram;
-
-import antlr.collections.AST;
-import antlr.CommonAST;
-import antlr.Token;
-import java.lang.reflect.*;
-import java.util.Hashtable;
-import java.util.Enumeration;
-
-/**
- Class TNode is an implementation of the AST interface
- and adds many useful features:
-
- It is double-linked for reverse searching.
- (this is currently incomplete, in that method doubleLink() must
- be called after any changes to the tree to maintain the
- reverse links).
-
- It can store a definition node (defNode), so that nodes such
- as scoped names can refer to the node that defines the name.
-
- It stores line numbers for nodes.
-
- Searches for parents and children of a tree can be done
- based on their type.
-
- The tree can be printed to System.out using a lisp-style syntax.
-
-
-
- */
-public class TNode extends CommonAST {
- protected int ttype;
- protected String text;
- protected int lineNum = 0;
- protected TNode defNode;
- protected TNode up;
- protected TNode left;
- protected boolean marker = false;
- protected Hashtable attributes = null;
- static String tokenVocabulary;
-
-
-
-
- /** Set the token vocabulary to a tokentypes class
- generated by antlr.
- */
- public static void setTokenVocabulary(String s) {
- tokenVocabulary = s;
- }
-
-
-public void initialize(Token token) {
- CToken tok = (CToken) token;
- setText(tok.getText());
- setType(tok.getType());
- setLineNum(tok.getLine());
- setAttribute("source", tok.getSource());
- setAttribute("tokenNumber", new Integer(tok.getTokenNumber()));
-}
-public void initialize(AST tr) {
- TNode t = (TNode) tr;
- setText(t.getText());
- setType(t.getType());
- setLineNum(t.getLineNum());
- setDefNode(t.getDefNode());
- this.attributes = t.getAttributesTable();
-}
-
-
- /** Get the token type for this node */
- public int getType() { return ttype; }
-
- /** Set the token type for this node */
- public void setType(int ttype_) {
- ttype = ttype_;
- }
-
- /** Get the marker value for this node.
- This member is a general-use marker.
- */
- public boolean getMarker() { return marker; }
-
- /** Set the marker value for this node.
- This property is a general-use boolean marker.
- */
- public void setMarker(boolean marker_) {
- marker = marker_;
- }
-
- /** get the hashtable that holds attribute values.
- */
- public Hashtable getAttributesTable() {
- if(attributes == null)
- attributes = new Hashtable(7);
- return attributes;
- }
-
- /** set an attribute in the attribute table.
- */
- public void setAttribute(String attrName, Object value) {
- if(attributes == null)
- attributes = new Hashtable(7);
- attributes.put(attrName,value);
- }
-
- /** lookup the attribute name in the attribute table.
- If the value does not exist, it returns null.
- */
- public Object getAttribute(String attrName) {
- if(attributes == null)
- return null;
- else
- return attributes.get(attrName);
- }
-
- /** Get the line number for this node.
- If the line number is 0, search for a non-zero line num among children */
- public int getLineNum() {
- if(lineNum != 0)
- return lineNum;
- else
- if(down == null)
- return lineNum;
- else
- return ((TNode)down).getLocalLineNum();
- }
-
- public int getLocalLineNum() {
- if(lineNum != 0)
- return lineNum;
- else
- if(down == null)
- if(right == null)
- return lineNum;
- else
- return ((TNode)right).getLocalLineNum();
- else
- return ((TNode)down).getLocalLineNum();
- }
-
- /** Set the line number for this node */
- public void setLineNum(int lineNum_) {
- lineNum = lineNum_;
- }
-
- /** Get the token text for this node */
- public String getText() { return text; }
-
- /** Set the token text for this node */
- public void setText(String text_) {
- text = text_;
- }
-
- /** Returns the text for this node and all children */
- public String getAllChildrenText() {
- StringBuffer buf = new StringBuffer();
- buf.append(getText());
- for (TNode node = (TNode) getFirstChild(); node != null; node = (TNode) node.getNextSibling()) {
- buf.append(node.getText());
- }
- return buf.toString();
- }
-
- /** return the last child of this node, or null if there is none */
- public TNode getLastChild() {
- TNode down = (TNode)getFirstChild();
- if(down != null)
- return down.getLastSibling();
- else
- return null;
- }
-
- /** return the last sibling of this node, which is
- this if the next sibling is null */
- public TNode getLastSibling() {
- TNode next = (TNode)getNextSibling();
- if(next != null)
- return next.getLastSibling();
- else
- return this;
- }
-
- /** return the first sibling of this node, which is
- this if the prev sibling is null */
- public TNode getFirstSibling() {
- TNode prev = (TNode)left;
- if(prev != null)
- return prev.getFirstSibling();
- else
- return this;
- }
-
-
- /** return the parent node of this node */
- public TNode getParent() {
- return (TNode)getFirstSibling().up;
- }
-
-
- /** add the new node as a new sibling, inserting it ahead of any
- existing next sibling. This method maintains double-linking.
- if node is null, nothing happens. If the node has siblings,
- then they are added in as well.
- */
- public void addSibling(AST node) {
- if(node == null) return;
- TNode next = (TNode)right;
- right = (TNode)node;
- ((TNode)node).left = this;
- TNode nodeLastSib = ((TNode)node).getLastSibling();
- nodeLastSib.right = next;
- if(next != null)
- next.left = nodeLastSib;
- }
-
-
- /** return the number of children of this node */
- public int numberOfChildren() {
- int count = 0;
- AST child = getFirstChild();
- while(child != null) {
- count++;
- child = child.getNextSibling();
- }
- return count;
- }
-
-
- /** remove this node from the tree, resetting sibling and parent
- pointers as necessary. This method maintains double-linking */
- public void removeSelf() {
- TNode parent = (TNode)up;
- TNode prev = (TNode)left;
- TNode next = (TNode)right;
-
- if(parent != null) {
- parent.down = next;
- if(next != null) {
- next.up = parent;
- next.left = prev; // which should be null
- }
- }
- else {
- if(prev != null)
- prev.right = next;
- if(next != null)
- next.left = prev;
- }
- }
-
-
- /** return the def node for this node */
- public TNode getDefNode() {
- return defNode;
- }
-
- /** set the def node for this node */
- public void setDefNode(TNode n) {
- defNode = n;
- }
-
-
- /** return a deep copy of this node, and all sub nodes.
- New tree is doubleLinked, with no parent or siblings.
- Marker value is not copied!
- */
- public TNode deepCopy() {
- TNode copy = new TNode();
- copy.ttype = ttype;
- copy.text = text;
- copy.lineNum = lineNum;
- copy.defNode = defNode;
- if(attributes != null)
- copy.attributes = (Hashtable)attributes.clone();
- if(down != null)
- copy.down = ((TNode)down).deepCopyWithRightSiblings();
- copy.doubleLink();
- return copy;
- }
-
-
- /** return a deep copy of this node, all sub nodes,
- and right siblings.
- New tree is doubleLinked, with no parent or left siblings.
- defNode is not copied */
- public TNode deepCopyWithRightSiblings() {
- TNode copy = new TNode();
- copy.ttype = ttype;
- copy.text = text;
- copy.lineNum = lineNum;
- copy.defNode = defNode;
- if(attributes != null)
- copy.attributes = (Hashtable)attributes.clone();
- if(down != null)
- copy.down = ((TNode)down).deepCopyWithRightSiblings();
- if(right != null)
- copy.right = ((TNode)right).deepCopyWithRightSiblings();
- copy.doubleLink();
- return copy;
- }
-
-
- /** return a short string representation of the node */
- public String toString() {
- StringBuffer str = new StringBuffer( getNameForType(getType()) +
- "[" + getText() + ", " + "]");
-
- if(this.getLineNum() != 0)
- str.append(" line:" + (this.getLineNum() ) );
-
- Enumeration keys = (this.getAttributesTable().keys());
- while (keys.hasMoreElements()) {
- String key = (String) keys.nextElement();
- str.append(" " + key + ":" + (this.getAttribute(key)));
- }
-
- return str.toString();
- }
-
-
- /** print given tree to System.out */
- public static void printTree(AST t) {
- if (t == null) return;
- printASTNode(t,0);
- System.out.print("\n");
- }
-
-
- /** protected method that does the work of printing */
- protected static void printASTNode(AST t, int indent) {
- AST child1, next;
- child1 = t.getFirstChild();
-
- System.out.print("\n");
- for(int i = 0; i < indent; i++)
- System.out.print(" ");
-
- if(child1 != null)
- System.out.print("(");
-
- String s = t.getText();
- if(s != null && s.length() > 0) {
- System.out.print(getNameForType(t.getType()));
- System.out.print(": \"" + s + "\"");
- }
- else
- System.out.print(getNameForType(t.getType()));
- if(((TNode)t).getLineNum() != 0)
- System.out.print(" line:" + ((TNode)t).getLineNum() );
-
- Enumeration keys = ((TNode)t).getAttributesTable().keys();
- while (keys.hasMoreElements()) {
- String key = (String) keys.nextElement();
- System.out.print(" " + key + ":" + ((TNode)t).getAttribute(key));
- }
- TNode def = ((TNode)t).getDefNode();
- if(def != null)
- System.out.print("[" + getNameForType(def.getType()) + "]");
-
-
- if(child1 != null) {
- printASTNode(child1,indent + 1);
-
- System.out.print("\n");
- for(int i = 0; i < indent; i++)
- System.out.print(" ");
- System.out.print(")");
- }
-
- next = t.getNextSibling();
- if(next != null) {
- printASTNode(next,indent);
- }
- }
-
- /** converts an int tree token type to a name.
- Does this by reflecting on nsdidl.IDLTreeTokenTypes,
- and is dependent on how ANTLR 2.00 outputs that class. */
- public static String getNameForType(int t) {
- try{
- Class c = Class.forName(tokenVocabulary);
- Field[] fields = c.getDeclaredFields();
- if(t-2 < fields.length)
- return fields[t-2].getName();
- } catch (Exception e) { System.out.println(e); }
- return "unfoundtype: " + t;
- }
-
-
- /** set up reverse links between this node and its first
- child and its first sibling, and link those as well */
- public void doubleLink() {
- TNode right = (TNode)getNextSibling();
- if(right != null) {
- right.left = this;
- right.doubleLink();
- }
- TNode down = (TNode)getFirstChild();
- if(down != null) {
- down.up = this;
- down.doubleLink();
- }
- }
-
- /** find first parent of the given type,
- return null on failure */
- public TNode parentOfType(int type) {
- if(up == null) {
- if(left == null)
- return null;
- else
- return left.parentOfType(type);
- }
- if(up.getType() == type)
- return up;
- return up.parentOfType(type);
- }
-
- /** find the first child of the node
- of the given type, return null on failure */
- public TNode firstChildOfType(int type) {
- TNode down = (TNode)getFirstChild();
- if(down == null)
- return null;
- if(down.getType() == type)
- return down;
- return down.firstSiblingOfType(type);
- }
-
- /** find the first sibling of the node
- of the given type, return null on failure */
- public TNode firstSiblingOfType(int type) {
- TNode right = (TNode)getNextSibling();
- if(right == null)
- return null;
- if(right.getType() == type)
- return right;
- return right.firstSiblingOfType(type);
- }
-
-}
diff --git a/src/java/com/sun/gluegen/cgram/TNodeFactory.java b/src/java/com/sun/gluegen/cgram/TNodeFactory.java
deleted file mode 100644
index 4523632..0000000
--- a/src/java/com/sun/gluegen/cgram/TNodeFactory.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.sun.gluegen.cgram;
-
-import antlr.Token;
-import antlr.ASTFactory;
-import antlr.collections.AST;
-
-/** This class extends ASTFactory to build instances
- of class TNode */
-public class TNodeFactory extends ASTFactory {
-
- /** Create a new ampty AST node */
- public AST create() {
- return new TNode();
- }
-
- /** Create a new AST node from type and text */
- public AST create(int ttype, String text) {
- AST ast = new TNode();
- ast.setType(ttype);
- ast.setText(text);
- return ast;
- }
-
- /** Create a new AST node from an existing AST node */
- public AST create(AST ast) {
- AST newast = new TNode();
- newast.setType(ast.getType());
- newast.setText(ast.getText());
- return newast;
- }
-
-
-}
diff --git a/src/java/com/sun/gluegen/cgram/types/ArrayType.java b/src/java/com/sun/gluegen/cgram/types/ArrayType.java
deleted file mode 100644
index 0e23d35..0000000
--- a/src/java/com/sun/gluegen/cgram/types/ArrayType.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (c) 2003 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.cgram.types;
-
-/** Represents an array type. This differs from a pointer type in C
- syntax by the use of "[]" rather than "*". The length may or may
- not be known; if the length is unknown then a negative number
- should be passed in to the constructor. */
-
-public class ArrayType extends Type {
- private Type elementType;
- private int length;
- private String computedName;
-
- public ArrayType(Type elementType, SizeThunk sizeInBytes, int length, int cvAttributes) {
- super(elementType.getName() + " *", sizeInBytes, cvAttributes);
- this.elementType = elementType;
- this.length = length;
- }
-
- public boolean equals(Object arg) {
- if (arg == this) return true;
- if (arg == null || (!(arg instanceof ArrayType))) {
- return false;
- }
- ArrayType t = (ArrayType) arg;
- return (super.equals(arg) && elementType.equals(t.elementType) && (length == t.length));
- }
-
- public String getName(boolean includeCVAttrs) {
- // Lazy computation of name due to lazy setting of compound type
- // names during parsing
- // Note: don't think cvAttributes can be set for array types (unlike pointer types)
- if (computedName == null) {
- computedName = elementType.getName() + " *";
- computedName = computedName.intern();
- }
- return computedName;
- }
-
- public ArrayType asArray() { return this; }
-
- public Type getElementType() { return elementType; }
- public int getLength() { return length; }
- public boolean hasLength() { return length >= 0; }
-
- /** Return the bottommost element type if this is a multidimensional
- array. */
- public Type getBaseElementType() {
- ArrayType t = this;
- while (t.getElementType().isArray()) {
- t = t.getElementType().asArray();
- }
- return t.getElementType();
- }
-
- /** Recompute the size of this array if necessary. This needs to be
- done when the base element type is a compound type. */
- public void recomputeSize() {
- ArrayType arrayElementType = getElementType().asArray();
- if (arrayElementType != null) {
- arrayElementType.recomputeSize();
- }
- // FIXME: this doesn't take into account struct alignment, which may be necessary
- // See also FIXME below and in HeaderParser.g
- super.setSize(SizeThunk.mul(SizeThunk.constant(getLength()), elementType.getSize()));
- }
-
- public String toString() {
- return toString(null);
- }
-
- public String toString(String variableName) {
- StringBuffer buf = new StringBuffer();
- buf.append(elementType.getName());
- if (variableName != null) {
- buf.append(" ");
- buf.append(variableName);
- }
- buf.append("[");
- buf.append(length);
- buf.append("]");
- return buf.toString();
- }
-
- public void visit(TypeVisitor arg) {
- super.visit(arg);
- elementType.visit(arg);
- }
-
- Type newCVVariant(int cvAttributes) {
- return new ArrayType(elementType, getSize(), length, cvAttributes);
- }
-}
diff --git a/src/java/com/sun/gluegen/cgram/types/BitType.java b/src/java/com/sun/gluegen/cgram/types/BitType.java
deleted file mode 100644
index 293eb39..0000000
--- a/src/java/com/sun/gluegen/cgram/types/BitType.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2003 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.cgram.types;
-
-/** Represents a bitfield in a struct. */
-
-public class BitType extends IntType {
- private IntType underlyingType;
- private int sizeInBits;
- private int offset;
-
- public BitType(IntType underlyingType, int sizeInBits, int lsbOffset, int cvAttributes) {
- super(underlyingType.getName(), underlyingType.getSize(), underlyingType.isUnsigned(), cvAttributes);
- this.underlyingType = underlyingType;
- this.sizeInBits = sizeInBits;
- this.offset = lsbOffset;
- }
-
- public boolean equals(Object arg) {
- if (arg == this) return true;
- if (arg == null || (!(arg instanceof BitType))) {
- return false;
- }
- BitType t = (BitType) arg;
- return (super.equals(arg) && underlyingType.equals(t.underlyingType) &&
- (sizeInBits == t.sizeInBits) && (offset == t.offset));
- }
-
- public BitType asBit() { return this; }
-
- /** Size in bits of this type. */
- public int getSizeInBits() {
- return sizeInBits;
- }
-
- /** Offset from the least-significant bit (LSB) of the LSB of this
- type */
- public int getOffset() {
- return offset;
- }
-
- public void visit(TypeVisitor arg) {
- super.visit(arg);
- underlyingType.visit(arg);
- }
-
- Type newCVVariant(int cvAttributes) {
- return new BitType(underlyingType, sizeInBits, offset, cvAttributes);
- }
-}
diff --git a/src/java/com/sun/gluegen/cgram/types/CVAttributes.java b/src/java/com/sun/gluegen/cgram/types/CVAttributes.java
deleted file mode 100644
index 589904b..0000000
--- a/src/java/com/sun/gluegen/cgram/types/CVAttributes.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2003 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.cgram.types;
-
-/** Enumeration for const/volatile attributes. These are passed in to
- the constructor of the type. */
-
-public interface CVAttributes {
- public static final int CONST = 0x01;
- public static final int VOLATILE = 0x02;
-}
diff --git a/src/java/com/sun/gluegen/cgram/types/CompoundType.java b/src/java/com/sun/gluegen/cgram/types/CompoundType.java
deleted file mode 100644
index 28d7b76..0000000
--- a/src/java/com/sun/gluegen/cgram/types/CompoundType.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright (c) 2003 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.cgram.types;
-
-import java.util.*;
-
-/** Models all compound types, i.e., those containing fields: structs
- and unions. The boolean type accessors indicate how the type is
- really defined. */
-
-public class CompoundType extends Type {
- private CompoundTypeKind kind;
- // The name "foo" in the construct "struct foo { ... }";
- private String structName;
- private ArrayList fields;
- private boolean visiting;
- private boolean bodyParsed;
- private boolean computedHashcode;
- private int hashcode;
-
- public CompoundType(String name, SizeThunk size, CompoundTypeKind kind, int cvAttributes) {
- this(name, size, kind, cvAttributes, null);
- }
-
- private CompoundType(String name, SizeThunk size, CompoundTypeKind kind, int cvAttributes, String structName) {
- super(name, size, cvAttributes);
- assert kind != null;
- this.kind = kind;
- this.structName = structName;
- }
-
- public int hashCode() {
- if (computedHashcode) {
- return hashcode;
- }
-
- if (structName != null) {
- hashcode = structName.hashCode();
- } else if (getName() != null) {
- hashcode = getName().hashCode();
- } else {
- hashcode = 0;
- }
-
- computedHashcode = true;
- return hashcode;
- }
-
- public boolean equals(Object arg) {
- if (arg == this) return true;
- if (arg == null || (!(arg instanceof CompoundType))) {
- return false;
- }
- CompoundType t = (CompoundType) arg;
- return (super.equals(arg) &&
- (structName == t.structName || (structName != null && structName.equals(t.structName))) &&
- kind == t.kind &&
- listsEqual(fields, t.fields));
- }
-
- /** Returns the struct name of this CompoundType, i.e. the "foo" in
- the construct "struct foo { ... };". */
- public String getStructName() {
- return structName;
- }
-
- /** Sets the struct name of this CompoundType, i.e. the "foo" in the
- construct "struct foo { ... };". */
- public void setStructName(String structName) {
- this.structName = structName;
- }
-
- public void setSize(SizeThunk size) {
- super.setSize(size);
- }
-
- public CompoundType asCompound() { return this; }
-
- /** Returns the number of fields in this type. */
- public int getNumFields() {
- return ((fields == null) ? 0 : fields.size());
- }
-
- /** Returns the <i>i</i>th field of this type. */
- public Field getField(int i) {
- return (Field) fields.get(i);
- }
-
- /** Adds a field to this type. */
- public void addField(Field f) {
- if (bodyParsed) {
- throw new RuntimeException("Body of this CompoundType has already been parsed; should not be adding more fields");
- }
- if (fields == null) {
- fields = new ArrayList();
- }
- fields.add(f);
- }
-
- /** Indicates to this CompoundType that its body has been parsed and
- that no more {@link #addField} operations will be made. */
- public void setBodyParsed() {
- bodyParsed = true;
- }
-
- /** Indicates whether this type was declared as a struct. */
- public boolean isStruct() { return (kind == CompoundTypeKind.STRUCT); }
- /** Indicates whether this type was declared as a union. */
- public boolean isUnion() { return (kind == CompoundTypeKind.UNION); }
-
- public String toString() {
- String cvAttributesString = getCVAttributesString();
- if (getName() != null) {
- return cvAttributesString + getName();
- } else if (getStructName() != null) {
- return cvAttributesString + "struct " + getStructName();
- } else {
- return cvAttributesString + getStructString();
- }
- }
-
- public void visit(TypeVisitor arg) {
- if (visiting) {
- return;
- }
- try {
- visiting = true;
- super.visit(arg);
- int n = getNumFields();
- for (int i = 0; i < n; i++) {
- Field f = getField(i);
- f.getType().visit(arg);
- }
- } finally {
- visiting = false;
- }
- }
-
- public String getStructString() {
- if (visiting) {
- if (getName() != null) {
- return getName();
- }
- return "struct {/*Recursive type reference*/}";
- }
-
- try {
- visiting = true;
- String kind = (isStruct() ? "struct {" : "union {");
- StringBuffer res = new StringBuffer();
- res.append(kind);
- int n = getNumFields();
- for (int i = 0; i < n; i++) {
- res.append(" ");
- res.append(getField(i));
- }
- res.append(" }");
- return res.toString();
- } finally {
- visiting = false;
- }
- }
-
- Type newCVVariant(int cvAttributes) {
- CompoundType t = new CompoundType(getName(), getSize(), kind, cvAttributes, structName);
- t.fields = fields;
- return t;
- }
-}
diff --git a/src/java/com/sun/gluegen/cgram/types/CompoundTypeKind.java b/src/java/com/sun/gluegen/cgram/types/CompoundTypeKind.java
deleted file mode 100644
index 8df12ac..0000000
--- a/src/java/com/sun/gluegen/cgram/types/CompoundTypeKind.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2003 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.cgram.types;
-
-/** Type-safe enum for discriminating between structs and unions,
- which are both represented as compound types. */
-
-public class CompoundTypeKind {
- public static final CompoundTypeKind STRUCT = new CompoundTypeKind();
- public static final CompoundTypeKind UNION = new CompoundTypeKind();
-
- private CompoundTypeKind() {}
-}
diff --git a/src/java/com/sun/gluegen/cgram/types/DoubleType.java b/src/java/com/sun/gluegen/cgram/types/DoubleType.java
deleted file mode 100644
index 6d6e62c..0000000
--- a/src/java/com/sun/gluegen/cgram/types/DoubleType.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2003 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.cgram.types;
-
-/** Represents a double-word floating-point type (C type "double".) */
-
-public class DoubleType extends PrimitiveType {
- public DoubleType(String name, SizeThunk size, int cvAttributes) {
- super(name, size, cvAttributes);
- }
-
- public boolean equals(Object arg) {
- if (arg == this) {
- return true;
- }
- if (arg == null || (!(arg instanceof DoubleType))) {
- return false;
- }
- return super.equals(arg);
- }
-
- public DoubleType asDouble() { return this; }
-
- Type newCVVariant(int cvAttributes) {
- return new DoubleType(getName(), getSize(), cvAttributes);
- }
-}
diff --git a/src/java/com/sun/gluegen/cgram/types/EnumType.java b/src/java/com/sun/gluegen/cgram/types/EnumType.java
deleted file mode 100644
index 717d389..0000000
--- a/src/java/com/sun/gluegen/cgram/types/EnumType.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (c) 2003 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.cgram.types;
-
-import java.util.*;
-
-/** Describes enumerated types. Enumerations are like ints except that
- they have a set of named values. */
-
-public class EnumType extends IntType {
- private IntType underlyingType;
-
- private static class Enum {
- String name;
- long value;
- Enum(String name, long value) {
- this.name = name;
- this.value = value;
- }
-
- String getName() { return name; }
- long getValue() { return value; }
- }
- private List/*<Enum>*/ enums;
-
- public EnumType(String name) {
- super(name, SizeThunk.LONG, false, CVAttributes.CONST );
- this.underlyingType = new IntType(name, SizeThunk.LONG, false, CVAttributes.CONST);
- }
-
- public EnumType(String name, SizeThunk enumSizeInBytes) {
- super(name, enumSizeInBytes, false, CVAttributes.CONST );
- this.underlyingType = new IntType(name, enumSizeInBytes, false, CVAttributes.CONST);
- }
-
- protected EnumType(String name, IntType underlyingType, int cvAttributes) {
- super(name, underlyingType.getSize(), underlyingType.isUnsigned(), cvAttributes);
- this.underlyingType = underlyingType;
- }
-
- public boolean equals(Object arg) {
- if (arg == this) return true;
- if (arg == null || (!(arg instanceof EnumType))) {
- return false;
- }
- EnumType t = (EnumType) arg;
- return (super.equals(arg) &&
- underlyingType.equals(t.underlyingType) &&
- listsEqual(enums, t.enums));
- }
-
- public EnumType asEnum() { return this; }
-
- public void addEnum(String name, long val) {
- if (enums == null) {
- enums = new ArrayList();
- }
- enums.add(new Enum(name, val));
- }
-
- /** Number of enumerates defined in this enum. */
- public int getNumEnumerates() { return enums.size(); }
- /** Fetch <i>i</i>th (0..getNumEnumerates() - 1) name */
- public String getEnumName(int i) { return ((Enum) enums.get(i)).getName(); }
- /** Fetch <i>i</i>th (0..getNumEnumerates() - 1) value */
- public long getEnumValue(int i) { return ((Enum) enums.get(i)).getValue(); }
- /** Fetch the value of the enumerate with the given name. */
- public long getEnumValue(String name) {
- for (int i = 0; i < enums.size(); ++i) {
- Enum n = ((Enum)enums.get(i));
- if (n.getName().equals(name)) { return n.getValue(); }
- }
- throw new NoSuchElementException(
- "No enumerate named \"" + name + "\" in EnumType \"" +
- getName() + "\"");
- }
- /** Does this enum type contain an enumerate with the given name? */
- public boolean containsEnumerate(String name) {
- for (int i = 0; i < enums.size(); ++i) {
- if (((Enum)enums.get(i)).getName().equals(name)) { return true; }
- }
- return false;
- }
- /** Remove the enumerate with the given name. Returns true if it was found
- * and removed; false if it was not found.
- */
- public boolean removeEnumerate(String name) {
- for (int i = 0; i < enums.size(); ++i) {
- Enum e = (Enum)enums.get(i);
- if (e.getName().equals(name)) {
- enums.remove(e);
- return true;
- }
- }
- return false;
- }
-
- public void visit(TypeVisitor arg) {
- super.visit(arg);
- underlyingType.visit(arg);
- }
-
- Type newCVVariant(int cvAttributes) {
- EnumType t = new EnumType(getName(), underlyingType, cvAttributes);
- t.enums = enums;
- return t;
- }
-}
diff --git a/src/java/com/sun/gluegen/cgram/types/Field.java b/src/java/com/sun/gluegen/cgram/types/Field.java
deleted file mode 100644
index 996d716..0000000
--- a/src/java/com/sun/gluegen/cgram/types/Field.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (c) 2003 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.cgram.types;
-
-/** Represents a field in a struct or union. */
-
-public class Field {
- private String name;
- private Type type;
- private SizeThunk offset;
-
- public Field(String name, Type type, SizeThunk offset) {
- this.name = name;
- this.type = type;
- this.offset = offset;
- }
-
- public int hashCode() {
- return name.hashCode();
- }
-
- public boolean equals(Object arg) {
- if (arg == null || (!(arg instanceof Field))) {
- return false;
- }
-
- Field f = (Field) arg;
- // Note: don't know how to examine offset any more since it's
- // implemented in terms of code and they're not canonicalized
- return (((name != null && name.equals(f.name)) ||
- (name == null && f.name == null)) &&
- type.equals(f.type));
- }
-
- /** Name of this field in the containing data structure. */
- public String getName() { return name; }
-
- /** Type of this field. */
- public Type getType() { return type; }
-
- /** SizeThunk computing offset, in bytes, of this field in the containing data structure. */
- public SizeThunk getOffset() { return offset; }
-
- /** Offset, in bytes, of this field in the containing data structure
- given the specified MachineDescription. */
- public long getOffset(MachineDescription machDesc) { return offset.compute(machDesc); }
-
- /** Sets the offset of this field in the containing data structure. */
- public void setOffset(SizeThunk offset) { this.offset = offset; }
-
- public String toString() {
- if (!getType().isFunctionPointer()) {
- if (getName() == null &&
- getType().asCompound() != null &&
- getType().asCompound().isUnion()) {
- return "" + getType() + ";";
- }
- return "" + getType() + " " + getName() + ";";
- } else {
- FunctionType ft = getType().asPointer().getTargetType().asFunction();
- return ft.toString(getName(), false, true) + ";";
- }
- }
-}
diff --git a/src/java/com/sun/gluegen/cgram/types/FloatType.java b/src/java/com/sun/gluegen/cgram/types/FloatType.java
deleted file mode 100644
index 7a6fa4d..0000000
--- a/src/java/com/sun/gluegen/cgram/types/FloatType.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2003 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.cgram.types;
-
-/** Represents a single-word floating-point type (C type "float".) */
-
-public class FloatType extends PrimitiveType {
- public FloatType(String name, SizeThunk size, int cvAttributes) {
- super(name, size, cvAttributes);
- }
-
- public boolean equals(Object arg) {
- if (arg == this) {
- return true;
- }
- if (arg == null || (!(arg instanceof FloatType))) {
- return false;
- }
- return super.equals(arg);
- }
-
- public FloatType asFloat() { return this; }
-
- Type newCVVariant(int cvAttributes) {
- return new FloatType(getName(), getSize(), cvAttributes);
- }
-}
diff --git a/src/java/com/sun/gluegen/cgram/types/FunctionSymbol.java b/src/java/com/sun/gluegen/cgram/types/FunctionSymbol.java
deleted file mode 100644
index bc54538..0000000
--- a/src/java/com/sun/gluegen/cgram/types/FunctionSymbol.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (c) 2003 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.cgram.types;
-
-import java.util.*;
-
-/** Describes a function symbol, which includes the name and
- type. Since we are currently only concerned with processing
- functions this is the only symbol type, though plausibly more
- types should be added and a true symbol table constructed during
- parsing. */
-
-public class FunctionSymbol {
- private String name;
- private FunctionType type;
-
- public FunctionSymbol(String name, FunctionType type) {
- this.name = name;
- this.type = type;
- }
-
- public String getName() { return name; }
-
- /** Returns the type of this function. Do not add arguments to it
- directly; use addArgument instead. */
- public FunctionType getType() { return type; }
-
- /** Returns the return type of this function. */
- public Type getReturnType() { return type.getReturnType(); }
-
- public int getNumArguments() { return type.getNumArguments(); }
-
- /** Returns the name of the <i>i</i>th argument. May return null if
- no argument names were available during parsing. */
- public String getArgumentName(int i) {
- return type.getArgumentName(i);
- }
-
- /** Returns the type of the <i>i</i>th argument. */
- public Type getArgumentType(int i) {
- return type.getArgumentType(i);
- }
-
- /** Add an argument's name and type. Use null for unknown argument
- names. */
- public void addArgument(Type argumentType, String argumentName) {
- type.addArgument(argumentType, argumentName);
- }
-
- public String toString() {
- return getType().toString(getName());
- }
-
- /** Helper routine for emitting native javadoc tags */
- public String toString(boolean emitNativeTag) {
- return getType().toString(getName(), emitNativeTag);
- }
-
- public int hashCode() {
- if (name == null) {
- return 0;
- }
- return name.hashCode();
- }
-
- public boolean equals(Object arg) {
- if (arg == this) {
- return true;
- }
-
- if (arg == null || (!(arg instanceof FunctionSymbol))) {
- return false;
- }
-
- FunctionSymbol other = (FunctionSymbol) arg;
- return (
- (getName() == other.getName() || getName().equals(other.getName()))
- && type.equals(other.type));
- }
-}
diff --git a/src/java/com/sun/gluegen/cgram/types/FunctionType.java b/src/java/com/sun/gluegen/cgram/types/FunctionType.java
deleted file mode 100644
index e109121..0000000
--- a/src/java/com/sun/gluegen/cgram/types/FunctionType.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (c) 2003 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.cgram.types;
-
-import java.util.*;
-
-/** Describes a function type, used to model both function
- declarations and (via PointerType) function pointers. */
-
-public class FunctionType extends Type {
- private Type returnType;
- private ArrayList argumentTypes;
- private ArrayList argumentNames;
-
- public FunctionType(String name, SizeThunk size, Type returnType, int cvAttributes) {
- super(name, size, cvAttributes);
- this.returnType = returnType;
- }
-
- public boolean equals(Object arg) {
- if (arg == this) return true;
- if (arg == null || (!(arg instanceof FunctionType))) {
- return false;
- }
- FunctionType t = (FunctionType) arg;
- return (super.equals(arg) &&
- returnType.equals(t.returnType) &&
- listsEqual(argumentTypes, t.argumentTypes));
- }
-
- public FunctionType asFunction() { return this; }
-
- /** Returns the return type of this function. */
- public Type getReturnType() { return returnType; }
-
- public int getNumArguments() { return ((argumentTypes == null) ? 0 : argumentTypes.size()); }
-
- /** Returns the name of the <i>i</i>th argument. May return null if
- no argument names were available during parsing. */
- public String getArgumentName(int i) {
- return (String) argumentNames.get(i);
- }
-
- /** Returns the type of the <i>i</i>th argument. */
- public Type getArgumentType(int i) {
- return (Type) argumentTypes.get(i);
- }
-
- /** Add an argument's name and type. Use null for unknown argument
- names. */
- public void addArgument(Type argumentType, String argumentName) {
- if (argumentTypes == null) {
- argumentTypes = new ArrayList();
- argumentNames = new ArrayList();
- }
- argumentTypes.add(argumentType);
- argumentNames.add(argumentName);
- }
-
- public void setArgumentName(int i, String name)
- {
- argumentNames.set(i,name);
- }
-
- public String toString() {
- return toString(null);
- }
-
- public String toString(String functionName) {
- return toString(functionName, false);
- }
-
- public String toString(String functionName, boolean emitNativeTag) {
- return toString(functionName, emitNativeTag, false);
- }
-
- String toString(String functionName, boolean emitNativeTag, boolean isPointer) {
- StringBuffer res = new StringBuffer();
- res.append(getReturnType());
- res.append(" ");
- if (isPointer) {
- res.append("(*");
- }
- if (functionName != null) {
- if (emitNativeTag) {
- // Emit @native tag for javadoc purposes
- res.append("{@native ");
- }
- res.append(functionName);
- if (emitNativeTag) {
- res.append("}");
- }
- }
- if (isPointer) {
- res.append(")");
- }
- res.append("(");
- int n = getNumArguments();
- for (int i = 0; i < n; i++) {
- Type t = getArgumentType(i);
- if (t.isFunctionPointer()) {
- FunctionType ft = t.asPointer().getTargetType().asFunction();
- res.append(ft.toString(getArgumentName(i), false, true));
- } else if (t.isArray()) {
- res.append(t.asArray().toString(getArgumentName(i)));
- } else {
- res.append(t);
- String argumentName = getArgumentName(i);
- if (argumentName != null) {
- res.append(" ");
- res.append(argumentName);
- }
- }
- if (i < n - 1) {
- res.append(", ");
- }
- }
- res.append(")");
- if (!isPointer) {
- res.append(";");
- }
- return res.toString();
- }
-
- public void visit(TypeVisitor arg) {
- super.visit(arg);
- returnType.visit(arg);
- int n = getNumArguments();
- for (int i = 0; i < n; i++) {
- getArgumentType(i).visit(arg);
- }
- }
-
- Type newCVVariant(int cvAttributes) {
- // Functions don't have const/volatile attributes
- return this;
- }
-}
diff --git a/src/java/com/sun/gluegen/cgram/types/IntType.java b/src/java/com/sun/gluegen/cgram/types/IntType.java
deleted file mode 100644
index acd6a3d..0000000
--- a/src/java/com/sun/gluegen/cgram/types/IntType.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2003 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.cgram.types;
-
-public class IntType extends PrimitiveType {
- private boolean unsigned;
- private boolean typedefedUnsigned;
-
- public IntType(String name, SizeThunk size, boolean unsigned, int cvAttributes) {
- this(name, size, unsigned, cvAttributes, false);
- }
-
- private IntType(String name, SizeThunk size, boolean unsigned, int cvAttributes, boolean typedefedUnsigned) {
- super(name, size, cvAttributes);
- this.unsigned = unsigned;
- this.typedefedUnsigned = typedefedUnsigned;
- }
-
- public boolean equals(Object arg) {
- if (arg == this) return true;
- if (arg == null || (!(arg instanceof IntType))) {
- return false;
- }
- IntType t = (IntType) arg;
- return (super.equals(arg) && (unsigned == t.unsigned));
- }
-
- public void setName(String name) {
- super.setName(name);
- typedefedUnsigned = unsigned;
- }
-
- public IntType asInt() { return this; }
-
- /** Indicates whether this type is unsigned */
- public boolean isUnsigned() { return unsigned; }
-
- public String toString() {
- return getCVAttributesString() + ((isUnsigned() & (!typedefedUnsigned)) ? "unsigned " : "") + getName();
- }
-
- Type newCVVariant(int cvAttributes) {
- return new IntType(getName(), getSize(), isUnsigned(), cvAttributes, typedefedUnsigned);
- }
-}
diff --git a/src/java/com/sun/gluegen/cgram/types/MachineDescription.java b/src/java/com/sun/gluegen/cgram/types/MachineDescription.java
deleted file mode 100644
index b3aaf53..0000000
--- a/src/java/com/sun/gluegen/cgram/types/MachineDescription.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2003 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.cgram.types;
-
-public class MachineDescription {
- private int charSizeInBytes;
- private int shortSizeInBytes;
- private int intSizeInBytes;
- private int longSizeInBytes;
- private int int64SizeInBytes;
- private int floatSizeInBytes;
- private int doubleSizeInBytes;
- private int pointerSizeInBytes;
- private int structAlignmentInBytes;
-
- public MachineDescription(int charSizeInBytes,
- int shortSizeInBytes,
- int intSizeInBytes,
- int longSizeInBytes,
- int int64SizeInBytes,
- int floatSizeInBytes,
- int doubleSizeInBytes,
- int pointerSizeInBytes,
- int structAlignmentInBytes) {
- this.charSizeInBytes = charSizeInBytes;
- this.shortSizeInBytes = shortSizeInBytes;
- this.intSizeInBytes = intSizeInBytes;
- this.longSizeInBytes = longSizeInBytes;
- this.int64SizeInBytes = int64SizeInBytes;
- this.floatSizeInBytes = floatSizeInBytes;
- this.doubleSizeInBytes = doubleSizeInBytes;
- this.pointerSizeInBytes = pointerSizeInBytes;
- this.structAlignmentInBytes = structAlignmentInBytes;
- }
-
- public int charSizeInBytes() { return charSizeInBytes; }
- public int shortSizeInBytes() { return shortSizeInBytes; }
- public int intSizeInBytes() { return intSizeInBytes; }
- public int longSizeInBytes() { return longSizeInBytes; }
- public int int64SizeInBytes() { return int64SizeInBytes; }
- public int floatSizeInBytes() { return floatSizeInBytes; }
- public int doubleSizeInBytes() { return doubleSizeInBytes; }
- public int pointerSizeInBytes() { return pointerSizeInBytes; }
- public int structAlignmentInBytes() { return structAlignmentInBytes; }
-}
diff --git a/src/java/com/sun/gluegen/cgram/types/MachineDescription32Bit.java b/src/java/com/sun/gluegen/cgram/types/MachineDescription32Bit.java
deleted file mode 100644
index 7b8f12d..0000000
--- a/src/java/com/sun/gluegen/cgram/types/MachineDescription32Bit.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (c) 2003 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.cgram.types;
-
-public class MachineDescription32Bit extends MachineDescription {
- public MachineDescription32Bit() {
- super(1, 2, 4, 4, 8, 4, 8, 4, 8);
- }
-}
diff --git a/src/java/com/sun/gluegen/cgram/types/MachineDescription64Bit.java b/src/java/com/sun/gluegen/cgram/types/MachineDescription64Bit.java
deleted file mode 100644
index 1036399..0000000
--- a/src/java/com/sun/gluegen/cgram/types/MachineDescription64Bit.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (c) 2003 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.cgram.types;
-
-public class MachineDescription64Bit extends MachineDescription {
- public MachineDescription64Bit() {
- super(1, 2, 4, 8, 8, 4, 8, 8, 16);
- }
-}
diff --git a/src/java/com/sun/gluegen/cgram/types/PointerType.java b/src/java/com/sun/gluegen/cgram/types/PointerType.java
deleted file mode 100644
index 6202505..0000000
--- a/src/java/com/sun/gluegen/cgram/types/PointerType.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (c) 2003 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.cgram.types;
-
-public class PointerType extends Type {
- private Type targetType;
- private String computedName;
- private boolean hasTypedefedName;
-
- public PointerType(SizeThunk size, Type targetType, int cvAttributes) {
- // can pass null for the final name parameter because the PointerType's getName()
- // completely replaces superclass behavior
- this(size, targetType, cvAttributes, false, null);
- }
-
- private PointerType(SizeThunk size, Type targetType, int cvAttributes, boolean hasTypedefedName, String typedefedName) {
- super(targetType.getName() + " *", size, cvAttributes);
- this.hasTypedefedName = false;
- this.targetType = targetType;
- if (hasTypedefedName) {
- setName(typedefedName);
- }
- }
-
- public int hashCode() {
- return targetType.hashCode();
- }
-
- public boolean equals(Object arg) {
- if (arg == this) return true;
- if (arg == null || (!(arg instanceof PointerType))) {
- return false;
- }
- PointerType t = (PointerType) arg;
- // Note we ignore the name of this type (which might be a typedef
- // name) for comparison purposes because this is what allows
- // e.g. a newly-fabricated type "PIXELFORMATDESCRIPTOR *" to be
- // canonicalized to e.g. "LPPIXELFORMATDESCRIPTOR"
- return ((getSize() == t.getSize()) &&
- (getCVAttributes() == t.getCVAttributes()) &&
- targetType.equals(t.targetType));
- }
-
- public void setName(String name) {
- super.setName(name);
- hasTypedefedName = true;
- }
-
- public String getName(boolean includeCVAttrs) {
- if (hasTypedefedName) {
- return super.getName(includeCVAttrs);
- } else {
- // Lazy computation of name due to lazy setting of compound type
- // names during parsing
- if (computedName == null) {
- computedName = targetType.getName(includeCVAttrs) + " *";
- computedName = computedName.intern();
- }
- if (!includeCVAttrs) {
- return computedName;
- }
- return targetType.getName(includeCVAttrs) + " * " + getCVAttributesString();
- }
- }
-
- public boolean hasTypedefedName() {
- return hasTypedefedName;
- }
-
- public PointerType asPointer() { return this; }
-
- public Type getTargetType() { return targetType; }
-
- public boolean isFunctionPointer() { return targetType.isFunction(); }
-
- public String toString() {
- if (hasTypedefedName) {
- return super.getName(true);
- } else {
- if (!targetType.isFunction()) {
- return targetType.toString() + " * " + getCVAttributesString();
- }
- return toString(null); // this is a pointer to an unnamed function
- }
- }
-
- /** For use only when printing function pointers */
- public String toString(String functionName) {
- if (!targetType.isFunction()) {
- throw new RuntimeException("<Internal error or misuse> This method is only for use when printing function pointers");
- }
- return ((FunctionType) targetType).toString(functionName, false, true);
- }
-
- public void visit(TypeVisitor arg) {
- super.visit(arg);
- targetType.visit(arg);
- }
-
- Type newCVVariant(int cvAttributes) {
- return new PointerType(getSize(), targetType, cvAttributes, hasTypedefedName, (hasTypedefedName ? getName() : null));
- }
-}
diff --git a/src/java/com/sun/gluegen/cgram/types/PrimitiveType.java b/src/java/com/sun/gluegen/cgram/types/PrimitiveType.java
deleted file mode 100644
index 80dab9a..0000000
--- a/src/java/com/sun/gluegen/cgram/types/PrimitiveType.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2003 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.cgram.types;
-
-public abstract class PrimitiveType extends Type {
- protected PrimitiveType(String name, SizeThunk size, int cvAttributes) {
- super(name, size, cvAttributes);
- }
-
- public boolean isPrimitive() {
- return true;
- }
-}
diff --git a/src/java/com/sun/gluegen/cgram/types/SizeThunk.java b/src/java/com/sun/gluegen/cgram/types/SizeThunk.java
deleted file mode 100755
index 74feef9..0000000
--- a/src/java/com/sun/gluegen/cgram/types/SizeThunk.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (c) 2005 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.cgram.types;
-
-/** Provides a level of indirection between the definition of a type's
- size and the absolute value of this size. Necessary when
- generating glue code for two different CPU architectures (e.g.,
- 32-bit and 64-bit) from the same internal representation of the
- various types involved. */
-
-public abstract class SizeThunk {
- // Private constructor because there are only a few of these
- private SizeThunk() {}
-
- public abstract long compute(MachineDescription machDesc);
-
- public static final SizeThunk CHAR = new SizeThunk() {
- public long compute(MachineDescription machDesc) {
- return machDesc.charSizeInBytes();
- }
- };
-
- public static final SizeThunk SHORT = new SizeThunk() {
- public long compute(MachineDescription machDesc) {
- return machDesc.shortSizeInBytes();
- }
- };
-
- public static final SizeThunk INT = new SizeThunk() {
- public long compute(MachineDescription machDesc) {
- return machDesc.intSizeInBytes();
- }
- };
-
- public static final SizeThunk LONG = new SizeThunk() {
- public long compute(MachineDescription machDesc) {
- return machDesc.longSizeInBytes();
- }
- };
-
- public static final SizeThunk INT64 = new SizeThunk() {
- public long compute(MachineDescription machDesc) {
- return machDesc.int64SizeInBytes();
- }
- };
-
- public static final SizeThunk FLOAT = new SizeThunk() {
- public long compute(MachineDescription machDesc) {
- return machDesc.floatSizeInBytes();
- }
- };
-
- public static final SizeThunk DOUBLE = new SizeThunk() {
- public long compute(MachineDescription machDesc) {
- return machDesc.doubleSizeInBytes();
- }
- };
-
- public static final SizeThunk POINTER = new SizeThunk() {
- public long compute(MachineDescription machDesc) {
- return machDesc.pointerSizeInBytes();
- }
- };
-
- // Factory methods for performing certain limited kinds of
- // arithmetic on these values
- public static SizeThunk add(final SizeThunk thunk1,
- final SizeThunk thunk2) {
- return new SizeThunk() {
- public long compute(MachineDescription machDesc) {
- return thunk1.compute(machDesc) + thunk2.compute(machDesc);
- }
- };
- }
-
- public static SizeThunk sub(final SizeThunk thunk1,
- final SizeThunk thunk2) {
- return new SizeThunk() {
- public long compute(MachineDescription machDesc) {
- return thunk1.compute(machDesc) - thunk2.compute(machDesc);
- }
- };
- }
-
- public static SizeThunk mul(final SizeThunk thunk1,
- final SizeThunk thunk2) {
- return new SizeThunk() {
- public long compute(MachineDescription machDesc) {
- return thunk1.compute(machDesc) * thunk2.compute(machDesc);
- }
- };
- }
-
- public static SizeThunk mod(final SizeThunk thunk1,
- final SizeThunk thunk2) {
- return new SizeThunk() {
- public long compute(MachineDescription machDesc) {
- return thunk1.compute(machDesc) % thunk2.compute(machDesc);
- }
- };
- }
-
- public static SizeThunk roundUp(final SizeThunk thunk1,
- final SizeThunk thunk2) {
- return new SizeThunk() {
- public long compute(MachineDescription machDesc) {
- long sz1 = thunk1.compute(machDesc);
- long sz2 = thunk2.compute(machDesc);
- long rem = (sz1 % sz2);
- if (rem == 0) {
- return sz1;
- }
- return sz1 + (sz2 - rem);
- }
- };
- }
-
- public static SizeThunk max(final SizeThunk thunk1,
- final SizeThunk thunk2) {
- return new SizeThunk() {
- public long compute(MachineDescription machDesc) {
- return Math.max(thunk1.compute(machDesc), thunk2.compute(machDesc));
- }
- };
- }
-
- public static SizeThunk constant(final int constant) {
- return new SizeThunk() {
- public long compute(MachineDescription machDesc) {
- return constant;
- }
- };
- }
-}
diff --git a/src/java/com/sun/gluegen/cgram/types/Type.java b/src/java/com/sun/gluegen/cgram/types/Type.java
deleted file mode 100644
index 0dcaabc..0000000
--- a/src/java/com/sun/gluegen/cgram/types/Type.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Copyright (c) 2003 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.cgram.types;
-
-import java.util.List;
-
-/** Models a C type. Primitive types include int, float, and
- double. All types have an associated name. Structs and unions are
- modeled as "compound" types -- composed of fields of primitive or
- other types. */
-
-public abstract class Type {
- private String name;
- private SizeThunk size;
- private int cvAttributes;
- private int typedefedCVAttributes;
- private boolean hasTypedefName;
-
- protected Type(String name, SizeThunk size, int cvAttributes) {
- setName(name);
- this.size = size;
- this.cvAttributes = cvAttributes;
- hasTypedefName = false;
- }
-
- /** Returns the name of this type. The returned string is suitable
- for use as a type specifier. Does not include any const/volatile
- attributes. */
- public String getName() { return getName(false); }
-
- /** Returns the name of this type, optionally including
- const/volatile attributes. The returned string is suitable for
- use as a type specifier. */
- public String getName(boolean includeCVAttrs) {
- if (!includeCVAttrs) {
- return name;
- }
- return getCVAttributesString() + name;
- }
-
- /** Set the name of this type; used for handling typedefs. */
- public void setName(String name) {
- if (name == null) {
- this.name = name;
- } else {
- this.name = name.intern();
- }
- // Capture the const/volatile attributes at the time of typedef so
- // we don't redundantly repeat them in the CV attributes string
- typedefedCVAttributes = cvAttributes;
- hasTypedefName = true;
- }
-
- /** SizeThunk which computes size of this type in bytes. */
- public SizeThunk getSize() { return size; }
- /** Size of this type in bytes according to the given MachineDescription. */
- public long getSize(MachineDescription machDesc) {
- SizeThunk thunk = getSize();
- if (thunk == null) {
- throw new RuntimeException("No size set for type \"" + getName() + "\"");
- }
- return thunk.compute(machDesc);
- }
- /** Set the size of this type; only available for CompoundTypes. */
- void setSize(SizeThunk size) { this.size = size; }
-
- /** Casts this to a BitType or returns null if not a BitType. */
- public BitType asBit() { return null; }
- /** Casts this to an IntType or returns null if not an IntType. */
- public IntType asInt() { return null; }
- /** Casts this to an EnumType or returns null if not an EnumType. */
- public EnumType asEnum() { return null; }
- /** Casts this to a FloatType or returns null if not a FloatType. */
- public FloatType asFloat() { return null; }
- /** Casts this to a DoubleType or returns null if not a DoubleType. */
- public DoubleType asDouble() { return null; }
- /** Casts this to a PointerType or returns null if not a PointerType. */
- public PointerType asPointer() { return null; }
- /** Casts this to an ArrayType or returns null if not an ArrayType. */
- public ArrayType asArray() { return null; }
- /** Casts this to a CompoundType or returns null if not a CompoundType. */
- public CompoundType asCompound() { return null; }
- /** Casts this to a FunctionType or returns null if not a FunctionType. */
- public FunctionType asFunction() { return null; }
- /** Casts this to a VoidType or returns null if not a VoidType. */
- public VoidType asVoid() { return null; }
-
- /** Indicates whether this is a BitType. */
- public boolean isBit() { return (asBit() != null); }
- /** Indicates whether this is an IntType. */
- public boolean isInt() { return (asInt() != null); }
- /** Indicates whether this is an EnumType. */
- public boolean isEnum() { return (asEnum() != null); }
- /** Indicates whether this is a FloatType. */
- public boolean isFloat() { return (asFloat() != null); }
- /** Indicates whether this is a DoubleType. */
- public boolean isDouble() { return (asDouble() != null); }
- /** Indicates whether this is a PointerType. */
- public boolean isPointer() { return (asPointer() != null); }
- /** Indicates whether this is an ArrayType. */
- public boolean isArray() { return (asArray() != null); }
- /** Indicates whether this is a CompoundType. */
- public boolean isCompound() { return (asCompound() != null); }
- /** Indicates whether this is a FunctionType. */
- public boolean isFunction() { return (asFunction() != null); }
- /** Indicates whether this is a VoidType. */
- public boolean isVoid() { return (asVoid() != null); }
-
- /** Indicates whether this type is const. */
- public boolean isConst() { return (((cvAttributes & ~typedefedCVAttributes) & CVAttributes.CONST) != 0); }
- /** Indicates whether this type is volatile. */
- public boolean isVolatile() { return (((cvAttributes & ~typedefedCVAttributes) & CVAttributes.VOLATILE) != 0); }
-
- /** Indicates whether this type is a primitive type. */
- public boolean isPrimitive(){ return false; }
-
- /** Convenience routine indicating whether this Type is a pointer to
- a function. */
- public boolean isFunctionPointer() {
- return (isPointer() && asPointer().getTargetType().isFunction());
- }
-
- /** Hashcode for Types. */
- public int hashCode() {
- if (name == null) {
- return 0;
- }
-
- if (cvAttributes != 0)
- {
- String nameWithAttribs = name + cvAttributes;
- return nameWithAttribs.hashCode();
- }
- return name.hashCode();
- }
-
- /**
- * Equality test for Types.
- */
- public boolean equals(Object arg) {
- if (arg == this) {
- return true;
- }
- if (arg == null || (!(arg instanceof Type))) {
- return false;
- }
- Type t = (Type) arg;
- return ((name == t.name || (name != null && name.equals(name))) &&
- (size == t.size) &&
- (cvAttributes == t.cvAttributes));
- }
-
- /** Returns a string representation of this type. This string is not
- necessarily suitable for use as a type specifier; for example,
- it will contain an expanded description of structs/unions. */
- public String toString() {
- return getName(true);
- }
-
- /** Visit this type and all of the component types of this one; for
- example, the return type and argument types of a FunctionType. */
- public void visit(TypeVisitor visitor) {
- visitor.visitType(this);
- }
-
- public final int getCVAttributes() {
- return cvAttributes;
- }
-
- /** Returns a string indicating the const/volatile attributes of
- this type. */
- public final String getCVAttributesString() {
- if (isConst() && isVolatile()) return "const volatile ";
- if (isConst()) return "const ";
- if (isVolatile()) return "volatile ";
- return "";
- }
-
- /** Return a variant of this type matching the given const/volatile
- attributes. May return this object if the attributes match. */
- public final Type getCVVariant(int cvAttributes) {
- if (this.cvAttributes == cvAttributes) {
- return this;
- }
- return newCVVariant(cvAttributes);
- }
-
- /** Create a new variant of this type matching the given
- const/volatile attributes. */
- abstract Type newCVVariant(int cvAttributes);
-
- /** Indicates whether setName() has been called on this type,
- indicating that it already has a typedef name. */
- public boolean hasTypedefName() {
- return hasTypedefName;
- }
-
- /** Helper method for determining how many pointer indirections this
- type represents (i.e., "void **" returns 2). Returns 0 if this
- type is not a pointer type. */
- public int pointerDepth() {
- PointerType pt = asPointer();
- if (pt == null) {
- return 0;
- }
- return 1 + pt.getTargetType().pointerDepth();
- }
-
- /** Helper method for determining how many array dimentions this
- type represents (i.e., "char[][]" returns 2). Returns 0 if this
- type is not an array type. */
- public int arrayDimension() {
- ArrayType arrayType = asArray();
- if (arrayType == null) {
- return 0;
- }
- return 1 + arrayType.getElementType().arrayDimension();
- }
-
- /** Helper routine for list equality comparison */
- static boolean listsEqual(List a, List b) {
- return ((a == null && b == null) ||
- (a != null && b != null && a.equals(b)));
- }
-}
diff --git a/src/java/com/sun/gluegen/cgram/types/TypeDictionary.java b/src/java/com/sun/gluegen/cgram/types/TypeDictionary.java
deleted file mode 100644
index 5c74455..0000000
--- a/src/java/com/sun/gluegen/cgram/types/TypeDictionary.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (c) 2003 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.cgram.types;
-
-import java.util.*;
-
-/** Utility class for recording names of typedefs and structs. */
-
-public class TypeDictionary {
- /** Mapping from type name to type.*/
- private HashMap/*<String, Type>*/ map = new HashMap/*<String, Type>*/();
-
- /** Reverse mapping; created lazily from the regular map */
- private HashMap/*<Set<Type>, String>*/ reverseMap = new HashMap/*<Set<Type>, String>*/();
-
- /** Has a type been added/removed since the last time the reverse map was
- * calculated? */
- private boolean reverseMapOutOfDate = false;
-
- /**
- * Create a mapping from a type to its name.
- * @param name the name to which the type is defined
- * @param type the type that can be referred to by the specified name.
- */
- public Type put(String name, Type type) {
- reverseMapOutOfDate = true;
- return (Type) map.put(name, type);
- }
-
- /** Get the type corresponding to the given name. Returns null if no type
- * was found corresponding to the given name. */
- public Type get(String name) {
- return (Type) map.get(name);
- }
-
- /**
- * Get the names that correspond to the given type. There will be more than
- * one name in the returned list if the type has been defined to multiple
- * names. Returns null if no names were found for given type.
- */
- public Set/*<String>*/ get(Type type) {
- if (reverseMapOutOfDate) {
- rebuildReverseMap();
- reverseMapOutOfDate = false;
- }
- // Don't let callers muck with the set.
- return Collections.unmodifiableSet((Set)reverseMap.get(type));
- }
-
- /** Remove the mapping from the specified name to its associated type.*/
- public Type remove(String name) {
- reverseMapOutOfDate = true;
- return (Type) map.remove(name);
- }
-
- /** Get all the names that map to Types.
- * @return a Set of Strings that are the typedef names that map to Types in the dictionary.
- */
- public Set keySet() {
- return map.keySet();
- }
-
- public Set entrySet() {
- return map.entrySet();
- }
-
- public boolean containsKey(String key) {
- return map.containsKey(key);
- }
-
- public boolean containsValue(Type value) {
- return map.containsValue(value);
- }
-
- public boolean isEmpty() {
- return map.isEmpty();
- }
-
- /** Returns a collection of all the Types in the dictionary that are mapped via typedefs names. */
- public Collection values() {
- return map.values();
- }
-
- /** Build the mapping of from each Type to all the names by which is may be
- * referenced. Warning: this is a slow operation!
- */
- private void rebuildReverseMap() {
- reverseMap.clear();
- for (Iterator/*<String>*/ it = map.keySet().iterator(); it.hasNext(); ) {
- String name = (String)it.next();
- Type type = (Type)map.get(name);
- if (type == null) {
- throw new IllegalStateException("Internal error; TypedefDictionary contains null Type for name \"" + name + "\"");
- }
- HashSet allNamesForType = (HashSet)reverseMap.get(type);
- if (allNamesForType == null) {
- allNamesForType = new HashSet/*<String>*/();
- reverseMap.put(type, allNamesForType);
- }
- allNamesForType.add(name);
- }
- }
-
- /**
- * Dumps the dictionary contents to the specified output stream, annotated
- * with the specified description. Useful for debugging.
- */
- public void dumpDictionary(java.io.PrintStream out, String description) {
- out.println("------------------------------------------------------------------------------");
- out.println("TypeDictionary: " + (description == null ? "" : description));
- out.println("------------------------------------------------------------------------------");
- out.println("Forward mapping: ");
- for (Iterator names = keySet().iterator(); names.hasNext(); ) {
- String typeName = (String)names.next();
- out.println(" [" + typeName + "]\t--> [" + get(typeName) + "]");
- }
- out.println("Reverse mapping: ");
-
- // because the reverse mapping is built lazily upon query, we must force it to
- // be built if it has not yet been built.
- if (reverseMapOutOfDate) {
- rebuildReverseMap();
- reverseMapOutOfDate = false;
- }
- for (Iterator types = reverseMap.keySet().iterator(); types.hasNext(); ) {
- Type type = (Type)types.next();
- Set names = get(type);
- out.println(" [" + type + "]\t--> " + names + "");
- }
- out.println("------------------------------------------------------------------------------");
- }
-}
diff --git a/src/java/com/sun/gluegen/cgram/types/TypeVisitor.java b/src/java/com/sun/gluegen/cgram/types/TypeVisitor.java
deleted file mode 100644
index 88f7dd5..0000000
--- a/src/java/com/sun/gluegen/cgram/types/TypeVisitor.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2003 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.cgram.types;
-
-public interface TypeVisitor {
- public void visitType(Type t);
-}
diff --git a/src/java/com/sun/gluegen/cgram/types/VoidType.java b/src/java/com/sun/gluegen/cgram/types/VoidType.java
deleted file mode 100644
index 3a2f1b9..0000000
--- a/src/java/com/sun/gluegen/cgram/types/VoidType.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2003 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.cgram.types;
-
-public class VoidType extends Type {
- public VoidType(int cvAttributes) {
- this("void", cvAttributes);
- }
-
- private VoidType(String name, int cvAttributes) {
- super(name, null, cvAttributes);
- }
-
- public VoidType asVoid() { return this; }
-
- Type newCVVariant(int cvAttributes) {
- return new VoidType(getName(), cvAttributes);
- }
-}
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 4fe81af..0000000
--- 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 12a6c0e..0000000
--- 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;
- }
-}
diff --git a/src/java/com/sun/gluegen/opengl/BuildComposablePipeline.java b/src/java/com/sun/gluegen/opengl/BuildComposablePipeline.java
deleted file mode 100644
index 818f0ce..0000000
--- a/src/java/com/sun/gluegen/opengl/BuildComposablePipeline.java
+++ /dev/null
@@ -1,607 +0,0 @@
-/*
- * Copyright (c) 2003 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.opengl;
-
-import com.sun.gluegen.*;
-
-import java.lang.reflect.*;
-import java.io.*;
-import java.util.*;
-import java.util.regex.*;
-
-public class BuildComposablePipeline
-{
- private String outputDirectory;
- private Class classToComposeAround;
-
- // Only desktop OpenGL has immediate mode glBegin / glEnd
- private boolean hasImmediateMode;
-
- // Desktop OpenGL and GLES1 have GL_STACK_OVERFLOW and GL_STACK_UNDERFLOW errors
- private boolean hasStackOverflow;
-
- public static void main(String[] args)
- {
- String nameOfClassToComposeAround = args[0];
- Class classToComposeAround;
- try {
- classToComposeAround = Class.forName(nameOfClassToComposeAround);
- } catch (Exception e) {
- throw new RuntimeException(
- "Could not find class \"" + nameOfClassToComposeAround + "\"", e);
- }
-
- String outputDir = args[1];
-
- BuildComposablePipeline composer =
- new BuildComposablePipeline(classToComposeAround, outputDir);
-
- try
- {
- composer.emit();
- }
- catch (IOException e)
- {
- throw new RuntimeException(
- "Error generating composable pipeline source files", e);
- }
- }
-
- protected BuildComposablePipeline(Class classToComposeAround, String outputDirectory)
- {
- this.outputDirectory = outputDirectory;
- this.classToComposeAround = classToComposeAround;
-
- if (! classToComposeAround.isInterface())
- {
- throw new IllegalArgumentException(
- classToComposeAround.getName() + " is not an interface class");
- }
-
- try {
- hasImmediateMode =
- (classToComposeAround.getMethod("glBegin", new Class[] { Integer.TYPE }) != null);
- } catch (Exception e) {
- }
-
- try {
- hasStackOverflow =
- (classToComposeAround.getField("GL_STACK_OVERFLOW") != null);
- } catch (Exception e) {
- }
- }
-
- /**
- * Emit the java source code for the classes that comprise the composable
- * pipeline.
- */
- public void emit() throws IOException
- {
- String pDir = outputDirectory;
- String pInterface = classToComposeAround.getName();
- List/*<Method>*/ publicMethods = Arrays.asList(classToComposeAround.getMethods());
-
- (new DebugPipeline(pDir, pInterface)).emit(publicMethods);
- (new TracePipeline(pDir, pInterface)).emit(publicMethods);
- }
-
- //-------------------------------------------------------
-
- /**
- * Emits a Java source file that represents one element of the composable
- * pipeline.
- */
- protected abstract class PipelineEmitter
- {
- private File file;
- private String basePackage;
- private String baseName; // does not include package!
- private String outputDir;
-
- /**
- * @param outputDir the directory into which the pipeline classes will be
- * generated.
- * @param baseInterfaceClassName the full class name (including package,
- * e.g. "java.lang.String") of the interface that the pipeline wraps
- * @exception IllegalArgumentException if classToComposeAround is not an
- * interface.
- */
- public PipelineEmitter(String outputDir, String baseInterfaceClassName)
- {
- int lastDot = baseInterfaceClassName.lastIndexOf('.');
- if (lastDot == -1)
- {
- // no package, class is at root level
- this.baseName = baseInterfaceClassName;
- this.basePackage = null;
- }
- else
- {
- this.baseName = baseInterfaceClassName.substring(lastDot+1);
- this.basePackage = baseInterfaceClassName.substring(0, lastDot);
- }
-
- this.outputDir = outputDir;
- }
-
- public void emit(List/*<Method>*/ methodsToWrap) throws IOException
- {
- String pipelineClassName = getPipelineName();
- this.file = new File(outputDir + File.separatorChar + pipelineClassName + ".java");
- String parentDir = file.getParent();
- if (parentDir != null)
- {
- File pDirFile = new File(parentDir);
- pDirFile.mkdirs();
- }
-
- PrintWriter output = new PrintWriter(new BufferedWriter(new FileWriter(file)));
-
- CodeGenUtils.emitJavaHeaders(output,
- basePackage,
- pipelineClassName,
- "com.sun.gluegen.runtime", // FIXME: should make configurable
- true,
- new String[] { "java.io.*" },
- new String[] { "public" },
- new String[] { baseName },
- null,
- new CodeGenUtils.EmissionCallback() {
- public void emit(PrintWriter w) { emitClassDocComment(w); }
- }
- );
-
- preMethodEmissionHook(output);
-
- constructorHook(output);
-
- for (int i = 0; i < methodsToWrap.size(); ++i)
- {
- Method m = (Method)methodsToWrap.get(i);
- emitMethodDocComment(output, m);
- emitSignature(output, m);
- emitBody(output, m);
- }
-
- postMethodEmissionHook(output);
-
- output.println();
- output.print(" private " + baseName + " " + getDownstreamObjectName() + ";");
-
- // end the class
- output.println();
- output.print("} // end class ");
- output.println(pipelineClassName);
-
- output.flush();
- output.close();
- }
-
- /** Get the name of the object through which API calls should be routed. */
- protected String getDownstreamObjectName()
- {
- return "downstream" + baseName;
- }
-
- protected void emitMethodDocComment(PrintWriter output, Method m)
- {
- }
-
- protected void emitSignature(PrintWriter output, Method m)
- {
- output.print(" public ");
- output.print(' ');
- output.print(JavaType.createForClass(m.getReturnType()).getName());
- output.print(' ');
- output.print(m.getName());
- output.print('(');
- output.print(getArgListAsString(m, true, true));
- output.println(")");
- }
-
- protected void emitBody(PrintWriter output, Method m)
- {
- output.println(" {");
- output.print(" ");
- Class retType = m.getReturnType();
-
- preDownstreamCallHook(output, m);
-
- if (retType != Void.TYPE)
- {
- output.print(JavaType.createForClass(retType).getName());
- output.print(" _res = ");
- }
- output.print(getDownstreamObjectName());
- output.print('.');
- output.print(m.getName());
- output.print('(');
- output.print(getArgListAsString(m, false, true));
- output.println(");");
-
- postDownstreamCallHook(output, m);
-
- if (retType != Void.TYPE)
- {
- output.println(" return _res;");
- }
- output.println(" }");
-
- }
-
- private String getArgListAsString(Method m, boolean includeArgTypes, boolean includeArgNames)
- {
- StringBuffer buf = new StringBuffer(256);
- if (!includeArgNames && !includeArgTypes)
- {
- throw new IllegalArgumentException(
- "Cannot generate arglist without both arg types and arg names");
- }
-
- Class[] argTypes = m.getParameterTypes();
- for (int i = 0; i < argTypes.length; ++i)
- {
- if (includeArgTypes)
- {
- buf.append(JavaType.createForClass(argTypes[i]).getName());
- buf.append(' ');
- }
-
- if (includeArgNames)
- {
- buf.append("arg");
- buf.append(i);
- }
- if (i < argTypes.length-1) { buf.append(','); }
- }
-
- return buf.toString();
- }
-
- /** The name of the class around which this pipeline is being
- * composed. E.g., if this pipeline was constructed with
- * "java.util.Set" as the baseInterfaceClassName, then this method will
- * return "Set".
- */
- protected String getBaseInterfaceName()
- {
- return baseName;
- }
-
- /** Get the name for this pipeline class. */
- protected abstract String getPipelineName();
-
- /**
- * Called after the class headers have been generated, but before any
- * method wrappers have been generated.
- */
- protected abstract void preMethodEmissionHook(PrintWriter output);
-
- /**
- * Emits the constructor for the pipeline; called after the preMethodEmissionHook.
- */
- protected void constructorHook(PrintWriter output) {
- output.print( " public " + getPipelineName() + "(" + baseName + " ");
- output.println(getDownstreamObjectName() + ")");
- output.println(" {");
- output.println(" if (" + getDownstreamObjectName() + " == null) {");
- output.println(" throw new IllegalArgumentException(\"null " + getDownstreamObjectName() + "\");");
- output.println(" }");
- output.print( " this." + getDownstreamObjectName());
- output.println(" = " + getDownstreamObjectName() + ";");
- output.println(" // Fetch GLContext object for better error checking (if possible)");
- output.println(" // FIXME: should probably put this method in GL rather than GLImpl");
- output.println(" if (" + getDownstreamObjectName() + " instanceof com.sun.opengl.impl.GLImpl) {");
- output.println(" _context = ((com.sun.opengl.impl.GLImpl) " + getDownstreamObjectName() + ").getContext();");
- output.println(" }");
- output.println(" }");
- output.println();
- }
-
- /**
- * Called after the method wrappers have been generated, but before the
- * closing parenthesis of the class is emitted.
- */
- protected abstract void postMethodEmissionHook(PrintWriter output);
-
- /**
- * Called before the pipeline routes the call to the downstream object.
- */
- protected abstract void preDownstreamCallHook(PrintWriter output, Method m);
-
- /**
- * Called after the pipeline has routed the call to the downstream object,
- * but before the calling function exits or returns a value.
- */
- protected abstract void postDownstreamCallHook(PrintWriter output, Method m);
-
- /** Emit a Javadoc comment for this pipeline class. */
- protected abstract void emitClassDocComment(PrintWriter output);
-
- } // end class PipelineEmitter
-
- //-------------------------------------------------------
-
- protected class DebugPipeline extends PipelineEmitter
- {
- String className;
- String baseInterfaceClassName;
- public DebugPipeline(String outputDir, String baseInterfaceClassName)
- {
- super(outputDir, baseInterfaceClassName);
- className = "Debug" + getBaseInterfaceName();
- }
-
- protected String getPipelineName()
- {
- return className;
- }
-
- protected void preMethodEmissionHook(PrintWriter output)
- {
- }
-
- protected void postMethodEmissionHook(PrintWriter output)
- {
- output.println(" private void checkGLGetError(String caller)");
- output.println(" {");
- if (hasImmediateMode) {
- output.println(" if (insideBeginEndPair) {");
- output.println(" return;");
- output.println(" }");
- output.println();
- }
- output.println(" // Debug code to make sure the pipeline is working; leave commented out unless testing this class");
- output.println(" //System.err.println(\"Checking for GL errors " +
- "after call to \" + caller + \"()\");");
- output.println();
- output.println(" int err = " +
- getDownstreamObjectName() +
- ".glGetError();");
- output.println(" if (err == GL_NO_ERROR) { return; }");
- output.println();
- output.println(" StringBuffer buf = new StringBuffer(");
- output.println(" \"glGetError() returned the following error codes " +
- "after a call to \" + caller + \"(): \");");
- output.println();
- output.println(" // Loop repeatedly to allow for distributed GL implementations,");
- output.println(" // as detailed in the glGetError() specification");
- output.println(" int recursionDepth = 10;");
- output.println(" do {");
- output.println(" switch (err) {");
- output.println(" case GL_INVALID_ENUM: buf.append(\"GL_INVALID_ENUM \"); break;");
- output.println(" case GL_INVALID_VALUE: buf.append(\"GL_INVALID_VALUE \"); break;");
- output.println(" case GL_INVALID_OPERATION: buf.append(\"GL_INVALID_OPERATION \"); break;");
- if (hasStackOverflow) {
- output.println(" case GL_STACK_OVERFLOW: buf.append(\"GL_STACK_OVERFLOW \"); break;");
- output.println(" case GL_STACK_UNDERFLOW: buf.append(\"GL_STACK_UNDERFLOW \"); break;");
- }
- output.println(" case GL_OUT_OF_MEMORY: buf.append(\"GL_OUT_OF_MEMORY \"); break;");
- output.println(" case GL_NO_ERROR: throw new InternalError(\"Should not be treating GL_NO_ERROR as error\");");
- output.println(" default: throw new InternalError(\"Unknown glGetError() return value: \" + err);");
- output.println(" }");
- output.println(" } while ((--recursionDepth >= 0) && (err = " +
- getDownstreamObjectName() +
- ".glGetError()) != GL_NO_ERROR);");
- output.println(" throw new GLException(buf.toString());");
- output.println(" }");
- if (hasImmediateMode) {
- output.println(" /** True if the pipeline is inside a glBegin/glEnd pair.*/");
- output.println(" private boolean insideBeginEndPair = false;");
- output.println();
- }
- output.println(" private void checkContext() {");
- output.println(" GLContext currentContext = GLContext.getCurrent();");
- output.println(" if (currentContext == null) {");
- output.println(" throw new GLException(\"No OpenGL context is current on this thread\");");
- output.println(" }");
- output.println(" if ((_context != null) && (_context != currentContext)) {");
- output.println(" throw new GLException(\"This GL object is being incorrectly used with a different GLContext than that which created it\");");
- output.println(" }");
- output.println(" }");
- output.println(" private GLContext _context;");
- }
-
- protected void emitClassDocComment(PrintWriter output)
- {
- output.println("/** <P> Composable pipeline which wraps an underlying {@link GL} implementation,");
- output.println(" providing error checking after each OpenGL method call. If an error occurs,");
- output.println(" causes a {@link GLException} to be thrown at exactly the point of failure.");
- output.println(" Sample code which installs this pipeline: </P>");
- output.println();
- output.println("<PRE>");
- output.println(" drawable.setGL(new DebugGL(drawable.getGL()));");
- output.println("</PRE>");
- output.println("*/");
- }
-
- protected void preDownstreamCallHook(PrintWriter output, Method m)
- {
- output.println(" checkContext();");
- }
-
- protected void postDownstreamCallHook(PrintWriter output, Method m)
- {
- if (m.getName().equals("glBegin"))
- {
- output.println(" insideBeginEndPair = true;");
- output.println(" // NOTE: can't check glGetError(); it's not allowed inside glBegin/glEnd pair");
- }
- else
- {
- if (m.getName().equals("glEnd"))
- {
- output.println(" insideBeginEndPair = false;");
- }
-
- // calls to glGetError() are only allowed outside of glBegin/glEnd pairs
- output.println(" checkGLGetError(\"" + m.getName() + "\");");
- }
- }
-
- } // end class DebugPipeline
-
- //-------------------------------------------------------
-
- protected class TracePipeline extends PipelineEmitter
- {
- String className;
- String baseInterfaceClassName;
- public TracePipeline(String outputDir, String baseInterfaceClassName)
- {
- super(outputDir, baseInterfaceClassName);
- className = "Trace" + getBaseInterfaceName();
- }
-
- protected String getPipelineName()
- {
- return className;
- }
-
- protected void preMethodEmissionHook(PrintWriter output)
- {
- }
-
- protected void constructorHook(PrintWriter output) {
- output.print( " public " + getPipelineName() + "(" + getBaseInterfaceName() + " ");
- output.println(getDownstreamObjectName() + ", PrintStream " + getOutputStreamName() + ")");
- output.println(" {");
- output.println(" if (" + getDownstreamObjectName() + " == null) {");
- output.println(" throw new IllegalArgumentException(\"null " + getDownstreamObjectName() + "\");");
- output.println(" }");
- output.print( " this." + getDownstreamObjectName());
- output.println(" = " + getDownstreamObjectName() + ";");
- output.print( " this." + getOutputStreamName());
- output.println(" = " + getOutputStreamName() + ";");
- output.println(" }");
- output.println();
- }
-
- protected void postMethodEmissionHook(PrintWriter output)
- {
- output.println("private PrintStream " + getOutputStreamName() + ";");
- output.println("private int indent = 0;");
- output.println("protected String dumpArray(Object obj)");
- output.println("{");
- output.println(" if (obj == null) return \"[null]\";");
- output.println(" StringBuffer sb = new StringBuffer(\"[\");");
- output.println(" int len = java.lang.reflect.Array.getLength(obj);");
- output.println(" int count = Math.min(len,16);");
- output.println(" for ( int i =0; i < count; i++ ) {");
- output.println(" sb.append(java.lang.reflect.Array.get(obj,i));");
- output.println(" if (i < count-1)");
- output.println(" sb.append(',');");
- output.println(" }");
- output.println(" if ( len > 16 )");
- output.println(" sb.append(\"...\").append(len);");
- output.println(" sb.append(']');");
- output.println(" return sb.toString();");
- output.println("}");
- output.println("protected void print(String str)");
- output.println("{");
- output.println(" "+getOutputStreamName()+".print(str);");
- output.println("}");
- output.println("protected void println(String str)");
- output.println("{");
- output.println(" "+getOutputStreamName()+".println(str);");
- output.println("}");
- output.println("protected void printIndent()");
- output.println("{");
- output.println(" for( int i =0; i < indent; i++) {"+getOutputStreamName()+".print(' ');}");
- output.println("}");
- }
- protected void emitClassDocComment(PrintWriter output)
- {
- output.println("/** <P> Composable pipeline which wraps an underlying {@link GL} implementation,");
- output.println(" providing tracing information to a user-specified {@link java.io.PrintStream}");
- output.println(" before and after each OpenGL method call. Sample code which installs this pipeline: </P>");
- output.println();
- output.println("<PRE>");
- output.println(" drawable.setGL(new TraceGL(drawable.getGL(), System.err));");
- output.println("</PRE>");
- output.println("*/");
- }
-
- protected void preDownstreamCallHook(PrintWriter output, Method m)
- {
- Class[] params = m.getParameterTypes();
- if ( m.getName().equals("glEnd") || m.getName().equals("glEndList"))
- {
- output.println("indent-=2;");
- output.println(" printIndent();");
- }
- else
- {
- output.println("printIndent();");
- }
-
- output.print(" print(\"" + m.getName() + "(\"");
- for ( int i =0; i < params.length; i++ )
- {
- if ( params[i].isArray() )
- output.print("+dumpArray(arg"+i+")");
- else
- output.print("+arg"+i);
- if ( i < params.length-1)
- output.print("+\",\"");
- }
- output.println("+\")\");");
- output.print(" ");
- }
-
- protected void postDownstreamCallHook(PrintWriter output, Method m)
- {
- Class ret = m.getReturnType();
- if ( ret != Void.TYPE )
- {
- output.println(" println(\" = \"+_res);");
- }
- else
- {
- output.println(" println(\"\");");
- }
- }
-
- private String getOutputStreamName() {
- return "stream";
- }
-
- } // end class TracePipeline
-}
diff --git a/src/java/com/sun/gluegen/opengl/BuildStaticGLInfo.java b/src/java/com/sun/gluegen/opengl/BuildStaticGLInfo.java
deleted file mode 100644
index 52b9fde..0000000
--- a/src/java/com/sun/gluegen/opengl/BuildStaticGLInfo.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- * Copyright (c) 2003 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.opengl;
-
-import java.io.*;
-import java.util.*;
-import java.util.regex.*;
-
- /**
- * Builds the StaticGLInfo class from the OpenGL header files (i.e., gl.h
- * and glext.h) whose paths were passed as arguments to {@link
- * #main(String[])}.
- *
- * It relies upon the assumption that a function's membership is scoped by
- * preprocessor blocks in the header files that match the following pattern:
- * <br>
- *
- * <pre>
- *
- * #ifndef GL_XXXX
- * GLAPI <returnType> <APIENTRY|GLAPIENTRY> glFuncName(<params>)
- * #endif GL_XXXX
- *
- * </pre>
- *
- * For example, if it parses the following data:
- *
- * <pre>
- *
- * #ifndef GL_VERSION_1_3
- * GLAPI void APIENTRY glActiveTexture (GLenum);
- * GLAPI void APIENTRY glMultiTexCoord1dv (GLenum, const GLdouble *);
- * GLAPI void <APIENTRY|GLAPIENTRY> glFuncName(<params>)
- * #endif GL_VERSION_1_3
- *
- * #ifndef GL_ARB_texture_compression
- * GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *);
- * GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid *);
- * #endif
- *
- * </pre>
- *
- * It will associate
- * <code> glActiveTexture </code> and
- * <code> glMultiTexCoord1dv </code>
- * with the symbol
- * <code> GL_VERSION_1_3 </code>,
- * and associate
- * <code> glCompressedTexImage2DARB </code> and
- * <code> glCompressedTexImage3DARB </code>
- * with the symbol
- * <code> GL_ARB_texture_compression </code>.
- * */
-public class BuildStaticGLInfo
-{
- // Handles function pointer
- protected static Pattern funcPattern =
- Pattern.compile("^(GLAPI|extern)?(\\s*)(\\w+)(\\*)?(\\s+)(GLAPIENTRY|APIENTRY|WINAPI)?(\\s*)([w]?gl\\w+)\\s?(\\(.*)");
- protected static Pattern associationPattern =
- Pattern.compile("\\#ifndef ([W]?GL[X]?_[A-Za-z0-9_]+)");
- protected static Pattern definePattern =
- Pattern.compile("\\#define ([W]?GL[X]?_[A-Za-z0-9_]+)\\s*([A-Za-z0-9_]+)");
- // Maps function / #define names to the names of the extensions they're declared in
- protected Map declarationToExtensionMap = new HashMap();
- // Maps extension names to Set of identifiers (both #defines and
- // function names) this extension declares
- protected Map/*<String, Set<String>*/ extensionToDeclarationMap = new HashMap();
-
- /**
- * The first argument is the package to which the StaticGLInfo class
- * belongs, the second is the path to the directory in which that package's
- * classes reside, and the remaining arguments are paths to the C header
- * files that should be parsed
- */
- public static void main(String[] args) throws IOException
- {
- if (args.length > 0 && args[0].equals("-test")) {
- BuildStaticGLInfo builder = new BuildStaticGLInfo();
- String[] newArgs = new String[args.length - 1];
- System.arraycopy(args, 1, newArgs, 0, args.length - 1);
- builder.parse(newArgs);
- builder.dump();
- System.exit(0);
- }
-
- String packageName = args[0];
- String packageDir = args[1];
-
- String[] cHeaderFilePaths = new String[args.length-2];
- System.arraycopy(args, 2, cHeaderFilePaths, 0, cHeaderFilePaths.length);
-
- BuildStaticGLInfo builder = new BuildStaticGLInfo();
- try {
- builder.parse(cHeaderFilePaths);
-
- File file = new File(packageDir + File.separatorChar + "StaticGLInfo.java");
- String parentDir = file.getParent();
- if (parentDir != null) {
- File pDirFile = new File(parentDir);
- pDirFile.mkdirs();
- }
-
- PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(file)));
- builder.emitJavaCode(writer, packageName);
-
- writer.flush();
- writer.close();
- }
- catch (Exception e)
- {
- StringBuffer buf = new StringBuffer("{ ");
- for (int i = 0; i < cHeaderFilePaths.length; ++i)
- {
- buf.append(cHeaderFilePaths[i]);
- buf.append(" ");
- }
- buf.append('}');
- throw new RuntimeException(
- "Error building StaticGLInfo.java from " + buf.toString(), e);
- }
- }
-
-
- /** Parses the supplied C header files and adds the function
- associations contained therein to the internal map. */
- public void parse(String[] cHeaderFilePaths) throws IOException {
- for (int i = 0; i < cHeaderFilePaths.length; i++) {
- parse(cHeaderFilePaths[i]);
- }
- }
-
- /** Parses the supplied C header file and adds the function
- associations contained therein to the internal map. */
- public void parse(String cHeaderFilePath) throws IOException {
- BufferedReader reader = new BufferedReader(new FileReader(cHeaderFilePath));
- String line, activeAssociation = null;
- Matcher m = null;
- while ((line = reader.readLine()) != null) {
- // see if we're inside a #ifndef GL_XXX block and matching a function
- if (activeAssociation != null) {
- String identifier = null;
- if ((m = funcPattern.matcher(line)).matches()) {
- identifier = m.group(8);
- } else if ((m = definePattern.matcher(line)).matches()) {
- identifier = m.group(1);
- } else if (line.startsWith("#endif")) {
- activeAssociation = null;
- }
- if ((identifier != null) &&
- (activeAssociation != null) &&
- // Handles #ifndef GL_... #define GL_...
- !identifier.equals(activeAssociation)) {
- addAssociation(identifier, activeAssociation);
- }
- } else if ((m = associationPattern.matcher(line)).matches()) {
- // found a new #ifndef GL_XXX block
- activeAssociation = m.group(1);
-
- //System.err.println("FOUND NEW ASSOCIATION BLOCK: " + activeAssociation);
- }
- }
- reader.close();
- }
-
- public void dump() {
- for (Iterator i1 = extensionToDeclarationMap.keySet().iterator(); i1.hasNext(); ) {
- String name = (String) i1.next();
- Set decls = (Set) extensionToDeclarationMap.get(name);
- System.out.println(name + ":");
- List l = new ArrayList();
- l.addAll(decls);
- Collections.sort(l);
- for (Iterator i2 = l.iterator(); i2.hasNext(); ) {
- System.out.println(" " + (String) i2.next());
- }
- }
- }
-
- public String getExtension(String identifier) {
- return (String) declarationToExtensionMap.get(identifier);
- }
-
- public Set getDeclarations(String extension) {
- return (Set) extensionToDeclarationMap.get(extension);
- }
-
- public void emitJavaCode(PrintWriter output, String packageName) {
- output.println("package " + packageName + ";");
- output.println();
- output.println("import java.util.*;");
- output.println();
- output.println("public final class StaticGLInfo");
- output.println("{");
-
- output.println(" // maps function names to the extension string or OpenGL");
- output.println(" // specification version string to which they correspond.");
- output.println(" private static HashMap funcToAssocMap;");
- output.println();
-
- output.println(" /**");
- output.println(" * Returns the OpenGL extension string or GL_VERSION string with which the");
- output.println(" * given function is associated. <P>");
- output.println(" *");
- output.println(" * If the");
- output.println(" * function is part of the OpenGL core, the returned value will be");
- output.println(" * GL_VERSION_XXX where XXX represents the OpenGL version of which the");
- output.println(" * function is a member (XXX will be of the form \"A\" or \"A_B\" or \"A_B_C\";");
- output.println(" * e.g., GL_VERSION_1_2_1 for OpenGL version 1.2.1).");
- output.println(" *");
- output.println(" * If the function is an extension function, the returned value will the");
- output.println(" * OpenGL extension string for the extension to which the function");
- output.println(" * corresponds. For example, if glLoadTransposeMatrixfARB is the argument,");
- output.println(" * GL_ARB_transpose_matrix will be the value returned.");
- output.println(" * Please see http://oss.sgi.com/projects/ogl-sample/registry/index.html for");
- output.println(" * a list of extension names and the functions they expose.");
- output.println(" *");
- output.println(" * If the function specified is not part of any known OpenGL core version or");
- output.println(" * extension, then NULL will be returned.");
- output.println(" */");
- output.println(" public static String getFunctionAssociation(String glFunctionName)");
- output.println(" {");
- output.println(" return (String)funcToAssocMap.get(glFunctionName);");
- output.println(" }");
- output.println();
-
- output.println(" static");
- output.println(" {");
-
- // Compute max capacity
- int maxCapacity = 0;
- for (Iterator iter = declarationToExtensionMap.keySet().iterator(); iter.hasNext(); ) {
- String name = (String) iter.next();
- if (!name.startsWith("GL")) {
- ++maxCapacity;
- }
- }
-
- output.println(" funcToAssocMap = new HashMap(" + maxCapacity + "); // approximate max capacity");
- output.println(" String group;");
- ArrayList sets = new ArrayList(extensionToDeclarationMap.keySet());
- Collections.sort(sets);
- for (Iterator iter = sets.iterator(); iter.hasNext(); ) {
- String groupName = (String) iter.next();
- Set funcs = (Set) extensionToDeclarationMap.get(groupName);
- List l = new ArrayList();
- l.addAll(funcs);
- Collections.sort(l);
- Iterator funcIter = l.iterator();
- boolean printedHeader = false;
- while (funcIter.hasNext()) {
- String funcName = (String)funcIter.next();
- if (!funcName.startsWith("GL")) {
- if (!printedHeader) {
- output.println();
- output.println(" //----------------------------------------------------------------");
- output.println(" // " + groupName);
- output.println(" //----------------------------------------------------------------");
- output.println(" group = \"" + groupName + "\";");
- printedHeader = true;
- }
-
- output.println(" funcToAssocMap.put(\"" + funcName + "\", group);");
- }
- }
- }
- output.println(" }");
- output.println("} // end class StaticGLInfo");
- }
-
- //----------------------------------------------------------------------
- // Internals only below this point
- //
-
- protected void addAssociation(String identifier, String association) {
- declarationToExtensionMap.put(identifier, association);
- Set/*<String>*/ identifiers = (Set) extensionToDeclarationMap.get(association);
- if (identifiers == null) {
- identifiers = new HashSet/*<String>*/();
- extensionToDeclarationMap.put(association, identifiers);
- }
- identifiers.add(identifier);
- }
-}
diff --git a/src/java/com/sun/gluegen/opengl/ConvertFromGL4Java.java b/src/java/com/sun/gluegen/opengl/ConvertFromGL4Java.java
deleted file mode 100644
index 2f051a7..0000000
--- a/src/java/com/sun/gluegen/opengl/ConvertFromGL4Java.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (c) 2003 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.opengl;
-
-import java.io.*;
-
-public class ConvertFromGL4Java {
- public static void main(String[] args) throws IOException {
- for (int i = 0; i < args.length; i++) {
- convert(new File(args[i]));
- }
- }
-
- private static void convert(File src) throws IOException {
- File orig = new File(src.getAbsolutePath() + ".orig");
- if (!src.renameTo(orig)) {
- throw new IOException("Error renaming original file to " + orig);
- }
- File dest = src;
- BufferedReader reader = new BufferedReader(new FileReader(orig));
- BufferedWriter writer = new BufferedWriter(new FileWriter(dest));
- boolean handledImports = false;
- String line = null;
- while ((line = reader.readLine()) != null) {
- String trimmed = line.trim();
- boolean isImport = false;
- if (trimmed.startsWith("import gl4java")) {
- line = "import javax.media.opengl.*;";
- isImport = true;
- }
- if (!isImport ||
- (isImport && !handledImports)) {
- line = line.replaceAll("GLFunc14", "GL");
- line = line.replaceAll("GLUFunc14", "GLU");
- line = line.replaceAll("GLFunc", "GL");
- line = line.replaceAll("GLUFunc", "GLU");
- line = line.replaceAll("implements GLEnum,", "implements ");
- line = line.replaceAll(", GLEnum\\s", " ");
- line = line.replaceAll("GLEnum,", "");
- line = line.replaceAll("GLEnum.", "");
- line = line.replaceAll("GLEnum", "");
- line = line.replaceAll("GL_", "GL.GL_");
- writer.write(line);
- writer.newLine();
- if (isImport) {
- handledImports = true;
- }
- }
- }
- writer.flush();
- reader.close();
- writer.close();
- }
-}
diff --git a/src/java/com/sun/gluegen/opengl/GLConfiguration.java b/src/java/com/sun/gluegen/opengl/GLConfiguration.java
deleted file mode 100755
index e331d16..0000000
--- a/src/java/com/sun/gluegen/opengl/GLConfiguration.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright (c) 2003-2005 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.opengl;
-
-import java.io.*;
-import java.util.*;
-
-import com.sun.gluegen.*;
-import com.sun.gluegen.procaddress.*;
-
-public class GLConfiguration extends ProcAddressConfiguration {
- // The following data members support ignoring an entire extension at a time
- private List/*<String>*/ glHeaders = new ArrayList();
- private Set/*<String>*/ ignoredExtensions = new HashSet();
- private BuildStaticGLInfo glInfo;
- // Maps function names to the kind of buffer object it deals with
- private Map/*<String,GLEmitter.BufferObjectKind>*/ bufferObjectKinds = new HashMap();
- private GLEmitter emitter;
-
- public GLConfiguration(GLEmitter emitter) {
- super();
- this.emitter = emitter;
- try {
- setProcAddressNameExpr("PFN $UPPERCASE({0}) PROC");
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error configuring ProcAddressNameExpr", e);
- }
- }
-
- protected void dispatch(String cmd, StringTokenizer tok, File file, String filename, int lineNo) throws IOException {
- if (cmd.equalsIgnoreCase("IgnoreExtension"))
- {
- String sym = readString("IgnoreExtension", tok, filename, lineNo);
- ignoredExtensions.add(sym);
- }
- else if (cmd.equalsIgnoreCase("GLHeader"))
- {
- String sym = readString("GLHeader", tok, filename, lineNo);
- glHeaders.add(sym);
- }
- else if (cmd.equalsIgnoreCase("BufferObjectKind"))
- {
- readBufferObjectKind(tok, filename, lineNo);
- }
- else
- {
- super.dispatch(cmd,tok,file,filename,lineNo);
- }
- }
-
- protected void readBufferObjectKind(StringTokenizer tok, String filename, int lineNo) {
- try {
- String kindString = tok.nextToken();
- GLEmitter.BufferObjectKind kind = null;
- String target = tok.nextToken();
- if (kindString.equalsIgnoreCase("UnpackPixel")) {
- kind = GLEmitter.BufferObjectKind.UNPACK_PIXEL;
- } else if (kindString.equalsIgnoreCase("PackPixel")) {
- kind = GLEmitter.BufferObjectKind.PACK_PIXEL;
- } else if (kindString.equalsIgnoreCase("Array")) {
- kind = GLEmitter.BufferObjectKind.ARRAY;
- } else if (kindString.equalsIgnoreCase("Element")) {
- kind = GLEmitter.BufferObjectKind.ELEMENT;
- } else {
- throw new RuntimeException("Error parsing \"BufferObjectKind\" command at line " + lineNo +
- " in file \"" + filename + "\": illegal BufferObjectKind \"" +
- kindString + "\", expected one of UnpackPixel, PackPixel, Array, or Element");
- }
-
- bufferObjectKinds.put(target, kind);
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"BufferObjectKind\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- /** Overrides javaPrologueForMethod in superclass and
- automatically generates prologue code for functions associated
- with buffer objects. */
- public List/*<String>*/ javaPrologueForMethod(MethodBinding binding,
- boolean forImplementingMethodCall,
- boolean eraseBufferAndArrayTypes) {
- List/*<String>*/ res = super.javaPrologueForMethod(binding,
- forImplementingMethodCall,
- eraseBufferAndArrayTypes);
- GLEmitter.BufferObjectKind kind = getBufferObjectKind(binding.getName());
- if (kind != null) {
- // Need to generate appropriate prologue based on both buffer
- // object kind and whether this variant of the MethodBinding
- // is the one accepting a "long" as argument
- //
- // NOTE we MUST NOT mutate the array returned from the super
- // call!
- ArrayList res2 = new ArrayList();
- if (res != null) {
- res2.addAll(res);
- }
- res = res2;
-
- String prologue = "check";
-
- if (kind == GLEmitter.BufferObjectKind.UNPACK_PIXEL) {
- prologue = prologue + "UnpackPBO";
- } else if (kind == GLEmitter.BufferObjectKind.PACK_PIXEL) {
- prologue = prologue + "PackPBO";
- } else if (kind == GLEmitter.BufferObjectKind.ARRAY) {
- prologue = prologue + "ArrayVBO";
- } else if (kind == GLEmitter.BufferObjectKind.ELEMENT) {
- prologue = prologue + "ElementVBO";
- } else {
- throw new RuntimeException("Unknown BufferObjectKind " + kind);
- }
-
- if (emitter.isBufferObjectMethodBinding(binding)) {
- prologue = prologue + "Enabled";
- } else {
- prologue = prologue + "Disabled";
- }
-
- prologue = prologue + "();";
-
- res.add(0, prologue);
-
- // Must also filter out bogus rangeCheck directives for VBO/PBO
- // variants
- if (emitter.isBufferObjectMethodBinding(binding)) {
- for (Iterator iter = res.iterator(); iter.hasNext(); ) {
- String line = (String) iter.next();
- if (line.indexOf("BufferFactory.rangeCheck") >= 0) {
- iter.remove();
- }
- }
- }
- }
-
- return res;
- }
-
- public boolean shouldIgnore(String symbol) {
- // Check ignored extensions based on our knowledge of the static GL info
- if (glInfo != null) {
- String extension = glInfo.getExtension(symbol);
- if (extension != null &&
- ignoredExtensions.contains(extension)) {
- return true;
- }
- }
-
- return super.shouldIgnore(symbol);
- }
-
- /** Returns the kind of buffer object this function deals with, or
- null if none. */
- public GLEmitter.BufferObjectKind getBufferObjectKind(String name) {
- return (GLEmitter.BufferObjectKind) bufferObjectKinds.get(name);
- }
-
- public boolean isBufferObjectFunction(String name) {
- return (getBufferObjectKind(name) != null);
- }
-
- /** Parses any GL headers specified in the configuration file for
- the purpose of being able to ignore an extension at a time. */
- public void parseGLHeaders(GlueEmitterControls controls) throws IOException {
- if (!glHeaders.isEmpty()) {
- glInfo = new BuildStaticGLInfo();
- for (Iterator iter = glHeaders.iterator(); iter.hasNext(); ) {
- String file = (String) iter.next();
- String fullPath = controls.findHeaderFile(file);
- if (fullPath == null) {
- throw new IOException("Unable to locate header file \"" + file + "\"");
- }
- glInfo.parse(fullPath);
- }
- }
- }
-}
diff --git a/src/java/com/sun/gluegen/opengl/GLEmitter.java b/src/java/com/sun/gluegen/opengl/GLEmitter.java
deleted file mode 100644
index 8e7484a..0000000
--- a/src/java/com/sun/gluegen/opengl/GLEmitter.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright (c) 2003-2005 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.opengl;
-
-import java.io.*;
-import java.text.MessageFormat;
-import java.util.*;
-import com.sun.gluegen.*;
-import com.sun.gluegen.cgram.types.*;
-import com.sun.gluegen.procaddress.*;
-import com.sun.gluegen.runtime.*;
-
-/**
- * A subclass of ProcAddressEmitter with special OpenGL-specific
- * configuration abilities.
- */
-public class GLEmitter extends ProcAddressEmitter
-{
- // Keeps track of which MethodBindings were created for handling
- // Buffer Object variants. Used as a Set rather than a Map.
- private Map/*<MethodBinding>*/ bufferObjectMethodBindings = new IdentityHashMap();
-
- static class BufferObjectKind {
- private BufferObjectKind() {}
-
- static final BufferObjectKind UNPACK_PIXEL = new BufferObjectKind();
- static final BufferObjectKind PACK_PIXEL = new BufferObjectKind();
- static final BufferObjectKind ARRAY = new BufferObjectKind();
- static final BufferObjectKind ELEMENT = new BufferObjectKind();
- }
-
- public void beginEmission(GlueEmitterControls controls) throws IOException
- {
- getGLConfig().parseGLHeaders(controls);
- super.beginEmission(controls);
- }
-
- protected JavaConfiguration createConfig() {
- return new GLConfiguration(this);
- }
-
- /** In order to implement Buffer Object variants of certain
- functions we generate another MethodBinding which maps the void*
- argument to a Java long. The generation of emitters then takes
- place as usual. We do however need to keep track of the modified
- MethodBinding object so that we can also modify the emitters
- later to inform them that their argument has changed. We might
- want to push this functionality down into the MethodBinding
- (i.e., mutators for argument names). We also would need to
- inform the CMethodBindingEmitter that it is overloaded in this
- case (though we default to true currently). */
- protected List/*<MethodBinding>*/ expandMethodBinding(MethodBinding binding) {
- List/*<MethodBinding>*/ bindings = super.expandMethodBinding(binding);
-
- if (!getGLConfig().isBufferObjectFunction(binding.getName())) {
- return bindings;
- }
-
- List/*<MethodBinding>*/ newBindings = new ArrayList();
- newBindings.addAll(bindings);
-
- // Need to expand each one of the generated bindings to take a
- // Java long instead of a Buffer for each void* argument
- for (Iterator iter = bindings.iterator(); iter.hasNext(); ) {
- MethodBinding cur = (MethodBinding) iter.next();
-
- // Some of these routines (glBitmap) take strongly-typed
- // primitive pointers as arguments which are expanded into
- // non-void* arguments
- // This test (rather than !signatureUsesNIO) is used to catch
- // more unexpected situations
- if (cur.signatureUsesJavaPrimitiveArrays()) {
- continue;
- }
-
- MethodBinding result = cur;
- for (int i = 0; i < cur.getNumArguments(); i++) {
- if (cur.getJavaArgumentType(i).isNIOBuffer()) {
- result = result.replaceJavaArgumentType(i, JavaType.createForClass(Long.TYPE));
- }
- }
-
- if (result == cur) {
- throw new RuntimeException("Error: didn't find any void* arguments for BufferObject function " +
- binding.getName());
- }
-
- newBindings.add(result);
- // Now need to flag this MethodBinding so that we generate the
- // correct flags in the emitters later
- bufferObjectMethodBindings.put(result, result);
- }
-
- return newBindings;
- }
-
- protected boolean needsModifiedEmitters(FunctionSymbol sym) {
- if ((!needsProcAddressWrapper(sym) && !needsBufferObjectVariant(sym)) ||
- getConfig().isUnimplemented(sym.getName())) {
- return false;
- }
-
- return true;
- }
-
- public boolean isBufferObjectMethodBinding(MethodBinding binding) {
- return bufferObjectMethodBindings.containsKey(binding);
- }
-
- //----------------------------------------------------------------------
- // Internals only below this point
- //
-
- protected void generateModifiedEmitters(JavaMethodBindingEmitter baseJavaEmitter, List emitters) {
- List superEmitters = new ArrayList();
- super.generateModifiedEmitters(baseJavaEmitter, superEmitters);
-
- // See whether this is one of the Buffer Object variants
- boolean bufferObjectVariant = bufferObjectMethodBindings.containsKey(baseJavaEmitter.getBinding());
-
- if (bufferObjectVariant) {
- for (Iterator iter = superEmitters.iterator(); iter.hasNext(); ) {
- JavaMethodBindingEmitter emitter = (JavaMethodBindingEmitter) iter.next();
- if (emitter instanceof ProcAddressJavaMethodBindingEmitter) {
- emitters.add(new GLJavaMethodBindingEmitter((ProcAddressJavaMethodBindingEmitter) emitter, bufferObjectVariant));
- } else {
- emitters.add(emitter);
- }
- }
- } else {
- emitters.addAll(superEmitters);
- }
- }
-
- protected boolean needsBufferObjectVariant(FunctionSymbol sym) {
- return getGLConfig().isBufferObjectFunction(sym.getName());
- }
-
- protected GLConfiguration getGLConfig() {
- return (GLConfiguration) getConfig();
- }
-}
diff --git a/src/java/com/sun/gluegen/opengl/GLJavaMethodBindingEmitter.java b/src/java/com/sun/gluegen/opengl/GLJavaMethodBindingEmitter.java
deleted file mode 100755
index 8512f38..0000000
--- a/src/java/com/sun/gluegen/opengl/GLJavaMethodBindingEmitter.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (c) 2003-2005 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.opengl;
-
-import java.io.*;
-import java.util.*;
-import com.sun.gluegen.*;
-import com.sun.gluegen.cgram.types.*;
-import com.sun.gluegen.procaddress.*;
-
-/** A specialization of the proc address emitter which knows how to
- change argument names to take into account Vertex Buffer Object /
- Pixel Buffer Object variants. */
-
-public class GLJavaMethodBindingEmitter extends ProcAddressJavaMethodBindingEmitter {
- protected boolean bufferObjectVariant;
-
- public GLJavaMethodBindingEmitter(JavaMethodBindingEmitter methodToWrap,
- boolean callThroughProcAddress,
- String getProcAddressTableExpr,
- boolean changeNameAndArguments,
- boolean bufferObjectVariant,
- GLEmitter emitter) {
- super(methodToWrap,
- callThroughProcAddress,
- getProcAddressTableExpr,
- changeNameAndArguments,
- emitter);
- this.bufferObjectVariant = bufferObjectVariant;
- }
-
- public GLJavaMethodBindingEmitter(ProcAddressJavaMethodBindingEmitter methodToWrap,
- boolean bufferObjectVariant) {
- super(methodToWrap);
- this.bufferObjectVariant = bufferObjectVariant;
- }
-
- public GLJavaMethodBindingEmitter(GLJavaMethodBindingEmitter methodToWrap) {
- this(methodToWrap, methodToWrap.bufferObjectVariant);
- }
-
- protected String getArgumentName(int i) {
- String name = super.getArgumentName(i);
-
- if (!bufferObjectVariant) {
- return name;
- }
-
- // Emitters for VBO/PBO-related routines change the outgoing
- // argument name for the buffer
- if (binding.getJavaArgumentType(i).isLong()) {
- Type cType = binding.getCArgumentType(i);
- if (cType.isPointer() &&
- (cType.asPointer().getTargetType().isVoid() ||
- cType.asPointer().getTargetType().isPrimitive())) {
- return name + "_buffer_offset";
- }
- }
-
- return name;
- }
-}
diff --git a/src/java/com/sun/gluegen/pcpp/ConcatenatingReader.java b/src/java/com/sun/gluegen/pcpp/ConcatenatingReader.java
deleted file mode 100755
index 90192d2..0000000
--- a/src/java/com/sun/gluegen/pcpp/ConcatenatingReader.java
+++ /dev/null
@@ -1,174 +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.pcpp;
-
-import java.io.*;
-
-/** A Reader implementation which finds lines ending in the backslash
- character ('\') and concatenates them with the next line. */
-
-public class ConcatenatingReader extends FilterReader {
- // Any leftover characters go here
- private char[] curBuf;
- private int curPos;
- private BufferedReader in;
- private static String newline = System.getProperty("line.separator");
-
- /** This class requires that the input reader be a BufferedReader so
- it can do line-oriented operations. */
- public ConcatenatingReader(BufferedReader in) {
- super(in);
- this.in = in;
- }
-
- public int read() throws IOException {
- char[] tmp = new char[1];
- int num = read(tmp, 0, 1);
- if (num < 0)
- return -1;
- return tmp[0];
- }
-
- // It's easier not to support mark/reset since we don't need it
- public boolean markSupported() {
- return false;
- }
-
- public void mark(int readAheadLimit) throws IOException {
- throw new IOException("mark/reset not supported");
- }
-
- public void reset() throws IOException {
- throw new IOException("mark/reset not supported");
- }
-
- public boolean ready() throws IOException {
- if (curBuf != null || in.ready())
- return true;
- return false;
- }
-
- public int read(char[] cbuf, int off, int len) throws IOException {
- if (curBuf == null) {
- nextLine();
- }
-
- if (curBuf == null) {
- return -1;
- }
-
- int numRead = 0;
-
- while ((len > 0) && (curBuf != null) && (curPos < curBuf.length)) {
- cbuf[off] = curBuf[curPos];
- ++curPos;
- ++off;
- --len;
- ++numRead;
- if (curPos == curBuf.length) {
- nextLine();
- }
- }
-
- return numRead;
- }
-
- public long skip(long n) throws IOException {
- long numSkipped = 0;
-
- while (n > 0) {
- int intN = (int) n;
- char[] tmp = new char[intN];
- int numRead = read(tmp, 0, intN);
- n -= numRead;
- numSkipped += numRead;
- if (numRead < intN)
- break;
- }
- return numSkipped;
- }
-
- private void nextLine() throws IOException {
- String cur = in.readLine();
- if (cur == null) {
- curBuf = null;
- return;
- }
- // The trailing newline was trimmed by the readLine() method. See
- // whether we have to put it back or not, depending on whether the
- // last character of the line is the concatenation character.
- int numChars = cur.length();
- boolean needNewline = true;
- if ((numChars > 0) &&
- (cur.charAt(cur.length() - 1) == '\\')) {
- --numChars;
- needNewline = false;
- }
- char[] buf = new char[numChars + (needNewline ? newline.length() : 0)];
- cur.getChars(0, numChars, buf, 0);
- if (needNewline) {
- newline.getChars(0, newline.length(), buf, numChars);
- }
- curBuf = buf;
- curPos = 0;
- }
-
- // Test harness
- /*
- public static void main(String[] args) throws IOException {
- if (args.length != 1) {
- System.out.println("Usage: java ConcatenatingReader [file name]");
- System.exit(1);
- }
-
- ConcatenatingReader reader = new ConcatenatingReader(new BufferedReader(new FileReader(args[0])));
- OutputStreamWriter writer = new OutputStreamWriter(System.out);
- char[] buf = new char[8192];
- boolean done = false;
- while (!done && reader.ready()) {
- int numRead = reader.read(buf, 0, buf.length);
- writer.write(buf, 0, numRead);
- if (numRead < buf.length)
- done = true;
- }
- writer.flush();
- }
- */
-}
diff --git a/src/java/com/sun/gluegen/pcpp/PCPP.java b/src/java/com/sun/gluegen/pcpp/PCPP.java
deleted file mode 100644
index d5d9604..0000000
--- a/src/java/com/sun/gluegen/pcpp/PCPP.java
+++ /dev/null
@@ -1,873 +0,0 @@
-/*
- * Copyright (c) 2003 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.pcpp;
-
-import java.io.*;
-import java.util.*;
-
-/** A minimal pseudo-C-preprocessor designed in particular to preserve
- #define statements defining constants so they can be observed by a
- glue code generator. */
-
-public class PCPP {
- private static final boolean disableDebugPrint = true;
-
- public PCPP(List/*<String>*/ includePaths) {
- this.includePaths = includePaths;
- setOut(System.out);
- }
-
- public OutputStream out() { return out; }
- public void setOut(OutputStream out) { this.out = out; writer = new PrintWriter(out); }
-
- public void run(Reader reader, String filename) throws IOException {
- StreamTokenizer tok = null;
- BufferedReader bufReader = null;
- if (reader instanceof BufferedReader) {
- bufReader = (BufferedReader) reader;
- } else {
- bufReader = new BufferedReader(reader);
- }
- tok = new StreamTokenizer(new ConcatenatingReader(bufReader));
- tok.resetSyntax();
- tok.wordChars('a', 'z');
- tok.wordChars('A', 'Z');
- tok.wordChars('0', '9');
- tok.wordChars('_', '_');
- tok.wordChars('.', '.');
- tok.wordChars(128 + 32, 255);
- tok.whitespaceChars(0, ' ');
- tok.quoteChar('"');
- tok.quoteChar('\'');
- tok.eolIsSignificant(true);
- tok.slashSlashComments(true);
- tok.slashStarComments(true);
- ParseState curState = new ParseState(tok, filename);
- ParseState oldState = state;
- state = curState;
- lineDirective();
- parse();
- state = oldState;
- if (state != null) {
- lineDirective();
- }
- }
-
- public static void main(String[] args) {
- try {
- Reader reader = null;
- String filename = null;
-
- if (args.length == 0) {
- usage();
- }
-
- List includePaths = new ArrayList();
- for (int i = 0; i < args.length; i++) {
- if (i < args.length - 1) {
- String arg = args[i];
- if (arg.startsWith("-I")) {
- String[] paths = arg.substring(2).split(System.getProperty("path.separator"));
- for (int j = 0; j < paths.length; j++) {
- includePaths.add(paths[j]);
- }
- } else {
- usage();
- }
- } else {
- String arg = args[i];
- if (arg.equals("-")) {
- reader = new InputStreamReader(System.in);
- filename = "standard input";
- } else {
- if (arg.startsWith("-")) {
- usage();
- }
- filename = arg;
- reader = new BufferedReader(new FileReader(filename));
- }
- }
- }
-
- new PCPP(includePaths).run(reader, filename);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- public String findFile(String filename) {
- String sep = File.separator;
- for (Iterator iter = includePaths.iterator(); iter.hasNext(); ) {
- String inclPath = (String) iter.next();
- String fullPath = inclPath + sep + filename;
- File file = new File(fullPath);
- if (file.exists()) {
- return fullPath;
- }
- }
- return null;
- }
-
- //----------------------------------------------------------------------
- // Internals only below this point
- //
-
- private static void usage() {
- System.out.println("Usage: java PCPP [filename | -]");
- System.out.println("Minimal pseudo-C-preprocessor.");
- System.out.println("Output goes to standard output. Standard input can be used as input");
- System.out.println("by passing '-' as the argument.");
- System.exit(1);
- }
-
- /** Map containing the results of #define statements. We must
- evaluate certain very simple definitions (to properly handle
- OpenGL's gl.h) but preserve the text of definitions evaluating
- to constants. Macros and multi-line defines (which typically
- contain either macro definitions or expressions) are currently
- not handled. */
- private Map/*<String, String>*/ defineMap = new HashMap();
- private Set/*<String>*/ nonConstantDefines = new HashSet();
-
- /** List containing the #include paths as Strings */
- private List/*<String>*/ includePaths;
-
- // State
- static class ParseState {
- private StreamTokenizer tok;
- private String filename;
- private int lineNumber;
- private boolean startOfLine;
- private boolean startOfFile;
-
- ParseState(StreamTokenizer tok, String filename) {
- this.tok = tok;
- this.filename = filename;
- lineNumber = 1;
- startOfLine = true;
- startOfFile = true;
- }
-
- StreamTokenizer tok() { return tok; }
- String filename() { return filename; }
- int lineNumber() { return tok.lineno(); }
- boolean startOfLine() { return startOfLine; }
- void setStartOfLine(boolean val) { startOfLine = val; }
- boolean startOfFile() { return startOfFile; }
- void setStartOfFile(boolean val) { startOfFile = val; }
- }
-
- private ParseState state;
-
- // Accessors
-
- private void pushBackToken() throws IOException {
- state.tok().pushBack();
- }
-
- /** Equivalent to nextToken(false) */
- private int nextToken() throws IOException {
- return nextToken(false);
- }
-
- private int nextToken(boolean returnEOLs) throws IOException {
- int lineno = lineNumber();
- // Check to see whether the previous call to nextToken() left an
- // EOL on the stream
- if (curToken() == StreamTokenizer.TT_EOL) {
- state.setStartOfLine(true);
- } else if (!state.startOfFile()) {
- state.setStartOfLine(false);
- }
- state.setStartOfFile(false);
- int val = state.tok().nextToken();
- if (!returnEOLs) {
- if (val == StreamTokenizer.TT_EOL) {
- do {
- // Consume and return next token, setting state appropriately
- val = state.tok().nextToken();
- state.setStartOfLine(true);
- println();
- } while (val == StreamTokenizer.TT_EOL);
- }
- }
- if (lineNumber() > lineno + 1) {
- // This is a little noisier than it needs to be, but does handle
- // the case of multi-line comments properly
- lineDirective();
- }
- return val;
- }
-
- /**
- * Reads the next token and throws an IOException if it is not the specified
- * token character.
- */
- private void nextRequiredToken(int requiredToken) throws IOException {
- int nextTok = nextToken();
- if (nextTok != requiredToken) {
- String msg = "Expected token '" + requiredToken + "' but got ";
- switch (nextTok) {
- case StreamTokenizer.TT_EOF: msg += "<EOF>"; break;
- case StreamTokenizer.TT_EOL: msg += "<EOL>"; break;
- default: msg += "'" + curTokenAsString() + "'"; break;
- }
- msg += " at file " + filename() + ", line " + lineNumber();
- throw new IOException(msg);
- }
- }
-
- private int curToken() {
- return state.tok().ttype;
- }
-
- private String curTokenAsString() {
- int t = curToken();
- if (t == StreamTokenizer.TT_WORD) {
- return curWord();
- }
- if (t == StreamTokenizer.TT_EOL) {
- throw new RuntimeException("Should not be converting EOL characters to strings");
- }
- char c = (char) t;
- if (c == '"' || c == '\'') {
- StringBuffer buf = new StringBuffer();
- buf.append(c);
- buf.append(state.tok().sval);
- buf.append(c);
- return buf.toString();
- }
- return new String(new char[] { c });
- }
-
- private String nextWord() throws IOException {
- int val = nextToken();
- if (val != StreamTokenizer.TT_WORD) {
- throw new RuntimeException("Expected word at file " + filename() +
- ", line " + lineNumber());
- }
- return curWord();
- }
-
- private String curWord() {
- return state.tok().sval;
- }
-
- private boolean startOfLine() {
- return state.startOfLine();
- }
-
- private String filename() {
- return state.filename();
- }
-
- private int lineNumber() {
- return state.lineNumber();
- }
-
- /////////////
- // Parsing //
- /////////////
-
- private void parse() throws IOException {
- int tok = 0;
- while ((tok = nextToken()) != StreamTokenizer.TT_EOF) {
- // A '#' at the beginning of a line is a preprocessor directive
- if (startOfLine() && (tok == '#')) {
- preprocessorDirective();
- } else {
- // Output white space plus current token, handling #defines
- // (though not properly -- only handling #defines to constants and the empty string)
- print(" ");
- String s = curTokenAsString();
- String newS = (String) defineMap.get(s);
- if (newS == null) {
- newS = s;
- }
- print(newS);
- }
- }
- flush();
- }
-
- private void preprocessorDirective() throws IOException {
- String w = nextWord();
- boolean shouldPrint = true;
- if (w.equals("define")) {
- handleDefine();
- shouldPrint = false;
- } else if (w.equals("undef")) {
- handleUndefine();
- shouldPrint = false;
- } else if (w.equals("if") || w.equals("elif")) {
- handleIf(w.equals("if"));
- shouldPrint = false;
- } else if (w.equals("ifdef") || w.equals("ifndef")) {
- handleIfdef(w.equals("ifdef"));
- shouldPrint = false;
- } else if (w.equals("else")) {
- handleElse();
- shouldPrint = false;
- } else if (w.equals("endif")) {
- handleEndif();
- shouldPrint = false;
- } else if (w.equals("include")) {
- handleInclude();
- shouldPrint = false;
- } else {
- // Unknown preprocessor directive (#pragma?) -- ignore
- }
- if (shouldPrint) {
- print("# ");
- printToken();
- }
- }
-
- ////////////////////////////////////
- // Handling of #define directives //
- ////////////////////////////////////
-
- private void handleUndefine() throws IOException {
- // Next token is the name of the #undef
- String name = nextWord();
-
- debugPrint(true, "#undef " + name);
-
- // there shouldn't be any extra symbols after the name, but just in case...
- List values = new ArrayList();
- while (nextToken(true) != StreamTokenizer.TT_EOL) {
- values.add(curTokenAsString());
- }
-
- if (enabled()) {
- String oldDef = (String)defineMap.remove(name);
- if (oldDef == null) {
- System.err.println("WARNING: ignoring redundant \"#undef " +
- name + "\", at \"" + filename() + "\" line " + lineNumber() +
- ": \"" + name + "\" was not previously defined");
- } else {
- // System.err.println("UNDEFINED: '" + name + "' (line " + lineNumber() + " file " + filename() + ")");
- }
- nonConstantDefines.remove(name);
- }
- else System.err.println("FAILED TO UNDEFINE: '" + name + "' (line " + lineNumber() + " file " + filename() + ")");
- }
-
- private void handleDefine() throws IOException {
- // Next token is the name of the #define
- String name = nextWord();
- //System.err.println("IN HANDLE_DEFINE: '" + name + "' (line " + lineNumber() + " file " + filename() + ")");
- // (Note that this is not actually proper handling for multi-line #defines)
- List values = new ArrayList();
- while (nextToken(true) != StreamTokenizer.TT_EOL) {
- values.add(curTokenAsString());
- }
- // if we're not within an active block of code (like inside an "#ifdef
- // FOO" where FOO isn't defined), then don't actually alter the definition
- // map.
- debugPrint(true, "#define " + name);
- if (enabled())
- {
- boolean emitDefine = true;
-
- // Handle #definitions to nothing or to a constant value
- int sz = values.size();
- if (sz == 0) {
- // definition to nothing, like "#define FOO"
- String oldDef = (String)defineMap.put(name, "");
- if (oldDef != null) {
- System.err.println("WARNING: \"" + name + "\" redefined from \"" +
- oldDef + "\" to \"\"");
- }
- // We don't want to emit the define, because it would serve no purpose
- // and cause GlueGen errors (confuse the GnuCParser)
- emitDefine = false;
- //System.out.println("//---DEFINED: " + name + "to \"\"");
- } else if (sz == 1) {
- // See whether the value is a constant
- String value = (String) values.get(0);
- if (isConstant(value)) {
- // Value is numeric constant like "#define FOO 5".
- // Put it in the #define map
- String oldDef = (String)defineMap.put(name, value);
- if (oldDef != null) {
- System.err.println("WARNING: \"" + name + "\" redefined from \"" +
- oldDef + "\" to \"" + value + "\"");
- }
- //System.out.println("//---DEFINED: " + name + " to \"" + value + "\"");
- } else {
- // Value is a symbolic constant like "#define FOO BAR".
- // Try to look up the symbol's value
- String newValue = resolveDefine(value, true);
- if (newValue != null) {
- // Set the value to the value of the symbol.
- //
- // TO DO: Is this correct? Why not output the symbol unchanged?
- // I think that it's a good thing to see that some symbols are
- // defined in terms of others. -chris
- values.set(0, newValue);
- }
- else
- {
- // Still perform textual replacement
- defineMap.put(name, value);
- nonConstantDefines.add(name);
- emitDefine = false;
- }
- }
- }
- else
- {
- // Non-constant define; try to do reasonable textual substitution anyway
- // (FIXME: should identify some of these, like (-1), as constants)
- emitDefine = false;
- StringBuffer val = new StringBuffer();
- for (int i = 0; i < sz; i++) {
- if (i != 0) {
- val.append(" ");
- }
- val.append(resolveDefine((String) values.get(i), false));
- }
- if (defineMap.get(name) != null) {
- // This is probably something the user should investigate.
- throw new RuntimeException("Cannot redefine symbol \"" + name +
- " from \"" + defineMap.get(name) + "\" to non-constant " +
- " definition \"" + val.toString() + "\"");
- }
- defineMap.put(name, val.toString());
- nonConstantDefines.add(name);
- }
-
- if (emitDefine)
- {
- // Print name and value
- print("# define ");
- print(name);
- for (Iterator iter = values.iterator(); iter.hasNext(); ) {
- print(" ");
- print((String) iter.next());
- }
- println();
- }
-
- } // end if (enabled())
-
- //System.err.println("OUT HANDLE_DEFINE: " + name);
- }
-
- private boolean isConstant(String s) {
- if (s.startsWith("0x") || s.startsWith("0X")) {
- return checkHex(s);
- } else {
- return checkDecimal(s);
- }
- }
-
- private boolean checkHex(String s) {
- for (int i = 2; i < s.length(); i++) {
- char c = s.charAt(i);
- if (!((c >= '0' && c <= '9') ||
- (c >= 'a' && c <= 'f') ||
- (c >= 'A' && c <= 'F'))) {
- return false;
- }
- }
- return true;
- }
-
- private boolean checkDecimal(String s) {
- try {
- Float.valueOf(s);
- }
- catch (NumberFormatException e) {
- // not parsable as a number
- return false;
- }
- return true;
- }
-
- private String resolveDefine(String word, boolean returnNullIfNotFound) {
- String lastWord = (String) defineMap.get(word);
- if (lastWord == null) {
- if (returnNullIfNotFound) {
- return null;
- }
- return word;
- }
- String nextWord = null;
- do {
- nextWord = (String) defineMap.get(lastWord);
- if (nextWord != null) {
- lastWord = nextWord;
- }
- } while (nextWord != null);
- return lastWord;
- }
-
- ////////////////////////////////////////////////
- // Handling of #if/#ifdef/ifndef/endif directives //
- ////////////////////////////////////////////////
-
- /**
- * @param isIfdef if true, we're processing #ifdef; if false, we're
- * processing #ifndef.
- */
- private void handleIfdef(boolean isIfdef) throws IOException {
- // Next token is the name of the #ifdef
- String symbolName = nextWord();
- debugPrint(true, (isIfdef ? "#ifdef " : "#ifndef ") + symbolName);
- boolean symbolIsDefined = defineMap.get(symbolName) != null;
- //debugPrint(true, "HANDLE_IFDEF: ifdef(" + symbolName + ") = " + symbolIsDefined );
- pushEnableBit(enabled() && symbolIsDefined == isIfdef);
- }
-
- /** Handles #else directives */
- private void handleElse() throws IOException {
- boolean enabledStatusBeforeElse = enabled();
- popEnableBit();
- pushEnableBit(enabled() && !enabledStatusBeforeElse);
- debugPrint(true, "#else ");
- }
-
- private void handleEndif() {
- boolean enabledBeforePopping = enabled();
- popEnableBit();
-
- // print the endif if we were enabled prior to popEnableBit() (sending
- // false to debugPrint means "print regardless of current enabled() state).
- debugPrint(!enabledBeforePopping, "#endif/end-else");
- }
-
- /**
- * @param isIf if true, we're processing #if; if false, we're
- * processing #elif.
- */
- private void handleIf(boolean isIf) throws IOException {
- //System.out.println("IN HANDLE_" + (isIf ? "IF" : "ELIF") + " file \"" + filename() + " line " + lineNumber());
- debugPrint(true, (isIf ? "#if" : "#elif"));
- boolean defineEvaluatedToTrue = handleIfRecursive(true);
- if (!isIf) {
- popEnableBit();
- }
- pushEnableBit(enabled() && defineEvaluatedToTrue == isIf);
- //System.out.println("OUT HANDLE_" + (isIf ? "IF" : "ELIF") +" (evaluated to " + defineEvaluatedToTrue + ")");
- }
-
- //static int tmp = -1;
-
- /**
- * This method is called recursively to process nested sub-expressions such as:
- * <pre>
- * #if !defined(OPENSTEP) && !(defined(NeXT) || !defined(NeXT_PDO))
- *</pre>
- *
- * @param greedy if true, continue evaluating sub-expressions until EOL is
- * reached. If false, return as soon as the first sub-expression is
- * processed.
- * @return the value of the sub-expression or (if greedy==true)
- * series of sub-expressions.
- */
- private boolean handleIfRecursive(boolean greedy) throws IOException {
- //System.out.println("IN HANDLE_IF_RECURSIVE (" + ++tmp + ", greedy = " + greedy + ")"); System.out.flush();
-
- // ifValue keeps track of the current value of the potentially nested
- // "defined()" expressions as we process them.
- boolean ifValue = true;
- int openParens = 0;
- int tok;
- do {
- tok = nextToken(true);
- //System.out.println("-- READ: [" + (tok == StreamTokenizer.TT_EOL ? "<EOL>" :curTokenAsString()) + "]");
- switch (tok) {
- case '(':
- ++openParens;
- //System.out.println("OPEN PARENS = " + openParens);
- ifValue = ifValue && handleIfRecursive(true);
- break;
- case ')':
- --openParens;
- //System.out.println("OPEN PARENS = " + openParens);
- break;
- case '!':
- {
- //System.out.println("HANDLE_IF_RECURSIVE HANDLING !");
- boolean rhs = handleIfRecursive(false);
- ifValue = !rhs;
- //System.out.println("HANDLE_IF_RECURSIVE HANDLED OUT !, RHS = " + rhs);
- }
- break;
- case '&':
- {
- nextRequiredToken('&');
- //System.out.println("HANDLE_IF_RECURSIVE HANDLING &&, LHS = " + ifValue);
- boolean rhs = handleIfRecursive(true);
- //System.out.println("HANDLE_IF_RECURSIVE HANDLED &&, RHS = " + rhs);
- ifValue = ifValue && rhs;
- }
- break;
- case '|':
- {
- nextRequiredToken('|');
- //System.out.println("HANDLE_IF_RECURSIVE HANDLING ||, LHS = " + ifValue);
- boolean rhs = handleIfRecursive(true);
- //System.out.println("HANDLE_IF_RECURSIVE HANDLED ||, RHS = " + rhs);
- ifValue = ifValue || rhs;
- }
- break;
- case '>':
- {
- // NOTE: we don't handle expressions like this properly
- boolean rhs = handleIfRecursive(true);
- ifValue = false;
- }
- break;
- case '<':
- {
- // NOTE: we don't handle expressions like this properly
- boolean rhs = handleIfRecursive(true);
- ifValue = false;
- }
- break;
- case '=':
- {
- // NOTE: we don't handle expressions like this properly
- boolean rhs = handleIfRecursive(true);
- ifValue = false;
- }
- break;
- case StreamTokenizer.TT_WORD:
- {
- String word = curTokenAsString();
- if (word.equals("defined")) {
- // Handle things like #if defined(SOMESYMBOL)
- nextRequiredToken('(');
- String symbol = nextWord();
- boolean isDefined = defineMap.get(symbol) != null;
- //System.out.println("HANDLE_IF_RECURSIVE HANDLING defined(" + symbol + ") = " + isDefined);
- ifValue = ifValue && isDefined;
- nextRequiredToken(')');
- }
- else {
- // Handle things like #if SOME_SYMBOL.
- String symbolValue = (String)defineMap.get(word);
-
- // See if the statement is "true"; i.e., a non-zero expression
- if (symbolValue != null) {
- // The statement is true if the symbol is defined and is a constant expression
- return (!nonConstantDefines.contains(word));
- } else {
- // The statement is true if the symbol evaluates to a non-zero value
- //
- // NOTE: This doesn't yet handle evaluable expressions like "#if
- // SOME_SYMBOL > 5" or "#if SOME_SYMBOL == 0", both of which are
- // valid syntax. It only handles numeric symbols like "#if 1"
-
- try {
- // see if it's in decimal form
- return Double.parseDouble(word) != 0;
- }
- catch (NumberFormatException nfe1) {
- try {
- // ok, it's not a valid decimal value, try hex/octal value
- return Long.parseLong(word) != 0;
- }
- catch (NumberFormatException nfe2) {
- try {
- // ok, it's not a valid hex/octal value, try boolean
- return Boolean.valueOf(word) == Boolean.TRUE;
- }
- catch (NumberFormatException nfe3) {
- // give up; the symbol isn't a numeric or boolean value
- return false;
- }
- }
- }
- }
- }
- } // end case TT_WORD
- break;
- case StreamTokenizer.TT_EOL:
- //System.out.println("HANDLE_IF_RECURSIVE HIT <EOL>!");
- pushBackToken(); // so caller hits EOL as well if we're recursing
- break;
- case StreamTokenizer.TT_EOF:
- throw new RuntimeException("Unexpected end of file while parsing " +
- "#if statement at file " + filename() + ", line " + lineNumber());
-
- default:
- throw new RuntimeException("Unexpected token (" + curTokenAsString() +
- ") while parsing " + "#if statement at file " + filename() +
- ", line " + lineNumber());
- }
- //System.out.println("END OF WHILE: greedy = " + greedy + " parens = " +openParens + " not EOL = " + (tok != StreamTokenizer.TT_EOL) + " --> " + ((greedy && openParens >= 0) && tok != StreamTokenizer.TT_EOL));
- } while ((greedy && openParens >= 0) && tok != StreamTokenizer.TT_EOL);
- //System.out.println("OUT HANDLE_IF_RECURSIVE (" + tmp-- + ", returning " + ifValue + ")");
- //System.out.flush();
- return ifValue;
- }
-
- /////////////////////////////////////
- // Handling of #include directives //
- /////////////////////////////////////
-
- private void handleInclude() throws IOException {
- // Two kinds of #includes: one with quoted string for argument,
- // one with angle brackets surrounding argument
- int t = nextToken();
- String filename = null;
- if (t == '"') {
- filename = curWord();
- } else if (t == '<') {
- // Components of path name are coming in as separate tokens;
- // concatenate them
- StringBuffer buf = new StringBuffer();
- while ((t = nextToken()) != '>' && (t != StreamTokenizer.TT_EOF)) {
- buf.append(curTokenAsString());
- }
- if (t == StreamTokenizer.TT_EOF) {
- System.err.println("WARNING: unexpected EOF while processing #include directive");
- }
- filename = buf.toString();
- }
- // if we're not within an active block of code (like inside an "#ifdef
- // FOO" where FOO isn't defined), then don't actually process the
- // #included file.
- debugPrint(true, "#include [" + filename + "]");
- if (enabled())
- {
- // Look up file in known #include path
- String fullname = findFile(filename);
- //System.out.println("ACTIVE BLOCK, LOADING " + filename);
- if (fullname == null) {
- System.err.println("WARNING: unable to find #include file \"" + filename + "\"");
- return;
- }
- // Process this file in-line
- Reader reader = new BufferedReader(new FileReader(fullname));
- run(reader, fullname);
- }
- else
- {
- //System.out.println("INACTIVE BLOCK, SKIPPING " + filename);
- }
- }
-
- ////////////
- // Output //
- ////////////
-
- private OutputStream out;
- private PrintWriter writer;
- private ArrayList enabledBits = new ArrayList();
-
- private static int debugPrintIndentLevel = 0;
- private void debugPrint(boolean onlyPrintIfEnabled, String msg)
- {
- if (disableDebugPrint) {
- return;
- }
-
- if (!onlyPrintIfEnabled || (onlyPrintIfEnabled && enabled()))
- {
- for (int i = debugPrintIndentLevel; --i >0; ) {
- System.out.print(" ");
- }
- System.out.println(msg + " (line " + lineNumber() + " file " + filename() + ")");
- }
- }
-
- private void pushEnableBit(boolean enabled) {
- enabledBits.add(new Boolean(enabled));
- ++debugPrintIndentLevel;
- //debugPrint(false, "PUSH_ENABLED, NOW: " + enabled());
- }
-
- private void popEnableBit() {
- if (enabledBits.size() == 0) {
- System.err.println("WARNING: mismatched #ifdef/endif pairs");
- return;
- }
- enabledBits.remove(enabledBits.size() - 1);
- --debugPrintIndentLevel;
- //debugPrint(false, "POP_ENABLED, NOW: " + enabled());
- }
-
- private boolean enabled() {
- return (enabledBits.size() == 0 ||
- ((Boolean) enabledBits.get(enabledBits.size() - 1)).booleanValue());
- }
-
- private void print(String s) {
- if (enabled()) {
- writer.print(s);
- //System.out.print(s);//debug
- }
- }
-
- private void print(char c) {
- if (enabled()) {
- writer.print(c);
- //System.err.print(c); //debug
- }
- }
-
- private void println() {
- if (enabled()) {
- writer.println();
- //System.err.println();//debug
- }
- }
-
- private void printToken() {
- print(curTokenAsString());
- }
-
- private void flush() {
- if (enabled()) {
- writer.flush();
- //System.err.flush(); //debug
- }
- }
-
- private void lineDirective() {
- print("# " + lineNumber() + " \"" + filename() + "\"");
- println();
- }
-}
diff --git a/src/java/com/sun/gluegen/procaddress/ProcAddressCMethodBindingEmitter.java b/src/java/com/sun/gluegen/procaddress/ProcAddressCMethodBindingEmitter.java
deleted file mode 100755
index 41bae10..0000000
--- a/src/java/com/sun/gluegen/procaddress/ProcAddressCMethodBindingEmitter.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright (c) 2003-2005 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.procaddress;
-
-import java.io.*;
-import java.util.*;
-import com.sun.gluegen.*;
-import com.sun.gluegen.cgram.types.*;
-
-public class ProcAddressCMethodBindingEmitter extends CMethodBindingEmitter {
- private boolean callThroughProcAddress;
- private boolean needsLocalTypedef;
- private static String procAddressJavaTypeName =
- JavaType.createForClass(Long.TYPE).jniTypeName();
- private ProcAddressEmitter emitter;
-
- public ProcAddressCMethodBindingEmitter(CMethodBindingEmitter methodToWrap,
- final boolean callThroughProcAddress,
- boolean needsLocalTypedef,
- ProcAddressEmitter emitter) {
- super(
- new MethodBinding(methodToWrap.getBinding()) {
- public String getName() {
- if (callThroughProcAddress) {
- return ProcAddressEmitter.WRAP_PREFIX + super.getName();
- } else {
- return super.getName();
- }
- }
-
- public String getRenamedMethodName() {
- if (callThroughProcAddress) {
- return ProcAddressEmitter.WRAP_PREFIX + super.getRenamedMethodName();
- } else {
- return super.getRenamedMethodName();
- }
- }
- },
- methodToWrap.getDefaultOutput(),
- methodToWrap.getJavaPackageName(),
- methodToWrap.getJavaClassName(),
- methodToWrap.getIsOverloadedBinding(),
- methodToWrap.getIsJavaMethodStatic(),
- true,
- methodToWrap.forIndirectBufferAndArrayImplementation(),
- methodToWrap.getMachineDescription()
- );
-
- if (methodToWrap.getReturnValueCapacityExpression() != null) {
- setReturnValueCapacityExpression(methodToWrap.getReturnValueCapacityExpression());
- }
- if (methodToWrap.getReturnValueLengthExpression() != null) {
- setReturnValueLengthExpression(methodToWrap.getReturnValueLengthExpression());
- }
- setTemporaryCVariableDeclarations(methodToWrap.getTemporaryCVariableDeclarations());
- setTemporaryCVariableAssignments (methodToWrap.getTemporaryCVariableAssignments ());
-
- setCommentEmitter(defaultCommentEmitter);
- this.callThroughProcAddress = callThroughProcAddress;
- this.needsLocalTypedef = needsLocalTypedef;
- this.emitter = emitter;
- }
-
- protected int emitArguments(PrintWriter writer) {
- int numEmitted = super.emitArguments(writer);
- if (callThroughProcAddress) {
- if (numEmitted > 0)
- {
- writer.print(", ");
- }
- writer.print(procAddressJavaTypeName);
- writer.print(" procAddress");
- ++numEmitted;
- }
-
- return numEmitted;
- }
-
- protected void emitBodyVariableDeclarations(PrintWriter writer) {
- if (callThroughProcAddress) {
- // create variable for the function pointer with the right type, and set
- // it to the value of the passed-in proc address
- FunctionSymbol cSym = getBinding().getCSymbol();
- String funcPointerTypedefName =
- emitter.getFunctionPointerTypedefName(cSym);
-
- if (needsLocalTypedef) {
- // We (probably) didn't get a typedef for this function
- // pointer type in the header file; the user requested that we
- // forcibly generate one. Here we force the emission of one.
- PointerType funcPtrType = new PointerType(null, cSym.getType(), 0);
- // Just for safety, emit this name slightly differently than
- // the mangling would otherwise produce
- funcPointerTypedefName = "_local_" + funcPointerTypedefName;
-
- writer.print(" typedef ");
- writer.print(funcPtrType.toString(funcPointerTypedefName));
- writer.println(";");
- }
-
- writer.print(" ");
- writer.print(funcPointerTypedefName);
- writer.print(" ptr_");
- writer.print(cSym.getName());
- writer.println(";");
- }
-
- super.emitBodyVariableDeclarations(writer);
- }
-
- protected void emitBodyVariablePreCallSetup(PrintWriter writer,
- boolean emittingPrimitiveArrayCritical) {
- super.emitBodyVariablePreCallSetup(writer, emittingPrimitiveArrayCritical);
-
- if (callThroughProcAddress) {
- if (!emittingPrimitiveArrayCritical) {
- // set the function pointer to the value of the passed-in glProcAddress
- FunctionSymbol cSym = getBinding().getCSymbol();
- String funcPointerTypedefName = emitter.getFunctionPointerTypedefName(cSym);
- if (needsLocalTypedef) {
- funcPointerTypedefName = "_local_" + funcPointerTypedefName;
- }
-
- String ptrVarName = "ptr_" + cSym.getName();
-
- writer.print(" ");
- writer.print(ptrVarName);
- writer.print(" = (");
- writer.print(funcPointerTypedefName);
- writer.println(") (intptr_t) procAddress;");
-
- writer.println(" assert(" + ptrVarName + " != NULL);");
- }
- }
- }
-
- protected void emitBodyCallCFunction(PrintWriter writer) {
- if (!callThroughProcAddress) {
- super.emitBodyCallCFunction(writer);
- } else {
- // Make the call to the actual C function
- writer.print(" ");
-
- // WARNING: this code assumes that the return type has already been
- // typedef-resolved.
- Type cReturnType = binding.getCReturnType();
-
- if (!cReturnType.isVoid()) {
- writer.print("_res = ");
- }
- MethodBinding binding = getBinding();
- if (binding.hasContainingType()) {
- // FIXME: this can and should be handled and unified with the
- // associated code in the CMethodBindingEmitter
- throw new IllegalStateException("Cannot call through function pointer because binding has containing type: " + binding);
- }
-
- // call throught the run-time function pointer
- writer.print("(* ptr_");
- writer.print(binding.getCSymbol().getName());
- writer.print(") ");
- writer.print("(");
- emitBodyPassCArguments(writer);
- writer.println(");");
- }
- }
-
- protected String jniMangle(MethodBinding binding) {
- StringBuffer buf = new StringBuffer(super.jniMangle(binding));
- if (callThroughProcAddress) {
- jniMangle(Long.TYPE, buf, false); // to account for the additional _addr_ parameter
- }
- return buf.toString();
- }
-}
diff --git a/src/java/com/sun/gluegen/procaddress/ProcAddressConfiguration.java b/src/java/com/sun/gluegen/procaddress/ProcAddressConfiguration.java
deleted file mode 100755
index e5edd0d..0000000
--- a/src/java/com/sun/gluegen/procaddress/ProcAddressConfiguration.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright (c) 2003-2005 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.procaddress;
-
-import java.io.*;
-import java.text.*;
-import java.util.*;
-
-import com.sun.gluegen.*;
-
-public class ProcAddressConfiguration extends JavaConfiguration
-{
- private boolean emitProcAddressTable = false;
- private String tableClassPackage;
- private String tableClassName = "ProcAddressTable";
- private Set/*<String>*/ skipProcAddressGen = new HashSet();
- private List/*<String>*/ forceProcAddressGen = new ArrayList();
- private Set/*<String>*/ forceProcAddressGenSet = new HashSet();
- private String getProcAddressTableExpr;
- private ConvNode procAddressNameConverter;
-
- protected void dispatch(String cmd, StringTokenizer tok, File file, String filename, int lineNo) throws IOException {
- if (cmd.equalsIgnoreCase("EmitProcAddressTable"))
- {
- emitProcAddressTable =
- readBoolean("EmitProcAddressTable", tok, filename, lineNo).booleanValue();
- }
- else if (cmd.equalsIgnoreCase("ProcAddressTablePackage"))
- {
- tableClassPackage = readString("ProcAddressTablePackage", tok, filename, lineNo);
- }
- else if (cmd.equalsIgnoreCase("ProcAddressTableClassName"))
- {
- tableClassName = readString("ProcAddressTableClassName", tok, filename, lineNo);
- }
- else if (cmd.equalsIgnoreCase("SkipProcAddressGen"))
- {
- String sym = readString("SkipProcAddressGen", tok, filename, lineNo);
- skipProcAddressGen.add(sym);
- }
- else if (cmd.equalsIgnoreCase("ForceProcAddressGen"))
- {
- String sym = readString("ForceProcAddressGen", tok, filename, lineNo);
- forceProcAddressGen.add(sym);
- forceProcAddressGenSet.add(sym);
- }
- else if (cmd.equalsIgnoreCase("GetProcAddressTableExpr"))
- {
- getProcAddressTableExpr = readGetProcAddressTableExpr(tok, filename, lineNo);
- }
- else if (cmd.equalsIgnoreCase("ProcAddressNameExpr"))
- {
- readProcAddressNameExpr(tok, filename, lineNo);
- }
- else
- {
- super.dispatch(cmd,tok,file,filename,lineNo);
- }
- }
-
- protected String readGetProcAddressTableExpr(StringTokenizer tok, String filename, int lineNo) {
- try {
- String restOfLine = tok.nextToken("\n\r\f");
- return restOfLine.trim();
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"GetProcAddressTableExpr\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- protected void setProcAddressNameExpr(String expr) {
- // Parse this into something allowing us to map from a function
- // name to the typedef'ed function pointer name
- List/*<String>*/ tokens = new ArrayList/*<String>*/();
- StringTokenizer tok1 = new StringTokenizer(expr);
- while (tok1.hasMoreTokens()) {
- String sstr = tok1.nextToken();
- StringTokenizer tok2 = new StringTokenizer(sstr, "$()", true);
- while (tok2.hasMoreTokens()) {
- tokens.add(tok2.nextToken());
- }
- }
-
- // Now that the string is flattened out, convert it to nodes
- procAddressNameConverter = makeConverter(tokens.iterator());
- if (procAddressNameConverter == null) {
- throw new NoSuchElementException("Error creating converter from string");
- }
- }
-
- protected void readProcAddressNameExpr(StringTokenizer tok, String filename, int lineNo) {
- try {
- String restOfLine = tok.nextToken("\n\r\f");
- restOfLine = restOfLine.trim();
- setProcAddressNameExpr(restOfLine);
- } catch (NoSuchElementException e) {
- throw new RuntimeException("Error parsing \"ProcAddressNameExpr\" command at line " + lineNo +
- " in file \"" + filename + "\"", e);
- }
- }
-
- private static ConvNode makeConverter(Iterator/*<String>*/ iter) {
- List/*<ConvNode>*/ result = new ArrayList/*<ConvNode>*/();
- while (iter.hasNext()) {
- String str = (String) iter.next();
- if (str.equals("$")) {
- String command = (String) iter.next();
- String openParen = (String) iter.next();
- if (!openParen.equals("(")) {
- throw new NoSuchElementException("Expected \"(\"");
- }
- boolean uppercase = false;
- if (command.equalsIgnoreCase("UPPERCASE")) {
- uppercase = true;
- } else if (!command.equalsIgnoreCase("LOWERCASE")) {
- throw new NoSuchElementException("Unknown ProcAddressNameExpr command \"" + command + "\"");
- }
- result.add(new CaseNode(uppercase, makeConverter(iter)));
- } else if (str.equals(")")) {
- // Fall through and return
- } else if (str.indexOf('{') >= 0) {
- result.add(new FormatNode(str));
- } else {
- result.add(new ConstStringNode(str));
- }
- }
- if (result.size() == 0) {
- return null;
- } else if (result.size() == 1) {
- return (ConvNode) result.get(0);
- } else {
- return new ConcatNode(result);
- }
- }
-
- /** Helper class for converting a function name to the typedef'ed
- function pointer name */
- static abstract class ConvNode {
- abstract String convert(String funcName);
- }
-
- static class FormatNode extends ConvNode {
- private MessageFormat msgFmt;
-
- FormatNode(String fmt) {
- msgFmt = new MessageFormat(fmt);
- }
-
- String convert(String funcName) {
- StringBuffer buf = new StringBuffer();
- msgFmt.format(new Object[] { funcName }, buf, null);
- return buf.toString();
- }
- }
-
- static class ConstStringNode extends ConvNode {
- private String str;
-
- ConstStringNode(String str) {
- this.str = str;
- }
-
- String convert(String funcName) {
- return str;
- }
- }
-
- static class ConcatNode extends ConvNode {
- private List/*<ConvNode>*/ children;
-
- ConcatNode(List/*<ConvNode>*/ children) {
- this.children = children;
- }
-
- String convert(String funcName) {
- StringBuffer res = new StringBuffer();
- for (Iterator iter = children.iterator(); iter.hasNext(); ) {
- ConvNode node = (ConvNode) iter.next();
- res.append(node.convert(funcName));
- }
- return res.toString();
- }
- }
-
- static class CaseNode extends ConvNode {
- private boolean upperCase;
- private ConvNode child;
-
- CaseNode(boolean upperCase, ConvNode child) {
- this.upperCase = upperCase;
- this.child = child;
- }
-
- public String convert(String funcName) {
- if (upperCase) {
- return child.convert(funcName).toUpperCase();
- } else {
- return child.convert(funcName).toLowerCase();
- }
- }
- }
-
- public boolean emitProcAddressTable() { return emitProcAddressTable; }
- public String tableClassPackage() { return tableClassPackage; }
- public String tableClassName() { return tableClassName; }
- public boolean skipProcAddressGen (String name) { return skipProcAddressGen.contains(name); }
- public List getForceProcAddressGen() { return forceProcAddressGen; }
- public String getProcAddressTableExpr() {
- if (getProcAddressTableExpr == null) {
- throw new RuntimeException("GetProcAddressTableExpr was not defined in .cfg file");
- }
- return getProcAddressTableExpr;
- }
- public String convertToFunctionPointerName(String funcName) {
- if (procAddressNameConverter == null) {
- throw new RuntimeException("ProcAddressNameExpr was not defined in .cfg file");
- }
-
- return procAddressNameConverter.convert(funcName);
- }
- public boolean forceProcAddressGen(String funcName) {
- return forceProcAddressGenSet.contains(funcName);
- }
-}
diff --git a/src/java/com/sun/gluegen/procaddress/ProcAddressEmitter.java b/src/java/com/sun/gluegen/procaddress/ProcAddressEmitter.java
deleted file mode 100755
index 45e0bf4..0000000
--- a/src/java/com/sun/gluegen/procaddress/ProcAddressEmitter.java
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- * Copyright (c) 2003-2005 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.procaddress;
-
-import java.io.*;
-import java.text.MessageFormat;
-import java.util.*;
-import com.sun.gluegen.*;
-import com.sun.gluegen.cgram.types.*;
-import com.sun.gluegen.runtime.*;
-
-/**
- * A subclass of JavaEmitter that modifies the normal emission of C
- * and Java code to allow dynamic lookups of the C entry points
- * associated with the Java methods.
- */
-
-public class ProcAddressEmitter extends JavaEmitter
-{
- public static final String PROCADDRESS_VAR_PREFIX = ProcAddressHelper.PROCADDRESS_VAR_PREFIX;
- protected static final String WRAP_PREFIX = "dispatch_";
- private TypeDictionary typedefDictionary;
- private PrintWriter tableWriter;
- private Set emittedTableEntries;
- private String tableClassPackage;
- private String tableClassName;
-
- public void beginFunctions(TypeDictionary typedefDictionary,
- TypeDictionary structDictionary,
- Map canonMap) throws Exception
- {
- this.typedefDictionary = typedefDictionary;
-
- if (getProcAddressConfig().emitProcAddressTable())
- {
- beginProcAddressTable();
- }
- super.beginFunctions(typedefDictionary, structDictionary, canonMap);
- }
-
- public void endFunctions() throws Exception
- {
- if (getProcAddressConfig().emitProcAddressTable())
- {
- endProcAddressTable();
- }
- super.endFunctions();
- }
-
- public void beginStructs(TypeDictionary typedefDictionary,
- TypeDictionary structDictionary,
- Map canonMap) throws Exception {
- super.beginStructs(typedefDictionary, structDictionary, canonMap);
- }
-
- public String runtimeExceptionType() {
- return getConfig().runtimeExceptionType();
- }
-
- protected JavaConfiguration createConfig() {
- return new ProcAddressConfiguration();
- }
-
- protected List generateMethodBindingEmitters(FunctionSymbol sym) throws Exception
- {
- return generateMethodBindingEmittersImpl(sym);
- }
-
- protected boolean needsModifiedEmitters(FunctionSymbol sym) {
- if (!needsProcAddressWrapper(sym) ||
- getConfig().isUnimplemented(sym.getName())) {
- return false;
- }
-
- return true;
- }
-
- private List generateMethodBindingEmittersImpl(FunctionSymbol sym) throws Exception
- {
- List defaultEmitters = super.generateMethodBindingEmitters(sym);
-
- // if the superclass didn't generate any bindings for the symbol, let's
- // honor that (for example, the superclass might have caught an Ignore
- // direction that matched the symbol's name).
- if (defaultEmitters.isEmpty())
- {
- return defaultEmitters;
- }
-
- // Don't do anything special if this symbol doesn't require
- // modifications
- if (!needsModifiedEmitters(sym))
- {
- return defaultEmitters;
- }
-
- ArrayList modifiedEmitters = new ArrayList(defaultEmitters.size());
-
- if (needsProcAddressWrapper(sym)) {
- if (getProcAddressConfig().emitProcAddressTable()) {
- // emit an entry in the GL proc address table for this method.
- emitProcAddressTableEntryForSymbol(sym);
- }
- }
-
- for (Iterator iter = defaultEmitters.iterator(); iter.hasNext(); )
- {
- FunctionEmitter emitter = (FunctionEmitter) iter.next();
- if (emitter instanceof JavaMethodBindingEmitter)
- {
- generateModifiedEmitters((JavaMethodBindingEmitter) emitter, modifiedEmitters);
- }
- else if (emitter instanceof CMethodBindingEmitter)
- {
- generateModifiedEmitters((CMethodBindingEmitter) emitter, modifiedEmitters);
- }
- else
- {
- throw new RuntimeException("Unexpected emitter type: " +
- emitter.getClass().getName());
- }
- }
-
- return modifiedEmitters;
- }
-
- /**
- * Returns the name of the typedef for a pointer to the function
- * represented by the argument as defined by the ProcAddressNameExpr
- * in the .cfg file. For example, in the OpenGL headers, if the
- * argument is the function "glFuncName", the value returned will be
- * "PFNGLFUNCNAMEPROC". This returns a valid string regardless of
- * whether or not the typedef is actually defined.
- */
- protected String getFunctionPointerTypedefName(FunctionSymbol sym) {
- return getProcAddressConfig().convertToFunctionPointerName(sym.getName());
- }
-
- //----------------------------------------------------------------------
- // Internals only below this point
- //
-
- protected void generateModifiedEmitters(JavaMethodBindingEmitter baseJavaEmitter, List emitters) {
- if (getConfig().manuallyImplement(baseJavaEmitter.getName())) {
- // User will provide Java-side implementation of this routine;
- // pass through any emitters which will produce signatures for
- // it unmodified
- emitters.add(baseJavaEmitter);
- return;
- }
-
- // See whether we need a proc address entry for this one
- boolean callThroughProcAddress = needsProcAddressWrapper(baseJavaEmitter.getBinding().getCSymbol());
-
- ProcAddressJavaMethodBindingEmitter emitter =
- new ProcAddressJavaMethodBindingEmitter(baseJavaEmitter,
- callThroughProcAddress,
- getProcAddressConfig().getProcAddressTableExpr(),
- baseJavaEmitter.isForImplementingMethodCall(),
- this);
- emitters.add(emitter);
-
- // If this emitter doesn't have a body (i.e., is a direct native
- // call with no intervening argument processing), we need to force
- // it to emit a body, and produce another one to act as the entry
- // point
- // FIXME: the negative test against the PRIVATE modifier is a
- // nasty hack to prevent the ProcAddressJavaMethodBindingEmitter
- // from incorrectly introducing method bodies to the private
- // native implementing methods; want this to work at least for
- // public and package-private methods
- if (baseJavaEmitter.signatureOnly() &&
- !baseJavaEmitter.hasModifier(JavaMethodBindingEmitter.PRIVATE) &&
- baseJavaEmitter.hasModifier(JavaMethodBindingEmitter.NATIVE) &&
- callThroughProcAddress) {
- emitter.setEmitBody(true);
- emitter.removeModifier(JavaMethodBindingEmitter.NATIVE);
- emitter = new ProcAddressJavaMethodBindingEmitter(baseJavaEmitter,
- callThroughProcAddress,
- getProcAddressConfig().getProcAddressTableExpr(),
- true,
- this);
- emitter.setForImplementingMethodCall(true);
- emitters.add(emitter);
- }
- }
-
- protected void generateModifiedEmitters(CMethodBindingEmitter baseCEmitter, List emitters)
- {
- // See whether we need a proc address entry for this one
- boolean callThroughProcAddress = needsProcAddressWrapper(baseCEmitter.getBinding().getCSymbol());
- boolean forceProcAddress = getProcAddressConfig().forceProcAddressGen(baseCEmitter.getBinding().getCSymbol().getName());
- // Note that we don't care much about the naming of the C argument
- // variables so to keep things simple we ignore the buffer object
- // property for the binding
-
- // The C-side JNI binding for this particular function will have an
- // extra final argument, which is the address (the OpenGL procedure
- // address) of the function it needs to call
- ProcAddressCMethodBindingEmitter res = new ProcAddressCMethodBindingEmitter(baseCEmitter,
- callThroughProcAddress,
- forceProcAddress,
- this);
- MessageFormat exp = baseCEmitter.getReturnValueCapacityExpression();
- if (exp != null) {
- res.setReturnValueCapacityExpression(exp);
- }
- emitters.add(res);
- }
-
- protected boolean needsProcAddressWrapper(FunctionSymbol sym)
- {
- String symName = sym.getName();
-
- ProcAddressConfiguration config = getProcAddressConfig();
-
- // We should only generate code to call through a function pointer
- // if the symbol has an associated function pointer typedef.
- String funcPointerTypedefName = getFunctionPointerTypedefName(sym);
- boolean shouldWrap = typedefDictionary.containsKey(funcPointerTypedefName);
- //System.err.println(funcPointerTypedefName + " defined: " + shouldWrap);
-
- if (config.skipProcAddressGen(symName)) {
- shouldWrap = false;
- }
-
- if (config.forceProcAddressGen(symName)) {
- shouldWrap = true;
- }
-
- if (shouldWrap)
- {
- // Hoist argument names from function pointer if not supplied in prototype
- Type funcPointerType = typedefDictionary.get(funcPointerTypedefName);
- if (funcPointerType != null) {
- FunctionType typedef = funcPointerType.asPointer().getTargetType().asFunction();
- FunctionType fun = sym.getType();
- int numarg = typedef.getNumArguments();
- for (int i =0; i < numarg; i++) {
- if (fun.getArgumentName(i) == null)
- fun.setArgumentName(i,typedef.getArgumentName(i));
- }
- }
- }
-
- return shouldWrap;
- }
-
- private void beginProcAddressTable() throws Exception
- {
- tableClassPackage = getProcAddressConfig().tableClassPackage();
- tableClassName = getProcAddressConfig().tableClassName();
-
- // Table defaults to going into the impl directory unless otherwise overridden
- String implPackageName = tableClassPackage;
- if (implPackageName == null) {
- implPackageName = getImplPackageName();
- }
- String jImplRoot =
- getJavaOutputDir() + File.separator +
- CodeGenUtils.packageAsPath(implPackageName);
-
- tableWriter = openFile(jImplRoot + File.separator + tableClassName + ".java");
- emittedTableEntries = new HashSet();
-
- CodeGenUtils.emitAutogeneratedWarning(tableWriter, this);
-
- tableWriter.println("package " + implPackageName + ";");
- tableWriter.println();
- for (Iterator iter = getConfig().imports().iterator(); iter.hasNext(); ) {
- tableWriter.println("import " + ((String) iter.next()) + ";");
- }
- tableWriter.println();
-
- tableWriter.println("/**");
- tableWriter.println(" * This table is a cache of pointers to the dynamically-linkable C");
- tableWriter.println(" * functions this autogenerated Java binding has exposed. Some");
- tableWriter.println(" * libraries such as OpenGL, OpenAL and others define function pointer");
- tableWriter.println(" * signatures rather than statically linkable entry points for the");
- tableWriter.println(" * purposes of being able to query at run-time whether a particular");
- tableWriter.println(" * extension is available. This table acts as a cache of these");
- tableWriter.println(" * function pointers. Each function pointer is typically looked up at");
- tableWriter.println(" * run-time by a platform-dependent mechanism such as dlsym(),");
- tableWriter.println(" * wgl/glXGetProcAddress(), or alGetProcAddress(). The associated");
- tableWriter.println(" * autogenerated Java and C code accesses the fields in this table to");
- tableWriter.println(" * call the various functions. If the field containing the function");
- tableWriter.println(" * pointer is 0, the function is considered to be unavailable and can");
- tableWriter.println(" * not be called.");
- tableWriter.println(" */");
- tableWriter.println("public class " + tableClassName);
- tableWriter.println("{");
-
- for (Iterator iter = getProcAddressConfig().getForceProcAddressGen().iterator(); iter.hasNext(); ) {
- emitProcAddressTableEntryForString((String) iter.next());
- }
- }
-
- private void endProcAddressTable() throws Exception
- {
- PrintWriter w = tableWriter;
-
- w.println(" /**");
- w.println(" * This is a convenience method to get (by name) the native function");
- w.println(" * pointer for a given function. It lets you avoid having to");
- w.println(" * manually compute the &quot;" + PROCADDRESS_VAR_PREFIX + " + ");
- w.println(" * &lt;functionName&gt;&quot; member variable name and look it up via");
- w.println(" * reflection; it also will throw an exception if you try to get the");
- w.println(" * address of an unknown function, or one that is statically linked");
- w.println(" * and therefore does not have a function pointer in this table.");
- w.println(" *");
- w.println(" * @throws RuntimeException if the function pointer was not found in");
- w.println(" * this table, either because the function was unknown or because");
- w.println(" * it was statically linked.");
- w.println(" */");
- w.println(" public long getAddressFor(String functionName) {");
- w.println(" String addressFieldName = " + getProcAddressConfig().gluegenRuntimePackage() + ".ProcAddressHelper.PROCADDRESS_VAR_PREFIX + functionName;");
- w.println(" try { ");
- w.println(" java.lang.reflect.Field addressField = getClass().getField(addressFieldName);");
- w.println(" return addressField.getLong(this);");
- w.println(" } catch (Exception e) {");
- w.println(" // The user is calling a bogus function or one which is not");
- w.println(" // runtime linked");
- w.println(" throw new RuntimeException(");
- w.println(" \"WARNING: Address query failed for \\\"\" + functionName +");
- w.println(" \"\\\"; it's either statically linked or is not a known \" +");
- w.println(" \"function\", e);");
- w.println(" } ");
- w.println(" }");
-
- w.println("} // end of class " + tableClassName);
- w.flush();
- w.close();
- }
-
- protected void emitProcAddressTableEntryForSymbol(FunctionSymbol cFunc)
- {
- emitProcAddressTableEntryForString(cFunc.getName());
- }
-
- protected void emitProcAddressTableEntryForString(String str)
- {
- // Deal gracefully with forced proc address generation in the face
- // of having the function pointer typedef in the header file too
- if (emittedTableEntries.contains(str))
- return;
- emittedTableEntries.add(str);
- tableWriter.print(" public long ");
- tableWriter.print(PROCADDRESS_VAR_PREFIX);
- tableWriter.print(str);
- tableWriter.println(";");
- }
-
- protected ProcAddressConfiguration getProcAddressConfig() {
- return (ProcAddressConfiguration) getConfig();
- }
-}
diff --git a/src/java/com/sun/gluegen/procaddress/ProcAddressJavaMethodBindingEmitter.java b/src/java/com/sun/gluegen/procaddress/ProcAddressJavaMethodBindingEmitter.java
deleted file mode 100755
index 7900d67..0000000
--- a/src/java/com/sun/gluegen/procaddress/ProcAddressJavaMethodBindingEmitter.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright (c) 2003-2005 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.procaddress;
-
-import java.io.*;
-import java.util.*;
-import com.sun.gluegen.*;
-import com.sun.gluegen.cgram.types.*;
-
-/** A specialization of JavaMethodBindingEmitter with knowledge of how
- to call through a function pointer. */
-
-public class ProcAddressJavaMethodBindingEmitter extends JavaMethodBindingEmitter {
- private final CommentEmitter commentEmitterForWrappedMethod =
- new WrappedMethodCommentEmitter();
-
- protected boolean callThroughProcAddress;
- protected String getProcAddressTableExpr;
- protected boolean changeNameAndArguments;
- protected ProcAddressEmitter emitter;
-
- public ProcAddressJavaMethodBindingEmitter(JavaMethodBindingEmitter methodToWrap,
- boolean callThroughProcAddress,
- String getProcAddressTableExpr,
- boolean changeNameAndArguments,
- ProcAddressEmitter emitter) {
- super(methodToWrap);
- this.callThroughProcAddress = callThroughProcAddress;
- this.getProcAddressTableExpr = getProcAddressTableExpr;
- this.changeNameAndArguments = changeNameAndArguments;
- this.emitter = emitter;
- if (callThroughProcAddress) {
- setCommentEmitter(new WrappedMethodCommentEmitter());
- }
-
- if (methodToWrap.getBinding().hasContainingType())
- {
- throw new IllegalArgumentException(
- "Cannot create proc. address wrapper; method has containing type: \"" +
- methodToWrap.getBinding() + "\"");
- }
- }
-
- public ProcAddressJavaMethodBindingEmitter(ProcAddressJavaMethodBindingEmitter methodToWrap) {
- this(methodToWrap,
- methodToWrap.callThroughProcAddress,
- methodToWrap.getProcAddressTableExpr,
- methodToWrap.changeNameAndArguments,
- methodToWrap.emitter);
- }
-
- public String getName() {
- String res = super.getName();
- if (changeNameAndArguments) {
- return ProcAddressEmitter.WRAP_PREFIX + res;
- }
- return res;
- }
-
- protected int emitArguments(PrintWriter writer) {
- int numEmitted = super.emitArguments(writer);
- if (callThroughProcAddress) {
- if (changeNameAndArguments) {
- if (numEmitted > 0) {
- writer.print(", ");
- }
-
- writer.print("long procAddress");
- ++numEmitted;
- }
- }
-
- return numEmitted;
- }
-
- protected String getImplMethodName(boolean direct) {
- String name = super.getImplMethodName(direct);
- if (callThroughProcAddress) {
- return ProcAddressEmitter.WRAP_PREFIX + name;
- }
- return name;
- }
-
- protected void emitPreCallSetup(MethodBinding binding, PrintWriter writer) {
- super.emitPreCallSetup(binding, writer);
-
- if (callThroughProcAddress) {
- String procAddressVariable =
- ProcAddressEmitter.PROCADDRESS_VAR_PREFIX + binding.getName();
- writer.println(" final long __addr_ = " + getProcAddressTableExpr + "." + procAddressVariable + ";");
- writer.println(" if (__addr_ == 0) {");
- writer.println(" throw new " + emitter.runtimeExceptionType() + "(\"Method \\\"" + binding.getName() + "\\\" not available\");");
- writer.println(" }");
- }
- }
-
- protected int emitCallArguments(MethodBinding binding, PrintWriter writer, boolean indirect) {
- int numEmitted = super.emitCallArguments(binding, writer, indirect);
- if (callThroughProcAddress) {
- if (numEmitted > 0) {
- writer.print(", ");
- }
- writer.print("__addr_");
- ++numEmitted;
- }
-
- return numEmitted;
- }
-
- /** This class emits the comment for the wrapper method */
- private class WrappedMethodCommentEmitter extends JavaMethodBindingEmitter.DefaultCommentEmitter {
- protected void emitBeginning(FunctionEmitter methodEmitter, PrintWriter writer) {
- writer.print("Entry point (through function pointer) to C language function: <br> ");
- }
- }
-}
diff --git a/src/java/com/sun/gluegen/runtime/BufferFactory.java.javame_cdc_fp b/src/java/com/sun/gluegen/runtime/BufferFactory.java.javame_cdc_fp
deleted file mode 100755
index 622cc37..0000000
--- a/src/java/com/sun/gluegen/runtime/BufferFactory.java.javame_cdc_fp
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Copyright (c) 2003 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.runtime;
-
-import java.nio.*;
-
-public class BufferFactory {
- public static final int SIZEOF_BYTE = 1;
- public static final int SIZEOF_SHORT = 2;
- public static final int SIZEOF_INT = 4;
- public static final int SIZEOF_FLOAT = 4;
-
- public static ByteBuffer newDirectByteBuffer(int size) {
- ByteBuffer buf = ByteBuffer.allocateDirect(size);
- return buf;
- }
-
- /** Helper routine to set a ByteBuffer to the native byte order, if
- that operation is supported by the underlying NIO
- implementation. */
- public static ByteBuffer nativeOrder(ByteBuffer buf) {
- return buf;
- }
-
- /** Helper routine to tell whether a buffer is direct or not. Null
- pointers are considered direct. isDirect() should really be
- public in Buffer and not replicated in all subclasses. */
- public static boolean isDirect(Buffer buf) {
- if (buf == null) {
- return true;
- }
- if (buf instanceof ByteBuffer) {
- return ((ByteBuffer) buf).isDirect();
- } else if (buf instanceof FloatBuffer) {
- return ((FloatBuffer) buf).isDirect();
- } else if (buf instanceof ShortBuffer) {
- return ((ShortBuffer) buf).isDirect();
- } else if (buf instanceof IntBuffer) {
- return ((IntBuffer) buf).isDirect();
- }
- throw new RuntimeException("Unexpected buffer type " + buf.getClass().getName());
- }
-
-
- /** Helper routine to get the Buffer byte offset by taking into
- account the Buffer position and the underlying type. This is
- the total offset for Direct Buffers. */
-
- public static int getDirectBufferByteOffset(Buffer buf) {
- if(buf == null) {
- return 0;
- }
- if(buf instanceof ByteBuffer) {
- return (buf.position());
- } else if (buf instanceof FloatBuffer) {
- return (buf.position() * SIZEOF_FLOAT);
- } else if (buf instanceof IntBuffer) {
- return (buf.position() * SIZEOF_INT);
- } else if (buf instanceof ShortBuffer) {
- return (buf.position() * SIZEOF_SHORT);
- }
-
- throw new RuntimeException("Disallowed array backing store type in buffer "
- + buf.getClass().getName());
- }
-
-
- /** Helper routine to return the array backing store reference from
- a Buffer object. */
-
- public static Object getArray(Buffer buf) {
- if (buf == null) {
- return null;
- }
- if(buf instanceof ByteBuffer) {
- return ((ByteBuffer) buf).array();
- } else if (buf instanceof FloatBuffer) {
- return ((FloatBuffer) buf).array();
- } else if (buf instanceof IntBuffer) {
- return ((IntBuffer) buf).array();
- } else if (buf instanceof ShortBuffer) {
- return ((ShortBuffer) buf).array();
- }
-
- throw new RuntimeException("Disallowed array backing store type in buffer "
- + buf.getClass().getName());
- }
-
-
- /** Helper routine to get the full byte offset from the beginning of
- the array that is the storage for the indirect Buffer
- object. The array offset also includes the position offset
- within the buffer, in addition to any array offset. */
-
- public static int getIndirectBufferByteOffset(Buffer buf) {
- if(buf == null) {
- return 0;
- }
- int pos = buf.position();
- if(buf instanceof ByteBuffer) {
- return (((ByteBuffer)buf).arrayOffset() + pos);
- } else if(buf instanceof FloatBuffer) {
- return (SIZEOF_FLOAT*(((FloatBuffer)buf).arrayOffset() + pos));
- } else if(buf instanceof IntBuffer) {
- return (SIZEOF_INT*(((IntBuffer)buf).arrayOffset() + pos));
- } else if(buf instanceof ShortBuffer) {
- return (SIZEOF_SHORT*(((ShortBuffer)buf).arrayOffset() + pos));
- }
-
- throw new RuntimeException("Unknown buffer type " + buf.getClass().getName());
- }
-
- public static void rangeCheck(byte[] array, int offset, int minElementsRemaining) {
- if (array == null) {
- return;
- }
-
- if (array.length < offset + minElementsRemaining) {
- throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
- }
- }
-
- public static void rangeCheck(char[] array, int offset, int minElementsRemaining) {
- if (array == null) {
- return;
- }
-
- if (array.length < offset + minElementsRemaining) {
- throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
- }
- }
-
- public static void rangeCheck(short[] array, int offset, int minElementsRemaining) {
- if (array == null) {
- return;
- }
-
- if (array.length < offset + minElementsRemaining) {
- throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
- }
- }
-
- public static void rangeCheck(int[] array, int offset, int minElementsRemaining) {
- if (array == null) {
- return;
- }
-
- if (array.length < offset + minElementsRemaining) {
- throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
- }
- }
-
- public static void rangeCheck(float[] array, int offset, int minElementsRemaining) {
- if (array == null) {
- return;
- }
-
- if (array.length < offset + minElementsRemaining) {
- throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
- }
- }
-
- public static void rangeCheck(Buffer buffer, int minElementsRemaining) {
- if (buffer == null) {
- return;
- }
-
- if (buffer.remaining() < minElementsRemaining) {
- throw new IndexOutOfBoundsException("Required " + minElementsRemaining + " remaining elements in buffer, only had " + buffer.remaining());
- }
- }
-
- public static void rangeCheckBytes(Buffer buffer, int minBytesRemaining) {
- if (buffer == null) {
- return;
- }
-
- int elementsRemaining = buffer.remaining();
- int bytesRemaining = 0;
- if (buffer instanceof ByteBuffer) {
- bytesRemaining = elementsRemaining;
- } else if (buffer instanceof FloatBuffer) {
- bytesRemaining = elementsRemaining * SIZEOF_FLOAT;
- } else if (buffer instanceof IntBuffer) {
- bytesRemaining = elementsRemaining * SIZEOF_INT;
- } else if (buffer instanceof ShortBuffer) {
- bytesRemaining = elementsRemaining * SIZEOF_SHORT;
- }
- if (bytesRemaining < minBytesRemaining) {
- throw new IndexOutOfBoundsException("Required " + minBytesRemaining + " remaining bytes in buffer, only had " + bytesRemaining);
- }
- }
-}
diff --git a/src/java/com/sun/gluegen/runtime/BufferFactory.java.javase b/src/java/com/sun/gluegen/runtime/BufferFactory.java.javase
deleted file mode 100755
index a883316..0000000
--- a/src/java/com/sun/gluegen/runtime/BufferFactory.java.javase
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * Copyright (c) 2003 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.runtime;
-
-import java.nio.*;
-
-public class BufferFactory {
- public static final int SIZEOF_BYTE = 1;
- public static final int SIZEOF_SHORT = 2;
- public static final int SIZEOF_CHAR = 2;
- public static final int SIZEOF_INT = 4;
- public static final int SIZEOF_FLOAT = 4;
- public static final int SIZEOF_LONG = 8;
- public static final int SIZEOF_DOUBLE = 8;
-
- public static ByteBuffer newDirectByteBuffer(int size) {
- ByteBuffer buf = ByteBuffer.allocateDirect(size);
- buf.order(ByteOrder.nativeOrder());
- return buf;
- }
-
- /** Helper routine to set a ByteBuffer to the native byte order, if
- that operation is supported by the underlying NIO
- implementation. */
- public static ByteBuffer nativeOrder(ByteBuffer buf) {
- return buf.order(ByteOrder.nativeOrder());
- }
-
- /** Helper routine to tell whether a buffer is direct or not. Null
- pointers are considered direct. isDirect() should really be
- public in Buffer and not replicated in all subclasses. */
- public static boolean isDirect(Buffer buf) {
- if (buf == null) {
- return true;
- }
- if (buf instanceof ByteBuffer) {
- return ((ByteBuffer) buf).isDirect();
- } else if (buf instanceof FloatBuffer) {
- return ((FloatBuffer) buf).isDirect();
- } else if (buf instanceof DoubleBuffer) {
- return ((DoubleBuffer) buf).isDirect();
- } else if (buf instanceof CharBuffer) {
- return ((CharBuffer) buf).isDirect();
- } else if (buf instanceof ShortBuffer) {
- return ((ShortBuffer) buf).isDirect();
- } else if (buf instanceof IntBuffer) {
- return ((IntBuffer) buf).isDirect();
- } else if (buf instanceof LongBuffer) {
- return ((LongBuffer) buf).isDirect();
- }
- throw new RuntimeException("Unexpected buffer type " + buf.getClass().getName());
- }
-
-
- /** Helper routine to get the Buffer byte offset by taking into
- account the Buffer position and the underlying type. This is
- the total offset for Direct Buffers. */
-
- public static int getDirectBufferByteOffset(Buffer buf) {
- if(buf == null) {
- return 0;
- }
- if(buf instanceof ByteBuffer) {
- return (buf.position());
- } else if (buf instanceof FloatBuffer) {
- return (buf.position() * SIZEOF_FLOAT);
- } else if (buf instanceof IntBuffer) {
- return (buf.position() * SIZEOF_INT);
- } else if (buf instanceof ShortBuffer) {
- return (buf.position() * SIZEOF_SHORT);
- } else if (buf instanceof DoubleBuffer) {
- return (buf.position() * SIZEOF_DOUBLE);
- } else if (buf instanceof LongBuffer) {
- return (buf.position() * SIZEOF_LONG);
- } else if (buf instanceof CharBuffer) {
- return (buf.position() * SIZEOF_CHAR);
- }
-
- throw new RuntimeException("Disallowed array backing store type in buffer "
- + buf.getClass().getName());
- }
-
-
- /** Helper routine to return the array backing store reference from
- a Buffer object. */
-
- public static Object getArray(Buffer buf) {
- if (buf == null) {
- return null;
- }
- if(buf instanceof ByteBuffer) {
- return ((ByteBuffer) buf).array();
- } else if (buf instanceof FloatBuffer) {
- return ((FloatBuffer) buf).array();
- } else if (buf instanceof IntBuffer) {
- return ((IntBuffer) buf).array();
- } else if (buf instanceof ShortBuffer) {
- return ((ShortBuffer) buf).array();
- } else if (buf instanceof DoubleBuffer) {
- return ((DoubleBuffer) buf).array();
- } else if (buf instanceof LongBuffer) {
- return ((LongBuffer) buf).array();
- } else if (buf instanceof CharBuffer) {
- return ((CharBuffer) buf).array();
- }
-
- throw new RuntimeException("Disallowed array backing store type in buffer "
- + buf.getClass().getName());
- }
-
-
- /** Helper routine to get the full byte offset from the beginning of
- the array that is the storage for the indirect Buffer
- object. The array offset also includes the position offset
- within the buffer, in addition to any array offset. */
-
- public static int getIndirectBufferByteOffset(Buffer buf) {
- if(buf == null) {
- return 0;
- }
- int pos = buf.position();
- if(buf instanceof ByteBuffer) {
- return (((ByteBuffer)buf).arrayOffset() + pos);
- } else if(buf instanceof FloatBuffer) {
- return (SIZEOF_FLOAT*(((FloatBuffer)buf).arrayOffset() + pos));
- } else if(buf instanceof IntBuffer) {
- return (SIZEOF_INT*(((IntBuffer)buf).arrayOffset() + pos));
- } else if(buf instanceof ShortBuffer) {
- return (SIZEOF_SHORT*(((ShortBuffer)buf).arrayOffset() + pos));
- } else if(buf instanceof DoubleBuffer) {
- return (SIZEOF_DOUBLE*(((DoubleBuffer)buf).arrayOffset() + pos));
- } else if(buf instanceof LongBuffer) {
- return (SIZEOF_LONG*(((LongBuffer)buf).arrayOffset() + pos));
- } else if(buf instanceof CharBuffer) {
- return (SIZEOF_CHAR*(((CharBuffer)buf).arrayOffset() + pos));
- }
-
- throw new RuntimeException("Unknown buffer type " + buf.getClass().getName());
- }
-
- public static void rangeCheck(byte[] array, int offset, int minElementsRemaining) {
- if (array == null) {
- return;
- }
-
- if (array.length < offset + minElementsRemaining) {
- throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
- }
- }
-
- public static void rangeCheck(char[] array, int offset, int minElementsRemaining) {
- if (array == null) {
- return;
- }
-
- if (array.length < offset + minElementsRemaining) {
- throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
- }
- }
-
- public static void rangeCheck(short[] array, int offset, int minElementsRemaining) {
- if (array == null) {
- return;
- }
-
- if (array.length < offset + minElementsRemaining) {
- throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
- }
- }
-
- public static void rangeCheck(int[] array, int offset, int minElementsRemaining) {
- if (array == null) {
- return;
- }
-
- if (array.length < offset + minElementsRemaining) {
- throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
- }
- }
-
- public static void rangeCheck(long[] array, int offset, int minElementsRemaining) {
- if (array == null) {
- return;
- }
-
- if (array.length < offset + minElementsRemaining) {
- throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
- }
- }
-
- public static void rangeCheck(float[] array, int offset, int minElementsRemaining) {
- if (array == null) {
- return;
- }
-
- if (array.length < offset + minElementsRemaining) {
- throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
- }
- }
-
- public static void rangeCheck(double[] array, int offset, int minElementsRemaining) {
- if (array == null) {
- return;
- }
-
- if (array.length < offset + minElementsRemaining) {
- throw new ArrayIndexOutOfBoundsException("Required " + minElementsRemaining + " elements in array, only had " + (array.length - offset));
- }
- }
-
- public static void rangeCheck(Buffer buffer, int minElementsRemaining) {
- if (buffer == null) {
- return;
- }
-
- if (buffer.remaining() < minElementsRemaining) {
- throw new IndexOutOfBoundsException("Required " + minElementsRemaining + " remaining elements in buffer, only had " + buffer.remaining());
- }
- }
-
- public static void rangeCheckBytes(Buffer buffer, int minBytesRemaining) {
- if (buffer == null) {
- return;
- }
-
- int elementsRemaining = buffer.remaining();
- int bytesRemaining = 0;
- if (buffer instanceof ByteBuffer) {
- bytesRemaining = elementsRemaining;
- } else if (buffer instanceof FloatBuffer) {
- bytesRemaining = elementsRemaining * SIZEOF_FLOAT;
- } else if (buffer instanceof IntBuffer) {
- bytesRemaining = elementsRemaining * SIZEOF_INT;
- } else if (buffer instanceof ShortBuffer) {
- bytesRemaining = elementsRemaining * SIZEOF_SHORT;
- } else if (buffer instanceof DoubleBuffer) {
- bytesRemaining = elementsRemaining * SIZEOF_DOUBLE;
- } else if (buffer instanceof LongBuffer) {
- bytesRemaining = elementsRemaining * SIZEOF_LONG;
- } else if (buffer instanceof CharBuffer) {
- bytesRemaining = elementsRemaining * SIZEOF_CHAR;
- }
- if (bytesRemaining < minBytesRemaining) {
- throw new IndexOutOfBoundsException("Required " + minBytesRemaining + " remaining bytes in buffer, only had " + bytesRemaining);
- }
- }
-}
diff --git a/src/java/com/sun/gluegen/runtime/BufferFactoryInternal.java b/src/java/com/sun/gluegen/runtime/BufferFactoryInternal.java
deleted file mode 100755
index 7a0e6a8..0000000
--- a/src/java/com/sun/gluegen/runtime/BufferFactoryInternal.java
+++ /dev/null
@@ -1,115 +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.runtime;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.nio.*;
-import sun.misc.Unsafe;
-
-public class BufferFactoryInternal {
- private static final long addressFieldOffset;
- private static final Constructor directByteBufferConstructor;
-
- static {
- try {
- Field f = Buffer.class.getDeclaredField("address");
- addressFieldOffset = UnsafeAccess.getUnsafe().objectFieldOffset(f);
-
- Class directByteBufferClass = Class.forName("java.nio.DirectByteBuffer");
- directByteBufferConstructor = directByteBufferClass.getDeclaredConstructor(new Class[] { Long.TYPE, Integer.TYPE });
- directByteBufferConstructor.setAccessible(true);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- public static long getDirectBufferAddress(Buffer buf) {
- return ((buf == null) ? 0 : UnsafeAccess.getUnsafe().getLong(buf, addressFieldOffset));
- }
-
- public static ByteBuffer newDirectByteBuffer(long address, int capacity) {
- try {
- if (address == 0) {
- return null;
- }
- return (ByteBuffer) directByteBufferConstructor.newInstance(new Object[] { new Long(address), new Integer(capacity) });
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- public static long newCString(String str) {
- byte[] strBytes = str.getBytes();
- long strBlock = UnsafeAccess.getUnsafe().allocateMemory(strBytes.length+1);
- for (int i = 0; i < strBytes.length; i++) {
- UnsafeAccess.getUnsafe().putByte(strBlock+i, strBytes[i]);
- }
- UnsafeAccess.getUnsafe().putByte(strBlock+strBytes.length, (byte)0); // null termination
- return strBlock;
- }
-
- public static void freeCString(long cStr) {
- UnsafeAccess.getUnsafe().freeMemory(cStr);
- }
-
- public static String newJavaString(long cStr) {
- if (cStr == 0) {
- return null;
- }
- int numChars = 0;
- while (UnsafeAccess.getUnsafe().getByte(cStr + numChars) != 0) {
- ++numChars;
- }
- byte[] bytes = new byte[numChars];
- for (int i = 0; i < numChars; i++) {
- bytes[i] = UnsafeAccess.getUnsafe().getByte(cStr + i);
- }
- return new String(bytes);
- }
-
- public static int arrayBaseOffset(Object array) {
- return UnsafeAccess.getUnsafe().arrayBaseOffset(array.getClass());
- }
- public static int arrayIndexScale(Object array) {
- return UnsafeAccess.getUnsafe().arrayIndexScale(array.getClass());
- }
-}
diff --git a/src/java/com/sun/gluegen/runtime/CPU.java b/src/java/com/sun/gluegen/runtime/CPU.java
deleted file mode 100755
index e3a215f..0000000
--- a/src/java/com/sun/gluegen/runtime/CPU.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2005 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.runtime;
-
-/** Provides information to autogenerated struct accessors about what
- kind of data model (32- or 64-bit) is being used by the currently
- running process. */
-
-public class CPU {
- private static boolean is32Bit;
-
- static {
- // We don't seem to need an AccessController.doPrivileged() block
- // here as these system properties are visible even to unsigned
- // applets
- // Note: this code is replicated in StructLayout.java
- String os = System.getProperty("os.name").toLowerCase();
- String cpu = System.getProperty("os.arch").toLowerCase();
- if ((os.startsWith("windows") && cpu.equals("x86")) ||
- (os.startsWith("windows") && cpu.equals("arm")) ||
- (os.startsWith("linux") && cpu.equals("i386")) ||
- (os.startsWith("linux") && cpu.equals("x86")) ||
- (os.startsWith("mac os") && cpu.equals("ppc")) ||
- (os.startsWith("mac os") && cpu.equals("i386")) ||
- (os.startsWith("sunos") && cpu.equals("sparc")) ||
- (os.startsWith("sunos") && cpu.equals("x86")) ||
- (os.startsWith("freebsd") && cpu.equals("i386")) ||
- (os.startsWith("hp-ux") && cpu.equals("pa_risc2.0"))) {
- is32Bit = true;
- } else if ((os.startsWith("windows") && cpu.equals("amd64")) ||
- (os.startsWith("linux") && cpu.equals("amd64")) ||
- (os.startsWith("linux") && cpu.equals("x86_64")) ||
- (os.startsWith("linux") && cpu.equals("ia64")) ||
- (os.startsWith("mac os") && cpu.equals("x86_64")) ||
- (os.startsWith("sunos") && cpu.equals("sparcv9")) ||
- (os.startsWith("sunos") && cpu.equals("amd64"))) {
- } else {
- throw new RuntimeException("Please port CPU detection (32/64 bit) to your platform (" + os + "/" + cpu + ")");
- }
- }
-
- public static boolean is32Bit() {
- return is32Bit;
- }
-}
diff --git a/src/java/com/sun/gluegen/runtime/DynamicLinker.java b/src/java/com/sun/gluegen/runtime/DynamicLinker.java
deleted file mode 100755
index d0ee39b..0000000
--- a/src/java/com/sun/gluegen/runtime/DynamicLinker.java
+++ /dev/null
@@ -1,49 +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.runtime;
-
-/** Provides an abstract interface to the OS's low-level dynamic
- linking functionality. */
-
-interface DynamicLinker {
- public long openLibrary(String pathname);
- public long lookupSymbol(long libraryHandle, String symbolName);
- public void closeLibrary(long libraryHandle);
-}
diff --git a/src/java/com/sun/gluegen/runtime/DynamicLookupHelper.java b/src/java/com/sun/gluegen/runtime/DynamicLookupHelper.java
deleted file mode 100755
index 07417f9..0000000
--- a/src/java/com/sun/gluegen/runtime/DynamicLookupHelper.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2003-2005 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.runtime;
-
-/** Interface callers may use to use the ProcAddressHelper's {@link
- ProcAddressHelper#resetProcAddressTable resetProcAddressTable}
- helper method to install function pointers into a
- ProcAddressTable. This must typically be written with native
- code. */
-
-public interface DynamicLookupHelper {
- public long dynamicLookupFunction(String funcName);
-}
diff --git a/src/java/com/sun/gluegen/runtime/MacOSXDynamicLinkerImpl.java b/src/java/com/sun/gluegen/runtime/MacOSXDynamicLinkerImpl.java
deleted file mode 100755
index f998d07..0000000
--- a/src/java/com/sun/gluegen/runtime/MacOSXDynamicLinkerImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/* !---- DO NOT EDIT: This file autogenerated by com\sun\gluegen\JavaEmitter.java on Mon Jul 31 16:27:00 PDT 2006 ----! */
-
-package com.sun.gluegen.runtime;
-
-import com.sun.gluegen.runtime.*;
-
-public class MacOSXDynamicLinkerImpl implements DynamicLinker
-{
-
- public static final int RTLD_LAZY = 0x1;
- public static final int RTLD_NOW = 0x2;
- public static final int RTLD_LOCAL = 0x4;
- public static final int RTLD_GLOBAL = 0x8;
-
- /** Interface to C language function: <br> <code> int dlclose(void * __handle); </code> */
- private static native int dlclose(long __handle);
-
- /** Interface to C language function: <br> <code> char * dlerror(void); </code> */
- private static native java.lang.String dlerror();
-
- /** Interface to C language function: <br> <code> void * dlopen(const char * __path, int __mode); </code> */
- private static native long dlopen(java.lang.String __path, int __mode);
-
- /** Interface to C language function: <br> <code> void * dlsym(void * __handle, const char * __symbol); </code> */
- private static native long dlsym(long __handle, java.lang.String __symbol);
-
-
- // --- Begin CustomJavaCode .cfg declarations
- public long openLibrary(String pathname) {
- // Note we use RTLD_GLOBAL visibility to allow this functionality to
- // be used to pre-resolve dependent libraries of JNI code without
- // requiring that all references to symbols in those libraries be
- // looked up dynamically via the ProcAddressTable mechanism; in
- // other words, one can actually link against the library instead of
- // having to dlsym all entry points. System.loadLibrary() uses
- // RTLD_LOCAL visibility so can't be used for this purpose.
- return dlopen(pathname, RTLD_LAZY | RTLD_GLOBAL);
- }
-
- public long lookupSymbol(long libraryHandle, String symbolName) {
- return dlsym(libraryHandle, symbolName);
- }
-
- public void closeLibrary(long libraryHandle) {
- dlclose(libraryHandle);
- }
- // ---- End CustomJavaCode .cfg declarations
-
-} // end of class MacOSXDynamicLinkerImpl
diff --git a/src/java/com/sun/gluegen/runtime/NativeLibLoader.java b/src/java/com/sun/gluegen/runtime/NativeLibLoader.java
deleted file mode 100755
index 0e6e3da..0000000
--- a/src/java/com/sun/gluegen/runtime/NativeLibLoader.java
+++ /dev/null
@@ -1,105 +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.runtime;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.security.*;
-
-/** Class providing control over whether GlueGen loads the native code
- associated with the NativeLibrary implementation. Alternative app
- launchers such as those running within applets may want to disable
- this default loading behavior and load the native code via another
- (manual) mechanism. */
-public class NativeLibLoader {
- private static volatile boolean loadingEnabled = true;
- private static volatile boolean didLoading;
-
- public static void disableLoading() {
- loadingEnabled = false;
- }
-
- public static void enableLoading() {
- loadingEnabled = true;
- }
-
- public static void loadGlueGenRT() {
- if (!didLoading && loadingEnabled) {
- synchronized (NativeLibLoader.class) {
- if (!didLoading && loadingEnabled) {
- didLoading = true;
- AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- loadLibraryInternal("gluegen-rt");
- return null;
- }
- });
- }
- }
- }
- }
-
- private static void loadLibraryInternal(String libraryName) {
- String sunAppletLauncher = System.getProperty("sun.jnlp.applet.launcher");
- boolean usingJNLPAppletLauncher = Boolean.valueOf(sunAppletLauncher).booleanValue();
-
- if (usingJNLPAppletLauncher) {
- try {
- Class jnlpAppletLauncherClass = Class.forName("org.jdesktop.applet.util.JNLPAppletLauncher");
- Method jnlpLoadLibraryMethod = jnlpAppletLauncherClass.getDeclaredMethod("loadLibrary", new Class[] { String.class });
- jnlpLoadLibraryMethod.invoke(null, new Object[] { libraryName });
- } catch (Exception e) {
- Throwable t = e;
- if (t instanceof InvocationTargetException) {
- t = ((InvocationTargetException) t).getTargetException();
- }
- if (t instanceof Error)
- throw (Error) t;
- if (t instanceof RuntimeException) {
- throw (RuntimeException) t;
- }
- // Throw UnsatisfiedLinkError for best compatibility with System.loadLibrary()
- throw (UnsatisfiedLinkError) new UnsatisfiedLinkError().initCause(e);
- }
- } else {
- System.loadLibrary(libraryName);
- }
- }
-}
diff --git a/src/java/com/sun/gluegen/runtime/NativeLibrary.java b/src/java/com/sun/gluegen/runtime/NativeLibrary.java
deleted file mode 100755
index 1341012..0000000
--- a/src/java/com/sun/gluegen/runtime/NativeLibrary.java
+++ /dev/null
@@ -1,404 +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.runtime;
-
-import java.io.*;
-import java.lang.reflect.*;
-import java.security.*;
-import java.util.*;
-
-/** Provides low-level, relatively platform-independent access to
- shared ("native") libraries. The core library routines
- <code>System.load()</code> and <code>System.loadLibrary()</code>
- in general provide suitable functionality for applications using
- native code, but are not flexible enough to support certain kinds
- of glue code generation and deployment strategies. This class
- supports direct linking of native libraries to other shared
- objects not necessarily installed on the system (in particular,
- via the use of dlopen(RTLD_GLOBAL) on Unix platforms) as well as
- manual lookup of function names to support e.g. GlueGen's
- ProcAddressTable glue code generation style without additional
- supporting code needed in the generated library. */
-
-public class NativeLibrary {
- private static final int WINDOWS = 1;
- private static final int UNIX = 2;
- private static final int MACOSX = 3;
- private static boolean DEBUG;
- private static int platform;
- private static DynamicLinker dynLink;
- private static String[] prefixes;
- private static String[] suffixes;
-
- static {
- // Determine platform we're running on
- AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- String osName = System.getProperty("os.name").toLowerCase();
- if (osName.startsWith("wind")) {
- platform = WINDOWS;
- } else if (osName.startsWith("mac os x")) {
- platform = MACOSX;
- } else {
- platform = UNIX;
- }
-
- DEBUG = (System.getProperty("gluegen.debug.NativeLibrary") != null);
-
- return null;
- }
- });
- // Instantiate dynamic linker implementation
- switch (platform) {
- case WINDOWS:
- dynLink = new WindowsDynamicLinkerImpl();
- prefixes = new String[] { "" };
- suffixes = new String[] { ".dll" };
- break;
- case UNIX:
- dynLink = new UnixDynamicLinkerImpl();
- prefixes = new String[] { "lib" };
- suffixes = new String[] { ".so" };
- break;
- case MACOSX:
- dynLink = new MacOSXDynamicLinkerImpl();
- prefixes = new String[] { "lib", "" };
- suffixes = new String[] { ".dylib", ".jnilib", "" };
- break;
- default:
- throw new InternalError("Platform not initialized properly");
- }
- }
-
- // Platform-specific representation for the handle to the open
- // library. This is an HMODULE on Windows and a void* (the result of
- // a dlopen() call) on Unix and Mac OS X platforms.
- private long libraryHandle;
-
- // May as well keep around the path to the library we opened
- private String libraryPath;
-
- // Private constructor to prevent arbitrary instances from floating around
- private NativeLibrary(long libraryHandle, String libraryPath) {
- this.libraryHandle = libraryHandle;
- this.libraryPath = libraryPath;
- }
-
- /** Opens the given native library, assuming it has the same base
- name on all platforms, looking first in the system's search
- path, and in the context of the specified ClassLoader, which is
- used to help find the library in the case of e.g. Java Web Start. */
- public static NativeLibrary open(String libName, ClassLoader loader) {
- return open(libName, libName, libName, true, loader);
- }
-
- /** Opens the given native library, assuming it has the given base
- names (no "lib" prefix or ".dll/.so/.dylib" suffix) on the
- Windows, Unix and Mac OS X platforms, respectively, and in the
- context of the specified ClassLoader, which is used to help find
- the library in the case of e.g. Java Web Start. The
- searchSystemPathFirst argument changes the behavior to first
- search the default system path rather than searching it last.
- Note that we do not currently handle DSO versioning on Unix.
- Experience with JOAL and OpenAL has shown that it is extremely
- problematic to rely on a specific .so version (for one thing,
- ClassLoader.findLibrary on Unix doesn't work with files not
- ending in .so, for example .so.0), and in general if this
- dynamic loading facility is used correctly the version number
- will be irrelevant.
- */
- public static NativeLibrary open(String windowsLibName,
- String unixLibName,
- String macOSXLibName,
- boolean searchSystemPathFirst,
- ClassLoader loader) {
- List possiblePaths = enumerateLibraryPaths(windowsLibName,
- unixLibName,
- macOSXLibName,
- searchSystemPathFirst,
- loader);
- // Iterate down these and see which one if any we can actually find.
- for (Iterator iter = possiblePaths.iterator(); iter.hasNext(); ) {
- String path = (String) iter.next();
- if (DEBUG) {
- System.out.println("Trying to load " + path);
- }
- ensureNativeLibLoaded();
- long res = dynLink.openLibrary(path);
- if (res != 0) {
- if (DEBUG) {
- System.out.println("Successfully loaded " + path + ": res = 0x" + Long.toHexString(res));
- }
- return new NativeLibrary(res, path);
- }
- }
-
- if (DEBUG) {
- System.out.println("Did not succeed in loading (" + windowsLibName + ", " + unixLibName + ", " + macOSXLibName + ")");
- }
-
- // For now, just return null to indicate the open operation didn't
- // succeed (could also throw an exception if we could tell which
- // of the openLibrary operations actually failed)
- return null;
- }
-
- /** Looks up the given function name in this native library. */
- public long lookupFunction(String functionName) {
- if (libraryHandle == 0)
- throw new RuntimeException("Library is not open");
- return dynLink.lookupSymbol(libraryHandle, functionName);
- }
-
- /** Retrieves the low-level library handle from this NativeLibrary
- object. On the Windows platform this is an HMODULE, and on Unix
- and Mac OS X platforms the void* result of calling dlopen(). */
- public long getLibraryHandle() {
- return libraryHandle;
- }
-
- /** Retrieves the path under which this library was opened. */
- public String getLibraryPath() {
- return libraryPath;
- }
-
- /** Closes this native library. Further lookup operations are not
- allowed after calling this method. */
- public void close() {
- if (libraryHandle == 0)
- throw new RuntimeException("Library already closed");
- long handle = libraryHandle;
- libraryHandle = 0;
- dynLink.closeLibrary(handle);
- }
-
- /** Given the base library names (no prefixes/suffixes) for the
- various platforms, enumerate the possible locations and names of
- the indicated native library on the system. */
- private static List enumerateLibraryPaths(String windowsLibName,
- String unixLibName,
- String macOSXLibName,
- boolean searchSystemPathFirst,
- ClassLoader loader) {
- List paths = new ArrayList();
- String libName = selectName(windowsLibName, unixLibName, macOSXLibName);
- if (libName == null)
- return paths;
-
- // Allow user's full path specification to override our building of paths
- File file = new File(libName);
- if (file.isAbsolute()) {
- paths.add(libName);
- return paths;
- }
-
- String[] baseNames = buildNames(libName);
-
- if (searchSystemPathFirst) {
- // Add just the library names to use the OS's search algorithm
- for (int i = 0; i < baseNames.length; i++) {
- paths.add(baseNames[i]);
- }
- }
-
- // The idea to ask the ClassLoader to find the library is borrowed
- // from the LWJGL library
- String clPath = getPathFromClassLoader(libName, loader);
- if (DEBUG) {
- System.out.println("Class loader path to " + libName + ": " + clPath);
- }
- if (clPath != null) {
- paths.add(clPath);
- }
-
- // Add entries from java.library.path
- String javaLibraryPath =
- (String) AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- return System.getProperty("java.library.path");
- }
- });
- if (javaLibraryPath != null) {
- StringTokenizer tokenizer = new StringTokenizer(javaLibraryPath, File.pathSeparator);
- while (tokenizer.hasMoreTokens()) {
- addPaths(tokenizer.nextToken(), baseNames, paths);
- }
- }
-
- // Add current working directory
- String userDir =
- (String) AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- return System.getProperty("user.dir");
- }
- });
- addPaths(userDir, baseNames, paths);
-
- // Add probable Mac OS X-specific paths
- if (platform == MACOSX) {
- // Add historical location
- addPaths("/Library/Frameworks/" + libName + ".Framework", baseNames, paths);
- // Add current location
- addPaths("/System/Library/Frameworks/" + libName + ".Framework", baseNames, paths);
- }
-
- if (!searchSystemPathFirst) {
- // Add just the library names to use the OS's search algorithm
- for (int i = 0; i < baseNames.length; i++) {
- paths.add(baseNames[i]);
- }
- }
-
- return paths;
- }
-
-
- private static String selectName(String windowsLibName,
- String unixLibName,
- String macOSXLibName) {
- switch (platform) {
- case WINDOWS:
- return windowsLibName;
- case UNIX:
- return unixLibName;
- case MACOSX:
- return macOSXLibName;
- default:
- throw new InternalError();
- }
- }
-
- private static String[] buildNames(String libName) {
- // If the library name already has the prefix / suffix added
- // (principally because we want to force a version number on Unix
- // operating systems) then just return the library name.
- if (libName.startsWith(prefixes[0])) {
- if (libName.endsWith(suffixes[0])) {
- return new String[] { libName };
- }
-
- int idx = libName.indexOf(suffixes[0]);
- boolean ok = true;
- if (idx >= 0) {
- // Check to see if everything after it is a Unix version number
- for (int i = idx + suffixes[0].length();
- i < libName.length();
- i++) {
- char c = libName.charAt(i);
- if (!(c == '.' || (c >= '0' && c <= '9'))) {
- ok = false;
- break;
- }
- }
- if (ok) {
- return new String[] { libName };
- }
- }
- }
-
- String[] res = new String[prefixes.length * suffixes.length];
- int idx = 0;
- for (int i = 0; i < prefixes.length; i++) {
- for (int j = 0; j < suffixes.length; j++) {
- res[idx++] = prefixes[i] + libName + suffixes[j];
- }
- }
- return res;
- }
-
- private static void addPaths(String path, String[] baseNames, List paths) {
- for (int j = 0; j < baseNames.length; j++) {
- paths.add(path + File.separator + baseNames[j]);
- }
- }
-
- private static boolean initializedFindLibraryMethod = false;
- private static Method findLibraryMethod = null;
- private static String getPathFromClassLoader(final String libName, final ClassLoader loader) {
- if (loader == null)
- return null;
- if (!initializedFindLibraryMethod) {
- AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- try {
- findLibraryMethod = ClassLoader.class.getDeclaredMethod("findLibrary",
- new Class[] { String.class });
- findLibraryMethod.setAccessible(true);
- } catch (Exception e) {
- // Fail silently disabling this functionality
- }
- initializedFindLibraryMethod = true;
- return null;
- }
- });
- }
- if (findLibraryMethod != null) {
- try {
- return (String) AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- try {
- return findLibraryMethod.invoke(loader, new Object[] { libName });
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- });
- } catch (Exception e) {
- if (DEBUG) {
- e.printStackTrace();
- }
- // Fail silently and continue with other search algorithms
- }
- }
- return null;
- }
-
- private static volatile boolean loadedDynLinkNativeLib;
- private static void ensureNativeLibLoaded() {
- if (!loadedDynLinkNativeLib) {
- synchronized (NativeLibrary.class) {
- if (!loadedDynLinkNativeLib) {
- loadedDynLinkNativeLib = true;
- NativeLibLoader.loadGlueGenRT();
- }
- }
- }
- }
-}
diff --git a/src/java/com/sun/gluegen/runtime/ProcAddressHelper.java b/src/java/com/sun/gluegen/runtime/ProcAddressHelper.java
deleted file mode 100644
index 5c3c034..0000000
--- a/src/java/com/sun/gluegen/runtime/ProcAddressHelper.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (c) 2003-2005 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.runtime;
-
-import java.security.*;
-
-// Debugging only
-import java.io.*;
-
-/** Helper class containing constants and methods to assist with the
- manipulation of auto-generated ProcAddressTables. */
-
-public class ProcAddressHelper {
- public static final String PROCADDRESS_VAR_PREFIX = "_addressof_";
- private static boolean DEBUG;
- private static String DEBUG_PREFIX;
- private static int debugNum;
-
- static {
- AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- DEBUG = (System.getProperty("gluegen.debug.ProcAddressHelper") != null);
- if (DEBUG) {
- DEBUG_PREFIX = System.getProperty("gluegen.debug.ProcAddressHelper.prefix");
- }
- return null;
- }
- });
- }
-
- public static void resetProcAddressTable(Object table,
- DynamicLookupHelper lookup) throws RuntimeException {
- Class tableClass = table.getClass();
- java.lang.reflect.Field[] fields = tableClass.getFields();
- PrintStream out = null;
-
- if (DEBUG) {
- if (DEBUG_PREFIX != null) {
- try {
- out = new PrintStream(new BufferedOutputStream(new FileOutputStream(DEBUG_PREFIX + File.separatorChar +
- "procaddresshelper-" + (++debugNum) + ".txt")));
- } catch (IOException e) {
- e.printStackTrace();
- out = System.err;
- }
- } else {
- out = System.err;
- }
- out.println("ProcAddressHelper.resetProcAddressTable(" + table.getClass().getName() + ")");
- }
- for (int i = 0; i < fields.length; ++i) {
- String addressFieldName = fields[i].getName();
- if (!addressFieldName.startsWith(ProcAddressHelper.PROCADDRESS_VAR_PREFIX)) {
- // not a proc address variable
- continue;
- }
- int startOfMethodName = ProcAddressHelper.PROCADDRESS_VAR_PREFIX.length();
- String funcName = addressFieldName.substring(startOfMethodName);
- try {
- java.lang.reflect.Field addressField = fields[i];
- assert(addressField.getType() == Long.TYPE);
- long newProcAddress = lookup.dynamicLookupFunction(funcName);
- // set the current value of the proc address variable in the table object
- addressField.setLong(table, newProcAddress);
- if (DEBUG) {
- out.println(" " + addressField.getName() + " = 0x" + Long.toHexString(newProcAddress));
- }
- } catch (Exception e) {
- throw new RuntimeException("Can not get proc address for method \"" +
- funcName + "\": Couldn't set value of field \"" + addressFieldName +
- "\" in class " + tableClass.getName(), e);
- }
- }
- if (DEBUG) {
- out.flush();
- if (DEBUG_PREFIX != null) {
- out.close();
- }
- }
- }
-}
diff --git a/src/java/com/sun/gluegen/runtime/StructAccessor.java.javame_cdc_fp b/src/java/com/sun/gluegen/runtime/StructAccessor.java.javame_cdc_fp
deleted file mode 100755
index 3e3f372..0000000
--- a/src/java/com/sun/gluegen/runtime/StructAccessor.java.javame_cdc_fp
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (c) 2003 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.runtime;
-
-import java.nio.*;
-
-public class StructAccessor {
- private ByteBuffer bb;
- private FloatBuffer fb;
- private IntBuffer ib;
- private ShortBuffer sb;
-
- public StructAccessor(ByteBuffer bb) {
- this.bb = bb;
- }
-
- public ByteBuffer getBuffer() {
- return bb;
- }
-
- /** Return a slice of the current ByteBuffer starting at the
- specified byte offset and extending the specified number of
- bytes. Note that this method is not thread-safe with respect to
- the other methods in this class. */
- public ByteBuffer slice(int byteOffset, int byteLength) {
- bb.position(byteOffset);
- bb.limit(byteOffset + byteLength);
- ByteBuffer newBuf = bb.slice();
- bb.position(0);
- bb.limit(bb.capacity());
- return newBuf;
- }
-
- /** Retrieves the byte at the specified slot (byte offset). */
- public byte getByteAt(int slot) {
- return bb.get(slot);
- }
-
- /** Puts a byte at the specified slot (byte offset). */
- public void setByteAt(int slot, byte v) {
- bb.put(slot, v);
- }
-
- /** Retrieves the float at the specified slot (4-byte offset). */
- public float getFloatAt(int slot) {
- return floatBuffer().get(slot);
- }
-
- /** Puts a float at the specified slot (4-byte offset). */
- public void setFloatAt(int slot, float v) {
- floatBuffer().put(slot, v);
- }
-
- /** Retrieves the int at the specified slot (4-byte offset). */
- public int getIntAt(int slot) {
- return intBuffer().get(slot);
- }
-
- /** Puts a int at the specified slot (4-byte offset). */
- public void setIntAt(int slot, int v) {
- intBuffer().put(slot, v);
- }
-
- /** Retrieves the short at the specified slot (2-byte offset). */
- public short getShortAt(int slot) {
- return shortBuffer().get(slot);
- }
-
- /** Puts a short at the specified slot (2-byte offset). */
- public void setShortAt(int slot, short v) {
- shortBuffer().put(slot, v);
- }
-
- //----------------------------------------------------------------------
- // Internals only below this point
- //
-
- private FloatBuffer floatBuffer() {
- if (fb == null) {
- fb = bb.asFloatBuffer();
- }
- return fb;
- }
-
- private IntBuffer intBuffer() {
- if (ib == null) {
- ib = bb.asIntBuffer();
- }
- return ib;
- }
-
- private ShortBuffer shortBuffer() {
- if (sb == null) {
- sb = bb.asShortBuffer();
- }
- return sb;
- }
-}
diff --git a/src/java/com/sun/gluegen/runtime/StructAccessor.java.javase b/src/java/com/sun/gluegen/runtime/StructAccessor.java.javase
deleted file mode 100755
index 5a0fa5d..0000000
--- a/src/java/com/sun/gluegen/runtime/StructAccessor.java.javase
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Copyright (c) 2003 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.runtime;
-
-import java.nio.*;
-
-public class StructAccessor {
- private ByteBuffer bb;
- private CharBuffer cb;
- private DoubleBuffer db;
- private FloatBuffer fb;
- private IntBuffer ib;
- private LongBuffer lb;
- private ShortBuffer sb;
-
- public StructAccessor(ByteBuffer bb) {
- // Setting of byte order is concession to native code which needs
- // to instantiate these
- this.bb = bb.order(ByteOrder.nativeOrder());
- }
-
- public ByteBuffer getBuffer() {
- return bb;
- }
-
- /** Return a slice of the current ByteBuffer starting at the
- specified byte offset and extending the specified number of
- bytes. Note that this method is not thread-safe with respect to
- the other methods in this class. */
- public ByteBuffer slice(int byteOffset, int byteLength) {
- bb.position(byteOffset);
- bb.limit(byteOffset + byteLength);
- ByteBuffer newBuf = bb.slice();
- bb.position(0);
- bb.limit(bb.capacity());
- return newBuf;
- }
-
- /** Retrieves the byte at the specified slot (byte offset). */
- public byte getByteAt(int slot) {
- return bb.get(slot);
- }
-
- /** Puts a byte at the specified slot (byte offset). */
- public void setByteAt(int slot, byte v) {
- bb.put(slot, v);
- }
-
- /** Retrieves the char at the specified slot (2-byte offset). */
- public char getCharAt(int slot) {
- return charBuffer().get(slot);
- }
-
- /** Puts a char at the specified slot (2-byte offset). */
- public void setCharAt(int slot, char v) {
- charBuffer().put(slot, v);
- }
-
- /** Retrieves the double at the specified slot (8-byte offset). */
- public double getDoubleAt(int slot) {
- return doubleBuffer().get(slot);
- }
-
- /** Puts a double at the specified slot (8-byte offset). */
- public void setDoubleAt(int slot, double v) {
- doubleBuffer().put(slot, v);
- }
-
- /** Retrieves the float at the specified slot (4-byte offset). */
- public float getFloatAt(int slot) {
- return floatBuffer().get(slot);
- }
-
- /** Puts a float at the specified slot (4-byte offset). */
- public void setFloatAt(int slot, float v) {
- floatBuffer().put(slot, v);
- }
-
- /** Retrieves the int at the specified slot (4-byte offset). */
- public int getIntAt(int slot) {
- return intBuffer().get(slot);
- }
-
- /** Puts a int at the specified slot (4-byte offset). */
- public void setIntAt(int slot, int v) {
- intBuffer().put(slot, v);
- }
-
- /** Retrieves the long at the specified slot (8-byte offset). */
- public long getLongAt(int slot) {
- return longBuffer().get(slot);
- }
-
- /** Puts a long at the specified slot (8-byte offset). */
- public void setLongAt(int slot, long v) {
- longBuffer().put(slot, v);
- }
-
- /** Retrieves the short at the specified slot (2-byte offset). */
- public short getShortAt(int slot) {
- return shortBuffer().get(slot);
- }
-
- /** Puts a short at the specified slot (2-byte offset). */
- public void setShortAt(int slot, short v) {
- shortBuffer().put(slot, v);
- }
-
- //----------------------------------------------------------------------
- // Internals only below this point
- //
-
- private CharBuffer charBuffer() {
- if (cb == null) {
- cb = bb.asCharBuffer();
- }
- return cb;
- }
-
- private DoubleBuffer doubleBuffer() {
- if (db == null) {
- db = bb.asDoubleBuffer();
- }
- return db;
- }
-
- private FloatBuffer floatBuffer() {
- if (fb == null) {
- fb = bb.asFloatBuffer();
- }
- return fb;
- }
-
- private IntBuffer intBuffer() {
- if (ib == null) {
- ib = bb.asIntBuffer();
- }
- return ib;
- }
-
- private LongBuffer longBuffer() {
- if (lb == null) {
- lb = bb.asLongBuffer();
- }
- return lb;
- }
-
- private ShortBuffer shortBuffer() {
- if (sb == null) {
- sb = bb.asShortBuffer();
- }
- return sb;
- }
-}
diff --git a/src/java/com/sun/gluegen/runtime/UnixDynamicLinkerImpl.java b/src/java/com/sun/gluegen/runtime/UnixDynamicLinkerImpl.java
deleted file mode 100755
index b6a79be..0000000
--- a/src/java/com/sun/gluegen/runtime/UnixDynamicLinkerImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/* !---- DO NOT EDIT: This file autogenerated by com\sun\gluegen\JavaEmitter.java on Mon Jul 31 16:26:59 PDT 2006 ----! */
-
-package com.sun.gluegen.runtime;
-
-import com.sun.gluegen.runtime.*;
-
-public class UnixDynamicLinkerImpl implements DynamicLinker
-{
-
- public static final int RTLD_LAZY = 0x00001;
- public static final int RTLD_NOW = 0x00002;
- public static final int RTLD_NOLOAD = 0x00004;
- public static final int RTLD_GLOBAL = 0x00100;
- public static final int RTLD_LOCAL = 0x00000;
- public static final int RTLD_PARENT = 0x00200;
- public static final int RTLD_GROUP = 0x00400;
- public static final int RTLD_WORLD = 0x00800;
- public static final int RTLD_NODELETE = 0x01000;
- public static final int RTLD_FIRST = 0x02000;
-
- /** Interface to C language function: <br> <code> int dlclose(void * ); </code> */
- private static native int dlclose(long arg0);
-
- /** Interface to C language function: <br> <code> char * dlerror(void); </code> */
- private static native java.lang.String dlerror();
-
- /** Interface to C language function: <br> <code> void * dlopen(const char * , int); </code> */
- private static native long dlopen(java.lang.String arg0, int arg1);
-
- /** Interface to C language function: <br> <code> void * dlsym(void * , const char * ); </code> */
- private static native long dlsym(long arg0, java.lang.String arg1);
-
-
- // --- Begin CustomJavaCode .cfg declarations
- public long openLibrary(String pathname) {
- // Note we use RTLD_GLOBAL visibility to allow this functionality to
- // be used to pre-resolve dependent libraries of JNI code without
- // requiring that all references to symbols in those libraries be
- // looked up dynamically via the ProcAddressTable mechanism; in
- // other words, one can actually link against the library instead of
- // having to dlsym all entry points. System.loadLibrary() uses
- // RTLD_LOCAL visibility so can't be used for this purpose.
- return dlopen(pathname, RTLD_LAZY | RTLD_GLOBAL);
- }
-
- public long lookupSymbol(long libraryHandle, String symbolName) {
- return dlsym(libraryHandle, symbolName);
- }
-
- public void closeLibrary(long libraryHandle) {
- dlclose(libraryHandle);
- }
- // ---- End CustomJavaCode .cfg declarations
-
-} // end of class UnixDynamicLinkerImpl
diff --git a/src/java/com/sun/gluegen/runtime/WindowsDynamicLinkerImpl.java b/src/java/com/sun/gluegen/runtime/WindowsDynamicLinkerImpl.java
deleted file mode 100755
index 553c2f2..0000000
--- a/src/java/com/sun/gluegen/runtime/WindowsDynamicLinkerImpl.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/* !---- DO NOT EDIT: This file autogenerated by com\sun\gluegen\JavaEmitter.java on Tue May 27 02:37:55 PDT 2008 ----! */
-
-package com.sun.gluegen.runtime;
-
-import com.sun.gluegen.runtime.*;
-
-public class WindowsDynamicLinkerImpl implements DynamicLinker
-{
-
-
- /** Interface to C language function: <br> <code> BOOL FreeLibrary(HANDLE hLibModule); </code> */
- private static native int FreeLibrary(long hLibModule);
-
- /** Interface to C language function: <br> <code> DWORD GetLastError(void); </code> */
- private static native int GetLastError();
-
- /** Interface to C language function: <br> <code> PROC GetProcAddressA(HANDLE hModule, LPCSTR lpProcName); </code> */
- private static native long GetProcAddressA(long hModule, java.lang.String lpProcName);
-
- /** Interface to C language function: <br> <code> HANDLE LoadLibraryW(LPCWSTR lpLibFileName); </code> */
- private static native long LoadLibraryW(java.lang.String lpLibFileName);
-
-
- // --- Begin CustomJavaCode .cfg declarations
- public long openLibrary(String libraryName) {
- return LoadLibraryW(libraryName);
- }
-
- public long lookupSymbol(long libraryHandle, String symbolName) {
- return GetProcAddressA(libraryHandle, symbolName);
- }
-
- public void closeLibrary(long libraryHandle) {
- FreeLibrary(libraryHandle);
- }
- // ---- End CustomJavaCode .cfg declarations
-
-} // end of class WindowsDynamicLinkerImpl